马兰花

导航

Vim简介

   

   

转载自   http://wiki.lazyhack.net/vim

   

Vim简介

常用操作

如何知道光标当前的位置?

  • 简单的 - CTRL-G
  • 详细的 - gCTRL-G
  • 如果不想每次都输入上面的命令,那么 set ruler
  • 标尺上将会显示出行数、列数以及百分比
  • 或者设置 'rulerformat' ,好的或许你可以尝试一下这个命令:help rulerformat

你使用 h/j/k/l 四个键来移动光标吗?

  • 或者说你还停留在箭头移动光标的世界里面?呵呵~
  • 如果是这样,那么你应该下点功夫来适应 Vim 的方式
  • 如果你做到这一点,那么你的右手就无须在键盘字幕区和右侧箭头之间晃来晃去了

如何移动

  • B?r 的开头或者结尾 gg and G
  • n nG or ngg
  • 文件的 n% n%
  • 跳到行首的第一个非空字符处 ^
  • 下一行的第一个非空字符处 <CR>
  • 上一行的第一个非空字符处 -

你知道多少种进入 Insert Mode 的方法呢?

  • 比如: i I a A o O s S c C
  • gi - 这个命令,试过了才知道爽啊!
  • 光标跳转到上次编辑的位置并进入 Insert Mode
  • 场景:你正在编辑某些文字,之后退出插入模式,返回正常模式,光标移动,然后按 gi 直接跳回上次编辑的位置并进入插入模式

用来编程

Vim and PHP

语法检查

"""""""""""""""""""""""""""""""""""""""""""""""""""""

" => Check PHP Syntax using makeprg

"""""""""""""""""""""""""""""""""""""""""""""""""""""

   

function! PhpCheckSyntax()

" Check php syntax

setlocal makeprg=\"C:\php5\php.exe\"\ -l\ -n\ -d\ html_errors=off

   

" Set shellpipe

setlocal shellpipe=>

   

" Use error format for parsing PHP error output

setlocal errorformat=%m\ in\ %f\ on\ line\ %l

make %

endfunction

   

" Perform :PhpCheckSyntax()

map <F5> :call PhpCheckSyntax()<CR>

imap <F5> <ESC>:call PhpCheckSyntax()<CR>

插件使用

最佳vim技巧翻译

------------------------------------------------------------------------------
"
搜索
/joe/e :
设置光标到匹配"joe"的末尾
/joe/e+1 :
设置光标到匹配"joe"的末尾再后移一位
/joe/s-2 :
设置光标到匹配"joe"的开头再前移两位
/^joe.*fred.*bill/ :
匹配以'j'开头且"
joe""fred""bill"之间至少有一个字符
/^[A-J]
\+/ : 搜索'A''J'重复两次以上的开头行
/begin
\_.*end : 多行匹配
/fred
\_s*joe/i : 可以是任何空白字符包括\n,\t等等
/fred
\|joe : 搜索fred或者joe
/.*fred
\&.*joe : 搜索同时包括fredjoe的行
/
\<fred\>/i : 搜索独立的单词fred
/
\<\d\d\d\d\> : 搜索独立的4位数字
/
\D\d\d\d\d\D : 搜索6位字符串中间4位数字前后两位不能为数字
/
\<\d\{4}\> : /\<\d\d\d\d\>
"
查找空行
/^\n\{3} :
匹配三连续的空行
"
使用正则表达式组查找
/\(fred\).*\(joe\).*\2.*\1
"
正则表达式重复
/^\([^,]*,\)\{8}
" vis
l searching

