日期:2022年7月2日标签:Developer

vim 使用技巧 #

下面的命令是我常用的一些快捷键操作,我使用的编辑器是 vscode,安装了 vim 插件。

如何在 vscode 中使用 vim?可以看看我的 vscode 配置

光标移动 #

  • hjkl:左下上右
  • gjgk:移动至下一个或者上一个物理行,当一行出现 linewrap 时,使用 jk 并不能按照视觉看到的一行进行移动
  • {:跳转至向上寻找的第一个段落首部的前一行
  • }:跳转至向下寻找的第一个段落尾部的后一行
  • (:跳转至向上寻找的第一个段落首部的所在行
  • ):跳转至向下寻找的第一个段落尾部的所在行
  • w:下一个单词开头
  • b:上一个单词开头
  • e:下一个单词结尾
  • ge:上一个单词结尾
  • gg:跳转到第一行
  • G:跳转到最后一行
  • <number> + gg:跳转到第 number 行
  • :<number>:跳转到第 number 行
  • %:匹配对应括号,并进行跳转
  • *#:匹配当前光标所在的单词,移动光标到下一个或上一个

fFtT,行内光标跳转 #

  • f:当前行跳转到光标后的指定字符,按 ; 跳转到下一个指定字符
  • F:当前行跳转到光标前的指定字符,按 ; 跳转到下一个指定字符
  • t:当前行跳转到光标后的指定字符前的一个字符,按 ; 跳转到下一个指定字符前一个字符
  • T:当前行跳转到光标前的指定字符后的一个字符,按 ; 跳转到下一个指定字符后一个字符

一般,我只用 fF

模式切换 #

v:normal 模式进入 visual 模式 V: normal 模式进入 visual 模式,并选中当前行 i: normal 模式进入 insert 模式,光标出现在当前选中字符前 I: normal 模式进入 insert 模式,光标出现在行首 a: normal 模式进入 insert 模式,光标出现在当前选中字符后 A: normal 模式进入 insert 模式,光标出现在行尾 esc: 从 visual 和 insert 模式退回到 normal 模式 o:在当前行下方插入一行,并进入 insert 模式 O:在当前行上方插入一行,并进入 insert 模式

插入、删除、复制、粘贴 #

在模式切换中已经包含了插入的相关快捷键。

  • gi:在上一个做出变化的地方进入插入模式
  • x:删除当前光标所在的字符
  • dd:删除当前行
  • cc:删除当前行,并进入 insert 模式
  • D:删除从当前光标至行尾的内容
  • C:删除从当前贯标至行尾的内容,并进入 insert 模式
  • yy:复制当前行
  • Y:与 yy 相同
  • yl:复制当前光标下的字符
  • yas:复制一个句子
  • yap:复制一个段落
  • p: 粘贴剪切板至光标后
  • P:粘贴剪切板至光标前
  • gP: 与 P 相同,只不过将光标置于粘贴内容的后面
  • gp: 与 p 相同,只不过将光标置于粘贴内容的后面
  • cw:删除从光标所在位置后到一个单词的结尾,并进入 insert 模式(同理可以用 dw 删除,但是不进入 insert 模式)
  • c$:删除从光标所在位置后到本行结尾,并进入 insert 模式(同理可以用 d$ 删除,但是不进入 insert 模式)
  • r:替换当前光标下的字符,按下 r,然后输入一个字符,用来替换当前字符
  • v + <select area> + <action>:可以使用 v 进入 visual 模式,然后选中区域,最后使用 ycdr 对选中区域进行操作。

<command><pos> 模式:<command> 可以是 ydc等,(可以用于光标跳转的一系列字符) 可以是 w(一个单词的结尾)、$(行尾)、^(行首第一个非空字符)、b(单词的开头)、0(行首) 等等。

<verbs><adjectives><objects> 模式:你可以将 operator(ydc)作为 verbs,count、a 和 i 作为 adjectives,移动(hjkl、w、$、^、b、0等)作为 objects,例如:

  • d3l: 删除光标右侧三个字符
  • dl:adjectives 可以省略,所以 dl 等价于 d1l
  • diw:删除光标下的单词不包括周围的空格

代码折叠 #

  • zc:折叠代码
  • zo: 展开代码
  • zM: 全部折叠
  • zR: 全部展开

窗口移动 #

(1)移动当前所在行的位置

  • zz:将当前光标所在行移动到窗口中间
  • zt: 将当前光标所在行移动到窗口顶部
  • zb: 将当前光标所在行移动到窗口底部

(2)行移动

  • ctrl + e:一行一行向下移动
  • ctrl + d:向下移动窗口显示行数的一半
  • ctrl + y: 一行一行向上移动
  • ctrl + u: 向上移动窗口显示行数的一半

分屏操作 #

(1)创建分屏

使用命令:

:split [file] 或者 :sp [file]:添加一个横屏 :vsplit [file] 或者 :vsp [file]:添加一个竖屏

