I've been using Vim for many years. Although I'm not using it as my primary IDE for daily coding, I did spend a lot of time learning how to use it. Vim makes me comfortable while editing text files on linux servers or on my personal computer. I also heard of NeoVim for a long time. Maybe years. Several days ago I ran into a youtube video talking about "How to Configure Vim like VSCode". Thanks to this video I reviewed NeoVim again and decided to have a try with it. To be more precisely, I just decided to change to NeoVim.

Install

https://github.com/neovim/neovim/wiki/Installing-Neovim

Configure

Open neovim by command nvim and run vim command :help vimrc. You will see where the vimrc file located on your system. For unix (mac) systems, it's located at ~/.config/nvim/init.vim. It's equivalent to the ~/.vimrc for vim.

Step 1. Install a Plugin Manager

I'm using vim-plug as my plugin manager for NeoVim. And again for unix(mac) systems, just run shell command curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim to install it.

Step 2. Install Third-party Vim Plugins

Edit init.vim file to add Plug xxx directives between vim-plug's call plug#begin(xxx) and call plug#end() sections. Save and reopen init.vim and run :PlugInstall command to install the plugins.

Step 3. Configure Plugins

See your plugins' documentation to configure them as you wish.

My init.vim

"
" ## Installed Plugins
"
call plug#begin('~/.nvim/plugins')

Plug 'preservim/nerdtree', { 'on':  'NERDTreeToggle' }
Plug 'itchyny/lightline.vim'
Plug 'tpope/vim-fugitive'
Plug 'NLKNguyen/papercolor-theme'
Plug 'dense-analysis/ale' " Asynchronous Lint Engine (LSP support)
Plug 'maximbaz/lightline-ale'

call plug#end()

" Turns on filetype "detection", "plugin" and "indent".
" https://vi.stackexchange.com/q/10124
filetype plugin indent on

"
" ## VIM Settings
"
syntax on

" Allow backspacing over everything in insert mode.
set bs=indent,eol,start

" Show line numbers.
set nu

" Highlight searches.
set hlsearch

" Realtime searches.
set incsearch

" Ignore case when searching.
set ignorecase

" Use terminal true color.
" set termguicolors

" Color scheme.
set t_Co=256
colorscheme PaperColor
set background=dark
if strftime("%H") > 10 && strftime("%H") < 18
  set background=light
endif

" Ruler.
set colorcolumn=80,88,120

" Set cursor style.
set guicursor=a:block

" Display extra whitespaces.
set list listchars=tab:»·,trail:·,nbsp:·

" Use `:retab` command to convert all tabs to spaces after setting `expandtab` on.
" For indentation without tabs, the principle is to set 'expandtab', and set 'shiftwidth'
" and 'softtabstop' to the same value, while leaving 'tabstop' at its default value.
" http://vim.wikia.com/wiki/VimTip83
set expandtab      " all new tabs will be changed to spaces
set shiftwidth=2   " number of spaces to (auto)indent
set softtabstop=2  " makes the spaces feel like real tabs
set tabstop=2      " number of spaces of tab character

" Encoding guess list while opening a file.
set fencs=utf-8,ucs-bom,gbk

" Encoding while saving a file.
set fenc=utf-8

" Key binding: move between windows.
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l


"
" ## Plugin Settings
"
" Plugin: nerdtree
map <C-N> :NERDTreeToggle<CR>
" Close vim if the only window left open is a NERDTree.
autocmd BufEnter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" Open NERDTree automatically when vim starts up on opening a directory.
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif
" Hide some files.
let NERDTreeIgnore = ['\.pyc$', '\.git$']
let NERDTreeShowHidden=1
let g:NERDTreeNodeDelimiter = "\u00a0"

" Plugin: ALE
let g:ale_linters = {
\ 'python': [ 'pylint' ],
\ 'javascript': [ 'eslint' ]
\ }
let g:ale_fixers = {
\ 'python': [ 'isort', 'black' ],
\ 'javascript': [ 'eslint' ],
\ 'markdown': [ 'prettier' ],
\ 'html': [ 'prettier' ],
\ 'json': [ 'prettier' ],
\ 'css': [ 'prettier' ],
\ 'less': [ 'prettier' ],
\ 'scss': [ 'prettier' ],
\ 'graphql': [ 'prettier' ],
\ 'yaml': [ 'prettier' ],
\ }
let g:ale_fix_on_save = 1

" Plugin: lightline, lightline-ale

let g:lightline = {
\ 'colorscheme': 'PaperColor',
\ 'active': {
\   'left': [
\     [ 'mode', 'paste' ],
\     [ 'gitbranch', 'readonly', 'filename', 'modifed' ],
\   ],
\   'right': [
\      [ 'linter_checking', 'linter_errors', 'linter_warnings', 'linter_infos', 'linter_ok' ],
\      [ 'lineinfo' ],
\      [ 'percent' ],
\      [ 'fileformat', 'fileencoding', 'filetype', 'charvaluehex' ],
\   ]
\ },
\ 'component': {
\   'charvaluehex': '0x%B'
\ },
\ 'component_function': {
\   'gitbranch': 'fugitive#head',
\ }
\ }

let g:lightline.component_expand = {
\ 'linter_checking': 'lightline#ale#checking',
\ 'linter_infos': 'lightline#ale#infos',
\ 'linter_warnings': 'lightline#ale#warnings',
\ 'linter_errors': 'lightline#ale#errors',
\ 'linter_ok': 'lightline#ale#ok',
\ }

let g:lightline.component_type = {
\ 'linter_checking': 'right',
\ 'linter_infos': 'right',
\ 'linter_warnings': 'warning',
\ 'linter_errors': 'error',
\ 'linter_ok': 'right',
\ }

set laststatus=2
set noshowmode

Screenshots