原 文: http://www.vim.org/tips/tip.php?tip_id=227 翻 译: tocer tocer.deng@gmail.com 修 订: 更新日期: 2006-05-23 VimTip 227: ':g' 的威力 ------------------------ :g 是个很古老的命令,但是威力巨大。我只是想举例说明。希望对别人能有所帮助。 :g 主要说明 ------------ 语法: :[range]:g//[cmd] 你可以认为它是这样工作的:在一定范围内(默认是整个文件),对于模式的匹配行执行 ex 命令。而且,"." 表示为当前匹配行(对于某些命令,如果没有 指定行,那么默认就是 "." (当前行)) 一些例子 ------------- 对所有的匹配行,显示上下文(5行) :g//z#.5 :g//z#.5|echo "==========" << 同前一个,但看起来更漂亮 >> 删除所有的匹配行 :g//d 例如:删除所有的空行 :g/^\s*$/d 加大行间距 :g/^/pu =\"\n\" :g/^/pu _ << 两个命令效果一样 >> 拷贝所有的匹配行到文件末尾 :g//t$ 拷贝所有的匹配行到寄存器 'a' 0"ay0:g//y A 从当前行到文件末尾,所有的匹配数字项加一 :.,$g/^\d/exe "normal! \" 注释掉所有包含 "DEBUG" 语句的行 g/^\s*DEBUG/exe "norm! I/* \A */\" 从下至上查找记录 (eg: An address book, with Name on start-of-line and fields after a space) :g/?^\w?p "if only name is interested :g//ka|?^\w?p|'ap "if name and the lookup-line is interested :g//?^\w?|+,/^[^ ]/-1p "if entire record is interested 翻转文件(就是要让你们看看 'g' 的威力) :g/^/m0 脚注 1: 使用 :v 对未匹配的行进行操作 脚注 2: Some explanation of commonly used commands with :g :2,8co15 => 把第2行到第8行之间的文本拷贝到第15行的后面 :4,15t$ => 把第4行到第15行之间的文本拷贝到文档末尾(t == co) :-t$ => 把前一行拷贝到文档末尾 :m0 => 移动当前行到第一行 :.,+3m$-1 => 移动当前行及以下三行到倒数第二行 脚注 3: 和 :g 一起使用的命令是 ex 命令,所以查找帮助时应该这样: :help : eg. :help :k