Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> Linux 文章内容

VIM新手操作指南-itarticl.cc-IT技术类文章记录&分享

发布时间: 9年前Linux 144人已围观返回

虽然从很久前就开始用 Vim 了,但一直都是半吊子,翻来覆去只用自己会的命令。最近为了提高书写代码的效率,还有 coding 时候的乐趣,又重新钻研了一下 Vim,发现了一篇很好的 Vim 入门的文章,我觉得非常适合 Vim 使用入门.

这篇教程写了在不同工作模式下使用 Vim 的一些基本技巧——即插入模式(insert mode), 命令模式(command mode), 存取文件等。目的是帮助刚刚接触 Vim 的新手更加有效率的使用这个出色的编辑器。

高效率移动

在插入模式之外

基本上来说,你应该尽可能少的呆在插入模式里面,因为在插入模式里面 Vim 就像一个“哑巴”编辑器一样。很多新手都会一直呆在插入模式里面,因为这样易于使用。但 Vim 的强大之处在于他的命令行模式!你会发现,在你越来越了解 Vim 之后,你就会花越来越少的时间使用插入模式了。


使用 h、j、k、l

使用 Vim 高效率编辑的第一步,就是放弃使用箭头键。使用 Vim,你就不用频繁的在箭头键和字母键之间移来移去了,这会节省你很多时间。当你在命令模式时,你可以用 h、j、k、l 来分别实现左、下、上、右箭头的功能。一开始可能需要适应一下,但一旦习惯这种方式,你就会发现这样操作的高效之处了。

在你编辑你的电子邮件或者其他有段落的文本时,你可能会发现使用方向键和你预期的效果不一样,有时候可能会一次跳过了很多行。这是因为你的段落在 Vim 看来是一个大的长长的行。这时你可以在按 h、j、k 或者 l 之前键入一个 g,这样 Vim 就会按屏幕上面的行如你所愿的移动了。


在当前行里面有效的移动光标

很多编辑器只提供了简单的命令来控制光标的移动(比如左、上、右、下、到行首/尾等)。Vim 则提供了很多强大的命令来满足你控制光标的欲望。当光标从一点移动到另外一点,在这两点之间的文本(包括这两个点)称作被“跨过”,这里的命令也被称作是 motion。(简单说明一下,后面会用到这个重要的概念)

这里是常用到的一些命令(motion):

fx:移动光标到当前行的下一个 x 处。很明显,x 可以是任意一个字母,而且你可以使用 ; 来重复你的上一个 f 命令。

tx:和上面的命令类似,但是是移动到 x 的左边一个位置。(这真的很有用)

Fx:和 fx 类似,不过是往回找。

w:光标往前移动一个词。

b:光标往后移动一个词。

0:移动光标到当前行首。

^:移动光标到当前行的第一个字母位置。

$:移动光标到行尾。

):移动光标到下一个句子。

( :移动光标到上一个句子。


在整个文件里面有效移动光标

Vim 有很多命令,可以用来到达文件里面你想到达的地方。下面是一些在文件里面移动的命令:

:向下移动一屏。

:向上移动一屏。

G:到文件尾

numG:移动光标到指定的行(num)。(比如 10G 就是到第 10 行)

gg:到文件首

H:移动光标到屏幕上面

M:移动光标到屏幕中间

L:移动光标到屏幕下面

*:读取光标处的字符串,并且移动光标到它再次出现的地方。

#:和上面的类似,但是是往反方向寻找。

/text:从当前光标处开始搜索字符串 text,并且到达 text 出现的地方。必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话,按 n。

?text:和上面类似,但是是反方向。

ma:在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。你看不见书签的存在,但它确实已经在那里了。

`a:到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边。

`.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。


高效的输入

使用关键词自动完成

Vim 有一个非常漂亮的关键词自动完成系统。这表示,你可以输入一个长词的一部分,然后按一下某个键,然后 Vim 就替你完成了这个长词的输入了。举个例子:你有一个变量名为 iAmALongAndAwkwardVarName 在你写的代码的某个地方。也许你不想每回都自己一个一个字母的去输入它。

使用关键词自动完成功能,你只需要输入开始几个字母(比如 iAmAL),然后按(按住 Ctrl,再按 N)或者。如果 Vim 没有给出你想要的词,继续按,直到你满意为止,Vim 会一直循环它找到的匹配的字符串。

聪明的进入插入模式

很多新手进入插入模式都只是用 i。这样当然可以进入插入模式,但通常不是那么合适,因为 Vim 提供了很多进入插入模式的命令。下面是最常用的一些:

i:在当前字符的左边插入

I:在当前行首插入

a:在当前字符的右边插入

A:在当前行尾插入

o:在当前行下面插入一个新行

O:在当前行上面插入一个新行

c{motion}:删除 motion 命令跨过的字符,并且进入插入模式。比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包括),然后进入插入模式。被删除的字符被存在了剪贴板里面,并且可以再粘贴出来。