:vmap // y/<C-R>"<CR> : vis
lly
模式下的键盘映射,把//映射成匹配当前选中的文本
:vmap <silent> // y/<C-R>=escape(@"
, '\\/.*$^~[]')<CR><CR> : 包括空白字符
" \zs
\ze 匹配原 :h /\zs
/<\zs[^>]*\ze> :
匹配尖括号中的内容
"
零宽度匹配 :h /\@=
/<\@<=[^>]*>\@= : search for tag contents, ignoring chevrons
/<\@<=\_[^>]*>\@= : search for tags across possible multiple lines
"
多行查找 \_ 的意思是包括换行符
/ :
匹配结尾的所有内容
/fred\_s*joe/i :
匹配fred开始到joe,之间一定得是空白字符
/bugs\(\_.\)*bunny :
匹配所有bugsbunny的字符串
:h \_ : help
"
查找函数声明,nmapnormal模式下的键盘映射
:nmap gx yiw/^\(s \<bar>function\)\s\+<C-R>"<CR>
"
查找多个文件
:b?o /searchstr/ :
在多个文件缓冲区里执行查找
"
更好的多文件查找定位方法
:b?o %s/searchstr/&/gic :
在多个文件缓冲区里查找,按下n停止
"
怎样不使用 / 来查找网址
?http://www.vim.org/ :
向后查找
"
查找指定字符以外的字符串
/\c\v([^aeiou]&\a){4} :
查找4个辅音字母
----------------------------------------
#
替换
:%s/fred/joe/igc :
普通替换命令
:%s/\r//g :
删除 DOS 的换行符 ^M
"
你的文本文件是否乱七八糟的排成一行?使用如下命令
:%s/\r/\r/g :
转换 DOS 回车符 ^M 为真正的回车符
:%s= *$== :
删除行尾空白
:%s= \+$== :
同上
:%s#\s*\r\?$## :
删除尾部空白和dos换行符
:%s#\s*\r*$## :
同上
"
删除空行
:%s/^\n\{3}// :
删除连续3个空行
:%s/^\n\+/\r/ :
压缩空行,多个替换为一个
%s#<[^>]\+>##g :
删除htmltag部分
" IF YOU ONLY WANT TO KNOW ONE THING
:'a,'bg/fred/s/dick/joe/igc :
非常有用
#
译释:''a,''b指定一个范围:mark a ~ mark b
# g//
用一个正则表达式指出了进行操作的行必须可以被fred匹配
#
看后面,g//是一个全局显示命令
# s/dick/joe/igc
则对于这些满足条件的行进行替换
"
复制列
:%s= [^ ]\+$=&&= :
复制最后一列
:%s= \f\+$=&&= :
一样
:%s= \S\+$=&& :
晕,还一样!
"
记忆(反向引用)
:s/\(.*\):\(.*\)/\2 : \1/ :
将两个字段颠倒
:%s/^\(.*\)\n\1$/\1/ :
删除重复行
"
非贪婪匹配 \{-}
:%s/^.\{-}pdf/new.pdf/ :
删除第一个pdf
" use of optional atom \?
:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : lowercase with optional leading characters
"
跨越尽量多的行
:%s/// :
删除多行注释
:help /\{-} :
查看非贪婪匹配的更多帮助
"
使用寄存器替换
:s/fred/<c-r>a/g :
fred替换为寄存器a里的内容
:s/fred/<c-r>asome_text<c-r>s/g
:s/fred/\=@a/g : better alternative as register not displayed
"
在一行里写多种命令
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/
:%s/a/but/gie|:update|:next :
当使用 @: 来重复
"
或运算
:%s/s k\|b k/loopy/gc :
替换s k或者b k(这里|不是管道)
"
调用vim函数
:s/__date__/\=strftime("%c")/ :
__date__替换成当前日期,使用strftime函数
"
处理列,替换所有在第三列中的str1
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:
"
交换第一列跟第四列
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:
"
过滤form中的内容放在寄存器里
: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>
"
两位以上的数字减三(带进位。这个命令挺有趣)
:%s/\d\+/\=(s match(0)-3)/
"
包含loc或者functions的行中的数字加6
:g/loc\|function/s/\d/\=s match(0)+6/
"
比上面更好的方法
:%s#txtdev\zs\d#\=s match(0)+1#g
:h /\zs
查看帮助
"
前缀为gg的数字加6
:%s/\(gg\)\@<=\d\+/\=s match(0)+6/
:h zero-width
查看帮助
"
替换一个特定字符串为数字
:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 #
yy转换成101112等等
"
比上面的更精确
:let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 #
xxyy 转换成 xx11,xx12,xx13
" find replacement text, put in memory, then use \zs to simplify s stitute
:%s/"\([^.]\+\).*\zsxx/\1/
"
Pull word under cursor into LHS of a s stitute
:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\>#
" Pull Vis
lly Highlighted text into LHS of a s stitute

