当您使用 --clean
选项启动 Vim 时,它会以“vanilla”模式显示。没有插件,没有配置,只是回归本源。多年来,我收集了大量的配置语句,其中一些可以追溯到 MS-DOS 或 Windows 3.1。这就是重点:我将从头开始,找到一个好的起点配置,只使用 Fedora 35 中可用的插件。我能坚持一周的编码吗?我会找到答案!
以下是规则:尽可能少的配置语句,并且只使用 Fedora 35+ 附带的插件。顺便说一句,如果您不是 Fedora 用户,请继续阅读。您始终可以从您的操作系统包管理器手动安装这些插件,或者使用 Vim 插件管理器。
在我开始之前,有一个显而易见的问题:Vim 还是 Neovim(Vim 的分支)?嗯,这取决于您。本文中的所有内容都应该适用于两者。但是,我只在 Vim 上进行了测试。当您登录到只有 vi
可用的服务器时,所有这些技能都将派上用场。它可以是一个旧的 UNIX 系统、一个安装了最少软件以提高安全性的 Linux 服务器、容器中的交互式 shell,或者是一个空间宝贵的嵌入式系统。
事不宜迟,这是我提炼出的绝对最低限度的配置,以便有效地使用 Vim 进行编码
# dnf install --allowerasing vim-default-editor \
vim-enhanced \
vim-ctrlp \
vim-airline \
vim-trailing-whitespace \
vim-fugitive \
vim-ale \
ctags
不要担心 --allowerasing
选项。只需在确认之前查看安装事务即可。此选项用于告诉包管理器将现有包 nano-default-editor
替换为 vim-default-editor
。这是一个小型软件包,它会删除 shell 配置文件以将 EDITOR 环境变量设置为 vim
,如果您想使用 Vim(例如,与 git 一起使用),这是必不可少的。这是 Fedora 的一个特殊之处。您无需在其他发行版或操作系统上执行此操作——只需确保您的 EDITOR shell 变量已正确设置即可。
概述
我对我认为良好且干净的插件集进行的快速概述
- CtrlP:最小的模糊查找器插件(纯 vimscript)
- Fugitive:git 必备工具
- Trailing-whitespace:显示和修复尾随空格
- Airline:改进的状态行(纯 vimscript)
- Ale:在您键入时突出显示拼写错误或语法错误
- Ctags:不是 Vim 插件,但却是非常需要的工具
还有其他模糊查找器插件,如 command-t 或我最喜欢的(非常快)fzf.vim
。问题是,fzf.vim
不在 Fedora 中,我想要尽可能小的配置。CtrlP 可以很好地完成工作,并且配置起来更容易,因为它不需要任何东西。
如果我要选择绝对最小配置,它将是
# cat ~/.vimrc
let mapleader=","
let maplocalleader="_"
filetype plugin indent on
let g:ctrlp_map = '<leader><leader>'
let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']
set exrc
set secure
但这可能太极端了,所以这里有一个稍微大一点的配置,下面有我的详细解释
" vim: nowrap sw=2 sts=2 ts=2 et:
" leaders
let mapleader=","
let maplocalleader="_"
" filetype and intent
filetype plugin indent on
" incompatible plugins
if has('syntax') && has('eval')
packadd! matchit
end
" be SSD friendly (can be dangerous!)
"set directory=/tmp
" move backups away from projects
set backupdir=~/.vimbackup
" fuzzy searching
let g:ctrlp_map = '<leader><leader>'
let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']
nnoremap <leader>b :CtrlPBuffer<cr>
nnoremap <leader>t :CtrlPTag<cr>
nnoremap <leader>f :CtrlPBufTag<cr>
nnoremap <leader>q :CtrlPQuickfix<cr>
nnoremap <leader>m :CtrlPMRU<cr>
" buffers and quickfix
function! ToggleQuickFix()
if empty(filter(getwininfo(), 'v:val.quickfix'))
copen
else
cclose
endif
endfunction
nnoremap <leader>w :call ToggleQuickFix()<cr>
nnoremap <leader>d :bd<cr>
" searching ang grepping
nnoremap <leader>g :copen<cr>:Ggrep!<SPACE>
nnoremap K :Ggrep "\b<C-R><C-W>\b"<cr>:cw<cr>
nnoremap <leader>s :set hlsearch! hlsearch?<cr>
" ctags generation
nnoremap <leader>c :!ctags -R .<cr><cr>
" per-project configs
set exrc
set secure
使用逗号作为 leader 键
我喜欢将我的 leader 键映射到逗号而不是默认的反斜杠。当您的手处于书写位置时,它是 Vim 中最接近的空闲键。此外,此键在大多数键盘布局中都是相同的,而 \
因型号或布局而异。我很少使用本地 leader,但下划线看起来很合适。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help map-which-keys
- 请参阅 Vim Tips Wiki 上 Vim 中未使用的键
Filetype 和语法关闭
接下来是非常重要的 filetype
命令。请注意,Vim 自带“电池”,8.2 版本包含 644 种语言的语法高亮、251 个文件类型定义 (ftplugins
) 和 138 种语言的缩进规则。但是,默认情况下未启用缩进,可能是为了为所有人提供一致的编辑体验。我喜欢启用它。
一个小技巧:如果您正在编辑一个非常大的文件,并且 Vim 感觉很慢,您可能需要禁用语法高亮以加快速度。只需键入 :syn off
命令即可。
进一步阅读
Matchit 插件
Vim 甚至带有一些额外的插件,这使得某些功能不兼容,其中一个非常有用。它是 matchit
插件,它使 %
键能够查找 与某些语言匹配的括号。通常,您可以找到块的开头或结尾(begin 和 end)或 HTML 匹配标签等。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help matchit
交换文件
我想从旧配置中保留的许多设置之一是使用 /tmp
进行交换,并在我的主目录中的一个单独目录中创建备份,您需要使用 mkdir ~/.vimbackup
创建该目录。重要的是要理解,当您开始编辑时,Vim 会创建一个名为“交换文件”的副本,所有未保存的工作都会保存在此文件中。因此,即使发生电源故障,您的交换文件也包含大部分未保存的工作。我更喜欢使用 tmpfs
,因为我的所有笔记本电脑和服务器都受到 UPS 的保护,并且我经常保存。此外,大多数时候,您使用交换文件是因为您的 SSH 连接丢失,而不是由于电源故障。对于大型文件,交换文件可能会很大,并且我重视我的 SSD,所以我在这里做出决定。如果您不确定,请删除此语句以使用更安全的 /var/tmp
。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help swap-file
模糊查找器插件
现在,模糊查找器是我离不开的插件。当您每天需要打开大约 20 个文件时,在服务器上使用 :Ex
或 :e
或 :tabe
等命令打开文件还可以。在编码时,我通常需要打开数百个文件。正如我所说,CtrlP 可以很好地完成这项工作。它很小,没有依赖项——纯 Vim。它通过 Ctrl+P 组合打开,这对我来说有点奇怪。我知道一些著名的编辑器使用它(我认为是 VSCode)。问题是,这些已经是重要的 Vim 键绑定,我不想覆盖它们。因此,对我来说,胜出者是 leader+leader(按两次逗号)。
ctrlp_user_command
只是更改了 CtrlP 获取文件列表的方式。它不使用内置的递归文件列表器 (glob),而是使用 git ls-files
,这通常更好,因为它忽略了 .gitignore
中的内容,因此像 node_modules
或其他不相关的目录等会减慢列表速度的东西不会妨碍。
Leader+B/T/F/Q/M 用于打开缓冲区列表、标签、当前文件中的标签、快速修复缓冲区和最近使用的文件非常有用。具体来说,一旦您使用 ctags
生成了 taglist
,这本质上就是数百种编程语言的“转到定义”——无需插件!这一切都内置在 Vim 中。现在直言不讳地说,当我键入 leader+B 时,这意味着按逗号,然后按 B 键,而不是像 Control 或 Shift 那样一起按。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help Explore
- 请参阅 ctrlp.vim GitHub
缓冲区管理
尽管 Vim 现在支持选项卡,但缓冲区管理是掌握 Vim 的一项重要技能。我通常最终会得到太多的缓冲区,并且我需要经常执行 :bdelete
。好吧,leader+D 似乎是一个更快的好选择。我也喜欢关闭快速修复窗口,因此也有 leader+W 组合。我在浏览搜索结果时经常使用它。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help buffer-hidden
Ggrep 和 fugitive 插件
说到搜索,它与打开文件一样重要。我希望能够 grep 代码库。为此,fugitive 插件提供了很棒的 :Ggrep
命令,它使用 git grep,它忽略垃圾文件,只搜索 git 中的内容。由于 Shift+K 是 Vim 中的空闲键,因此它非常适合自动 grep 光标下的术语。最后,能够使用 leader+G 输入任意搜索模式也很不错。请注意,这会打开一个名为“快速修复”窗口的窗口,您可以在其中导航结果、转到下一个匹配项、上一个、最后一个、第一个等等。同一个窗口用于来自编译器或其他工具的输出,因此请熟悉它。如果这对您来说是新的,我建议进一步阅读文档。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help quickfix
- 请参阅 vim-fugitive GitHub
使用 fugitive 进行搜索和 grepping
顺便说一句,使用 /
键进行搜索是智能且敏感的,这意味着如果所有字符都是小写,Vim 会忽略大小写进行搜索。默认情况下,它会突出显示结果,我想我已经输入了大约一百万次 :noh
(关闭突出显示)。这就是为什么我有 leader+S 来切换此功能的原因。我建议稍后在手册中阅读更多关于搜索的内容。
接下来是搜索和 grepping。fugitive 插件可以满足您的需求。使用命令 :Ggrep pattern
执行 git grep,结果将进入“快速修复”窗口。然后,只需使用快速修复命令(:cn
、:cp
等)导航结果,或直接使用 :CtrlPQuickfix
(或 leader+Q)以可视化方式滚动它们。CtrlP 快速修复集成的酷之处在于,如果它有意义——搜索搜索结果,您可以进一步搜索结果,方法是键入以匹配文件名或内容。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help grep
- 请参阅 Vim 参考手册 中的
:help noh
- 请参阅 vim-fugitive GitHub
Ctags
当处理新代码库或进行长时间的编码会话并进行大量跳转时,Leader+C 生成 ctags
文件以获得更好的导航非常有用。Ctags 支持数百种语言,Vim 可以使用所有这些知识进行导航。稍后将详细介绍如何配置它。请注意,我已经讨论过 leader+T 以打开所有标签的模糊搜索,还记得吗?这是一回事。
进一步阅读
- 请参阅 Vim 参考手册 中的
:help ctags
- 请参阅 Universal Ctags 网站
按键映射
通过在项目目录中创建 .vimrc
文件来覆盖项目中的任何其他设置是一个好主意。只需将其放在(全局).gitignore
中,以确保您无需在每个项目中编辑数千个 git 忽略文件。这样一个项目 .vimrc
可能类似于(对于带有 GNU Makefile 的 C/C++ 项目)
" coding style
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
" include and autocomplete path
let &path.="/usr/local/include"
" function keys to build and run the project
nnoremap <F9> :wall!<cr>:make!<cr><cr>
nnoremap <F10> :!LD_LIBRARY_PATH=/usr/local/lib ./project<cr><cr>
如您所见,我通常将 F2-F10 键映射到编译、运行、测试和类似操作。使用 F9 调用 make
听起来不错。还记得 MS-DOS 中的蓝色 Borland IDE 吗?
如前所述,最好全局忽略 .vimrc
和 tags
(由 ctags
生成),这样就无需更新每个 .gitignore
# git config --global core.excludesfile ~/.gitignore
# cat ~/.gitignore
/.vimrc
/tags
/TAGS
我的个人配置中的更多语句仅与使用非美国键盘布局的人员相关(我使用的是捷克语)。我需要对许多字符使用死键,这根本不可能,我宁愿键入命令而不是执行那些难以实现的组合。以下是该问题的解决方案
" CTRL-] is hard on my keyboard layout
map <C-K> <C-]>
" CTRL-^ is hard on my keyboard layout
nnoremap <F1> :b#<cr>
nnoremap <F2> :bp<cr>
nnoremap <F3> :bn<cr>
" I hate entering Ex mode by accident
map Q <Nop>
进一步阅读
- 请参阅 Vim 参考手册 中的
:help map
功能键在 Vim 中都是空闲的,除了 F1,它绑定到帮助。我不需要帮助,并不是说我已经了解关于 Vim 的一切。根本不是。但如果需要,我可以简单地键入 :help
。而 F1 是一个至关重要的键,非常靠近 Esc 键。我喜欢使用缓冲区交换 (:b#
) 来实现该目的,并使用 F2-F3 进行下一个/上一个。您使用缓冲区的次数越多,您就越需要它。如果您尚未使用 Ctrl+^,我建议您习惯它。哦,您是否曾经使用丑陋的类型 :visual
进入 Ex 模式?许多初学者不知道如何从该模式退出 Vim。对我来说,这只是令人不安,因为我很少使用它。
现在,熟悉 ctags
是成功使用 Vim 的关键。此工具支持数百种语言,并且可以轻松地为您不想创建的文件创建标签,因此我建议忽略典型的垃圾目录
# cat ~/.ctags.d/local.ctags
--recurse=yes
--exclude=.git
--exclude=build/
--exclude=.svn
--exclude=vendor/*
--exclude=node_modules/*
--exclude=public/webpack/*
--exclude=db/*
--exclude=log/*
--exclude=test/*
--exclude=tests/*
--exclude=\*.min.\*
--exclude=\*.swp
--exclude=\*.bak
--exclude=\*.pyc
--exclude=\*.class
--exclude=\*.cache
Airline 插件
我一定不能忘记 Vim airline 插件。在 Fedora 的两个插件中,这个插件很轻巧,不需要外部依赖项,并且可以与我的所有字体开箱即用。您可以自定义它,并且有主题和类似的东西。我只是碰巧喜欢默认设置。
我必须提到,主要有两个 ctag
项目:Exuberant Ctags 和 Universal Ctags。后者是更现代的分支。如果您的发行版有它,请使用它。如果您使用的是 Fedora 35+,您需要知道您现在使用的是 Universal Ctags。
总结
当我总结时,这是我的建议。尽量保持您的 Vim 配置简洁明了。它将在未来得到回报。切换后,我不得不重新学习“写入并退出”命令,因为我一直不小心将其键入为 :Wq
,并且我在旧配置中有一个“hack”,实际上做了我想做的事情。好吧,这一个可能实际上很有用并且可以入选——我希望您明白我的意思
:command Wq wq
:command WQ wq
这是一个最后的快速提示:在找到我在此处向您展示的内容和您自己的口味的最佳位置时,您可能需要多次更改默认的 Vim 配置。使用以下别名,这样您就不需要一直搜索历史记录。相信我,当 Vim 用户搜索“vim”的历史记录时, 没有任何内容是相关的
alias vim-vimrc='vim ~/.vimrc'
就是这样。也许这可以帮助您在丰富的 Vim 世界中导航,而无需大量的插件。Vanilla Vim 很有趣!
要试用您刚刚阅读的内容,请安装软件包并查看配置
test -f ~/.vimrc && mv ~/.vimrc ~/.vimrc.backup
curl -s https://raw.githubusercontent.com/lzap/vim-lzap/master/.vimrc -o ~/.vimrc
mkdir ~/.vimbackup
特别感谢 Marc Deop 和 Melanie Corr 审阅本文。
更新 我幸存下来了!我遇到的唯一困难是 CtrlP 插件的结果顺序不同。文件的模糊算法与 fzf.vim
插件不同,因此我过去使用各种搜索词找到的文件现在无法正常工作。我最终从 Fedora 安装了 fzf 软件包,该软件包附带一个 vim 函数 FZF,该函数可以绑定到 leader 组合以进行更相关的文件搜索。请参阅我的 GitHub 存储库 中的更新配置文件。我一路学到了很多东西。由于许多插件,我已经忘记了一些键绑定。
本文最初出现在作者的网站 上,并经许可重新发布。
评论已关闭。