d{motion}:和上面差不多,但是不进入插入模式。


有效的移动大段的文本

使用可视选择(visual selections)和合适的选择模式

不像最初的 VI,Vim 允许你高亮(选择)一些文本,并且进行操作。这里有三种可视选择模式:

v:按字符选择。经常使用的模式,所以亲自尝试一下它。

V:按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。

:按块选择。非常强大,只在很少的编辑器中才有这样的功能。你可以选择一个矩形块,并且在这个矩形里面的文本会被高亮。

在选择模式的时候使用上面所述的方向键和命令(motion)。比如,vwww,会高亮光标前面的三个词。Vjj 将会高亮当前行以及下面两行。


在可视选择模式下剪切和拷贝

一旦你高亮了选区,你或许想进行一些操作:

d:剪贴选择的内容到剪贴板。

y:拷贝选择的内容到剪贴板。

c:剪贴选择的内容到剪贴板并且进入插入模式。


在非可视选择模式下剪切和拷贝

如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。这样也会节省时间:

d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。

y{motion}:和上面类似,不过是拷贝。

c{motion}:和 d{motion} 类似,不过最后进入插入模式。

dd:剪切当前行。

yy:拷贝当前行。

cc:剪切当前行并且进入插入模式。

D:剪切从光标位置到行尾到剪贴板。

Y:拷贝当前行。

C:和 D 类似,最后进入插入模式。

x:剪切当前字符到剪贴板。

s:和x类似,不过最后进入插入模式。


粘贴

粘贴很简单,按 p。

使用多重剪贴板

很多编辑器都只提供了一个剪贴板。Vim 有很多。剪贴板在 Vim 里面被称为寄存器(Registers)。你可以列出当前定义的所有寄存器名和它们的内容,命令为“:reg”。最好使用小写字母来作为寄存器的名称,因为大写的有些被 Vim 占用了。

使用寄存器的命令为双引号 "。

比如:我们要拷贝当前行到寄存器 k。你应该按 "kyy。(你也可以使用 V"ky。为什么这样也可以呢?)现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。现在你可以使用命令 "kp 来粘贴寄存器 k 里面的内容到你想要的位置。


避免重复

令人惊奇的 . 命令

在 Vi 里面,输入 . (小数点符号),将会重复你输入的上一个命令。比如,你上个命令为“dw”(删除一个词),Vi 将会接着再删除一个词。


使用数字

使用数字也是 Vim 强大的而且很节省时间的重要特性之一。在很多 Vim 的命令之前都可以使用一个数字,这个数字将会告诉 Vim 这个命令需要执行几次。比如:

3j 将会把光标向下移动三行。

10dd 将会删除十行。

y3" 将会拷贝从当前光标到第三个出现的引号之间的内容到剪贴板。

数字是扩展 motion 命令作用域非常有效的方法。


记录宏

有时候,你会发现你自己在文章的每段或者每行都重复相同的一系列动作。Vim 允许你记录一个宏来完成你的特殊需要。