:vmap <leader>z :<C-U>%s/\<<c-r>*\>/
----------------------------------------
" all following performing similar task, s stitute within s stitution
" Multiple single character s stitution in a portion of line only
:%s,\(all/.*\)\@<=/,_,g : replace all / with _ AFTER "all/"
" Same thing
:s#all/\zs.*#\=s stitute(s match(0), '/', '_', 'g')#
" S stitute by splitting line, then re-joining
:s#all/#&^M#|s#/#_#g|-j!
" S stitute inside s stitute
:%s/.*/\='cp '.s match(0).' all/'.s stitute(s match(0),'/','_','g')/
----------------------------------------
"
全局显示命令
:g/gladiolli/# :
查找并显示匹配的行号
:g/fred.*joe.*dick/ :
显示所有含有 fred,joe & dick的行
:g/\<fred\>/ :
显示单一单词fred
:g/^\s*$/d :
删除所有空行
:g!/^dd/d :
删除不含字符串''dd''的行
:v/^dd/d :
同上
:g/fred/,/joe/d :
删除所有的从fredjoe
:g/-------/.-10,.d :
-------为标记删除之前的10
:g/{/ ,/}/- s/\n\+/\r/g :
删除 {...}之间的空行
:v/\S/d : Delete empty lines (both types)
:v/./,/./-j :
压缩空行
:g/^$/,/./-j :
同上
:g/<input\|<form/p :
或运算
:g/^/put_ :
双倍行宽 (pu = put)
:g/^/m0 :
颠倒文件 (m = move)
:'a,'bg/^/m'b :
颠倒选中的 a b
:g/^/t. :
重复行
:g/fred/t$ :
拷贝行从fred到结尾
:g/stage/t'
a : 拷贝行从stage marker aa为标记的位置)
:g/\(^I[^^I]*\)\{80}/d :
删除最少包含80tab的行
" perform a s stitute on every other line
:g/^/ if line('.')%2|s/^/zz /
" match all lines containing "somestr" between markers a & b
" copy after line containing "otherstr"
:'a,'bg/somestr/co/otherstr/ : co(py) or mo(ve)
" as above but also do a s stitution
:'a,'bg/str1/s/str1/&&&/|mo/str2/
:%norm jdd :
隔行删除
"
增加数字 (键入 <c-a>)
:.,$g/^\d/exe "norm! \<c-a>":
增加从当前行首到结尾的数字
:'a,'bg/\d\+/norm! ^A :
增加数字
"
保存全局命令的结果 (注意必须使用添加模式) 你需要使用 qaq 清空寄存器a.
"save results to a register/paste b?r
存储结果到 寄存器/粘贴 a
:g/fred/y A :
添加配备行到寄存器到 a
:g/fred/y A | :let @*=@a :
放入复制缓冲区
:let @a=''|g/Barratt/y A |:let @*=@a
:'a,'b g/^Error/ . w >> errors.txt
"
复制每一行,然后在复制出来的每一行两侧加上一个 print '复制出来的内容'
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/
"
用文件中的内容替换字符串,-d 表示删除"标记"
:g/^MARK$/r tmp.ex | -d
" display prettily
:g/<pattern>/z#.5 : display with context
:g/<pattern>/z#.5|echo "==========" : display beautifully
" Combining g// with normal mode commands
:g/|/norm 2f|r* : replace 2nd | with a star
"send output of previous global command to a new window
:nmap <F3> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>
----------------------------------------
"
全局命令和替换命令联姻 (强大的编辑能力)
:'
a,'bg/fred/s/joe/susan/gic : 可以使用反向引用来匹配
:g/fred/,/joe/s/fred/joe/gic : non-line based (ultra)
----------------------------------------
"
先找fred,然后找joe
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC
----------------------------------------
" create a new file for each line of file eg 1.txt,2.txt,3,txt etc
:g/^/exe ".w ".line(".").".txt"
----------------------------------------
" Absolutely essential
----------------------------------------
* # g* g# :
查找当前光标下的单词(单个单词) (<cword>) (向前/向后)
% :
匹配括号 {}[]()
. :
重复上次操作
@: :
重复上次的命令
matchit.vim :
%能匹配 <script> <?php等标记
<C-N><C-P> :
插入模式下自动完成填词
<C-X><C-L> :
行自动完成(超级有用)
/<C-R><C-W> :
把单个<cword>单词放入搜索或者命令行
/<C-R><C-A> :
把字符串中有的单词<CWORD>放入搜索或者命令行
:set ignorecase :
忽略大小写
:syntax on :
打开语法高亮 Perl,HTML,PHP 等等
:h regexp<C-D> :
ctrl+d得到包含regexp的列表
(
tab自动不齐)
----------------------------------------
"
简单编辑更新 _vimrc文件
:nmap ,s :source $VIM/_vimrc :
普通模式下的键盘映射 ,s映射成加载用户目录下的_vimrc文件
:nmap ,v :e $VIM/_vimrc :,v
映射成打开_vimrc文件
----------------------------------------
#VIS
L
模式 (方便增加 HTML 标签)
:vmap sb "zdi<C-R>z<ESC> :
VIS
LLY
模式下将选中的文本前后分别加上
:vmap st "zdi<?= <C-R>z ?><ESC> :
加上 <?= ?>
----------------------------------------
"
浏览
:Exp(lore) :
浏览文件
:Sex(plore) :
分割窗口浏览文件
:ls :
显示缓冲区
:cd .. :
设置当前目录位置
:args :
查看当前打开的所有文件
:lcd %:p:h :
改变路径到当前编辑的文件
:autocmd B?nter * lcd %:p:h :
放入.vimrc自动完成上面的命令
----------------------------------------
"
缓冲区浏览(一直排名前10vim脚本)
"
需要 b?xplorer.vim http://www.vim.org/script.php?script_id=42
\be : 缓冲浏览器中查看缓冲列表
\bs : 同上,但是分割窗口
----------------------------------------
"
转换大小写
guu :
将正行的字母转换成小写
gUU :
将正行的字母转换成大写
Vu :
转换选中的行(小写)
VU :
转换选中的行(大写)
g~~ :
反向转换
vEU :
转换词大写
vE~ :
反向转换词
ggguG :
将当前编辑文件内容全部转换成小写
" Vis
lly
模式下选择所有的字母及数字 (放入 .vimrc文件中)
vmap ,c :s/
\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>
"
大写所有句子的第一个字母
:%s/[.!?]
\_s\+\a/\U&\E/g
----------------------------------------
gf :
打开当前光标下或后的文件
:nnoremap gF :view <cfile><cr> :
打开当前光标下或后的文件, 如果不存在则创建
ga :
显示当前光标下单个字的ascii,十进制,十六进制……
ggVGg? :
将整个文件用rot13编码……(谁看得懂啊~~hoho)
ggg?G :
同上 (针对大文件)
:8 | normal VGg? :
将第八行用rot13编码
:normal 10GVGg? :
同上
<C-A>,<C-X> :
增加,减少当前光标下的数字
win32
用户需要重定义 CNTRL-A
<C-R>=5*5 :
插入25 (小型计算器)
----------------------------------------
"
几个彩蛋……
:h 42 : also http://www.google.com/search?q=42
:h holy-grail
:h!
----------------------------------------
"
标记 & 移动
'
. : 跳回最后编辑的行 (超有用)
`. :
同上,但是定位编辑点
g; :
跳转到比较旧的编辑位置(如果有的话) (vim6.3后的新功能)
g, :
这个是较心的位置 (同上)
:changes :
打出改变表
:h changelist :
查看"改变表跳转"的帮助
<C-O> :
依次沿着你的跳转记录向回跳 (从最近的一次开始)
<C-I> :
依次沿着你的跳转记录向前跳
:ju(mps) :
列出跳转轨迹
:help jump-motions
:history :
列出历史记录
:his c :
命令行历史
:his s :
搜索历史
q/ :
搜索命令历史的窗口
q: :
命令行命令历史的窗口
:<C-F> :
历史窗口
----------------------------------------
"
缩写 & 映射
:map <f7> :'a,'bw! c:/aaa/x
:map <f8> :r c:/aaa/x
:map <f11> :.w! c:/aaa/xr<CR>
:map <f12> :r c:/aaa/xr<CR>
:ab php :
查看以php开头的缩写
:map , :
列出所有的映射(以逗号开始的)
"
允许映射 F10 (win32)
set wak=no : :h winaltkeys
"
映射中常使用的表示
<CR> :
回车
<ESC> : Esc
<LEADER> :
右斜杠
<BAR> :
管道符号
<BACKSPACE> :
退格键
<SILENT> :
不回显
#
显示自定义的 RGB 颜色显示当前光标下的字符串 例如 #445588
:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>
map <f2> /price only\\|versus/ :in a map need to backslash the \
----------------------------------------
" Simple PHP debugging display all variables yanked into register a
"
简单的 PHP 调试将所有显示的变量放入寄存器a
iab phpdb exit("<hr>Debug <C-R>a ");
----------------------------------------
"
使用寄存器来映射 (放入 .vimrc文件自动加载)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"
----------------------------------------
"
列出寄存器
:reg :
显示当前所有的寄存器
:reg a :
显示寄存器a中的内容
"1p.... :
引用一个叫1的寄存器
:let @y='yy@"' : pre-loading registers (put in .vimrc)
qqq :
清空寄存器 "q"
----------------------------------------
"
一些有用的决窍
"ayy@a :
把当前行作为命令执行
yy@" :
上面的匿名寄存器
u@. :
只执行键入的命令
----------------------------------------
"
从其它命令处获得输入(需要外部命令)
:r!ls.exe :
ls 获得输入插入到当前位置
!!date :
date获得输入(删除当前行)
"
使用外部sort排序
:%!sort -u :
sort排序整个文件(结果覆盖整个文件)
:'a,'b!sort -u :
mark amark b之间的内容进行排序
!1} sort -u :
排序一个段落
:g/^$/;,/^$/-1!sort : Sort each block (note the cr ial ;)
----------------------------------------
"
多文件管理 (基本的)
:bn :
跳转到下一个b?r
:bp :
跳转到前一个b?r
:wn :
保存当前b?r并跳转到下一个b?r (超有用)
:wp :
保存当前b?r并跳转到前一个b?r
:bd :
把当前文件从b?r移出 (超有用)
:bun :
卸载当前b?r (关闭这个窗口但是不移出)
:badd file.c :
添加file.cb?r列表
:b 3 :
前往第三个 b?r
:b main :
前往含有mainb?r 比如说 main.c
:sav php.html :
把当前文件存为php.html并打开
:sav! %<.bak :
换一个后缀名保存 (旧方法)
:sav! %:r.cfm :
同上
:sav %:s/fred/joe/ :
替换文件名
:sav %:s/fred/joe/:r.bak2 :
替换文件和后缀
:!mv % %:r.bak :
重命名当前文件
:e! :
打开未修改之前的文件
:w c:/aaa/% :
存储文件到指定位置
:e # :
编辑标记为#的文件在b?r
:rew :
返回到第一个可编辑的文件
:brew :
回到第一个b?r
:sp fred.txt :
分割窗口打开fred.txt
:sball,:sb :
把所有的 b?rs分割显示在一个窗口中 (超有用)
:scrollbind : in each split window
:map <F5> :ls<CR>:e # :
F5显示所有b?r, 并显示行号
:set hidden :
允许不保存当前b?r而进行切换
----------------------------------------
"
在分割窗口中快速切换
map <C-J> <C-W>j<C-W>_
map <C-K> <C-W>k<C-W>_
----------------------------------------
"
录制命令 (最好的技巧)
qq #
录制命令放入 q寄存器
输入一些命令
q #
录制结束
@q :
执行放入寄存器q中的内容
@@
:重复
5@@
:重复5
"
编辑一个 寄存器/录制
"qp :
显示寄存器q中的内容(普通模式下)
<ctrl-R>q :
显示寄存器q中的内容 (插入模式下)
"
你现在可以看到记录内容,随便编辑
"qdd :
删除,重新存入q
@q :
执行 录制/寄存器 q
"
在可视块中运行记录
1)
定义记录/寄存器
qq:s/ to/ from/g^Mq
2)
定义可视块
V}
3)
键入 : 将显示下面信息
:'<,'>
4)
完成如下操作
:'<,'>norm @q
----------------------------------------
"combining a recording with a map (to end up in command mode)
nnoremap ] @q:w!<bar>bd
----------------------------------------
"
可视化模式提供一种灵活易用的方法选择一块文本供操作符使用
"
记出
v :
进入可视化模式
V :
进入可视化行选择模式
<C-V> :
进入可视化块选择模式
gv :
重新选择
o :
选择的区域头尾移动
"*y :
复制选择区域到paste b?r
V% :
选择一个匹配段
V}J :
合并一个段落
V}gJ :
合并一个段落,并保留空格
----------------------------------------
"
删除选中的10行的前两个字符(不过这里应该假设是紧凑的排版格式,不能包含空格、tab等字符的,可是经实验应该是钱3个字符才对啊??)
0<c-v>10j2ld
----------------------------------------
"
如何用可视块拷贝几列
"
可视块(并非通常的 v 命令)
<C-V>
,然后通过移动命令选择列 (win32 <C-Q>)
然后执行 c,d,y,r 等命令
----------------------------------------
" how to overwrite a vis
l-block of text with another s h block

Pick the first block: ctrl-v move "ay
Pick the second block: ctrl-v move c ctrl-o "
aP <esc>
----------------------------------------
" _vimrc
基本设置
:set incsearch :
输入搜索命令时,立即显示目前输入的模式对应的匹配。匹配的字符串被高亮。
:set wildignore=*.o,*.obj,*.bak,*.exe : tab
补全时忽略这些忽略这些
:set shiftwidth=3 :
设置自动缩进为3个字符
:set vb t_vb=". :
安静模式,关闭响铃跟闪烁
:set browsedir=b?r :
设置文件浏览使用的目录
"
注:
"last
使用文件浏览器最近访问相同的目录。
"b?r
使用相关缓冲区的目录。
"current
使用当前目录。
"{path}
使用指定目录。
----------------------------------------
"
启动windows中的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>
----------------------------------------
"
vim里打开ftp
cmap ,r :Nread ftp://209.51.134.122/p lic_html/index.html
cmap ,w :Nwrite ftp://209.51.134.122/p lic_html/index.html
gvim ftp://www.somedomain.com/index.html #
使用 netrw.vim
----------------------------------------
"
向寄存器中添加内容 (使用相应寄存器名称的大写)
"
复制5行放入a寄存器,然后向下跳转10行再复制5
"a5yy
10j
"A5yy
----------------------------------------
[I :
显示当前行中字符的所有匹配(超级有用)
----------------------------------------
"
常规缩进
:'a,'b>>
:将mark amark b之间的内容进行两次缩进
"
虚拟模式下缩进 (可重复)
:vnoremap < <gv
"
这是一个虚拟模式下的键盘映射 < 映射为<gv
"<
意为向内缩进,gv 上面已有解释,为重复上次选区
"<gv
也就是先向内缩进然后再选择刚才的选区
"
这样就可以只按 < 实现重复缩进了
:vnoremap > >gv
:向内缩进,原理同上
"
块缩进
>i{
>a{
" also
>% and <%
"
自己试试看吧,涉及到用 { 的语言很有用,比如c,c++
----------------------------------------
"
重定向 & 粘贴到寄存器 * *为寄存器名称)
:redir @* :
重定向命令到paste缓冲区
:redir END :
结束
:redir >> out.txt :
重定向到文件
"
操作粘贴缓冲区
"*yy :
复制到寄存器
"*p :
从寄存器中粘贴一行
"
复制到粘贴缓冲区 (扩展模式)
:'a,'by* :
复制一个范围到粘贴寄存器
:%y* :
复制一个括号匹配到粘贴缓冲区
:.y* :
复制当前行到粘贴缓冲区
"
从剪贴板上过滤非可打印字符
"
当从一些 GUI 程序粘贴时会有用处
:nmap <leader>p :let @* = s stitute(@*,'[^[:print:]]','','g')<cr>"*p
----------------------------------------
"
重新格式化文本
gq} :
合并一个段落
gqap :
当前段落
ggVGgq :
全部段落
Vgq :
当前行
"
70列的时候换行
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g
----------------------------------------
"
命令使用于多个文件
:argdo %s/foo/bar/e :
在所有文件上操做 :args
:b?o %s/foo/bar/e
:windo %s/foo/bar/e
:argdo exe '%!sort'|w! :
包含外部命令
----------------------------------------
"
命令行技巧
gvim -h :
显示帮助
ls | gvim - :
管道操作
cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " :
从管道出过滤内容
gvim -o file1 file2 :
分割窗口显示两个文件
"
打开文件后执行一条命令
gvim.exe -c "/main" joe.c :
打开 joe.c & 跳转到 "main"
"
在打开一个文件时执行多条命令
vim -c "%s/ABC/DEF/ge | update" file1.c
"
在一组文件上执行多条命令
vim -c "argdo %s/ABC/DEF/ge | update" *.c
"
从一系列文件中删除一块区域
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c
"
自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了)
vim -s "convert.vim" file.c
#
不加载.vimrc跟任何plugin(干净清新的 VIM^_^)
gvim -u NONE -U NONE -N
" Access paste b?r contents (put in a script/batch file)
gvim -c 'normal ggdG"*p' c:/aaa/xp
"
paste中的内容送往默认的打印机
gvim -c 's/^/\=@*/|hardcopy!|q!'
" gvim
里的 grep (win32 or *nix)
:grep somestring *.php :
创建匹配的文件列表
"
使用 :cn(向后后) :cp(向前) 操纵列表
:h grep
:查看帮助
----------------------------------------
" GVIM
的差异比较
gvim -d file1 file2 : vimdiff (
比较不差异)
dp :
把光标处的不同放到另一个文件
do :
在光标处从另一个文件取得不同
----------------------------------------
" Vim traps
在正则表达式中 + | ( { 都要加上转义符(反斜杠)
/fred\+/ :
匹配 fred/freddy 但不匹配 free
/\(fred\)\{2,3}/ : note what you have to break
----------------------------------------
" \v
,或叫做very magic (通常都是这么叫)可以取消转义符
/codes\(\n\|\s\)*where :
普通的正则表达式
/\vcodes(\n|\s)*where : very magic
----------------------------------------
"
把对象送到命令行或者搜索行
<C-R><C-W> :
执行当前光标下的单个单词
<C-R><C-A> :
执行当前光标下尽可能多的单词
<C-R>- :
送至一个小型寄存器(同样使用于插入模式)
<C-R>[0-9a-z] :
送至一个命名寄存器 (括弧同上)
<C-R>% :
送至文件名(#也行) (同上)
<C-R>=somevar :
送至一个变量 (例如 :let sray="ray[0-9]")
----------------------------------------
"
控制寄存器
:let @a=@_ :
清除寄存器 a
:let @a="" :
同上 a
:let @*=@a :
拷贝寄存器 a paste b?r
:let @*=@: :
拷贝最后执行的命令到 paste b?r
:let @*=@/ :
拷贝最后执行的查找命令到paste b?r
:let @*=@% :
拷贝当前文件到 paste b?r
 
map <f11> "qyy:let @q=@q."zzz"
----------------------------------------
"
帮助的帮助? (使用 TAB)
:h quickref : VIM
快速参考页
:h tips : Vim'
自己的技巧帮助
:h vis
l<C-D><tab> :
虚拟模式的帮助列表
:
然后使用tab选择它们
:h ctrl<C-D> :
所有关于ctrl键的帮助列表
:helpg uganda :
过滤帮助文件 使用 :cn, :cp 查找下一个及后一个
:h :r :
关于 :ex 的命令帮助
:h CTRL-R :
普通模式相关
:h /
\r : \r是什么的意思
:h
\\zs : 使用双反斜线查找关于 \zs 的帮助
:h i_CTRL-R :
在插入模式中 <C-R>的解释
:h c_CTRL-R :
在命令模式中 <C-R> 的解释
:h v_CTRL-V :
虚拟模式
:h tutor : VIM
快速指南
<C-[>, <C-T> : Move back & Forth in HELP History
gvim -h : VIM
命令行帮助
----------------------------------------
"
选项设置在那里
:scriptnames :
列出所有已经加载的 plugins, _vimrcs文件
:verbose set history? :
显示 history的值并显示在那里定义的
:function :
列出所有函数
:func SearchCompl :
显示指定函数的细节
----------------------------------------
"
制作你自己的VIM 帮助
:helptags /vim/vim64/doc :
重新编译所有 *.txt 的帮助文件在这个目录里
:help add-local-help
:如何添加本地帮助
----------------------------------------
"
用外部程序运行文件 (例如 php)
map <f9> :w<CR>:!c:/php/php.exe %<CR>
map <f2> :w<CR>:!perl -c %<CR>
----------------------------------------
"
在另一个b?r中,捕捉当前脚本的输出
:new | r!perl # :
新建一个b?r,从另一个b?r中读入结果
:new! x.out | r!perl # :
同上,并指定一个新文件名
:new+read!ls
----------------------------------------
" create a new b?r, paste a register "q" into it, then sort new b?r
:new +put q|%!sort
----------------------------------------
"
插入DOS换行符
:%s/$/
\<C-V><C-M>&/g : (that's what you type
:%s/$/\<C-Q><C-M>&/g : for Win32)
对于Win32应该这样
:%s/$/\^M&/g :
你看到的^M是一个字符
----------------------------------------
"
自动删除行尾 Dos回车符和空格
autocmd BRead * silent! %s/[\r \t]\+$//
autocmd B?nter *.php :%s/[ \t\r]\+$//e
----------------------------------------
"
对指定文件或文件类型执行某个动作
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec('set fileformats=unix')
----------------------------------------
"
把最后一个命令贴到当前位置
i<c-r>:
"
把最后一个搜索指令贴到当前位置
i<c-r>/
----------------------------------------
"
更多的完成功能
<C-X><C-F> :
插入当前目录下的一个文件名到当前位置
#
insert模式下使用
#
然后用 Ctrl-P/Ctrl-N 翻页
----------------------------------------
"
替换一个vis
l
区域

"
选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
:'<,'>s/Emacs/Vim/g :
前面的' '<.'> vim自动添加的
gv :
重新选择前一个可视区域 (ULTRA)
----------------------------------------
"
在文件中插入行号
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
:%s/^/
\=strpart(line(".")." ", 0, 5)
:%s/^/
\=line('.'). ' '
----------------------------------------
#
VIM的方式来编号行
:set number :
显示行号
:map <F12> :set number!<CR> : Show linenumbers flip-flop
:%s/^/
\=strpart(line('.')." ",0,&ts)
#
从任意行开始编号(需要perl)
:'
a,'b!perl -pne 'BEGIN{$a=223} s str($_,2,0)=$a++'
#
产生数字列表
#Type in number on line say 223 in an empty file
qqmnYP`n^Aq : in recording q repeat with @q
"
递增已存在数字到文件末
:.,$g/^
\d/exe "normal! \<c-a>"
"
高级递增,参见:
http://vim.sourceforge.net/tip_view.php?tip_id=150
----------------------------------------
"
高级递增 (真的很有用)
"
把下面几句放到 _vimrc
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
"
例如从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)/
----------------------------------------
"
生成从 23-64 的数字列表
o23<ESC>qqYp<C-A>q40@q
----------------------------------------
"
在当前插入模式下编辑/移动 (真得很有用)
<C-U> :
删除全部
<C-W> :
删除最后一个单词
<HOME><END> :
移动到行首/行尾
<C-LEFTARROW><C-RIGHTARROW> :
向前/后移动一个单词
<C-X><C-E>,<C-X><C-Y> : scroll while staying put in insert
----------------------------------------
#
加密(小心使用,不要忘了密码)
:X : vim
会提示你输入密码
:h :X
----------------------------------------
"
模式行 (使文件只读等),必须在前/ 5行内
// vim:noai:ts=2:sw=4:readonly:
" vim:ft=html: :
使用 HTML 语法高亮
:h modeline
----------------------------------------
"
建立你自己的菜单项
amenu Modeline.Insert
\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>vim60:fdm=marker<esc>gg
----------------------------------------
"
一个保存当前光标下的狭义字到一个文件的函数
function! SaveWord()
normal yiw
exe '
:!echo '.@0.' >> word.txt'
endfunction
map ,p :call SaveWord()
----------------------------------------
"
删除重复行的函数
function! Del()
if getline(".") == getline(line(".") - 1)
norm dd
endif
endfunction
 
