分享

VIM高级操作,经常用vim的应该多学习。多开发效率很有大帮助!

 紫火神兵 2015-04-28

Vim是号称“编辑器之神”的文本编辑软件,自从接触Vim以来,基本上都是用Vim来修改和编写代码和配置文件的。

但是我一直只会用最基本的命令,虽然把HJKL的定位键已操纵地很熟练。但是Vim其他强大的地方却几乎没有触及过。

学一样东西,就要把它学精。

这里记录了一些常用的使用技巧。

零、将VIM打造为超级IDE

先附上链接

手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文) -- 续1
在Fedora下成功将Vim打造成适用于C/C++的IDE
把VIM打造成一个真正的IDE(1) :这是一个系列,后面还有几篇

一、两行合并为一行:

int
main(int argc,char argv)

假如要把上面两行并为一行,只需要定位于int这行,然后按J(大写),即可。

二、撤消和重做

以前很傻,只知道按u来撤消,不知道重做。不一小心,撤消过头就傻了。原来重做是Ctrl+r

另外,大写U用来撤消整行。

三、连续插入n个感叹号

以前以为用i/a不能进行连续多个字符的插入,原来错了!

Hello World

比如要在上面这句话后面插入10个"!",总不能真的打10个吧?

只要在普通模式下把光标定位于d,然后按10a!……不对啊,才一个!,别急,再按两下Esc!哈哈,出来10个!了吧!这个貌似不太常用,但挺好玩,呵呵~

四、快速保存退出

之前我会用两个退出方法:

保存并退出:wq

不保存并退出:q!

现在保存并退出有更快的方法──直接在普通模式下按ZZ即可。

另外,用:e!可以不保存文件并重新载入这个文件。

五、移动和滚动

直接按w/b来按单词滚动,w是向前移动一个单词,b是向后移动一个单词,我居然不常用!亏我还常常dwdw的来删除词。

另外,Ctrl+D向下滚屏,Ctrl+U向上滚屏,比我之前hjkl(左下右上)的有效率多了……汗

不知道在哪里?

:set number,来显示行号,:set nonu取消行号,行号+gg(或者 行号+G)直接到达该行。

六、查找时忽略大小写和历史查找

有时查找单词时需要忽略大小写,只要设置下面的就可以了

:set ignorecase

还有另外一种忽略搜索时大小写的方法更好用,只要在待搜索字符串后加个\c就可以了

/stringYouWantToSearch\c

假如进行过几次查找,想继续以之前查过的关键词查找时,只要按/,然后上下键来选择即可

同理,按下:,然后上下键,也可以翻看执行过的历史纪录,不过仅限于当前的编辑。

七、快速查找

你要找当前光标定位处的字段,难道要慢吞吞输入/和字段吗?不必了!直接按*号,Vim就会把当前的字段作为查找内容,找下一处。

对了,:set hlsearch可以将查找的内容设置成高亮。这样就好看了。反之,加上:set nohlsearch就可以了。上面的ignorecase也可以加no。

八、定义标记

现在才发现定义标记这个超有用的东西!真是后悔莫及啊!

以前在一个C文件里,从一个方法跳到另一个方法,跳来跳去,都是记行数的……

原来,按下ma,就会给光标所在处标记了一个a,接下来可以通过`a来访问这个地方!注意,符号`是数字1左边那个符此外,通过'a,可以访问那个位置的行首注意,符号'是单引号。

打命令:marks可以看到所有的标记。

