分享

程序员用 vim 编辑代码的常用技巧

 herowuking 2014-04-10

程序员用 vim 编辑代码的常用技巧

在oschina看到不错的vim技巧文章,读了之后vi水平大有提高呵呵。 总结一下写代码的常用vi的命令,以后继续总结到这里来吧。大家有什么好的技巧也可以教我一下。

 

   

-----------基本动作--------------

i     切换到插入模式,在光标之前

a     切换到插入模式  在光标之后,自己体会和i的区别吧

I     切换到插入模式,光标在行的开始

A     切换到插入模式  光标在行的结尾


v  进入 visual mode ,选择模式?

R  进入替换模式,输入的文字直接覆盖替换光标下的字符。 直到按<Esc>建退出。


<Esc>  退出输入模式,

 

:w    保存文件

:w  newfilename  文件另存为

:q    退出编辑

:wq   保存并退出

:edit  打开另外一个文件, 可以用<TAB> 补全


u     undo  取消上次修改

ctrl + R    redo 重复上次修改


:help   后面加上某个命令,查看vim的帮助文档

 

--------------编程常用设置--------------------

:set nowrap  / set wrap   "禁止自动换行/启用自动换行  有时候不自动换行看起来更清楚一些

:set number   "显示行号

:set tabstop=4    "设置tab的宽度

:set shiftwidth=4  "设置自动缩进的的宽度

:syntax on   "语法高亮

:set filetype=c    "如果文件扩展名不是 c,可以用这个为vim指定文件格式。

:set cindent    "启用 C 的自动缩进

:set colorcolumn=80    "设置代码一行最多80字符长度的可视边界,7.3版本以后可用。

"不大常用的tab相关设置 :set softtabstop=4 ,:set smarttabs,  :set  expandtab   把插入的tab 都转换成空格  , 还有retab等,按照设置重新转换tab ? (用法 :%retab8 )  ,

 "突出显示当前行 set nocursorline

set cursorline

" 自动切换当前目录为当前文件所在的目录

set autochdir

" 允许在有未保存的修改时切换缓冲区,此时的修改由 vim负责保存

set hidden

 set nobackup  "禁用vim的自动备份文件功能

" 搜索时,高亮显示搜索到的单词


set hlsearch

colorscheme evening    "设置代码高亮 的 颜色配置方案为  evening 

"我比较喜欢下面这几种配色,都可以在网上找到吧 monokai  evening  twilight  vividchalk  freya  spiderhawk   

colorscheme monokai  "我觉得这个最好看了


set exrc  "设置vim加载所有目录下.vimrc文件,这样每个工程目录就可以有自己的自定义设置了。


set secure  '限制上一步设置里面的目录下的vimrc不能使用某些不安全的命令



很多配色方案可以到vim网站去找,不过这里也有个抓屏,查看方便

VIM Color Scheme Test 

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



设置编码, 参考 正确设置 Vim 的字符编码选项 http:///vim-gvimvim-on-win32

set encoding=utf-8  这个设置了之后会在文件结尾加上编码标志,只是gvim内部使用的? 我看有问题再设置这个选项好了

set fileencoding=

上面的设置可以直接执行也可以放到vimrc文件里面去,以便每次启动时有效。可以下面这个加到vimrc方便使用

 编码设置相关设置的说明: 来自 http://wensuper./blog/1495384

       encoding(enc):encoding是Vim的内部使用编码,encoding的设置会影响Vim内部的Buffer、消息文字等。在Unix环境下,encoding的默认设置等于locale;Windows环境下会和当前代码页相同。在中文Windows环境下encoding的默认设置是cp936(GBK)。 
        fileencodings(fencs):Vim在打开文件时会根据fileencodings选项来识别文件编码,fileencodings可以同时设置多个编码,Vim会根据设置的顺序来猜测所打开文件的编码。 
        fileencoding(fenc):Vim在保存新建文件时会根据fileencoding的设置编码来保存。如果是打开已有文件,Vim会根据打开文件时所识别的编码来保存,除非在保存时重新设置fileencoding。 
termencodings(tenc):在终端环境下使用Vim时,通过termencoding项来告诉Vim终端所使用的编码。 
        termencodings(tenc):在终端环境下使用Vim时,通过termencoding项来告诉Vim终端所使用的编码。 

|:help encoding-values|列出Vim支持的所有编码。 




设置gui界面 字体,打开时自动最大化