:g/^/ call Del() #
使用该函数的一个例子
----------------------------------------
"
双字节编码 (non alpha-numerics)
:digraphs :
显示编码表
:h dig :
帮助
i<C-K>e'
: 输入 é
i<C-V>233 :
输入 é (Unix)
i<C-Q>233 :
输入 é (Win32)
ga :
查看字符的hex
#
删除非 ascii 字符
:%s/[<C-V>128-<C-V>255]//gi : where you have to type the Control-V
:%s/[?-?]//gi : Should see a black sq
re & 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>" :
/[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii
----------------------------------------
"
文件名自动完成 (例如 main_c.c)
:e main_<tab> : tab
键完成
gf :
打开光标处广义字命名的文件 (normal模式)
main_<C-X><C-F> :
文件名自动完成(insert模式)
----------------------------------------
" Vim
复杂使用
"
交换两个单词
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == s match(0)), 3)/g
"
交换两个单词
:vnoremap <C-X> <Esc>`.``gvP``P
----------------------------------------
"
text文件转换成html文件(oh,ft)
:runtime! syntax/2html.vim :
转换 txt html
:h 2html
----------------------------------------
" VIM
有一个内部自带的 grep 命令
:grep some_keyword *.c :
得到一个包含some_keywordc文件名列表
:cn :
去下一个出现的位置
----------------------------------------
"
强制无扩展名的文件的语法着色方式
:set syntax=perl
"
取消语法着色 (很有用)
:set syntax off
"
改变色彩主题 (~vim/vim??/colors中的任何文件)
:colorscheme bl
"
通过使用模式行强迫使用 HTML 语法高亮
# vim:ft=html:
"
强制自动语法加亮(非标准的文件扩展)
au BRead,BNewFile */Content.IE?/* setfiletype html
----------------------------------------
:set noma (non modifiable) :
防止修改
:set ro (Read Only) :
只读保护
----------------------------------------
"
对话 (打开一堆文件)
gvim file1.c file2.c lib/lib.h lib/lib2.h :
"对话"中加载这些文件
:mksession :
生成一个Session文件 (默认是Session.vim)
:q
gvim -S Session.vim :
重新加载所有文件
----------------------------------------
#
标记(tags) (跳转到子程序/函数)
taglist.vim :
很流行的插件
:Tlist :
显示标记 (函数列表)
<C-]> :
跳转到光标处的函数
----------------------------------------
" 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(s match(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 fifth column
----------------------------------------
"
折叠:隐藏某些片断,使查看更容易
zf} :
使用动作命令折叠一个段落
v}zf :
使用可视模式折叠一个段落
zf'a :
折叠到一个标记上
zo :
打开折叠
zc :
重新关闭折叠
----------------------------------------
"
显示"不可见字符"
:set list
:h listchars
----------------------------------------
"
如何在不进入插入模式的情况下粘贴"普通模式的命令"
:norm qqy$jq
----------------------------------------
"
处理文件名
:h filename-modifiers :
帮助
:w % :
写入当前文件
:w %:r.cfm :
改变文件扩展名为 .cfm
:!echo %:p :
显示完整路径和文件名
:!echo %:p:h :
只显示完整路径
:!echo %:t :
只显示文件名
:reg % :
显示文件名
<C-R>% :
插入文件名 (插入模式)
"%p :
插入文件名 (普通模式)
/<C-R>% :
在文本中查找文件名
----------------------------------------
"
删除,但不破坏 b?r 内容
"_d :
你一直想要的东西
"_dw :
例如:删除一个单词 (使用黑洞???)
----------------------------------------
"
送完整的路径名到剪贴板,用于邮件附件等
nnoremap <F2> :let @*=expand("%:p")<cr> :unix
nnoremap <F2> :let @*=s stitute(expand("%:p"), "/", "
\\", "g")<cr> :win32
----------------------------------------
"
不用离开 Vim 就能修改文件名的简单 shell 脚本
$ vim
:r! ls *.c
:%s/
\(.*\).c/mv & \1.bla
:w !sh
:q!
----------------------------------------
"
在一个文本里计算单词数
g<C-G>
----------------------------------------
"
你自己设置高亮显示的例子
:syn match Do leSpace " "
:hi def Do leSpace guibg=#e0e0e0
----------------------------------------
" reprod e previous line word by word
imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
"
根据文件类型映射快捷键
:autocmd b?nter *.tex map <F1> :!latex %<CR>
:autocmd b?nter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>
----------------------------------------
"
读取 MS-Word 文档,需要 antiword
:autocmd BReadPre *.doc set ro
:autocmd BReadPre *.doc set hlsearch!
:autocmd BReadPost *.doc %!antiword "%"
----------------------------------------
" a folding method
vim: filetype=help foldmethod=marker foldmarker=<<<,>>>
A really big section closed with a tag <<<
--- remember folds can be nested ---
Closing tag >>>
----------------------------------------
" Just Another Vim Hacker JAVH
vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"
#
译释:呵呵,谁来解释一下吧!
#
其实不过是在启动vim的时候执行了一个命令
#
先写入了 Just Another Vim Hacker rot13编码
#
然后再解码
----------------------------------------
__END__

posted on 2011-02-09 13:46  笨鸟快飞  阅读(1069)  评论(0编辑  收藏  举报