关山难越,谁悲失路之人;萍水相逢,尽是他乡之客。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程教程 > 技术文章 > 正文

简简单单的 Vim 就很好

guanshanw 2023-08-22 02:53 26 浏览 0 评论

这就是我如何从 35 个 Vim 插件降到只有 6 个的原因。

当你用 —clean选项启动 Vim 时,它以 “素” 模式展示 Vim。没有插件、没有配置,一切回到了最初。多年来,我收集了一堆配置语句,其中一些可以追溯到 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 的。你不需要在其他发行版或操作系统上这样做,只要确保你的EDITORshell 变量被正确设置就行。

概览

简单介绍一下我认为好的、干净的插件集:

  • 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 = '

但这可能太极端了,所以这里是一个稍大的配置,下面是我的详细解释:

" 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 = '

使用逗号作为引导键

我喜欢把我的 引导键映射成逗号,,而不是默认的反斜杠\。当你的手处于书写位置时,它是 Vim 中最接近的自由键。另外,这个键在大多数键盘布局中都是一样的,而\在每个型号或布局都不一样。我很少使用本地引导键,但下划线_看起来很合适。

延伸阅读:

  • 参见 Vim 参考手册中的:help map-which-keys
  • 参见 Vim Tips Wiki中的 Vim 中未使用的键。

文件类型和关闭语法高亮

接下来是非常重要的 filetype命令。看,Vim 自带“内置电池”,8.2 版本包含 644 种语言的语法高亮,251 个文件类型定义(ftplugins),以及 138 种语言的缩进规则。然而,缩进在默认情况下是不启用的,也许是为了给所有人提供一个一致的编辑体验。我喜欢启用它。

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

延伸阅读:

  • 参见 Vim 参考手册中的:help filetype
  • 参见 Vim 参考手册中的:help syntax
  • 参见 Vim 参考手册中的:help indent

Matchit 插件

Vim 甚至额外带有使得一些功能不兼容的插件,其中一个相当有用。它就是 matchit插件,它使按下%键可以在某些语言中查找匹配的括号。通常情况下,你可以找到一个块的开始或结束(开始和结束括号)或 HTML 匹配标签及类似的。

延伸阅读:

  • 参见 Vim 参考手册中的:help matchit

交换文件

我想从我的旧配置中保留的许多设置之一是使用 /tmp进行交换,并在我的家目录的一个单独目录中创建备份,你需要用mkdir ~/.vimbackup来创建这个目录。重要的是要明白,当你开始编辑时,Vim 会创建一个名为 “交换文件” 的副本,所有未保存的工作都会保存在这个文件中。所以即使停电了,你的交换文件也包含了大部分未保存的工作。我更喜欢使用tmpfs,因为我所有的笔记本电脑和服务器都有 UPS 保护,而且我经常保存。另外,大多数情况下,你会使用到交换文件是当你的 SSH 连接丢失而不是由于停电时。对于大文件来说,交换文件可能相当大,我很珍视我的固态硬盘,所以我决定这样做。如果你不确定,可以删除这句话,使用/var/tmp,这样更安全。

延伸阅读;

  • 参见 Vim 参考手册中的:help swap-file

模糊寻找插件

现在,模糊查找是一个我不能没有的插件。在服务器上当你每天需要打开 20 个文件时,使用 :Ex:e:tabe等命令打开文件是没问题的。而当编码时,我通常需要打开数百个文件。正如我所说,CtrlP 很好地完成了这项工作。它很小,没有依赖性,纯 Vim。它用Ctrl + P组合键打开,这对我来说有点奇怪。我知道一些著名的编辑器(我记得是 VSCode)使用这个组合键。问题是,这已经是很重要的 Vim 绑定键,我不想覆盖它。所以对我来说,赢家是引导键 + 引导键(逗号按两次)。

ctrlp_user_command只是改变了 CtrlP 获取文件列表的方式。它不使用内置的递归文件列表(glob),而是使用git ls-files,这通常更好,因为它忽略了.gitignore中的东西,所以像node_modules或其他可能拖慢列表的不相关目录不会受到影响。

使用 引导键+B/T/F/Q/M来打开缓冲区、标签、当前文件的标签、快速修复缓冲区和最近使用的文件的列表,非常有用。具体来说,一旦你用ctags生成了标签列表,这基本上就是数百种编程语言的“去……定义处”,而且不需要插件!这都是 Vim 内置的。现在澄清一下,当我说输入引导键 + B时,是指按下逗号,然后按B键,而不是像用ControlShift那样一起按。

延伸阅读:

  • 参见 Vim 参考手册中的:help Explore
  • 参见 ctrlp.vim GitHub。

缓冲区管理

虽然现在 Vim 支持标签,但缓冲区管理是掌握 Vim 的一个重要技能。我通常会有很多缓冲区,我需要经常做 :bdelete。那么,引导键 + D似乎是一个不错的选择,可以更快地完成这个任务。我也喜欢关闭 Quickfix 窗口,所以也有引导键 + W的组合键,我在浏览搜索结果时经常使用这个功能。