if has("gui_running")

    if has("win32")

        " 设定 windows 下 gvim 启动时最大化

        autocmd GUIEnter * simalt ~x

        " 设定 windows 下图形界面下的字体。该字体需要自己下载安装,下载地址:

        "好像程序员比较喜欢的字体有

        "1. Bitstream Vera Sans Mono

        "http://www-old./fonts/

        "http://ftp./pub/GNOME/sources/ttf-bitstream-vera/1.10/

        "2. 微软visual stuido 自带的 Consolas字体

        "http://www.microsoft.com/en-us/download/details.aspx?id=17879

        " 下载安装完,gvim的菜单里面又有了Consolas 字体,可以用下面这个设置

        "  set guifont=Consolas:h12:cANSI     

        "  Bitstream_Vera_Sans_Mono在默认的 gvim菜单里面有这个,

        "下面这个设置字体大小为12

         set guifont=Bitstream_Vera_Sans_Mono:h12:cANSI     

    else

        " 设定 linux 下图形界面下的字体,该字体 Fedora 7 自带

        set guifont=DejaVu\ LGC\ Sans\ Mono\ 14

    endif

endif



记录上次文件打开时的光标的位置,这个很好,下次打开自动把光标移到上次修改的地方。 BufReadPost 是文件加载完的时候的动作吧

 autocmd BufReadPost *

\ if line("'\"")>0&&line("'\"")<=line("$") |

\exe "normal g'\"" |

\ endif



"隐藏gvim的工具栏和菜单,按f1时才弹出, Toggle Menu and Toolbar
set guioptions-=m
set guioptions-=T
map <silent> <F1> :if &guioptions =~# 'T' <Bar>
        \set guioptions-=T <Bar>
        \set guioptions-=m <bar>
    \else <Bar>
        \set guioptions+=T <Bar>
        \set guioptions+=m <Bar>
    \endif<CR>

参考 http://vimdoc./htmldoc/gui.html




" 这个比较放到上面的go语言插件的后面才起作用,go那里好像重设置语法了

" 高亮显示行尾的空格,和空格和TAB键混用的情况

" http://vim./wiki/Highlight_unwanted_spaces

" ctermbg 必须用颜色名字,guibg可以用颜色值

highlight default ExtraWhitespace ctermbg=red guibg=#F92672

match ExtraWhitespace /\s\+$\| \+\t/

" 可以用下面这个删掉所有的行尾空格

" %s/\s\+$//

" 或者像下面这个map <leader>w git stripspace命令,来删掉这个 whitespace error

" 默认的<leader>键是 “\ ” 有的是逗号",”

function! Preserve(command)

  " Preparation: save last search, and cursor position.

  let _s=@/

  let l = line(".")

  let c = col(".")

  " Do the business:

  execute a:command

  " Clean up: restore previous search history, and cursor position

  let @/=_s

  call cursor(l, c)

endfunction


" delete all trailing whitespace in current file

if has ("win32")

map <leader>w :call Preserve(":%!c:/git/bin/git.exe stripspace")<CR>

else

map <leader>w :call Preserve(":%!git stripspace")<CR>

endif



set path="" vim搜索c的+include文件的路径,比如下面 [I   gf 命令等需要打开头文件的时候,就要根据这个path变量去搜索了。


------------移动光标---------------

h   j   k   l  光标 “左 下 上 右” 移动

0        光标移动到本行的的开始

^        光标移动到本行的第一个字符

$        光标移动到本行末尾

b        光标移到单词的开头

e        光标移到单词的末尾

w        光标移到下一个单词

大写的 E W和小写的e w类似,不过单词是以空格作为分界。移动光标到下一个空格的的前或者后面一个字符。

+       光标移到下一行的开头

-       光标移到上一行的开头

%        光标在匹配 最近() {} 块切换,这个很有用啊,类与visual studio中的ctrl + ]

