vim操作汇总

不断更新,方便查阅

学习链接:

vim命令大全

http://blog.csdn.net/scaleqiao/article/details/45153379

vim命令小技巧

http://www.codeceo.com/article/useful-vim-command.html

 

 

vim编辑器操作命令大全-绝对全

1. 关于Vim

vim是我最喜欢的编辑器,也是linux下第二强大的编辑器。 虽然emacs是公认的世界第一,我认为使用emacs并没有使用vi进行编辑来得高效。 如果是初学vi,运行一下vimtutor是个聪明的决定。 (如果你的系统环境不是中文,而你想使用中文的vimtutor,就运行vimtutor zh)

1.1 Vim的几种模式

  • 正常模式:可以使用快捷键命令,或按:输入命令行。
  • 插入模式:可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。
  • 可视模式:正常模式下按v可以进入可视模式, 在可视模式下,移动光标可以选择文本。按V进入可视行模式, 总是整行整行的选中。ctrl+v进入可视块模式。
  • 替换模式:正常模式下,按R进入。

2. 启动Vim

  • vim -c cmd file: 在打开文件前,先执行指定的命令;
  • vim -r file: 恢复上次异常退出的文件;
  • vim -R file: 以只读的方式打开文件,但可以强制保存;
  • vim -M file: 以只读的方式打开文件,不可以强制保存;
  • vim -y num file: 将编辑窗口的大小设为num行;
  • vim + file: 从文件的末尾开始;
  • vim +num file: 从第num行开始;
  • vim +/string file: 打开file,并将光标停留在第一个找到的string上。
  • vim --remote file: 用已有的vim进程打开指定的文件。 如果你不想启用多个vim会话,这个很有用。但要注意, 如果你用vim,会寻找名叫VIM的服务器;如果你已经有一个gvim在运行了, 你可以用gvim --remote file在已有的gvim中打开文件。

3. 文档操作

  • :e file --关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi会警告。
  • :e! file --放弃对当前文件的修改,编辑新的文件。
  • :e+file -- 开始新的文件,并从文件尾开始编辑。
  • :e+n file -- 开始新的文件,并从第n行开始编辑。
  • :enew --编译一个未命名的新文档。(CTRL-W n)
  • :e -- 重新加载当前文档。
  • :e! -- 重新加载当前文档,并丢弃已做的改动。
  • :e#或ctrl+^ -- 回到刚才编辑的文件,很实用。
  • :f或ctrl+g -- 显示文档名,是否修改,和光标位置。
  • :f filename -- 改变编辑的文件名,这时再保存相当于另存为。
  • gf -- 打开以光标所在字符串为文件名的文件。
  • :w -- 保存修改。
  • :n1,n2w filename -- 选择性保存从某n1行到另n2行的内容。
  • :wq -- 保存并退出。
  • ZZ -- 保存并退出。
  • :x -- 保存并退出。
  • :q[uit] ——退出当前窗口。(CTRL-W q或CTRL-W CTRL-Q)
  • :saveas newfilename -- 另存为
  • :browse e -- 会打开一个文件浏览器让你选择要编辑的文件。 如果是终端中,则会打开netrw的文件浏览窗口; 如果是gvim,则会打开一个图形界面的浏览窗口。 实际上:browse后可以跟任何编辑文档的命令,如sp等。 用browse打开的起始目录可以由browsedir来设置:
    • :set browsedir=last -- 用上次访问过的目录(默认);
    • :set browsedir=buffer -- 用当前文件所在目录;
    • :set browsedir=current -- 用当前工作目录;
  • :Sex -- 水平分割一个窗口,浏览文件系统;
  • :Vex -- 垂直分割一个窗口,浏览文件系统;

4. 光标的移动

4.1 基本移动

以下移动都是在normal模式下。

  • h或退格: 左移一个字符;
  • l或空格: 右移一个字符;
  • j: 下移一行;
  • k: 上移一行;
  • gj: 移动到一段内的下一行;
  • gk: 移动到一段内的上一行;
  • +或Enter: 把光标移至下一行第一个非空白字符。
  • -: 把光标移至上一行第一个非空白字符。
  • w: 前移一个单词,光标停在下一个单词开头;
  • W: 移动下一个单词开头,但忽略一些标点;
  • e: 前移一个单词,光标停在下一个单词末尾;
  • E: 移动到下一个单词末尾,如果词尾有标点,则移动到标点;
  • b: 后移一个单词,光标停在上一个单词开头;
  • B: 移动到上一个单词开头,忽略一些标点;
  • ge: 后移一个单词,光标停在上一个单词末尾;
  • gE: 同 ge ,不过‘单词’包含单词相邻的标点。
  • (: 前移1句。
  • ): 后移1句。
  • {: 前移1段。
  • }: 后移1段。
  • fc: 把光标移到同一行的下一个c字符处
  • Fc: 把光标移到同一行的上一个c字符处
  • tc: 把光标移到同一行的下一个c字符前
  • Tc: 把光标移到同一行的上一个c字符后
  • ;: 配合f & t使用,重复一次
  • ,: 配合f & t使用,反向重复一次

上面的操作都可以配合n使用,比如在正常模式(下面会讲到)下输入3h, 则光标向左移动3个字符。

  • 0: 移动到行首。
  • g0: 移到光标所在屏幕行行首。
  • ^: 移动到本行第一个非空白字符。
  • g^: 同 ^ ,但是移动到当前屏幕行第一个非空字符处。
  • $: 移动到行尾。
  • g$: 移动光标所在屏幕行行尾。
  • n|: 把光标移到递n列上。
  • nG: 到文件第n行。
  • :n 移动到第n行。
  • :$ 移动到最后一行。
  • H: 把光标移到屏幕最顶端一行。
  • M: 把光标移到屏幕中间一行。
  • L: 把光标移到屏幕最底端一行。
  • gg: 到文件头部。
  • G: 到文件尾部。

4.2 翻屏

  • ctrl+f: 下翻一屏。
  • ctrl+b: 上翻一屏。
  • ctrl+d: 下翻半屏。
  • ctrl+u: 上翻半屏。
  • ctrl+e: 向下滚动一行。
  • ctrl+y: 向上滚动一行。
  • n%: 到文件n%的位置。
  • zz: 将当前行移动到屏幕中央。
  • zt: 将当前行移动到屏幕顶端。
  • zb: 将当前行移动到屏幕底端。

4.3 标记

使用标记可以快速移动。到达标记后,可以用Ctrl+o返回原来的位置。 Ctrl+o和Ctrl+i 很像浏览器上的 后退 和 前进 。

  • m{a-z}: 标记光标所在位置,局部标记,只用于当前文件。
  • m{A-Z}: 标记光标所在位置,全局标记。标记之后,退出Vim, 重新启动,标记仍然有效。
  • `{a-z}: 移动到标记位置。
  • '{a-z}: 移动到标记行的行首。
  • `{0-9}:回到上[2-10]次关闭vim时最后离开的位置。
  • ``: 移动到上次编辑的位置。''也可以,不过``精确到列,而''精确到行 。如果想跳转到更老的位置,可以按C-o,跳转到更新的位置用C-i。
  • `": 移动到上次离开的地方。
  • `.: 移动到最后改动的地方。
  • :marks 显示所有标记。
  • :delmarks a b -- 删除标记a和b。
  • :delmarks a-c -- 删除标记a、b和c。
  • :delmarks a c-f -- 删除标记a、c、d、e、f。
  • :delmarks! -- 删除当前缓冲区的所有标记。
  • :help mark-motions 查看更多关于mark的知识。

