玩转VIM编辑器-额外技巧

玩转VIM编辑器额外技巧

给整个条目列表添加点阵式符号

比如,原文为:

The Geek Stuff article categories:

 

Vi / Vim Tips and Tricks

Linux Tutorials

SSH Tips and Tricks

Productivity Tips

HowTo & FAQ

Hardware Articles

Nagios Tutorials

MySQL and PostgreSQL Tips

操作后变为:

The Geek Stuff article categories:

 

*Vi / Vim Tips and Tricks

*Linux Tutorials

*SSH Tips and Tricks

*Productivity Tips

*HowTo & FAQ

*Hardware Articles

*Nagios Tutorials

*MySQL and PostgreSQL Tips

操作方法为:

1.    使用CTRL+V选定第一列;

2.    按下I(即i的大写字母);

3.    按下TAB可以移动全部选择行;

4.    然后插入*号即可,所有的操作都会影响所有的行;

5.    ESC退出编辑;

使用update-alternatives设置vim为系统通用默认编辑器

      Debian操作系统中,可以设置vim为通用默认编辑器,命令为:

update-alternatives –set editor <PATH OF VIM>

vim作为默认编辑器

      对于普通用户,可以在bashrc中,设置默认编辑器为vim,只需要在bashrc中添加export EDITOR=vi即可。

格式化段落

使用gqap来格式化段落。

重用宏

      对于我们使用的宏,如果不小心录制错误了,可以有两种方法来修改:

1.    重新录制宏;

2.    修改宏

a)     “ap    用于粘贴宏;

b)     修改宏中错误的地方;

c)     “ayy  重新录制该宏;

缩进代码块

原文为:

int main()

{

printf(“Hello World!n”);

printf(“Done.”);

}

缩进后为:

int main()

{

printf(“Hello World!n”);

printf(“Done.”);

}

有两种方法,分别为:

1.    移动光到{或者},然后输入>i{即可右移,左移为<

2.    使用块模式

a)     将光标移动到需要移动的行;

b)     使用v键来选择移动区域;

c)     使用方向键选定行;

d)     使用>或者<来右移或者左移;

组合的威力

      前面讲了很多技巧,如果我们将导航命令和编辑命令组合,将会得到更强大的功能。

描述

d<导航键hjkl>

向导航方向删除

dw

删除一个单词

d$

一直删除到行尾

d0

一直删除到行首

dG

删除到文件末尾

dgg

删除到文件开始

dk

删除当前和上一行

Dj

删除当前和下一行

dM

删除到屏幕中间

dH

删除到屏幕开始

dL

删除到屏幕底部

y <导航键hjkl>

根据导航键来拷贝

c<导航键hjkl>

根据导航键来修改

查看所有修改的历史

:changes即可

刷新屏幕

      当屏幕由于一些原因而导致失真时,可以使用CTRL+L来重绘屏幕。

插入非键盘字符

      使用:digraphs可以查看一些非键盘字符;

我们可以在插入状态中使用CTRL+K At来输入@,其中的At就是使用digraphs中查看的对应字符。这里可以输入日文、阿拉伯符号等。

      更多信息,参考:help diagraphs

Vimex模式

      输入Q就可以进入ex模式,然后输入visual或者:vi就可以回到正常模式。

      在我们需要连续不断地执行命令的时候,可以进入该模式

令光标位于匹配的末尾

      一般在使用/pattern搜索的时候,光标会位于匹配的开始出,我们可以使用/patternzs来使得光标位于该行的结尾。

查看字符的ASCII

      在光标位于字符n上的时候,输入ga就会在底端显示:

<n> 110, Hex 6e, Octal 156

编辑二进制文件

使用命令行参数b,即 vim –b filename

折叠查看部分源码

      这个特性对于有很多子函数的代码很有用;

自动折叠

:set foldmethod=indent即可折叠所有具有成对{}的代码。

折叠键

描述

za

展开光标下的内容

zR

展开所有折叠的内容

zM

折叠全部

手工折叠

:set foldmethod=manual

折叠键

描述

zf <导航键jk>

根据导航符来折叠

zf/pattern

通过搜索到的pattern来折叠代码

      我们也可以将所有的折叠信息保存起来,用的时候再加载,然后会还原原来设置的。方法为:mkview :loadview

玩转VIM编辑器-强力搜索

玩转VIM编辑器强力搜索

搜索导航

导航键

描述

/

向前搜索,前向

?

向后搜索,反向

 

 

n

跳转到下一个搜索词所在位置

N

跳转到前一个搜索词所在位置

//??

重复前面的搜索或反向搜索

