现在的位置: 首页 > Linux > Linux基础 > 正文
VIM常用操作整理
2013年03月07日 Linux基础 ⁄ 共 13921字 VIM常用操作整理已关闭评论 ⁄ 被围观 6,718 views+

vi是个可视化的编辑器,可视化编辑器的含义就是在编辑文本时可以看到它们。Linux下的vim是vi的一个增强版本,有彩色和高亮等特性,对编程有很大的帮助。

基本使用:

启动和退出vim

vim的启动:在Linux的提示符下键入vim(或使用vim myfile来编辑已经存在的文件)即可启动它。

vim的退出:先按下Esc键回到命令行模式,然后键入“:”,此时光标会停留在最下面一行,再键入"q"(如果强行退出则还在后面加 "!" ),最后按下Enter键即可。

VIM 关于移动的命令

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

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

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

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

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

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

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

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

* $:移动光标到行尾。

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

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

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

* <C-F>:向下移动一屏。

* <C-B>:向上移动一屏。

* G:到文件尾

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

* gg:到文件首

* H:移动光标到屏幕上面

* M:移动光标到屏幕中间

* L:移动光标到屏幕下面

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

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

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

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

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

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

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

有效的移动大段的文本

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

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

* <C-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类似,不过最后进入插入模式。

y+y    将光标目前所在的位置整行复制

y+w    复制光标所在的位置到整个单词所在的位置

n+y+w    若按3yw,则会将光标所在位置到单词结束以及后面两个单词(共3个单词)一起复制

n+y+y    若按3yy,则将连同光标所在位置的一行与下面两行一起复制

粘贴很简单,按 p。

使用多重剪贴板

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

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

vim中常用的删除文本命令:

d+左方向键        连续按d和左方向键,将光标所在位置前一个字符删除

d+右方向键        将光标所在位置字符删除

d+上方向键        将光标所在位置行与其上一行同时删除

d+下方向键        将光标所在位置与下一行同时删除

d+d            连按两次d,可将光标所在的行删除,若是连续删除,可以按住d不放

d+w            删除光标所在位置的单词,若是光标在两个字之间,则删除光标后面的一个字符

n+d+d            删除包括光标所在行及乡下的n行

n+d+上方向键    删除包括光标所在行及向上的n行

n+d+下方向键    同n+d+d命令

D                将光标所在行后面所有的单词删除

x                将光标所在位置后一个字符删除

X                将光标所在位置前一个字符删除

n+x            删除光标所在位置及其后的n个字符

n+X            删除光标所在位置及其前的n个字符

vim中常用的找出行数的命令:

Ctrl+g    在最后一行中显示光标所在位置的行数及文章的总行数

nG            将光标移至n行

r            修改光标所在字符

R            修改光标所在位置的字符,可以一直替换字符,知道按下ESC键

u            表示复原功能

U            取消对行所作的所有改变

.            重复执行上一命令

Z+Z        连续按下两次Z,文件将保存并退出vim

%            符号匹配功能,在编辑时,如果输入"%(",系统会自动匹配相应的")" #这功能在ubuntu中我没有实现,不知道谁能解释一下

#可以用/代替%

vim中搜索及替换命令 :

/pattern:从光标开始处向文件尾搜索pattern

?pattern:从光标开始处向文件首搜索pattern

n:在同一方向重复上一次搜索命令

N:在反方向上重复上一次搜索命令

:s/p1/p2/g:将当前行中所有p1均用p2替代

:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代

:g/p1/s//p2/g:将文件中所有p1均用p2替换

 

 

 

vim中命令行模式切换到输入模式,进行插入:

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

* I:在当前行首插入

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

* A:在当前行尾插入

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

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

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

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

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

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

* 10dd 将会删除十行。

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

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

vim最后行模式主要的操作命令:

e            创建新的文件

n            加载新的文件

w            写文件,也就是将编辑的内容保存到文件系统中。主要它是保存到临时文件中,直接退出,他并没有保存到文件中的

w!            如果想写只读文件,使用它强制写入文件

q!            不问你是否保存文件,强制退出

set nu    set 可以设置vim的某些特性,这里是设置每行开头提示行数。想取消设置,使用命令 set none

