我的基本 Neovim 设置
在之前的几篇文章中,我介绍了为什么选择 Neovim 作为我的主要编辑器,并讲解了使用该程序的基本方法。然而,它默认情况下并没有插件或美观的界面。在这里,我将向你展示我是如何设置我的 Neovim 的。
我日常使用的编程语言包括 JavaScript(JSX 和 TypeScript)、CSS 和 Sass,最近也在学习 Python。因此,我的配置支持这些技术。
关于我的配置选择
正如你所想,Neovim 是通过文本文件进行配置的。
有两种配置方法:使用 Lua 语言或 VimScript(专为 Vim 编写)。这里我将使用后者,因为它同时适用于 Vim 和 Neovim,这样可以一举两得。
我没有 Lua 的使用经验,目前也没有为了配置应用程序而学习这门语言的计划。我知道有更现代的方法可以实现这个功能,但我更倾向于保持设置简洁。
在本指南结束时,您不会像在其他地方那样看到一堆杂乱的文件和目录,而只会得到一个单独的文件,足以方便使用。
设置选项
和大多数软件一样,Vim/Neovim 也提供了编辑选项和偏好设置的方法。你可以使用命令 `--line-number` 来测试这些设置:set <option-name>。现在尝试打开一个 Vim/Neovim 实例并输入 ` :set number--line-number`,你会注意到行号会出现在侧边栏。但问题在于,每次重新打开程序时,你都必须重复这些命令。
保存设置
要保存这些设置,只需将以下命令写入用户文件夹中的一个文件中即可。文件的名称和位置会因您使用的是 Vim 还是 Neovim 而有所不同:
- Vim:
<username>/.vimrc - Neovim:
<username>/.config/nvim/init.vim
如果你的用户目录下没有这些文件/目录,请手动创建它们。请记住,在 Unix 系统(Linux、BSD 和 macOS)中,以“.”开头的文件默认是隐藏的。请确保你在文件管理器或终端中已启用显示隐藏文件。
配置文件中的基本选项
在深入探讨扩展程序及其设置等更复杂的内容之前,我们先从基础知识讲起。虽然有很多选项可以调整,但我下面列出的是我目前使用的设置。请注意,该文件中包含每次打开编辑器时都需要输入的命令。
" Options
set background=dark
set clipboard=unnamedplus
set completeopt=noinsert,menuone,noselect
set cursorline
set hidden
set inccommand=split
set mouse=a
set number
set relativenumber
set splitbelow splitright
set title
set ttimeoutlen=0
set wildmenu
" Tabs size
set expandtab
set shiftwidth=2
set tabstop=2
以下是对上述每条命令的解释:
background=dark:应用深色屏幕专用颜色集。不仅仅是屏幕背景,虽然看起来可能并非如此。clipboard=unnamedplus:启用 Vim/Neovim 与其他应用程序之间的剪贴板功能。cursorline:高亮显示编辑器中的当前行。completeopt:修改自动完成菜单,使其行为更像 IDE。hidden:隐藏未使用的缓冲区1。inccommand=split:在应用到文件之前,以分屏形式显示替换项。mouse=a允许在编辑器中使用鼠标。number:显示行号。relativenumber显示从当前行开始的行号。这对于使用多行命令非常有用。splitbelow splitright:使用命令:split(水平分割)和:vsplit(垂直分割)更改分屏行为。在这种情况下,屏幕始终会在当前屏幕下方和右侧分割。title显示文件标题ttimeoutlen=0命令运行所需时间(毫秒)。wildmenu:显示更高级的自动完成建议菜单。expandtab:将制表符转换为空格。shiftwidth=2:缩进空格数。tabstop=2:制表符的空格数。
句法
添加对打开文件的自动语法支持:
filetype plugin indent on
syntax on
颜色支持
要在终端上启用 256 色:
set t_Co=256
以下是我为 Vim 编写的逻辑,用于检测系统是否支持更多颜色。请注意,我添加了一个条件判断,以检测终端模拟器是否为 Apple 自带的。不知何故,在我使用的不同版本中,颜色表现有所不同。
" True color if available
let term_program=$TERM_PROGRAM
" Check for conflicts with Apple Terminal app
if term_program !=? 'Apple_Terminal'
set termguicolors
else
if $TERM !=? 'xterm-256color'
set termguicolors
endif
endif
如果你不使用苹果终端,请忽略那部分,直接将代码添加到else.
支持真正的斜体
如果你和我一样喜欢真正支持斜体的字体,请添加以下代码:
" Italics
let &t_ZH="\e[3m"
let &t_ZR="\e[23m"
别问我这些代码是什么意思。我只知道,支持斜体字的终端会把它们识别为斜体字。
NetRW:Vim 的默认文件管理器
注意:如果您已经对 Vim 有所了解,并且对 NetRW 不感兴趣,请跳过此部分。
如果你用过集成开发环境(IDE),你可能已经注意到侧边栏总会有一个项目文件树。Vim/Neovim 默认使用 NetRW,它也具备类似的功能。
使用 `vm` 或 `neovim`[n]vim .命令打开项目目录时,文件列表会显示在目录内。也可以使用 `--file`:Ex或:Vex` :Sex--file` 命令打开。
你可以使用默认设置,但我个人觉得有些地方不太满意,所以我使用了以下设置:
" File browser
let g:netrw_banner=0
let g:netrw_liststyle=0
let g:netrw_browse_split=4
let g:netrw_altv=1
let g:netrw_winsize=25
let g:netrw_keepdir=0
let g:netrw_localcopydircmd='cp -r'
解释如下:
g:netrw_banner=0:隐藏默认显示的顶部横幅。g:netrw_liststyle=0更改文件的显示方式。0一次只显示一个目录。1显示文件数据。2按列显示文件。3以树状图的形式展开打开的目录。
g:netrw_browse_split=4:改变文件的打开方式。1以水平分割方式打开文件。2以垂直分割的方式开始。3在新标签页中打开。4在之前的窗口中打开,避免创建更多分区。
g:netrw_altv=1:将 NetRW 显示屏切换到左侧。g:netrw_winsize=25:将窗口大小限制为可用屏幕空间的 25%。g:netrw_keepdir=0:保留您之前访问过的目录。g:netrw_localcopydircmd:修改用于复制文件的命令。默认情况下,NetRW 只会复制空文件夹。为了改变这一点,我将默认命令设置为cp -r递归复制。
为了方便创建文件,我添加了更多设置:
" Create file without opening buffer
function! CreateInPreview()
let l:filename = input('please enter filename: ')
execute 'silent !touch ' . b:netrw_curdir.'/'.l:filename
redraw!
endfunction
" Netrw: create file using touch instead of opening a buffer
function! Netrw_mappings()
noremap <buffer>% :call CreateInPreview()<cr>
endfunction
augroup auto_commands
autocmd filetype netrw call Netrw_mappings()
augroup END
这样可以防止 NetRW 为了创建文件而打开一个空白屏幕。
如果你想使用 NetRW,我认为这是舒适使用它所需的最低配置。
NetRW及其问题
NetRW 因其导致缓冲区混乱而备受诟病。根据我的研究,使用g:netrw_liststyle=3树形模式似乎会加剧这种情况。错误是随机发生的,这使得修复过程十分困难,而且仅更新 NetRW 也比预期要复杂得多。
这就是为什么有几种替代 NetRW 的方法,其中最著名的是 NERDTree,我在我的主要配置中使用它。
插件
插件管理器设置
最后,是时候配置插件了。与 VS Code 或其他编辑器不同,Vim 提供了多种扩展安装程序:Neobundle、Vundle、Vim-Plug 等。这里我将使用最后一个,它似乎是目前最常用的。要安装它,请打开终端并运行以下命令:
对于 Vim:
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
对于 Neovim:
$ 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'
以上命令完成了在编辑器中使用 Vim-Plug 所需的所有操作。
安装插件
Vim-Plug 会读取配置文件的一部分,以便在 GitHub 上查找扩展程序并将其安装到编辑器中。这部分内容由以下结构分隔:
call plug#begin()
Plug '<github-user>/<repo-name>'
call plug#end()
您可以一次添加多个扩展,只需Plug根据需要添加即可。如果您想轻松查找这些插件,可以访问一个名为 Vim Awesome 的网站。链接在文章末尾。
我使用的插件
以下是我在 Vim/Neovim 中使用的设置:
call plug#begin()
" Appearance
Plug 'vim-airline/vim-airline'
Plug 'ryanoasis/vim-devicons'
" Utilities
Plug 'sheerun/vim-polyglot'
Plug 'jiangmiao/auto-pairs'
Plug 'ap/vim-css-color'
Plug 'preservim/nerdtree'
" Completion / linters / formatters
Plug 'neoclide/coc.nvim', {'branch': 'master', 'do': 'yarn install'}
Plug 'plasticboy/vim-markdown'
" Git
Plug 'airblade/vim-gitgutter'
call plug#end()
- Vim Airline:修改状态栏,使其比默认状态栏更美观。
- Vim Devicons:在界面中显示图标,基于图标字体2。
- Vim Polyglot:支持多种编程语言的语法高亮显示。
- 自动配对:输入时自动闭合圆括号、方括号和花括号。
- Vim CSS 颜色:直接在代码中显示颜色(十六进制、RGB、HSL)。
- NERDTree:用于访问项目文件的侧边栏。它取代了我之前提到的 NetRW。
- CoC(Conquer of Completion):提供自动补全功能,与 VS Code 中的功能非常相似。稍后我会详细介绍。
- Vim Markdown:更好地支持 Markdown 文件语法。
- Vim GitGutter:显示打开文件中的 Git 更改。
仅仅输入这些地址不足以安装扩展。首先,您必须保存配置文件并重启 Vim,编辑器才能应用新添加的设置。之后,再运行命令:PlugInstall。
将会弹出一个窗口,显示每个扩展的安装过程。安装完成后,您需要再次重启 Vim 才能使用新扩展。
要卸载,请从配置文件中删除要删除的插件的行,然后在重新启动编辑器后运行命令:PlugClean。
配色方案
如果说良好的开发体验有什么关键因素,那就是好的配色方案。它们的安装方式与扩展程序相同。
首先,添加指向主题Github仓库路径的行:
call plug#begin()
Plug 'morhetz/gruvbox'
call plug#end()
要使用此主题,请在配置文件中添加相应的命令colorscheme gruvbox。这样就能消除默认的黑屏和刺眼的色彩。
我使用的配色方案
尽管我用 GruvBox 主题做了个示范,但这并不是我最终使用的主题。配色方案是非常主观的,而且在使用这个主题的过程中,我最终对它感到有些厌倦。其他主题也是如此。由于找不到我喜欢的,所以我自己做了一个,叫做 Sobrio。如果你想测试一下,只需按照上面的步骤操作,只需更改仓库即可:
call plug#begin()
Plug 'elvessousa/sobrio'
call plug#end()
然后只需添加colorscheme sobrio并重启编辑器即可。欢迎留下您的评论和建议。我很想知道您的看法。如果您想了解更多信息,文章末尾有网站链接。
插件配置
神像
Devicons 是一个为 Vim 界面添加图标的扩展。要使其正常工作,系统必须安装支持图标的字体。
在网上搜索“NERD Fonts”,你会找到很多字体。在系统上安装字体的方法因操作系统而异,这里我就不赘述了。下载、安装字体并将其应用到你的终端模拟器中即可。除此之外,无需其他配置。
航空公司
这里几乎没什么设置。基本上就是选择要使用的主题,以及是否要使用“Powerline”模式,也就是那些带箭头的线条。
let g:airline_theme='sobrio'
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
上面的最后一个选项启用了标签栏中的航空公司信息。
NERDTree
NERDTree 是 NetRW 的替代品。默认情况下,它运行良好。我只是添加了一行代码,使其默认显示隐藏文件。
" File browser
let NERDTreeShowHidden=1
你知道,我喜欢直接查看文件.env,而.gitignore不用I先输入文字。
CTRLP
此插件支持在项目文件夹中搜索文件。它的快捷键与其名称相同。如果您使用过 VS Code,您会很快上手。我只做了以下设置:
let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']
用通俗易懂的语言来说:CTRLP 将忽略项目.gitignore文件中提到的每个文件或目录。
Vim Markdown
如果您不使用 Markdown,请跳过此部分。
由于我经常使用 Markdown 格式在我的博客上写作,所以我安装了这个扩展程序来改善 Neovim 中此类文件的显示效果。
" Disable math tex conceal feature
let g:tex_conceal = ''
let g:vim_markdown_math = 1
" Markdown
let g:vim_markdown_folding_disabled = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_conceal = 0
let g:vim_markdown_fenced_languages = ['tsx=typescriptreact']
我在页面顶部使用 YAML 头部(Frontmatter),以便 Gatsby 能够正常工作。如果没有这个插件,Frontmatter 和代码块的语法将无法识别。
征服:完成
这是配置要求最高的插件。“Conquer of Completion”作为一个服务器,提供代码自动补全和纠错工具,其工作方式类似于 VS Code。它还支持扩展程序,这些扩展程序负责添加对所需编程语言的支持。
CoC 的缺点在于它基于 NodeJS,因此像所有 Node 项目一样,已安装软件包的依赖项会占用一定的磁盘空间。在我目前测试过的项目中,它最符合我的预期,而且配置也最少。
安装扩展程序很简单:只需运行命令:CocInstall <extension-name>,即可使用这些功能。
以下是我使用的扩展程序:
- coc-tsserver:支持 JavaScript、TypeScript 和 React。
- coc-css:支持 CSS、Sass 和 SCSS。
- coc-eslint:检查 JavaScript 和 TypeScript 文件。
- coc-emmet:为 HTML、CSS、Sass、SCSS 和扩展 JavaScript 文件(JSX、TSX)添加快捷方式,以减少代码编写量。
- coc-pyright:Python 支持。
- coc-prettier:根据社区公认的标准格式化代码。
要一次性安装所有程序,只需运行以下命令:
:CocInstall coc-tsserver coc-css coc-eslint coc-emmet coc-pyright coc-prettier
使用 coc-prettier 更漂亮
" Language server stuff
command! -nargs=0 Prettier :call CocAction('runCommand', 'prettier.formatFile')
上面的命令会在你保存文件时运行 Prettier 并格式化文件。这很有帮助,因为我可以减少按Tab缩进键的时间。
JSON 中的 Coc 设置
除了我们目前使用的init.vim`or`之外,我还使用一个名为 `.` 的单独文件。通过它,可以修改扩展程序的行为。.vimrccoc-settings.json
{
"coc.preferences.formatOnSaveFiletypes": [
"css",
"sass",
"scss",
"markdown",
"html",
"json",
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"python"
],
"python.formatting.provider": "black",
"python.formatting.blackPath": "~/.local/bin/black",
"prettier.singleQuote": true,
"javascript.autoClosingTags": true,
"typescript.autoClosingTags": true,
"emmet.includeLanguages": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"html"
],
"codeLens.enable": false
}
以下是对上述设置的解释:
- 配置 CoC 在保存时格式化某些文件类型。
- 配置 Prettier,使其在格式化时优先使用单引号。
- 请告知 Python 代码格式化工具(本例中为“black”),并传入我系统上 black 的路径。
- 启用扩展 JavaScript 标签 (JSX) 的自动关闭功能
- 启用 Emmet 以支持更多文件格式。
- 禁用代码透镜,因为它偶尔会崩溃。
请注意,如果您不使用 Python,请忽略其相关设置。要使 Python 格式化程序正常工作,必须将其安装在系统上:
$ pip install black
键盘快捷键
与其他程序一样,Vim 也支持配置键盘快捷键。每个编辑器模式都可以进行配置,而且功能非常丰富。要在 Vim 中添加键盘快捷键,只需添加以下表达式:
[first-letter-of-target-mode]noremap <key-or-letters> :Command
这个奇怪的词noremap来源于“ No n Re cursive Map ping”,即“非递归映射”。这意味着创建的快捷方式不会覆盖另一个类似的快捷方式,从而避免冲突。
由于我比较崇尚极简主义,所以没有添加很多快捷方式。
" Normal mode remappings
nnoremap <C-q> :q!<CR>
nnoremap <F4> :bd<CR>
nnoremap <F5> :NERDTreeToggle<CR>
nnoremap <F6> :sp<CR>:terminal<CR>
" Tabs
nnoremap <S-Tab> gT
nnoremap <Tab> gt
nnoremap <silent> <S-t> :tabnew<CR>
以下是对上述映射关系的解释:
Ctrl+q关闭打开的屏幕。F4关闭打开的文件。F5:显示或隐藏 NERDTree。F6:在下方分屏窗口中打开终端。Shift+Tab切换到上一个标签页。Shift+t:创建一个标签页。Tab切换到下一个打开的标签页。
请注意,这里有多个符号。这些符号<CR>代表您在命令模式下需要按下的所有键Enter。CR是“回车键”(Carriage Return)的缩写,这个术语源于打字机时代。如今,我们通常将其理解为回车键或换行键。EnterReturn
我使用的所有快捷键都是针对普通模式的,所以nnoremap每行都会显示。如果是插入模式,则会显示为inoremap,如果是vnoremap可视化模式,则以此类推。
自动命令
为了实现某些操作的自动化,Vim 允许定义它所谓的autocmd:在特定事件发生时执行的自动命令。
" Auto Commands
augroup auto_commands
autocmd BufWrite *.py call CocAction('format')
autocmd FileType scss setlocal iskeyword+=@-@
augroup END
上面我定义了两个操作:一个是在保存文件时格式化 Python 代码,另一个是解决我遇到的 SCSS 文件不一致的问题。
包起来
毫无疑问,这是我目前为止写过的最长的文章,但如果你按照说明操作,现在你已经拥有了一个功能非常强大的编辑器。虽然还有其他插件,但随着你逐渐熟悉并建立信心,你会尝试其他更适合你需求的插件。
理想情况下,尽量保持初始化文件简洁。过多的扩展会影响性能。我还使用了一些本文未详细介绍的其他设置,因为它们在大多数情况下并不重要。如果您有兴趣,可以在本文末尾查看我的dotfiles仓库链接。
我们下篇文章见!
链接
如果这篇文章对您有所帮助,请考虑捐赠。您的支持将帮助我创作更多类似的内容!
文章来源:https://dev.to/elvesousa/my-basic-neovim-setup-253l