qregister:记录宏到寄存器 register,这里 register 是任意的你的寄存器的名字。比如 qa,将会记录并且把宏存在寄存器 a 里面。

q:结束宏的记录。

@register:使用存在寄存器 register 的宏。比如 @a,将会使用存在寄存器 a 里面的宏。

必须要记住的是,宏只记录了你的系列按键并且重复执行它们。它们不是魔法。因为在 Vim 里面完成目的的方法有很多,所以有时候你要小心选择命令来记录你的宏。因为它们会在所有你要执行它的地方执行。


用 Vim 写代码

Vim 是一个用来写代码的绝好编辑器,因为它有一些特性是专门为程序员而设计的。这里是一些常用的:

]p:和 p 的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下!

%:匹配花括号、方括号、括号等。在一个括号的上面,然后按 %,鼠标就会出现在匹配的另外一半括号处。

>>:缩进所有选择的代码

<<:和上面类似,但是反缩进

gd:到达光标所在处函数或者变量的定义处。

K:在 Man 里面查找光标当前所在处的词。


VI打开和编辑多个文件的命令

可分两种情况:

1、在同一窗口中打开多个文件:

vi file1 file2 file3

:n 切换到下一个文件 (n=next)

:N 切换到上一个文件

2、在不同窗口中打开多个文件:

如果已经打开一个了一个文件,

则在vi的命令输入状态下输入 :sp 另外一个文件的路径及文件名,

如此就可以在一个窗口打开多个文件了。

或者用 vi -o file1 file2 file3....用分割屏幕窗口方式同时打开多个文件。

可以使用 ctrl + 两次按 w 或者ctrl + w 然后按上下键在上下窗口间切换。

2.窗口分割实现编辑多文件

*先使用vi打开一个文件,例如vi actinia_proenrule.sh

*分割窗口打开另外的文件

命令行模式下输入 sp 另外一个文件 就可以水平分割继续打开第二个文件,如果想纵向分割,可以使用vsp 文件名

注:sp=split,vsp=vsplit. 上面的写法是vi支持的简略写法,v实际就是vertical,从中我们可以看出改命令的含义,另外vi不仅仅支持两个文件,还支持更多个文件同时在一个 大的窗口中显示编辑,同时还支持同时打开的两个文件是同一个文件。

*窗口切换

可以使用 ctrl +两次按 w,这样就可以在各个文件中切换

之前觉得vi的多文档编辑用着很不方便,现在接触了几个,用过了MiniBufExplorer,发现看着不是很舒服。还是使用ls比较好看一些。

  :ls 展示全部的打开文档

  :xn 切换到向下的第x个文档

  n ctrl+6 : 切换到第n个buffer

  ctrl+6 或 :e# 回到前一个编辑文件


分屏

:new xxx

   ctrl+w s 对当前文档内容分屏显示

   ctrl+w q 关闭所处分屏

   ctrl+w o 仅显示当前分屏内容

   ctrl+w j k 上下选择分屏

个人觉得最值得用的命令就是ctrl+w w 快速在分屏的两个屏幕中切换


下面写的还没用过~看了大家的分享觉得这几个还不错

:n1,n2 co n3: 将n1行到n2行之间的内容拷贝到第n3行下

:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下

:n1,n2 d: 将 n1行到n2行之间的内容删除

:n1,n2 w!command: 将文件中n1行至n2行的内容作为command的输入并执行之,

若不指定n1,n2,则表示将整个文件内容作为command的输入

方式2的优点在可以直接使用nyy和pp命令在各个窗口的文件之间进行拷贝和粘贴,操作比较方便。


本文一般情况下用<C-字母>(里边的字母一般大小写无所谓,除非特别注明)表示按住ctrl同时按下相关

字母,命令前加一个i表示在插入模式下用这个命令

1. 选定文字 / 拷贝粘贴

