基本配置
set nuset nocompatiblesyntax onset showmodeset showcmdset t_Co=256set wrapset linebreakset laststatus=2set rulerset showmatchset hlsearchset incsearchset ignorecaseset smartcaseset wildmenuset wildmode=longest:list,full
替换
使用命令:
:%s/foo/bar/g
数字的自增和自减
- ctrl+a 自动加1
- ctrl+x 自动减1
- number+ctrl+a 自动加 number
- number+ctrl+x 自动减 number
VimPlus
安装
安装插件如果出错,可以使用git clone https://github.com/chxuan/vimplus.git ~/.vimpluscd ~/.vimplus./install.sh
git把对应的插件clone到~/.vim/plugged中即可。常用命令
| Leader | , | | —- | —- | |h | 打开VimPlus帮助 | | e | 快速编辑Vim配置 | | s | 快速加载Vim配置 | | | | | | |
插件
Vim-Prettier
安装
" post install (yarn install | npm install) then load plugin only for editing supported filesPlug 'prettier/vim-prettier', {\ 'do': 'yarn install',\ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown', 'vue', 'yaml', 'html'] }
设置
" 在 prettier的配置文件时,自动格式化let g:prettier#autoformat_config_present = 1" when running at every change you may want to disable quickfixlet g:prettier#quickfix_enabled = 0" 自动格式化autocmd TextChanged,InsertLeave *.js,*.jsx,*.mjs,*.ts,*.tsx,*.css,*.less,*.scss,*.json,*.graphql,*.md,*.vue,*.yaml,*.html PrettierAsync
Vim实用技巧
内容提要
Vim的强大在于它对于桌面环境不存在强依赖,在服务器端修改代码,查看日志等操作可以大大提升效率,并且vim的设计理念也使得在操作过程中摆脱了对于鼠标的依赖。对于使用vim形成的肌肉记忆,可以让我们毫无障碍的把我们的思路进行转换,而不至于在切换鼠标和键盘之间有思维的断档。Vim是一款功能丰富而强大的文本编辑器,其代码补全、编译及错误跳转等方便编程的功能特别丰富
技巧只是针对的特定的问题,当离开这个问题,它就不再有效。而我们更需要的绝对不仅仅是技巧,而是放之四海而皆准的方法和理念,基础。“技巧”——一种解决特定问题的灵丹妙药。
虽然不能说盲打是提升计算机的一种方式,但盲打可以在一定程度上拉近你的思想和计算机输入的距离!先学会盲打,然后再学习Vim
插入模式
插入-普通模式
自动补全是插入模式中才能使用的高级功能,
[插图]
[插图]
插入-普通模式是普通模式的一个特例,它能让我们执行一次普遍模式命令。
要从插入模式切换到插入-普通模式,可以按 ???
zz 命令可以重绘屏幕,并把当前行显示在窗口正中
命令用于查看处于光标之下的那个单词的手册页
J 命令则用来把当前行和下一行连接在一起
表达式寄存器
??
它可以用来执行一段Vim脚本,并返回其结果。
我们可以用 = 符号指明使用表达式寄存器。在插入模式中,输入 = 就可以访问这一寄存器。这条命令会在屏幕的下方显示一个提示符,我们可以在其后输入要执行的表达式。输入表达式后敲一下 ,Vim就会把执行的结果插入到文档的当前位置了。
Vim可以用字符编码(Character Code)插入任意字符。
要根据字符编码插入字符,只需在插入模式中输入 {code}即可,其中{code}是要插入字符的编码。
解决方法是可以用4位十六进制编码来输入这些字符,即输入 u{1234}(注意数字前的 u )。
如果你想知道文档中任意字符的编码,只需把光标移到它上面并按 ga 命令,然后屏幕下方就会显示出一条消息,分别以十进制和十六进制的形式显示出其字符编码
二合字母用起来很方便。在插入模式中,只需输入 >{char1}{char2} 即可。因此,如果想输入以二合字母 ?I 表示的“¿”字符,我们可以简单地输入 ?I 。
:h digraph-table查看另一个更为有用的列表。
用 R 命令可以由普通模式进入替换模式
虚拟替换模式(Virtual Replace mode)。该模式可由 gR 命令触发,它会把制表符当成一组空格进行处理
可视模式
Vim具有3种不同的可视模式,分别用于操作字符文本、行文本或块文本。
我们也可以利用 . 命令来重复执行可视模式中的命令,然而只有在操作面向行的选区时,它才特别有用;
执行 viw 来高亮选择这个词
按 可以在可视模式及选择模式间切换。切换后看到的唯一不同是屏幕下方的提示信息会在 “— 可视 —”(— VISUAL —)及“—选择—”(—SELECT—)间转换。
Vim有3种可视模式。在面向字符的可视模式
该模式适用于操作单词或短语。
想对整行进行操作,我们可以改用面向行的可视模式。
面向列块的可视模式则允许我们对文档中的列块进行操作。
键是通往可视模式的大门。在普通模式下,按 v 可激活面向字符的可视模式,按V(v和Shift键一起按)可激活面向行的可视模式,而按 (v和Ctrl键一起按)则可激活面向列块的可视模式
gv 命令是个有用的快捷键,它用来重选上一次由可视模式所选择的文本范围。
高亮选区的范围由其两个端点界定。其中一端固定,而另一端可以随光标自由移动,我们可以用 o 键来切换其活动的端点。
vit 可被解读为高亮选中标签内部的内容
it 命令是一种被称为文本对象(text object)的特殊动作命令
使用U命令来把所选中的字符转换为大写
当一条可视模式命令被重复执行时,它会影响相同数量的文本
gU{motion}
如果我们想使点命令能够重复某些有用的工作,那么最好要远离可视模式。
用 gv 命令重选上次的高亮选区
按 $ 键把选区扩大到每行的行尾
Vim 对“i”及“a”键的约定
Vim对于从普通模式切换到插入模式的命令有几个约定,i 命令和 a 命令都完成此切换,并分别把光标置于当前字符之前或之后,I 命令和 A 命令的表现类似,只是它们分别把光标置于当前行的开头和结尾。
在可视模式及操作符待决模式中,i 和 a 键沿用一个不同的约定。它们会被当作一个文本对象的组成部分
命令行模式
在按下 : 键时,Vim会切换到命令行模式。
在命令行模式中执行的命令又被称做 Ex 命令
我们可以用Ex命令读写文件(:edit 和 :write),创建新标签页(:tabnew)及分割窗口(:split),或是操作参数列表(:prev/:next)及缓冲区列表(:bprev/:bnext)。事实上,Vim为几乎所有功能都提供了相应的Ex命令
操作缓冲区文本的Ex命令