延伸阅读:

  • 参见 Vim 参考手册中的:help buffer-hidden

Ggrep 和 fugitive 插件

说到搜索,它和打开文件一样重要。我希望能够对代码库进行检索。为此,有一个来自 fugitive 插件的很棒的 :Ggrep命令,它使用git grep,忽略了垃圾文件,只搜索 Git 中的内容。由于Shift + K是 Vim 中的一个自由键,它非常适用于自动检索光标位置的词语。最后,能够使用引导键 + G输入任意的搜索模式也很好。注意,这将打开一个叫做 Quickfix 的窗口,你可以在这里浏览结果、查看下一个/上一个/最后一个/第一个出现的地方,等等。这个窗口也用于编译器或其他工具的输出,所以要熟悉它。如果你对此感到陌生,我建议进一步阅读文档。

延伸阅读:

  • 参见 Vim 参考手册中的:help quickfix
  • 参见 vim-fugitive GitHub。

用 fugitive 进行搜索、检索

顺便说一下,用 /键搜索是智能和大小写敏感的,这意味着如果所有的搜索字符都是小写的,Vim 的搜索会忽略大小写。默认情况下,它会高亮显示结果,我觉得我已经敲了无数次的:noh(来关闭高亮显示)。这就是为什么我有引导键 + S来切换高亮显示。我建议以后也多读读手册中关于搜索的内容。

接下来是搜索、检索。fugitive 插件已经为你提供了。使用命令 :Ggrep pattern来进行git grep,结果会进入 Quickfix 窗口。然后简单地使用快速修复命令(:cn:cp等等)浏览结果,或者简单地使用:CtrlPQuickfix引导键 + Q)来直观地滚动它们。CtrlP 的快速修复整合的酷炫之处是,你可以通过输入以匹配文件名或内容来进一步在搜索结果中搜索。

延伸阅读:

  • 参见 Vim 参考手册中的:help grep
  • 参见 Vim 参考手册中的:help noh
  • 参见 vim-fugitive GitHub。

Ctags

引导键 + C可以生成一个 ctags 文件,以便更好地导航,这在处理一个新的代码库或做一个有很多跳转的较长的编码任务时很有用。ctags 支持数百种语言,而 Vim 可以利用所有这些知识来导航。后面会有更多关于如何配置它的内容。注意我已经讨论过引导键 + T来打开所有标签的模糊搜索,记得吗?这两个是非常相同的。

延伸阅读:

  • 参见 Vim 参考手册中的:help ctags
  • 参见 Universal Ctags 网站。

按键映射

能够通过在项目目录下创建一个 .vimrc文件来覆盖该项目中的任何设置是一个好主意。只要把它放在(全局的).gitignore中,以确保你不需要在每个项目中编辑成千上万的.gitignore文件。这样的一个项目的.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 

正如你所看到的,我通常将 F2F10等键映射到编译、运行、测试和类似的操作。用F9来调用make,听起来不错。还记得 MS-DOS 上的蓝色 Borland IDE 吗?

如前所述,在全局范围内忽略 .vimrc和(由ctags生成的)tags是个好主意,所以不需要每次都更新.gitignore

# git config --global core.excludesfile ~/.gitignore
# cat ~/.gitignore
/.vimrc
/tags
/TAGS

在我的个人配置中还有几条只与那些非美国键盘布局的人有关(我用捷克语)。我需要用“死键”来输入许多字符(LCTT 译注:“死键”是一种通过将变音符号与后面的字母结合起来打出重音字符的方法。这种方法在历史上被用于机械打字机),这根本不可能,我宁愿输入命令而不是按那些难以按下的组合键。这里有一个解决问题的办法:

" CTRL-] is hard on my keyboard layout
map 

延伸阅读:

  • 参见 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 的两个插件中,这个插件很轻量级,不需要外部依赖,而且可以开箱即用我所有的字体。你可以定制它,而且还有主题之类的东西。我只是碰巧喜欢它的默认设置。

我必须提到,有两个主要的 Ctags 项目:Exuberant Ctags 和 Universal Ctags。后者是一个更现代的复刻。如果你的发行版有,就用它。如果你在 Fedora 35+ 上,你应该知道你现在用的是 Universal Ctags。

总结

作为总结,我的建议是这样的。尽量保持你的 Vim 配置流畅和干净。这将在未来得到回报。在我转换到新配置之后,我不得不重新学习“写入并退出”的命令,因为我总是不小心把它打成 :Wq,而我在旧的配置里有一个“小技巧”,让它实际上按我的意思工作。好吧,这个可能真的很有用,并能入选,我希望你能明白我的意思:

:command Wq wq
:command WQ wq

最后的一个快速技巧是:你可能需要经常改变你的默认 Vim 配置,来找到我在这里向你介绍的和你自己口味之间的舒适区。使用下面的别名,这样你就不需要一直搜索历史。相信我,当一个 Vim 用户在命令历史里搜索 “vim” 时,找不到什么是相关的内容:

