vim使用技巧

来源:互联网 发布:开淘宝店怎么上传照片 编辑:程序博客网 时间:2024/05/18 15:56
Best of Vim Tips 中文版
 
 
 
每个想深入学习 Vim 用户都会认真阅读的文章,官网链接:http://www.rayninfo.co.uk/vimtips.html 


这篇文章被很多人翻译过,但那是都很早了,所在原来的一系列翻译的基础上修正原来翻译欠妥的,错误的,以及近两年更新的内容。


__BEGIN__
------------------------------------------------------------------------------
# searching 查找 
/joe/e                      : cursor set to End of match 
                              把光标定位在匹配单词最后一个字母处 
/joe/e+1                    : cursor set to End of match plus 1 
                              把光标定位在匹配单词最后一个字母的下一个字母处 
/joe/s-2                    : cursor set to Start of match minus 2 
                              把光标定位在匹配单词第一个字母往前数两个字母的位置 
/^joe.*fred.*bill/          : normal 
                              标准的正则表达式 
/^[A-J]\+/                  : search for lines beginning with one or more A-J 
                              查找以一个或多个 A-J 中的字母开头的行 
/begin\_.*end               : search over possible multiple lines 
                              查找在 begin 和 end 两个单词之间尽可能多的行 
/fred\_s*joe/i              : any whitespace including newline 
                              查找在 fred 和 joe 两个单词之间任意多的空格,包括新行 
/fred\|joe                  : Search for FRED OR JOE 
                              查找 fred 或 joe 
/\([^0-9]\|^\)%.*%          : Search for absence of a digit or beginning of line 
                              查找 
/.*fred\&.*joe              : Search for FRED AND JOE in any ORDER! 
                              查找同时包含 FRED 和 JOE 的行,不分前后顺序 
/\<fred\>/i              : search for fred but not alfred or frederick 
                              查找 fred, 而不是 alfred 或者 frederick,也就是全字匹配 
/\<\d\d\d\d\>            : Search for exactly 4 digit numbers 
                              查找4个数字的全字匹配 
/\D\d\d\d\d\D               : Search for exactly 4 digit numbers 
                              查找4个数字的全字匹配 
/\<\d\{4}\>              : same thing 
                              同上 



# finding empty lines 查找空行 
/^\n\{3}                    : find 3 empty lines 
                              查找 3 行空行 
# Specify what you are NOT searching for (vowels) 
# 指定不要查找什么 
/\c\v([^aeiou]&\a){4}       : search for 4 consecutive consanants 


# using rexexp memory in a search 
# 在查找中使用正则表达式存储 
/\(fred\).*\(joe\).*\2.*\1 

# Repeating the Regexp (rather than what the Regexp finds) 
# 重复正则表达式 
/^\([^,]*,\)\{8} 


# visual searching 
# 可视模式下的查找 
:vmap // y/<C-R>"<CR>       : search for visually highlighted text 
                                     查找被高亮显示的文本 
:vmap <silent> //    y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : with spec chars 


# searching over multiple lines \_ means including newline 
# 查找多行。\_ 表示包括新行 
/<!--\_p\{-}-->                : search for multiple line comments 
                                     查找多行注释 
/fred\_s*joe/i                    : any whitespace including newline 
                                     查找在 fred 和 joe 两个单词之间任意多的空 
格,包括新行 
/bugs\(\_.\)*bunny                : bugs followed by bunny anywhere in file 
                                     bugs 后任意位置含有 bunny 单词的多个行 
:h \_                             : help 
                                     帮助 




# search for declaration of subroutine/function under cursor 
# 查找光标下子程序/函数的声明 
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR> 


# multiple file search 
# 在多个文件中查找 
:bufdo /searchstr 
:argdo /searchstr 


# How to search for a URL without backslashing 
# 如何不使用反斜线查找 URL 
?http://www.vim.org/        : search BACKWARDS!!! clever huh! 
---------------------------------------- 
# substitution 
# 替换 
:%s/fred/joe/igc            : general substitute command 
                               普通替换命令 
:%s/\r//g                   : Delete DOS returns ^M 
                               删除 DOS 回车符 ^M 


# Is your Text File jumbled onto one line? use following 
# 你的文本文件是否乱七八糟的排成一行?使用如下命令 
:%s/\r/\r/g                 : Turn DOS returns ^M into real returns 
                               转换 DOS 回车符 ^M 为真正的回车符 
:%s=  *$==                  : delete end of line blanks 
                               删除行尾空格 
:%s= \+$==                  : Same thing 
                               同上 
:%s#\s*\r\?$##              : Clean both trailing spaces AND DOS returns 
                               删除行尾空格和 DOS 回车符 
:%s#\s*\r*$##               : same thing 
                               删除行尾空格和 DOS 回车符 


# deleting empty lines 
# 删除空行 
:%s/^\n\{3}//               : delete blocks of 3 empty lines 
                               删除三行空行 
:%s/^\n\+/\r/               : compressing empty lines 
                              压缩多行空行为一行 




# IF YOU ONLY WANT TO KNOW ONE THING 
# 如果你只想明白一件事情 
:'a,'bg/fred/s/dick/joe/igc : VERY USEFUL 
                               非常有用 


# duplicating columns 
# 复制列 
:%s= [^ ]\+$=&&=            : duplicate end column 
                               复制最后一列 
:%s= \f\+$=&&=              : same thing 
                               同上 
:%s= \S\+$=&&               : usually the same 
                               同上 
# memory 
# 记忆,或叫引用 
:s/\(.*\):\(.*\)/\2 : \1/   : reverse fields separated by : 
                               反转以 : 分隔的字段 
:%s/^\(.*\)\n\1/\1$/        : delete duplicate lines 
                               删除重复的行 


# non-greedy matching \{-} 
# 非贪婪匹配 \{-} 
:%s/^.\{-}pdf/new.pdf/      : delete to 1st pdf only 
                               只删除到第一个 pdf 




# use of optional atom \? 
:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : lowercase with optional leading characters 
                                        不懂 


# over possibly many lines 
# 匹配尽可能多的行 
:%s/<!--\_.\{-}-->//        : delete possibly multi-line comments 
                                  删除尽可能多的注释 
:help /\{-}                 : help non-greedy 
                               非贪婪匹配的帮助 


# substitute using a register 
# 使用寄存器替换 
:s/fred/<c-r>a/g         : sub "fred" with contents of register "a" 
                               用"a"寄存器里的内容替换"fred" 
:s/fred/\=@a/g              : better alternative as register not displayed 
                               更好的方法,不用显示寄存器内容 


# multiple commands on one line 
# 写在一行里的复杂命令 
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/ 


# ORing 
:%s/suck\|buck/loopy/gc     : ORing (must break pipe) 
                               不懂 
# Calling a VIM function 
# 调用 Vim 函数 
:s/__date__/\=strftime("%c")/ : insert datestring 
                                插入日期 

# Working with Columns sub any str1 in col3 
# 处理列,替换所有在第三列中的 str1 
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2: 

# Swapping first & last column (4 columns) 
# 交换第一列和最后一列 (共4列) 
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1: 

# filter all form elements into paste register 
# 把所有的form元素(就是html里面的form啦)放到register里 
:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END 
:nmap ,z :redir @*<Bar>sil exec 
'g@<\(input\<Bar>select\<Bar>textarea\<Bar>/\=form\)\>@p'<Bar>redir END<CR> 


# increment numbers by 6 on certain lines only 
# 不懂 
:g/loc\|function/s/\d/\=submatch(0)+6/ 

# better 
# 更好的方法 
:%s#txtdev\zs\d#\=submatch(0)+1#g 
:h /\zs 

# increment only numbers gg\d\d  by 6 (another way) 
# 不懂 
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/ 
:h zero-width 

# find replacement text, put in memory, then use \zs to simplify substitute 
# 查找需替换的文本,保存,然后使用 \zs 命令简单替换 
:%s/"\([^.]\+\).*\zsxx/\1/ 


# Pull word under cursor into LHS of a substitute 
# 不懂 
:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\># 


# Pull Visually Highlighted text into LHS of a substitute 
# 不懂 
:vmap <leader>z :<C-U>%s/\<<c-r>*\>/ 


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

# all following performing similar task, substitute within substitution 
# Multiple single character substitution in a portion of line only 

:%s,\(all/.*\)\@<=/,_,g     : replace all / with _ AFTER "all/" 

# Same thing 
:s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')# 

# Substitute by splitting line, then re-joining 
:s#all/#&^M#|s#/#_#g|-j! 

# Substitute inside substitute 
:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/ 
---------------------------------------- 
# global command display (see tip 227) 
# 全局命令显示(参见 tip 227) 
:g/fred.*joe.*dick/         : display all lines fred,joe & dick 
                              显示所有包含fred,joe 和 dick 的行 
:g/\<fred\>/             : display all lines fred but not freddy 
                               显示所有全字匹配 fred 的行 
:g/<pattern>/z#.5        : display with context 
                               显示上下文 
:g/<pattern>/z#.5|echo "=========="  : display beautifully 
                                           显示得很漂亮 
:g/^\s*$/d                  : delete all blank lines 
                               删除所有的空行 
:g!/^dd/d                   : delete lines not containing string 
                               删除所有行首不是 dd 的行 
:v/^dd/d                    : delete lines not containing string 
                              同上 
:g/fred/,/joe/d             : not line based (very powerfull) 
                               并不基于行(非常强大) 
:g/{/ ,/}/- s/\n\+/\r/g     : Delete empty lines but only between {...} 
                               删除在 {...} 只见的空行 
:v/./.,/./-1join            : compress empty lines 
                               压缩空行 
:g/^$/,/./-j                : compress empty lines 
                               压缩空行 
:g/<input\|<form/p    : ORing 
                               不懂 
:g/^/pu _                   : double space file (pu = put) 
                               把文件中空行增加一倍 
:g/^/m0                     : Reverse file (m = move) 
                               翻转文件 
:g/fred/t$                  : copy lines matching fred to EOF 
                               把匹配 fred 的行拷贝到文件最后 
:g/stage/t'a                : copy lines matching stage to marker a 
                               把匹配 stage 的行做标记a 
:%norm jdd                  : delete every other line 
                               隔一行删除一行 


# incrementing numbers (type <c-a> as 5 characters) 
:.,$g/^\d/exe "norm! \<c-a>": increment numbers 
                                  增加每行行首的数字 
:'a,'bg/\d\+/norm! ^A          : increment numbers 
                                  增加标记 a 到标记 b 只见每行行首的数字 


# storing glob results (note must use APPEND) 
# 保存全局命令的结果 (注意必须使用添加模式) 
:g/fred/y A                 : append all lines fred to register a 
                               添加所有为fred所匹配的行到register a 
:'a,'b g/^Error/ . w >> errors.txt 


# duplicate every line in a file wrap a print '' around each duplicate 
# 复制每一行,然后在复制出来的每一行两侧加上一个 print '复制出来的内容' 
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/ 

# replace string with contents of a file, -d deletes the "mark" 
# 用文件中的内容替换字符串,-d 表示删除“标记” 
:g/^MARK$/r tmp.ex | -d 


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

# Global combined with substitute (power editing) 
# 全局命令和替换命令联姻 (强大的编辑能力) 
:'a,'bg/fred/s/joe/susan/gic :  can use memory to extend matching 
                                 可以使用反向引用来匹配 
:g/fred/,/joe/s/fred/joe/gic :  non-line based (ultra) 

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

# Find fred before beginning search for joe 
# 先找fred,然后找joe 
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC 


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

# Absolutely essential 
# 基础 

---------------------------------------- 
* # g* g#           : find word under cursor (<cword>) (forwards/backwards) 
                       寻找光标处的狭义单词(<cword>) (前向/后向) 
%                   : match brackets {}[]() 
                       括号配对寻找 {}[]() 
.                   : repeat last modification 


matchit.vim         : % now matches tags <tr><td><script> <?php etc 
                       使得 % 能够配对标记 <tr><td><script> <?php 等等 
<C-N><C-P>          : word completion in insert mode 
                             插入模式下的单词自动完成 
<C-X><C-L>          : Line complete SUPER USEFUL 
                             行自动完成(超级有用) 
/<C-R><C-W>         : Pull <cword> onto search/command line 
                             把狭义单词 <cword> 写到 搜索命令行 
/<C-R><C-A>         : Pull <CWORD> onto search/command line 
                             把广义单词 <cWORD> 写到 搜索命令行 
:set ignorecase     : you nearly always want this 
                       搜索时忽略大小写 
:syntax on          : colour syntax in Perl,HTML,PHP etc 
                       在 Perl,HTML,PHP 等中进行语法着色 
:h regexp<C-D>      : type control-D and get a list all help topics containing 
                          按下 control-D 键即可得到包含有 regexp 的帮助主题的列表 
                       regexp (plus use TAB to Step thru list) 
                       (使用TAB可以实现帮助的自动补齐) 
---------------------------------------- 
# MAKE IT EASY TO UPDATE/RELOAD _vimrc 
# 使更新 _vimrc 更容易 
:nmap ,s :source $VIM/_vimrc 
          # 译释:nmap 是绑定一个在normal模式下的快捷键 
:nmap ,v :e $VIM/_vimrc 
          # 译释:在normal模式下,先后按下 ,s 两个键执行_vimrc,而 ,v 则是编辑_vimrc 


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


#VISUAL MODE (easy to add other HTML Tags) 
# visual 模式 (例子是:轻松添加其他的 HTML Tags) 
:vmap sb "zdi<b><C-R>z</b><ESC>  : wrap <b></b> around VISUALLY selected Text 
                                                在visual模式下选中的文字前后分别 
加上<b>和</b> 
:vmap st "zdi<?= <C-R>z ?><ESC>  : wrap <?=   ?> around VISUALLY selected Text 
                                             在visual模式下选中的文字前后分别加 
上<?= 和 ?> 


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

# Exploring 
# 文件浏览 
:Exp(lore)                      : file explorer note capital Ex 
                                   开启目录浏览器,注意首字母E是大写的 
:Sex(plore)                     : file explorer in split window 
                                   在一个分割的窗口中开启目录浏览器 
:ls                             : list of buffers 
                                   显示当前buffer的情况 
:cd ..                          : move to parent directory 
                                   进入父目录 
:args                           : list of files 
                                   显示目前打开的文件 
:lcd %:p:h                      : change to directory of current file 
                                   更改到当前文件所在的目录 
:autocmd BufEnter * lcd %:p:h   : change to directory of current file 
automatically (put in _vimrc) 
                                   自动更改到当前文件所在的目录 (放到 _vimrc) 


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

# Buffer Explorer (Top Ten Vim Script) 
# 缓冲区(buffer)浏览器 (第三方的一个最流行的脚本) 
# needs bufexplorer.vim  http://www.vim.org/script.php?script_id=42 
# 需要下载 bufexplorer.vim 
\be                             : buffer explorer list of buffers 
                                   在缓冲区浏览器中打开缓冲区列表 
\bs                             : buffer explorer (split window) 
                                   以分割窗口的形式打开缓冲区浏览器 

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

# Changing Case 
guu                             : lowercase line 
                                   行小写 
gUU                             : uppercase line 
                                   行大写 
Vu                              : lowercase line 
                                   行小写 
VU                              : uppercase line 
                                   行大写 
g~~                             : flip case line 
                                   行翻转 
vEU                             : Upper Case Word 
                                   字大写(狭义字) 
vE~                             : Flip Case Word 
                                   字翻转(狭义字) 
ggguG                           : lowercase entire file 
                                   把整个文章全部小写 


# Titlise Visually Selected Text (map for .vimrc) 
vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR> 
# Uppercase first letter of sentences 
# 大写所有句子的第一个字母 
:%s/[.!?]\_s\+\a/\U&\E/g 


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

gf                              : open file name under cursor (SUPER) 
                                   取当前光标处的广义字作为文件名,然后试图打开它! 
ga                              : display hex,ascii value of char under cursor 
                                   显示光标处字符的ascii,hex,oct,... 
ggVGg?                          : rot13 whole file 
                                   用rot13编码整个文件 
ggg?G                           : rot13 whole file (quicker for large file) 
                                   用rot13编码整个文件(对大文件更快一些) 
:8 | normal VGg?                : rot13 from line 8 
                                   从第8行开始,用rot13编码后面的文本 
:normal 10GVGg?                 : rot13 from line 8 
                                   从第8行开始,用rot13编码后面的文本 

# 【关于rot13——谁让英文是偶数个字母啊】 
# ROT13 是一种简单的编码,它把字母分成前后两组,每组13个,编码和解码 
# 的算法相同,仅仅交换字母的这两个部分,即:[a..m] --> [n..z] 和 [n..z] 
# --> [a..m] 。 ROT13 用简易的手段使得信件不能直接被识别和阅 
# 读,也不会被搜索匹配程序用通常的方法直接找到。经常用于 USENET 中发表一 
# 些攻击性或令人不快的言论或有简单保密需要的文章。 
# 由于 ROT13 是自逆算法,所以,解码和编码是同一个过程。 


<C-A>,<C-X>               : increment,decrement number under cursor 
                                   增加,减少 光标处的狭义字所表示的数字 
                                   win32 users must remap CNTRL-A 
                                   Win32的用户可能需要重新定义一下Ctrl-A 
<C-R>=5*5                    : insert 25 into text (mini-calculator) 
                                   插入25 (一个迷你计算器) 


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

# Makes all other tips superfluous 
:h 42            : also http://www.google.com/search?q=42 
:h holy-grail 
:h! 


---------------------------------------- 
# Markers & moving about 
# 标记和移动 
'.               : jump to last modification line (SUPER) 
                    跳到最后修改的那一行 (超级有用) 
`.               : jump to exact spot in last modification line 
                    不仅跳到最后修改的那一行,还要定位到修改点 
g;               : cycle thru recent changes (oldest first) (new in vim6.3) 
                    循环跳转修改点(从最老的修改点开始) (vim6.3中新增) 
g,               : reverse direction (new in vim6.3) 
                    反向循环跳转修改点 (vim6.3中新增) 

:changes 
:h changelist    : help for above 
<C-O>            : retrace your movements in file (starting from most recent) 
                       依次沿着你的跳转记录向回跳 (从最近的一次开始) 
<C-I>            : retrace your movements in file (reverse direction) 
                       依次沿着你的跳转记录向前跳 
:ju(mps)         : list of your movements 
                    列出你跳转的足迹 
:help jump-motions 
:history         : list of all your commands 
                    列出历史命令记录 
:his c           : commandline history 
                    命令行命令历史 
:his s           : search history 
                    搜索命令历史 
q/               : Search history Window 
                    搜索命令历史的窗口 
q:               : commandline history Window 
                    命令行命令历史的窗口 
:<C-F>        : history Window 
                    历史命令记录的窗口 
---------------------------------------- 
# Abbreviations & maps 
# # 缩写和键盘映射 
:map   <f7>   :'a,'bw! c:/aaa/x 
                  # 译释:map是映射一个normal模式下的键 
                  # 这里是把F7键映射成把标记a到标记b中间的内容另存为一个文件/aaa/x 
                  # 标记(mark)的方法:把光标移动到需要标记的地方,输入m,然后输 
入标记名,例如a 
                  # 引用标记的方法:'a ,即:单引号加标记名 
:map   <f8>   :r c:/aaa/x 
                  # 译释:把F8键映射成在当前位置插入文件/aaa/x的内容 
:map   <f11>  :.w! c:/aaa/xr<CR> 
                  # 译释:.(点号)表示当前行 
                  # 所以F11就是把当前行存为/aaa/xr 
                  # 最后的<CR>表示一个回车 
:map   <f12>  :r c:/aaa/xr<CR> 
:ab php          : list of abbreviations beginning php 
                    列出php表示的缩写 
                  # 译释:定义一个缩写使用::iab hm hmisty 
                  # 一个有趣的现象是,它列出的会是php和它的前子串开头的缩写 
                  # 例如,有这么几个缩写: 
                  # h => hmisty1 , hm => hmisty2 , hmi => hmisty3, m => hmisty4 
                  # 那么使用 :ab hm会显示这么几个缩写:hm 和 h 
                  # 而不是你想象中的 hm 和 hmi 

:map ,           : list of maps beginning , 
                    列出以逗号开始的键盘映射 

# allow use of F10 for mapping (win32) 
# 允许 F10 的映射用法 (win32) 
set wak=no       : :h winaltkeys 
                    参见 :h winaltkeys 

# For use in Maps 
# 在键盘映射中常用的表示 
<CR>             : carriage Return for maps 
                       回车 
<ESC>            : Escape 
                       ESC 
<LEADER>         : normally \ 
                       转义符号 \ 
<BAR>            : | pipe 
                       管道符号 
<BACKSPACE>      : backspace 
                       退格符号 

# display RGB colour under the cursor eg #445588 
# 显示光标下数值的 RGB 颜色 
:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr> 
---------------------------------------- 

# Using a register as a map (preload registers in .vimrc) 
:let @m=":'a,'bs/" 
:let @s=":%!sort -u" 

---------------------------------------- 
# List your Registers 
# 列出寄存器(Registers) 
:reg             : display contents of all registers 
                   显示所有寄存器的内容 
:reg a           : display content of individual registers 
                    显示 a 寄存器的内容 
"1p....          : retrieve numeric registers one by one 
:let @y='yy@"'   : pre-loading registers (put in .vimrc) 
---------------------------------------- 
# Useful tricks 
# 有用的窍门 
"ayy@a           : execute "Vim command" in a text file 
                    把当前行作为一个Vim命令来执行 
yy@"             : same thing using unnamed register 
                    同上,不过是用匿名寄存器 
u@.              : execute command JUST typed in 
                    只执行键入的命令 
---------------------------------------- 
# Get output from other commands (requires external programs) 
# 从其他程序获取输出 (需要外部程序) 
:r!ls.exe        : reads in output of ls 
                    读取ls的输出到当前位置 
!!date           : same thing (but replaces/filters current line) 
                    读取date的输出 (但是会替换当前行的内容) 
                  # 译释:其实你输入了!!后,vim就自动转换到 :.! 等待你继续输入 
# Sorting with external sort 
# 使用外部程序sort进行排序(sort是Unix标准命令,ls,date也是) 
:%!sort -u       : use an external program to filter content 
                    使用sort程序排序整个文件(用结果重写文件) 
                  # 译释:%表示整个文件的所有行 
                  # !sort表示执行外部命令sort 
                  # -u是sort的参数,man sort看看,这个参数的意义是合并相同的行 
                  # u就是unique,如果两行内容相同,则结果中只保留一行的说 
:'a,'b!sort -u   : use an external program to filter content 
                    对mark a 到mark b中间的内容进行排序 
!1} sort -u      : sorts paragraph (note normal mode!!) 
                    排序当前段落 (只能在normal模式下使用!!) 
                  # 译释:!表示使用filter,1}表示filter的对象是从当前行开始向后 
数一段 
                  # 段落指到空行处结束,不包括空行 
                  # 其实你一旦输入 !1},vim就自动计算当前段落应该到那一行(eg.+ 
5),然后生成 
                  # :.,.+5! 等待之后输入sort -u,回车,完成操作 
                  # .表示当前行,.+5当然就是当前行向后数5行 

---------------------------------------- 
# Multiple Files Management (Essential) 
# 多文档操作 (基础) 
:bn              : goto next buffer 
                    跳转到下一个buffer 
:bp              : goto previous buffer 
                    跳转到上一个buffer 
:wn              : save file and move to next (super) 
                    存盘当前文件并跳转到下一个 
:wp              : save file and move to previous 
                    存盘当前文件并跳转到上一个 
:bd              : remove file from buffer list (super) 
                    把这个文件从buffer列表中做掉 
:bun             : Buffer unload (remove window but not from list) 
                    卸掉buffer (关闭这个buffer的窗口但是不把它从列表中做掉) 
:badd file.c     : file from buffer list 
                    把文件file.c添加到buffer列表 
:b 3             : go to buffer 3 
                    跳到第3个buffer 
:b main          : go to buffer with main in name eg main.c (ultra) 
                    跳到一个名字中包含main的buffer,例如main.c 
:sav php.html    : Save current file as php.html and "move" to php.html 
                    把当前文件存为php.html并打开php.html 
:sav! %<.bak  : Save Current file to alternative extension 
                    换一个后缀保存 
:sav! %:r.cfm    : Save Current file to alternative extension 

:e!              : return to unmodified file 
                    返回到修改之前的文件(修改之后没有存盘) 
:w c:/aaa/%      : save file elsewhere 
                    把文件存到一个地儿 
:e #             : edit alternative file 
                    编辑标记为#的buffer(这个buffer必须含有一个可编辑的文件) 
                 # 用ls命令就能看到哪一个buffer有# 
                  # %a表示当前正在编辑的buffer 
                  # u 表示不能编辑或者已经被做掉的buffer 
:rew             : return to beginning of editted files list (:args) 
                    回到第一个可编辑的文件 
:brew            : buffer rewind 
                    回到第一个buffer 
:sp fred.txt     : open fred.txt into a split 
                    在一个水平分割的窗口中打开文件fred.txt # 译注:vs fred.txt可 
以实现垂直分割 
:sball,:sb       : Split all buffers (super) 
                    把当前所有含有可编辑文件的buffer显示到一个分割窗口中 
:scrollbind      : in each split window 
:map   <F5> :ls<CR>:e # : Pressing F5 lists all buffer, just type number 
                                 在normal模式下按F5键,则会显示所有含有一个 
                                 可编辑文件的buffer,然后提示你输入buffer的序号, 
                                 输入后回车,则编辑这个buffer 
:set hidden      : Allows to change buffer w/o saving current buffer 
                    允许不保存buffer而切换buffer (w/o=without) 
---------------------------------------- 
# Quick jumping between splits 
# 在分割窗口中快速切换 
:map <C-J> <C-W>j<C-W>_ 
# 这是一个键盘绑定,把Ctrl-J定义成切换到下一个窗口并最大化 
:map <C-K> <C-W>k<C-W>_ 
# 这是一个键盘绑定,把Ctrl-K定义成切换到上一个窗口并最大化 

--------------------------------------- 
# Recording (BEST TIP of ALL) 
# 命令录制 (最佳技巧) 
qq  # record to q 
       录制到q 
your complex series of commands  # 输入一系列复杂的指令 
q   # end recording 
       再次按q停止录制 
@q  # to execute 
       执行q中存储的指令 
@@  # to Repeat 
       重复执行 
5@@ # to Repeat 5 times 
       重复执行5遍 

# editing a register/recording 
# 编辑寄存器/录制 
"qp            :display contents of register q (normal mode) 
                 显示寄存器 q 的内容 (普通模式) 
<ctrl-R>q   :display contents of register q (insert mode) 
                显示寄存器 q 的内容 (插入模式) 

# you can now see recording contents, edit as required 
# 你现在可以看到记录内容,随便编辑 
"qdd           :put changed contacts back into q 
@q             :execute recording/register q 
                 执行记录/寄存器 q 

# Operating a Recording on a Visual BLOCK 
# 在可视块中运行记录 
1) define recording/register 
1) 定义记录/寄存器 
qq:s/ to/ from/g^Mq 
2) Define Visual BLOCK 
2) 定义可视块 
V} 
3) hit : and the following appears 
3) 键入 : 将显示下面信息 
:'<,'> 
4)Complete as follows 
4) 完成如下操作 
:'<,'>norm @q 
---------------------------------------- 
# Visual is the newest and usually the BEST editting mode 
# 可视模式是最新也通常是最好的编辑模式 
# Visual basics 
# 可视模式基础 
v              : enter visual mode 
                  进入可视模式 
V              : visual mode whole line 
                  整行的可视模式 
<C-V>       : enter VISUAL BLOCK mode 
                  进入可视块模式 
gv             : reselect last visual area 
                  重新选取最新的可视区域 
o              : navigate visual area 
                  浏览可视区域 
"*y            : yank visual area into paste buffer 
                  复制可视区域到剪贴板 
V%             : visualise what you match 
                  ??? 
V}J            : Join Visual block (great) 
                  连接可视块 

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

# Delete first 2 characters of 10 successive lines 
# 删除连续10行中每行的头2个字符 
0<c-v>10j2ld 

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

# how to copy a set of columns using VISUAL BLOCK 
# 如何用可视块拷贝几列 
# visual block (AKA columnwise selection) (NOT BY ordinary v command) 
# 可视块(并非通常的 v 命令) 
<C-V> then select "column(s)" with motion commands (win32 <C-Q>) 
<C-V>,然后通过移动命令选择列 (win32 <C-Q>) 
then c,d,y,r etc 
然后执行 c,d,y,r 等命令 


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

# _vimrc essentials 
# _vimrc基础 
:set incsearch : jumps to search word as you type (annoying but excellent) 
                  实时匹配你输入的内容 
:set wildignore=*.o,*.obj,*.bak,*.exe : tab complete now ignores these 
                                         tab键的自动完成现在会忽略这些 
:set shiftwidth=3                     : for shift/tabbing 
                                         自动缩进设为4个字符 
                                       # 译注:一个tab位通常是8个字符 
                                       # 所以,我们还要设定 :set tabstop=4,这 
样,所有的缩进都是4字符了 
:set vb t_vb=".                       : set silent (no beep) 
                                         沉默方式(不要叫beep!) 
:set browsedir=buffer                 : Maki GUI File Open use current directory 
                                         设置 GUI 版本文件打开时,使用当前路径 
---------------------------------------- 
# launching Win IE 
# 加载 IE 浏览器 
:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe file://%:p<CR> 
:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR> 
# 译释:nmap是做一个normal模式下的键盘绑定 
# 这里绑定了一个逗号命令 ,f 
# :update是写这个文件,与:w不同,它只有当文件被修改了的时候才写 
# :silent别让弹出窗口报告执行结果 
# !...后面就是执行windows命令了。呵呵,去问bill gates什么意思吧。 
---------------------------------------- 

# FTPing from VIM 
# 用 VIM 通过 ftp 编辑文件 
:cmap ,r  :Nread ftp://209.51.134.122/public_html/index.html 
:cmap ,w  :Nwrite ftp://209.51.134.122/public_html/index.html 
gvim ftp://209.51.134.122/public_html/index.html 
# 译注:cmap是命令(command)模式绑定 

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

# appending to registers (use CAPITAL) 
# 附加到一个register (用大写的register名字) 
"a5yy   #复制5行到a中 
10j     #下移10行 
"A5yy   #再添加5行到a中 

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

[I     : show lines matching word under cursor <cword> (super) 
          显示光标处的狭义字可以匹配的行(高级指令) 
        # 译注:# 可以全文查找与光标处的狭义字相匹配的字, 
        # 这在查找函数原型和实现,或者变量使用的时候很有用 

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

# Conventional Shifting/Indenting 
# 常规缩进 
:'a,'b>>   # 把mark a到mark b之间的内容缩进两次 


# visual shifting (builtin-repeat) 
# 在visual模式下缩进 (无限可重复) 
:vnoremap < <gv 
# 译释::vnoremap 重定义了visual模式下 < 符号的含义 
# 把它定义成 <gv 
# 即:先<向外缩进,然后gv重新选择上一次选择了的区域 
# 这样在visual模式下就可以实现连续按<而连续缩进了 
:vnoremap > >gv 
# 同里,内缩 


# Block shifting (magic) 
# 块缩进 
 >i{ 
 >a{ 
# also 
 >% and <% 
---------------------------------------- 
# Redirection & Paste register * 
# 重定向到剪贴板和从剪贴板粘贴 
:redir @*                    : redirect commands to paste buffer 
                                重定向命令的输出结果(最下方命令行上的结果) 
:redir END                   : end redirect 
                                结束重定向 
:redir >> out.txt            : redirect to a file 
                                重定向到一个文件 
# Working with Paste buffer 
# 操作剪贴板 
"*yy                         : yank to paste 
                                复制到剪贴板中 
"*p                          : insert from paste buffer 
                                从剪贴板中粘贴 
# yank to paste buffer (ex mode) 
# 拷贝到剪贴板 (ex 模式) 
:'a,'by*                     : Yank range into paste 
                                把标记a到标记b见的内容拷贝到剪贴板 
:%y*                         : Yank whole buffer into paste 
                                把整个文件拷贝到剪贴板 
# filter non-printable characters from the paste buffer 
# 从剪贴板上过滤非可打印字符 
# useful when pasting from some gui application 
# 当从一些 GUI 程序粘贴时会有用处 
:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p 
---------------------------------------- 
# Re-Formatting text 
# 重新格式化文本 
gq}                          : Format a paragraph 
                                格式化一个段落 
ggVGgq                       : Reformat entire file 
                                重新格式化整个文件 
Vgq                          : current line 
                                格式化当前行 
# break lines at 70 chars, if possible after a ; 
# 在70列的时候换行 
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g 
---------------------------------------- 
# Operate command over multiple files 
# 对多个文档实施命令 
:argdo %s/foo/bar/e          : operate on all files in :args 
                                对所有:args列表中的文档执行命令 
:bufdo %s/foo/bar/e 
:windo %s/foo/bar/e 
:argdo exe '%!sort'|w!       : include an external command 
                                使用外部命令 
:bufdo /foo/ 
---------------------------------------- 
# Command line tricks 
# 命令行上的技巧 
gvim -h                    : help 
                              启动帮助 
ls | gvim -                : edit a stream!! 
                              编辑一个数据流 
cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : filter a stream 
gvim -o file1 file2        : open into a split 
                              以分割窗口打开两个文件 

# execute one command after opening file 
# 指出打开之后执行的命令 
gvim.exe -c "/main" joe.c  : Open joe.c & jump to "main" 

# execute multiple command on a single file 
# 对一个文件执行多个命令 
vim -c "%s/ABC/DEF/ge | update" file1.c 

# execute multiple command on a group of files 
# 对一组文件执行多个命令 
vim -c "argdo %s/ABC/DEF/ge | update" *.c 

# remove blocks of text from a series of files 
# 从一组文件中删除文本块 
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c 

# Automate editting of a file (Ex commands in convert.vim) 
# 自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了) 
vim -s "convert.vim" file.c 

#load VIM without .vimrc and plugins (clean VIM) 
# 不要加载.vimrc和任何plugins (启动一个干净的VIM) 
gvim -u NONE -U NONE -N 

# Access paste buffer contents (put in a script/batch file) 
# 读取剪贴板内容 (放到脚本或批处理文件中) 
gvim -c 'normal ggdG"*p' c:/aaa/xp 

# print paste contents to default printer 
# 把剪贴板内容打印到默认打印机 
gvim -c 's/^/\=@*/|hardcopy!|q!' 
---------------------------------------- 
# GVIM Difference Function (Brilliant) 
gvim -d file1 file2        : vimdiff (compare differences) 
                              vimdiff (比较不同) 
dp                         : "put" difference under cursor to other file 
                              把光标处的不同放到另一个文件 
do                         : "get" difference under cursor from other file 
                              在光标处从另一个文件取得不同 
---------------------------------------- 
# Vim traps 
# Vim陷阱 
In regular expressions you must backslash + (match 1 or more) 
In regular expressions you must backslash | (or) 
In regular expressions you must backslash ( (group) 
In regular expressions you must backslash { (count) 
# 在vim的正则表达式中, + | ( { 前都必须加转义符 \ 
/fred\+/                   : matches fred/freddy but not free 
                              匹配fred或freddy但是不匹配free 
/\(fred\)\{2,3}/           : note what you have to break 
                              ??? 
---------------------------------------- 
# \v or very magic (usually) reduces backslashing 
# \v ,或叫做very magic (通常都是这么叫)可以取消转义符 
/codes\(\n\|\s\)*where  : normal regexp 
                           普通的正则表达式 
/\vcodes(\n|\s)*where   : very magic 
---------------------------------------- 
# pulling objects onto command/search line (SUPER) 
# 把东西送到命令行/搜索行 (SUPER) 
<C-R><C-W> : pull word under the cursor into a command line or search 
                    送一个狭义词 
<C-R><C-A> : pull WORD under the cursor into a command line or search 
                    送一个广义词 
<C-R>-                  : pull small register (also insert mode) 
                             送一个小型寄存器 (插入模式下也有效) 
<C-R>[0-9a-z]           : pull named registers (also insert mode) 
                              送一个命名寄存器 (插入模式下也有效) 
<C-R>%                  : pull file name (also #) (also insert mode) 
                              送文件名过去 (#也行) (插入模式下也有效) 
---------------------------------------- 
# manipulating registers 
# 操作寄存器 
:let @a=@_              : clear register a 
                           清空寄存器a 
:let @a=""              : clear register a 
                           同上 
:let @*=@a              : copy register a to paste buffer 
                           拷贝寄存器 a 的内容到剪贴板 
map   <f11> "qyy:let @q=@q."zzz" 

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

# help for help 
# 关于帮助的帮助 
:h quickref             : VIM Quick Reference Sheet (ultra) 
                           VIM 快速参考手册 (ultra) 
:h tips                 : Vim's own Tips Help 
                           Vim自己的tips 
:h visual<C-D><tab>     : obtain  list of all visual help topics 
                                得到一个关于visual关键字的帮助列表 
                         : Then use tab to step thru them 
                        : 然后用tab键去选择 
:h ctrl<C-D>         : list help of all control keys 
                           显示所有关于Ctrl的帮助 
:helpg uganda           : Help grep 
                           显示 grep 帮助 
:h :r                   : help for :ex command 
                           :ex冒号命令 
:h CTRL-R               : normal mode 
                           普通模式命令 
:h /\r                  : what's \r in a regexp (matches a <CR>) 
                           \r在正则表达式中是什么意思呢? 
:h \\zs                 : double up backslash to find \zs in help 
:h i_CTRL-R             : help for say <C-R> in insert mode 
                           insert模式下的Ctrl-R 
:h c_CTRL-R             : help for say <C-R> in command mode 
                           命令行(command-line)模式下的Ctrl-R 
:h v_CTRL-V             : visual mode 
                           visual模式下的Ctrl-V 
:h tutor                : VIM Tutor 
                           VIM 指南 
<C-[>, <C-T>      : Move back & Forth in HELP History 
                           在帮助历史中,向前/后移动 
gvim -h                 : VIM Command Line Help 
                           关于 VIM 命令的帮助 
---------------------------------------- 
# where was an option set 
# 选项设置在哪里? 
:scriptnames            : list all plugins, _vimrcs loaded (super) 
                           列出所有加载的 plugins, _vimrcs 
:verbose set history?   : reveals value of history and where set 
                           显示history的值并指出设置文件的位置 
:function               : list functions 
                           列出所有函数 
:func SearchCompl       : List particular function 
                          列出指定的函数 
---------------------------------------- 

# making your own VIM help 
# 制作你自己的VIM帮助 
:helptags /vim/vim63/doc  : rebuild all *.txt help files in /doc 
                             重建 /doc 中所有的 *.txt 帮助文件 
:help add-local-help 

---------------------------------------- 
# running file thru an external program (eg php) 
# 用外部程序来运行程序 (例如 php) 
map   <f9>   :w<CR>:!c:/php/php.exe %<CR> 
map   <f2>   :w<CR>:!perl -c %<CR> 
---------------------------------------- 
# capturing output of current script in a separate buffer 
# 在另一个buffer中,捕捉当前脚本的输出 
:new | r!perl #                   : opens new buffer,read other buffer 
                                     新建一个buffer,从另一个buffer中读入结果 
:new! x.out | r!perl #            : same with named file 
                                    同上,并指定一个新文件名 

--------------------------------------- 
# Inserting DOS Carriage Returns 
# 插入DOS换行符 
:%s/nubian/<C-V><C-M>&/g          :  that's what you type 
:%s/nubian/<C-Q><C-M>&/g          :  for Win32 
                                            对于Win32应该这样 
dn_t...@yahoo.ca 
:%s/nubian/^M&/g                  :  what you'll see where ^M is ONE character 
                                      你看到的^M是一个字符 
:%s/nubian/\r&/g                  :  better 
                                      更好的形式 

---------------------------------------- 
# automatically delete trailing Dos-returns,whitespace 
# 自动删除行尾 Dos回车符和空格 
autocmd BufRead * silent! %s/[\r \t]\+$// 
autocmd BufEnter *.php :%s/[ \t\r]\+$//e 
---------------------------------------- 
# perform an action on a particular file or file type 
# 对指定文件或文件类型执行某个动作 
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg? 
autocmd FileType *.pl exec('set fileformats=unix') 
---------------------------------------- 
# Retrieving last command line command for copy & pasting into text 
# 把最后一个命令贴到当前位置 
i<c-r>: 
# Retrieving last Search Command for copy & pasting into text 
# 把最后一个搜索指令贴到当前位置 
i<c-r>/ 
# 译释:i是进入insert模式, 
# Ctrl-r是开启插入模式下register的引用 
# :和/分别引用了两个register的内容 
---------------------------------------- 
# more completions 
# 更多的完成功能 
<C-X><C-F>     :insert name of a file in current directory 
                      插入当前目录下的一个文件名到当前位置 
# 在insert模式下使用 
# 然后用 Ctrl-P/Ctrl-N 翻页 

---------------------------------------- 
# Substituting a Visual area 
# 替换一个visual区域 
# select visual area as usual (:h visual) then type :s/Emacs/Vim/ etc 
# 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式 
:'<,'>s/Emacs/Vim/g               : REMEMBER you dont type the '<.'> 
                                        前面的'<,'>是vim自动添加的 
gv                                : Re-select the previous visual area (ULTRA) 
                                     重新选择前一个可视区域 (ULTRA) 
---------------------------------------- 
# inserting line number into file 
# 在文件中插入行号 
:g/^/exec "s/^/".strpart(line(".")."    ", 0, 4) 
:%s/^/\=strpart(line(".")."     ", 0, 5) 
:%s/^/\=line('.'). ' ' 
---------------------------------------- 
#numbering lines VIM way 
# 用VIM的方式来编号行 
:set number                       : show line numbers 
                                     显示行号 
:map <F12> :set number!<CR>       : Show linenumbers flip-flop 
:%s/^/\=strpart(line('.')."        ",0,&ts) 

#numbering lines (need Perl on PC) starting from arbitrary number 
#从任意行开始编号(需要perl) 
:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++' 

# Produce a list of numbers 
# 产生数字列表 
#Type in number on line say 223 in an empty file 
qqmnYP`n^Aq                       : in recording q repeat with @q 
# increment existing numbers to end of file (type <c-a> as 5 characters) 
# 递增已存在数字到文件末 
:.,$g/^\d/exe "normal! \<c-a>" 
# advanced incrementing 
# 高级递增,参见: 
http://vim.sourceforge.net/tip_view.php?tip_id=150 
---------------------------------------- 
# advanced incrementing (really useful) 
# 高级递增 (真的很有用) 
" put following in _vimrc 
" 把下面几句放到 _vimrc #vimrc脚本用 " 做行注释符 
let g:I=0 
function! INC(increment) 
let g:I =g:I + a:increment 
return g:I 
endfunction 
" eg create list starting from 223 incrementing by 5 between markers a,b 
" 例如从mark a 到mark b 递增,从223开始,步长为5 
:let I=223 
:'a,'bs/^/\=INC(5)/ 
" create a map for INC 
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/ 
---------------------------------------- 
# editing/moving within current insert (Really useful) 
# 在当前插入模式下编辑/移动 (真得很有用) 
<C-U>                             : delete all entered 
                                        删除全部 
<C-W>                             : delete last word 
                                        删除最后一个单词 
<HOME><END>                       : beginning/end of line 
                                           移动到行首/行尾 
<C-LEFTARROW><C-RIGHTARROW>       : jump one word backwards/forwards 
                                           向前/后移动一个单词 
<C-X><C-E>,<C-X><C-Y>             : scroll while staying put in insert 
---------------------------------------- 
#encryption (use with care: DON'T FORGET your KEY) 
# 加密(小心使用,不要忘了密码) 
:X                                : you will be prompted for a key 
                                     vim会提示你输入密码 
:h :X 
---------------------------------------- 
# modeline (make a file readonly etc) must be in first/last 5 lines 
# 模式行 (使文件只读等),必须在前/后 5行内 
// vim:noai:ts=2:sw=4:readonly: 
# vim:ft=html:                    : says use HTML Syntax highlighting 
                                     使用 HTML 语法高亮 
:h modeline 
---------------------------------------- 
# Creating your own GUI Toolbar entry 
# 建立你自己的菜单项 
amenu  Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 
ss=4<CR>vim60:fdm=marker<esc>gg 
---------------------------------------- 

# A function to save word under cursor to a file 
# 一个保存当前光标下的狭义字到一个文件的函数 
function! SaveWord() 
    normal yiw 
    exe ':!echo '.@0.' >> word.txt' 
endfunction 
map ,p :call SaveWord() 

--------------------------------------- 
# function to delete duplicate lines 
# 删除重复行的函数 
function! Del() 
  if getline(".") == getline(line(".") - 1) 
    norm dd 
  endif 
endfunction 

:g/^/ call Del()  #使用该函数的一个例子 

---------------------------------------- 
# Digraphs (non alpha-numerics) 
# 双字节编码 (non alpha-numerics) 
:digraphs                         : display table 
                                     显示编码表 
:h dig                            : help 
                                     帮助 
i<C-K>e'                          : enters ? 
                                        输入 é 
i<C-V>233                         : enters ? (Unix) 
                                       输入 é (Unix) 
i<C-Q>233                         : enters ? (Win32) 
                                        输入 é (Win32) 
ga                                : View hex value of any character 
                                     查看字符的hex值 
# Deleting non-ascii characters (some invisible) 
# 删除非 ascii 字符 
:%s/[<C-V>128-<C-V>255]//gi       : where you have to type the Control-V 
:%s/[€-?]//gi                     : Should see a black square & a dotted y 
:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi : All pesky non-asciis 
:exec "norm /[\x00-\x1f\x80-\xff]/"        : same thing 
#Pull a non-ascii character onto search bar 
yl/<C-R>"                         : 
---------------------------------------- 
# All file completions grouped (for example main_c.c) 
# 文件名自动完成 (例如 main_c.c) 
:e main_<tab>                     : tab completes 
                                        tab 键完成 
gf                                : open file under cursor  (normal) 
                                     打开光标处广义字命名的文件 (normal模式) 
main_<C-X><C-F>                   : include NAME of file in text (insert mode) 
                                           文件名自动完成(insert模式) 
---------------------------------------- 
# Complex Vim 
# Vim复杂使用 
# swap two words 
# 交换两个单词 
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g 
# swap two words 
# 交换两个单词 
:vnoremap <C-X> <Esc>`.``gvP``P 
---------------------------------------- 
# Convert Text File to HTML 
# 把text文件转换成html文件(oh,ft) 
:runtime! syntax/2html.vim        : convert txt to html 
                                    转换 txt 成 html 
:h 2html 
---------------------------------------- 
# VIM has internal grep 
# VIM 有一个内部自带的 grep 命令 
:grep some_keyword *.c            : get list of all c-files containing keyword 
                                     得到一个包含some_keyword的c文件名列表 
:cn                               : go to next occurrence 
                                     去下一个出现的位置 
---------------------------------------- 
# Force Syntax coloring for a file that has no extension .pl 
# 强制无扩展名的文件的语法着色方式 
:set syntax=perl 
# Remove syntax coloring (useful for all sorts of reasons) 
# 取消语法着色 (很有用) 
:set syntax off 
# change coloring scheme (any file in ~vim/vim??/colors) 
# 改变色彩主题 (在~vim/vim??/colors中的任何文件) 
:colorscheme blue 
# Force HTML Syntax highlighting by using a modeline 
# 通过使用模式行强迫使用 HTML 语法高亮 
# vim:ft=html: 
---------------------------------------- 
:set noma (non modifiable)        : Prevents modifications 
                                     防止修改 
:set ro (Read Only)               : Protect a file from unintentional writes 
                                     只读保护 
---------------------------------------- 
# Sessions (Open a set of files) 
# 对话 (打开一堆文件) 
gvim file1.c file2.c lib/lib.h lib/lib2.h : load files for "session" 
                                            在"对话"中加载这些文件 
:mksession                        : Make a Session file (default Session.vim) 
                                     生成一个Session文件 (默认是Session.vim) 
:q 
gvim -S Session.vim               : Reload all files 
                                     重新加载所有文件 
---------------------------------------- 
# tags (jumping to subroutines/functions) 
# 标记(tags) (跳转到子程序/函数) 
taglist.vim                       : popular plugin 
                                     很流行的插件 
:Tlist                            : display Tags (list of functions) 
                                     显示标记 (函数列表) 
<C-]>                             : jump to function under cursor 
                                        跳转到光标处的函数 
---------------------------------------- 
# columnise a csv file for display only as may crop wide columns 
:let width = 20 
:let fill=' ' | while strlen(fill) < width | let fill=fill.fill | endwhile 
:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge 
:%s/\s\+$//ge 
# Highlight a particular csv column (put in .vimrc) 
function! CSVH(x) 
     execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/' 
     execute 'normal ^'.a:x.'f,' 
endfunction 
command! -nargs=1 Csv :call CSVH(<args>) 
# call with 
:Csv 5                             : highlight fith column 
---------------------------------------- 
# folding : hide sections to allow easier comparisons 
# 折叠:隐藏某些片断,是查看更容易 
zf}                               : fold paragraph using motion 
                                     使用动作命令折叠一个段落 
v}zf                              : fold paragraph using visual 
                                     使用可视模式折叠一个段落 
zf'a                              : fold to mark 
                                     折叠到一个标记上 
zo                                : open fold 
                                     打开折叠 
zc                                : re-close fold 
                                     重新关闭折叠 
---------------------------------------- 
# displaying "invisible characters" 
# 显示"不可见字符" 
:set list 
:h listchars 
---------------------------------------- 
# How to paste "normal commands" w/o entering insert mode 
# 如何在不进入插入模式的情况下粘贴"普通模式的命令" 
:norm qqy$jq 
---------------------------------------- 
# manipulating file names 
# 处理文件名 
:h filename-modifiers             : help 
                                     帮助 
:w %                              : write to current file name 
                                     写入当前文件 
:w %:r.cfm                        : change file extention to .cfm 
                                     改变文件扩展名为 .cfm 
:!echo %:p                        : full path & file name 
                                     显示完整路径和文件名 
:!echo %:p:h                      : full path only 
                                     只显示完整路径 
<C-R>%                            : insert filename (insert mode) 
                                        插入文件名 (插入模式) 
"%p                               : insert filename (normal mode) 
                                    插入文件名 (普通模式) 
/<C-R>%                           : Search for file name in text 
                                        在文本中查找文件名 
---------------------------------------- 
# delete without destroying default buffer contents 
# 删除,但不破坏 buffer 内容 
"_d                               : what you've ALWAYS wanted 
                                     你一直想要的东西 
"_dw                              : eg delete word (use blackhole) 
                                     例如:删除一个单词 (使用黑洞???) 
---------------------------------------- 
# pull full path name into paste buffer for attachment to email etc 
# 送完整的路径名到剪贴板,用于邮件附件等 
nnoremap <F2> :let @*=expand("%:p")<cr> :unix 
nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32 
---------------------------------------- 
# Simple Shell script to rename files w/o leaving vim 
# 不用离开 Vim 就能修改文件名的简单 shell 脚本 
$ vim 
:r! ls *.c 
:%s/\(.*\).c/mv & \1.bla 
:w !sh 
:q! 
---------------------------------------- 
# count words in a text file 
# 在一个文本里计算单词数 
g<C-G> 
---------------------------------------- 
# example of setting your own highlighting 
# 你自己设置高亮显示的例子 
:syn match DoubleSpace "  " 
:hi def DoubleSpace guibg=#e0e0e0 
---------------------------------------- 
# Programming keys depending on file type 
# 根据文件类型映射快捷键 
:autocmd bufenter *.tex map <F1> :!latex %<CR> 
:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR> 
---------------------------------------- 
# reading Ms-Word documents, requires antiword 
# 读取 MS-Word 文档,需要 antiword 
:autocmd BufReadPre *.doc set ro 
:autocmd BufReadPre *.doc set hlsearch! 
:autocmd BufReadPost *.doc %!antiword "%" 
---------------------------------------- 
# Just Another Vim Hacker JAVH 
vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?" 
# 译释:呵呵,谁来解释一下吧! 
# 其实不过是在启动vim的时候执行了一个命令 
# 先写入了 Just Another Vim Hacker 的rot13编码 
# 然后再解码 

---------------------------------------- 
__END__ 


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


[转载]VI高级命令集锦


时间:2010-3-1来源:HaCMS开源社区 作者:zhenshuan 


VI高级命令 


1.交换两个字符位置 xp 
2.上下两行调换 ddp 3.把文件内容反转 :g/^/m0/ (未通过) 
4.上下两行合并 J 
5.删除所有行 dG 
6.从当前位置删除到行尾 d$ 
7.从当前位置复制到行尾 y$ 


如果要粘贴到其他地方 p 就可以了由于vi 是建立在 EX 上的 所以 当键入 : 时就来 ... 


VI高级命令
1.交换两个字符位置
xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0/ (未通过)
4.上下两行合并 
J
5.删除所有行 
dG
6.从当前位置删除到行尾
d$
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了
由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态 
8.
:ab string strings 
例如 ":ab usa United States of America" ,
当你在文件里插入 usa 时 
United States of America 就蹦出来了


9.
:map keys new_seq 
定义你当前 键盘命令 
10.
:set [all] 
vi or ex 的编辑状态
如 显示每行 :set nu 
11.在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的下面。 
12.单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S 
13.
:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串 


14.光标控制
k:上移 nk 上移n行
j:下移 nj 下移n行
将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可


,以此类推,b,c........寄存器等在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行 


15.表8-2 删除命令


删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容




修改命令操作


c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容
重复上一次修改!


 
表8-4 替换命令


替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符
vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串 
16.
fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次 
,
逗号,配合 f 和 t 使用,反方向重复一次
17. vi 环境选项 Solaris ksh
noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23 
文章来自:http://www.hacms.com/html/2010/0301/10522.html 






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


Vim多行缩进技巧


博客分类: Discovery
vimIDE 
按v进入visual状态,选择多行,用>或<缩进或缩出 


通常根据语言特征使用自动缩进排版:在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用


n==排版,相当于一般IDE里的code format。使用gg=G可对整篇代码进行排版。



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

两篇很牛的vim使用技巧


来源: ChinaUnix博客  日期: 2009.07.06 10:18 (共有条评论) 我要评论




读本文之前请注意:
1. 本文的目标是提供一些vim的使用技巧,利用这些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用,但是现在基本上都是用vim了。
2. 本文是整理和总结使用技巧,而非讲解vim入门,因此不会涉及最基本的使用,例如如何上移或下移光标,对此类操作请参阅任何一本vim或者vi教程。
3. 本文阅读对象是了解了vim的基本操作,而希望高效地利用vim进行工作的人。熟练使用vim的人自然不必细读,如果能留下您的宝贵意见,本人将感激不尽。
4. 本文由本人搜集整理,转载请注明出处


本文一般情况下用(里边的字母一般大小写无所谓,除非特别注明)表示按住ctrl同时按下相关字母,命令前加一个i表示在插入模式下用这个命令


1. 选定文字 / 拷贝粘贴


v为可视模式,可以选定多行。选定多行之后,可以用yy或者dd等等进行拷贝和剪切。
p 是粘贴
y 和d 可以直接拷贝或者剪切选定的内容
yw是拷贝一个单词
如果要复制整行的最简单办法就是V,y,p 就行了
v是可以选定一行任意个字符的,V是行选定的,一次一整行,然后通过向下或向上移动光标而选定多行。
对于v选定的,拷贝后就是这么多,选多少就拷贝多少,而V选定的,粘贴的话会自动换到下一行
命令模式下,也是块选定,不过是列块选定


2. 折叠代码


可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个语句就行)
3. 缩进代码
是右缩进
按v选定后按=就是自动格式化代码,自动缩进,内部的递归的缩进都做到了
行左移>,该命令用于调整源码缩进格式简便快速。
4. 移动光标


%是从大括号的开始移动到大括号的结束位置
:后边加行号就是跳到这一行
    光标返回到以前的位置。相当于光标移动的“撤销”
    光标返回到后来的位置。相当于光标移动的“恢复”
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的支持
i   跳转到光标所指标识符的定义行,是打开一个新的小窗口显示,记住要加个i,最好是找自己项目下的文件,否则找库函数的话还不如man.
大写 K        看光标所指标识符的 man 帮助页
9. 窗口命令
= ctrl+w
:split 文件名 同时在一个页面显示多个文件的内容,类似多窗口,用切换当前窗口
f   切分显示光标在处的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #include 语句中的文件
_   当同时打开几个文件时,按 _ 使当前窗口最大化
用Ctrl-W命令指定光标移动: 
      Ctrl-W +       扩大窗口
      Ctrl-W -       缩小窗口
      Ctrl-W h       移动到窗口左边
      Ctrl-W j       移动到窗口下边
      Ctrl-W k       移动到窗口上边
      Ctrl-W l       移动到窗口右边
等于是按下后,松开键盘,再按下一个命令就可以了.
如果要关闭分割窗口可以用:close,剩下只有一个窗口的话就不能关了。
多窗口是split,像用e打开多个文件是将文件放在缓冲区中。
10. 自动完成


i   向上搜索,补全一个词
i   向下搜索,补全一个词
i 补全一行。
比如你写过一行 for (int i = 0; i 即可。如果补全出来的不是你想要的那一行,你可以按  或  选择上一个或下一个匹配行i   在文件系统中搜索,补全一个文件名
如果按  或  补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include 语句中的文件,而文件的位置将在 path 中搜索。
i   把上一行对应列的字符抄下来
i   把下一行对应列的字符抄上来,这两个都可以一直按下去,到了行尾自己会停的.
11. 注释整块内容


注释块的方法:
选定要注释掉的行   I   //   Esc 
I之后输入的东西就是插入到选定的行前边的,直至Esc.
要去掉注释的办法:选定注释符//,然后d 
列块选定后I是在前边都插入,A是在后边都插入
是按列块模式的选定,是行选定,v是普通选定


12. 其他命令


u可以撤销上一步操作, ctrl+r可以恢复
i命令执行一个普通模式的命令,执行完毕后回到插入模式,不用多次Esc
i后续字符   输入特殊的 ASCII 字符或键。
.        在光标当前位置处重复上一次操作
:!命令行         执行一条外部命令
***********************************************************************************
我是 vim 粉丝, 用了许久, 有一些自己的感受, 又到处挖到一些别人的技巧. 感觉对 vim 粉丝比较有用, 就把它记在这儿. 希望借此文套出大家自己的巧活, 就正应了抛砖引玉的古话了.
先稍为介绍一下 vim. vi 是 unix/linux 下极为普遍的一种文本编辑器, 大部分机器上都有. vi 有各种变种, 在不同的机器上常用不同的变种软件. 其中 vim 比较好用也用得比较广泛. vim 是 Vi IMproved 的缩写, 表示更好的 vi. 我个人觉得它是非常好的编辑器(为了避免 Emacs 粉丝挑眼, 就不说最好了). 没用过的也建议试试看, 当然 vim 对编写文本文件很方便好用, 比如编写程序, html文档等等, 却不能用来编写 word 文档.
关于 vim 的安装, 基本使用方法等网络上能搜出许多, 就不在这里罗嗦了, 要是对 vim 有兴趣, 那就看看这里(中文文档): 
http://vcd.gro.clinux.org/
本文就说些其中比较有用, 比较常用的命令, 若能熟练运用这些命令, 那么会发现编辑文件很舒服.
说明:
以下的例子中 xxx 表示在命令模式下输入 xxx 并回车
以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车
小括号中的命令表示相关命令.
在编辑模式或可视模式下输入的命令会另外注明.
1. 查找
   /xxx(?xxx)       表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
                   向上查找.其中xxx可以是正规表达式,关于正规式就不多说了.
                   一般来说是区分大小写的, 要想不区分大小写, 那得先输入
                   :set ignorecase
                   查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
   *(#)             当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
                   下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
                   向查找.
   g*(g#)           此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
                   是匹配包含该单词的所有字符串.
   gd               本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非
                   注释段中第一次出现这个单词的地方.
   %                本命令查找与光标所在处相匹配的反括号, 包括 () [] {}
   f(F)x            本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.
                   找到后:
                   输入 ; 表示继续往下找
                   输入 , 表示反方向查找
2. 快速移动光标
    在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定
位和编辑. 因此能更快一点移动光标是很有用的.
   w(e)             移动光标到下一个单词.
   b                移动光标到上一个单词.
   0                移动光标到本行最开头.
   ^                移动光标到本行最开头的字符处.
   $                移动光标到本行结尾处.
   H                移动光标到屏幕的首行.
   M                移动光标到屏幕的中间一行.
   L                移动光标到屏幕的尾行.
   gg               移动光标到文档首行.
   G                移动光标到文档尾行.
   c-f              (即 ctrl 键与 f 键一同按下) 本命令即 page down.
   c-b              (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up.
   ''               此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
                   找到某个单词后, 再输入此命令则回到上次停留的位置.
   '.               此命令相当好使, 它移动光标到上一次的修改行.
   `.               此命令相当强大, 它移动光标到上一次的修改点.
3. 拷贝, 删除与粘贴
    在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了.
   yw               表示拷贝从当前光标到光标所在单词结尾的内容.
   dw               表示删除从当前光标到光标所在单词结尾的内容.
   y0               表示拷贝从当前光标到光标所在行首的内容.
   d0               表示删除从当前光标到光标所在行首的内容.
   y$               表示拷贝从当前光标到光标所在行尾的内容.
   d$               表示删除从当前光标到光标所在行尾的内容.
   yfa              表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
   dfa              表示删除从当前光标到光标后面的第一个a字符之间的内容.
   特殊地:
   yy               表示拷贝光标所在行.
   dd               表示删除光标所在行.
   D                表示删除从当前光标到光标所在行尾的内容.
   关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询.
4. 数字与命令
    在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位. 如:
   5fx              表示查找光标后第 5 个 x 字符.
   5w(e)            移动光标到下五个单词.
   5yy              表示拷贝光标以下 5 行.
   5dd              表示删除光标以下 5 行.
   y2fa             表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
   :12,24y          表示拷贝第12行到第24行之间的内容.
   :12,y            表示拷贝第12行到光标所在行之间的内容.
   :,24y            表示拷贝光标所在行到第24行之间的内容. 删除类似.
5. 快速输入字符
    在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符.
    使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来. 这就是著名的命令
补齐(其实windows中也有文件名补齐功能). vi 中有许多的字符串补齐命令, 非常方便.
   c-p(c-n)         在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
                   索开头与其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令
                   会在所有在这个 vim 程序中打开的文件中进行匹配.
   c-x-l            在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的
                   文档中进行匹配.
   c-x-f            在编辑模式中, 这个命令表示补齐文件名. 如输入:
                   /usr/local/tom 后再输入此命令则它会自动匹配出:
                   /usr/local/tomcat/
   abbr             即缩写. 这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个
                   字符串. 比如编写java文件的常常输入 System.out.println, 这很
                   是麻烦, 所以应该用缩写来减少敲字. 可以这么做:
                   :abbr sprt System.out.println
                   以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System.
                   out.println
6. 替换
    替换是 vi 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.
   :s/aa/bb/g       将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :s/\/bb/g   将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
   :%s/aa/bb/g      将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/^/#/     将从12行到23行的行首加入 # 字符
   :%s= *$==        将所有行尾多余的空格删除
   :g/^\s*$/d        将所有不包含字符(空格也不包含)的空行删除.
7. 多文件编辑
    在一个 vim 程序中打开很多文件进行编辑是挺方便的.
   :sp(:vsp) 文件名     vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.
                       从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
                       把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
                       开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
                       到帮助信息.
   :e 文件名            vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.
   c-w-w                vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位
                       到各个窗口之中.
   :ls                  此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
                       会显示出如下数据:
                       1    %a       "usevim.html"          行 162
                       2    #        "xxxxxx.html"          行 0
                       其中:
                       1                表示打开的文件序号, 这个序号很有用处.
                       %a               表示文件代号, % 表示当前编辑的文件,
                                       # 表示上次编辑的文件
                       "usevim.html"    表示文件名.
                       行 162           表示光标位置.
   :b 序号(代号)        此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
                       就是用 :ls 命令看到的.
   :set diff            此命令用于比较两个文件, 可以用
                       :vsp filename
                       命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
                       到效果了.
8. 宏替换
    vi 不仅可以用 abbr 来替换文字, 也可以进行命令的宏定义. 有些命令输起来很费劲,
因此我把它们定义到 - 上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.
   :nmap  :nohls               取消被搜索字串的高亮
   :nmap  w                   命令模式下转移光标到不同窗口
   :imap                  输入模式下运行
   :nmap  :%s= *$==           删除所有行尾多余的空格.
   :imap                同上
   :java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
             会说到如何实现这一点)
   :nmap  :comp javac:mak -d . %
        此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定
        义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
           setlocal makeprg=javac
           setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
   :nmap  :comp ant:mak
        此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装
        vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用. 但是需要
        在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
   :nmap  :cl                  此命令用于查看所有的编译错误.
   :imap  
   :nmap  :cc                  此命令用于查看当前的编译错误.
   :imap  
   :nmap  :cn                  此命令用于跳到下一个出错位置.
   :imap  
   :nmap  :cp                  此命令用于跳到上一个出错位置.
   :imap  
   :nmap  :JavaBrowser
        此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
        本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.
        在这个窗口中输入 ? 会看到帮助. 嘿嘿, 很好用, 不过需要 ctags 支持.
   :imap  
9. TAB
    TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.
    >                   输入此命令则光标所在行向右移动一个 tab.
    5>>                  输入此命令则光标后 5 行向右移动一个 tab.
    :12,24>              此命令将12行到14行的数据都向右移动一个 tab.
    :12,24>>             此命令将12行到14行的数据都向右移动两个 tab.
    那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.
    有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
    帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.
    :set shiftwidth=4    设置自动缩进 4 个空格, 当然要设自动缩进先.
    :set sts=4           即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
    :set tabstop=4       实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
    :set expandtab       在输入 tab 后, vim 用恰当的空格来填充这个 tab.
10. autocmd
     这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置; 可以
在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件
里面. 由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.
   :autocmd!                删除所有之前的自动命令.
   autocmd FileType         java   source ~/.vim/files/java.vim
   autocmd FileType         java   source ~/.vim/files/jcommenter.vim
     以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.
   autocmd BufNewFile       *.java   0r ~/.vim/files/skeletons/java.skel
     以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
   autocmd BufNewFile       *.java   normal gnp
     以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
     处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.
11. 常用脚本
     在 vim.sf.net 你可以发现很多脚本(script), 这些脚本常常有让你意想不到的作用.
我常用的有:
     jcommenter.vim         自动加入 javadoc 风格的注释.
     JBrowser.vim           类资源浏览. C, C++ 等可以用 Tlist
     还有许多有用的, 比如 checkstyle.vim 可以检验你的编程风格, jad.vim 可以直接
     反编译 .class 文件等等.
12. 常用配置
     在~/.vimrc 配置文件中你常常需要一些个性化配置. 比如上面写的一些宏定义, 一些
autocmd 定义等等. 比如:
     set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
         这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件.
     set nu           显示行号
     set ai           设置自动缩进
     map Y y$         让 Y 和 D 一样, 要不然 Y 的本意和 yy 一样.
13. 其他
     还有许多有意思的命令, 记录在这里免得忘记.
     .                                                重复上次编辑命令.
     :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)    在行首插入行号
     :runtime! syntax/2html.vim                       转换 txt 成 html, 会按照你的颜色配置来转 




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

 vim 多文件操作常用命令[持续更新]
2010-05-02 01:15 1904人阅读 评论(0) 收藏 举报
vimfilebufferwindows语言tabs
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件。


 


多文件操作


1、用vi同时打开多个文件
     vi 1.text 2.text 3.text
------------------------------------------------------------------
2、多文件切换命令
    :args  显示当前编辑文件
    :next  切换到下个文件
    :prev  切换到前个文件
    :next!不保存当前编辑文件并切换到下个文件
    :prev!不保存当前编辑文件并切换到上个文件
-------------------------------------------------------------------
3、定位首文件和尾文件
    :first   定位首文件
    :last    定位尾文件
------------------------------------------------------------------
4、快速文件切换
     ctrl+^  快速在最近打开的两个文件间切换



多窗口操作


vi -o file1.txt file2.txt   # 水平分割
vi -O file1.txt file2.txt   # 垂直分割


:split[sp]                        # 把当前文件水平分割
:split another-file      # 把当前窗口水平分割, 并装入another-file
:vsplit[vsp] another-file    # 把当前窗口垂直分割, 并装入another-file
:new another-file      # 同 ":split another-file"

:close                 # 关闭当前窗口
:only                  # 只显示当前窗口, 关闭所有其他的窗口
:all                     # 打开所有的窗口
:vertical all         # 打开所有的窗口, 垂直打开


:buffers              # 列出所有的当前窗口
:buffer 2             # 编辑第二个窗口


:bd                     #关闭buffer
:bw                    #彻底关闭buffer

 
VIM7多TAB页操作


:tabnew [++opt选项] [+cmd] 文件            建立对指定文件新的tab
:tabc       关闭当前的tab
:tabo       关闭所有其他的tab
:tabs       查看所有打开的tab
:tabp      前一个
:tabn      后一个

 
设置语法高亮显示
1) 打开vimrc,添加以下语句来使得语法高亮显示:
    syntax on
2) 如果此时语法还是没有高亮显示,那么在/etc目录下的profile文件中添加以下语句:
    export TERM=xterm-color



设置Windows风格的C/C++自动缩进(添加以下set语句到vimrc中)
1)不讨论制表符为8还是为4较好,这里设置(软)制表符宽度为4:
      set tabstop=4
      set softtabstop=4
2)设置缩进的空格数为4
      set shiftwidth=4
3)设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置:
      set autoindent
4)设置使用 C/C++ 语言的自动缩进方式:
      set cindent
5)设置C/C++语言的具体缩进方式(以我的windows风格为例):
      set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
6)如果想在左侧显示文本的行号,可以用以下语句:
      set nu
7)最后,如果没有下列语句,就加上吧:
if &term=="xterm"
    set t_Co=8
    set t_Sb=^[[4%dm
    set t_Sf=^[[3%dm
endif


PS:
自动缩进有两个选项:  
    set autoindent 
    set cindent
   
autoindent 就是自动缩进的意思,当你在输入状态用回车键插入一个新行,或者在 normal 状态用 o 或者 O 插入一个新行时,autoindent 会自动地将当前行的缩进拷贝到新行,也就是"自动对齐”,当然了,如果你在新行没有输入任何字符,那么这个缩进将自动删除。 
 
cindent 就不同了,它会按照 C 语言的语法,自动地调整缩进的长度,比如,当你输入了半条语句然后回车时,缩进会自动增加一个 TABSTOP 值,当你键入了一个右花括号时,会自动减少一个 TABSTOP 值。



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

Vim的分屏功能

2009年11月7日陈皓发表评论阅读评论21,593 人阅读    

本篇文章主要教你如何使用 Vim 分屏功能。

vim-windows

 

分屏启动Vim

  1. 使用大写的O参数来垂直分屏。
    vim -On file1 file2 ...
  2. 使用小写的o参数来水平分屏。
    vim -on file1 file2 ...

注释: n是数字,表示分成几个屏。

关闭分屏 

  1. 关闭当前窗口。
    Ctrl+W c
  2. 关闭当前窗口,如果只剩最后一个了,则退出Vim。
    Ctrl+W q

分屏

  1. 上下分割当前打开的文件。
    Ctrl+W s
  2. 上下分割,并打开一个新的文件。
    :sp filename
  3. 左右分割当前打开的文件。 
    Ctrl+W v
  4. 左右分割,并打开一个新的文件。
    :vsp filename

移动光标

Vi中的光标键是h, j, k, l,要在各个屏间切换,只需要先按一下Ctrl+W

  1. 把光标移到右边的屏。
    Ctrl+W l
  2. 把光标移到左边的屏中。
    Ctrl+W h
  3. 把光标移到上边的屏中。
    Ctrl+W k
  4. 把光标移到下边的屏中。
    Ctrl+W j
  5. 把光标移到下一个的屏中。.
    Ctrl+W w

移动分屏

这个功能还是使用了Vim的光标键,只不过都是大写。当然了,如果你的分屏很乱很复杂的话,这个功能可能会出现一些非常奇怪的症状。

  1. 向右移动。
    Ctrl+W L
  2. 向左移动 
    Ctrl+W H
  3. 向上移动 
    Ctrl+W K
  4. 向下移动 
    Ctrl+W J

屏幕尺寸

下面是改变尺寸的一些操作,主要是高度,对于宽度你可以使用Ctrl+W <或是>,但这可能需要最新的版本才支持。

  1. 让所有的屏都有一样的高度。
    Ctrl+W =
  2. 增加高度。
    Ctrl+W +
  3. 减少高度。
    Ctrl+W -

也许还有其它我不知道的,欢迎你补充。



原创粉丝点击