‘’       两次单引号,光标移到上次修改的位置。 两次反引号 ` 才是正式的写法? 一个反引号加上一点(`.)也可以跳到最后一个修改的位置(参加mark和macro的用法  http://www./vi-vim-tutorial-5.gif

        其实是反引号书签的用法来的,    “m + 一个字母表示的书签名字”  就在当前行设置一个书签。   “反引号 + 一个字母表示的书签名字” 就跳到该书签的位置。

     标签的一个 用法,比如要删大量内容,可以在某个地方ma ,mz 之类的设置标签到某行,然后把光标移到对应的位置,再 d`a   y`z 之类的可以删除到指定标签位置的所有内容。

     gvim里面单引号和反引号一样的效果,ma 之后, ‘a可以移动到书签a的位置



G        光标移到文件的末尾

gg       光标移到文件的开始

行号+G   或者 行号+gg    跳转到第几行

f + 字符   光标移到本行的 下一个指定字符,搜索

F + 字符   光标移到本行的 上一个指定字符,反向搜索

{  段落的开始

}  段落的结尾


(  句子的开始

)  句子的结尾


g,    最近的修改

g;    最近的修改


gd 移到程序变量的定义   在函数里面查找

gD 移到程序变量的定义   在文件里面查找


[(   移到光标位置到  类似if 的条件判断的括号的开始

])   移到光标位置到 类似if 的条件判断的括号的结尾

[{    代码块的开始(for 循环if等的大括号)

]}    代码块的结尾 (for 循环if等的大括号)

[[  移到函数的开始{

]}  移到函数的结尾的}


[#   ]#   移到外层#if  #endif的 

[/  代码注释的块的开始

]/  代码注释的块的结尾

参考 *29.3* Moving through a program

 http://vimdoc./htmldoc/usr_29.html#29.3

 

 zz       光标当前位置滚动到移到屏幕的中间

zt  zb  光标当前位置滚动到屏幕顶端和底部

shitf + M   光标滚动到移到屏幕的中间, 自己体会 和zz的区别

shitf + H   光标滚动到移到屏幕的顶端

shitf + L   光标滚动到移到屏幕的底部

ctrl + E    向上滚屏

ctrl + Y   向下滚屏, windows的vim听说需要重新map一下命令才有效果,否则是redo效果,自己google一下吧

ctrl + F  ctrl +B  上下翻页


ctrl  + o    ctrl + i  移动光标到上一次光标所在的位置,在光标的历史位置记录里面前后移动。

*CTRL-O* 

CTRL-O Go to [count] Older cursor position in jump list 
(not a motion command). {not in Vi} 
{not available without the |+jumplist| feature} 

<Tab> or *CTRL-I* *<Tab>* 
CTRL-I Go to [count] newer cursor position in jump list 
(not a motion command). 
In a |quickfix-window| it takes you to the position of 
the error under the cursor. 
{not in Vi} 
{not available without the |+jumplist| feature} 

--------------搜索用法-----------------

# 和 *      在文件搜索光标当前位置的单词,高亮位置。向前和向后搜索。 非常有用。

g# g*      同# *用法,但搜索的时候,当前单词如果作为其他的单词的一部分的时候,也高亮显示。# 和 *  要求完整匹配,这个值要求部分包含就可以了

/  和 ?    进入搜索模式,在文档搜索相应的单词。 向前和向后

 

n  和 N     上面的两个搜索用法之后,向前和反向搜索下一个

 

[I     类似# 和 * 用法,不过显示一个快速列表。 还有这个用来搜索c /c++变量定义的,默认会用tags,但如果没有tags,也会在include 的头文件里面也会搜索,准确找到该类型的定义。这点和gD  gd比较类似。 gD在文件里面搜索变量定义,gd在函数里面搜索,但这个[I 会搜索#include的文件。 include的查找目录由vim的path变量定义,可以修改vimrc配置文件指定path变量,不然vim会找不到头文件的。

数字 + [ + <TAB>     跳到上面一条命令里面显示的第几个 位置去。

]I  类似[I   但只列出后面的

]i  类似[I   但只列出前面的

参考 *29.4* Finding global identifiers  http://vimdoc./htmldoc/usr_29.html#29.4



 :/buf\c   搜索内容时,后面加上 \c 不区分大小写

---显示搜索命令历史--

q/ 显示搜索命令历史的窗口 

q? 显示搜索命令历史的窗口 可以选择重用以前用过的搜索查找命令


在多个文件里面搜索

:vimgrep /pattern/[j][g] file file2... fileN



/joe/e                      : cursor set to End of match  搜索时可以移动光标到相对单词结尾偏移的位置

3/joe/e+1                   : find 3rd joe cursor set to End of match plus 1 [C] 

/joe/s-2                    : cursor set to Start of match minus 2  搜索时可以移动光标到相对丹迪开头偏移的位置

:g/gladiolli/#              : 弹出所有的包含gladiolli的行供    类似  [I  但【I使用的是当前光标下的词来搜索


/jo[ha]n     Search john or joan

/\< the      Search the, theatre or then

/the\>       Search the or breathe

/\< the\>   Search the

/fred\|joe   Search fred or joe

/\<\d\d\d\d\>   Search exactly 4 digits

/^\n\{3}    Find 3 empty lines


------------替换操作------------------------------

:s/要替换的单词/替换为的内容/             和perl里面的正则一样啊,  

:%s/buf_/buf/c    在全文件替换buf_ 为buf,并且询问是否替换

:127,215 s/foo/bar    替换127行到215之间的foo为bar。

. 表示当前行, $表示最后一行,


:%s/\%Vold/new/g                : Do a substitute on last visual area [N]


. or $ for current and last lines respectively. One could also use relative prefixes + and - to refer to offsets after or before the curent line, respectively. Thus: :.,$j meaning "from the current line to the last line, join them all into one line". :% is synonymous with :1,$ (all the lines).

The :... g and :... v commands bear some explanation as they are incredibly powerful. :... gis a prefix for "globally" applying a subsequent command to all lines which match a pattern (regular expression) while :... v applies such a command to all lines which do NOT match the given pattern ("v" from "conVerse"). As with other ex commands these can be prefixed by addressing/range references. Thus:.,+21g/foo/d means "delete any lines containing the string "foo" from the current one through the next 21 lines" while :.,$v/bar/d means "from here to the end of the file, delete any lines which DON'T contain the string "bar."


参考文档 |10.2| Substitution

 http://vimdoc./htmldoc/usr_10.html#10.2



:%s/old/new/g    Replace all occurences of old by new in file

:%s/old/new/gw    Replace all occurences with confirmation

:2,35s/old/new/g   Replace all occurences between lines 2 and 35

:5,$s/old/new/g   Replace all occurences from line 5 to EOF

:%s/^/hello/g    Replace the begining of each line by hello

:%s/$/Harry/g    Replace the end of each line by Harry

:%s/onward/forward/gi   Replace onward by forward, case unsensitive


---------------删除、复制和粘帖--------------------

o      在光标位置下面新建一行

O     在光标位置上面新建一行

j        合并上下两行为一行

d       删除

c       change 剪切并进入插入模式, 和d的区别是这个会把剪切的记录也保存到重复命令   .    的记录里面去。

C    D   d$  c$   删到行的结尾

s      删除当前字符并且进入插入模式

S      删掉一整行然后进入插入模式

行数+ dd    删除指定行数,比如 3dd  删除3行

行数+ cc    和 上一个类似,但会记录重复记录。

 yy                 复制当前行内容到剪切板

行数+ yy         复制多少行, 3yy  复制3行 

p    在光标前粘贴

P  在光标后粘贴

r   替换当前选中内容,关于选择,参见下面xisual 模式


可以组合使用

y2w 复制后面连个单词

d2w    删除两个单词

db     删除到单词开头

di(   di)     da(  da)   删除括号里面的块

di>    di<

di{    di}

同样有

 ce     cw   c3w 等


d/foo  删除到后面第一个出现foo的地方

y?bar  同样有复制到前面第一个出现bar的位置

y2/foo 复制当前光标位置到后面第二次出现foo之间的字符。

d/fred/                                :delete until fred

y/fred/                                :yank until fred

c/fred/e                               :change until fred end


利用标签用法,删除或复制大块数据

可以在某个地方ma ,mz 之类的设置标签到某行,然后把光标移到对应的位置,再 d`a  c'a  y`z   之类的可以删除或复制从当前光标所在wei位置到标签所在位置的所有内容。 修阿删除多行数据时这个比较方便。


利用visual模式,删除或复制大块数据。

按v 或者V 进入visual模式后,可以选择大块内容,用d c y 等进行操作。参考某某的 “选择块”的介绍。



"*  双引号+星号 再加上复制或者粘贴命令,把内容复制到系统剪切板,

"*yy  把当前行复制到系统剪切板

"*p   从系统剪切板粘帖出来

 


:%s/ *$//g      Delete all white spaces

:g/string/d     Delete all lines containing string

:v/string/d     Delete all lines containing which didn’t contain string

:s/Bill/Steve/    Replace the first occurence of Bill by Steve in current line

:s/Bill/Steve/g    Replace Bill by Steve in current line

:%s/Bill/Steve/g    Replace Bill by Steve in all the file

:%s/\r//g             Delete DOS carriage returns (^M)

:%s/\r/\r/g             Transform DOS carriage returns in returns

:%s#<[^>]\+>##g        Delete HTML tags but keeps text

:%s/^\(.*\)\n\1$/\1/           Delete lines which appears twice

ggVGg?                  Change text to Rot13

---------------------------------

指定寄存器

d   c  s  y p 等指令操作的内容,默认保存到 “” 寄存器。但也可以用双引号加 一个字母表示的名字指定26个寄存器中任意的一个。

小写字母表示替换原有寄存器的内容,大写表示追加内容到寄存器

"ayy    复制当前行内容到 a号寄存器

“Ayy   把当前行内容添加到寄存器a里面,如果以前a寄存器已经有一行内容了,那么这个做完a寄存器就有两行内容了。

"ap  粘帖寄存器a里面内容

"bp  粘帖寄存器b里面内容

:reg             : display contents of all registers
:reg a           : display content of register a
qqq              : empty register "q"  应该是记录 一个空的宏到寄存器,所以寄存器就被清空了
qaq              : empty register "a"


其他的还有 0 到9好等寄存器,只读寄存器等,参考文档 

registers

http://vimdoc./htmldoc/change.html#registers


:g/^\s*$/d                  : delete all blank lines

:g!/^dd/d                   : delete lines not containing string

:v/^dd/d                    : delete lines not containing string

:g/joe/,/fred/d             : not line based (very powerfull)

:g/fred/,/joe/j             : Join Lines [N]

:g/^/t.                     : duplicate every line

----------------重复命令-----------------------

.      按 “点” 这个句号字符重复执行命令,  从上一个按 i 进入“插入模式”开始到  esc建退出的所有动作。

       非常有用。不如用了重复删除 重复粘贴等。


 

-------------选择块---------------------------

vim里面的 “visual mode”应该也去学一下。 选择文字时用比较方便。就是进入这个模式之后,把当前光标和你移动到的光标的内容都选择起来。

v     进入 visual 选择模式,以字符为选择单位

V    选择viusal模式,不过以整行为选择单位

然后就可以用 hjkl键选择区域。 


组合命令

“viB”  选择当前光标所在的两个大括号包含的整个代码块,不包含大括号  

“vaB”  选择当前光标所在的两个大括号包含的整个代码块,包含大括号

类似的有

vib vab   选择两个括号里面的一整块内容

viw vaw  选择一个单词

 

类的的组合有,用于选择大括号 尖括号等里面的内容,i不包含,a包含。可以和其他编辑命令组合使用。

ii{

a{

i(   a(

i<  a< 

i[   a[


也可以用鼠标直接选择区域,那就是select mode,后用鼠标选取之后,可以用ctrl + O  或者ctrl + G切换到visual mode。


很多命令可以在 visual mode下面操作,参考这里

http://vimdoc./htmldoc/visual.html#visual-operators


比较常用的有,选择多行之后进行删除复制,修改代码缩进等。


---------viusul mode的整块操作模式----Blockwise operators------------

ctrl  + v  开始进入viusual mode的整块操作模式选取。

然后可以用hjkl 键选择块。

可以I之后修改esc退出后就应用到所有的行。 d删除,p可以粘贴整块的内容等。

windows因为快捷键默认ctrl +v 是粘贴,所以 ctrl + q才是块操作。

这个功能可以用来给多行代码前面加上注释 // 。


其他的块模式的操作有

I 在block的前面插入

A  添加字符串到 block的结尾

c  C  修改block的每一行内容为指定字符床

< >  整block的缩进修改

r    替换

d 删除整个选中的block

p 粘贴整块block

参考 http://vimdoc./htmldoc/visual.html#blockwise-operators





其他visual模式说明参考详细参见:

http://vimdoc./htmldoc/visual.html#Visual

 

-------------代码缩进-----------------

<      选择块减少缩进,自己先用visual 模式,viB 选择块之后,再做这个就可以缩进一整块   

>      选中块增加缩进。   这个缩进宽度由  set shiftwidth=4 定义 

 <iB   >iB    <aB   >aB 可以直接使用,不用先选择代码块。

>i{   <a{ 等

>%    也可以直接把光标移到块的前面或者后面的大括号那里,然后运行    >%   命令就可以了,同样应也有 <%

>i{     上面那个是把大括号一起移动的,这个缩进不包含大括号。

 =     自动缩进代码块,用法,先把光标移到一块的起始括号那里 { ,然后 执行   =%  就可以格式化整个代码块了。

>>   当前行减少缩进, 左移

<<    当前行增加缩进,右移

5>>   行数加缩进,那么就一共几行一起调整缩进

 


组合命令

==   格式化当前一行。

=a{       等号加上其他选择块命令,  格式化 一个 代码块。

1G=G    解释1G移到文件开始, G移到文件结束,所以这个组合就是格式化整个文件的代码。

gg=G    和 1G=G  等价


  -------------------大小写转换--------------------------------------

 按 v 进入”visual mode “ 模式,然后选中制定的文字,

再  gu  ,选中的文字转换为小写。

    gU  选中的文字转换为大写。


guW   guW 等命令可以直接转换一个单词的,但我在Windows的 gvim里面好像默认没有这个用法,只能先到visual选择模式 gu才可以用。肯恩那个是vim或者linux平台的默认设置吧。


转换光标下面的字符的就是 vgu  vgU 啦,

一开始发现不进入 ”visual mode “ 模式不能进行大小写转换,不过后来发现,这些也是可以直接使用的,下面这些更方便一些吧

 ~ 将光标下的字母大小写反向转换 

guw 将光标所在的单词变为小写 

guw 将光标所在的单词变为小写 

gUw 将光标所在的单词变为大写 

guu 光标所在的行所有字符变为小写 

gUU 光标所在的行所有字符变为大写 

g~~ 光标所在的行所有字符大小写反向转换


同样有 gU2w 等组合

------------------ 其他辅助编程用法-----------------------

[CTRL-I, ]CTRL-I Search for a word under the cursor in the current file and

any brought in by #include directives.

gd,  Search for the definition of a variable 在函数里面查找

gD Search for the definition of a variable 在整个文件查找

]CTRL-D, [CTRL-D Jump to a macro definition.

]d, [d, ]D, [D Display macro definitions


CTRL-A,CTRL-X : increment, decrement next number on same line as the cursor 只在Linux下面起作用。Windows可能需要重新做一下按键映射


ctrl + n   insert模式时,在输入很长的变量名字函数名字时,可以使用这个做自动补全,就不用完整的敲入整个变量名字了

ctrl + p  按ctrl + n补全之后,如果不合适,可以用这个取消补全,


----------------------- 临时退出 Vi/Vim、进入 shell 环境后再回来的要求:-------------------------------

方法一:使用 Ctrl-z 以及 fg 这两个命令组合。

  这一解决方法主要利用了 Linux/Unix 的作业机制。具体原理是:Ctrl-z 命令将当前的 Vi/Vim 进程放到后台执行,之后 shell 环境即可为你所用;fg 命令则将位于后台的 Vi/Vim 进程放到前台执行,这样我们就再次进入 Vi/Vim 操作界面并恢复到原先的编辑状态。

方法二:使用行命令 :sh。

  在 Vi/Vim 的正常模式下输入 :sh即可进入 Linux/Unix shell 环境。在要返回到 Vi/Vim 编辑环境时,输入 exit 命令即可。

  这两种方法实现机制不一定,但效果一样,都非常快捷有效。

---------------------------------取得外部输入--------------------------------------------------------------

 : r!<cmd> 将命令 <cmd> 的输出结果插入到当前光标所在位置 

:r <file> 将文件 <file> 读入到当前光标所在位置

---------------------把多条命令录制为宏------------------------------

q  加上 一个字母表示宏的名字      表示开始宏的录制

q  再次按q,表示录制完成

@  加 一个字母的表示的宏的名字,表示执行对应的宏

比如qa 开始录制宏a, 然后按q停止,再@a就可以执行刚刚录制的宏a了

@@  执行最后一次执行过的宏。

5@@ 重复执行5次最后一次行的宏


多个组合操作需要重复执行的时候,使用这个功能可以方便很多。

参考

10.1*Record and playback commands

http://vimdoc./htmldoc/usr_10.html#10.1


http://www./vi-vim-tutorial-5.gif

------------------设置键盘快捷键-------------------

The main commands to know when dealing with key bindings are:

:map for the modes Normal, Insert, Visual and Command-line  所有模式都起作用

:imap for Insert mode only     只在insert模式起作用

:cmap for Command-line mode only

:nmap for Normal mode only

:vmap for Visual mode only


一个例子,把ctrl + s 映射为后面保存文件

:map <C-s> :w<cr>


其他常用按键表示

<CR>     : carriage Return for maps      <Space> 空格键
<Esc>    : Escape
<Leader> : normally \  change with :let mapleader = ","
<Bar>    : | pipe
下面这个用在按键映射里面不错,不过肯能只在Linux下面有效,比如下面这个映射为在当前目录搜索当前光标所在的单词
	:nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr>
CTRL-R CTRL-W   : pull word under the cursor into a command line or search
CTRL-R CTRL-A   : pull whole word including punctuation
CTRL-R -        : pull small register
CTRL-R [0-9a-z] : pull named registers
CTRL-R %        : pull file name (also #)


参考 http://vimdoc./htmldoc/map.html

------------------------查看执行过的命令 历史记录---------------------------


: 上下键 查找和补全


:history   列出所有的历史记录

:his c  

:his s

-------------------VIM buffer 窗口-------------------------------------------------------

VIM里面一个buffer对应一个打开的文件


" 允许在有未保存的修改时切换缓冲区,此时的修改由 vim负责保存

:set hidden


"查看已经打开的buffer

:ls   或者 :buffers  命令都可以


“在不同的buffer直接切换,这个很好用

ctrl + 6


"切换到对应的buffer去 比如下面切换到第2个buffer 

:buffer 2


"用不同的窗口打开所有的buffer

:ball

:vertical ball  "在垂直分隔的窗口打开所有buffer


:sbuffer  "split buffer到不同的窗口


前后一个buffer

:bnext   :bn

:bprevious   :bp


:bd[elete][!] [N]  可以指定号码的buffer,不指定buffer号码就关闭当前buffer, 会关闭打开这个buffer的所有windoww,并显示另外一个buffer。 不同于 :q[uit]  和 :close的关闭window命令


另外还可以使用辅助插件

bufexplorer.zip : Buffer Explorer 插件

http://www./scripts/script.php?script_id=42

安装完 输入 :BufExplorer  , 就会弹出一个包含所有buffer列表的窗口供选择。用鼠标或者键盘都可以跳转的到对应的buffer去。

或者在normal模式直接输入下面这个斜杠开始的命令,都可以打开bufexplorer的窗口。

  '\be' (normal open)  or 

  '\bs' (force horizontal split open)  or 

  '\bv' (force vertical split open) 


"可以把f9映射为这个buffer浏览的快捷键。

noremap <silent> <F9> :BufExplorer<CR>

nmap <F10> :bn<CR>

nmap <F11> :bp<CR>

--------------------------------配置gvim左侧文件浏览栏------------------

安装 nerdtree  这个插件

https://github.com/scrooloose/nerdtree

然后就可以,用  :NERDTree 命令启动 左侧浏览栏,然后 在左边点击 文件名 就自动打开,鼠标中建点击,在新的窗口打开文件。

t 键 打开一个新的 tab 窗口里面打开文件。

然后可以在vimrc中加入下面这行代码让vim 启动是自动打开 文件浏览栏。

autocmd vimenter * NERDTree


安装很简单,网页有说明

cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git

在Windows 平台,放到vim的安装目录就可以了。没有装git自己下载对应的插件文件放到对应的目录去就可以了。


最好也安装一下这个插件配合,这样在gvim里面启动时,自动启动NERDTree 的文件浏览栏,并且打开新的tab是,这个文件浏览窗口也始终显示。

不用配置前面的autocmd vimenter * NERDTree 命令了。 他autoload目录的插件自动加载。

https://github.com/jistr/vim-nerdtree-tabs


有很多默认选项开关 ,可以参考网页的说明

let g:nerdtree_tabs_open_on_gui_startup=1     这个默认就是1了,

let g:nerdtree_tabs_open_on_console_startup=1   直接在字符终端的的vim里面也默认启动 NERDTree


不过他这个插件加载比较慢,需要的时候再打开比较好

" 把F2映射为显示左侧目录浏览树窗口开关

map <F2> :NERDTreeToggle<CR>

-----------------------c/c++ 结构解析,函数快捷查找-------------------------------------------

另外为了浏览文件是查看搜索函数名字,有人还喜欢安装 

cscope

ctags

taglist

等插件,这样查看搜索函数定义之类的方便一点吧。有需要的时候在网上找一下相关资料吧



------------------vim里面搜索目录下的文件,quickfix模式和grep--------

在vim里面直接搜索目录下的文件的内容


:grep sendv *.c       使用外部grep程序

:vimgrep /sendv/   *.c   使用内部vim 模式的搜索,速度较慢 Vim 需要载入每个文件,就像编辑它们那样。如果文件里没有匹配,相应

的缓冲区又会被彻底删除

:vimgrep sendv\c   *.c   使用内部vim 模式的搜索,速度较慢


:help vimgrep

greo 在windows系统默认调用的是findstr /n命令来进行搜索的的, 可以通过  :set grepprg 设置来修改设置

linux缺省为 "grep -n " 参考

http://vimcdoc./doc/options.html#'grepprg'

我安装了git 自带一个mingw的grep 还是改为用grep好了,比findstr命令好用吧

:set grepprg=c:/git/bin/grep.exe\ -n

:grep -i sendv *.c 这样就可以用grep的各种参数了

其他的'grepformat'设置vim怎么解析grep的输出,一般都不用修改了吧。参考vm的文档



搜索之后只显示一行,可以:cc 重复显示结果

或者打开 quickfix窗口


:cw[indow] [height]     当存在可以识别的错误时,打开窗口。如果该窗口已经打开且

                        没有可识别的错误,则将此窗口关闭。

:cope[n] [height]       打开一个窗口显示当前的错误列表。

:ccl[ose]               关闭 quickfix 窗口。


:colder 和 :cnewer  合适显示十个搜索历史记录


在打开的窗口里面可以直接用鼠标双击和enter键可以跳到指定找到的指定位置去。

但以前的窗口缓冲器没有修改才行?   在quickfix 窗口  ctrl +w 在按enter键,可以在新窗口打开。


ctrl + w 在窗口直接切换



在quickfix模式里面常用操作

:cc                显示详细信息 ( :help :cc )

:cp                跳到上一个结果 ( :help :cp )

:cn                跳到下一个结果 ( :help :cn )

:cl                列出所有结果 ( :help :cl )

:cw                如果有结果列表,则打开quickfix窗口 ( :help :cw )

:col               到前一个旧的结果列表 ( :help :col )

:cnew              到后一个较新的结果列表 ( :help :cnew ) 


可以把这些命令映射到快捷建方便使用

":nmap <F4> :cw<cr>

":nmap <F4> :cclose<cr>

:nmap <F5> :cn<cr>

:nmap <F6> :cp<cr>

   "把 f3 按键映射为在本目录下文件里面搜索光标下面的单词

if has("win32")

" grep的设置

:set grepprg=c:/git/bin/grep.exe\ -n

"windows平台用这个

:nmap <F3> "*yw<cr>:grep <c-v> ./*<cr><esc>:cw<cr>

else

" linux 平台用这个

:nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr>

endif


可以使用下面这个显示和隐藏quickfix窗口的函数,这样cw 和 cclose功能都映射到同一个按键了

" 弹出和隐藏quickfix窗口

" 来自http://vim./wiki/Toggle_to_open_or_close_the_quickfix_window

function! QFixToggle()

  if exists("g:qfix_win")

    cclose

    unlet g:qfix_win

  else

    " copen 10

cw

    let g:qfix_win = bufnr("$")

  endif

endfunction

let g:qfix_win = 1

nmap <script> <silent> <F4> :call QFixToggle()<CR>



参考http://vimcdoc./doc/quickfix.html


这种quickfix的用法,vim内部出了grep 还支持make和其他编译工具的,可以参考vim的文档

--------------------------------------



vim-multiple-cursors插件 “True Sublime Text style multiple selections for Vim”

======================================================

https://github.com/terryma/vim-multiple-cursors

允许同时选择多个同名变量,同时修改。 参考上面主页上面的动画演示。比较有意思的一个插件,


可以用 git clone https://github.com/terryma/vim-multiple-cursors 把目录复制下来,然后把autoload 和 doc plugin目录复制到vim目


录去使用就可以了。

使用起来很简单,在normal模式,把光标移到一个变量名字上面,再不停的按 ctrl +n 就把相同名字的变量都选中了。然后使用vim的命令就


可以编辑了。esc退回普通模式。



commentary.vim 快捷注释代码插件

========================

https://github.com/tpope/vim-commentary

Commentary 可以帮你注释代码。在normal模式输入gcc 即可将该行注释(Commentary 会根据当前的 filetype 使用.

在visual 模式,额可以选择多行,然后输入 gc ,注释掉整个选中内容。

再次敲击 gcc 即可还原注释。我把空格键作为注释映射,下面这样:


nmap <space> gcc

vmap <space> gc

即在 normal 模式下,敲击空格键可以注释当前行,在 visual 模式下,敲击空格键可以注释选中的内容

参考了 http:///2013/11/my-vim-configuration-plugin/的设置


NERD Commente  另外一个辅助注释代码的插件

================================

http://www./scripts/script.php?script_id=1218


vim-expand-region 自动扩展选择区域的插件

==================================

https://github.com/terryma/vim-expand-region

可以通过 +   _  按键来扩大选择区域。比如,比如光标在单词中间,按一下 +,就选中整个单词,再+就选中单词外层的括号里面内容。等等,可以去上面主页去看动画。我只想在visual模式才使用这个功能,他插件里面会自己做一下判断你是否已经映射了快捷键的,如果已经有了,它就不在做nmap的普通模式的映射了。


" 自动扩大选择区域的插件,让它只在visual 模式才使用+  _键盘映射 

vmap + <Plug>(expand_region_expand)

vmap _ <Plug>(expand_region_shrink



YouCompleteMe

===========

c/c++的最好用的自动补全插件,基于clang的c/c++语法分析



 强烈推荐阅读下面这篇文章,体会 重复命令和 组合命令用法。

 http://www.oschina.net/news/25882/why-they-are-using-vi

为什么这些死脑筋们在用 VI ?

 

翻译的还好,也许你要原版的。

Why, oh WHY, do those #?@! nutheads use vi?

http://www./a-why-vi-vim.html

 

后来也参考了

技巧:快速提高 Vi/Vim 使用效率的原则与途径

http://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/ 


vim的官方文档,可以用去看一下。不错的,详细的说明。

http://vimdoc./htmldoc/usr_toc.html

 不过好像http://www./vim/vimbook-OPL.pdf   这个更有条理一些,讲的很详细,而且例子也不错,也将很多编程相关的高级用法等。我也参考了一下这个书。


之前发的一个图也是很好的参考。

http://hiphotos.baidu.com/widebright/pic/item/5d880d241eb39b40c89559a6.jpg

原来图是来自这里的啊 

Graphical vi-vim Cheat Sheet and Tutorial  

 http://www./a_vi_vim_graphical_cheat_sheet_tutorial.html

这网站还有很多图,给出由浅入深的学习步骤图。


不错的参考图书

Hacking Vim

A cookbook to get the most out of the latest

Vim editor


这个帖子提到的几个用法也不错

http:///questions/1218390/what-is-your-most-productive-shortcut-with-vim/1220118#1220118



Best of Vim Tips

http://www./vimtips.html


Using vim as C/C++ IDE

http://www./2014/using-vim-as-c-cpp-ide/

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多