alias vim-vimrc='vim ~/.vimrc'

就是这些了。也许这可以帮助你在没有大量插件的情况下在 Vim 的丰富世界遨游。“简简单单” 的 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,可以绑定到引导键组合上。请看我的GitHub 仓库中更新后的配置文件。一路走来,我学到了很多东西。有一些键的绑定我已经忘记了,这要感谢许多插件。

这篇文章最初发表在 作者的网站上,经许可后重新发表。

via: https://opensource.com/article/21/12/vanilla-vim-config

作者:Luká? Zapletal选题:lujun9972译者:wxy校对:wxy

本文由 LCTT原创编译,Linux中国荣誉推出

相关推荐

七条简单命令让您玩转Git
七条简单命令让您玩转Git

凭借着出色的协作能力、快速部署效果与代码构建辅助作用,Git已经得到越来越多企业用户的青睐。除了用于开发商业及消费级应用之外,众多科学及政府机构也开始尝试使用这...

2023-10-07 12:14 guanshanw

基本完整的关于Git分支branch的操作
基本完整的关于Git分支branch的操作

Git使用背景项目中要用到dev或者其他分支开发完代码,需要将该分支合并到master的需求操作步骤下面以dev名称为lex为分支名为例来操作一遍客户端操作:...

2023-10-07 12:14 guanshanw

Git 进阶(合并与变基)
Git 进阶(合并与变基)

在Git中整合来自不同分支的修改主要有两种方法:合并(merge)以及变基(rebase)合并(merge)merge流程图merge的原理是找到这两个分...

2023-10-07 12:13 guanshanw

Git学习笔记 003 Git进阶功能 part5 合并(第一部分)

合并(merge)是很常用的操作。尤其是一个庞大的很多人参与开发的企业级应用。一般会设定一个主分支,和多个副分支。在副分支开发完成后,合并到主分支中。始终保持主分支是一个完整的,稳定的最新状态的分支。...

非标题党,三张图帮你理解git merge和git rebase的区别
非标题党,三张图帮你理解git merge和git rebase的区别

初始场景:基于正常的开发分支修改几个小bug,然后在合并到开发分支上。gitmergegitcheckoutfeaturegitmergeho...

2023-10-07 12:13 guanshanw

git 初次使用(01)
git 初次使用(01)

先从github上克隆代码下来:使用vscode克隆代码如下图,填写上github仓库地址:vscode有时候克隆代码速度比较慢,可以用命令行方式克隆gitc...

2023-10-07 12:12 guanshanw

Git 远程操作

4.Git远程操作命令说明gitremote远程版本库操作gitfetch从远程获取版本库gitpull下载远程代码并合并gitpush上传远程代码并合并4.1远程版本库操作gitre...

Git常用命令-总结
Git常用命令-总结

创建git用户$gitconfig--globaluser.name"YourName"$gitconfig--globaluser.em...

2023-10-07 12:12 guanshanw

git中删除从别人clone下来项目的git信息,并修改为自己的分支

如果你从别人的Git存储库中克隆了一个项目,并想要删除与该存储库相关的Git信息,并将其修改为你自己的分支,则可以执行以下步骤:使用gitclone命令克隆存储库:gitclone<u...

git系列-回滚和放弃本地修改

回滚历史提交就是reset的功能。这种情况是已经提交远程仓库,需要回滚到之前的提交。gitreset--hardcommitId//注:强制提交后,当前版本后面的提交版本将会删掉!gi...

GIT使用小技巧大全
GIT使用小技巧大全

在大型软件工程的开发过程中,版本控制是无法绕过去的;目前来说,最火的版本控制软件就是GIT了。早两年SVN比较火,不过被大神linus喷了几次后,就日落西山了,...

2023-10-07 12:11 guanshanw

git相关命令-上
git相关命令-上

这些命令都是看了文档后,个人觉得比较有用的一些,展示给大家。回到远程仓库的状态抛弃本地所有的修改,回到远程仓库的状态。gitfetch--all&...

2023-10-07 12:10 guanshanw

Git命令行接口:掌握Git的必备技能
Git命令行接口:掌握Git的必备技能

Git是一款强大的分布式版本控制工具,它支持命令行界面操作。熟练掌握Git命令行接口,是开发者使用Git的必备技能之一。在这篇文章中,我们将介绍Git命令行接口...

2023-10-07 12:10 guanshanw

Git命令详解
Git命令详解

相信各位小伙伴们应该都对git有一些了解,毕竟作为代码管理的神器,就算不是IT行业的小伙伴肯定也或多或少的听说过一些。今天就来和小伙伴们分享一下自己总结的常用命...

2023-10-07 12:10 guanshanw

工作7年收集到的git命令
工作7年收集到的git命令

概念git中的术语解释:仓库也叫版本库(repository)stage:暂存区,add后会存到暂存区,commit后提交到版本库git安装linux...

2023-10-07 12:10 guanshanw

取消回复欢迎 发表评论: