nvim介绍

简单说,nvim ( neovim ) 是一个开源的vim重构项目。

与vim相比,nvim具有更现代化的代码库和架构,更好的可扩展性和更好的性能。

同时,nvim支持几乎所有的vim插件,同时nvim深度集成了lua,如果你熟悉这种脚本语言,它将会大大提升你的配置效率。(本文我们主要讲更加通用的做法,即使用vim script的做法)

安装nvim

在linux平台,你可以在各个发行版的包管理工具中下载nvim,例如在debian系发行版中,可以使用

sudo apt install neovim

安装后 ,可以通过在命令行输入

nvim -v

检查安装,如果正确安装,应该显示安装的nvim的版本号。如下:

NVIM v0.7.2
Build type: Release
LuaJIT 2.1.0-beta3
Compiled by team+vim@tracker.debian.org

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/share/nvim"

Run :checkhealth for more info

显示出类似的内容,说明安装成功。

基础使用

如果你有vim基础,建议跳过这一部分。

在基础的使用方式上,nvim与vim基本一致,在这里我们简单讲讲。

vim ( nvim ) 共有四种模式,即Normal模式、Command模式、Insert模式、Visible模式:

  • Normal模式
    这是你进入 nvim 时的默认模式,也是所有模式切换的中转站。
    在这里,你可以按ai进入Insert模式,或者按v进入Visable模式。

在Normal模式下,你不能输入,但可以使用快捷键对文档进行查找、替换、滚动等操作:
移动光标:类似fps游戏中的wasd,vim使用h(左)、j(下)、k(上)、l(右) 移动光标,
滚动屏幕:Ctrl + E 向上滚动,Ctrl + Y 向下滚动

  • Command模式
    在Normal模式下按:可以进入Command模式。
    在Command模式下,你可以输入命令。
    如常用的:
    w:
    q:
    /字符:
    数字:
    %s:

  • Insert模式

  • 即输入模式,这个模式下和其他编辑器差异不大。

  • visible模式

  • 相当于其他编辑其中的选中,你可以对选中的文本进行移动、复制等操作。

基础配置

nvim使用~/.config/nvim/init.vim对当前用户进行配置。

我强烈建议你逐条添加到 init.vim 中并在添加过程中运行观察效果,这对你理解配置文件很有帮助。完整的 init.vim 我会放在文末。

首先是一些基础的配置

 set nu              "显示行号
 set tabstop=4
 set shiftwidth=4
 set expandtab
 set tabstop
 "set nobackup
 "set cursorline
 syntax enable
set laststatus=2
set backspace=2

这些配置未必适合你,你可以根据你的需要去除某些配置,只需在行首添加 "将其变为注释即可。同样的,如果你有自己的配置需求,也可以直接添加在这里。

接下来是键盘映射。我的配置可以供你参考。

 imap    jk          <esc>
 imap    Jk          <esc>
 imap    jK          <esc>
 imap    JK          <esc>
 map     <space>     viw
 "  -键 作为删除一行
 map - dd
 " insert 模式下删除一行
 inoremap <c-d> <esc>ddi

 " ctrl+u 插入模式转换当前单词为大写
 "inoremap <c-u> <esc>viwUi 
 "leader 默认为\
 nnoremap <leader>d dd

 "重读我的vimrc文件
 nnoremap <leader>sv :source $MYVIMRC<cr>
  "打开我的vimrc配置文件
 nnoremap <leader>ev :vsp $MYVIMRC<cr>

 "普通模式下,双引号包括当前单词
 nnoremap <leader>" viw<esc>a"<esc>hbi"<esc>lel

 " abbreviations 缩略语 可以用于自动修改
 iabbrev adn and

插件

nvim的另一大魅力在于其庞大的插件社区。

这里我们使用vim-plug作为插件管理器。
项目地址:https://github.com/junegunn/vim-plug

首先安装vim-plug

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

然后我们来配置init.vim

为了调用vim-plug,我们要在init.vim中添加

call plug#begin('~/.vim/plugged')

call plug#end()

并在中间添加你要使用的插件。

添加后,打开nvim,输入命令:PluginInstall,安装插件,vim-plug会自动读取init.vim中的插件列表。
安装完成后,重新进入nvim就可以使用了。

附完整版init.vim供参考:

"     _       _ __        _         
"    (_)___  (_) /__   __(_)___ ___ 
"   / / __ \/ / __/ | / / / __ `__ \
"  / / / / / / /__| |/ / / / / / / /
" /_/_/ /_/_/\__(_)___/_/_/ /_/ /_/ 
"
" echom "Never Give Up Your Dream!!! >^.^<"

let g:python3_host_prog = '/usr/bin/python3.12'  " 替换为全局 Python 解释器的路径