跳转到下一个/上一个当前光标所在的字符

      使用该技巧可以不用使用/pattern可以直接跳转到光标所在的字符。

导航键

描述

*

跳转到光标所在字符的下一个匹配处

#

跳转到光标所在字符的上一个匹配处

上面的搜索方式是精确匹配的,比如光标在字符hell上,就不会搜索到hello上,但是我们可以使用下面描述的可以使得光标在hell上时,也能搜索到hello或者shell等包含hell的单次。

导航键

描述

g*

跳转到下一个局部匹配的单词处

g#

跳转到上一个局部匹配的单词处

PS:可以使用[I来列出所有符号光标处单次的行。

在一行中搜索字符

导航键

描述

fX

在一行中向前搜索字符X并跳转

FX

在一行中向后搜索字符X并跳转

tX

在一行中向前搜索字符X并跳转到X前面一个字符

TX

*****没有测试出来

;

向前重复上述操作

,

向后重复上述操作

12个实用的强力搜索和替换实例

Vim编辑器中文本替换命令的语法为:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

其中有3个可能的flags,分别为:

    [c]每次替换都确定一下

    [g]替换当前行中所有符合的

    [i] 忽略模式匹配的大小写

1替换整个文件中所有符合模式的文本

:%s/old-text/new-text/g

其中%s指定了所有的行,而其中%的含义为替换整个文件;

其中g的含义为指定行中所有的匹配项,如果没有g将只是替换行中发现的第一个。

2在一行中替换文本

:s/old-text/new-text/gi

上述命令中没有指定range范围,将默认为当前行。

3在指定行中替换文本

:1,10s/I/We/g

上述命令将把从第1行到第10行的I替换为We

4在指定块中替换文本

在使用CTRL+V时,可以替换选定的文本,在输入:时,就会自动变为:’<,’>,这是就可以输入命令了:

:'<,’>s/helo/hello/g

该命令将把指定块中的helo替换为hello

5在接下来的N行中替换文本

:s/helo/hello/g N

该命令将替换从当前行开始的共N行。

6只替换整个单词而不是部分匹配

标准替换:

原始文本: This is his idea

:s/his/her/g

替换文本:Ther is her idea

 

完整单词替换:

原始文本: This is his idea

:s/<his>/her/

替换文本: This is her idea

 

      所以,如果需要完整替换,需要在关键词前后添加<>,对于一些新手而言,可能会希望使用空格来代替,殊不知,这样可能会导致开始和结束的字符不符合条件。

7使用正则表达式来替换多个文本

原始文本: Linux is good. Life is nice.

:%s/(good|nice)/awesome/g

替换文本: Linux is awesome. Life is awesome.

8交互式地查找替换

可以在命令行中使用c-flag来交互式地查找替换,比如

:%s/awesome/wonderful/gc

将会提示如下信息:

replace with wonderful (y/n/a/q/l/^E/^Y)?

    y:替换当前高亮显示的单词,并高亮显示下一个匹配的词;

    n:不替换当前高亮显示的单词,然后高亮显示下一个匹配的词;

    a:将不再出现提示而替换掉所有剩下匹配的词;

    l:替换当前高亮显示的词,并且中断操作。

9将行号写到文件中

:%s/^/=line(“.”) . “. “/g

该命令将会把显示的行号写到文件中去。这个与:set number不同,set number只是显示行数而不会对文件内容有所影响。

10使用等价值来替换一个特殊字符

原始文本: Current file path is ~/test/

:%s!~!= expand($HOME)!g

替换文本: Current file path is /home/leo/test/

11在插入一个新的条目时更改所有其他的条目

比如我们有下面的图书列表:

Article 1: Vi and Vim Editor: 3 Steps To Enable Thesaurus Option

Article 2: Vim Autocommand: 3 Steps to Add Custom Header To Your File

Article 3: 5 Awesome Examples For Automatic Word Completion Using CTRL-X

Article 4: Vi and Vim Macro Tutorial: How To Record and Play

Article 5: Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin

Article 6: How To Add Bookmarks Inside Vim Editor

Article 7: Make Vim as Your Bash-IDE Using bash-support Plugin

Article 8: 3 Powerful Musketeers Of Vim Editor ? Macro, Mark and Map

Article 9: 8 Essential Vim Editor Navigation Fundamentals

Article 10: Vim Editor: How to Correct Spelling Mistakes Automatically

Article 11: Transfer the Power of Vim Editor to Thunderbird for Email

Article 12: Convert Vim Editor to Beautiful Source Code Browser

忘记了3rd Article “Make Vim as Your Perl IDE Using perl-support.vim Plugin” ,现在我们要做的就是插入3rd Article “Make Vim as Your Perl IDE Using perl-support.vim Plugin”并且需要把后面的数目需要逐次增加1

      那么我们可以使用命令:

:4,$s/d+/=submatch(0) + 1/

      其中:

范围:4,$为从第4行到最后;

d表示一个数字的字符串;

=submatch(0) + 1 取到数字并且加1

由于这里没有flag,所以默认只会替换第一个吻合的单词。

更换后变为:

Article 1: Vi and Vim Editor: 3 Steps To Enable Thesaurus Option

Article 2: Vim Autocommand: 3 Steps to Add Custom Header To Your File

Article 3: Make Vim as Your Perl IDE Using perl-support.vim Plugin

Article 4: 5 Awesome Examples For Automatic Word Completion Using CTRL-X

Article 5: Vi and Vim Macro Tutorial: How To Record and Play

Article 6: Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin

Article 7: How To Add Bookmarks Inside Vim Editor

Article 8: Make Vim as Your Bash-IDE Using bash-support Plugin

Article 9: 3 Powerful Musketeers Of Vim Editor ? Macro, Mark and Map

Article 10: 8 Essential Vim Editor Navigation Fundamentals

Article 11: Vim Editor: How to Correct Spelling Mistakes Automatically

Article 12: Transfer the Power of Vim Editor to Thunderbird for Email

Article 13: Convert Vim Editor to Beautiful Source Code Browser

12将每个句子的首字母大写

:%s/.s*w/=toupper(submatch(0))/g

该命令将把每个句子的首字母大写。

.s*w  搜索模式,在句点后跟零个或多个空格,然后一个单词;

toupper – 将给定的文本改为大写字母;

submatch(0) –返回匹配的模式

使用vimgrep在多个文件中搜索

:vimgrep leo  *.txt  可以使用该命令在当前所有txt文件中搜索leo,如果有多个匹配项,可以使用:cn来跳转到下一个。

命令

描述

:vimgrep pattern *

在多个文件中搜索pattern

:cn

跳转到下一个vimgrep搜索到的项

:cN

跳转到上一个vimgrep搜索到的项

:clist

列出所有vimgrep搜索到的项

:cc number

直接跳转到number对应的项

高亮显示搜索结果

:set hlsearch  该选项将高亮显示搜索的结果

:set nohlsearch  该选项将不高亮显示搜索的结果

:nohlsearch  清除高亮显示的结果

Vim增量搜索

:set incsearch该增量搜索模式将在你输入字符的时候就立即定位符合你输入的pattern,同样禁用该选项为:set noincsearch

给力的:match

:match ErrorMsg /Error/

将文件中所有的ErrorErrorMsg配色方案来显示;

比如::match ErrorMsg /printf/将显示如下:

clip_image002

其中,配色方案主要有:

    ErrorMsg

    WarningMsg

    ModeMsg

    MoreMsg

关于配色方案,我们也可以自己设定。

玩转VIM编辑器-vim附加特性

玩转VIM编辑器-vim附加特性

重复一个操作N

对于我们前面介绍的一些操作,我们可以单纯地加上一个数字,来重复操作N次,比如j表示下移一行,那么10j就是下移10行。

      还有一些重复执行的命令:

重复命令

描述

@@

重复前一个执行的宏

n

向同样的方向执行搜索

N

向相反的方向执行搜索

.

重复上一次的编辑命令

@

重复上一次的命令行操作

撤销和重复操作

单次撤销,直接使用字母u即可,如果想撤销N次操作,可以使用Nu

撤销全部操作,使用大写字母U即可。

      如果使用了u撤销操作,并且发现错误了,可以使用:red或者CTRL+R来撤销刚才做的编辑动作。

打开光标下对应的文件

      这个特性对于下述所示的情况相当有用。

l  测试配置文件中所给的文件名是有效的;

l  编辑一个文件的时候,想查看编辑文件中所包含的文件;

l  在编辑源代码的时候,参考include或者import的文件;

1.     直接打开:    gf

2.     打开一个新的窗口: CTRL+W f

3.     打开一个新的选项卡:    CTRL+W  gf

如果文件中所包含的文件并没有给出绝对路径,那么vim将在当前目录中搜索。

      在下述情况下,即使没有指出绝对路径,vim也能定位到文件的准确位置:

1.    C程序中的头文件;

2.    Perl程序中的Perl模块

使用传统方式编辑多个文件

      使用此种方法,可以在那一个vim会话中编译多个文件。

打开方法为:vim file1 file2 file3

如果已经处在vim编辑会话中,需要再打开一个文件,可以使用下述命令:

:e anotherfile

我们可以使用:ls来列出目前vim会话中的所有文件,比如:

:ls

  1 %a   “apue.h”                       line 1

  2 #    “passwd”                       line 1

  3      “lscpu”                        line 1

那么我们可以使用:e #N来打开第N个文件;

在两个文件中切换的方法为:  CTRL+^;

在多个文件中移动的方法:

使用命令:next:previous分别可以移动到下一个文件或者上一个文件。

自动保存文件

      如果在没有保存文件的时候,想切换到另一个编辑文件,会出现警告信息,提示先保存信息,可以设置自动保存选项:set autowrite,这样就可以直接切换各个文件或缓存。

      也可以使用:wall单个命令来写入所有的文件。

Vim中加密文件

使用:X来加密文件,下次编辑时就需要输入加密密码;

解密方法为:set key=然后保存文件就可以了。

加 密 的 局 限 性

Vim 采用的加密算法有弱点的。它对于防止那种偷窥者是绰绰有余了,但不足以防止一个手上有大量时间的密码专家。而且, 你应该知道交换文件是不加密的;所以当你在编辑文件时,拥有超级用户权限的人能够读取未经加密的文件文本。不让人们读到你的交换文件的一个方法就是不使用交换文件。

:setlocal noswapfile

由于没了交换文件,文件复原就不可能了。为了避免失去编辑的成果,要比平时更勤快地存盘你的文件。

保存和还原vim会话

      在我们编辑N个文件的时候,如果需要先做别的事情,在返回来编辑该会话,那么我们可以保存该会话,然后还原它,在这个过程中,诸如缓冲区、窗口大小、自定义选项、文件夹和当前目录等都会保存。

会话命令

描述

:mksession

在当前目录中创建一个默认的Session.vim

:mksession filename

保存会话为指定的文件名filename

$vim –S

打开当前目录中默认的会话

$vim –S filename

打开当前目录中指定的会话filename

:source Session.vim

导入会话中的所有设置

vim中执行Unix脚本命令

      vim中执行Unix命令cmd,使用:!cmd即可。比如显示:!date日期信息。

也可以将当前文件名作为一个参数传入到Unix命令中:

:!echo %

%代表当前文件名

:!echo %:p

%:p代表当前文件名的绝对路径

:!echo %:e

%:e代表当前文件的扩展名

使用vimdiff检查文件中的异同

      Unix中可以使用diff file1 file2来查看两个文件的异同(完全命令终端显示),但是vimdiff更加的直观、友好(不同颜色来友好地显示出文件异同)。

vimdiff命令

描述

vimdiff file1 file2

vim -d file1 file2

在一个垂直分割窗口中显示不同

vimdiff –o file1 file2

vim –d -o file1 file2

在一个水平分割窗口中显示不同

vim file1

:diffsplit file2

已经打开了一个文件,在打开另一个文件来比较异同水平分割

vim file1

:vert diffsplit file2

已经打开了一个文件,在打开另一个文件来比较异同垂直分割

[c

跳转到下一个修改处

]c

跳转到上一个修改处

vim映射命令

      如果需要重复地执行一个命令,可以使用vim的映射命令来实现。

比如:map :write :!cc % && ./a.out该映射命令在执行:write的时候就会编译当前文件并执行。

      前面我们提到过:w :up的区别,可以使用map :w :up;还有:map :q :confirm q

      使用:map可以显示所有定义的映射。

bash shell工作的像vim编辑器

set -o vi 表示编辑命令行用 vi 模式,默认状态是 vi 的 编辑状态,可以输入、修改,用 ESC 退出编辑状态后,可以用 h,l 来前进后退, j,k 来翻看历史命令,^光标到行首,$光标至行尾,dd 删除该行等等,和 vi 的用法是一样的。习惯用 vi 的人可以用 set -o vi 这种模式加快命令行编辑。

     此外,还有 set -o emacs,表示编辑命令行用 emacs 模式,不分编辑状态和控制状态。 可以直接输入,也可以用 [CTRL]-a 至行首,[CTRL]-e 至行尾,[CTRL]-k 删除光标处到末尾等等,这和 emacs 的编辑方式是一样的。这是默认模式,也是最常见和大多数人习惯的方式。

vim编辑器中的一些选项

选项

描述

:set nu

显示行号

:set ic

搜索时忽略大小写

:set ro

以只读模式打开

:set wm=n

最右端回卷最大值

:set ai

开启自动缩排功能

:set all

显示vim会话中的所有设置

:set list

显示所有不可视字符,比如^|表示tab$表示行尾

:set hlsearch

高亮显示匹配模式

:set incsearch

开启增量搜索模式,实时搜索

如果想关闭上述设置,可以使用:set no<OPTION>,例如不显示行号为:set nonu

默认寄存器和它们的用法

寄存器名称

描述

%

当前文件的名称

#

替换文件的名称

:

最近一次执行的命令

/

上一次的搜索模式

上一次使用的寄存器

      从寄存器中粘贴内容,执行下述命令

“<寄存器名称>p

比如如果“%p就会把当前文件名给粘贴到光标位置。

      关于寄存器,有以下几点需要注意:

1.    数字表示的只有从0910个寄存器;

2.    最近拷贝的存储在寄存器0

3.    最近删除的存储在寄存器1

vim目录操作

      我们可以使用vim作为一个文件管理器在文件系统中导航,并且可以进行一些操作。

      比如使用vim /可以看到:

clip_image002

      vim文件浏览器中,可以执行下述操作:

描述

<Enter>

打开光标对应的文件或文件夹

D

删除光标对应的文件

R

重命名光标对应的文件

X

执行光标对应的文件

o

打开一个水平分割窗口

      也可以在vim编辑器件中打开vim文件浏览器:

键值

描述

:Ex

vim文件浏览器打开当前目录

:Ex /etc

vim文件浏览器打开指定目录

:Sex

vim文件浏览器使用水平分割窗口打开当前目录

:Vex

vim文件浏览器使用垂直分割窗口打开当前目录

:Tex

vim文件浏览器在一个新的选项卡中打开当前目录

 

玩转VIM编辑器-vim窗口管理及配色方案

玩转VIM编辑器-vim窗口管理及配色方案

水平或垂直分割窗口

l  vim编辑文件时,可以使用:split来水平地打开本文件的另一个副本,或者使用:vsplit来垂直地打开;

l  打开另外一个文件,可以使用:split anothername或者:vsplit anothername

l  在各个窗口中的导航方式为: CTRL+W {导航键jkhl},比如输入CTRL+W j就可以跳转到该窗口的下一个窗口。

l  调整分割窗口的大小:CTRL+W +/-),分别为增大或减小窗口的大小

