vim
本文最后更新于:2025年7月24日 凌晨
vim
插件
1 | |
Plugin 'ycm-core/YouCompleteMe'
YouCompleteMe unavailable: requires Vim 9.1.0016+.
这个错误提示vim 版本太低,需要安装Vim 9.1.0016+.
YouCompleteMe unavailable: requires Vim compiled with Python (3.8.0+) support.
这个错误提示表明 YouCompleteMe (YCM) 插件无法加载,原因是当前 Vim 没有 Python 3.8+ 的支持,即使你的系统 Python 版本满足要求(3.11.2)。以下是解决方案:
检查 Vim 的 Python 支持
在终端运行:
1 | |
- 如果有
+python3:说明 Vim 支持 Python 3,但可能版本不匹配。 - 如果是
-python3:说明 Vim 完全没有编译 Python 3 支持。
推荐使用下方的解决方法 3。
解决方法 1
- 下载vim源码,编译支持python3的版本:
1 | |
- 进入 Vim 源码目录:
1 | |
解决方法 2
在debian12可以通过 debian testing 源安装支持python3且vim版本高于9.1.0016的vim:
将 debian testing 源加入 /etc/apt/sources.list 中: 1
2
3
4
5
6
7
8
9
10
11
12
13# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ testing main contrib non-free non-free-firmware
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ testing main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ testing-updates main contrib non-free non-free-firmware
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ testing-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ testing-backports main contrib non-free non-free-firmware
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ testing-backports main contrib non-free non-free-firmware
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security testing-security main contrib non-free non-free-firmware
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security testing-security main contrib non-free non-free-firmware
1 | |
解决方法 3
在debian12可以通过安装vim-nox包来解决:
1 | |
1 | |
从 GitHub 克隆 YouCompleteMe 插件的特定分支(legacy-vim-8.2)到本地 ~/.vim/bundle/YouCompleteMe目录:
1 | |
Vim 配置:在 ~/.vimrc中添加启用代码:
1 | |
编译 YCM:
1 | |
参考下方链接安装编译依赖:
1 | |
1 | |
快速执行上一条命令
@::在普通模式下,重复上一条 Ex 命令。命令行模式:在
:命令行模式下,按↑查看和执行上一条命令。@@:在普通模式下,重复上一个宏。.命令:- 作用:在普通模式下,重复最后一次普通模式命令或插入模式操作。
- 示例:
- 删除多行:
dd(删除当前行),然后按.继续删除下一行。 - 插入文本:
iHello<ESC>(插入文本并返回普通模式),然后按j.重复插入。 - 替换字符:
rA(替换字符),然后按.重复替换下一个字符。
- 删除多行:
多窗口
跳转翻页
跳转到指定行
- 直接输入行号:在命令模式下直接输入行号即可跳转到该行,例如输入
500跳转到第 500 行。 :行号:跳转到指定行,例如:101跳转到第 101 行。
翻页操作
Ctrl+f:向下翻一整页。Ctrl+b:向上翻一整页。Ctrl+d:向下翻半页。Ctrl+u:向上翻半页。
滚动操作
Ctrl+e:向下滚动一行。Ctrl+y:向上滚动一行。
位置跳转
n%:跳转到文件的 n% 位置,例如50%跳转到文件中间。
屏幕显示调整
zz:将当前行移动到屏幕中央。zt:将当前行移动到屏幕顶端。zb:将当前行移动到屏幕底端。
这些命令可以帮助你更有效地在 Vim 中导航和调整视图,适用于快速查找和定位代码或文本。
多行操作
win11 wsl2 ctrl+v冲突
在 Windows 11 下使用 Vim,如果在 Normal 模式下按
Ctrl + v 被系统拦截为“粘贴”操作,而不是进入 Vim
的视觉块模式(Visual Block Mode),这是因为终端或系统默认将
Ctrl + v 绑定为粘贴快捷键,覆盖了 Vim 的功能。
- 在 Normal 模式下,按
Ctrl + q代替Ctrl + v,功能完全相同。
移动
以下是 Vim 中与光标移动相关的常用命令的总结:
w:将光标移动到下一个单词的开头(以空格或标点符号为分隔符)。W:将光标移动到下一个以空格为分隔符的单词的开头。b:将光标移动到当前单词的开头,或者到前一个单词的开头(以空格或标点符号为分隔符)。B:将光标移动到当前以空格为分隔符的单词的开头,或者到前一个以空格为分隔符的单词的开头。e:将光标移动到当前单词的末尾(以空格或标点符号为分隔符)。E:将光标移动到当前以空格为分隔符的单词的末尾。f+ 字符: 将光标向右移动到指定字符的位置。- 按下
;键,将光标跳转到下一个相同的字符处。 - 按下
,键,将光标跳转到上一个相同的字符处。
- 按下
F+ 字符: 将光标向左移动到指定字符的位置。t+ 字符: 将光标向右移动到指定字符的前一个位置。T+ 字符: 将光标向左移动到指定字符的前一个位置。n+G: 将光标移动到第n行。%: 匹配括号定位:将光标置于某个括号上时,按下%键,Vim 将会跳转到配对的对应括号上。
这些命令可以帮助你在 Vim 中高效地移动光标,进行文本编辑。
wrap
在 Vim 中,set nowrap
是用来禁用自动换行的设置。默认情况下,当一行的内容超出屏幕宽度时,Vim
会自动将其换行显示。如果你使用
set nowrap,那么长行文本将会被水平滚动,而不是换行。
这意味着:
set nowrap:禁用换行,文本行如果超出屏幕宽度,则需要水平滚动才能查看。set wrap(默认):启用换行,当一行文本超出屏幕宽度时,自动换行到下一行显示。
通常,如果你处理的是长代码行或长文本行,set nowrap
可以帮助避免换行带来的视觉干扰。
非常对!你补充的这些命令是 Vim 在 set nowrap
生效时进行水平滚动的常用快捷键,下面是详细说明,便于你使用和记忆:
✅
基本的水平滚动命令(在 set nowrap 时使用)
| 命令 | 含义 |
|---|---|
zh |
向右滚动1个字符(视图窗口内容向右平移,显示更多左边的内容) |
zl |
向左滚动1个字符(显示更多右边的内容) |
zH |
向右滚动半个屏幕宽度 |
zL |
向左滚动半个屏幕宽度 |
Nzl |
向左滚动N 个字符 |
Nzh |
向右滚动N 个字符 |
NzL |
向左滚动N × 半屏宽 |
NzH |
向右滚动N × 半屏宽 |
🔄 示例
10zl:向左滚动 10 个字符2zL:向左滚动一个完整屏幕(因为是 2 × 半屏)5zh:向右滚动 5 个字符zH:相当于“向右快速看一下前面的内容”zL:相当于“向左快速跳到行的后面部分”
删除
D:删除到行尾,相当于d$d+G:删除到文档尾(包括当前行)d+g+g:删除到文档头(包括当前行)d+0:删除从光标前一个字符到行首n+x:向右删除n个 不包括光标所在n+X:向左删除n个 不包括光标所在d+w:当光标在一个单词首时,删除一个单词,不在单词首是,从光标开始删除至单词结尾。不进入插入模式d+a+w:删除一个单词(包括空白字符),光标在单词内部时,不进入插入模式
复制和移动行
:t 命令(复制行)
- 语法:
:[range]t[target] - 示例:
- 复制当前行到第 10 行后:
:t10 - 复制第 3 行到第 10 行后:
:3t10 - 复制第 1 到第 3 行到第 10 行后:
:1,3t10
- 复制当前行到第 10 行后:
:m 命令(移动行)
- 语法:
:[range]m[ove] [target] - 示例:
- 移动当前行到第 10 行后:
:m10 - 移动第 3 行到第 10 行后:
:3m10 - 移动第 1 到第 3 行到第 10 行后:
:1,3m10
- 移动当前行到第 10 行后:
实用技巧
- 复制当前行到文件末尾:
:t$ - 移动当前行到文件末尾:
:m$
查找替换
(命令模式)搜索和替换
命令模式下(esc退出插入模式):
1 | |
快速选择单词并按其查找
- 将光标移动到单词的任意字母上,按
*键向下查找并高亮显示该单词的所有匹配项,按n键跳转到下一个匹配项,N键跳转到上一个匹配项。 #键功能类似*键但向上查找。- 按
g+d键可高亮显示单词,然后按n键查找。 - 对于前后无空白字符或标点的单词,可用
g*键查找,包含单词字符序列的内容都会被匹配。
返回终端
忽略大小写
显示不可见字符
在~/.vimrc 中加入可永久开启: 1
2set list
set listchars=tab:»·,trail:·,extends:>,precedes:<,nbsp:␣
鼠标模式
sudo保存文件
-
1
:w !sudo tee % > /dev/null
格式化与缩进
格式化命令
- 格式化整个文件(在正常模式下):
ggVG=:跳转到文件开头,选中整个文件,并应用格式化。
- 格式化选定范围(在可视模式下):
shfit + v进入行可视模式后,使用方向键选择需要格式化的行,然后按=进行格式化。
- 格式化指定行范围(在正常模式下):
nG=mG:格式化从第n行到第m行,例如5G=10G格式化第 5 行到第 10 行。
缩进命令
- 增加缩进:
>:在正常模式下,按>后需要按Enter来增加当前行的缩进。>>:在正常模式下,直接增加当前行的缩进(无需按Enter)。增加多行缩进:
- 进入行可视模式:按
shift + v。 - 扩展选定范围:使用方向键选择多行。
- 增加缩进:按
>。
- 进入行可视模式:按
- 减少缩进:
<:在正常模式下,按<后需要按Enter来减少当前行的缩进。<<:在正常模式下,直接减少当前行的缩进(无需按Enter)。减少多行缩进:
- 进入行可视模式:按
shift + v。 - 扩展选定范围:使用方向键选择多行。
- 减少缩进:按
<。
- 进入行可视模式:按
折叠
在 Vim 中如何使用缩进折叠的方法:
- 开启缩进折叠:
- 在 Vim 的配置文件中添加
set foldmethod=indent - 这样 Vim 就会根据代码的缩进深浅自动进行折叠
- 在 Vim 的配置文件中添加
- 控制折叠深度:
- 使用
set foldlevel=n命令来设置初始的折叠深度 n表示只会折叠缩进深度小于等于n的代码块- 例如
set foldlevel=2表示只会折叠缩进深度小于等于 2 的代码块
- 使用
- 常用的折叠控制命令(按下Esc进入普通模式执行下方命令):
za: 打开/关闭当前折叠zo: 打开当前折叠zc: 关闭当前折叠zR: 打开所有折叠zM: 关闭所有折叠
- 一些技巧:
- 可以在编辑时使用
>>和<<命令来增加或减少代码缩进,这样会相应地创建或删除折叠 - 可以设置
foldnestmax来限制最大折叠深度,避免过度折叠 - 可以设置
foldcolumn来显示折叠状态的列,方便查看
- 可以在编辑时使用
跳转
Vim 跳转相关快捷键及其配合使用:
Ctrl + ]:跳转到光标下符号的定义处。- 常用场景:当你在代码中看到一个函数或变量名,使用
Ctrl + ]可以快速跳转到其定义位置。
- 常用场景:当你在代码中看到一个函数或变量名,使用
Ctrl + t:返回到上一个跳转位置。- 配合使用:如果你用
Ctrl + ]跳转到定义处之后想返回到跳转前的位置,就可以使用Ctrl + t。
- 配合使用:如果你用
Ctrl + o:后退到上一个跳转位置。- 常用场景:当你在文件中多次跳转(例如通过搜索、跳转到定义等),使用
Ctrl + o可以依次返回之前的跳转位置。 - 配合使用:这个命令适合在你连续进行了多次跳转后,想要逐步回顾之前的位置时使用。
- 常用场景:当你在文件中多次跳转(例如通过搜索、跳转到定义等),使用
Ctrl + i:前进到下一个跳转位置。- 常用场景:在使用
Ctrl + o后,如果你想再跳回到之前的某个位置,可以使用Ctrl + i向前移动。 - 配合使用:
Ctrl + i和Ctrl + o是配对使用的,Ctrl + o用于回退,Ctrl + i用于前进,帮助你在跳转历史中自由导航。
- 常用场景:在使用
:jumps:列出跳转历史。- 常用场景:当你不确定自己跳转过哪些位置,或想查看完整的跳转路径时,可以使用
:jumps来显示跳转历史列表。
- 常用场景:当你不确定自己跳转过哪些位置,或想查看完整的跳转路径时,可以使用
使用示例:
- 你在代码中使用
Ctrl + ]跳转到一个函数的定义。 - 查看完定义后,想返回之前的位置,按
Ctrl + t。 - 你继续编辑文件,并多次跳转(例如使用搜索或其他跳转命令)。
- 需要逐步回顾之前的位置时,按
Ctrl + o逐步后退。 - 如果后退过头,按
Ctrl + i前进到下一个跳转位置。
通过这些命令的配合,你可以高效地在代码中导航、跳转和回溯,提高编辑效率。
#ifdef
- 跳转到匹配的
#else或#endif%:在#ifdef、#else、#endif之间跳转,返回到匹配项。
- 返回到
#ifdef或#if的开始处[#:跳转到上一个#ifdef或#if块的开始(如果光标在块内)。
- 跳转到下一个
#else或#endif]#:跳转到下一个#else或#endif,跳过中间的#ifdef或#if块。
例子说明
- 如果光标在
#ifdef处,按%会跳转到对应的#else。 - 继续按
%会跳转到#endif,再按一次%会回到原来的#ifdef。 - 在一个
#ifdef-#endif块内的某个位置,按[#会移动到对应的#ifdef或#if。 - 按
]#会跳转到下一个#else或#endif,并跳过当前块。
注意事项
- 如果光标不在
#if或#ifdef的后面位置,按[#时 Vim 会鸣音(发出错误提示)。 - 确保 Vim 的文件类型检测正确,以便它能够正确识别 C/C++ 代码中的这些预处理指令。
函数跳转
回到函数开头
- 使用
[{命令:- 将光标放在函数体的任意位置,然后输入
[{。这个命令会将光标移动到当前函数的开头。
- 将光标放在函数体的任意位置,然后输入
回到函数结尾
- 使用
]}命令:- 将光标放在函数体的任意位置,然后输入
]}。这个命令会将光标移动到当前函数的开头。
- 将光标放在函数体的任意位置,然后输入
cscope
先在源码目录中生成索引数据:
1 | |
Vim 中 cscope 相关的 Ctrl 快捷键:
Ctrl + \系列快捷键:Ctrl + \s: 查找C语言符号,等同于normal模式下的:cs f s <symbol>Ctrl + \g: 查找函数、宏、枚举等定义的位置,等同于normal模式下的:cs f g <symbol>Ctrl + \d: 查找本函数调用的函数,等同于normal模式下的:cs f d <symbol>Ctrl + \c: 查找调用本函数的函数,等同于normal模式下的:cs f c <symbol>Ctrl + \t: 查找指定的文本字符串,等同于normal模式下的:cs f t <string>Ctrl + \e: 查找egrep模式,等同于normal模式下的:cs f e <pattern>Ctrl + \f: 查找并打开指定的文件,等同于normal模式下的:cs f f <filename>Ctrl + \i: 查找包含本文件的文件,等同于normal模式下的:cs f i <filename>
- 其他 cscope 快捷键:
Ctrl + ]: 跳转到光标下符号的定义处Ctrl + T: 返回上一个位置
buffers
在 Vim 中,查看和管理 buffers 的常用简写命令如下:
:lsor:buffers- 列出所有已打开的 buffers。:b <buffer_number>- 切换到指定的 buffer。例如:b 2切换到 buffer 2。:bn- 切换到下一个 buffer。:bp- 切换到上一个 buffer。:bd- 关闭当前 buffer。:bd <buffer_number>- 关闭指定的 buffer。:bufdo <command>- 对所有打开的 buffers 执行指定的命令。例如:bufdo w保存所有 buffers。
这些是使用 Vim 处理 buffers 时最常用的简写命令。如果您需要更多关于 Vim buffers 的信息,欢迎随时询问我。
Quickfix
Vim 中使用 Quickfix 窗口的常用快捷键简写:
:copen- 打开 Quickfix 窗口- 命令模式下执行
:TlistToggle关闭函数及变量列表,不关闭会影响Quickfix 窗口聚焦。 - 当窗口聚焦时,您可以使用 j 或 k 来高亮显示下一个或上一个列表项,使用 enter 将光标移动到高亮显示的文件上和位置上。
- 命令模式下执行
:ccl- 关闭 Quickfix 窗口,是:cclose命令的简写形式:cl- 列出所有 Quickfix 条目,是:clist命令的简写形式,进入选择列表后d向下翻页,u向上翻页:cc [nr]- 跳转到指定编号的 Quickfix 条目:cn- 跳转到下一个 Quickfix 条目,是:cnext命令的简写形式:cp- 跳转到上一个 Quickfix 条目,是:cprev命令的简写形式:cfirst- 跳转到第一个 Quickfix 条目:clast- 跳转到最后一个 Quickfix 条目
在 Quickfix 中查找关键字
:clist 命令列出所有 Quickfix
条目后,可以使用:filter /keyword/ clist进行过滤,支持正则表达式,如::filter /x86\|NUMA\|NODE/ clist。
导航旧Quickfix
Vim 在每个会话中保留多达 10 个快速修复列表,在每个窗口中保留 10 个位置列表。
cscope、grep等都可以创建新的快速修复列表。
如vim -t start_kernel打开init/main.c后,在命令行模式下执行:
1 | |
可以创建一个新的Quickfix。
:col- 切换到较早的 Quickfix 列表,是:colder命令的简写形式:cnew- 切换到较新的 Quickfix 列表,是:cnewer命令的简写形式:cdo <command>- 对所有 Quickfix 条目执行指定命令
位置列表
如vim -t start_kernel打开init/main.c后,在命令行模式下执行:
1 | |
可以创建一个新的位置列表。
导航位置列表的一些命令:
:lopen- 打开位置列表窗口。:lcl或:lclose- 关闭位置列表窗口。:lnext- 跳到列表的下一项。:lprev- 跳到列表的前一项。:lfirst- 跳到列表的第一项。:llast- 跳到列表的最后一项。ll [n]- 跳到第 n 项。
位置命令与它们的快速修复列表几乎完全相同,除了c 被替换成 l 。
NERDTree
以下是 Vim 的 NERDTree 插件中常用的快捷键总结:
NERDTree 是 Vim 的一个插件,用于在 Vim
中管理和浏览文件和目录。以下是一些常用的 NERDTree
命令和操作:
基本命令
:NERDTree:打开或关闭NERDTree窗口。:NERDTreeToggle:切换NERDTree窗口的显示或隐藏状态(如果打开则关闭,关闭则打开)。:NERDTreeFocus:将焦点切换到已经打开的NERDTree窗口。:NERDTreeFind:定位NERDTree到当前正在编辑的文件,并将焦点移动到该文件上。
基本导航
o: 打开/关闭选中文件或目录。Enter: 打开文件,或者进入目录。s: 水平分割窗口并打开选中的文件。i: 垂直分割窗口并打开选中的文件。t: 在新标签页中打开选中的文件。p: 转到当前节点的父目录。
文件与目录操作
m: 打开文件操作菜单,可以选择创建、删除、重命名文件或目录。a: 添加文件或目录。d: 删除选中的文件或目录。r: 重命名文件或目录。
切换视图
I: 切换显示隐藏文件(以.开头的文件)。C: 将当前目录设置为 NERDTree 的根目录。u: 返回到上一级目录。R: 刷新目录树。
帮助与其他
?: 打开 NERDTree 的帮助文档。q: 关闭 NERDTree 窗口。
这些快捷键可以帮助你更高效地在 NERDTree 中进行文件和目录的导航和操作。
vim 配色方案
在 .vimrc 中设置配色方案如下:
1 | |
在 tmux 中会遇到配色方案不生效的问题,这通常是因为终端不支持 256 色或更高的颜色深度。
在 ~/.bashrc 或 ~/.zshrc 中添加以下配置后,终端颜色才生效:
1 | |
重新加载配置文件使其生效: 1
source ~/.bashrc
一般重新加载配置文件后 tmux 中的 vim 配色方案会生效,但有时仍然会遇到问题。
在tmux中,即使设置了256色或更高的颜色深度,Vim 的配色方案仍然可能不生效,需要在 ~/.tmux.conf 中添加以下配置:
1 | |