可以用 和 分别删除至上个单词的开头及行首,也可以用 或 来插入键盘上找不到的字符,还可以用 {register} 命令把任意寄存器的内容插入到命令行
命令操作范围更大,并且能够在一次执行中修改多行;
Ex 命令可以用 [range] 指定要操作的范围。
可以用行号、位置标记或是查找模式来指定范围的开始位置及结束位置。
如果输入一条只包含数字的Ex 命令,那么 Vim 会把这个数字解析成一个地址,并把光标移动到该数字所指定的行上。
迄今为止,地址只是被当成一个单独的行号,不过我们也可以用它来指定一个范围
:{start},{end}
需注意的是 {start} 和 {end} 都是地址。
符号 . 代表当前行的地址。
符号 % 也有特殊含义,它代表当前文件中的所有行
我们也可以用高亮选区选定一个范围
符号 ‘< 是代表高亮选区首行的位置标记,而 ‘> 则代表高亮选区的最后一行
Vim 也接受以模式作为一条 Ex 命令的地址
用偏移对地址进行修正
偏移的一般形式是这样的:
:{address}+n
如果 n 被省略,那么缺省偏移量为1。{address} 可以是一个行号、一个位置标记,或是一个查找模式。
定义范围的语法非常灵活,既可以混合搭配行号、位置标记以及查找模式,也可以对它们加以偏移。
copy{address} 及 :move {address}
copy 命令(及其简写形式 :t)让我们可以把一行或多行从文档的一部分复制到另一部分,而 :move 命令则可以让我们把一行或多行移到文档的其他地方。
copy命令的格式如下(参见:h :copy):
:[range]copy {address}
copy 命令可以简写为两个字母 :co,或者也可以用更加简练的 :t 命令
这两种复制当前行的技术有个需要关注的差别:yyp 会使用寄存器,而 :t. 则不会。
用 ‘:m’ 命令移动行
:[range]move {address}
可以把它简写为一个字母:m。
如果想在一系列连续行上执行一条普通模式命令,我们可以用 :normal 命令。
:’<,’>normal . 命令可以解读为“对高亮选区中的每一行,对其执行普通模式下的 . 命令”。
. 命令可以重复上次的普通模式命令。然而,如果想重复上次的 Ex 命令的话,我们得使用 @: 才行。
下面两条命令在遍历缓冲区列表的条目时非常有用,用 :bn[ext] 可以在列表中逐项正向移动,而 :bp[revious] 命令则进行反向移动
命令会回到跳转列表的上条记录。
执行、重复、回退。
在命令行上也可以用 键自动补全命令。
C-d>命令会让Vim显示可用的补全列表
的设置会满足你的需要:
set wildmode=longest,list
如果你习惯于 zsh 提供的自动补全菜单,或许会想试试这个:
set wildmenu
set wildmode=full
当 ‘wildmenu’ 选项被启用时,Vim 会提供一个补全导航列表。
在 Vim 的命令行下, 映射项会复制光标下的单词并把它插入到命令行中。
把光标移到单词 tally上后,用 * 命令就可以查找它出现的每处地方
用于插入光标下的单词,而如果想插入光标下的字串的话(参见技巧48的说明),我们可以用
Vim 会记录命令行模式中执行过的命令,并提供了两种方式回溯这些命令,用光标键回滚之前的命令或调出命令行窗口查看先前的命令。
除了 和 键外,也可以用 和 组合键来反向或正向遍历命令历史。
但 和 命令有个缺点,它们不会像 和 那样对历史命令进行过滤。
cnoremap
cnoremap
命令行窗口的好处在于它允许我们使用 Vim 完整的、区分模式的编辑能力来修改历史命令。
当处于命令行模式下时,我们可以用 映射项切换到命令行窗口中,此前已经输入到命令行上的内容仍然会得以保留。
在Vim的命令行模式中,给命令加一个叹号前缀(参见:h:!)就可以调用外部程序。
:!{cmd} 这种语法适用于执行一次性命令
可以执行 Vim 的 :shell 命令来启动一个交互的 shell 会话
用 exit 命令可以退出此 shell 并返回 Vim。
可以先按 Ctrl-z 挂起Vim 所属的进程,并把控制权交还给bash。
在 bash 中,我们可以用 fg 命令唤醒一个被挂起的作业,把它移到前台。
read !{cmd} 命令,把 {cmd} 命令的输出读入当前缓冲区中
:write !{cmd} 做相反的事。它把缓冲区内容作为指定 {cmd} 的标准输入
用动作命令在文档中移动
h motion.txt
Vim 会区分实际行与屏幕行。当 ‘wrap’ 设置被启用时(缺省启用),每个超出窗口宽度的文本行都会被回绕显示,以保证没有文本显示不出来。
和 k 命令会根据实际行向下及向上移动,而 gj 和 gk 则是按屏幕行向下及向上移动。
、k、0和 $ 都用于操作实际行,而如果在这些键前加上 g 前缀的话,就会让 Vim 对屏幕行进行操作。
命令连在一起可被解读为“在当前单词结尾后添加”。
gea 命令当成“在上一单词结尾后添加”
一个单词由字母、数字、下划线,或其他非空白字符的序列组成,单词间以空白字符分隔
字串的定义则更简单,它由非空白字符序列组成,字串间以空白字符分隔
字串比单词更长!
f{char} 命令是在 Vim 中移动的最快方式之一。
Vim 会记录上次执行过的 f{char} 命令,随后用 ; 命令就可以重复该命令了
, 命令就可以再跳回来。此命令也会重复上次的f{char}命令,不过会按相反的方向进行查找
{char} 及 T{char} 命令当成“直到查找到指定的字符为止”
与 d{motion} 或 c{motion} 一起使用时,我会更倾向于使用t{char} 及 T{char}命令。
在使用字符查找命令时,最好是选择出现频率比较低的字母作目标字符。
查找命令是一个开动作
学会把 d{motion} 操作符与查找动作结合在一起使用,这是个很大的进步
文本对象就是基于结构定义的文本区域(参见:h text-objects)。
的文本对象由两个字符组成,第一个字符永远是 i 或是 a。我们一般说,以 i 开头的文本对象会选择分隔符内部的文本,而以 a 开头的文本对象则会选择包括分隔符在内的整个文本。
我们却可以在可视模式及操作符待决模式中使用文本对象。
每当在命令语法里看到{motion} 时,你也可以在这个地方使用文本对象,常见的例子包括 d{motion}、c{motion}和 y{motion}
“ 命令解读为“修改双引号内部的内容”
cit 命令解读为“修改标签内部的内容”
Vim 的文本对象分为两类:一类是操作分隔符的文本对象,如 i)、i” 和 it;另一类用于操作文本块,如单词、句子和段落。
单词、句子以及段落则以文本结构的范围进行界定,因此我把这一类称为“范围文本对象”。Vim 的文档把它们称为“块对象”(block object)和“非块对象”(non-block object)
一般来说,d{motion} 命令和 aw、as 和 ap 配合起来使用比较好,而 c{motion}命令和 iw 及类似的文本对象一起用效果会更好。
m{a-zA-Z}命令会用选定的字母标记当前光标所在位置(参见:h m)。小写位置标记只在每个缓冲区里局部可见,而大写位置标记则全局可见。
mm 和 `m 命令是一对便于使用的命令,它们分别设置位置标记 m,以及跳转到该标记。
命令允许我们在一组开、闭括号间跳转(参见:h %),它可作用于()、{}以及[]
surround.vim
复制与粘贴
xp,可被用于“调换光标之后的两个字符”。
ddp,可被用于“调换当前行和它的下一行”。
diw 命令不仅删除了单词,而且还将它拷贝到了无名寄存器。
我们可以通过给命令加 “{register} 前缀的方式指定要用的寄存器。若不指明,Vim 将缺省使用无名寄存器。
用下划线符号(参见 :h quote_)可以引用黑洞寄存器。因此,”_d{motion}会执行真正的删除操作。
无名寄存器(””)
倘若我们没有指定要使用的寄存器,Vim将缺省使用无名寄存器,它可以用双引号表示(参见:h quote_quote)。
x、s、d{motion}、c{motion} 与y{motion} 命令(以及它们对应的大写命令)都会覆盖无名寄存器中的内容。
复制专用寄存器(”0)
当我们使用 y{motion} 命令时,要复制的文本不仅会被拷贝到无名寄存器中,而且也被拷贝到了复制专用寄存器中,后者可用数字0(参见:h quote0)加以引用。
如果我们此时检查无名寄存器和复制专用寄存器的内容,会发现它们分别保存着刚刚被删除与复制的文本:
➾:reg “0
用小写字母引用有名寄存器,会覆盖该寄存器的原有内容,而换用大写字母的话,则会将新内容添加到该寄存器的原有内容之后。
黑洞寄存器
黑洞寄存器是个有去无回的地方,可用下划线(参见:h quote_)引用它。
系统剪贴板(”+)与选择专用寄存器(”*)
Vim的加号寄存器与系统剪贴板等效,可用+号(参见:h quote+)引用。
如果我们在外部程序中用剪切或复制命令获取了文本,就可以通过 “+p 命令(或在插入模式下用 +)将其粘贴到Vim 内部。
X11视窗系统支持另一种被叫作主剪贴板(primary)的剪贴板,它保存着上次被高亮选中的文本,可以用鼠标中键(如果有的话)把它们粘贴出来。Vim 的星号寄存器对应主剪贴板,可用*号(参见:h quotestar)加以引用。
表达式寄存器(”=)
p命令旨在将寄存器中的文本粘贴到光标之后(参见:h p)。
Vim也提供了(大写的)P命令用于将文本插入到光标之前
插入模式下,我们可以通过输入 “ 来插入无名寄存器的内容,或者输入0来插入复制专用寄存器的内容
gp和 gP命令也值得关注,因为它们同样可以将文本粘贴至在当前行之前或之后。不同的是,它们会把光标的位置移到被粘贴出来的文本结尾而不是开头。
系统剪贴板(”+)与选择专用寄存器(”*)
宏
q 键既是“录制”按钮,也是“停止”按钮。为了录制我们的按键操作,一开始需要按q{register},从而指定一个用于保存宏的寄存器。当状态栏中出现“记录中”时,表示录制已经开始。此后,我们执行的每一条命令都将被宏捕获,直到我们再次按下q键停下为止。
查看寄存器a中的内容:
➾:reg a
符号 ^[ ,它代表Esc键。
我们可以用@{register}命令执行指定寄存器的内容(参见:h @),也可以用@@ 来重复最近调用过的宏。
黄金法则:在录制一个宏时,要确保每条命令都可被重复执行。
面向单词的动作命令,如w、b、e和ge,与面向字符的动作命令h和l相比,更具灵活性。
对于多行范围内的重复性改动,可以先录制一个宏,然后再在每一行上回放,这将会极大减轻我们的工作量。
normal @a 命令指示 Vim 在高亮选区中的每一行上执行这个宏。
qA 的话,Vim 也会录制按键操作,但会把它们附加到寄存器a原有的内容之后。
通过使用 let 关键字,我们可以创建一个名为i的变量,并将其值赋为0,也可以用 :echo命令查看变量的当前值
以下语句可用于累加i的值:
➾:let i += 1
只需在插入模式下运行 =i,即可插入变量i的值。
~命令切换光标所在处的字母大小写
vU替换~命令,它会把光标处的字母变为大写
put命令总会将它们粘贴至当前行的下方,无论寄存器保存的是面向行的还是面向字符的文本块。
按模式匹配及按原义匹配
如果启用‘ignorecase’设置,Vim的查找模式将不区分大小写。
小写字母 \c会让查找模式忽略大小写,而大写字母 \C 则会强制区分大小写。
这两个元字符可以出现在模式的任意位置。
‘smartcase’选项。该选项被启用后,无论何时,只要我们在查找模式中输入了大写字母,‘ignorecase’设置就不再生效了。
模式开关使得Vim的正则表达式引擎表现得更像是Perl、Python或者Ruby所为。
用字符类 \x 代替完整的字符集[0-9a-fA-F]
替换
Vim允许在替换域中执行其脚本表达式
substitute 命令很复杂,除了要提供查找的模式以及替换字符串外,还要指定执行的范围。另外,作为可选项,我们还可以通过标志位来调整该命令的行为。
:[range]s[ubstitute]/{pattern}/{string}/[flags]
标志位
:h s_flags
标志位 g使得 subsititute 命令可在全局范围内执行,即可以修改一行内的所有匹配,而不仅仅是第一处匹配。
标志位c让我们有机会可以确认或拒绝每一处修改。
标志位 n 会抑制正常的替换行为,即让 Vim 不执行替换操作,而只是报告本次substitute 命令匹配的个数。
标志位 & 仅仅用于指示Vim重用上一次substitute命令所用过的标志位。
替换域中也有一些特殊字符。通过查询:h sub-replace-special
g 看似为全局之意(global),实则有误导之嫌。也许有人想借此标志位在整个文件范围内进行替换操作,但实际上,它仅表示“当前一整行范围”。
[插图]
将substitute命令的查找域留空,意味着Vim将会重用上次的查找模式。
当我们在文档中任意选中一段文本后,该映射项允许我们按 * 键来查找这段文本。
将查找任务与替换任务分离,会致使这两组信息被单独存放,从而导致当你再想重用之前的 substitute 命令时,会遇到困难。
你只需在命令行中输入 /,即可把上次的查找内容粘贴进来。
通过输入 {register},我们可以将寄存器的内容插入到命令行。
如果寄存器0中的文本包含了在替换域中具有特殊含义的字符(例如 & 或 ~),我们必须手动编辑这段文本,对这些字符进行转义。
假设我们已经复制了多行文本,并存放于寄存器 0 中。我们现在的目标是在substitute命令的替换域中使用这段文本。通过运行以下命令,可以做到这一点:
➾:%s//=@0/g
替换域中出现的 = 将指示 Vim 执行一段表达式脚本。
我们可以用 @{register} 来引用某个寄存器的内容。
let @/=’Pragmatic Vim’ 是采用编程的方式输入查找模式,它等同于直接执行查找命令 /Pragmatic Vim
只需输入g&(参见:h g&),即可在整个文件的范围内重复这条命令。
gv命令会激活可视模式,并重新将上次被选中的文本高亮起来
:&& 命令,因为这两处 & 符号的含义有所不同。前一个 & 作为Ex命令 :& 的组成部分,用作重复上一次的 :substitute命令(参见 :h :&),而第二个 & 则会重用上一次 :s命令的标志位。
&& 命令本身只作用于当前行,:’<,’>&& 会作用于高亮选区
& 命令作为 :%&& 的快捷方式
& 命令是 :s命令的同义词,用于重复上一次的替换操作
通过记号 \n 来引用这些子匹配。
元字符 \zs将使我们更关注于匹配的一部分。
\zs所在的位置表明“h”自身被排除在匹配之外
在Vim中,通过调用函数submatch(0),即可得到当前匹配的内容。
切换空格和制表符
在实际中,我们可能需要在一些文件中使用空格来缩进或分隔字符,而在另外的一些文件中需要使用制表符来进行缩进或分隔字符。那么,在同一个全局配置下,我们怎么达到上面的需求呢?答案就是在要和全局配置不一样的文件中,使用命令来切换。
在下面的操作中,我们统一默认全局的设置为使用空格替换制表符,一次Tab键输入2个空格。
临时切换
当我们需要临时切换空格和制表符的时候,我们可以使用set noexpandtab|noet和set expandtab|et来在制表符和空格之间切换。当我们使用set noexpandtab把空格替换为制表符后,我们就可以使用tab来插入制表符了。当我们需要切换回空格的时候,我们使用set expandtab命令就可以了。
全文件替换
当我们需要把文件内的所有制表符和空格都进行切换的时候,我们可以使用以下的命令:
:set noexpandtab //或 :set noet 设置空格为制表符:retab!
:set expandtab //或 :set et 设置制表符为空格:retab!
