Vim

此文为网上转载,转自http://my.opera.com/yunt/blog/show.dml/221171 为方便自己学习使用

2006-04-21:99.99%完成,总算是可以完全放心做别的事了
特别要感谢Tocer(dm-info at 163.com)没有他的帮忙我根本不可能在这么快的时间里完成
2006-04-19:少量更新
2006-04-18:效验已翻译内容
2006-04-17:少量更新
2006-04-16: 计划翻译,少量更新

__开始__
------------------------------------------------------------------------------
" 搜索
/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 : 搜索同时包括fred跟joe的行
/\<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}
" visual searching
:vmap // y/<C-R>"<CR> : visually模式下的键盘映射,把//映射成匹配当前选中的文本
: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 : 匹配所有bugs到bunny的字符串
:h \_ : help
" 查找函数声明,nmap为normal模式下的键盘映射
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>
" 查找多个文件
:bufdo /searchstr/ : 在多个文件缓冲区里执行查找
" 更好的多文件查找定位方法
:bufdo %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 : 删除html的tag部分
" 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/suck\|buck/loopy/gc : 替换suck或者buck(这里|不是管道)
" 调用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\+/\=(submatch(0)-3)/
" 包含loc或者functions的行中的数字加6
:g/loc\|function/s/\d/\=submatch(0)+6/
" 比上面更好的方法
:%s#txtdev\zs\d#\=submatch(0)+1#g
:h /\zs 查看帮助
" 前缀为gg的数字加6
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/
:h zero-width 查看帮助
" 替换一个特定字符串为数字
:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 # 将yy转换成10,11,12等等
" 比上面的更精确
: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 substitute
:%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')/
----------------------------------------
" 全局显示命令
: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 : 删除所有的从fred到joe
: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 a(a为标记的位置)
:g/\(^I[^^I]*\)\{80}/d : 删除最少包含80个tab的行
" perform a substitute 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 substitution
:'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 buffer 存储结果到 寄存器/粘贴 到 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文件
----------------------------------------
#VISUAL 模式 (方便增加 HTML 标签)
:vmap sb "zdi<C-R>z<ESC> : 在 VISUALLY模式下将选中的文本前后分别加上
:vmap st "zdi<?= <C-R>z ?><ESC> : 加上 <?= ?>
----------------------------------------
" 浏览
:Exp(lore) : 浏览文件
:Sex(plore) : 分割窗口浏览文件
:ls : 显示缓冲区
:cd .. : 设置当前目录位置
:args : 查看当前打开的所有文件
:lcd %:p:h : 改变路径到当前编辑的文件
:autocmd BufEnter * lcd %:p:h : 放入.vimrc自动完成上面的命令
----------------------------------------
" 缓冲区浏览(一直排名前10的vim脚本)
" 需要 bufexplorer.vim http://www.vim.org/script.php?script_id=42
\be : 缓冲浏览器中查看缓冲列表
\bs : 同上,但是分割窗口
----------------------------------------
" 转换大小写
guu : 将正行的字母转换成小写
gUU : 将正行的字母转换成大写
Vu : 转换选中的行(小写)
VU : 转换选中的行(大写)
g~~ : 反向转换
vEU : 转换词大写
vE~ : 反向转换词
ggguG : 将当前编辑文件内容全部转换成小写
" Visually 模式下选择所有的字母及数字 (放入 .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 a到mark b之间的内容进行排序
!1} sort -u : 排序一个段落
:g/^$/;,/^$/-1!sort : Sort each block (note the crucial ;)
----------------------------------------
" 多文件管理 (基本的)
:bn : 跳转到下一个buffer
:bp : 跳转到前一个buffer
:wn : 保存当前buffer并跳转到下一个buffer (超有用)
:wp : 保存当前buffer并跳转到前一个buffer
:bd : 把当前文件从buffer移出 (超有用)
:bun : 卸载当前buffer (关闭这个窗口但是不移出)
:badd file.c : 添加file.c到buffer列表
:b 3 : 前往第三个 buffer
:b main : 前往含有main的buffer中 比如说 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 # : 编辑标记为#的文件在buffer中
:rew : 返回到第一个可编辑的文件
:brew : 回到第一个buffer
:sp fred.txt : 分割窗口打开fred.txt
:sball,:sb : 把所有的 buffers分割显示在一个窗口中 (超有用)
:scrollbind : in each split window
:map <F5> :ls<CR>:e # : 按F5显示所有buffer, 并显示行号
:set hidden : 允许不保存当前buffer而进行切换
----------------------------------------
" 在分割窗口中快速切换
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 buffer
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 visual-block of text with another such 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=buffer : 设置文件浏览使用的目录
“注:
”last 使用文件浏览器最近访问相同的目录。
“buffer 使用相关缓冲区的目录。
”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/public_html/index.html
cmap ,w :Nwrite ftp://209.51.134.122/public_html/index.html
gvim ftp://www.somedomain.com/index.html # 使用 netrw.vim
----------------------------------------
" 向寄存器中添加内容 (使用相应寄存器名称的大写)
" 复制5行放入a寄存器,然后向下跳转10行再复制5行
"a5yy
10j
"A5yy
----------------------------------------
[I : 显示当前行中字符的所有匹配(超级有用)
----------------------------------------
" 常规缩进
:'a,'b>> :将mark a到mark 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 @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p
----------------------------------------
" 重新格式化文本
gq} : 合并一个段落
gqap : 当前段落
ggVGgq : 全部段落
Vgq : 当前行
" 在70列的时候换行
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g
----------------------------------------
" 命令使用于多个文件
:argdo %s/foo/bar/e : 在所有文件上操做 :args
:bufdo %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 buffer 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 buffer
:let @*=@: : 拷贝最后执行的命令到 paste buffer
:let @*=@/ : 拷贝最后执行的查找命令到paste buffer
:let @*=@% : 拷贝当前文件到 paste buffer