v为可视模式,可以选定多行。选定多行之后,可以用yy或者dd等等进行拷贝和剪切。

p 是粘贴

y 和d 可以直接拷贝或者剪切选定的内容

yw是拷贝一个单词

如果要复制整行的最简单办法就是V,y,p 就行了

v是可以选定一行任意个字符的,V是行选定的,一次一整行,然后通过向下或向上移动光标而选定多行。

对于v选定的,拷贝后就是这么多,选多少就拷贝多少,而V选定的,粘贴的话会自动换到下一行

<C-V>命令模式下,也是块选定,不过是列块选定

2. 折叠代码

可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个

语句就行)

3. 缩进代码

<是左缩进, >是右缩进

按v选定后按=就是自动格式化代码,自动缩进,内部的递归的缩进都做到了

行左移<<,行右移>>,该命令用于调整源码缩进格式简便快速。

4. 移动光标

%是从大括号的开始移动到大括号的结束位置

:后边加行号就是跳到这一行

<C-O> 光标返回到以前的位置。相当于光标移动的“撤销”

<C-I> 光标返回到后来的位置。相当于光标移动的“恢复”

5. 多文件编辑 / 缓冲区命令

vim下每一个打开的文件对应一个缓冲区(buffer)。

多文件编辑会有两种情形,一种是在进入 vim 前所用的参数就是多个文件(这种情形称为 argument

list)。另一种情形是进入 vim 后另外再开其它的文件(称为 buffer list)。不过都可以统称为

buffer。

5.1 打开文件

vi flname1 flname2… flnameN

将多个文件调入缓冲,是 argument list。

:e filename

这是在进入 vim 后,在不离开 vim 的情形下再开其它文件,只要您要编辑的档案是在目前目录,Tab 补

全键还是可以使用。是buffer list。

注意::e 或者:new 或者:split 后边可以跟目录,这样就可以在目录下慢慢找要打开的文件了

5.2 缓冲区跳转

:n 编辑下一个文件。

:2n 编辑下二个文件。

:N 编辑前一个文件。注意,这种用法只能用于 argument list 的情形。

:rew 回到首文件

:args 查看当前编辑缓冲文件状态

:e# 或 Ctrl-^ 编辑前一个档案,用于两文件互相编辑时相当好用。这种用法不管是 argument list 或

buffer list 档案间皆可使用。 使用Ctrl-^ 命令更便捷,但如终端类型不正确该功能将无效。

用:ls来显示缓冲区中的文件,编号后边有#的代表是前一个文件,可以通过:e#来进入,有%a的代表是当

前文件,什么也没有的可以通过:bn来进入,这里的n代表文件编号。

:b文件名或编号 移至该文件。

在 :ls 中就会出示各文件的编号,这个编号在未离开 vim 前是不会变的。这个指令 elvis 也是可以使

用。当然 :e#编号 也是可以的,这样的用法则是所有 vi clone 都通用了。

在 buffers 中,减号 - 表示这个 buffer 并未载入,不过,不必担心,载入相当快速的。加号 + 表示

这个 buffer 已经修改过了。

:bn buffer next。这里的n代表字母n

:bl buffer last。

以上两个指令 elvis 不适用。

如果您是使用 vim 的 GUI,那就在菜单上就会有 Buffers 这个选项,可以很容易的知道及移动各

buffer 间。

5.3 移除缓冲区

:bd(elete) buffer 在未离开 vim 前是不会移除的,可使用这个指令移除。其实移除它干什么呢?vim

是您在叫用时才会载入的,因此这些 buffers 并不是像 cache 一般要占内存的。

5.4 重新编辑

放弃一修改过的文件,重新编辑。

(1)使用命令 :q!强行退出后再vi flname重新进入。

(2)使用命令 :e!强行重编辑更便捷。这样也是会打开文件,但会放弃目前编辑文件的改变,否则如果文

件已有变动,vim 预设是不让您随便离开的。:e! 后不接什么的话,代表舍弃一切修改,重新载入编辑中

