我的Vim和Neovim配置
My Vim & Neovim config
.vimrc | .vimrc.fast | init.vim |
---|---|---|
目前测试了Windows >= 10
与Ubuntu >= 18.04
系统,
我手头上没有Mac电脑,所以暂时没有适配macOS
。
如果你习惯使用Vim,请保证版本号 Vim >= 7.3.1058
如果你习惯使用Neovim,请保证版本号 Neovim >= 0.10
,尽量使用最新版本。
版本号低于要求时,可能会有部分功能无法正常使用。
本套配置使用了插件管理器junegunn/vim-plug,需要互联网连接与git
命令方可下载、安装插件。
若您所在的环境无法访问互联网或无法安装git
,可将配置文件开头MY_VIMRC_BASIC
变量的值设置为1
。配置生效后仅保留基本功能,所有涉及到插件的功能将不可用。
- 目录文件树、命令行、文件历史版本管理、底部状态栏、粘贴板历史、代码标签树、文件和内容的模糊检索、代码格式化、代码补全与跳转(Neovim)、代码调试(Neovim)等。
- 本套配置中,Vim的定位是增强版的文本编辑器而非IDE,追求兼容性与开箱即用;Neovim追求文本编辑器的新功能,可以承担IDE的一部分功能,但也不能完全取代IDE。
- 如果需要在嵌入式设备上配置Vim,或者发现
.vimrc
配置导致Vim打开文件缓慢、浏览文件时卡顿,可以使用精简版的.vimrc.fast
配置文件。精简版的配置保留了大部分主要功能,并使用了更加轻量的插件。
切换路径至本仓库目录下,复制本仓库的.vimrc
作为用户的Vim默认配置文件。
cp ./.vimrc ~/.vimrc
配置中使用了vim-plug作为Vim的插件管理器。首次运行配置过的Vim时,Vim会自动下载并安装插件管理器,并自动安装一系列插件。
主要功能插件的快捷键是<F2> ~ <F5>
,<F7> ~ <F9>
。安装完毕后重新进入Vim,即可按动快捷键查看插件是否工作正常。
- 如果插件下载安装进度过慢或显示某些插件安装失败,请退出Vim,然后尝试重新打开Vim输入命令
:PlugInstall
来下载安装这些插件。 - 配置文件默认使用加速网站来加快对github的访问,如需更换回原始的github网址,请更改配置文件中的
GITHUB_RAW
与GITHUB_SITE
变量值,将被注释掉的变量值还原。在改变网址后所有已安装插件都需要更新,输入命令:PlugClean
和:PlugInstall
来重新下载安装插件。 - 如果您所在的环境无法访问互联网或无法安装
git
,可将配置文件开头MY_VIMRC_BASIC
变量的值设置为1
。配置生效后仅保留基本功能,所有涉及到插件的功能将不可用。
精简版的配置目标是——首先保证Vim的启动速度和使用流畅性,其次添加方便用户的功能。精简版配置删去了一些不必要的插件,并且使用了更加轻量的插件。使用精简版配置后,Vim会拥有飞快的启动速度,用户将获得流畅的编辑体验。
切换路径至本仓库目录下,复制本仓库的.vimrc.fast
作为用户的Vim默认配置文件。
cp ./.vimrc.fast ~/.vimrc
安装插件等操作与完全版配置相同。精简版配置中默认没有占用<F5>
功能键,其它功能键的分布与完全版一致。
Neovim编辑器是对传统Vim编辑器的重构。Neovim拥有着强大的:
- 可扩展性——几乎所有主流语言都可以轻松访问Neovim的API,因此大家能够很容易地编写它的插件。Neovim对lua语言的内建支持使得插件可以飞速运行,这让流畅的代码补全和语法高亮等功能成为可能。
- 可用性——Neovim修缮了Vim过时的默认配置(Neovim定制了一套自己的新默认配置),并添加了现代编辑器的新功能,如现代GUI、异步加载和终端模拟器等。
本仓库的Neovim配置文件需要比较新的Neovim版本,大多数的包管理器软件源尚未更新该版本,因此需要遵循官方文档手动安装。
对于x86_64架构的Linux系统,执行如下操作来下载Neovim的可执行文件,下载后应当可以直接运行Neovim。
🟨展开安装步骤,适用于x86_64架构的Linux系统
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x nvim.appimage
./nvim.appimage
此时Neovim应当开始运行。
nvim.appimage
是Neovim的启动程序,可以将其改名为nvim
放置在/usr/bin/
目录下(需要sudo权限。/usr/bin/
目录应当存在于$PATH
中,操作后所有用户均可使用nvim命令)。
chmod +x nvim.appimage
sudo mv ./nvim.appimage /usr/bin/nvim
或改名为nvim
放置在~/.local/bin/
目录下(无需sudo权限。~/.local/bin/
应当存在于$PATH
中,操作后仅当前用户可使用nvim命令)。
mv ./nvim.appimage ~/.local/bin/nvim
💡如果nvim.appimage
执行失败(在确认文件已经完整下载后,仍然执行失败),可以手动从安装包里解压Neovim相关文件到本地。
./nvim.appimage --appimage-extract
./squashfs-root/AppRun --version
如果要全局安装(需sudo权限),先对相关文件进行移动,再将可执行文件软连接到系统二进制文件目录下,命名为nvim。操作完成后,使用nvim命令便可以启动Neovim。
sudo mv squashfs-root /
sudo ln -s /squashfs-root/AppRun /usr/bin/nvim
nvim
💡如果没有sudo权限,可以仅对当前用户安装Neovim。对Ubuntu系统而言,可以将程序数据移动至当前用户$HOME
下的.local/
目录(这是Ubuntu默认用于存放当前用户应用数据的位置);然后将可执行文件软连接至~/.local/bin/nvim
(~/.local/bin/
目录是Ubuntu系统默认用于存放当前用户可执行文件的位置,并应当默认存在于当前用户的$PATH
中)。
mv squashfs-root ~/.local/
ln -s ~/.local/squashfs-root/AppRun ~/.local/bin/nvim
nvim
切换路径至本仓库目录下,复制本仓库的init.vim
作为用户的Neovim默认配置文件。
在Linux系统上,应当将Neovim配置文件init.vim
放置于~/.config/nvim/
目录
mkdir -p ~/.config/nvim/
cp ./init.vim ~/.config/nvim/init.vim
对于Windows系统,用户需要将Neovim配置文件init.vim
放置于~\AppData\Local\nvim\
目录
# 使用PowerShell
mkdir "~\AppData\Local\nvim\"
cp .\init.vim "~\AppData\Local\nvim\init.vim"
在终端输入nvim
进入Neovim,此时将自动开始下载插件管理器plug.vim
。下载完毕后Neovim会报告一系列插件未找到的错误,这是正常现象。按下大写的G
跳转到信息末尾,即可自动安装所有插件。
主要功能插件的快捷键是<F2> ~ <F9>
。安装完毕后重新进入Neovim,即可按动快捷键查看插件是否工作正常。
- 如果插件下载安装进度过慢或显示某些插件安装失败,请退出Neovim,然后尝试重新打开Neovim输入命令
:PlugInstall
来下载安装这些插件。 - 配置文件默认使用加速网站来加快对github的访问,如需更换回原始的github网址,请更改配置文件中的
GITHUB_RAW
与GITHUB_SITE
变量值,将被注释掉的变量值还原。在改变网址后所有已安装插件都需要更新,输入命令:PlugClean
和:PlugInstall
来重新下载安装插件。 - 如果您所在的环境无法访问互联网或无法安装
git
,可将配置文件开头MY_VIMRC_BASIC
变量的值设置为1
。配置生效后仅保留基本功能,所有涉及到插件的功能将不可用。
<F2>
表示短促地按一下F2
功能键。
有些电脑的功能键需要先按住fn
键才能启用,建议设置成不需要按fn
键就能直接用。<C-p>
和<C-P>
都表示先按住Ctrl
不松手,再直接按下键盘上的p
键。
以文件树的方式查看当前目录。可以在其中打开/删除/新建文件等。再按一次快捷键可关闭窗口。
在编辑器内部打开一个系统终端。再次按下该快捷键可隐藏或关闭此终端窗口。
🟨展开详细说明
-
若当前Vim原生支持终端功能(
:echo has('terminal')
打印返回值为1
),则使用voldikss/vim-floaterm
插件。- 直接按下
<F3>
后,一个系统终端会出现在界面下方。终端内部的操作方式和系统原生终端一致,支持Tab
命令补全,上下翻阅历史记录等操作。 - 先按下某个
数字键
再按下<F3>
,会开启一个新的终端,不同编号的终端彼此独立。 - 同一时间只能显示一个终端,其余的自动被隐藏。被隐藏的终端里运行的程序不会被打断。
- 无论当前位于哪一个编号的终端,再次按下
<F3>
都可隐藏当前终端窗口。被隐藏的终端里运行的程序不会被打断。
- 直接按下
-
若当前Vim不支持终端功能,则使用
Shougo/vimshell.vim
插件。该插件可以在Vim中模拟一个终端窗口。- 🟨本插件在安装时需要调用
make
和g++
等命令来生成所需要的库,请事先安装相关的编译工具。 - 支持
Tab
命令补全,<C-P>
上翻历史记录,<C-N>
下翻。 - 再次按下
<F3>
可隐藏当前终端窗口,终端内运行的程序不会被打断。
- 🟨本插件在安装时需要调用
-
若当前Vim原生支持终端功能(
:echo has('terminal')
打印返回值为1
),则按下<F3>
后界面下方会出现一个新的终端窗口。再次按下<F3>
可关闭此终端窗口。- 🟨终端被关闭时,里面运行的程序会被终止。
-
若当前Vim不支持终端功能,按下
<F3>
后会自动执行Vim的:shell
命令,屏幕下方会出现一行提示。- 此时按任意键即可离开Vim,进入终端。
- 使用完毕后,在终端内按下
<C-D>
或执行exit
命令,即可结束终端,回到Vim。 - 🟨终端被关闭时,里面运行的程序会被终止。
使用akinsho/toggleterm.nvim
插件。
- 直接按下
<F3>
后,一个系统终端会出现在界面下方。终端内部的操作方式和系统原生终端一致,支持Tab
命令补全,上下翻阅历史记录等操作。 - 再次按下
<F3>
可隐藏当前终端窗口,终端内运行的程序不会被打断。 - 先按下某个
数字键
再按下<F3>
会开启一个新的终端,不同编号的终端彼此独立。不同终端可以同时分屏显示。 - 按下
<Esc>
,然后按数字键
再按下<F3>
,可隐藏指定编号的终端窗口。被隐藏的终端里运行的程序不会被打断。
展示当前文件撤销和重做的历史记录。历史记录可以分叉,并且可以随时将文件内容回退或前进到选定历史版本。再按一次快捷键可关闭窗口。
- 🟨本插件依赖于GNU Diffutils。大部分GNU/Linux发行版都原生安装了该工具,Windows系统可手动安装DiffUtils for Windows.
开启或关闭底部状态栏(默认开启)。状态栏可以显示当前的Vim模式与当前文件的详细信息,如行列号/文件路径/编码/当前按键等。再按一次快捷键可切换状态栏的开关状态。
仅适用于Neovim。打开代码调试器,对当前脚本或指定程序进行调试。再按一次快捷键可关闭窗口。
- 🟨本插件会调用系统中相应的代码调试工具,如
gdb(需要安装GCC)
,pdb(需要安装Python)
等,满足依赖后该插件即可调试对应的代码。
列举最近在编辑器内部复制的所有内容。输入数字或双击对应行,即可粘贴相应内容。再按一次快捷键可关闭窗口。
分析并展示当前代码文件的所有标签(指函数/变量/包含文件/宏等),依赖于外部ctags
程序。鼠标双击/键盘回车某个标签,即可跳转至标签定义位置。再按一次快捷键可关闭窗口。
- 🟨本插件需要提供
ctags
程序方可工作,ctags
可通过包管理器安装。ctags
命令一般由universal-ctags
包和exuberant-ctags
包提供,该插件同时兼容两者,但建议安装仍在更新的universal-ctags
。
快速对文件名/文件内容/标签等信息进行模糊检索。无须记住整个文件路径,只需输入文件路径和文件名的几个字母,即可交互式地进行查找。再按一次快捷键可关闭窗口。
🟨展开详细说明
基于ctrlpvim/ctrlp
插件。默认状态下为文件名查找模式,输入大致的文件路径和名称即可进行模糊查找。方向键
选择查询结果,回车键
打开选择的文件。<C-f>
和<C-b>
切换查找的类别(files文件/tags标签等)。
若要查询tags标签,需要在当前目录下提供ctags
生成的标签文件。在项目根目录下执行ctags -R .
即可生成整个项目的tags文件。
基于mileszs/ack.vim
插件。按下<F9>
后,在Vim界面下方的命令行中输入要查找的文件名称(名称的一部分也可)或“grep正则表达式”。输入完毕后按下回车键
,即可在当前工作目录下搜索指定文件。
- 🟨需要额外安装文件内容检索工具ag,才能正常使用此功能。
rg
的文件搜索接口和本插件不兼容,所以这里用效率稍逊一些的ag
。 - 🟦默认在当前工作目录下进行查找。如需查询其他目录下的内容,可在目标文件后写明搜索目录,如
:AckFile! 搜索目标 搜索目录
。
基于nvim-telescope/telescope.nvim
插件。<F9>
进入后只需输入文件路径和文件名的几个字母,即可交互式查找文件位置。
<Leader>t
表示先短促地按一下反斜杠\
(即Leader键),紧接着再短促地按一下小写的t
。
两次按键间隔要短,不然编辑器会认为这是两次不相关的输入。<Leader>ve
表示依次快速按一下反斜杠\
、小写的v
和小写的e
。按键间隔要短。F
(大写F
)表示先按住Shift
不松手,再按下小写的f
,此时输出大写的F
。<Leader>F
表示先短促地按一下反斜杠\
,紧接着再短促地按一下大写的F
(按Shift
不松手并按f
)。cY
表示先短促地按一下c
,紧接着再短促地按一下大写的Y
。
快速打开并编辑Vim/Neovim配置文件。打开的配置文件位于一个新的标签页中。
保存当前已打开的所有可写文件,并使Vim/Neovim配置马上生效。
先保存并更新配置(若配置文件有错误,忽略报错),然后安装配置文件中新列举的插件。
如果你需要引入某个新插件,可以先在配置文件的插件列表里添加你的插件信息,然后使用此快捷键下载安装对应的新插件到电脑。
先保存并更新配置(若配置文件有错误,忽略报错),然后删除配置文件中未列举的插件。
如果你不再需要某个旧插件,可以先在配置文件中删除插件列表里的对应那一行,然后使用此快捷键删除电脑上的旧插件本体。
先保存并更新配置(若配置文件有错误,忽略报错),然后更新配置文件中已列举的插件。
测量Vim/Neovim的启动时间,并列举出各环节的启动耗时。
这里往下的四个快捷键都与系统剪贴板相关,其中
cY
和cy
快捷键用起来非常方便,强烈推荐!
cY
的用法和效果类似于Vim中的yy
,用来复制Vim当前行的内容到系统剪贴板。在Vim里复制成功后,我们可以将文字内容粘贴到操作系统的其它程序中(如浏览器等)。
🟨展开详细说明
-
🟨在使用系统剪贴板相关的功能前,需要安装哪些依赖呢?
-
如果你正在使用Windows版本的gVim或Neovim——没问题!请拿好你的
cY
和cy
快捷键~
如果你的电脑上拥有PowerShell 5.1
或更高,那么你可以使用cY
、cy
、cP
和cp
全部四个快捷键,好好享受属于你的Vim时光吧! -
如果你正在某个终端模拟器中使用Vim(无论使用的是本地的Vim还是SSH远程服务器的Vim),不妨看一看这张表~
如果你使用的终端模拟器支持OSC52功能——恭喜你!你可以尽情使用cY
和cy
快捷键,不需要安装任何其它依赖!
(Windows Terminal和iTerm2都支持,但Linux上的GNOME Terminal尚未支持) -
如果你正在通过SSH连接Linux机器——请确保Linux端SSH服务器配置
/etc/ssh/sshd_config
打开了X11转发功能X11Forwarding yes
。
如果X11转发功能已经打开,我们可以在Linux上安装XSel,XSel能通过X11转发来远程控制Linux的系统剪贴板。
安装完毕后,在本地使用ssh -X ...
命令连接Linux机器(-X
表示本次连接允许X11转发),在Linux终端里打开Vim即可使用cY
、cy
、cP
和cp
全部四个快捷键~ -
如果你正在Linux系统的图形界面终端里直接使用Vim——以Ubuntu的GNOME Terminal为例,只需要安装wl-clipboard包即可使用
cY
、cy
、cP
和cp
全部四个快捷键~
-
复制Vim的指定内容到系统剪贴板,用法类似于Vim的“复制”快捷键y
:
- 如果需要复制当前行和下两行的内容,只需要依次按下
cy2j
即可。 - 如果需要复制选定区域的内容,请先使用光标或者“Visual操作”划定要复制的范围,然后依次按下
cy
即可。
获取系统剪贴板的内容,然后将其粘贴到Vim当前行的下一行。用法类似于p
。
- 🟨在Windows上粘贴非ASCII字符时,可能会粘贴为乱码。Windows系统同时使用多套不同的字符编码,所以在粘贴时可能会引起乱码。
- 🟦不建议使用此快捷键,建议通过终端模拟器自身提供的方式来粘贴内容,如
<C-S-V>
(适用于Windows Terminal、Linux GNOME Terminal等)或<S-Ins>
(适用于Git Bash、Cygwin、MSYS2等)。
获取系统剪贴板的内容,然后用其替换Vim文中的指定内容,用法类似于Vim的“删除”快捷键d
。
- 可以理解为“先删除文中的指定内容,再粘贴系统剪贴板的内容到该位置”。
- 额外的注意要点和
cP
相同。不建议使用此快捷键。
展示/隐藏空白字符,按多次可在展示/隐藏间来回切换。
进入/退出粘贴模式
。在粘贴模式
下,自动缩进和一些插件功能会自动关闭。对于Vim来说,需要从外部(如博客等)粘贴内容进入编辑器时,如果内容包含复杂的换行和缩进,建议先切换成粘贴模式
再粘贴,以避免错误激活自动缩进和插件功能。按多次可在进入/退出粘贴模式
间来回切换。
将<Tab>
的输入在空格和制表符\t
之间切换,本配置文件默认配置<Tab>
的输入为四个空格。
美化代码的指定行/块。需要外部的软件支持。
美化整个代码文件。需要外部的软件支持。
删除所有多余的空格。在行尾多余的空格会被红色高亮显示,该操作可以快速删除这些多余空格。
- 🟨在某些语言(如Markdown)的语法中,行尾空格是有实际语法意义的,这种情况下请不要轻易使用本快捷键。
检索当前光标处单词(应该会用下划线标出)在其它文件中出现的位置。
🟨展开详细说明
基于mileszs/ack.vim
插件。
- 🟨需要额外安装文件内容检索工具rg或ag,才能正常使用此功能。两者之中
rg
的效率略高于ag
。 - 🟦如果使用
rg
作为检索工具,可以进一步提高<Leader>a
与<Leader>A
的检索速度。但rg
的文件搜索接口和mileszs/ack.vim
插件不兼容,我们将无法使用该插件提供的“文件检索”功能。
在Vim完全版配置中,我们使用ctrlpvim/ctrlp
插件来完成“文件检索”,因此无需在意使用rg
带来的副作用。
基于mileszs/ack.vim
插件。
- 🟨需要额外安装文件内容检索工具ag,才能正常使用此功能。
rg
的文件搜索接口和该插件不兼容(见Vim精简版配置的<F9>
功能),所以这里我们用效率稍逊一些的ag
。
基于nvim-telescope/telescope.nvim
插件。
- 🟨需要额外安装文件内容检索工具rg,才能正常使用此功能。
检索给定单词在其它文件中出现的位置。按下此快捷键后,输入要查找的内容,会返回该内容在其它文件中出现的位置。相关该功能的依赖需求同上。
【Neovim】展示/隐藏LSP的代码诊断信息。
更多关于快捷键的信息,请见配置文件最后的hotkeys
部分。
语言服务器协议(Language Server Protocol,简称LSP)是由微软等机构,为了统一不同编辑器上各种语言的代码补全、内容跳转等功能,而提出的协议。
在过去,每个不同的编辑器(或IDE)都需要编写一套自己的业务逻辑来支持各种编程语言的代码补全、内容跳转等功能——假如市面上有m
个编辑器(或IDE),每个都要支持n
种编程语言,那就一共需要编写m*n
套业务逻辑,来实现不同编辑器上各种语言的代码补全等功能,非常麻烦。
LSP简化了这个过程,协议约定——
先有一套LSP通信协议规范,我们只需要为这n
种编程语言设计各自的语言服务器(服务器运行着针对自己语言的代码补全等算法),再为市面上的m
个编辑器(或IDE)设计它们的客户端(客户端向服务器发送代码补全的请求,然后把收到的结果展示给用户),最后让服务器和客户端按照LSP规定通信。
同样的问题,LSP的解决方案只需要编写m+n
套逻辑,统一而简洁。
Neovim提供了内置的LSP客户端,配合系统里下载好的LSP语言服务器,我们便可以在Neovim中体验到流畅的代码补全、内容跳转等功能。下面以配置Python3语言的代码自动补全等功能为例。
- 下载并安装Python3的LSP语言服务器。
通过查询LSP语言服务器列表,我们采用pylsp
程序包作为Python3的语言服务器。按照该项目的README.md
说明,使用pip进行全套工具安装。安装完毕后,终端中pylsp -V
命令应当可用。
pip install "python-lsp-server[all]"
- 在Neovim的
init.vim
配置文件中,注册pylsp
语言服务器。
在配置文件中找到Language Server Protocol (LSP) server configs
一栏,在其中的MY_LSP_SERVER_LIST
列表里向后添加一行新的语言服务器。保存后退出。
-- register your installed LSP server here
MY_LSP_SERVER_LIST = {
其它语言服务器,
"pylsp",
}
- 使用Neovim打开一个Python3代码文件,在Neovim中输入命令
:LspInfo
,此时应当显示Neovim的LSP客户端已经找到了本地的pylsp
服务器。尝试输入代码,自动补全和函数签名等功能应当自动开始工作。
按键 | 功能 |
---|---|
gD |
跳转到当前光标处词条(会用下划线标出)的声明位置。按<C-t> 跳转回去。 |
gd |
跳转到当前光标处词条的定义位置。按<C-t> 跳转回去。 |
K |
展示当前光标处词条的详细信息(如变量的类别信息/函数的签名/库的介绍等)。 |
gr |
展示当前光标处词条的所有引用。 |
gs |
展示当前光标处函数实参对应的函数形参与函数签名。 |
gi |
展示当前光标处词条的所有实现。 |
gt |
跳转到当前光标处类别的定义位置。按<C-t> 跳转回去。 |
Vim虽然没有对LSP的内建支持,但仍原生支持代码的标签跳转功能。具体操作如下:
- 先在项目代码的根目录下执行
ctags -R .
,递归生成整个项目的tags标签文件。 - 接着在项目根目录下打开项目中任何一个代码文件,在要查询定义的词条处按下
<C-]>
。 - 如果tags文件中包含了该词条的信息,此时Vim将跳转到该词条的定义处(可以跨代码文件跳转)。
- 按
<C-t>
,可回到上一次跳转前的位置。如果之前进行了多次跳转,按多次<C-t>
可以一级一级地回去。
按下快捷键呼出代码调试器后,调试器会根据当前打开文件的类型,自动选择合适的调试器。若无法自动选择,请按下数字键手动选择你想要的调试器。
若进入了gdb调试器,请先执行以下命令:
file <待调试的二进制文件路径>
,打开你要调试的二进制文件。b <函数名或断点行号>
,给代码分配断点。r
,开始调试程序,程序将在断点处停止。
执行上述命令后,界面将会自动分割为上下两个窗口,分别显示代码和gdb调试命令行。
<M-p>
表示先按住Alt
不松手,再按下小写的p
。
在开启调试器后,处于Normal
模式时,可以使用如下快捷键帮助调试。
按键 | 功能 |
---|---|
<M-r> |
开始运行或重新运行程序。 |
<M-n> |
单步跳过。 |
<M-s> |
单步进入。 |
<M-f> |
执行到当前栈帧结束。 |
<M-c> |
继续执行程序。 |
<M-t> |
光标位于代码窗口时,执行程序到当前光标所在行前停止。 |
<M-b> |
光标位于代码窗口时,给当前光标所在行打上/取消断点。 |
<M-q> |
退出调试器。 |
<M-e> |
光标位于代码窗口时,打印当前光标所在位置变量的值。 |