而''或``,就可以在最近的两个标记之间相互跳转!

        当你用 "G" 命令跳到另一个地方,Vim 会记住你从什么地方跳过去的。这个位置成为一个标记,要回到原来的地方,使用如下命令:''''命令可以在两个位置上跳来跳去。而 CTRL-O 命令则跳到一个 "较老" 的地方 (提示: O 表示 older)。CTRL-I 则跳到一个 "较新" 的地方.
         :jumps 命令能输出一个你可以跳往的位置的列表。最后一个你使用的标记会用 ">" 符号标记出来。
Vim 允许你在文本中放置自定义的标记。命令 "ma" 用 a 标记当前的光标位置。你可以在文本中使用 26 个标记 (a 到 z)。这些标记是不可见的,只是一个由 Vim 记住的位置。
        要跳到一个你定义的标记,可以使用命令`{mark}这里 {mark} 是指定义标记的那个字母。所以,移到标记 a 的命令是: `a
        你可以用如下命令取得所有的标记的列表::marks
到有一些特殊的标记,包括:
         '       跳转前的光标位置
         ''       最后编辑的光标位置
        [       最后修改的开始位置
        ]       最后修改的结束位置

注:mark仅在当前文件跳转有效,jumps可在多个文件之间来回跳转

九、替换文本(这个没看懂怎么用................)

* 用cw或ce来将光标所处的单词替换掉,效果是一样的;
* 按cc的话,直接替换整行。 另外,用S也能达到同样的效果;
* 按C=c$,替换当前至行尾的内容;
* s的话,是替换当前的字符,跟r的功能一样;
* 以前删除一行至末尾用d$,原来D就行了;

上面的大多数都可以加数字!

十、可视选择(这个我没怎么用过.....)

* 按v进行选择,如果想控制头和尾,按o/O进行切换;
* 如果是大写的V,则按行进行选择;

十一、删除单词和替换句子、复制单词

* 一般来说,用dw/de删除单词需要将光标定位于单词开头(de不会删除单词后的空格,dw会删除单词后的空格),用dw/de时需移到单词开头是因为dw/de会从光标所在的那个字符(包括该字符)开始删除直到该单词结束,但是如果用daw,则无需这样,只要光标在这个单词上就可以了(daw会将空格一起删除,daw=Delete a Word),如果不包括空格,就是diw
* 替换句子的话,就用cis就行了(目前我试验出来的可以被用以标示一句话结束的标点符号是英文的问号?和句号. )
    接下来看下复制:
  yy命令复制当前整行的内容到vi缓冲区
  yw复制当前光标所在位置到单词尾字符的内容到vi缓存区,相当于复制一个单词,而yaw/yiw也是复制一个单词,但光标可以处在该单词的任何位置,比起yw的需要移动到单词的首字符要方便。
  y$复制光标所在位置到行尾内容到缓存区
  y^复制光标所在位置到行首内容到缓存区
  #yy 例如:5yy就是复制5行
  #yw 例如:2yw就是复制两个单词

  如果要复制第m行到第n行之间的内容,可以在末行模式中输入m,ny例如:3,5y复制第三行到第五行内容到缓存区。

十二、模式转换

Vim作为一种强大的编辑工具,是通过键盘来实现,而不是通过鼠标来实现的。这一点很重要。
vim有三种常见的模式,Normail Mode(命令模式),Insert Mode(输入模式)和Visual Mode(视图模式)。

这几种模式的切换是也是很直接方便的,比如在命令模式下,要求输入字符,只要输入i就进入输入模式
而根据要输入位置和当前光标的关系不同,有不同的切换。
总之可以把命令模式和输入模式的切换有Append,Insert,Replace,Subsitute 记作AIRS,这种记忆方法特别方便
英文单词的意思是空气,vim在命令模式和输入模式的切换就像空气一样,无影无形。
而AIRS的英文字母的大小写意思是不一样的。小写的表示characterwise(字符),大写的表示linewise(行)

十三、 删除、复制指定个数个字符

比如 : 5yl         复制光标后的5个字符(包括光标所在的那个字符)
              5yh       复制光标前的五个字符(包括光标所在的那个字符)
              5dl        删除光标后的5个字符(包括光标所在的那个字符)
              5dh       删除光标前的5个字符(包括光标所在的那个字符)

十四、强大的替换功能

替换::%s/old_string/new_string/g。或者:3,7s/old_string/new_string/g
在一个目录下替换文本中的某个字符串
sed -i 's/orig_string/new_string/g' *

http://www./vim-model-commonly-used-in-the-replacement-summary.html

http:///vim-tips-replace-the-ingenious-use-of-4/

http:///vim-tips-replace-the-ingenious-use-of-3/

十五、同时编辑多个文件

在vim的普通模式下输入 :e filename,可以打开并编辑新的文件,但如果当前文件还没有保存的话,会有错误提示,这时需使用:w 先将其保存才行。

如果正在用vim编辑着多个文件,可以用 ctrl+^ 在他们之间来回切换,比如现在同时打开了6个文件,则就有6个不同的缓冲区,比如现在在编辑文件1,想切换到文件5去,则需要先把本文件保存(通过 :e ),然后再按5,再按ctrl+^,就切换到文件5了。

:rew    读入编辑名单中的第一个文件, :last 读入编辑名单中的最后一个文件。:next 会关闭光前文件打开下个文件开始编辑,但当前文件也需要先:w保存。,但 :set hidden 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存.

你打开了几个窗口,现在你想退出 Vim,你可以分别关闭每一个窗口。更快的方法是:
:qall
这表示 "quit all"(全部退出)。如果任何一个窗口没有存盘,Vim 都不会退出。同时
光标会自动跳到那个窗口,你可以用 ":write" 命令保存该文件或者 ":quit!" 放弃修改。
如果你知道有窗口被改了,而你想全部保存,则执行如下命令:
:wall
这表示 "write all"(全部保存)。但实际上,它只会保存修改过的文件。Vim 知道保
存一个没有修改过的文件是没有意义的。
另外,还有 ":qall" 和 "wall" 的组合命令:
:wqall
这会保存所有修改过的文件并退出 Vim
最后,下面的命令由于退出 Vim 并放弃所有修改:
:qall!
注意,这个命令是不能撤消的。

或者也可以用多窗口来在一个界面中编辑多个文件,如下:

vim -o a b c 打开多个文件,每个文件一个窗口(水平分割)
vim -O a b c 打开多个文件,每个文件一个窗口(垂直分割)

或者:

打开一个 :sp 另外一个文件 (水平分割) :vsp 文件名(垂直分割)
如此就可以在一个窗口打开2个或多个文件了。可以使用 ctrl + 两次按 w在多个窗口的文件中切换

窗口大小调整:(输入顺序: ctrl+shift+w 行数 +/-/>/<)

ctrl+shift+w, 5, - 当前窗口缩小5 行(高度,(如不指定行数,默认为1)

ctrl+shift+w, 5, + 当前窗口增加5 行(高度,(如不指定行数,默认为1)

ctrl+shift+w, 5, > 当前窗口增加5 列(宽度,(如不指定列数,默认为1)

ctrl+shift+w, 5, < 当前窗口增加5 列(宽度,(如不指定列数,默认为1)

ctrl+shift+w, = 使所有窗口几乎一样大

ctrl+shift+w, _(下划线) 使当前窗口最大化

十六、执行shell命令

在 vi 中也可以执行 shell 的命令。在命令模式下,指令:!commandcommand 是shell 命令。例如指令:!date 会把目前的时间和日期显示到萤幕上。
要是你想把shell 命令的结果放到文件中,可以用:r !command。比如r !date 会把现在的时间放到光标所在的行的下一行。可以指定行数,例如:20r !date 会把现在的时间放到第二十行。

如果你要下一连串的shell 命令但又不想离开vi,你可以在line mode 下指令sh。这个指令会建立一个shell,如果要离开sh回到vim,可输入exit,或按ctrl-D 。

也可以选择档案中的文字作为shell 命令的输入。输出的结果会把替换掉你输入的文字。例如:2,5!sort 会把第二列到第五列的文字依序排列,而原来的文字就会被覆盖。

十七、编辑得更快一点

按词移动

w

按下w会前进一个词。

b

按下b会后退一个词。

这里,就像在Vim中的大部分情况下一样,在这两个命令前面加上一个数字可以让它们重复做多次。

移动到行首或行末

$

$会让你移动到所在行的末尾。

^

^会让你移动到所在行的开始。Home键也可以做相似的事。不过^会移动到第一个非空的字符处,而Home会移动到行首。

这两个命令也接受数字参数,比如

2$

会移动到下一行末。

在行上查找

f要查找的字符

f用来在一行上查找一个字符并移动到该字符所在处。比如

fx

用来移动到此行当标后第一个x处。如果有一个数字参数,就可以指定移动到某个指定的匹配位置。

F

F用来向左查找。

移动到指定行

行号G

G命令会把你带到用行号指定的行。如果使用没有行号的G,将会移动到最后一行。

显示当前所在位置

:set number

Vim的可制定性是很强的,所以你可以通过:set设定很多选项。number就是其中之一。它是一个布尔选项,用来控制是否在最左边显示行号。

:set number

可以把它打开。

:set nonumber

则可以关闭此选项。

Ctrl+g

Ctrl+g会显示当然后在的位置。

向上和向下翻屏

Ctrl+u

会向上翻半屏

Ctrl+d

会向下翻半屏

删除文本

dw

dw会删除一个词。你应该可以看得出来,这里的w代表的就是word(词).其实d后面可以加好多东西来控制删除的对象。比如:

d$

会删除从当前位置到行末的所有内容,同理,d^会删除从当前位置到行首的所有内容。

数字放在哪

这里有一个疑问,如果想删除三个词,那么应该怎么办?是d3w,还是3dw。其实它们都能做到,不过原理不太一样。d3w是一次删除三个词,而3dw是执行三次删除一个词。其实这两者可以混起来,比如2d3w。

改变文本

cc

用来删除一行并进入输入状态。

cw

用来删除一个词并进入输入状态等。

替换字符

r替换的字符

r命令把当标处的字符替换成在r命令中指定的字符。

更改大小写

~

通过~可以把光标处的字符用它的大写(如果现在是小写)或小写(如果现在是大写)替换。

Vim有着简洁而强大的宏功能。

q宏名

按下 q+宏名 后会进入宏录制状态,也就是说,此后发生的一切操作都会记录到名为“宏名”的宏中。如果名为“宏名”的宏已经存在,则将它覆盖。

@宏名

会调用名为“宏名”的宏。

十八、使用举例

1.在不是以hello开头的行里,如果其行末以old结尾,则将其替换为new,该命令为 :

:g!/^hello/s/old$/new/g

这里用到了全局命令:g,详见下图:


比如想把开头不是#的行的开头添加上为#,可以这样写 :g/^[^#]/s/^/#/



分别转载自:

http://apps.hi.baidu.com/share/detail/30695667





参加讨论!
我有3个文件要同时编辑:文件是A.C,B.C和C.BAS,vi命令如何实现,vi中如何在这3个文件中进行切换?
vim可以在多分割窗口(multi-split-screen )环境下编辑多个文件。想了解有关详情可输入:help usr_08.txt。
要分割屏幕显示多个不同文件,在vi命令提示符后输入:
:split another-file
:vsplit another-file
不知道你在安装系统的时候是否装screen了?我装了,如果装了,直接打screen,然后Ctrl a + c 为创建新窗口,Ctrl a + p为在打开的]窗口中切换!可以开很多个!足够用!
1. Use vi to open the three file directly
for example
vi a b c
2.Then vi will open the file by the order you enter in the command line.
But current is a.
If you want to change to b, you must first save a, then press "2"
,then press "Ctl+Shift+^", for c, you must first save b, then press "3", then press "Ctrl+Shift+^".
vi a b c
:n跳至下一个文件,:e#回到刚才编辑的文件。
比如当前编辑文件为a,:n跳至b,再:n跳至c,:e#回到b,想回到a的话用:ea
我觉得用split 开窗口的好处,可以直接用yy在两个窗口之间复制
两个窗口可以同时是一个文件
其实可以在一个窗口下,打开3个文件的。
先 打开一个,vi 文件名
然后在vi的命令输入状态下输入
:sp 另外一个文件的路径及文件名
如此就可以在一个窗口打开3个文件了。
可以使用 ctrl + 两次按 w
在3个文件中切换


辅道


我们可以用ex命令来实现在多个文件之间的切换,而不需要退出vi,这可以为我们节省很多时间,并且因为没有退出vi,我们可以使用buffer来在不同文件之间实现拷贝和粘帖。

1)  在启动vi的时候指定多个文件,这就相当在vi启动时我们就把多个文件加入到了vi的候选列表中,在编辑过程中我们可以用命令 :n来切换到下一个文件,我们可以用命令 :args来查看当前又有多少个文件在编辑的候选列表中;但是我们发现:n命令只能切换到下一个文件,那么怎么切换到前一个文件呢,我们可以用:rewind命令(可以简写为:rew)
        很快我们发现上面的方式不够灵活,例如我们不能任意指定想要编辑的文件,而且我们可能需要在编辑的任何时候加载新的文件,前面的方法满足不了,怎么办呢,幸运的是vi足够强大,已经为我们想到了这些。

2)  我们并不是在每次启动vi的时候就知道总共要编辑多少个文件,可能在编辑的过程中我们需要实时加载需要编辑的文件,这时候怎么办呢,我们可以用:e命令在编辑的任何时候加载并切换到新文件,例如我们启动vi的时候编辑main.cc,在编辑过程中发现要修改一个类定义,这样我们就可以使用命令:e singlton.h来加载类定义所在的头文件(当然在加载新文件之前需要保存原来修改的文件main.cc)。vi提供了一个符号#来记录前一个编辑的文件,这个符号可以很方便的在两个文件之前切换,我们只需要输入:e #, 哈哈,很方便吧;不过vi还有一个更方便的命令可以在两个文件之间来回切换 -- Ctrl+^(数字键6),这个命令比前面的:e #更加方便哈。

3) 之前一直不知道怎么用vi从一个文件拷贝内容到另外一个文件,都是直接用鼠标右键来搞定的,但是这样不是很方便,而且在终端下好像不行(黑屏幕那个终端),今天终于找到方法了,呵呵。
这里有两个方法可以实现,一个是用vi的命令,首先把需要复制的文本复制到一个named buffer中 -- "f4yy(表示复制4行文本到名字为f的buffer中,一定前面要有一个"啊,要不然后面的f就不会被解释为buffer的名字了),然后切换到目标文件,最后用命令"fp(将buffer f中的内容拷贝到目的文件中),哈哈,大功告成,我们需要复制的文本从源文件已经拷贝到目的文件了。还有一种方法是使用ex命令(就是命令前面带:的,例如:e, :w), 首先也是在源文件中将需要复制的内容拷贝到一个named buffer中 -- :10,12ya a(将10到12行这三行的内容拷贝到一个名字为a的buffer中),然后切换到目标文件,最后在目标文件中将buffer a中的内容拷贝到目的地 -- :pu a(将buffer a中的内容拷贝到当前位置)。

转载自:http://www.cnblogs.com/jackk294/archive/2009/08/09/1542274.html


昨天有人提出此类问题,我特地加以编辑一下,请大家共享,可能写的不好!

大家在vi编辑中,常常遇到想把文件A里面的一行或多行,复制到B文件里面去
(可能很多人不知道怎么办),该怎么做了?
下面是几中方法:
1.如果你有多台机器,而且是联网的,你可以用netterm虚拟终端,telnet登陆主机对A文件进行修改、复制,然后打开B文件粘贴过去!
2.如果是单机,当然要用unix自带的编辑功能呢
  先简单介绍一些vi编辑里的命令:
  (A).yw 将当前字存入无名缓冲区,前面可加"x,表示存入名字为x的有名 
缓冲区(x为a-z),也可加数字表示存入的字数,以后可用P或p命 
令取出 
yy 将当前行存入无名缓冲区,用法参看yw 

   (B).命令如下:a-Z 是缓冲区,也可移出数字1-Array指定的删除缓冲区 
利用命名缓冲区可很好地保存若干文本段,便于以后存取、移动或者重排。这些缓冲区用a到z字母命名!为了访问这些缓冲区中的一个,要使用双引号 
例如:要把一行插入a缓冲区,可键入: 
"ayy 
为了把这个文本放回该文件中,键入"ap 


  (c).m做标志命令:
  m 字母 用字母标记当前行,以后可用 ’字母使光标移动到当前行, 
(参看’命令)

列子:1。将a文件中的4行到b文件中

      命令如下:"ay4+ 
                  :ex b (转到b文件中)
                   然后"ap
        2. 将a中多行复制到b文件中
先在开始处做标志mk 
然后在末尾用"ay’k (光标自动回到开始处,此时已经把你的内容放到缓冲区了)
其中a表示缓冲区a 
然后用ex转义到你的文件B中,然后用"ap命令粘贴就行

3。如果你文件中有多次要复制粘贴的话,看下面:
a表示缓冲区a ,你还继续可以使用缓冲b吗 
缓冲区有a-z和1-Array这么多 
缓冲区就好象windows下的煎切版一样,它有好多个,你可以把你想要的复制进去,然后粘贴,只不过你用"ay时候多换a就是了,如你要复制462行用"ay ,复制536行用"by





另外还有 cw删除一个单词。并进入insert模式

 shift + * 定位到函数的定义处

ctrl+o 返回调过来之前的地方。

f12进入ctags模式


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多