set nu              "显示行号
set tabstop=4
set shiftwidth=4
set expandtab
set tabstop
"set nobackup
" set cursorline
"set ruler
"set autoindent
"set hlsearch
syntax enable
"set nocompatible
"set autochdir
"set guifont=Consolas:h17
set laststatus=2
set backspace=2

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" -START- key mapping
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
imap    jk          <esc>
imap    Jk          <esc>
imap    jK          <esc>
imap    JK          <esc>
map     <space>     viw
"  -键 作为删除一行
map - dd
" insert 模式下删除一行
inoremap <c-d> <esc>ddi

" ctrl+u 插入模式转换当前单词为大写
"inoremap <c-u> <esc>viwUi 

"leader 默认为\
nnoremap <leader>d dd

"重读我的vimrc文件
nnoremap <leader>sv :source $MYVIMRC<cr>
 "打开我的vimrc配置文件
nnoremap <leader>ev :vsp $MYVIMRC<cr>

"普通模式下,双引号包括当前单词
nnoremap <leader>" viw<esc>a"<esc>hbi"<esc>lel

" abbreviations 缩略语 可以用于自动修改
iabbrev adn and
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" -END- key mapping
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"文件编码模式指定utf
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936                   
set termencoding=utf-8
set encoding=utf-8

"智能缩进,当匹配到func main() {}   当在大括号中间回车的时候,他会智能缩进
set smartindent
"自动缩进,当你第一行敲 tab + 文字 回车后 下一行自动给你加个 tab 
set autoindent

"代码折叠
"set foldmethod=indent
"保存和加载视图
"augroup AutoSaveFolds
"autocmd!
  "au BufWinLeave ?* mkview 1
  "au BufWinEnter ?* silent loadview 1
  "au BufWinEnter ?* if filereadable(expand('%')) | silent loadview 1| endif
  "au BufWinEnter ?* if  filereadable("~/.local/share/nvim/view/~=+.config=+nvim=+".expand("%:p:h")."=1.vim") | silent loadview | endif
"augroup END
"用空格来切换折叠状态
"nnoremap <space> za



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" -START- Plugin config
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

call plug#begin('~/.vim/plugged')
"
"   " Make sure you use single quotes
"
"   " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
"   Plug 'junegunn/vim-easy-align'
"
"   " Any valid git URL is allowed
"   Plug 'https://github.com/junegunn/vim-github-dashboard.git'
"
"
"   " Multiple Plug commands can be written in a single line using | separators
"   " tab自动补全
    Plug 'ervandew/supertab'

    Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
    let g:UltiSnipsSnippetDirectories=["~/Documents/UltiSnips"]
    "let g:UltiSnipsExpandTrigger="<c-s>"
    "let g:UltiSnipsJumpForwardTrigger="<s-tab>"
    "let g:UltiSnipsEditSplit="vertical"
