前言
花时间找易用的工具,不如花时间掌握强大的工具. 收集了一些自己经常使用的一些指令, 这个工具强大之处在于尽可能的按照想法去实现. 不一定是程序员才用VIM, 如此高效的工具是值得去学的. 笔记很多来自于《VIM中文手册》《Practical Vim》《VIM 7.2》。 里面摘抄部分自己经常查阅的内容, 以便于日后翻阅, 也希望能够给那些想入坑的提供些参考. 想想那时是18年开始使用的这个工具, 不觉感慨时间飞逝, 现在还不断的学习相关的知识, 发现很多神奇的操作。
如果仅仅是为了能够实现一些其他IDE的功能进而安装大量的插件, 而忽略了VIM本身, 那还是直接用其他IDE吧。现成的工具也是极其优秀的。 有的时候自己在怀疑自己,学这个有什么用….可能就是喜欢单纯的折腾吧, 毋庸置疑的是, 这个工具确实可以帮到自己提升效率, 就像屠龙刀一样, 自己并不排斥其他的编辑器, 比如vscode, 但是绝大多数的时间, 还是以vim作为自己的主力。 这个视频Mastering the Vim Language里可以学到很多东西。
定制VIM
更改字体
这个是自己在工作中遇到的问题,由于公司配的电脑使用的windows系统,在公司工作的时候用的编辑器就是GVim了,但是默认的GVIM的字体是挺小的,看起来挺吃力的。下面说明下如何更改字体。在LINUX和windows上还是有些区别。其主要的指令还是guifont
在 Linux 中,
set guifont=yourFont\ 18 |
可以把 yourFont替换成你喜欢的任意一种字体的名字,字体大小根据自己的需求更改。在Windows:
set guifont=yourFont:h18 |
修改配色方案
在默认情况下,Vim 的窗口颜色与打开它的控制台相同不仅难看,而且还很苍白。。。。为了把配色方案修改成某个系统中已有的方案,只需要执行
colorscheme mycolors |
在这个命令中,mycolors 是系统中已安装的某个配色方案的名字,自己选择的是经典的molokai主题。
除了前景色与背景色,配色方案还会影响代码高亮,错误标记,以及文件中的其他可视化标记。根据自己的需求,去选择适合自己的主题,要不就自己配。。。。
用彩色标记某列后面的文字
第一次见到这种做法的时候,是在油管的一个vim讲座里出现的,正巧在《vim 7.2》这本书看到了,举得例子都很棒,就全抄下来吧。。。。
当你在一行内写出的字符数超过某个上限时,只需要下面这个命令就可以给出提示
:match ErrorMsg /\%>73v.\+/ |
执行该命令后,一行内的第 73 个字符之后的那些字符都会被标记成错误. 匹配命令中含有一个正则表达式, 这个表达式可以拆成:
命令 | 内容 |
---|---|
\%> 匹配该列之后的内容, | 匹配该列之后的内容, 列号紧跟在尖括号的右边 |
73 | 列号 |
v | 只能工作在可见的列上面 |
.+ | 匹配一个或多个任意的字符 |
补全方式
vim 的补全命令比较多,建议使用一些插件,比如ycm
展开
ctrl+x +l 整行补全 |
组合键ctrl+n所做的工作是向前搜索匹配的单词. 如果用户知道自己刚刚才输入过同样的单词, 那么用ctrl+p会更快一点, 因为这个组合键是向后搜索匹配. 一般来说, 除非文件非常大, 或者可能的匹配非常多, 否则ctrl+n与ctrl+p对用户来说并没有太大的区别. 对于补全的插件也很多,自己用的是ycm(编译这个得看自己的环境了MBP编译了N次都是提示个莫名奇妙的错误,用macMINI一次就好了),使用起来感觉还行。
加密文件
加密文件的方式是当使用vim打或新建,加上-x参数使用以下命令,可以查看当前使用的加密算法:set cm?使用以下命令,可以切换使用的不同加密算法::set cm=zip
:set cm=blowfish
:set cm=blowfish2
使用以下命令将选项key置空,解除加密:set key=
搜索文件夹中含有的特定代码
使用vimgrep可以搜索文件夹下的文件含有特定文字/代码,方式如下
展开
vimgrep /匹配模式/[g][j] 要搜索的文件/范围 |
编写库脚本
有些功能会在多个地方调用。如果这已经不是一两行的代码,你可能会希望把这些代码放进脚本,然后被许多其它脚本使用。我们把这种脚本称为库脚本。 可以手动载入库脚本,只要你不要重复调用它就行了。用 |exists()| 函数可以判断。
if !exists('*MyLibFunction') |
这里你需要知道 MyLibFunction() 在脚本 “library/mylibscript.vim” 里定义,该脚本 在 ’runtimepath’ 的某个目录里。 为了稍稍简化,Vim 提供了自动载入机制。如下所示:
call mylib#myfunction(arg) |
下面的内容源自于书籍HACKINGVIM. 在Vim中, 与高亮相关的技术是匹配(matching).匹配通过下面这个命令完成:
:match Group /pattern/ |
比如超过一行内的11个字符以后的字符被标记为错误
:match ErrorMsg /\%>11v.\+/ |
其中\%> 匹配该列之后的内容, 列号紧跟在尖括号的右边;v 只能工作在可见的列上面;.+ 匹配一个或多个任意的字符, 想匹配有效的 IP 地址, 只需要执行:
match todo |
打开拼写检查的命令是
:set spell |
命令使用默认的语言 (英语) 打开拼写检查, 如果想要使用其他语言, 只需要把 spelllang 设置成该语言的代号即可;语言的名字甚至可以是专业名词, 比如 medical. 如果 Vim 无法识别用户输入的语言名字, 那么在执行属性设置命令时, 它就会高亮显示无法识别的语言名字.
为了避免多次输入同一个内容, 用户可以使用缩写 (abbreviations).根据不同的使用模式, 可以使用以下三个命令来创建缩写:
abbreviate: 创建在所有模式中均可使用的缩写 |
为了避免每次都执行一次缩写命令, 用户可以把它们放在 VIMHOME 的某个文件中, 假设文件名就叫 abbreviations.vim, 然后在文件 vimrc 使用命令 source 来使能该文件 (需确保该文件是可读的) :source $VIM/abbreviations.vim
比如写个编程模板(tex,等等都是可以自定义的)iabbr forx for(x=0;x<100;x++){<cr><cr>}
用寄存器实现删除,复制与粘贴操作
在技巧里面说了一小部分,但是没有系统的说明,在这里详细的补充一下。通常情况下, 在许多程序与操作系统中, 用户只能利用一个剪贴板来完成文本的剪切与复制. 在 Vim 中不会出现这种情况,因为用户可以访问多达 9 种不同的剪贴板, 更准确来说, 应该是 9 种不的寄存器类型. vim 缺省使用无名寄存器。无名寄存器用引号表示。
有些寄存器类型的工作领域有所重叠, 但还有一些则拥有自己独特的目的. 用户可以在多种不同的命令或操 作中 (比如复制, 删除, 粘贴) 使用寄存器. 寄存器的名字都以双引号 “ 开始, 比如 “x, 所以, 现在让我们来看一下 如何使用一个寄存器. 假设我们现在要用的寄存器是 “x 为了把某段文本复制到寄存器中, 可以用命令 y 来完成, 不过这次有所不同, 在复制之前, 我们先告诉 Vim 被 复制文本的存放位置: “xy (用 “xyy 可以复制一整行) 对于用来剪切文本的命令 x 也是一样的: “xx 对于删除文本的命令 d 则是: “xd 现在, 用户已经在寄存器 “x 中存放了一段文本, 并且想要把这段文本粘贴到正式文本中, 可以用命令 P (粘贴 在光标位置之前) 或 p (粘贴在光标位置之后), 但在粘贴之前, 我们要先指定寄存器: “xP 或 “xp 如果用户忘记自己使用了哪些寄存器, 可以执行命令: :registers.更多的内容可以通过网络搜索获得,这里就不加赘述了。
展开
命令 & 用途 |
展开
目的 & 操作 & 重复 & 回退 |
搜集的技巧
1,gd 快速跳转到当前光标所在变量或者函数名的定义处. gD: 跳转到全局变量的定义处,从当前文件开头开始搜索; 类似的还有gf,来打开被包含的文件。
2,:g /word/d
删除所有含有word的单词所在行. 相反的可以:v /abc/d
,也就是删除没有word这个字母所在行, 删除空行可以用 :g /^\s*$/d
, 其中^表示开头,\s 表示空格, * 代表匹配任意字符,$ 代表末尾。
3,autocmd可以用这个命令实现对不同的文件格式应用不同的配置; 可以在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件里面。
4,在打开一个文件编辑后才知道登录的用户对该文件没有写权,不能存盘, 可以执行vim file :w /tmp/1,先临时存到/tmp/1 中, 然后进行后续的操作。
5,按v键进入选择模式,然后移动光标选择你要的文本,按u转小写,按U转大写,把光标移动到 { 处.按%光标会自动跳到与之成对的 } 上面.反之也可以.把函数体折叠起来:把光标移动到函数开始的 { 处, 然后(normal mode)输入zf来创建函数折叠;在已经折叠的加号位置输入zc 来打开折叠的函数。当要把打开的函数再折叠就输入zx关闭(第二次折叠)shift+v块选以后,输入zf——实现块折叠. [z 到当前打开的折叠的开始处。 zj 向下移动。到达下一个折疊的开始处。关闭的折疊也被计入. 删除折叠可以用zd或zD,一个用于删除光标下的折叠,另外一个是用于删除嵌套用的。
6,按 Ctrl + r 最后按 Ctrl + w。这个在光标下的单词会被拷贝, 这就省的在输入或是在查找一个单词的时候自己手动输入啦。
7,在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式可用如下指令:set fileencoding=utf-8.
8,\>
是一个特殊的记号,表示只匹配单词末尾.类似地,\<
只匹配单词的开头.所以要匹配一个完整的单词 “int”,只需:/\< int\>
9, 对同一个文件夹下的文件批量处理方法,以.m文件为例(因为有的时候,需要转换文件编码方式),:args ./\*.m ; :argdo set fileencoding=utf-8
(之所以写这个,是因为小董问我要代码,而自己电脑里的编码方式又和windows不一样,自己又懒,文件一多就不想让每个都转化格式,所以就…..)
10,可以用 = 符号指明使用表达式寄存器.在插入模式中,输入
11,替换目标字符串前加一个\<,它就会匹配一个word的起始位置,>可以用来指示一个word的结束位置。
12,:write !wc 统计字数;J 命令则用来把当前行和下一行连接在一起.”yas” 命令拷贝一个句子。
13,宏的录制,在Normal模式下先按q,录制的符号可以在[a-z]中选择(假设这里选择了a),就像标记m那样,一系列胡乱操作后,在Normal模式下按q停止,想重复录制的内容,按下@a就行,喜欢重复的又不想连续按@a的可以输入.
,来重复上一过程。
14,在当前行正好处于窗口顶部或底部时,有时我会滚动一下屏幕,以便看到更多的上下文.用 zz (用智障记忆,很快的…)命令可以重绘屏幕,并把当前行显示在窗口正中,这样就能够阅读当前行之上及之下的半屏内容。
15,:Sex 水平分割一个窗口,浏览文件系统; :Vex 垂直分割一个窗口,浏览文件系统;(安装了插件后,就没用过这个功能了),有必要补充一句,如果在mac中,感觉分割窗口并不是必须的,如果屏幕比较小,看起来挺难受的,ctrl+N, 这样就另开了一个命令行,然后通过触摸板,用手势即可切换,长时间的编辑,有的时候受不了那种强度,所以换换口味也挺好。
16,m{a-z}: 标记光标所在位置,局部标记,只用于当前文件.m{A-Z}: 标记光标所在位置,全局标记.标记之后,退出Vim, 重新启动,标记仍然有效.:marks 显示所有标记. :delmarks! 删除当前缓冲区的所有标记。
17,''
: 移动到上次离开的地方。
18,%: 不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃。
19,:r !date 在光标处插入当前日期与时间.同理,:r !command可以将其它shell命令的输出插入当前文档。
20,w: 移到下一个单词的首字母; b: 移到前一个单词的首字母;e: 移到单词的末尾;这些命令可以互相组合, 比如, 用户想要移到下一个单词的末尾, 只需要执行we。
21,所有类型的变量都是通过命令 :let 定义。 置位 ruler
选项.这会在 Vim 窗口的右下角显示当前光标的位置。
22,自动缩进的一种简洁形式gg=G。
23,Vim 有一套功能非常强大的命令,可以完成所有功能。但有些东西外部命令能够完成得更好或者更快。命令 “!{motion}{program}” 用一个外部程序对一个文本块进行过滤。换句话说,它用一个文本块作为输入,执行一个由{program}指定的外部命令,然后用该程序的输出替代选中的文本块。
24,在插入模式,当我们按下
25,如果厌倦了使用ESC,
26,>>
当前行增加缩进 <<
当前行减少缩进, 个人比较喜欢在可视模式中使用这个。
27,set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格) set expandtab
28,G 命令会增加从当前行到文档末尾处的缩进层级。
29,gv 命令是个有用的快捷键,它用来重选上一次由可视模式所选择的文本范围。不管上个选区是面向字符的、面向行的,或是面向列块的,g 命令都能够正确地工作。不过如果上次的选区被删除了,它也许会工作得不太正常.
30,o:切换高亮选区的活动端(可视模式下)。
31,it 命令是一种被称为文本对象。
32,ctrl+w+s 可以水平切分此窗口,类似的,ctrl+w+s 可以进行垂直切分,且不受次数限制(用了这么久才知道T_T 该死的vsplit),ctrl+w可以切换这两个窗口。
33,命令模式下 按g 再按 Ctrl+g 可以统计字数。
34,only 命令关闭除活动窗口外的所有其他窗口。
35,要想跳到上次文档中被更改过的地方,我们可以按 g;。它会跳到上次完成编辑时光标所在的行及列上,其结果与按 u
36,每次用 gf 命令时,vim 都会在跳转列表中增添一条记录,因此可以用Ctrl+o 命令返回原处。
37, vim -d file1 file2
的时候,如果感觉左或者右边的窗口太小,可通过命令 vertical res +20
, 来改变窗口大小。
38,文本倒序: :g /^/m0
。
下面是问chatGPT给我的一些技巧,有些还挺实用的
39, 插入模式下,按 Ctrl
+ h
可以删除前一个字符,按 Ctrl
+ w
可以删除前一个单词,按 Ctrl
+ u
可以删除整行。
40, 在普通模式下,按 i
进入插入模式,按 a
在光标后插入,按 o
在下一行插入,按 O
在上一行插入。
41, 在普通模式下,按 x
删除当前光标所在的字符,按 dw
删除当前光标所在的单词,按 dd
删除当前光标所在的整行。
42, 在普通模式下,按 yy
复制当前光标所在的整行,按 p
将剪贴板中的内容粘贴到当前光标所在的位置。
43, 在普通模式下,按 Ctrl
+ f
可以向下翻页,按 Ctrl
+ b
可以向上翻页。
44, 在普通模式下,按 gg
跳到文件的第一行,按 G
跳到文件的最后一行。
45, 在普通模式下,按 :w
可以保存文件,按 :q
可以退出 Vim,按 :wq
可以保存并退出 Vim。
46, 在普通模式下,按 u
可以撤销上一步操作,按 Ctrl
+ r
可以重做上一步操作。
47, 在普通模式下,按 .
可以重复上一次操作。
48,在普通模式下,按 %
可以匹配括号(包括圆括号、方括号和花括号),并跳转到匹配的括号处。
49, 在普通模式下,按 *
可以匹配当前光标所在的单词,并向下跳转到下一次出现该单词的位置,按 #
则是向上跳转到上一次出现该单词的位置。
50, 在普通模式下,按 :set nu
可以显示行号,按 :set nonu
可以隐藏行号。
51, 在普通模式下,按 :set paste
可以开启粘贴模式,使得从外部复制内容时可以避免自动缩进等问题,按 :set nopaste
可以关闭粘贴模式。
52, 在普通模式下,按 :set incsearch
可以开启增量搜索,使得在搜索时可以实时匹配输入的字符,按 :set noincsearch
可以关闭增量搜索
53, 在普通模式下,按 :set hlsearch
可以开启搜索高亮,使得在搜索时匹配到的内容会被高亮显示,按 :set nohlsearch
可以关闭搜索高亮。
54, 在普通模式下,按 Ctrl
+ g
可以显示当前文件的信息,包括文件名、文件类型、文件行数等。
55, 在普通模式下,按 :tabnew
可以新建一个标签页,按 gt
可以切换到下一个标签页,按 gT
可以切换到上一个标签页。
56, 在普通模式下,按 :vsp
可以在垂直方向上分割窗口,按 Ctrl
+ w
+ w
可以在窗口之间切换,按 :q
可以关闭当前窗口
57,在普通模式下,按 :r !date
可以将当前时间插入到当前光标所在行的下一行。
58,在普通模式下,按 :g/foo/d
可以删除所有包含字符串 foo
的行。
参考
[1] 《VIM中文手册》
[2] 《Practical Vim》
[3] 《VIM 7.2》