BestofVimTips
有点乱,没时间消化,只有先收藏,也可能永远都不会用到。
原文: http://os.chinaunix.net/a2008/0123/965/000000965994.shtml
2008年01月23日 14:14 来源:ChinaUnix博客 作者:52vi 编辑:周荣茂
每个想深入学习 Vim 用户都会认真阅读的文章,官网链接:
http://www.rayninfo.co.uk/vimtips.html
这篇文章被很多人翻译过,但那是都很早了,所在原来的一系列翻译的基础上修正原来翻译欠妥的,错误的,以及近两年更新的内容。
# 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 的行,不分前后顺序 /\/i : search for fred but not alfred or frederick 查找 fred, 而不是 alfred 或者 frederick,也就是全字匹配 /\ : Search for exactly 4 digit numbers 查找4个数字的全字匹配 /\D\d\d\d\d\D : Search for exactly 4 digit numbers 查找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/" : search for visually highlighted text 查找被高亮显示的文本 :vmap // y/=escape(@", '\\/.*$^~[]') : with spec chars # searching over multiple lines \_ means including newline # 查找多行。\_ 表示包括新行 / : 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\function\)\s\+" # 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#\#\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/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##p'|redir END :nmap ,z :redir @*sil exec [email='g@select\textarea\/\=form\)\>@p'redir]'g@select\textarea\/\=form\)\>@p'redir[/email] END # 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\)\@z :%s#\=expand("")\># # Pull Visually Highlighted text into LHS of a substitute # 不懂 :vmap z :%s/\*\>/ ---------------------------------------- # all following performing similar task, substitute within substitution # Multiple single character substitution in a portion of line only :%s,\(all/.*\)\@/ : display all lines fred but not freddy 显示所有全字匹配 fred 的行 :g//z#.5 : display with context 显示上下文 :g//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/ as 5 characters) :.,$g/^\d/exe "norm! \": 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 () (forwards/backwards) 寻找光标处的狭义单词() (前向/后向) % : match brackets {}[]() 括号配对寻找 {}[]() . : repeat last modification matchit.vim : % now matches tags : word completion in insert mode 插入模式下的单词自动完成 : Line complete SUPER USEFUL 行自动完成(超级有用) / : Pull onto search/command line 把狭义单词 写到 搜索命令行 / : Pull onto search/command line 把广义单词 写到 搜索命令行 :set ignorecase : you nearly always want this 搜索时忽略大小写 :syntax on : colour syntax in Perl,HTML,PHP etc 在 Perl,HTML,PHP 等中进行语法着色 :h regexp : 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 "zdiz : wrap around VISUALLY selected Text 在visual模式下选中的文字前后分别 加上和 :vmap st "zdiz ?> : 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/\/\u\1\L\2/g # 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 是自逆算法,所以,解码和编码是同一个过程。 , : increment,decrement number under cursor 增加,减少 光标处的狭义字所表示的数字 win32 users must remap CNTRL-A Win32的用户可能需要重新定义一下Ctrl-A =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 : retrace your movements in file (starting from most recent) 依次沿着你的跳转记录向回跳 (从最近的一次开始) : 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 命令行命令历史的窗口 : : history Window 历史命令记录的窗口 ---------------------------------------- # Abbreviations & maps # # 缩写和键盘映射 :map :'a,'bw! c:/aaa/x # 译释:map是映射一个normal模式下的键 # 这里是把F7键映射成把标记a到标记b中间的内容另存为一个文件/aaa/x # 标记(mark)的方法:把光标移动到需要标记的地方,输入m,然后输 入标记名,例如a # 引用标记的方法:'a ,即:单引号加标记名 :map :r c:/aaa/x # 译释:把F8键映射成在当前位置插入文件/aaa/x的内容 :map :.w! c:/aaa/xr # 译释:.(点号)表示当前行 # 所以F11就是把当前行存为/aaa/xr # 最后的表示一个回车 :map :r c:/aaa/xr :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 # 在键盘映射中常用的表示 : carriage Return for maps 回车 : Escape ESC : normally \ 转义符号 \ : | pipe 管道符号 : backspace 退格符号 # display RGB colour under the cursor eg #445588 # 显示光标下数值的 RGB 颜色 :nmap c :hi Normal guibg=#=expand("") ---------------------------------------- # 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 # 有用的窍门 " [email=ayy@a]ayy@a[/email] : 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的输出到当前位置 &nbs