使用快捷键:

ctrl + w s:以当前文件添加一个横屏 ctrl + w v:以当前文件添加一个竖屏

(2)分屏切换

ctrl + w <arrow> 或者 ctrl + w <hjkl> :将光标移动到指定方向的分屏

(3)关闭屏幕和分屏

:only:只保留当前分屏,关闭其他分屏 ctrl + w c:关闭当前窗口 ctrl + w q: 关闭当前窗口,若只有一个分屏,则退出 vim ctrl + w o: 关闭其他窗口

(4)增加屏幕高度

crtrl + w +:增加高度 ctrl + w -:减小高度

多光标操作(块操作) #

  1. 使用 ctrl + v 进入块操作
  2. 可以使用 hkjl$ 等来插入多光标和移动光标
  3. 使用 IA 进入编辑

同样可以使用 v 进入 visual 模式,选中一些行,然后按 A 在每行结尾插入光标进行编辑。

visual 模式下的格式化操作 #

v 进入 visual 模式,进入 visual 模式后,可以通过 hjkl 选中一些行。可以对选中的行做如下操作。

  • J:把所有行连接起来变成一行
  • <>:左右缩进
  • =:自动缩进,格式化代码(非常 nice)

查找和替换 #

替换格式如下,支持正则表达式。

:[range]s/<pattern>/[string]/[flags] [count]

该命令表示在 range 的每一行中搜索pattern,并将其替换为 stringcount是一个乘以命令的正整数。

(1)查找

  • /<pattern>:高亮查找到的内容
  • /\C<pattern>:大小写敏感
  • /\c<pattern>: 忽略大小写
  • /\<<pattern>\>: 整词匹配,注意这里前面是修饰符 \<,后面是修饰符 \>,两个组合表示整词匹配(whole word match)
  • *:向下查找当前光标下的 word
  • #:向上查找当前光标下的 word
  • n:跳转到下一个查找到的内容
  • :nohl:取消高亮

(2)当前行替换

:s/foo/bar/:替换当前行查到的第一个 foo,并将其替换为 bar :s/foo/bar/g:替换当前行查到的所有 foo,并将其替换为 bar

(3)全文件替换

:%s/foo/bar/:替换当前文件中所有行的第一个 foo,将它们替换为 bar :%s/foo/bar/g:替换当前文件中所有行的 foo,将它们替换为 bar

(4)c flag

:%s/foo/bar/gc使用 c 标记可以依次确认每个替换。会弹出 replace with foo(y/n/a/q/l)? 确认对话框,按 y 替换匹配项,或按 l 替换匹配项并退出。 按 n 跳过当前匹配,按 qEsc 退出替换。 a 选项替换匹配项和所有剩余匹配项。

(5)i flag 开启大小写敏感

:s/foo/bar/gc: foo 不会匹配 Foo

(6)指定查询范围

:3,10s/foo/bar/g:查询范围为第三行到第十行,将该范围内的 foo 替换为 bar :.,$s/foo/bar/:查询范围为当前行到最后一行,将该范围内的 foo 替换为 bar. 表示当前行,$ 表示最后一行 :.,+4s/foo/bar/g:查询范围为从当前行开始往下数四行(总共四行),将该范围内的 foo 替换为 bar. 表示当前行,+4 表示接下来的四行

start-end 模式 #

<start position><command><end position>

例如 0y$,表示拷贝当前行。

  • 0:先到行首
  • y: 从 <start position> 开始拷贝,这里是行首
  • $:表示一直拷贝到行尾

动作-范围-对象 #

<command><a | i | s><obj>

s 需要插件支持,vscode-vim 自带这个功能

a 表示 around,i 表示 inner,s 表示 surround,command 可以是 d c yobj 可以是引号、双引号、wtt 表示 tag,对 html 这种标记语言比较有用

  • diw:删除单词,不包括单词周围的符号,例如 " word ",光标在 w,删除后变成了 " "
  • daw:删除当前单词,包括周围的空白字符,例如 " word ",光标在 w,删除后变成了 ""
  • da": 删除双引号中间的内容,包括双引号本身,例如 " word ",光标在 w,删除后变成了 ``
  • di": 删除双引号中间的内容,不包括双引号本身,例如 " word ",光标在 w,删除后变成了 ""
  • ds":删除当前单词周围的双引号,例如 " word ",光标在 w,删除后变成了 w

如果把上面的 command d 换成 c,那么删除后会进入到插入模式。

s 对写 html 这种标记语言非常有用,例如将下面的 div 改成 p,可以使用 cstt,然后输入 pc 表示 change

<div>
    这是一个段落
</div>

Peek definition 和 go to definiton #

  • gh:类似于鼠标悬浮,会弹出定义窗口
  • gd:跳转到定义和引用

其他 #

  • :edit [file-path]:编辑已存在的文件或者新建一个文件

(完)

目录