看完vim高级技巧之后,觉得自己的技能又一次进步了
就记录一下哈哈。


vim近身格斗

先进行一个说明,因为vim的组合快捷键特别多,我们这里先进行一个说明 Ctrl键使用^ 代替

^v 表示,先按Ctrl键,再按v键
^V 表示,先按Ctrl键,再按shift 接着按v 键that all。

身法

关于最简单的hikl上下左右的我就说一点,以前我喜欢用hl左右移动但是现在我才发展这种

移动简直就是在浪费生命。
0 移动到改行的行首,$ 移动到行尾 ^移动到行首的第一个非空字符

  1. 行内移动命令
    最简单的左右移动方法就是使用 f(普通模式下)查找命令该命令
    是一个针对行查找的命令,使用f 向后查找,大写F向前查找,f后面紧跟要查找的内容就好了了.
    我们都知道/?搜索命令使用n N 显示上/下一个,f F 使用 “;” 和”,”到下一个or 上一个。

  2. 移动距离: 一个单词
    w 向后一个单词,并且到下一个单词的开头 
    W 向后一个字符串,包含特殊符号(,‘等符号)
    e 移动到单词的最后一个字母
    b 移动到单词的第一个字母
    b 移动到单词的第一个字符,包含特殊符号(,‘等符号)

    攻击

    上一节我们说了移动这下说一下啊攻击哈,攻击无非就是增删改查我们就说下这个,以前我老觉得rS
    没什么用,用的特别少,其实还是很有用的只是当时年轻。

    i a I A 我就不多说了,不知道的可以看看基础篇。
    p P 也都一样,下面讲到用寄存器的可以看看比较有用。

    dd x 大家都会主要说一下dmovie D
    d+moive 可以删除movie到的地方非常方便 such as:
    dw 向后删除一个单词包含该单词后面的空格,因为w是移动光标到下一个单词的开头,不删除光标下的字符
    dW 向后删除一个单词(包含特殊字符such as “he,;llo” 就是一个W )
    de db dB d0 d^ d$ 都可以尝试一下逗比较有用哈。当然了组合有很多,你可以自己研究一下
    dgg dG 组合有很多有,不过是大范围的还有魔法命令都在下面等着你哦。

    r (eplace ) 用你输入的字符替换光标下面的一个字符 ra 替换字符为a
    R 一直替换光标下面的字符,直到退出该模式
    c+movie == change movie ,和上面的dmovie 是一样的组合命令就是用来删除movie选择的,然后进入
    插入模式你就可以输入了。such as : cw cW cb cB ce c0 c^ c$
    C 清空整行然后进入插入模式
    s 删除当前字符并且进入插入模式
    S 清空整行然后进入插入模式

vim 群攻

应该都在普通模式模式下面使用过visual,这真是一个有用的模式相应你会爱上它的。

