Scj System Analyst

vim 常规操作

2016-07-09

本文旨在介绍 vim 的操作技巧,以便最大程度的提高编码效率。

Ubuntu 终端快捷键

这里我们会给出 Ubuntu 终端常用的快捷键。通常,我们会在终端下使用 vim,掌握这些终端快捷键可以节省多余操作,间接提高 vim 编程效率。

打开终端

  • 用户根目录下打开新的终端:Ctrl+Alt+T
  • 打开新的终端 tab 页:Ctrl+Shift+T

终端 tab 管理

  • 跳转到指定编号的 tab(1-9)页: Alt + 1Alt + 2
  • 前一个/后一个 tab 页:ctrl + pageUpctrl + pageDown
  • 关闭 tab 页:Ctrl+Shift+w
  • 全屏:F11
  • 独立屏幕之间切换:Alt+Tab
  • 左移右移标签页:Shift+Ctrl+PgUp/PgDn
  • 清除屏幕文字:Ctrl+L
  • 搜索:~Ctrl+Shift+F`
  • 屏幕向上/下滚动:Shift+PgUp/PgDn
  • 暂停屏幕输出:Ctrl+S
  • 继续屏幕输出:Ctrl+Q

编辑

  • 复制:Shift+Ctrl+C
  • 粘贴:Shift+Ctrl+V
  • 移动到行首:CTRL + A
  • 移动到行末:CTRL + E
  • 在输入历史中搜索:CTRL + R + 文本
  • 向上显示缓存命令:Ctrl+p
  • 终止当前任务:Ctrl+C
  • 把当前任务放到后台运行(相当于运行命令时后面加&): Ctrl+Z
  • 显示后台运行的任务: fg
  • 向下显示缓存命令:Ctrl+n
  • 删除此处至末尾的所有内容:Ctrl+k
  • 删除此处至开始的所有内容:Ctrl+u
  • 删除此处到左边的单词:Ctrl+w
  • 删除当前字符:Ctrl+d
  • 删除当前字符前一个字符:Ctrl+h
  • 向回移动光标:Ctrl+b
  • 向前移动光标:Ctrl+f
  • 恢复删除的内容:Ctrl+&

vim 高效率操作

掌握常用的 vim 技巧可以大大减少鼠标的使用,从而使十指保持在主键盘上,减少切换的频率,最终提升编码效率,同时减少精力损耗。

模式

普通模式

修改

  • i: 在光标前插入;一个小技巧:按 8,再按 i,进入插入模式,输入 =, 按 esc 进入命令模式,就会出现8个=。 这在插入分割线时非常有用,如30i+就插入了36个+组成的分割线。
  • I: 在当前行第一个非空字符前插入;
  • gI: 在当前行第一列插入;
  • a: 在光标后插入;
  • A: 在当前行最后插入;
  • o: 在下面新建一行插入;
  • O: 在上面新建一行插入;
  • c[n]w: 改写光标后1(n)个词。
  • c[n]l: 改写光标后n个字母。
  • c[n]h: 改写光标前n个字母。
  • [n]cc: 修改当前[n]行。
  • [n]s: 以输入的文本替代光标之后1(n)个字符,相当于c[n]l。
  • [n]S: 删除指定数目的行,并以所输入文本代替之。
  • r: 替换光标处的字符,同样支持汉字。
  • R: 进入替换模式,按esc回到正常模式。
  • ~: 反转光标所在字符的大小写

注意,类似 cnw,dnw,ynw 的形式同样可以写为 ncw,ndw,nyw

删除

  • [n]x: 剪切光标右边n个字符,相当于 d[n]l。
  • [n]X: 剪切光标左边n个字符,相当于 d[n]h。
  • d: 删除(剪切)在可视模式下选中的文本。
  • d$ or D: 删除(剪切)当前位置到行尾的内容。
  • d[n]w: 删除(剪切)1(n)个单词(注意,大写W规定以空格分割的词,而小写可以为其他)
  • d[n]l: 删除(剪切)光标右边1(n)个字符。
  • d[n]h: 删除(剪切)光标左边1(n)个字符。
  • d0: 删除(剪切)当前位置到行首的内容
  • [n] dd: 删除(剪切)1(n)行。
  • :m,nd 剪切m行到n行的内容。
  • d1Gdgg: 剪切光标以上的所有行。
  • dG: 剪切光标以下的所有行。
  • dawdas:剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系。
  • d/f<cr>:这是一个比较高级的组合命令,它将删除当前位置 到下一个 f 之间的内容。
  • dt+定位符:一直删除到该行的定位符处
  • Ctrl+r:撤销
  • 有时候可以把诸如空格替换成制表符,借助 Excel 删除不需要的列

选择

  • shift+v:行选模式:
  • i{:选中光标所在中括号之间所有内容,不包括中括号
  • i: 选中分词符(一般为空格,除非特别指明)内的所有内容
  • a: 选中包括分词符(一般为空格,除非特别指明)在内的所有内容
  • a{:选中光标所在中括号之间所有内容,包括中括号
  • ib / i(:选中光标所在小括号之间所有内容,不包括小括号
  • ab / a(:选中光标所在小括号之间所有内容,包括小括号

以上可以和 y、c、d 等结合实现快速复制、修改、删除功能

复制

  • y: 复制在可视模式下选中的文本。
  • yy or Y: 复制整行文本。
  • y[n]w: 复制一(n)个词。y[n]l: 复制光标右边 1(n) 个字符。y[n]h: 复制光标左边1(n)个字符。
  • y$: 从光标当前位置复制到行尾。
  • y0: 从光标当前位置复制到行首。
  • :m,ny<cr> 复制m行到n行的内容。
  • ygg: 复制光标以上的所有行。
  • yG: 复制光标以下的所有行。
  • yawyas:复制一个词和复制一个句子,即使光标不在词首和句首也没关系。

粘贴

  • p: 在光标之后粘贴。
  • P: 在光标之前粘贴。
  • "+y: 复制到系统剪切板
  • "+p: 从系统剪切板中粘贴,
  • 命令行或插入模式下 Ctrl+r+寄存器符号 可粘贴相应寄存器中的内容:如可以使用 yiw 复制内容,然后在命令行中使用 Ctrl+r+0 粘贴

移动

  • ctrl+f: 下翻一屏。
  • ctrl+b: 上翻一屏。
  • ctrl+d: 下翻半屏。
  • ctrl+u: 上翻半屏。
  • M: 移动到屏幕的中间行
  • H: 移动到屏幕首行
  • L: 移动到屏幕的末行
  • nH: 移动到屏幕首行下面的第n行
  • nL: 移动到屏幕末上上面的第n行
  • 0nl: 表示先用命令 0 将光标移动到行首,nl 表示执行 n 次向右移动光标操作
  • n|: 表示使用 | 命令跳转到当前行的第 n 列
  • ta/fa: 移动到光标所之后第一个字符a处
  • Ta/Fa: 移动到光标所之前最后一个字符a处
  • zz: 将当前行移动到屏幕中央。
  • zt: 将当前行移动到屏幕顶端。
  • zb: 将当前行移动到屏幕底端。
  • gg: 移动到文件首行
  • G: 移动到文末
  • $: 从光标当前位置到行尾。
  • 0: 从光标当前位置到行首。
  • w: 从光标当前位置到词尾
  • gg: 从光标当前位置到页首
  • G: 从光标当前位置到页尾
  • H: 移动到起始点—-屏幕首行
  • M: 移动到屏幕的中间行
  • L: 移动到屏幕的末行
  • nH: 移动到屏幕首行下面的第n行
  • nL: 移动到屏幕末上上面的第n行
  • m{a-z}: 标记光标所在位置,局部标记,只用于当前文件。
  • m{A-Z}: 标记光标所在位置,全局标记。标记之后,退出 Vim, 重新启动,标记仍然有效。
  • '{a-z}: 移动到标记位置。
  • '{A-Z}: 移动到标记位置。

以上可以通过插件简单管理实现。

  • '': 移动到上次修改或编辑的地方
  • '.: 移动到最后修改的地方
  • Ctrl+iCtrl+oCtrl+t:快进或快退
  • ta: 移动到所在行之后第一个字符a前一字符
  • fa: 移动到所在行之后第一个字符a处
  • Ta: 移动到所在行之前最后一个字符a的后一个字符
  • Fa: 移动到所在行之前最后一个字符a处
  • 0nln|: 跳转到当前行的第 n 列
  • Ctrl+oCtrl+i: 很像浏览器上的 后退 和 前进
  • gd: 跳转到局部变量的定义处;
  • gD: 跳转到全局变量的定义处,从当前文件开头开始搜索;
  • g;: 上一个修改过的地方;
  • g,: 下一个修改过的地方;
  • [[: 跳转到上一个函数块开始,需要有单独一行的{。
  • ]]: 跳转到下一个函数块开始,需要有单独一行的{。
  • []: 跳转到上一个函数块结束,需要有单独一行的}。
  • ][: 跳转到下一个函数块结束,需要有单独一行的}。
  • [{: 跳转到当前块开始处;
  • ]}: 跳转到当前块结束处;
  • [/: 跳转到当前注释块开始处;
  • ]/: 跳转到当前注释块结束处;
  • %: 不仅能移动到匹配的 (), {} 或 [] 上,而且能在 #if,#else, #endif 之间跳跃。

查找

  • /something: 在后面的文本中查找something。
  • ?something: 在前面的文本中查找something。
  • /pattern/+number: 将光标停在包含pattern的行后面第number行上。
  • /pattern/-number: 将光标停在包含pattern的行前面第number行上。
  • f(或者F,t,T): 后面跟需要查找的字符。
  • % 可以搜索与之匹配的对应的()[]{}。这个功能对于书写程序特别有用。
  • n: 向后查找下一个。
  • N: 向前查找下一个。
  • *:buffer 内查找当前词
  • 在搜索命令中, .*[]^%/?~$这10个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠/。而/e表示<esc>;/t表示<tab>;/r表示<cr>;/b表示<bs>

折叠

  • zf – 创建折叠的命令,可以在一个可视区域上使用该命令;
  • zf ap – 折叠光标所在的段;
  • zf % – 折叠光标配对括号的部分,例如光标在{处,则折叠{}间的部分,对折叠函数很有用;
  • zd – 删除当前行的折叠;
  • zD – 删除当前行的折叠;
  • zo – 打开折叠的文本;
  • zc – 收起折叠;
  • za – 打开/关闭当前折叠;
  • zr – 打开嵌套的折行;
  • zm – 收起嵌套的折行;
  • zR (zO) – 打开所有折行;
  • zM (zC) – 收起所有折行;
  • zj – 跳到下一个折叠处;
  • zk – 跳到上一个折叠处;
  • [z 到当前打开的折叠的开始处。
  • ]z 到当前打开的折叠的末尾处。
  • zi – enable/disable fold;

缩进

  • << 向左缩进一个 shiftwidth
  • >> 向右缩进一个 shiftwidth
  • CTRL-T 插入模式下向右缩进
  • CTRL-D 插入模式下向左缩进
  • J 拼接当前行和下一行
  • gJJ ,不过合并后不留空格

撤销或重做

  • [n]u: 取消一(n)个改动。
  • :undolist – 你的撤销历史。
  • ctrl + r: 重做最后的改动。
  • g+: 转到较新的文本状态
  • U: 取消当前行中所有的改动。

v 模式(块模式 Ctrl+v 或 字符模式 v)

  • i{<[:选中括号中的所有内容
  • iw:选中一个单词
  • is:选中一个句子
  • ip:选中一个段落
  • o 光标移动到选中文本的另一结尾
  • O 光标移动到选中文本的另一角落
  • Uu:把选中的文本变为大写或小写。
  • gu(U) 接范围(如$,或G),可以把从光标当前位置到指定位置之间字母全部 转换成小写或大写。

命令模式(Esc+:)

  • :r filename 在当前位置插入另一个文件的内容。
  • :[n]r filename 在第n行插入另一个文件的内容。
  • :r !date 在光标处插入当前日期与时间。同理,:r !command可以将其它shell命令的输出插入当前文档。
  • 在普通模式下使用 yiw 复制,然后在命令模式下 Ctrl+r 然后输入 0 即可复制文本到 vim 命令行中
  • Ctrl-w: 向前删除一个单词。
  • Ctrl-h: 向前删除一个字符,等同于Backspace。
  • Ctrl-u: 从当前位置移动到命令行开头。
  • Ctrl-b: 移动到命令行开头。
  • Ctrl-e: 移动到命令行末尾。
  • Shift-Left: 左移一个单词。
  • Shift-Right: 右移一个单词。
  • @: 重复上一次的冒号命令。
  • :m,ny<cr> 复制m行到n行的内容。
  • :s/old/new - 用new(如果没有/new,则视为删除)替换当前行第一个old。
  • :s/old/new/g - 用new替换当前行所有的old。
  • :n1,n2s/old/new/g - 用new替换文件n1行到n2行所有的old。
  • :%s/old/new/g - 用new替换文件中所有的old。
  • :%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
  • :%s/$/xxx/g - 在每一行的行尾插入xxx,$表示行尾。
  • 所有替换命令末尾加上c,每个替换都将需要用户确认。
  • 加上i则忽略大小写
  • [range]g/pattern/command:例如 :%g/^ xyz/normal dd
  • :pwd 显示vim的工作目录。
  • :cd path 改变vim的工作目录。

插入模式(Esc+i)

  • Ctrl-h, Ctrl+w, Ctrl-u 具有删除功能
  • Ctrl-R {0-9a-z"%#*+:.~=}插入寄存器内容

补全菜单

  • Ctrl-p 向前切换成员;
  • Ctrl-n 向后切换成员;
  • Ctrl-e 退出下拉菜单,并退回到原来录入的文字;
  • Ctrl-y 退出下拉菜单,并接受当前选项。

行选模式(shift+v)

  • i{ :选中光标所在中括号之间所有内容,不包括中括号
  • a{ :选中光标所在中括号之间所有内容,包括中括号
  • ib / i(:选中光标所在小括号之间所有内容,不包括小括号
  • ab / a(:选中光标所在小括号之间所有内容,包括小括号

多文件或缓冲区

多缓冲区

  • :buffers:ls:files – 显示缓冲区列表。
  • ctrl+6:在最近两个缓冲区间切换。
  • :bn – 下一个缓冲区。
  • :bp – 上一个缓冲区。
  • :bl – 最后一个缓冲区。
  • :b[n]:[n]b – 切换到第n个缓冲区。
  • :nbw(ipeout) – 彻底删除第n个缓冲区。
  • :nbd(elete) – 删除第n个缓冲区,并未真正删除,还在unlisted列表中。
  • :ba[ll] – 把所有的缓冲区在当前页中打开,每个缓冲区占一个窗口。
  • :ls – //列出打开的文件,带编号

多标签页

  • 终端中 vim -p files: 打开多个文件,每个文件占用一个标签页。
  • :tabe, tabnew – 如果加文件名,就在新的标签中打开这个文件, 否则打开一个空缓冲区。
  • ^w gf – 在新的标签页里打开光标下路径指定的文件。
  • :tabn – 切换到下一个标签。Control + PageDown,也可以。
  • :tabp – 切换到上一个标签。Control + PageUp,也可以。
  • [n] gt – 切换到下一个标签。如果前面加了 n , 就切换到第n个标签。第一个标签的序号就是1。
  • :tab split – 将当前缓冲区的内容在新页签中打开。
  • :tabc[lose] – 关闭当前的标签页。
  • :tabo[nly] – 关闭其它的标签页。
  • :tabs – 列出所有的标签页和它们包含的窗口。
  • :tabm[ove] [N] – 移动标签页,移动到第N个标签页之后。 如 tabm 0 当前标签页,就会变成第一个标签页。
  • :q:close(暂时关闭窗口,其内容还存在缓存中)
  • 标准模式下:gt(可能被其他插件或映射占用) , gT 可以直接在 tab 之间切换。更多可以查看帮助 :help table , help -p

窗格分割

  • :split(:sp) – 把当前窗水平分割成两个窗口(两个窗口内容一致)。(CTRL-W s 或 CTRL-W CTRL-S) —注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续。
  • :split filename – 水平分割窗口,并在新窗口中显示另一个文件。
  • ctrl+w f –水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 。
  • C-w C-^ – 水平分割一个窗口,打开刚才编辑的文件。
  • :vsplit(:vsp) – 把当前窗口分割成水平分布的两个窗口。 (CTRL-W v或CTRL CTRL-V)

窗格关闭

  • :qall – 关闭所有窗口,退出vim。
  • :wall – 保存所有修改过的窗口。
  • :only – 只保留当前窗口,关闭其它窗口。(CTRL-W o)
  • :close – 关闭当前窗口,CTRL-W c/q 能实现同样的功能。 (象 :q :x同样工作 )

调整窗口大小

  • ctrl+w + –当前窗口增高一行。也可以用n增高n行。
  • ctrl+w - –当前窗口减小一行。也可以用n减小n行。
  • ctrl+w _–当前窗口扩展到尽可能的大。也可以用n设定行数。
  • :resize n – 当前窗口n行高。
  • ctrl+w = – 所有窗口同样高度。
  • n ctrl+w _ – 当前窗口的高度设定为n行。
  • ctrl+w < –当前窗口减少一列。也可以用n减少n列。
  • ctrl+w > –当前窗口增宽一列。也可以用n增宽n列。
  • ctrl+w | –当前窗口尽可能的宽。也可以用n设定列数。

切换和移动窗口

  • ctrl+w ctrl+w: 切换到下一个窗口。或者是ctrl+w w。
  • ctrl+w p: 切换到前一个窗口。
  • ctrl+w h(l,j,k):切换到左(右,下,上)的窗口。
  • ctrl+w t(b):切换到最上(下)面的窗口。
  • ctrl+w H(L,K,J): 将当前窗口移动到最左(右、上、下)面。
  • ctrl+w r:顺时针旋转窗口的位置。
  • ctrl+w R:逆时针旋转窗口的位置。
  • ctrl+w x:交换同列或同行的窗口的位置
  • ctrl+w T: 将当前的窗口移动到新的标签页上。

简便操作

重复操作(.)

We saw how the . command can be used to repeat the lasi changed. But the dot command won’t replay changes made from Vim’s command line. Instead, we can repeat the last Ex command by pressing @:

数字的增减

在编程中常常会为变量进行编号,通常很多行代码只是变量的编号不一样,而且这些编号一般是递增或递减或有相同间距等,那么我们 就可以使用yyp类似的命令进行复制,然后单独修改数字编号即可。对于修改编号有快速方法:定位到该编号,然后使用”数字+" (比如定位到0px处,nomal下输入180(注意指的是Ctrl+x),则0px就变成了-180px);

命令配合数字使用

vim 大部分命令都可以配合数字使用,但是为了充分利用.和u命令提高效率,建议:Don’t Count if you can repeat! (因为数字表示重复命令多少次,这数字是多少呢,会增加思考点数时间,同时不易使用u命令),所以更好的选择是使用 一次命令然后用.重复该命令,这样选择余地更大,使用u命令恢复更有选择性(比如你只需要恢复一个词语,但是你使用 了 d2w 命令删除了 2 个,那么你使用u命令则恢复了2个词语,那么你还得删除一个词语)。

【注意】本文属于作者原创,欢迎转载!转载时请注明以下内容:

(转载自)ShengChangJian's Blog编程技术文章地址:

https://ShengChangJian.github.io/2016/07/vim-skill.html

主页地址:https://shengchangjian.github.io/


上一篇: redis 杂谈

下一篇: jsp 基本知识

Comments

【目录】