"
"   " On-demand loading
    Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' } | Plug 'Xuyuanp/nerdtree-git-plugin' 
    map <C-n> :NERDTreeToggle<CR>

    " 回车右侧函数表
    Plug 'majutsushi/tagbar'
    """ctags 并且软连接 ctags 
    """为当前环境变量的ctags,然后利用ctags生成tags文件给vim函数分屏读取
    let g:tagbar_right=1
    set tags=tags;
    set autochdir
    "ctrl+m开启文件tagbar(就是函数提示分屏)
    map <cr> :TagbarToggle<CR>


    
    Plug 'vim-airline/vim-airline' | Plug 'vim-airline/vim-airline-themes'
    let g:airline_theme='bubblegum'
    let g:airline#extensions#tabline#enabled = 1
    let g:airline#extensions#tabline#left_sep = ' '
    let g:airline#extensions#tabline#left_alt_sep = '|'
    "let g:airline_statusline_ontop=1
    "let g:airline#extensions#tabline#formatter = 'unique_tail'
    
    " 可视化缩进
    Plug 'nathanaelkane/vim-indent-guides'
    "代码缩进块显示 + 奇偶行缩进颜色配置 + 缩进块宽度
    let g:indent_guides_enable_on_vim_startup = 1
    let g:indent_guides_guide_size = 1
    let g:indent_guides_auto_colors = 0
    autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd  ctermbg=237
    autocmd VimEnter,Colorscheme * :hi IndentGuidesEven ctermbg=236
    let g:indent_guides_exclude_filetypes = ['help', 'nerdtree']
    let g:indent_guides_color_change_percent = 1


    "彩虹括号
    Plug 'kien/rainbow_parentheses.vim'
    let g:rbpt_colorpairs = [
        \ ['brown',       'RoyalBlue3'],
        \ ['Darkblue',    'SeaGreen3'],
        \ ['darkgray',    'DarkOrchid3'],
        \ ['darkgreen',   'firebrick3'],
        \ ['darkcyan',    'RoyalBlue3'],
        \ ['darkred',     'SeaGreen3'],
        \ ['darkmagenta', 'DarkOrchid3'],
        \ ['brown',       'firebrick3'],
        \ ['gray',        'RoyalBlue3'],
        \ ['black',       'SeaGreen3'],
        \ ['darkmagenta', 'DarkOrchid3'],
        \ ['Darkblue',    'firebrick3'],
        \ ['darkgreen',   'RoyalBlue3'],
        \ ['darkcyan',    'SeaGreen3'],
        \ ['darkred',     'DarkOrchid3'],
        \ ['red',         'firebrick3'],
        \ ]
    let g:rbpt_max = 16
    let g:rbpt_loadcmd_toggle = 0
    au VimEnter * RainbowParenthesesToggle
    au Syntax * RainbowParenthesesLoadRound
    au Syntax * RainbowParenthesesLoadSquare
    au Syntax * RainbowParenthesesLoadBraces
   
    " 括号自动匹配
    Plug 'jiangmiao/auto-pairs'

    " 真彩色
    "Plug 'tpope/vim-sensible'
    "set termguicolors
    "if &term =~# '^screen'
    "let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
    "let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
    "endif

    " git左边栏增删改提示
    Plug 'airblade/vim-gitgutter'
    set updatetime=100
    highlight GitGutterAdd    guifg=#009900 ctermfg=2 ctermbg=39
    highlight GitGutterChange guifg=#bbbb00 ctermfg=3 ctermbg=204
    highlight GitGutterDelete guifg=#ff2222 ctermfg=1 ctermbg=59

    " 快乐搜索
    Plug 'Lokaltog/vim-easymotion'
    let g:EasyMotion_smartcase = 1
    nmap fw <Plug>(easymotion-w)
    nmap fW <Plug>(easymotion-b)
    nmap fe <Plug>(easymotion-e)
    nmap fE <Plug>(easymotion-E)

    nmap fj <Plug>(easymotion-j)
    nmap fk <Plug>(easymotion-k)
    nmap fh <Plug>(easymotion-linebackward)
    nmap fl <Plug>(easymotion-lineforward)

    nmap  n <Plug>(easymotion-next)
    nmap  N <Plug>(easymotion-prev)
    map  / <Plug>(easymotion-sn)
    omap / <Plug>(easymotion-tn)
    "find target charater
    nmap fc <Plug>(easymotion-overwin-f)  

    " latex support
    Plug 'lervag/vimtex'
    Plug 'KeitaNakamura/tex-conceal.vim', {'for': 'tex'} "latex的自动替换插件
    filetype plugin indent on
    syntax enable
    let g:tex_flavor='latex'
    let g:vimtex_compiler_method = 'latexmk'
    let g:vimtex_view_method='zathura'
    "let g:vimtex_view_general_viewer = 'okular'
    let g:vimtex_view_general_options = '--unique file:@pdf\#src:@line@tex'
    let g:vimtex_compiler_latexmk_engines = {
        \ '_'                : '-pdf',
        \ 'pdflatex'         : '-pdf',
        \ 'dvipdfex'         : '-pdfdvi',
        \ 'lualatex'         : '-lualatex',
        \ 'xelatex'          : '-xelatex',
        \ 'context (pdftex)' : '-pdf -pdflatex=texexec',
        \ 'context (luatex)' : '-pdf -pdflatex=context',
        \ 'context (xetex)'  : '-pdf -pdflatex=''texexec --xtx''',
        \}
    let g:vimtex_compiler_latexmk = {'aux_dir': {-> expand("%:p:h")."/output"}, 'out_dir' : {-> expand("%:p:h")."/output"}}
    "let g:vimtex_quickfix_mode=0
    "let g:vimtex_quickfix_enable=0
    "
    let g:tex_superscripts= "[0-9a-zA-W.,:;+-<>/()=]"
    let g:tex_subscripts= "[0-9aehijklmnoprstuvx,+-/().]"
    let g:tex_conceal_frac=1
    set conceallevel=1
    let g:tex_conceal="abdgm"

    " python折叠
    Plug 'tmhedberg/SimpylFold'
    let g:SimpylFold_docstring_preview = 1

    "coq自动补全插件
    " main one
    Plug 'ms-jpq/coq_nvim', {'branch': 'coq'}
    " 9000+ Snippets
    Plug 'ms-jpq/coq.artifacts', {'branch': 'artifacts'}
"let g:coq_settings = { 'auto_start': v:true } or let g:coq_settings = { 'auto_start': 'shut-up' }
    let g:coq_settings = { 'auto_start': v:true }
    " lua & third party sources -- See https://github.com/ms-jpq/coq.thirdparty
    " Need to **configure separately**
    Plug 'ms-jpq/coq.thirdparty', {'branch': '3p'}

    Plug 'mhinz/vim-startify'

"   " Plugin outside ~/.vim/plugged with post-update hook
"   Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
"
"   " Unmanaged plugin (manually installed and updated)
"   Plug '~/my-prototype-plugin'
"
"   " Initialize plugin system
call plug#end()
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" -END- Plugin config
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