Vim

Vim使用技巧(一)

Posted by c4pr1c3 on December 28, 2006

# 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/ : search for visually highlighted text

查找被高亮显示的文本

:vmap // y/=escape(@”, ‘\\/.*$^~[]’) : 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+

# 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/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 @*sil exec

‘g@<(input<Bar>select<Bar>textarea<Bar>/=form)>@p’redir 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)\@<=\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 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/.*)\@<=/,_,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//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/<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 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 () (forwards/backwards)

寻找光标处的狭义单词() (前向/后向)

% : match brackets {}

括号配对寻找 {}

. : repeat last modification

matchit.vim : % now matches tags <tr><td>

使得 % 能够配对标记 <tr><td>

: 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</b> : 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](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 \# 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](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