/            查找匹配字符串功能。如/(,将查找(和);如果想继续向下查找,可以按n键;向前继续查找则按N键

?            与/相似,但它是向前查找字符串

vim的注意事项:

1,当你不知道你是处于编辑方式还是命令方式时,可以使用Esc键退出命令方式,然后进行操作。

2,在使用vim时,万一发生了系统掉电或者突然关机时,可以使用恢复命令,如编辑file文件时突然断电或系统崩溃后的恢复命令:$ vi file -r

3.编程常用技巧:

%      跳转到配对的括号去

[[     跳转到代码块的开头去(但要求代码块中'{'必须单独占一行)

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

>>    缩进所有选择的代码

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

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

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

''    跳转到光标上次停靠的地方, 是两个', 而不是一个"

4.winmanager+ctags+taglist:

$ctags -R    进行ctag标签的初始化或者是更新,自动补全需要。

在源程序main.c不在tag目录时要进行以下操作:

:set tags= /src/main.c

<F1>      显示帮助

<cr>     如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件

-    返回上级目录

c    切换vim 当前工作目录正在浏览的目录

d    创建目录

D    删除目录或文件

i    切换显示方式

R    文件或目录重命名

s    选择排序方式

x    定制浏览方式, 使用你指定的程序打开该文件

5.自动补全

TAB键补全

Ctrl+X Ctrl+L    整行补全

Ctrl+X Ctrl+N     根据当前文件里关键字补全

Ctrl+X Ctrl+I     根据头文件内关键字补全

Ctrl+X Ctrl+]     根据标签补全

Ctrl+X Ctrl+F     补全文件名

Ctrl+X Ctrl+D     补全宏定义

Ctrl+X Ctrl+V     补全vim命令

Ctrl+X Ctrl+U     用户自定义补全方式

Ctrl+X Ctrl+S     拼写建议

6.编译:

VIM默认的设置为gcc的编译指令make,

编译完成后显示信息,

下面列出了命令

编译 :make

列出所有编译信息 :cl

显示第一条信息 :cfirst

显示最后一条信息 :clast

显示第n条信息 :cc n  例如显示第5条 :cc 5

显示下一条信息 :cn

显示上一条 :cp

如果此为错误信息,那么打回车,vim会自动把光标跳至错误行。

7.其他

1、连续行注释

使用Vim/Vi编辑shell脚本,在进行调试的时候,需要进行多行的注释,每次都要先切换到插入模式,在行首输入注释符“#”,再退回命令模式,非常麻烦。其实如果要注释连续行,可在命令模式下执行,格式如下:

:起始行,终止行s/要替换字符/替换为新字符/g

如需注释第1行到第20行,可以执行:1,20s/^/#/g

其中“^”表示在行首插入,“#”为要插入的字符,“g”表示执行替换时不确认,若希望每行交互询问是否执行,可将“g”改为“c”。

2、非连续行注释(可以直接写在vimrc里面)

如果注释非连续的多行,可以定义快捷键简化,格式为:

:map 快捷键 执行命令

如定义快捷键Ctrl+P为在当前行行首添加“//”注释,可以执行:

:map ^P I//

“^P”为定义快捷键Ctrl+P,要注意先按“Ctrl+v”再按“Ctrl+p”;

 

 

 

常用的map有:

1. cmap handles command-line mappings.

2. imap handles insert-only mappings.

3. map maps keys in normal, visual, and operator-pending mode.

4. map! maps keys in Vim's command and insert modes.

5. nmap maps keys in normal mode only.

6. omap maps keys in operator-pending mode only.

7. vmap maps keys in visual mode only.

另一个例子是:map <F10> <Esc>:tabnew<CR>,这里面的Esc是手动输入的~<CR>相当于回车

我在搜索的时候喜欢vim的高亮显示,但是我想在任意一个时候得到上次搜索的高亮结果(编辑的时候关掉,查找的时候开启),那么我在vimrc里写一个函数:

function ToggleHLSearch()

if &hls

set nohls

else

set hls

endif

endfunction

然后在后边在来一个映射:map <silent> <C-n> <Esc>:call ToggleHLSearch()<CR>

这样就解决了这个随时打开高亮搜索功能的问题。

如果要取消此快捷键,只需输入命令:

:unmap ^P

想查看设置的快捷键,输入:map即可看到。

3、缩略语

原来输入经常用的信息可以如此简单,

:ab 替代符 原始信息

示例如下:

:ab sammail sam_helen@vip.163.com

执行之后,在输入模式下任何地方录入“sammail”,再敲任意字母符号或者回车空格,咔嚓一下,利马就变成“sam_helen@vip.163.com”,那真是相当的方便啊!

:iab XXX YYY

要是不想替代就在输入完后按Ctrl+&#173;v

4、可以直接在Vim/Vi中执行UNIX/Linux命令不需退出Vim/Vi  :!命令

5、可以直接将其他文件内容导入当前编辑文件中

格式为:r 文件名

如,需要导入文件/etc/issue的内容,执行:r /etc/issue

先举个例子,很多程序员喜欢写完程序后在注释中写入当前时间,我有个好办法即省事又快速还准确,只需要在命令模式下执行:r !date

当前时间就自动被导入了,任何命令的结果导入到当前编辑文件中,格式为 r !命令

5、助力编程的查询功能

以前在Linux系统下写一些C语言程序,有时记性不好,忘记了语法格式,使用Vim/Vi编写时可直接查询。如写程序写到fork时,突然失忆了(失去了对这个东东的记忆),就可以直接把光标移动到fork上,按“K”(大写的K),直接就会跳到Linux程序员手册,看到fork的帮助,看完后回车继续编写。

6、:h quickref 翻到VIM Quick Reference页(有用!)。

7、环境变量%表示当前文件名。

8、# 加密(小心使用,不要忘了密码)

:X                                : 然后vim会提示你输入密码

:wq

9.csupport的常用操作:

-- 注释操作 -----------------------------------------------------------

\cl       end-of-line comment                 (n,v,i)

\cj       adjust end-of-line comment(s)       (n,v,i)

\cs       set end-of-line comment column      (n)

\c*       code -> comment /* */               (n,v)

\c/       code -> comment //                  (n,v)

\cc       code -> comment //                  (n,v)

\co       comment -> code                     (n,v)

\cfr      frame comment                       (n,i)

\cfu      function comment                    (n,i)

\cme      method description                  (n,i)

\ccl      class description                   (n,i)

\cd       date                                (n,i)

\ct       date \& time                        (n,i)

-- 常用结构 ---------------------------------------------------------

\sd       do { } while                        (n,v,i)

\sf       for                                 (n,i)

\sfo      for { }                             (n,v,i)

\si       if                                  (n,i)

\sif      if { }                              (n,v,i)

\sie      if else                             (n,v,i)

\sife     if { } else { }                     (n,v,i)

\sw       while                               (n,i)

\swh      while { }                           (n,v,i)

\ss       switch                              (n,v,i)

\sc       case                                (n,i)

\s{       { }                                 (n,v,i)

-- 预处理命令 -------------------------------------------------------

\p<       #include <>                         (n,i)

\p"       #include ""                         (n,i)

\pd       #define                             (n,i)

\pu       #undef                              (n,i)

\pie      #if  #else #endif                   (n,v,i)

\pid      #ifdef #else #endif                 (n,v,i)

\pin      #ifndef #else #endif                (n,v,i)

\pind     #ifndef #def #endif                 (n,v,i)

\pi0      #if 0 #endif                        (n,v,i)

\pr0      remove #if 0 #endif                 (n,i)

\pe       #error                              (n,i)

\pl       #line                               (n,i)

\pp       #pragma                             (n,i)

-- 常用短语 -------------------------------------------------------------

\if       function                            (n,v,i)

\isf      static function                     (n,v,i)

\im       main()                              (n,v,i)

\i0       for( x=0; x<n; x+=1 )               (n,v,i)

\in       for( x=n-1; x>=0; x-=1 )            (n,v,i)

\ie       enum   + typedef                    (n,i)

\is       struct + typedef                    (n,i)

\iu       union  + typedef                    (n,i)

\ip       printf()                            (n,i)

\isc      scanf()                             (n,i)

\ica      p=calloc()                          (n,i)

\ima      p=malloc()                          (n,i)

\isi      sizeof()                            (n,v,i)

\ias      assert()                            (n,v)

\ii       open input file                     (n,i)

\io       open output file                    (n,i)

-- 代码段支持-----------------------------------------------------------

\nr       read code snippet                   (n,i)

\nw       write code snippet                  (n,v,i)

\ne       edit code snippet                   (n,i)

\np       pick up prototype                   (n,v,i)

\ni       insert prototype(s)                 (n,i)

\nc       clear  prototype(s)                 (n,i)

\ns       show   prototype(s)                 (n,i)

\ntl      edit local templates                (n,i)

\ntg      edit global templates               (n,i)

\ntr      rebuild templates                   (n,i)

-- C++ ----------------------------------------------------------------

\+c       class                               (n,i)

\+cn      class (using new)                   (n,i)

\+ci      class implementation                (n,i)

\+cni     class (using new) implementation    (n,i)

\+mi      method implementation               (n,i)

\+ai      accessor implementation             (n,i)

\+tc      template class                      (n,i)

\+tcn     template class (using new)          (n,i)

\+tci     template class implementation       (n,i)

\+tcni    template class (using new) impl.    (n,i)

\+tmi     template method implementation      (n,i)

\+tai     template accessor implementation    (n,i)

\+tf      template function                   (n,i)

\+ec      error class                         (n,i)

\+tr      try ... catch                       (n,v,i)

\+ca      catch                               (n,v,i)

\+c.      catch(...)                          (n,v,i)

-- 编译调试 ----------------------------------------------------------------

\rc       save and compile                    (n,i)

\rl       link                                (n,i)

\rr       run                                 (n,i)

\ra       set comand line arguments           (n,i)

\rm       run make                            (n,i)

\rg       cmd. line arg. for make             (n,i)

\rp       run splint                          (n,i)

\ri       cmd. line arg. for splint           (n,i)

\rk       run CodeCheck (TM)                  (n,i)

\re       cmd. line arg. for CodeCheck (TM)   (n,i)

\rd       run indent                          (n,v,i)

\rh       hardcopy buffer                     (n,v,i)

\rs       show plugin settings                (n,i)

\rx       set xterm size                      (n, only Linux/UNIX & GUI)

\ro       change output destination           (n,i)

 

 

 

常用个性化设置:

全局变量

GLOBAL VARIABLE           DEFAULT VALUE                    TAG (see below)

g:C_GlobalTemplateFile     plugin_dir.'c-support/templates/Templates'

g:C_LocalTemplateFile      $HOME.'/.vim/c-support/templates/Templates'

g:C_TemplateOverwrittenMsg 'yes'

g:C_CodeSnippets          plugin_dir."/c-support/codesnippets/"

g:C_Dictionary_File       ""

g:C_LoadMenus             "yes"

g:C_MenuHeader            "yes"

g:C_OutputGvim            "vim"

g:C_XtermDefaults         "-fa courier -fs 12 -geometry 80x24"

g:C_Printheader           "%<%f%h%m%<  %=%{strftime('%x %X')}     Page %N"

Linux/UNIX:

g:C_ObjExtension         ".o"

g:C_ExeExtension         ""

g:C_CCompiler            "gcc"

g:C_CplusCompiler        "g++"

g:C_CFlags                "-Wall -g -O0 -c"

g:C_LFlags                "-Wall -g -O0"

g:C_Libs                  "-lm"

g:C_LineEndCommColDefault 49

g:C_CExtension            "c"

g:C_TypeOfH               "cpp"

g:C_CodeCheckExeName      "check"

g:C_CodeCheckOptions      "-K13"

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

2.关于一些基本设置

|:set|          :se[t]                    显示所有被改动的选项。

参数

'autoindent'      'ai'      根据上一行决定新行的缩进

'cindent'         'cin'     实现 C 程序的缩进

'cinkeys'         'cink'    设置 'cindent' 时启动缩进的键

'cinoptions'      'cino'    设置 'cindent' 时如何缩进

'cinwords'        'cinw'    'si' 和 'cin' 在这些词后加入额外的缩进

'shiftwidth'      'sw'      (自动) 缩进使用的步进单位,以空白数目计

'smarttab'        'sta'     插入 <Tab> 时使用 'shiftwidth'

sample

:set cin     实现 C 程序的缩进

:set sw=4    设计(自动) 缩进使用4个空格

:set sta     插入<tab>时使用'shiftwidth'

:set backspace=2 指明在插入模式下可以使用<BS>删除光标前面的字符

:set filetype=cpp 指定文件类型为C++,以便使用高亮关键字显示

:syntax enable 设置高亮关键字显示

怎么让vim在启动时自动设置?

启动vim的时候使用vim -u /root/vimrc.vim

Vim 会在启动的时候执行这个文件里的命令,并且使用:vertion可以查看到系统vimrc配置文件,用户vimrc配置文件等的路径

怎样让vim自动缩排代码?

将光标放在{处,按ESC到Normal模式,然后按v再按%就可以把大括号中内容选定,然后按=就可以按照C语言格式缩排

%命令的作用是跳到匹配处,比如括号之间,C的宏指令#if #else #endif之间。

“去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限

set nocompatible

“显示行号

set nummber

“检测文件的类型

filetype on

“记录历史的行数

set history=1000

“背景使用黑色

set background=dark

“语法高亮度显示

syntax on

“下面两行在进行编写代码时,在格式对起上很有用;

“第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;

“第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编写上很有用

set autoindent

set smartindent

“第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格

set tabstop=4

set shiftwidth=4

“设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号

set showmatch

“当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声

set vb t_vb=

“在编辑过程中,在右下角显示光标位置的状态行

set ruler

“默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示

set nohls

“查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一

“个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依

“次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词

“时,别忘记回车

set incsearch

,输入左边括号"("后自动完成")",并把光标定位到两个括号中间

:inoremap ( ()<ESC>i

:inoremap ) <c-r>=ClosePair(')')<CR>

:inoremap { {}<ESC>i

:inoremap } <c-r>=ClosePair('}')<CR>

:inoremap [ []<ESC>i

:inoremap ] <c-r>=ClosePair(']')<CR>

function ClosePair(char)

if getline('.')[col('.') - 1] == a:char

return "\<Right>"

else

return a:char

endif

endf

抱歉!评论已关闭.

×