文章目录
Vim的风格
-
vim会记住我们的操作,并使最常用的操作触手可及,所以可以很方便地重复执行它们;
-
当vim让一个操作或移动可以很方便地重复时,它总是会提供某种方式,让我们在不小心做过头时能回退回来;
- 对.命令而言,我们永远可以按u 键撤销上次的修改;
- 如果在使用f{char}命令后,不小心按了太多次;键,可以再按,键调回去,这个命令会反方向查找上次f{char}所查找的字符;
-
vim会把我们离开插入模式之前的全部按键操作都记录下来,因此整个cwcopy会被当成一个修改。
-
“.范式”:用一次按键移动,另一次按键执行。
-
大多数普通模式命令可以在执行时指定次数,可以利用这个功能来做简单的算术运算。
-
很多普通模式命令都可以带一个次数前缀,这样vim就会尝试把该命令执行指定的次数,而不是只执行一次。
-
执行、重复、回退;
-
操作符 + 动作命令(motion) = 操作
操作符的作用范围由动作命令决定。
命令 用途 c 修改 d 删除 y 复制到寄存器 g~ 反转大小写 gu 转换为大写 > 增加缩进 < 减小缩进 = 自动缩进 ! 使用外部程序过滤{motion}所跨越的行 -
当一个操作符命令被连续调用两次时,它会作用于当前行:
- dd:删除当前行
- >>:缩进当前行
- gUgU或gUU
-
符号%代表当前文件名
基本操作
四种模式切换
-
光标移动:
上下左右hjkl
面向单词的动作命令:w、b、e(跳到下个单词的末尾)、ge(调到前一个单词的末尾)
单词跳转wWbB(w:单词间跳转;W:子串间跳转,子串是以空格来区分的)
f {char}:对字符进行查找,使用;结合使用,使用,进行回退。
句跳转()
段跳转{}
[[、]]:跳转到上或下个函数
跳到句子开头home/^和结尾end/$
调到文档开头gg和结尾G
数字G:跳到对应数字行号
数字|:调到对应数字的列好
翻页: 和 、 和
翻半页: 和 ,Up 和 Down
移动光标到屏幕的顶部、中间和底部:用 H(High)、M(Middle)和 L(Low)
把当前行“滚动”到屏幕的顶部、中部或底部。Vim 里的对应按键是 zt、zz 和 zb
滚动屏幕而不移动光标。需要的按键是 和
-
进入插入模式的方式:iIaAoO
-
剪切:d组合/c组合、撤销:uU、保存:S、
-
退出:q(quit)、ZZ/wq:存盘退出、:w(writ):存盘
-
重复.
-
删除:x(删除当前光标所在的位置)、X(删除光标前面的字符)
-
粘贴:p(put)
- p:粘贴在光标的后面
- P:粘贴在光标的前面
- ctrl+insert
-
文本复制:y(yank)
- 复制整行:yy、D
- 复制对应方向的内容:y数量和方向
- 文本对象选择:y、i、a、w、W、‘’、“”、()、[]、{}
- 多层对象操作:在a和i前加上数字
-
文本修改:d(delete)/c(cut)
- 删除一个字符:dl
- 删除一个完整的单词:daw
- 删除光标到单词结尾:dw
- 删除一整个段落:dap
- 删除整行dd
- 删除到行尾D
- 删除对应方向的内容dn方向
- 文本对象选择:d/c、i、a、w、‘’、“”、()、[]、{}
- 多层对象操作:在a和i前加上数字
-
多文件打开
-
:edit:能以文件路径打开任何文件
-
缩进层级:
>G
增加从当前行到文档末尾出的缩进层级
-
;:重复上次命令
-
s:把两个操作合并为一个,它先删除光标下的字符,然后进入插入模式。
-
替换:😒/target/replacement
-
转为大写:gU
- gUaw:把当前单词转换成大写形式
- gUap:把整段文字转换为大写
-
:version
vim的文本对象:i、a
一般以i(inside)开头的文本对象会选择分隔符内部的文本,而以a(around、all)开头的文本对象会选择包括分隔符在内的整个文本。
-
分隔符文本对象
-
范围文本对象:
一般来说,d{motion} 命令和aw、as和ap配合起来使用比较好,而c{motion}命令和iw及类似的文本对象一起用效果会更好。
文本对象 | 选择范围 |
---|---|
iw | 当前单词 |
aw | 当前单词及一个空格 |
iW | 当前字串 |
aW | 当前字串及一个空格 |
is | 当前句子 |
as | 当前句子及一个空格 |
ip | 当前段落 |
ap | 当前段落及一个空行 |
查找项
-
搜索:/?(向上下查找:-=)
-
*:查找当前光标下的单词
-
寻找字符:f(find)/t(till)、F/T
f{char}:让vim查找下一处指定字符出现的位置,如果找到了,就直接把光标移动到那里。
fa:查找光标后面最靠近光标的a;然后使用;符号可以重复之前的操作。
命令行模式
可以使用:h xxx 来查看每个命令的说明文档。
- :colors Tab:选择相应的主题
- :help Tab:查看帮助文件
- :set autowrite,告诉 Vim 在切换文件时自动存盘;
vim脚本
- vim包管理器的安装和使用?
- 插件的查找、安装和使用?
- vim的运行支持文件
视频教学
键盘录制
qa:
.vimrc
- set
- number:设置行号
- cursorline:设置横线
- wrap:内容不超过边框,自动换行
- showcmd:显示输入的命令
- wildmenu:按Tab查找补全
- ignorecase:忽略大小写
- smartcase:适应大小写
- noremap:键位的更改
- map:映射
- exec:执行命令
- exec “nohlsearch”:每次打开文件执行命令去掉高亮
分屏:
- sp{split}
- vs
- 向右分屏:
map sr :set splitright<CR>:vsplit<CR>
- 向左分屏:
map sl :set nosplitright<CR>:vsplit<CR>
- 向上分屏:
map su :set nosplitbelow<CR>:split<CR>
- 向下分屏:
map sd :set splitbelow<CR>:split<CR>
- 打开其他文件:
:e(edit) PATH
- :res +5
- :res -5
- :vertical resize-5
- :vertical resize+5
标签页
- map tu :tabe
- map tn :-tabnext
- map ti :+tabnext
将键盘的Esc和CapsLock大写锁定互换
-
将
/etc/default/keyboard
中的XKBOPTIONS
设置为caps:swapecape
,结果如下:# KEYBOARD CONFIGURATION FILE # Consult the keyboard(5) manual page. XKBMODEL="pc105" XKBLAYOUT="cn" XKBVARIANT="" XKBOPTIONS="caps:swapescape" BACKSPACE="guess"
-
执行配置:
sudo dpkg-reconfigure keyboard-configuration
-
接下来会出来一个让你选择键盘类型的界面,一般一路确认就可以了,可以看一下信息,比方说我的键盘是pc105,所以我选择105的选项。
原理
-
减少无关的移动
a命令是在当前光标之后添加内容,A命令则是在当前行的结尾添加内容。不管光标当前处于什么位置,输入A都会进入插入模式,并把光标移到行尾。换句话说,它把$a封装成了一个按键操作。
在每行后面添加;符号: $:将光标移动到行尾 a:在光标之后添加内容 ; A:封装$a A; k:向下移动一行 k.:在下一行重复上一次的动作
-
复合命令
复合命令 等效的长命令 C c$ I ^i A $a o A O jo -
使修改可重复(充分发挥.命令的最大威力) - 在一个字符前后各添加一个空格
var foo = "method+alkdj+ladkl+kdlakdjf+dkal" f+:将光标移动到第一个+符号 s␣+␣<Esc>:删除光标下的字符,进入插入模式,先输入␣+␣,然后退出插入模式 ; .
-
使移动可重复
f+命令跳到下一个+号所在的位置。 ;命令会重复查找上次f命令所查找的字符;
-
执行、重复、回退
目的 操作 重复 回退 做出一个修改 {edit} . u 在行内查找下一指定字符 f{char}/t{char} ; , 在行内查找上一指定字符 F{char}/T{char} ; , 在文档中查找下一处匹配项 /pattern n N 在文档中查找上一处匹配项 ?pattern n N 执行替换 😒/target/replacement & u 执行一系列修改 qx{changes}q @x u -
把撤销单元切成快
在vim中,我们自己可以控制撤销命令的粒度。从进入插入模式开始,直到返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改。因此,只要控制好对键的使用,就可使撤销命令作用于单词、句子或段落。
-
用次数做简单的算术运算
- 大多数普通模式命令可以在执行时指定次数,可以利用这个功能来做简单的算术运算。
- 很多普通模式命令都可以带一个次数前缀,这样vim就会尝试把该命令执行指定的次数,而不是只执行一次。
-
普通模式
程序员通常只花一小部分时间编写代码,绝大多数时间用来思考、阅读,以及在代码中穿梭浏览,而且当确实需要修改时,谁说一定要切换到插入模式才行?我们可以重新调整已有代码的格式,复制它们,移动其位置,或是删除它们。在普通模式中,我们有众多的工具可以利用。
- 许多普通模式命令可以在执行时指定的次数,这样它们就可以被执行多次。
- 普通模式命令的强大,很大程度上源于它可以把操作符与动作命令结合在一起。
- 和命令分别对数字执行加和减操作。在不带次数执行时,它们会逐个加减,但如果带一个次数前缀,那么可以用它们加减任意整数。
- 如果光标不在数字上,那么命令将在当前行正向查找一个数字,如果找到了,它就径直跳到那里。
可视模式:v/V
-
v:
-
V:进入可视行模式
-
ctrl + v:可视列模式
- 可以选择多行中的多列并对其进行操作;
- 进入可视的列模式后,选择多行中的多列,再shift+i进入插入模式,就可以对多列进行写入了;
插入模式
-
在所有模式中删除的组合键
按键操作 用途 删除前一个字符(同退格键) 删除前一个单词 删至行首 -
切换回普通模式
按键操作 用途 切换到普通模式 <C-[> 切换到普通模式 切换到插入-普通模式 -
插入-普通模式
能让我们执行一次普通模式命令。在执行一个普通模式命令,执行后,马上又返回到插入模式。
-
表达式寄存器
<C-r>=访问寄存器:该命令会在屏幕下方显示一个提示符,可以在其后输入要执行的表达式,输入表达式后敲一下<CR>,vim就会把执行的结果插入文档的当前位置了。
可视模式
可视模式允许选中一块文本区域并在其上进行操作
vim有三种不同的可视模式,分别用于操作字符文本、行文本和块文本。
一般情况下,当使用可视模式时,选区的一端固定在一个特定字符上,另一端可以自由移动;当使用l、w及f{char}这类动作命令时,会移动高亮区域的活动端,使选区变大或缩小。
-
在普通模式下激活可视模式:
命令 用途 v 激活面向字符的可视模式 V 激活面向行的可视模式 激活面向块的可视模式 gv 重选上次的高亮选区 -
vi}:vim进入可视模式,并选中花括号{}括起来的所有字符。
命令行模式
-
在指定范围上执行普通模式命令:normal
对几十行后都添加一个分号: A;<Esc> jVG :'<,>'normal .:对高亮选区中的每一行,对其执行普通模式下的.命令。
-
:%normal A; :符号%代表整个文件范围,因此:%normal A; 告诉vim在文件每行的结尾都添加一个分号。
-
:%normal i# :可以把整个python文件注释掉
-
用键自动补全命令
-
运行shell命令:
:!
可以调用外部程序,适用于执行一次性命令 -
:shell 命令用来启动一个交互的shell会话,exit退出会话返回vim
命令 用途 :shell 启动一个shell(输入exit返回vim) :!{cmd} 在shell中执行{cmd} :read !{cmd} 在shell中执行{cmd},并把其标准输出插入光标下方 :[range]wirte !{cmd} 在shell中执行{cmd},以[range]作为其标准输入 :[range]!{filter} 使用外部程序{filter}过滤指定的[range]
多文件
-
:ls:列出所有被载入内存中的缓冲区的列表,
-
用:bnext命令可以切换到列表中的下一个缓冲区。
:bnext!:叹号会强制vim切换缓冲区,即使当前缓冲区中有未保存的修改,也会继续切换。:ls命令中查看,被标记为a,表示为活动缓冲区(active);被标记为h,表示为隐藏缓冲区(hidden)。
-
在退出时处理隐藏缓冲区:
- :write(:w):命令把缓冲区保存到文件;
- :edit!(:e!):摒弃修改,重新从磁盘读取此文件。
- :wall(:wa!):保存所有改动的缓冲区而无需逐个检查
- :qall!(:qa!):退出vim而不想检查未保存的修改
-
:bprev命令可以切换到列表中的上一个缓冲区。
-
:buffer N命令直接凭编号跳转到一个缓冲区;
-
:buffer {bufname}:{bufname}只需包含文件路径中足以唯一标识此缓冲区的字符即可,如果输入的字符串匹配不止一个缓冲区列表中的条目,就可以用Tab补全的方式在这些条目中选择。
%符号知名哪个缓冲区在当前窗口中可见;
# 符号则代表轮换文件;
<C-^>可以在当前文件和轮换文件间快速切换;
-
-
:args:把缓冲区列表中的文件分组
-
argdo:在列表中的每个文件上执行Ex命令
-
删除缓冲区
- bdelete N1 N2 N3(bd 5 6 7 9 10):删除对应的文件
- N,M bdelete(5,10bd):删除一个区间的文件
-
用参数列表将缓冲区分组
:args:参数列表记录了在启动时作为参数传递给vim的文件列表。
:args filename1 filename:可以在列表列里增加文件
-
通配符(:args **/*.js **/*.css)
- *符号用于匹配0个或多个字符,但它的范围仅局限于指定的目录,而不会递归其子目录;
- **通配符也匹配0个或多个字符,但它可以递归进入指定目录的子目录。
-
用反引号结构指定文件
:args `cat .chapters`:vim 会在shell中执行反撇号括起来的命令,然后把cat命令的输出作为:args命令的参数。
-
-
多窗口
Ex 命令 普通模式命令 用途 :clo[se] c 关闭活动窗口 :on[ly] o 只保留活动窗口,关闭其他所有窗口 -
用标签页将窗口分组
标签页是可以容纳一系列窗口的容器。
- 用:tabedit {filename}命令打开一个新的标签页,如果省略了{filename}参数会创建一个新标签页,里面包含一个空缓冲区;
- :close:命令关闭此窗口以及包含此狂口的标签页;
- :tabc[lose]:命令来关闭当前标签页;
- :tabo[nly]:命令可以关闭除当前标签页外的所有其他标签页
- :tu:创建一个新的标签页;
- :ti:向右切换标签页;
- :tn:向左切换标签页;
-
:find:
命令允许通过文件名打开一个文件,但无需输入该文件的完整路径。要想利用此功能,首先要配置“path”选项。
:set path+=xx/**
配置号路径之后,只需给出文件名就可以打开指定目录中的文件了;也可以用键自动补全文件名。
动作(motion)命令:h motion.txt
-
基于单词移动
命令 光标动作 w 正向移动到下一单词的开头 b 反向移动到当前单词/上一单词的开头 e 正向移动到当前单词/下一单词的结尾 ge 反向移动到上一单词的结尾 -
查找字符f {char}
- 可以把f,dt.训练成手指的下意识动作
命令 用途 f{char} 正向移动到下一个{char}所在之处 F{char} 反向移动到上一个{char}所在之处 t{char} 正向移动到下一个{char}所在之处的前一个字符上 T{char} 反向移动到上一个{char}所在之处的前一个字符上 ; 重复上次的字符查找命令 , 反转方向查找上次的字符查找命令 -
用查找动作操作文本
1.用选择模式:
v:进入可视模式
/ge:选择光标到指定内容前
h:往回移一个字符
d:删除内容
2.普通模式
d/ge
在文件间跳转
任何改变当前窗口中活动文件的命令,都可以被称为跳转命令。
vim会把执行跳转命令之前和之后的光标位置,记录到跳转列表中。
可以说大范围的动作命令可能会被当成跳转,但小范围的动作命令只能算移动。
-
:jump:查看跳转列表的内容
-
用和命令进行跳转
-
跳转动作:
命令 用途 [count]G 跳转到指定的行号 /pattern/?pattern/n/N 跳转到下一个/上一个模式出现之处 % 跳转到匹配的括号所在之处 (/) 跳转到上一句/下一句的开头 {/} 跳转到上一段/下一段的开头 H/M/L 跳到屏幕最上方/正中间/最下方 gf 跳转到光标下的文件名 <C-]> 跳转到光标下关键字的定义之处 '{mark}/`{mark} 跳转到一个位置标记 -
:change :改变列表change list
vim为每次修改都记录了行号与列号,可以用g;和g,命令反向或正向遍历改变列表。
;和,分别用来正向及反向重复f{char}命令。
-
`.标记总是指向上次修改的位置;
-
`^标记则会记录上次退出插入模式时光标所在的位置;如果先退出插入模式,接着又在文档中四处移动,然后又想快速回到退出的地方继续编辑时,用gi命令就行了。
-
跳转到光标下的文件gf(go to file)
- :set suffixesadd+=.rb
- :set path?
寄存器
是一组用于保存文本的简单容器;
它们既可像剪贴板那样,剪切、复制和粘贴文本,也可以记录一系列按键操作,把它们录制成宏。
vim的删除、复制与粘贴命令都会用到众多寄存器中的某一个。可以通过给命令家"{register}"前缀的方式指定要用的寄存器。若不指明,vim将缺省使用无名寄存器。
vim提供了一组以26个英文字母命令的有名寄存器。
-
使用无名寄存器:
- xp:可被用于调换光标之后的两个字符;
- ddp:调换文本行;
- yyp:创建文本行的副本;
-
专用寄存器("0)
"0p
复制专用寄存器,仅当使用y{motion}命令时才会被赋值。
-
有名寄存器("a-"Z)
用小写字母引用有名寄存器,会覆盖该寄存器的原有内容,而换用大写字母的话,会将新内容添加到该寄存器的原有内容之后。
- "ayy:将当前行复制到寄存器a中,"ap:粘贴寄存器a中的内容
-
黑洞寄存器
黑洞寄存器是个有去无回的地方,可用下划线引用它。
如果运行"_d{motion}命令,vim将删除该文本且不保存任何副本。
用于只想删除文本却不想覆盖无名寄存器中的内容时。
-
系统剪贴板("+)
如果在外部程序中用剪切或复制命令获取了文本,就可以通过"+p命令(或在插入模式下用+)将其粘贴到vim内部。相反地,如果在vim的复制或删除命令之前加入"+,相应的文本就被捕获至系统剪贴板。
-
在可视模式下使用寄存器
在可视模式下使用p命令时,vim 将用指定的寄存器内容来替换高亮选区中的文本。
宏
可以用宏把任意数目的按键操作录制到寄存器,用于之后的回放。
在一组目标上执行宏有两种方式:以串行方式回放或者以并行方式多次运行。
在录制宏时,要确保每条命令都可被重复执行。
在录制宏的过程中,禁止使用鼠标。
-
qa:录制宏并将其内容保存至寄存器a中,直到再次按下q键停下为止
-
:reg a:查看寄存器a中的内容
-
用@{register}命令执行指定寄存器的内容,也可以用@@来重复最近调用过的宏
-
以并行方式执行宏:以可视模式选取文本,然后执行命令:‘<,’>normal @
-
给宏追加命令
在输入qa时,vim将开始录制接下来的按键操作,并将它们保存到寄存器a中,这会覆盖该寄存器原有的内容。如果输入的是qA,vim也会录制按键操作,但会把他们附加到寄存器a原有的内容之后。
-
编辑宏的内容:
按G键,跳转到当前文档的结尾,使用:put命令粘贴宏的内容
编辑完之后,再依次:
0
"ay$
dd
或者运行"add,该缺点是多了一个拖尾字符^J,即换行符。
模式
-
调整查找模式的大小写敏感性
- :set ignorecase
- 每次查找时设置大小写敏感性:\c会让查找模式忽略大小写;\C会强制区分大小写
- :set smartcase
-
正则匹配
- \v:使用\v模式开关后,(、)、|以及{字符会表现出特殊含义;
- \V:会使得其后的模式中只有反斜杠有特殊的意义。
模式 说明 #\([0-9a-fA-F]\{6}|[0-9a-fA-F]\{3}\)
使用magic搜索模式时,必须转义(、)、|以及{字符,赋予它们特殊的含义 `\v#([0-9a-fA-F]{6} [0-9a-fA-F]{3})` `\v#(x{6} \x{3})` -
界定单词的边界
- /v
- \w:匹配但此类字符,包括字母、数字以及符号“_”
- \W:用来匹配除单词类字符以外的其他字符
查找
-
如果只想在当前光标位置至文档结尾的范围内查找,而不想绕回文档继续查找的话,可以关闭"wrapscan"
-
/键为正向扫描,?键会进行反向查找
-
在普通模式下使用gn时,光标会跳到下一处匹配,进入可视模式并选中匹配的文本。如果光标已经位于匹配上,gn就会选中当前的匹配;
-
gN进入面向字符的可视模式,并选中上一处匹配。
-
高亮功能:(:set hls、:set noh)
-
将光标偏移到查找匹配的结尾
/lang/e<CR> auage<Esc> n . n.
替换
在缺省情况下,substitute命令仅仅作用于当前行,而且只会修改第一处匹配。因此,为了在整个文件的范围内修改每一处匹配,必须指定范围,并使用标志位g。
😒/going/rolling/g:将当前行上的所有going都替换成rolling
:%s/going/rolling/g:将整个文本中所有的going都替换成rolling
-
substitute命令允许先查找一段文本,再用另一段文本将其替换掉:
:[range]s[ubstitute]/{pattern}/{string}/[flags]
-
手动控制每一次替换操作
:%s/content/copy/gc 引入标志位c后,vim会对每处匹配结果都提示“替换为copy?”,可以按y键完成这次修改,或者按n键跳过这一次修改。
答案 用途 y 替换此处匹配 n 忽略此处匹配 q 退出替换过程 l “last” - 替换此处匹配后退出 a “all” - 替换此处与之后所有的匹配 向上滚动屏幕 向下滚动屏幕
global命令
:global 命令允许在某个指定模式的所有匹配行上运行Ex命令。
在缺省情况下,:global 命令的作用范围是整个文件(%)
:global 命令在指定 [range] 内的文本行上执行时通常分为两轮。第一轮,vim在所有[pattern]的匹配上做上标记。第二轮,再在所有已标记的文本行上执行 [cmd]。
查看帮助:
:h :g
: [range] global[!] /{pattern}/ [cmd]
[pattern]域与查找历史相互关联。这意味着如果将该域留空的话,vim会自动使用当前的查找模式。
[cmd]可以是除 :global命令之外的任何Ex命令。如果不指定任何[cmd],vim将缺省使用 :print
可以用 :global! 或者 :vglobal (v表示invert) 反向[0] :global 命令的行为[0]