visual总共有三种模式,

  1. v+movie 选择movie到的地方可以使用 搜索模式
  2. V ( visual line) 激活面向行的可视模式,每次选择一行可以使用jk ,搜索模式也可以使用
  3. ^v 激活面向块的可视模式,你可以选择你需要的块,进行类似于表格的操作,当然了在行尾添加or在
    行首添加,or 在每一行的同一列进行操作,都可以。通过可视模式你可以做到你想做的大部分处理。
  4. gv 重选上次的高亮选区,有用的命令

    段落选择

    键入v 进入visual 模式,然后使用 vw ve vW ve v0 v$都可以,当然了这个是行的选择我们下面
    主要看看进行大范围的选择,
    va{ 会选择包括大括号内的所有内容 a arround }
    vi{ 会选择不包括大括号内的所有内容。i inside }
    vi( va( 当然了还有一些其他的命令可以选择,当你使用可视模式选择区域之后,就可以进行你想要的
    action ,跟上面的一样 增删改查都可以使用,只要先选择目标区域然后,d y c s r ,你可以做你想
    做的。当然了如果你没有忘记前面提到的的 [dycrs]+movie 的话,你可以使用 [dycrs]+v+movie和
    v+movie+action 其实还是有一些区别的,你可以尝试一下哈。
    vgg vG 可以帮助你选择全文哈哈。

    行选择

    在普通模式下面,使用 V 激活visual line 模式之后,就可以使用 jk 上下移动选择行了每移动
    j 就是向下选择一行,选择之后你可以发挥你的想象力。我提醒你不要忘记,vim 在命令前面加数字的
    牛逼方式哈。

    列选择

    <^v> 在普通模式下面激活面向块的可视模式,在这里你可以使用 jk 移动选择高度,然后再横向移动movie
    选择宽度,选择之后,你可以使用 A I 到选择块的所有行首和行尾,当然了 d c y p s 增删改查都可以
    总之这是一个高度自由的世界,你想到的都可以用自己方式实现,如果实现不了,你需要再看看手册RTFM哈哈。
    顺便说一下,可以使用缩进,> < ,可能你会遇到需要多次缩进,并且每次还需要重新选择,这个时候gv命令就是
    非常有用的,可以重选上次选中的区域。

vim 寄存器

在vim 里面,寄存器无处不在,/ ? d p 等只要涉及到要暂时保存字符的行为都会使用到寄存器,比如寄存去/就是
一个特殊的寄存器,存储我们上一次使用的搜索模式。vim 为我们提供了26个英文字母的寄存器,使用寄存器需要在
寄存器前面加上 ” such as ,“a 表示使用寄存器a; ”b使用寄存器b。

复制寄存器

y d 会把删除的字符存储到"“"寄存器;同时还存在一

个复制专用寄存器:0 ,也就是说在复制的时候,会有俩个寄存器存储你复制的字符 “ “, 0 “ ;
当然了你也可以使用26个字母的寄存器 。 “ayy ,复制当前行到寄存器a。使用寄存器内容俩个方式:
在普通模式下面使用: ”ap;
在插入模式下面:<^r>a ; <^r>+寄存器名字

表达式寄存器

有的时候需要计算一下数值,又不想退出vim同时把结果插入到vim ,这个时候表达式寄存器 = 就会特别有用

在插入模式下面,<^r>= ,然后会在vim左下角显示一个等号,然后输入表达式最后 按Enter 键,结果就会插入
到当前的位置,是不是很方便。

普通寄存器

“% 存储当前文件名
”# 轮换文件名
“. 上次插入的文本
”:上次执行的Ex命令
“/ 上次查找的模式
”+ 系统寄存器,使用该寄存器你可以把vim的内容粘贴到系统粘贴板,反之亦然。
“* 主剪贴板,用鼠标中键选择的内容

vim 魔法

所谓的魔法就是你可以站在原地施法,然后达到上面需要移动才能完成的任务,不管是远程的还是近身的都可以通过
通过所谓的命令行来实现,vim的命令行其实是叫做Ex(Excutive),它是由历史演化而来的,我们都知道vim是vi的延伸
那你知道ed是vi的前身吗,ed前面还有ec eb等编辑器,因为以前的最原始的计算机是使用打孔机的,所以看代码都是
打印出来,对代码也是进行行的处理,后来出现了显示屏幕,然后vi就出现了但是它保留了以前编辑器对于行的处理
也就是ex命令,vim 其实是vi的备用编辑器,但是经过多年的发展,vim变得比vi更复杂更好用,但是更难学,因为
快捷键or命令又增加了很多,所以建议学习vim的可以先学习vi,然后再学习vim因为vim向后兼容vi的所有功能,emacs我
用过一段时间但是因为我实在是太笨了,到最后也不会配置所以就放弃了,接着用vim了,但是我想将来可能还会去使用
一下,毕竟我们都拥有一颗奋斗不止的心是吧。

在普通模式下面 键入 / 就会激活向下查找模式  键入?激活向上查找模式,n N 上下一个

写个例子
who am i
you are a smart person
Who
Whoami

  1. 大小写
    \c 忽略大小写放在/的后面
    \C 区分大小写放在搜索模式的后面
    /\cwho 匹配who Who Whoami
    /who\C 匹配 who
    /Who\C 匹配 Who Whoami

  2. 正则表达式\v
    因为linux里面 | 是管道 < >是重定向还有”{ “ () 等都是有原意的字符,我们在正则表达式使用这些字符的时候必须
    使用它们在正则表达式中的特殊含义。| 是或的意思是,{}表示此时,()表示匹配子项 <> 表示单词匹配等等,我们必须
    在使用它们的前面加上\才能使用它们,如果我们的正则表达式很短则无所谓,但是通常情况下我们的表达式很长,因为
    短的根本就不需要正则,so我们需要/v来开启字符的特殊含义。
    \v 会激活very magic搜索模式,即假定除_、大小写字母以及0-9之外的所有字符都具有特殊含义。

  3. 原意查找 \V
    上面的是开启了字符的特殊含义,但是当我们就是想找这个单词的时候呢,或者就是想用 | \ < . 呢,这个时候
    \V就会帮助你了。
  4. 使用圆括号扑获子匹配
    /\v<\w+>_s+\1> 会匹配俩个重复的单词这里我们使用的主要就是() \1 。任何圆括号内部匹配的文本都会被自动保存
    到一个临时的仓库中。我们可以用\1引用这段被被扑获的文本。如果模式中包含不止一组圆括号,则可以用\1 \2 直到\9
    引用被每对()扑获的子匹配。另外无论模式中是否使用了圆括号,\0永远会引用整个匹配。还有在vim中 _s 表示空格或者
    换行符,所以这个正则拆开就是,\w 表示字母,\w+ 表示至少有一个字母的单词,碰到空格or换行结束,\1表示单词 <>
    界定了俩个单词的范围。
  5. 界定单词的边界
    当我们只想匹配who单词,但是不想匹配whoami的时候,我们需要要who单词使用<>括起来()。当然了如果你没有使用
    \v 的时候,你需要使用转义字符\来转义<>因为它们都是重定位符(\);
  6. 界定匹配的边界
    \zs 和 \ze 可以让我们获取我们匹配项的中的指定部分,比如/who 光标定位在who 的w字母上面,如果我想要定位到h or o呢
    /w\zsh\zeo ,可以让光标定位到h,子选项是h
    /who\zs,可以把光标定位到who单词后面的一个字母上面,这个还是相当有用的,特别是和下面的替换一起使用。
    还有一个命令 /who/e 自动定位到who的最后一个字母o。

上一步我们找到了我们想要找的文本,这一步我们就可以尝试去修改他们让它们变成我们想要的文本就是所谓的替换了。

:[range]s/pattern/string/gc #总得替换就是这样得了
range 默认当前行,1,12 表示1到12行,%表示全文, . 表示当前行
pattern就是模式我们上一步,如果为空则会使用上一次搜索使用的模式,so 一般是先搜索然后在替换的时候留空就好了。
是不是很棒啊,这个都是通过寄存器实现的哈。
string 就是我们要替换的字符串了,
g 表示的是global ,替换所有
c confirm 每次替换前会询问一下
使用上一条命令or历史命令,使用: 然后按上下键,就可以查看和使用以前的命令,搜索也是的。原理其实是显示寄存器中的内容。

:[range]d
range 同上面的一样
d 就是删除了哈
:%d 删除全文哈哈,可以试试。

标记

想不想使用玄幻小说中的传送阵啊,mm (make m sign) 做一个标记,回到这个标记使用 `m 就可以了 我们可以使用的有26个小写和
大写字母,小写是局部标记的,离开该文本失效,大写的是全局的,离开该文本照样生效,是不是很fasion啊。

  1. 录制宏
    前面我们的命令都是单独的一条条执行,现在我们可以自己把命令先存储起来,然后再使用。宏也是存储在寄存器中的q是宏的开启和
    停止按钮,q{register} ,记录开始并且指定了一个寄存器,在vim的左下边会看到recoding ,这个时候就可以录制了,最后按q结束录制。
    qaA;Ivar q ;这是一个宏,在一个代码的结尾加上分号,在开头加上var 声明变量,该宏存储在寄存器a中。
    告诉你一次秘密,你可以使用宏+表达式寄存器,自动的增加数值,然后插入到文本中。

    1
    2
    3
    4
    5
    :let i=1 /* 声明变量i */
    qa /* 开始 */
    <^r>=i<Enter><Esc> /* 使用表达式寄存器 插入变量的值 */
    :let i +=1 /* 变量加1 */
    q /*结束*/
  2. 查看宏
    :reg a 可以查看寄存器a中的内容,因为存储在a寄存器中,我们也可以使用 “ay or <^r>a 来看到具体的内容。

  3. 使用宏
    @a 使用a寄存器中的宏处理当前行
    3@a 连续三行使用宏
    我们也可以使用可是模式选择文本,然后键入: 会自动在: 后面加上选中的文本的范围,然后我们可以使用normal @a 来执行宏
    VG :’<,’>normal @a ,会在所有选中的行上执行宏a。
  4. 给宏追加命令
    当使用大写的寄存器的时候,不会清空寄存器的内容,而是会在寄存器后面追加内容so我们可以使用这个特性为宏追加命令
    qAjq 可以看下寄存器a中的内容,你会发现j字母被添加到最后
  5. 给多个文件执行宏
    vim可以一次打开多个文件,我们可以使用 :argdo normal @a

    vim 文件

    vim 可以打开一个文件or 多个文件,可以在打开一个文件之后再读取多个文件进来
    vim 会维护一个文件列表,一般叫做缓冲区列表,因为我们的文件会被加载到缓冲区。

    文件参数列表

    args 中 符号用于匹配0个或多个字符,但它的范围仅限于指定的目录而不会递归其他
    子目录;通配符也匹配0个或多个字符,但它可以递归进入指定目录的子目录
    :args
    /
    .txt 会遍历当前目录下面的所有子目录的txt文件
    :args .txt / 加载当前目录下面的 所有txt 文件不包含子目录。 可以使用:cd 切换目录 */
    :args cat dir.txt 会把cat读取的内容作为输入,假如dir.txt 里面存储的是一个项目的文件
    :argdo {cmd} 会对缓冲区列表文件都执行一条cmd命令
    则使用这个命令就可以把该项目加载到vim。
    :args 会列出来所有的文件,通过一行,当前文件会被[]标记起来。
    :n(next) :prev :first :last 下 上 第一个 最后一个

文件缓冲区

:edit filename 读取文件到缓冲区
:ls 会以行的方式显示缓冲区中的文件列表,易读 %标记当前文件 #标记上一次编辑的文件
<^^>即 会跳到#标记的文件。
:bn (buffer next) 跳转到当前文件的下一个文件
:bp (buffer previous ) 跳转到当前文件的上一个文件
:bf (buffer first) 跳转到当缓冲区的第一个文件
:bl (buffer last ) 跳转到当缓冲区的最后一个文件
:n,m bd (buffer deleter) 把标号n到m的文件缓冲从缓冲区删除,但是并不删除该文件

读命令返回值

:r filename 可以把文件的内容读入到当前的编辑的缓冲区
:r! {cmd} 运行命令,并且把结果插入到缓冲区

写文件

:w !sudo tee % 当你修改完一个文件却发现需要root 权限的时候使用这条命令
:wa[ll] 保存缓冲区所有的文件
:w[rite] 把缓冲区写入磁盘
:qa[ll] 关闭所有的窗口,放弃修改
:e[dit]! 把磁盘文件读入缓冲区即回滚所作操作

hideen

如果我们已经修改了一个缓冲区,然后想要next到下一个缓冲区的话,你就需要保存
已经修改的缓冲区,不然next会报错的,但是启动hidden选择之后,就可以不用考虑
这个问题,在最后使用 :wall 就可以了。
:set hidden ,设置hidden选项
:set nohidden ,设置hidden选项
:set hidden? ,查看hidden选项