l  打开文件时就设置好打开的大小,例如:25 vsplit filename将打开一个垂直为25列的新的窗口。

更改窗口标题

      可以使用下述命令来修改终端窗口的标题为My Terminal

:set title titlestring=My Terminal

使用命令:help titlestring可以了解到:

:set title titlestring=%<%F%=%l/%L-%P titlelen=70

其中:

%F – 当前窗口中文件的名字

%l – 光标所在的行数

%L – 文件的总行数

%p – 光标所在处于文件中的百分比。

更改vim配色方案

可以使用下述命令来查看vim编辑器支持的配色方案:

:!ls $VIMRUNTIME/colors

然后可以试用其中的配色方案,比如想使用desert.vim

:colorscheme desert

即可更改配色方案为desert。更多详细的配色方案,参考:

http://vimcolorschemetest.googlecode.com/svn/html/index-c.html

在选项卡中编辑多个文件

比如使用vim –p file1 file2 file3可以打开三个选项卡用于显示3个文件。

关于选项卡中的操作,如下示:

:tabedit FILENAME

:tabe FILENAME

在当前vim会话中在另一个选项卡中打开文件

:tabs

显示所有打开的选项卡

:tabn N

到第N个选项卡

:tabclose :tabc

关闭当前选项卡

:tabdo CMD

对所有的选项卡执行命令CMD

:tabn

跳转到下一个选项卡

:tabp

跳转到前一个选项卡

 

玩转VIM编辑器-vim的命令行

玩转VIM编辑器vim的命令行

      可以使用vim –h来查看vim的所有可用的命令行选项。

只读模式打开文件

使用vim –R filename.txt或者view filename.txt即可。

还原swap文件

可以使用vim –r来查看swap文件,例如我的信息为:

clip_image002

      所以可以看到当前文件、~/tmp/var/tmp/tmp中的swap文件。

在打开文件的时候就执行vim命令

      可以使用-c选项来在打开一个文件的时候执行vim文件。

比如:vim –c ‘:50’ filename.txt可以在打开文件后,直接跳转到50行。

也可以使用vim –c ‘command1’ –c ‘command2’ filename执行多个命令。

执行存储与文件中的命令

      如果我们经常执行同样的命令,可以将该命令存储在文件中,使用下述命令:

vim –w repetitive_task.txt file_to_edit.txt

不使用所有的插件

      可以使用vim – – noplugin filename来不加载任何插件。

进入受限vim模式

      使用vim –Z filename或者rvim filename可以进入受限的vim模式。