map <f11> "qyy:let @q=@q."zzz"
----------------------------------------
" 帮助的帮助? (使用 TAB)
:h quickref : VIM 快速参考页
:h tips : Vim'自己的技巧帮助
:h visual<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>
----------------------------------------
" 在另一个buffer中,捕捉当前脚本的输出
:new | r!perl # : 新建一个buffer,从另一个buffer中读入结果
:new! x.out | r!perl # : 同上,并指定一个新文件名
:new+read!ls
----------------------------------------
" create a new buffer, paste a register "q" into it, then sort new buffer
: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 BufRead * silent! %s/[\r \t]\+$//
autocmd BufEnter *.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 翻页
----------------------------------------
" 替换一个visual区域
" 选择一个区域,然后输入 :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} substr($_,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 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>" :
/[^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" == submatch(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_keyword的c文件名列表
:cn : 去下一个出现的位置
----------------------------------------
" 强制无扩展名的文件的语法着色方式
:set syntax=perl
" 取消语法着色 (很有用)
:set syntax off
" 改变色彩主题 (在~vim/vim??/colors中的任何文件)
:colorscheme blue
" 通过使用模式行强迫使用 HTML 语法高亮
# vim:ft=html:
" 强制自动语法加亮(非标准的文件扩展)
au BufRead,BufNewFile */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(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 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>% : 在文本中查找文件名
----------------------------------------
" 删除,但不破坏 buffer 内容
"_d : 你一直想要的东西
"_dw : 例如:删除一个单词 (使用黑洞???)
----------------------------------------
" 送完整的路径名到剪贴板,用于邮件附件等
nnoremap <F2> :let @*=expand("%:p")<cr> :unix
nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32
----------------------------------------
" 不用离开 Vim 就能修改文件名的简单 shell 脚本
$ vim
:r! ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!
----------------------------------------
" 在一个文本里计算单词数
g<C-G>
----------------------------------------
" 你自己设置高亮显示的例子
:syn match DoubleSpace " "
:hi def DoubleSpace guibg=#e0e0e0
----------------------------------------
" reproduce previous line word by word
imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
" 根据文件类型映射快捷键
:autocmd bufenter *.tex map <F1> :!latex %<CR>
:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>
----------------------------------------
" 读取 MS-Word 文档,需要 antiword
:autocmd BufReadPre *.doc set ro
:autocmd BufReadPre *.doc set hlsearch!
:autocmd BufReadPost *.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__

Vi&Vim应用

知らなかったVimの使い方

お勧めサイト

$ vim file +54    ファイルを開いて 54 行目へ移動
:ls    バッファのリストを表示。まあ buffers 使ってたからそれでもいいんだけど。
80|    指定カラムへ移動。この場合は 80 行目へ。
Ctrl+y    Ctrl+e の逆スクロール。非常によく忘れて困る。
zt, zz, zb    現在行を画面の一番上、真ん中、下にもってくる。
CTRL-Z    vimをサスペンド。 :st でやってたけど、こっちの方がいいなー。
:10,20d    10行目から20行目を削除。すぐに VisualMode に頼ってしまうので…
g~~    現在行1行分で、大文字/小文字の切り替え。
g~w    カーソル以降の単語の大文字/小文字の切り替え。
<Ctrl-W>o    ウィンドウ分割してるときに、現在のウィンドウ以外を閉じる。
Ctrl+c    コマンドラインとかインサートモードとかビジュアルモードから抜ける。そういえばそうだった…
*    カーソル位置の単語を検索。たまに何か間違ってなってたけど、* だったのを知った…
#    カーソル位置の単語を逆方向に検索。これは知らなかった。

vim常用命令

u           撤销上一次的操作,Undo
U           撤销对当前行的所有修改
CTRL-R      Redo

qa          开始录制宏, 保存在寄存器a中, 再按一次q结束录制
@a          播放寄存器a中的宏
@@          重复播放上一个宏
99@a        播放寄存器a中的宏, 重复99次

=a{         缩排当前语句块
gg=G        缩排当前文件

CTRL-]      跳转
CTRL-T      跳转返回
CTRL-O      跳转返回起点

gd          局部变量(符号)定义处
gD          全局变量(符号)定义处
gf          调入光标处的文件

/string     向后搜索字符串
?string     向前搜索字符串
n           重复上一次搜索
N           反向重复上一次搜索
:nohlsearch 取消加亮, 缩写:nohl

hjkl        光标移动

^F / PgDn   向后翻页
^B / PgUp   向前翻页

^           当前行首
$           当前行尾

0           移动到行首
H           移动到屏幕上第一个可见行
L           移动到屏幕上末一个可见行
M           移动到屏幕中间的行

+ / <cr>    移动到下一行首的非空字符
-           移动到上一行

{           上一个空行
}           下一个空行

J           连接两行,下一行上提

ma          标记当前行位置, 记录在寄存器a中
`a          返回寄存器a所标记的行(书签)

.           重复上一个命令

23G         定位到23行
G           文件尾

%           括号配对

fx          在当前行向后查找下一个字符
Fx          在当前行向前查找下一个字符
;           重复前一个 f 或 F 命令.

:s/from/to/ 查找和替换
:s/from/to/g 查找和替换
:%s/from/to/g 查找和替换

:map <F2> dd 定义F2的功能

i           进入插入模式,在当前字符前插入
a           在当前字符后开始插入
A           在行尾插入
o           在当前行后插入一行,并进入插入模式
O           在当前行前插入一行,并进入插入模式

:w [name]   保存到文件
:q          退出
:q!         放弃保存退出
:wq [name] 保存并退出
:e name     编辑新文件
:r name     把一个文件读入到当前中间中
:e! name    放弃修改,编辑新文件

rx          将当前光标处的字符替换成字符x

x / Delete 删除光标处的字符

dw          删除一个词
dd          删除一行
3dd         删除三行
D           删除到行尾
d$          删除到行尾
dG          删除到文件尾
dgg         删除到文件头

yy          复制当前行到内部寄存器
Y           复制到行尾
yw          复制一个词
y2w         复制两个词
ye          复制一个词
y$          复制到行尾
p           粘贴内部寄存器内容到当前行
"*yy        复制当前行到系统剪贴板
"*p         粘贴系统剪贴板到当前行

~           改变当前光标下字符的大小写
*           搜索当前光标下的单词

:set tabstop=4
:set shiftwidth=4
:set cindent
:set foldmethod=indent
:set foldcolumn=4
:set foldlevel=3

zf          创建折叠块
zo          打开折叠块, zO
zc          关闭折叠块, zC
zr          打开多层折叠块
zm          关闭多层折叠块
zR          打开全部折叠块
zM          关闭全部折叠块
zd          删除
zD
zn          禁用折叠块
zN          启用折叠块
zi          在zn 和 zN之间来回切换

:set nowrap
:set lines=50
:set columns=88
:winpos 290 3

:map <F8> =a{
:map <C-F8> gg=G

:set nobackup 不产生备份文件
:set expandtab 制表符换成空格

:echo 10 + 5 * 2

:set path+=/usr/*/include 指定头文件检索目录
[I          标识符检索
[D          检索#define定义的符号

>>          增加缩进
<<          减少缩进
>a{         整块增加缩进, 包括{和}
>af         整块增加缩进

cw          删除当前词,并进入编辑状态
ce          删除当前词,并进入编辑状态
cc          擦掉当前行,并进入编辑状态
c$          擦除到行尾,并进入编辑状态

xp          交换两个字符的位置

=a{         重新格式化当前块(C语言)
gg=G        重新格式化当前文件(不太好用,有些情况不能处理)
qa          开始录制宏,记录在变量a中,共有26个变量,按q停止录制
@a          播放宏
CTRL+]      跳转到当前光标所在单词对应的主题
CTRL+T      回到前一个位置
CTRL+O      回到前一个位置
dw          删除一个词
dd          删除一行
3dd         删除三行
/string     字符串搜索
?string<cr> 同 "/", 向前查找
n           重复上一个 "/" 或 "?" 命令
^F or PgDn 向后翻页
^B or PgUp 向前翻页
$           光标移动到当前行尾
nG          移动光标到第n行
%           括号配对
x or Delete 删除一个字符
G           光标移动到文件最后一行
i           进入插入模式,在当前字符前插入
a           在当前字符后开始插入
A           在行尾插入
o           在当前行后插入一行,并进入插入模式
O           在当前行前插入一行,并进入插入模式
fx          在当前行向后查找下一个字符
Fx          在当前行向前查找下一个字符
;           重复前一个 f 或 F 命令.
+ or <cr>   移动到下一行首的非空字符
-           移动到上一行
0           移动到行首
H           移动到屏幕上第一个可见行
L           移动到屏幕上末一个可见行
M           移动到屏幕中间的行
J           连接两行,下一行上提
rx          将当前光标处的字符替换成字符 x.
.           重复前一个命令
'x          光标移动到标记x处
mx          在当前行做个标记,x可以是任何小写字母
/string     搜索
?string     反向搜索
n           重复上次搜索
N           重复上次搜索,反方向
:w [name]   保存到文件
:q          退出
:q!         放弃保存退出
:wq [name] 保存并退出
:e name     编辑新文件
:r name     把一个文件读入到当前中间中
:e! name    放弃修改,编辑新文件
:g/str1/d      #删除匹配str1的行
:%s/^.//g    #删除每行第一个字符

删除每行第一个字符

:help encoding-values  #查看当前支持编码

使用例

:g/^[^00]/d  #删除以非00开始的行
:g/^$/d #删除空行
:q 或 ZZ #退出当前窗口
:colo darkblue #改变当前本色方案
:set go=       #去掉窗口菜单等
g/^#/d         #删除以#开始的行
To get rid of those ^M use:

:1,$ s/^M//gc
or
:% s/^M//gc    #按CTRL+vm打出^M符号

_vimrc

"ORG環境設定
set nocompatible
"source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
 
set diffexpr=MyDiff()
function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let eq = ''
  if $VIMRUNTIME =~ ' '
    if &sh =~ '\<cmd'
      let cmd = '""' . $VIMRUNTIME . '\diff"'
      let eq = '"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction
 
"環境設定
set nu
set ic
set ts=4
set shiftwidth=4
set nobackup
set nu
set lines=43
set columns=100
set linebreak
set display=lastline
set go=e
behave mswin
:colo darkblue
:lang eng
 
"-----------------------------------------------------------------------------
" vim: set ts=4 sw=4 sts=0:
"-----------------------------------------------------------------------------
" 文字コード関連
"
if &encoding !=# 'utf-8'
    set encoding=utf-8
    set fileencoding=utf-8
endif
if has('iconv')
    let s:enc_euc = 'euc-jp'
    let s:enc_jis = 'iso-2022-jp'
    " iconvがeucJP-msに対応しているかをチェック
    if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
        let s:enc_euc = 'eucjp-ms'
        let s:enc_jis = 'iso-2022-jp-3'
    " iconvがJISX0213に対応しているかをチェック
    elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
        let s:enc_euc = 'euc-jisx0213'
        let s:enc_jis = 'iso-2022-jp-3'
    endif
    " fileencodingsを構築
    if &encoding ==# 'utf-8'
        let s:fileencodings_default = &fileencodings
        let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
        let &fileencodings = &fileencodings .','. s:fileencodings_default
        unlet s:fileencodings_default
    else
        let &fileencodings = &fileencodings .','. s:enc_jis
        set fileencodings+=utf-8,ucs-2le,ucs-2
        if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
            set fileencodings+=cp932
            set fileencodings-=euc-jp
            set fileencodings-=euc-jisx0213
            set fileencodings-=eucjp-ms
            let &encoding = s:enc_euc
            let &fileencoding = s:enc_euc
        else
            let &fileencodings = &fileencodings .','. s:enc_euc
        endif
    endif
    " 定数を処分
    unlet s:enc_euc
    unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
    function! AU_ReCheck_FENC()
        if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
            let &fileencoding=&encoding
        endif
    endfunction
    autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" 改行コードの自動認識
set fileformats=unix,dos,mac
" □とか○の文字があってもカーソル位置がずれないようにする
if exists('&ambiwidth')
    set ambiwidth=double
endif
 
"-----------------------------------------------------------------------------
" 編集関連
"
"オートインデントする
set autoindent
"バイナリ編集(xxd)モード(vim -b での起動、もしくは *.bin で発動します)
augroup BinaryXXD
    autocmd!
    autocmd BufReadPre  *.bin let &binary =1
    autocmd BufReadPost * if &binary | silent %!xxd -g 1
    autocmd BufReadPost * set ft=xxd | endif
    autocmd BufWritePre * if &binary | %!xxd -r | endif
    autocmd BufWritePost * if &binary | silent %!xxd -g 1
    autocmd BufWritePost * set nomod | endif
augroup END
 
"-----------------------------------------------------------------------------
" 検索関連
"
"検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
"検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
"検索時に最後まで行ったら最初に戻る
set wrapscan
"検索文字列入力時に順次対象文字列にヒットさせない
set noincsearch
 
"-----------------------------------------------------------------------------
" 装飾関連
"
"シンタックスハイライトを有効にする
if has("syntax")
    syntax on
endif
"行番号を表示しない
set number
"タブの左側にカーソル表示
set listchars=tab:\ \
set list
"タブ幅を設定する
set tabstop=4
set shiftwidth=4
"入力中のコマンドをステータスに表示する
set showcmd
"括弧入力時の対応する括弧を表示
set showmatch
"検索結果文字列のハイライトを有効にする
set hlsearch
"ステータスラインを常に表示
set laststatus=2
"ステータスラインに文字コードと改行文字を表示する
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P
 
"---------------------------------------------------------------------------
" 印刷のフォント
"---------------------------------------------------------------------------
" guifontと同じフォントで印刷
:let &printfont=&guifont
 
" 印刷用フォントを指定する
":if has('win32')
:set printfont=MS_Gothic:h12:cSHIFTJIS  " Windows
":elseif has('mac')
"  :set printfont=Osaka−等幅:h14          " Mac OSX
":else
                                          " その他の環境
":endif

Macvim .vimrc

需要安装colorsamplepack插件

日本語文字コードを対応の為macvim -kaoriyaインストール必要

"
" Maintainer:    Gavin Zhou <gavin.zhou@gmail.com>
" Last change:    2010 Apr 13
"
" To use it, copy it to
"     for Unix and OS/2:  ~/.vimrc
"          for Amiga:  s:.vimrc
"  for MS-DOS and Win32:  $VIM\_vimrc
"        for OpenVMS:  sys$login:.vimrc
 
" When started as "evim", evim.vim will already have done these settings.
if v:progname =~? "evim"
  finish
endif
 
" Use Vim settings, rather then Vi settings (much better!).
" This must be first, because it changes other options as a side effect.
" set encoding=utf-8
set nocompatible
"set guifont=Courier_New:h14:cANSI
set guifont=Monaco:h12
"set guifontwide=STXihei:h16
"set guifontwide=YouYuan:h16
set nu    "show line number
set tabstop=4 expandtab shiftwidth=4
set background=dark
:colorscheme solarized
":colorscheme fruity
":colorscheme guepardo
set bsdir=buffer
filetype on         "check file type
set autochdir
 
" allow backspacing over everything in insert mode
set backspace=indent,eol,start
 
set nobackup        " do not keep a backup file, use versions instead
set history=1000    " keep 50 lines of command line history
set ruler            " show the cursor position all the time
set showcmd            " display incomplete commands
set incsearch        " do incremental searching
"set textwidth=80
"set lines=32       " 40 line
"set columns=80     " 120 chars
set showmatch
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P
 
 
set nowritebackup
set wrap
set noerrorbells
set novisualbell
set t_vb=
 
" For Win32 GUI: remove 't' flag from 'guioptions': no tearoff menu entries
" let &guioptions = substitute(&guioptions, "t", "", "g")
 
" Don't use Ex mode, use Q for formatting
map Q gq
 
" CTRL-U in insert mode deletes a lot.  Use CTRL-G u to first break undo,
" so that you can undo CTRL-U after inserting a line break.
inoremap <C-U> <C-G>u<C-U>
 
" In many terminal emulators the mouse works just fine, thus enable it.
if has('mouse')
  set mouse=a
endif
 
" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")
  syntax on
  set hlsearch
  set guioptions-=T
endif
 
" Only do this part when compiled with support for autocommands.
if has("autocmd")
 
  " Enable file type detection.
  " Use the default filetype settings, so that mail gets 'tw' set to 72,
  " 'cindent' is on in C files, etc.
  " Also load indent files, to automatically do language-dependent indenting.
  filetype plugin indent on
 
  " Put these in an autocmd group, so that we can delete them easily.
  augroup vimrcEx
  au!
 
  " For all text files set 'textwidth' to 78 characters.
  autocmd FileType text setlocal textwidth=78
 
  " When editing a file, always jump to the last known cursor position.
  " Don't do it when the position is invalid or when inside an event handler
  " (happens when dropping a file on gvim).
  " Also don't do it when the mark is in the first line, that is the default
  " position when opening a file.
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif
 
  augroup END
 
else
 
  set autoindent        " always set autoindenting on
 
endif " has("autocmd")
 
" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
" Only define it when not defined already.
if !exists(":DiffOrig")
  command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
          \ | wincmd p | diffthis
endif
 
"autocmd BufRead,BufNewFile *.rb map <F5> :% w !ruby<CR>
"autocmd BufRead,BufNewFile *.py map <F5> :% w !python<CR>
"autocmd FileType python setlocal omnifunc=pysmell#Complete
nnoremap <silent> <F5> :NERDTree<CR>
nmap <C-h> <Esc> :noh <cr>
nmap <silent> <C-n> :bn <cr>
nmap <silent> <C-p> :bp <cr>

vim高级使用

说明: 以下的例子中 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/\<aa\>/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/^$/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 来替换文字, 也可以进行命令的宏定义. 有些命令输起来很费劲,

因此我把它们定义到 <F1>-<F12> 上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc (windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.

:nmap <F2> :nohls<cr> 取消被搜索字串的高亮 :nmap <F9> <C-W>w 命令模式下转移光标到不同窗口 :imap <F9> <ESC><F9> 输入模式下运行<F9> :nmap <F12> :%s= *$==<cr> 删除所有行尾多余的空格. :imap <F12> <ESC><F12> 同上

:java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文

         会说到如何实现这一点)

:nmap <F3> :comp javac<CR>:mak -d . %<CR>

    此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定
    义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
       setlocal makeprg=javac
       setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#

:nmap <F4> :comp ant<CR>:mak<CR>

    此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装
    vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用. 但是需要
    在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.

:nmap <F5> :cl<CR> 此命令用于查看所有的编译错误. :imap <F5> <ESC><F5>

:nmap <F6> :cc<CR> 此命令用于查看当前的编译错误. :imap <F6> <ESC><F6>

:nmap <F7> :cn<CR> 此命令用于跳到下一个出错位置. :imap <F7> <ESC><F7>

:nmap <F8> :cp<CR> 此命令用于跳到上一个出错位置. :imap <F8> <ESC><F8>

:nmap <F11> :JavaBrowser<cr>

    此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
    本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.
    在这个窗口中输入 ? 会看到帮助. 嘿嘿, 很好用, 不过需要 ctags 支持.

:imap <F11> <ESC><F11>

9. TAB

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, 会按照你的
                                                 颜色配置来转
/var/lib/openshift/bccd8eac1968476490eaee9ced33c7bf/app-root/runtime/repo/php/data/pages/vim.txt · 最后更改: 2012/11/12 14:10 由 admin
到顶部
CC Attribution-Noncommercial-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0