5. 插入文本

5.1 基本插入

  • i: 在光标前插入;一个小技巧:按8,再按i,进入插入模式,输入=, 按esc进入命令模式,就会出现8个=。 这在插入分割线时非常有用,如30i+就插入了36个+组成的分割线。
  • I: 在当前行第一个非空字符前插入;
  • gI: 在当前行第一列插入;
  • a: 在光标后插入;
  • A: 在当前行最后插入;
  • o: 在下面新建一行插入;
  • O: 在上面新建一行插入;
  • :r filename在当前位置插入另一个文件的内容。
  • :[n]r filename在第n行插入另一个文件的内容。
  • :r !date 在光标处插入当前日期与时间。同理,:r !command可以将其它shell命令的输出插入当前文档。

5.2 改写插入

  • 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: 删除指定数目的行,并以所输入文本代替之。

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

6. 剪切复制和寄存器

6.1 剪切和复制、粘贴

  • [n]x: 剪切光标右边n个字符,相当于d[n]l。
  • [n]X: 剪切光标左边n个字符,相当于d[n]h。
  • y: 复制在可视模式下选中的文本。
  • yy or Y: 复制整行文本。
  • y[n]w: 复制一(n)个词。
  • y[n]l: 复制光标右边1(n)个字符。
  • y[n]h: 复制光标左边1(n)个字符。
  • y$: 从光标当前位置复制到行尾。
  • y0: 从光标当前位置复制到行首。
  • :m,ny 复制m行到n行的内容。
  • y1G或ygg: 复制光标以上的所有行。
  • yG: 复制光标以下的所有行。
  • yaw和yas:复制一个词和复制一个句子,即使光标不在词首和句首也没关系。
  • d: 删除(剪切)在可视模式下选中的文本。
  • d$ or D: 删除(剪切)当前位置到行尾的内容。
  • d[n]w: 删除(剪切)1(n)个单词
  • d[n]l: 删除(剪切)光标右边1(n)个字符。
  • d[n]h: 删除(剪切)光标左边1(n)个字符。
  • d0: 删除(剪切)当前位置到行首的内容
  • [n] dd: 删除(剪切)1(n)行。
  • :m,nd 剪切m行到n行的内容。
  • d1G或dgg: 剪切光标以上的所有行。
  • dG: 剪切光标以下的所有行。
  • daw和das:剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系。
  • d/f:这是一个比较高级的组合命令,它将删除当前位置 到下一个f之间的内容。
  • p: 在光标之后粘贴。
  • P: 在光标之前粘贴。

6.2 文本对象

  • aw:一个词
  • as:一句。
  • ap:一段。
  • ab:一块(包含在圆括号中的)。

y, d, c, v都可以跟文本对象。

6.3 寄存器

  • a-z:都可以用作寄存器名。"ayy把当前行的内容放入a寄存器。
  • A-Z:用大写字母索引寄存器,可以在寄存器中追加内容。 如"Ayy把当前行的内容追加到a寄存器中。
  • :reg 显示所有寄存器的内容。
  • "":不加寄存器索引时,默认使用的寄存器。
  • "*:当前选择缓冲区,"*yy把当前行的内容放入当前选择缓冲区。
  • "+:系统剪贴板。"+yy把当前行的内容放入系统剪贴板。

7. 查找与替换

7.1 查找

  • /something: 在后面的文本中查找something。
  • ?something: 在前面的文本中查找something。
  • /pattern/+number: 将光标停在包含pattern的行后面第number行上。
  • /pattern/-number: 将光标停在包含pattern的行前面第number行上。
  • n: 向后查找下一个。
  • N: 向前查找下一个。

可以用grep或vimgrep查找一个模式都在哪些地方出现过,

其中:grep是调用外部的grep程序,而:vimgrep是vim自己的查找算法。

用法为: :vim[grep]/pattern/[g] [j] files

g的含义是如果一个模式在一行中多次出现,则这一行也在结果中多次出现。

j的含义是grep结束后,结果停在第j项,默认是停在第一项。

vimgrep前面可以加数字限定搜索结果的上限,如

:1vim/pattern/ % 只查找那个模式在本文件中的第一个出现。

 

其实vimgrep在读纯文本电子书时特别有用,可以生成导航的目录。

比如电子书中每一节的标题形式为:n. xxxx。你就可以这样:

:vim/^d{1,}./ %

然后用:cw或:copen查看结果,可以用C-w H把quickfix窗口移到左侧,

就更像个目录了。

7.2 替换

  • :s/old/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,每个替换都将需要用户确认。 如:%s/old/new/gc,加上i则忽略大小写(ignore)。

还有一种比替换更灵活的方式,它是匹配到某个模式后执行某种命令,

语法为 :[range]g/pattern/command

例如 :%g/^ xyz/normal dd。

表示对于以一个空格和xyz开头的行执行normal模式下的dd命令。

关于range的规定为:

  • 如果不指定range,则表示当前行。
  • m,n: 从m行到n行。
  • 0: 最开始一行(可能是这样)。
  • $: 最后一行
  • .: 当前行
  • %: 所有行

7.3 正则表达式

高级的查找替换就要用到正则表达式。

  • \d: 表示十进制数(我猜的)
  • \s: 表示空格
  • \S: 非空字符
  • \a: 英文字母
  • \|: 表示 或
  • \.: 表示.
  • {m,n}: 表示m到n个字符。这要和 \s与\a等连用,如 \a\{m,n} 表示m 到n个英文字母。
  • {m,}: 表示m到无限多个字符。
  • **: 当前目录下的所有子目录。

:help pattern得到更多帮助。


8. 排版

8.1 基本排版

  • << 向左缩进一个shiftwidth
  • >> 向右缩进一个shiftwidth
  • :ce(nter) 本行文字居中
  • :le(ft) 本行文字靠左
  • :ri(ght) 本行文字靠右
  • gq 对选中的文字重排,即对过长的文字进行断行
  • gqq 重排当前行
  • gqnq 重排n行
  • gqap 重排当前段
  • gqnap 重排n段
  • gqnj 重排当前行和下面n行
  • gqQ 重排当前段对文章末尾
  • J 拼接当前行和下一行
  • gJ 同 J ,不过合并后不留空格。

