Vanilla Vim 很有趣

这是我如何从 35 个 Vim 插件减少到只有 6 个的方法。
48 位读者喜欢这篇文章。

当您使用 --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,但下划线看起来很合适。

进一步阅读

Filetype 和语法关闭

接下来是非常重要的 filetype 命令。请注意,Vim 自带“电池”,8.2 版本包含 644 种语言的语法高亮、251 个文件类型定义 (ftplugins) 和 138 种语言的缩进规则。但是,默认情况下未启用缩进,可能是为了为所有人提供一致的编辑体验。我喜欢启用它。

一个小技巧:如果您正在编辑一个非常大的文件,并且 Vim 感觉很慢,您可能需要禁用语法高亮以加快速度。只需键入 :syn off 命令即可。

进一步阅读

Matchit 插件

Vim 甚至带有一些额外的插件,这使得某些功能不兼容,其中一个非常有用。它是 matchit 插件,它使 % 键能够查找 与某些语言匹配的括号。通常,您可以找到块的开头或结尾(begin 和 end)或 HTML 匹配标签等。

进一步阅读

交换文件

我想从旧配置中保留的许多设置之一是使用 /tmp 进行交换,并在我的主目录中的一个单独目录中创建备份,您需要使用 mkdir ~/.vimbackup 创建该目录。重要的是要理解,当您开始编辑时,Vim 会创建一个名为“交换文件”的副本,所有未保存的工作都会保存在此文件中。因此,即使发生电源故障,您的交换文件也包含大部分未保存的工作。我更喜欢使用 tmpfs,因为我的所有笔记本电脑和服务器都受到 UPS 的保护,并且我经常保存。此外,大多数时候,您使用交换文件是因为您的 SSH 连接丢失,而不是由于电源故障。对于大型文件,交换文件可能会很大,并且我重视我的 SSD,所以我在这里做出决定。如果您不确定,请删除此语句以使用更安全的 /var/tmp

进一步阅读

模糊查找器插件

现在,模糊查找器是我离不开的插件。当您每天需要打开大约 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 键,而不是像 ControlShift 那样一起按。

进一步阅读

缓冲区管理

尽管 Vim 现在支持选项卡,但缓冲区管理是掌握 Vim 的一项重要技能。我通常最终会得到太多的缓冲区,并且我需要经常执行 :bdelete。好吧,leader+D 似乎是一个更快的好选择。我也喜欢关闭快速修复窗口,因此也有 leader+W 组合。我在浏览搜索结果时经常使用它。

进一步阅读

Ggrep 和 fugitive 插件

说到搜索,它与打开文件一样重要。我希望能够 grep 代码库。为此,fugitive 插件提供了很棒的 :Ggrep 命令,它使用 git grep,它忽略垃圾文件,只搜索 git 中的内容。由于 Shift+K 是 Vim 中的空闲键,因此它非常适合自动 grep 光标下的术语。最后,能够使用 leader+G 输入任意搜索模式也很不错。请注意,这会打开一个名为“快速修复”窗口的窗口,您可以在其中导航结果、转到下一个匹配项、上一个、最后一个、第一个等等。同一个窗口用于来自编译器或其他工具的输出,因此请熟悉它。如果这对您来说是新的,我建议进一步阅读文档。

进一步阅读

使用 fugitive 进行搜索和 grepping

顺便说一句,使用 / 键进行搜索是智能且敏感的,这意味着如果所有字符都是小写,Vim 会忽略大小写进行搜索。默认情况下,它会突出显示结果,我想我已经输入了大约一百万次 :noh(关闭突出显示)。这就是为什么我有 leader+S 来切换此功能的原因。我建议稍后在手册中阅读更多关于搜索的内容。

接下来是搜索和 grepping。fugitive 插件可以满足您的需求。使用命令 :Ggrep pattern 执行 git grep,结果将进入“快速修复”窗口。然后,只需使用快速修复命令(:cn:cp 等)导航结果,或直接使用 :CtrlPQuickfix(或 leader+Q)以可视化方式滚动它们。CtrlP 快速修复集成的酷之处在于,如果它有意义——搜索搜索结果,您可以进一步搜索结果,方法是键入以匹配文件名或内容。

进一步阅读

Ctags

当处理新代码库或进行长时间的编码会话并进行大量跳转时,Leader+C 生成 ctags 文件以获得更好的导航非常有用。Ctags 支持数百种语言,Vim 可以使用所有这些知识进行导航。稍后将详细介绍如何配置它。请注意,我已经讨论过 leader+T 以打开所有标签的模糊搜索,还记得吗?这是一回事。

进一步阅读

按键映射

通过在项目目录中创建 .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 吗?

如前所述,最好全局忽略 .vimrctags(由 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 中都是空闲的,除了 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 存储库 中的更新配置文件。我一路学到了很多东西。由于许多插件,我已经忘记了一些键绑定。


本文最初出现在作者的网站 上,并经许可重新发布。

接下来阅读什么
标签
User profile image.
红帽公司首席软件工程师

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.