文件。

5.5 其他命令

:files 或 :buffers 或 :ls 会列出目前 buffer 中的所有文件。

在 elvis 中可使用 :b 来叫出 buffers。

:f 或 Ctrl-g 显示目前编辑的文件名、是否经过修改及目前光标所在之位置。

:f 文件名 改变编辑中的文件名。(file)

:r 文件名 在光标所在处插入一个文件的内容。(read)

:35 r 文件名 将文件插入至 35 行之后。

gf 这是 vim 的特殊打开文件的方法,会打开光标所在处的 word 为名的文件,当然,这个文件要在当

前目录内,否则会创建新文件。

6. 查找命令

用/查找单词后,n可以跳到下一个,N则是上一个,:nohls可以取消高亮

查找时,:set ignorecase”项让VIM忽略大小写,“:set noignorecase” 来关闭这项功能。

7. 修改文字

cw:删除一个单词并进入插入模式,cc:删除一行并进入插入模式。

r:然后输入的字母将替换当前字母并保持命令模式,R则是不停的替换(一个挨着一个)。

0到行首,$到行尾。

8. 函数间跳转

ctrl+]和ctrl+T分别是查找函数的定义和返回,好像需要ctag的支持

<C-W>i 跳转到光标所指标识符的定义行,是打开一个新的小窗口显示,记住要加个i,最好是找自己项目下

的文件,否则找库函数的话还不如man.

大写 K 看光标所指标识符的 man 帮助页

9. 窗口命令

<C-W> = ctrl+w

:split 文件名 同时在一个页面显示多个文件的内容,类似多窗口,用<C-W><C-W>切换当前窗口

<C-W>f 切分显示光标在处的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #include 语句

中的文件

<C-W>_ 当同时打开几个文件时,按 <C-W>_ 使当前窗口最大化

用Ctrl-W命令指定光标移动:

Ctrl-W + 扩大窗口

Ctrl-W - 缩小窗口

Ctrl-W h 移动到窗口左边

Ctrl-W j 移动到窗口下边

Ctrl-W k 移动到窗口上边

Ctrl-W l 移动到窗口右边

等于是<C-W>按下后,松开键盘,再按下一个命令就可以了.

如果要关闭分割窗口可以用:close,剩下只有一个窗口的话就不能关了。

多窗口是split,像用e打开多个文件是将文件放在缓冲区中。

10. 自动完成

i<C-P> 向上搜索,补全一个词

i<C-N> 向下搜索,补全一个词

i<C-X><C-L> 补全一行。

比如你写过一行 for (int i = 0; i < 100; i++),你想再写一模一样的一行,只要输入 for<C-X><C-L>

即可。如果补全出来的不是你想要的那一行,你可以按 <C-P> 或 <C-N> 选择上一个或下一个匹配行

i<C-X><C-F> 在文件系统中搜索,补全一个文件名

如果按 <C-P> 或 <C-N> 补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include 语句中的文件

,而文件的位置将在 path 中搜索。

i<C-Y> 把上一行对应列的字符抄下来

i<C-E> 把下一行对应列的字符抄上来,这两个都可以一直按下去,到了行尾自己会停的.

11. 注释整块内容

注释块的方法:

<C-V> 选定要注释掉的行 I // Esc

I之后输入的东西就是插入到选定的行前边的,直至Esc.

要去掉注释的办法:<C-V>选定注释符//,然后d

列块选定后I是在前边都插入,A是在后边都插入

<C-V>是按列块模式的选定,<shift-V>是行选定,v是普通选定

12. 其他命令

u可以撤销上一步操作, ctrl+r可以恢复

i<C-O>命令 执行一个普通模式的命令,执行完毕后回到插入模式,不用多次Esc

i<C-V>后续字符 输入特殊的 ASCII 字符或键。

. 在光标当前位置处重复上一次操作

:!命令行 执行一条外部命令

发布时间: 9年前Linux144人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    143人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流