8.2 拼写检查

  • :set spell-开启拼写检查功能
  • :set nospell-关闭拼写检查功能
  • ]s-移到下一个拼写错误的单词
  • [s-作用与上一命令类似,但它是从相反方向进行搜索
  • z=-显示一个有关拼写错误单词的列表,可从中选择
  • zg-告诉拼写检查器该单词是拼写正确的
  • zw-与上一命令相反,告诉拼写检查器该单词是拼写错误的

8.3 统计字数

g ^g可以统计文档字符数,行数。 将光标放在最后一个字符上,用字符数减去行数可以粗略统计中文文档的字数。 以上对 Mac 或 Unix 的文件格式适用。 如果是 Windows 文件格式(即换行符有两个字节),字数的统计方法为: 字符数 - 行数 * 2。


9. 编辑多个文件

9.1 一次编辑多个文件

我们可以一次打开多个文件,如

vi a.txt b.txt c.txt
  • 使用:next(:n)编辑下一个文件。
  • :2n 编辑下2个文件。
  • 使用:previous或:N编辑上一个文件。
  • 使用:wnext,保存当前文件,并编辑下一个文件。
  • 使用:wprevious,保存当前文件,并编辑上一个文件。
  • 使用:args 显示文件列表。
  • :n filenames或:args filenames 指定新的文件列表。
  • vi -o filenames 在水平分割的多个窗口中编辑多个文件。
  • vi -O filenames 在垂直分割的多个窗口中编辑多个文件。

9.2 多标签编辑

  • 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 当前标签页,就会变成第一个标签页。

9.3 缓冲区

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

10. 分屏编辑

  • vim -o file1 file2:水平分割窗口,同时打开file1和file2
  • vim -O file1 file2:垂直分割窗口,同时打开file1和file2

10.1 水平分割

  • :split(:sp) -- 把当前窗水平分割成两个窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续。
  • :split filename -- 水平分割窗口,并在新窗口中显示另一个文件。
  • :nsplit(:nsp) -- 水平分割出一个n行高的窗口。
  • :[N]new -- 水平分割出一个N行高的窗口,并编辑一个新文件。 (CTRL-W n或 CTRL-W CTRL-N)
  • ctrl+w f --水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 。
  • C-w C-^ -- 水平分割一个窗口,打开刚才编辑的文件。

10.2 垂直分割

  • :vsplit(:vsp) -- 把当前窗口分割成水平分布的两个窗口。 (CTRL-W v或CTRL CTRL-V)
  • :[N]vne[w] -- 垂直分割出一个新窗口。
  • :vertical 水平分割的命令: 相应的垂直分割。

10.3 关闭子窗口

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

10.4 调整窗口大小

  • 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设定列数。

10.5 切换和移动窗口

如果支持鼠标,切换和调整子窗口的大小就简单了。

  • 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 T: 将当前的窗口移动到新的标签页上。

11. 快速编辑

11.1 改变大小写

  • ~: 反转光标所在字符的大小写。
  • 可视模式下的U或u:把选中的文本变为大写或小写。
  • gu(U)接范围(如$,或G),可以把从光标当前位置到指定位置之间字母全部 转换成小写或大写。如ggguG,就是把开头到最后一行之间的字母全部变为小 写。再如gu5j,把当前行和下面四行全部变成小写。

11.2 替换(normal模式)

  • r: 替换光标处的字符,同样支持汉字。
  • R: 进入替换模式,按esc回到正常模式。

11.3 撤消与重做(normal模式)

  • [n] u: 取消一(n)个改动。
  • :undo 5 -- 撤销5个改变。
  • :undolist -- 你的撤销历史。
  • ctrl + r: 重做最后的改动。
  • U: 取消当前行中所有的改动。
  • :earlier 4m -- 回到4分钟前
  • :later 55s -- 前进55秒

11.4 宏

  • . --重复上一个编辑动作
  • qa:开始录制宏a(键盘操作记录)
  • q:停止录制
  • @a:播放宏a

12. 编辑特殊文件

12.1 文件加解密

  • vim -x file: 开始编辑一个加密的文件。
  • :X -- 为当前文件设置密码。
  • :set key= -- 去除文件的密码。

这里是 滇狐总结的比较高级的vi技巧。

12.2 文件的编码

  • :e ++enc=utf8 filename, 让vim用utf-8的编码打开这个文件。
  • :w ++enc=gbk,不管当前文件什么编码,把它转存成gbk编码。
  • :set fenc或:set fileencoding,查看当前文件的编码。
  • 在vimrc中添加set fileencoding=ucs-bom,utf-8,cp936,vim会根据要打开的文件选择合适的编码。 注意:编码之间不要留空格。 cp936对应于gbk编码。 ucs-bom对应于windows下的文件格式。

让vim 正确处理文件格式和文件编码,有赖于 ~/.vimrc的正确配置

12.3 文件格式

大致有三种文件格式:unix, dos, mac. 三种格式的区别主要在于回车键的编码:dos 下是回车加换行,unix 下只有 换行符,mac 下只有回车符。

  • :e ++ff=dos filename, 让vim用dos格式打开这个文件。
  • :w ++ff=mac filename, 以mac格式存储这个文件。
  • :set ff,显示当前文件的格式。
  • 在vimrc中添加set fileformats=unix,dos,mac,让vim自动识别文件格式。

13. 编程辅助

13.1 一些按键

  • gd: 跳转到局部变量的定义处;
  • gD: 跳转到全局变量的定义处,从当前文件开头开始搜索;
  • g;: 上一个修改过的地方;
  • g,: 下一个修改过的地方;
  • [[: 跳转到上一个函数块开始,需要有单独一行的{。
  • ]]: 跳转到下一个函数块开始,需要有单独一行的{。
  • []: 跳转到上一个函数块结束,需要有单独一行的}。
  • ][: 跳转到下一个函数块结束,需要有单独一行的}。
  • [{: 跳转到当前块开始处;
  • ]}: 跳转到当前块结束处;
  • [/: 跳转到当前注释块开始处;
  • ]/: 跳转到当前注释块结束处;
  • %: 不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃。

下面的括号匹配对编程很实用的。

  • ci', di', yi':修改、剪切或复制'之间的内容。
  • ca', da', ya':修改、剪切或复制'之间的内容,包含'。
  • ci", di", yi":修改、剪切或复制"之间的内容。
  • ca", da", ya":修改、剪切或复制"之间的内容,包含"。
  • ci(, di(, yi(:修改、剪切或复制()之间的内容。
  • ca(, da(, ya(:修改、剪切或复制()之间的内容,包含()。
  • ci[, di[, yi[:修改、剪切或复制[]之间的内容。
  • ca[, da[, ya[:修改、剪切或复制[]之间的内容,包含[]。
  • ci{, di{, yi{:修改、剪切或复制{}之间的内容。
  • ca{, da{, ya{:修改、剪切或复制{}之间的内容,包含{}。
  • ci<, di<, yi<:修改、剪切或复制<>之间的内容。
  • ca<, da<, ya<:修改、剪切或复制<>之间的内容,包含<>。

13.2 ctags

  • ctags -R: 生成tag文件,-R表示也为子目录中的文件生成tags
  • :set tags=path/tags -- 告诉ctags使用哪个tag文件
  • :tag xyz -- 跳到xyz的定义处,或者将光标放在xyz上按C-],返回用C-t
  • :stag xyz -- 用分割的窗口显示xyz的定义,或者C-w ], 如果用C-w n ],就会打开一个n行高的窗口
  • :ptag xyz -- 在预览窗口中打开xyz的定义,热键是C-w }。
  • :pclose -- 关闭预览窗口。热键是C-w z。
  • :pedit abc.h -- 在预览窗口中编辑abc.h
  • :psearch abc -- 搜索当前文件和当前文件include的文件,显示包含abc的行。

有时一个tag可能有多个匹配,如函数重载,一个函数名就会有多个匹配。 这种情况会先跳转到第一个匹配处。

  • :[n]tnext -- 下一[n]个匹配。
  • :[n]tprev -- 上一[n]个匹配。
  • :tfirst -- 第一个匹配
  • :tlast -- 最后一个匹配
  • :tselect tagname -- 打开选择列表

tab键补齐

  • :tag xyz -- 补齐以xyz开头的tag名,继续按tab键,会显示其他的。
  • :tag /xyz -- 会用名字中含有xyz的tag名补全。

13.3 cscope

  • cscope -Rbq: 生成cscope.out文件
  • :cs add /path/to/cscope.out /your/work/dir
  • :cs find c func -- 查找func在哪些地方被调用
  • :cw -- 打开quickfix窗口查看结果

13.4 gtags

Gtags综合了ctags和cscope的功能。 使用Gtags之前,你需要安装GNU Gtags。 然后在工程目录运行 gtags 。

  • :Gtags funcname 定位到 funcname 的定义处。
  • :Gtags -r funcname 查询 funcname被引用的地方。
  • :Gtags -s symbol 定位 symbol 出现的地方。
  • :Gtags -g string Goto string 出现的地方。 :Gtags -gi string 忽略大小写。
  • :Gtags -f filename 显示 filename 中的函数列表。 你可以用 :Gtags -f % 显示当前文件。
  • :Gtags -P pattern 显示路径中包含特定模式的文件。 如 :Gtags -P .h$ 显示所有头文件, :Gtags -P /vm/ 显示vm目录下的文件。

13.5 编译

vim提供了:make来编译程序,默认调用的是make, 如果你当前目录下有makefile,简单地:make即可。

如果你没有make程序,你可以通过配置makeprg选项来更改make调用的程序。 如果你只有一个abc.java文件,你可以这样设置:

set makeprg=javac\ abc.java

然后:make即可。如果程序有错,可以通过quickfix窗口查看错误。 不过如果要正确定位错误,需要设置好errorformat,让vim识别错误信息。 如:

:setl efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#

%f表示文件名,%l表示行号, %m表示错误信息,其它的还不能理解。 请参考 :help errorformat。

13.6 快速修改窗口

其实是quickfix插件提供的功能, 对编译调试程序非常有用 :)

  • :copen -- 打开快速修改窗口。
  • :cclose -- 关闭快速修改窗口。

快速修改窗口在make程序时非常有用,当make之后:

  • :cl -- 在快速修改窗口中列出错误。
  • :cn -- 定位到下一个错误。
  • :cp -- 定位到上一个错误。
  • :cr -- 定位到第一个错误。

13.7 自动补全

  • C-x C-s -- 拼写建议。
  • C-x C-v -- 补全vim选项和命令。
  • C-x C-l -- 整行补全。
  • C-x C-f -- 自动补全文件路径。弹出菜单后,按C-f循环选择,当然也可以按 C-n和C-p。
  • C-x C-p 和C-x C-n -- 用文档中出现过的单词补全当前的词。 直接按C-p和C-n也可以。
  • C-x C-o -- 编程时可以补全关键字和函数名啊。
  • C-x C-i -- 根据头文件内关键字补全。
  • C-x C-d -- 补全宏定义。
  • C-x C-n -- 按缓冲区中出现过的关键字补全。 直接按C-n或C-p即可。

当弹出补全菜单后:

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

13.8 多行缩进缩出

  • 正常模式下,按两下>;光标所在行会缩进。
  • 如果先按了n,再按两下>;,光标以下的n行会缩进。
  • 对应的,按两下<;,光标所在行会缩出。
  • 如果在编辑代码文件,可以用=进行调整。
  • 在可视模式下,选择要调整的代码块,按=,代码会按书写规则缩排好。
  • 或者n =,调整n行代码的缩排。

13.9 折叠

  • zf -- 创建折叠的命令,可以在一个可视区域上使用该命令;
  • zd -- 删除当前行的折叠;
  • zD -- 删除当前行的折叠;
  • zfap -- 折叠光标所在的段;
  • zo -- 打开折叠的文本;
  • zc -- 收起折叠;
  • za -- 打开/关闭当前折叠;
  • zr -- 打开嵌套的折行;
  • zm -- 收起嵌套的折行;
  • zR (zO) -- 打开所有折行;
  • zM (zC) -- 收起所有折行;
  • zj -- 跳到下一个折叠处;
  • zk -- 跳到上一个折叠处;
  • zi -- enable/disable fold;

14. 命令行

normal模式下按:进入命令行模式

14.1 命令行模式下的快捷键:

  • 上下方向键:上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令。
  • 左右方向键:左/右移一个字符。
  • C-w: 向前删除一个单词。
  • C-h: 向前删除一个字符,等同于Backspace。
  • C-u: 从当前位置移动到命令行开头。
  • C-b: 移动到命令行开头。
  • C-e: 移动到命令行末尾。
  • Shift-Left: 左移一个单词。
  • Shift-Right: 右移一个单词。
  • @: 重复上一次的冒号命令。
  • q: 正常模式下,q然后按':',打开命令行历史缓冲区, 可以像编辑文件一样编辑命令。
  • q/和q? 可以打开查找历史记录。

14.2 执行外部命令

  • :! cmd 执行外部命令。
  • :!! 执行上一次的外部命令。
  • :sh 调用shell,用exit返回vim。
  • :r !cmd 将命令的返回结果插入文件当前位置。
  • :m,nw !cmd 将文件的m行到n行之间的内容做为命令输入执行命令。

15. 其它

15.1 工作目录

  • :pwd 显示vim的工作目录。
  • :cd path 改变vim的工作目录。
  • :set autochdir 可以让vim 根据编辑的文件自动切换工作目录。

15.2 一些快捷键(收集中)

  • K: 打开光标所在词的manpage。
  • *: 向下搜索光标所在词。
  • g*: 同上,但部分符合即可。
  • #: 向上搜索光标所在词。
  • g#: 同上,但部分符合即可。
  • g C-g: 统计全文或统计部分的字数。

15.3 在线帮助

  • :h(elp)或F1 打开总的帮助。
  • :help user-manual 打开用户手册。
  • 命令帮助的格式为:第一行指明怎么使用那个命令; 然后是缩进的一段解释这个命令的作用,然后是进一步的信息。
  • :helptags somepath 为somepath中的文档生成索引。
  • :helpgrep 可以搜索整个帮助文档,匹配的列表显示在quickfix窗口中。
  • Ctrl+] 跳转到tag主题,Ctrl+t 跳回。
  • :ver 显示版本信息。

15.4 一些小功能

  • 简单计算器: 在插入模式下,输入C-r =,然后输入表达式,就能在 光标处得到计算结果。

vim命令小技巧

保存文件并退出

 

说起来有些惭愧,我也是最近才学到这个命令

: x

和下面的命令是等价的:

: wq

都是保存当前文件并退出。

(译者注:这两个命令实际上并不完全等价,当文件被修改时两个命令时相同的。但如果未被修改,使用 : x 不会更改文件的修改时间,而使用 :wq 会改变文件的修改时间。)

基本计算器

在插入模式下,你可以使用 Ctrl+r 键然后输入 =,再输入一个简单的算式。按 Enter 键,计算结果就会插入到文件中。例如,尝试输入:

Ctrl+r '=2+2' ENTER

然后计算结果“4 ”会被插入到文件中。

查找重复的连续的单词

当你很快地打字时,很有可能会连续输入同一个单词两次,就像 this this。这种错误可能骗过任何一个人,即使是你自己重新阅读一遍也不可避免。幸运的是,有一个简单的正则表达式可以用来预防这个错误。使用搜索命令(默认是 /)然后输入:

微博桌面截图_20150306094004

这会显示所有重复的单词。要达到最好的效果,不要忘记把下面的命令:

set hlsearch

放到你的 .vimrc 文件中高亮所有的匹配。

缩写

一个很可能是最令人印象深刻的窍门是你可以在 Vim 中定义缩写,它可以实时地把你输入的东西替换为另外的东西。语法格式如下:

:ab [缩写] [要替换的文字]

一个通用的例子是:

:ab asap as soon as possible

会把你输入的 “asap” 替换为 “as soon as possible”。

在你忘记用 root 方式打开文件时的文件保存

这可能是一个在论坛中一直受欢迎的命令。每当你打开一个你没有写入权限的文件(比如系统配置文件)并做了一些修改,Vim 无法通过普通的 “:w” 命令来保存。

你不需要重新以 root 方式打开文件再进行修改,只需要运行:

:w !sudo tee %

这会直接以 root 方式保存。

实时加密文本

如果你不想让别人看懂你的屏幕上的内容,你可以使用一个内置的选项,通过下面的命令使用 ROT13来对文本进行编码:

ggVGg?

gg 把光标移动到 Vim 缓冲区的第一行,V 进入可视模式,G 把光标移动到缓冲区的最后一行。因此,ggVG 使可视模式覆盖这个当前缓冲区。最后 g? 使用 ROT13 对整个区域进行编码。

注意它可以被映射到一个最常使用的键。它对字母符号也可以很好地工作。要对它进行撤销,最好的方法就是使用撤销命令:u。

自动补全

这是另外一个令我感到惭愧的功能,但我发现周围很多人并不知道。Vim 默认有自动补全的功能。的确这个功能是很基本的,并且可以通过插件来增强,但它也很有帮助。方法很简单。Vim 尝试通过已经输入的单词来预测单词的结尾。比如当你在同一个文件中第二次输入 “compiler” 时,仅仅输入 “com” 然后保持在插入模式,按 Ctrl+n 键就可以看到 Vim 为你补全了单词。很简单,但也很有用。

比较两个文件的不同

你们中的大多数很可能都知道 vimdiff 命令,它可以使用分离模式打开 Vim 并比较两个文件的不同。语法如下:

$ vimdiff [文件1] [文件2]

但同样的结果也可以通过下面的 Vim 命令来获得:

:diffthis

首先在 Vim 中打开原始文件。然后使用分离模式带来第二个文件:

:vsp [文件2]

最后在第一个缓冲区里输入:

:diffthis

通过 Ctrl+w 来切换缓冲区并再次输入:

:diffthis

这样两个文件中不同的部分就会被高亮。

(译者注:可以直接在一个缓冲区里使用命令 :windo diffthis,而不用输入 :diffthis 两次)

要停止比较,使用:

:diffoff

按时间回退文件

Vim 会记录文件的更改,你很容易可以回退到之前某个时间。该命令是相当直观的。比如:

:earlier 1m

会把文件回退到 1 分钟以前的状态。

注意,你可以使用下面的命令进行相反的转换:

:later

删除标记内部的文字

当我开始使用 Vim 时,一件我总是想很方便做的事情是如何轻松的删除方括号或圆括号里的内容。转到开始的标记,然后使用下面的语法:

di[标记]

比如,把光标放在开始的圆括号上,使用下面的命令来删除圆括号内的文字:

di(

如果是方括号或者是引号,则使用:

di{

和:

di"

删除指定标记前的内容

和删除标记内部有些相似,但目的不同。命令如下:

dt[标记]

会删除所有光标和标记之间的内容(保持标记不动),如果在同一行有这个标记的话。例如

dt.

会删除至句子的末尾,但保持 ‘.’ 不动。

把 Vim 变为十六进制编辑器

这不是我最喜欢的窍门,但有时会很有趣。你可以把 Vim 和 xxd 功能连起来来把文件转换为十六进制模式。命令如下:

:%!xxd

类似的,你可以通过下面的命令恢复原来的状态:

:%!xxd -r

把光标下的文字置于屏幕中央

我们所要做的事情如标题所示。如果你想强制滚动屏幕来把光标下的文字置于屏幕的中央,在可视模式中使用命令(译者注:在普通模式中也可以):

zz

跳到上一个/下一个位置

当你编辑一个很大的文件时,经常要做的事是在某处进行修改,然后跳到另外一处。如果你想跳回之前修改的地方,使用命令:

Ctrl+o

来回到之前修改的地方

类似的:

Ctrl+i

会回退上面的跳动。

把当前文件转化为网页

这会生成一个 HTML 文件来显示文本,并在分开的窗口显示源代码:

:%TOhtml

 

 

一. 移动:
    h,j,k,l: 左,下,上,右。
    w: 下一个词的词首。
    e:下一个词的词尾。
    b:上一个词的词首。
    <>: v 模式选中后进行缩进。
二. 跳转:
    %: 可以匹配{},"",(),[]之间跳转。
    H、M、L:直接跳转到当前屏幕的顶部、中部、底部。
    #H:跳转到当前屏的第#行。
    #L:跳转到当前屏的倒数第#行。
    zt: 当前编辑行置为屏顶。
    zz: 当前编辑行置为屏中。
    zb: 当前编辑行置为屏底。
    G:直接跳转到文件的底部。
    gg: 跳转到文件首。
    ():跳转到当前的行首、行尾。
    {}:向上、向下跳转到最近的空行。
    [{:跳转到目前区块开头。
    ]}:跳转到目前区块结尾。
    0: 跳转到行首。
    $: 跳转到行尾。
    2$: 跳转到下一行的行尾。
    #:跳转到该行的第#个位置。
    #G: 15G,跳转到15行。
    :#:跳转到#行。
    f'n':跳转到下一个"n"字母后。
    ctrl+b: 向后翻一页。
    ctrl+f:向前翻一页。
    ctrl+u: 向后翻半页。
    ctrl+d: 向前翻半页。
    ctry+e: 下滚一行。

三. 选择:
    1.V: 选择一行。
    2.^V: 矩形选择。
    3.v3w: 选择三个字符。  
四. 编辑:
    1. 新增:
        i: 光标前插入。
        I: 在当前行首插入。
        a: 光标后插入。
        A: 当前行尾插入。
        O: 在当前行之前插入新行。
        o: 在当前行之后插入新行。
    2. 修改 c(change) 为主:
        r: 替换光标所在处的字符。
        R:替换光标所到之处的字符。
        cw: 更改光标所在处的字到字尾处。
        c#w: c3w 修改3个字符。
        C:修改到行尾。
        ci':修改配对标点符号中的文本内容。
        di':删除配对标点符号中的文本内容。
        yi':复制配对标点符号中的文本内容。
        vi':选中配对标点符号中的文本内容。
        s:替换当前一个光标所处字符。
        #S:删除 # 行,并以新文本代替。
    3. 删除 d(delete) 为主:
        D:删除到行尾。
        X: 每按一次,删除光标所在位置的前面一个字符。
        x: 每按一次,删除光标所在位置的后面一个字符。
        #x: 删除光标所在位置后面6个字符。
        d^: 删至行首。
        d$: 删至行尾。
        dd:(剪切)删除光标所在行。        
        dw: 删除一个单词/光标之后的单词剩余部分。
        d4w: 删除4个word。
        #dd: 从光标所在行开始删除#行。
        daB: 删除{}及其内的内容。
        diB: 删除{}中的内容。
        n1,n2 d:将n1,n2行之间的内容删除。
    4. 查找:
        /: 输入关键字,发现不是要找的,直接在按n,向后查找直到找到为止。
        ?: 输入关键字,发现不是要找的,直接在按n,向前查找直到找到为止。
        *: 在当前页向后查找同一字。
        #: 在当前页向前查找同一字。
    5. 复制 y(yank)为主:
        yw: 将光标所在之处到字尾的字符复制到缓冲区中。
        #yw: 复制#个字到缓冲区。
        Y:相当于yy, 复制整行。
        #yy:表示复制从光标所在的该行往下数#行文字。
        p: 粘贴。所有与y相关的操作必用p来结合粘贴。
        n1,n2 co n3:复制第n1行到第n2行之间的内容到第n3行后面。
    6. 大小写转换:
        gUU: 将当前行的字母改为大写。
        guu: 将当前行的字母改为小写。
        gUw: 将当前光标下的单词改为大写。
        guw: 将当前光标下的单词改为小写。
        a. 整篇大写:
        ggguG
        gg: 光标到文件第一个字符。
        gu: 把选择范围全部小写。
        G: 到文件结束。
        b. 整篇小写:gggUG
    7.  其它:
        J:当前行和下一行合并成一行。
    8.  移动:
        n1,n2 m n3:将n1行到n2行之间的内容移至n3行下。

五.退出:
     1. w filename: 保存正在编辑的文件filename
     2. wq filename: 保存后退出正在编辑的文件filename
     3. q:退出不保存。

六.窗口操作:
     1. ctrl+w p: 在两个分割窗口之间来回切换。
     2. ctrl+w j: 跳到下面的分割窗
     3. ctrl+w h: 跳到左边的分割窗。
     4. ctrl+w k: 跳到上面的分割窗。
     5. ctrl+w l: 跳到右边的分割窗。

 

撤销

在vi中按u可以撤销一次操作
u   撤销上一步的操作
Ctrl+r 恢复上一步被撤销的操作

 

如下摘自:http://www.cnblogs.com/chenlogin/p/6245958.html

 

Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,而 gVim 则是其 Windows 版。它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门变得困难,但上手之后键盘流的各种巧妙组合操作却能带来极为大幅的效率提升。因此 Vim 和现代的编辑器(如 Sublime Text)有着非常巨大的差异,而且入门学习曲线陡峭,需要记住很多按键组合和命令,如今被看作是高手、Geek们专用的编辑器。尽管 Vim 已经是古董级的软件,但还是有无数新人迎着困难去学习使用,可见其经典与受欢迎程度。另外,由于 Vim 的可配置性非常强,各种插件、语法高亮配色方案等多不胜数,无论作为代码编辑器或是文稿撰写工具都非常给力…… 

Vim 有以下几个模式:

  • 正常(normal)模式,缺省的编辑模式;下面如果不加特殊说明,提到的命令都直接在正常模式下输入;任何其它模式中都可以通过键盘上的 Esc 键回到正常模式。
  • 命令(command)模式,用于执行较长、较复杂的命令;在正常模式下输入“:”(一般命令)、“/”(正向搜索)或“?”(反向搜索)即可进入该模式;命令模式下的命令要输入回车键(Enter)才算完成。
  • 插入(insert)模式,输入文本时使用;在正常模式下键入“i”(insert)或“a”(append)即可进入插入模式(也有另外一些命令,如“c”,也可以进入插入模式,但这些命令有其它的作用)。
  • 可视(visual)模式,用于选定文本块;可以在正常模式下输入“v”(小写)来按字符选定,输入“V”(大写)来按行选定,或输入“Ctrl-V”来按方块选定。
  • 选择(select)模式,与普通的 Windows 编辑器较为接近的选择文本块的方式;在以可视模式和选择模式之一选定文本块之后,可以使用“Ctrl-G”切换到另一模式——该模式很少在 Linux 上使用

 

vim操作汇总_第1张图片

编辑-->输入:

    i: 在当前光标所在字符的前面,转为输入模式;
    a: 在当前光标所在字符的后面,转为输入模式;
    o: 在当前光标所在行的下方,新建一行,并转为输入模式;
    I:在当前光标所在行的行首,转换为输入模式
    A:在当前光标所在行的行尾,转换为输入模式
    O:在当前光标所在行的上方,新建一行,并转为输入模式;

输入-->编辑:

    ESC

编辑-->末行:

    :

末行-->编辑:

ESC, ESC

注:输入模式和末行模式之间不能直接切换,默认处于编辑模式 

关闭文件

末行模式关闭文件

:q  退出
:wq 保存并退出
:q! 不保存并退出
:w 保存
:w! 强行保存
:wq --> :x

编辑模式下退出

ZZ: 保存并退出
使用vim编辑多个文件

复制代码

vim FILE1 FILE2 FILE3
:next 切换至下一个文件
:prev 切换至前一个文件
:last 切换至最后一个文件
:first 切换至第一个文件
:q退出当前文件
:qa 全部退出

复制代码

yy|2yy 复制行
dd|2dd 删除、剪切行
p粘贴到下一行
P粘贴到上一行
^|$定位到行首,行尾
dG从当前行删到文档最后一行

复制代码

w 下一個word
W 下一個word(跳過標點符號)
b  前一個word
e  跳到目前word的尾端

0  跳到目前行的開頭
^ 跳到目前行第一個非空白字元
$  跳到行尾

/xxxx  搜尋xxxx
#  往前搜尋目前游標所在的字(word)
*  往後搜尋目前游標所在的字(word)
fx  在目前行往後搜尋字元x
gd  跳到目前游標所在的字(word)的定義位置

:split  分割視窗(可加檔名順便開啟另一檔案)
:diffsplit xxx  以分割視窗和檔案xxx做比較(diff)
Ctrl-W p  跳到前一個分割視窗(在兩個分割窗來回切換)
Ctrl-W j  跳到下面的分割窗
Ctrl-W h  跳到左邊的分割窗
Ctrl-W k  跳到上面的分割窗
Ctrl-W l  跳到右邊的分割窗

复制代码

vim操作汇总_第2张图片

 

 

  • 第一部份:一般模式可用的按钮说明,光标移动、复制贴上、搜寻取代等

 

移动光标的方法
h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
+ 光标移动到非空格符的下一列
- 光标移动到非空格符的上一列
n 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个档案的最后一行(常用)
nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
n n 为数字。光标向下移动 n 行(常用)
搜寻与取代
/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表『重复前一个搜寻的动作』。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:
『:100,200s/vbird/VBIRD/g』。(常用)
:1,$s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
:1,$s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
删除、复制与贴上
x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除游标所在的那一整列(常用)
ndd n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用)
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d$ 删除游标所在处,到该行的最后一个字符
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用)
y1G 复制游标所在列到第一列的所有数据
yG 复制游标所在列到最后一列的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J 将光标所在列与下一列的数据结合成同一列
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

 


  • 第二部份:一般模式切换到编辑模式的可用的按钮说明

 

进入插入或取代的编辑模式
i, I 进入插入模式(Insert mode):
i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个非空格符处开始插入』。 (常用)
a, A 进入插入模式(Insert mode):
a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在行的最后一个字符处开始插入』。(常用)
o, O 进入插入模式(Insert mode):
这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处插入新的一行』; O 为在目前光标所在处的上一行插入新的一行!(常用)
r, R 进入取代模式(Replace mode):
r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!
[Esc] 退出编辑模式,回到一般模式中(常用)

 


  • 第三部份:一般模式切换到指令列模式的可用的按钮说明

 

指令列的储存、离开等指令
:w 将编辑的数据写入硬盘档案中(常用)
:w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开!
:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
:! command 暂时离开 vi 到指令列模式下执行 command 的显示结果!例如
『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!
vim 环境的变更
:set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu 与 set nu 相反,为取消行号!

 

 

特别注意,在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前~那我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

OK!会这些指令就已经很厉害了,因为常用到的指令也只有不到一半!通常 vi 的指令除了上面鸟哥注明的常用的几个外,其他是不用背的,你可以做一张简单的指令表在你的屏幕墙上, 一有疑问可以马上的查询呦!这也是当初鸟哥使用 vim 的方法啦!

 

 

详见:https://coolshell.cn/articles/5426.html

 

 

vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的。下面的文章翻译自《Learn Vim Progressively》,我觉得这是给新手最好的VIM的升级教程了,没有列举所有的命令,只是列举了那些最有用的命令。非常不错。

——————————正文开始——————————

你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法。

Vim the Six Billion Dollar editor

Better, Stronger, Faster.

学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。

我建议下面这四个步骤:

  1. 存活
  2. 感觉良好
  3. 觉得更好,更强,更快
  4. 使用VIM的超能力

当你走完这篇文章,你会成为一个vim的 superstar。

在开始学习以前,我需要给你一些警告:

  • 学习vim在开始时是痛苦的。
  • 需要时间
  • 需要不断地练习,就像你学习一个乐器一样。
  • 不要期望你能在3天内把vim练得比别的编辑器更有效率。
  • 事实上,你需要2周时间的苦练,而不是3天。

第一级 – 存活

  1. 安装 vim
  2. 启动 vim
  3. 什么也别干!请先阅读

当你安装好一个编辑器后,你一定会想在其中输入点什么东西,然后看看这个编辑器是什么样子。但vim不是这样的,请按照下面的命令操作:

  • 启 动Vim后,vim在 Normal 模式下。
  • 让我们进入 Insert 模式,请按下键 i 。(陈皓注:你会看到vim左下角有一个–insert–字样,表示,你可以以插入的方式输入了)
  • 此时,你可以输入文本了,就像你用“记事本”一样。
  • 如果你想返回 Normal 模式,请按 ESC 键。

现在,你知道如何在 Insert 和 Normal 模式下切换了。下面是一些命令,可以让你在 Normal 模式下幸存下来:

  • i → Insert 模式,按 ESC 回到 Normal 模式.
  • x → 删当前光标所在的一个字符。
  • :wq → 存盘 + 退出 (:w 存盘, :q 退出)   (陈皓注::w 后可以跟文件名)
  • dd → 删除当前行,并把删除的行存到剪贴板里
  • p → 粘贴剪贴板

推荐:

  • hjkl (强例推荐使用其移动光标,但不必需) →你也可以使用光标键 (←↓↑→). 注: j 就像下箭头。
  • :help  → 显示相关命令的帮助。你也可以就输入 :help 而不跟命令。(陈皓注:退出帮助需要输入:q)

你能在vim幸存下来只需要上述的那5个命令,你就可以编辑文本了,你一定要把这些命令练成一种下意识的状态。于是你就可以开始进阶到第二级了。

当是,在你进入第二级时,需要再说一下 Normal 模式。在一般的编辑器下,当你需要copy一段文字的时候,你需要使用 Ctrl 键,比如:Ctrl-C。也就是说,Ctrl键就好像功能键一样,当你按下了功能键Ctrl后,C就不在是C了,而且就是一个命令或是一个快键键了,在VIM的Normal模式下,所有的键就是功能键了。这个你需要知道。

标记:

  • 下面的文字中,如果是 Ctrl-λ我会写成 .
  • 以 : 开始的命令你需要输入 回车,例如 — 如果我写成 :q 也就是说你要输入 :q.

第二级 – 感觉良好

上面的那些命令只能让你存活下来,现在是时候学习一些更多的命令了,下面是我的建议:(陈皓注:所有的命令都需要在Normal模式下使用,如果你不知道现在在什么样的模式,你就狂按几次ESC键)

  1. 各种插入模式
    • a → 在光标后插入
    • o → 在当前行后插入一个新行
    • O → 在当前行前插入一个新行
    • cw → 替换从光标所在位置后到一个单词结尾的字符
  2. 简单的移动光标
    • 0 → 数字零,到行头
    • ^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
    • $ → 到本行行尾
    • g_ → 到本行最后一个不是blank字符的位置。
    • /pattern → 搜索 pattern 的字符串(陈皓注:如果搜索出多个匹配,可按n键到下一个)
  3. 拷贝/粘贴 (陈皓注:p/P都可以,p是表示在当前位置之后,P表示在当前位置之前)
    • P → 粘贴
    • yy → 拷贝当前行当行于 ddP
  4. Undo/Redo
    • u → undo
    •  → redo
  5. 打开/保存/退出/改变文件(Buffer)
    • :e  → 打开一个文件
    • :w → 存盘
    • :saveas  → 另存为 
    • :x, ZZ 或 :wq → 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)
    • :q! → 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
    • :bn 和 :bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(陈皓注:我喜欢使用:n到下一个文件)

花点时间熟悉一下上面的命令,一旦你掌握他们了,你就几乎可以干其它编辑器都能干的事了。但是到现在为止,你还是觉得使用vim还是有点笨拙,不过没关系,你可以进阶到第三级了。

第三级 – 更好,更强,更快

先恭喜你!你干的很不错。我们可以开始一些更为有趣的事了。在第三级,我们只谈那些和vi可以兼容的命令。

更好

下面,让我们看一下vim是怎么重复自己的:

  1. . → (小数点) 可以重复上一次的命令
  2. N → 重复某个命令N次

下面是一个示例,找开一个文件你可以试试下面的命令:

  • 2dd → 删除2行
  • 3p → 粘贴文本3次
  • 100idesu [ESC] → 会写下 “desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu “
  • . → 重复上一个命令—— 100 “desu “.
  • 3. → 重复 3 次 “desu” (注意:不是 300,你看,VIM多聪明啊).

更强

你要让你的光标移动更有效率,你一定要了解下面的这些命令,千万别跳过。

  1. NG → 到第 N 行 (陈皓注:注意命令中的G是大写的,另我一般使用 : N 到第N行,如 :137 到第137行)
  2. gg → 到第一行。(陈皓注:相当于1G,或 :1)
  3. G → 到最后一行。
  4. 按单词移动:
    1. w → 到下一个单词的开头。
    2. e → 到下一个单词的结尾。

    > 如果你认为单词是由默认方式,那么就用小写的e和w。默认上来说,一个单词由字母,数字和下划线组成(陈皓注:程序变量)

    > 如果你认为单词是由blank字符分隔符,那么你需要使用大写的E和W。(陈皓注:程序语句)

    Word moves example

下面,让我来说说最强的光标移动:

  • % : 匹配括号移动,包括 ({[. (陈皓注:你需要把光标先移到括号上)
  • * 和 #:  匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

相信我,上面这三个命令对程序员来说是相当强大的。

更快

你一定要记住光标的移动,因为很多命令都可以和这些移动光标的命令连动。很多命令都可以如下来干:

例如 0y$ 命令意味着:

  • 0 → 先到行头
  • y → 从这里开始拷贝
  • $ → 拷贝到本行最后一个字符

你可可以输入 ye,从当前位置拷贝到本单词的最后一个字符。

你也可以输入 y2/foo 来拷贝2个 “foo” 之间的字符串。

还有很多时间并不一定你就一定要按y才会拷贝,下面的命令也会被拷贝:

  • d (删除 )
  • v (可视化的选择)
  • gU (变大写)
  • gu (变小写)
  • 等等

(陈皓注:可视化选择是一个很有意思的命令,你可以先按v,然后移动光标,你就会看到文本被选择,然后,你可能d,也可y,也可以变大写等)

第四级 – Vim 超能力

你只需要掌握前面的命令,你就可以很舒服的使用VIM了。但是,现在,我们向你介绍的是VIM杀手级的功能。下面这些功能是我只用vim的原因。

在当前行上移动光标: 0 ^ $ f F t T , ;

  • 0 → 到行头
  • ^ → 到本行的第一个非blank字符
  • $ → 到行尾
  • g_ → 到本行最后一个不是blank字符的位置。
  • fa → 到下一个为a的字符处,你也可以fs到下一个为s的字符。
  • t, → 到逗号前的第一个字符。逗号可以变成其它字符。
  • 3fa → 在当前行查找第三个出现的a。
  • F 和 T → 和 f 和 t 一样,只不过是相反方向。
    Line moves

还有一个很有用的命令是 dt" → 删除所有的内容,直到遇到双引号—— "。

区域选择 a 或 i

在visual 模式下,这些命令很强大,其命令格式为

a 和 i

  • action可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择)。
  • object 可能是: w 一个单词, W 一个以空格为分隔的单词, s 一个句字, p 一个段落。也可以是一个特别的字符:"、 '、 )、 }、 ]。

假设你有一个字符串 (map (+) ("foo")).而光标键在第一个 的位置。

  • vi" → 会选择 foo.
  • va" → 会选择 "foo".
  • vi) → 会选择 "foo".
  • va) → 会选择("foo").
  • v2i) → 会选择 map (+) ("foo")
  • v2a) → 会选择 (map (+) ("foo"))

Text objects selection

块操作: 

块操作,典型的操作: 0 I-- [ESC]

  • ^ → 到行头
  •  → 开始块操作
  •  → 向下移动 (你也可以使用hjkl来移动光标,或是使用%,或是别的)
  • I-- [ESC] → I是插入,插入“--”,按ESC键来为每一行生效。

Rectangular blocks

在Windows下的vim,你需要使用  而不是  , 是拷贝剪贴板。

自动提示:  和 

在 Insert 模式下,你可以输入一个词的开头,然后按 或是,自动补齐功能就出现了……

Completion

宏录制: qa 操作序列 q@a@@

  • qa 把你的操作记录在寄存器 a。
  • 于是 @a 会replay被录制的宏。
  • @@ 是一个快捷键用来replay最新录制的宏。

示例

在一个只有一行且这一行只有“1”的文本中,键入如下命令:

  • qaYpq
    • qa 开始录制
    • Yp 复制行.
    •  增加1.
    • q 停止录制.
  • @a → 在1下面写下 2
  • @@ → 在2 正面写下3
  • 现在做 100@@ 会创建新的100行,并把数据增加到 103.

Macros

可视化选择: v,V,

前面,我们看到了 的示例 (在Windows下应该是),我们可以使用 v 和 V。一但被选好了,你可以做下面的事:

  • J → 把所有的行连接起来(变成一行)
  • < 或 > → 左右缩进
  • = → 自动给缩进 (陈皓注:这个功能相当强大,我太喜欢了)

Autoindent

在所有被选择的行后加上点东西:

  • 选中相关的行 (可使用 j 或  或是 /pattern 或是 % 等……)
  • $ 到行最后
  • A, 输入字符串,按 ESC。

Append to many lines

分屏: :split 和 vsplit.

下面是主要的命令,你可以使用VIM的帮助 :help split. 你可以参考本站以前的一篇文章VIM分屏。

  • :split → 创建分屏 (:vsplit创建垂直分屏)
  •  : dir就是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏。
  • _ (或 |) : 最大化尺寸 (| 垂直分屏)
  • + (或 -) : 增加尺寸

Split

结束语

  • 上面是作者最常用的90%的命令。
  • 我建议你每天都学1到2个新的命令。
  • 在两到三周后,你会感到vim的强大的。
  • 有时候,学习VIM就像是在死背一些东西。
  • 幸运的是,vim有很多很不错的工具和优秀的文档。
  • 运行vimtutor直到你熟悉了那些基本命令。
  • 其在线帮助文档中你应该要仔细阅读的是 :help usr_02.txt.
  • 你会学习到诸如  !, 目录,寄存器,插件等很多其它的功能。

学习vim就像学弹钢琴一样,一旦学会,受益无穷。

——————————正文结束——————————

对于vi/vim只是点评一点:这是一个你不需要使用鼠标,不需使用小键盘,只需要使用大键盘就可以完成很多复杂功能文本编辑的编辑器。不然,Visual Studio也不就会有vim的插件了。

 

你可能感兴趣的:(Unix)