Published on
2009年08月29日 in
备忘.
Tags: vim.
网上那个史上最牛vimrc流传的比较广,天啊好长,我怕配置。后来慢慢熟悉了点,就发现没这么恐怖。vim嘛,理念就是找到你在输入文本时累人的操作,用简单快捷的操作代替之,没必要多找麻烦。
这个vimrc就比较简单了,只有一点基本的设置和键绑定。比较个人化,仅作备份
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
syntax on
"filetype plugin on
"about tab
set autoindent
set smartindent
set smarttab
set expandtab
set sw=4
set ts=4
" encoding . utf-8 rules!
let $LANG="zh_TW.UTF-8" " locales
set encoding=utf-8 " ability
set fileencoding=utf-8 " prefer
set fileencodings=ascii,utf-8,gbk,ucs-2,ucs-le,sjis,big5,latin1
set ambiwidth=double
set nu
set wildmenu
set ruler
" ^c^V i don't know how these about
set lbr
set fo+=mB
set sm
set cin
set cino=:0g0t0(sus
set guifont=Courier_New:h10:cANSI
set hls
set backspace=indent,eol,start
set noswapfile
set whichwrap=b,s,<,>,[,]
set bsdir=buffer
set smartcase
set nowrap
set autochdir
set autoread
set autowrite
set nobackup
set nowritebackup
color slate
" key bindings
noremap <C-[> <C-T>
" tabs
noremap <C-Right> :tabn<CR>
inoremap <C-Right> <C-o>:tabn<CR>
noremap <C-left> :tabprevious<CR>
inoremap <C-LEFT> <C-o>:tabprevious<CR>
" windows
noremap <C-Up> <C-W>k<C-W>_
inoremap <C-Up> <C-o><C-W>k<C-W>_
noremap <C-Down> <C-W>j<C-W>_
inoremap <C-Down> <C-o><C-W>j<C-W>_
" v
noremap <UP> k
noremap <Down> j
noremap <LEFT> h
noremap <Right> l
noremap <ESC> v<ESC>
"
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" toolbar sucks
set guioptions-=T
function! To_utf8()
set enc=utf8
set fenc=utf8
set tenc=utf8
endfunction
以前貌似在豆瓣看到有人提起过这vim键操作firefox的插件,当时的第一反应就是蛋疼:有人用导线连了一台cpu,有人只用emacs上网,有人用《最后的晚餐》里的面包谱曲子,有人的妈妈找他回家吃饭…拉门,我确实都想到一块去了。
好吧,暑假在家无所事事,我又蛋疼了,装vimperator。简单熟悉一下后发现这东西还是很成熟的,除去猎奇者,拿它日常使用的也大有人在。装上之后ff的导航栏和书签栏都消失了,习惯chrome的同学们可能会找到一点熟悉的感觉,反正清爽多了。再就是一些快捷键绑定,ctrl+c ctrl+v等键全变了,唔,这不爽。还好,可以自定义.vimperatorrc修改键绑定。同vim一样,vimperator也内置了强大的帮助,即:help,该有的options里面貌似都有了。
进入vimperator的ff之后,执行命令:mkv将当前vimperator的配置保存到$HOME/.vimperatorrc里,然后就可以diy了。参考大牛的配置,修改了个简化版如下:
" 先把麻烦的东西拿掉
map A <nop>
map <c-q> <nop>
map <c-o> <nop>
map <c-i> <nop>
map <c-z> <nop>
map <c-p> <nop>
" show toolbar & scrollbar
set guioptions=Tr
" 前进后退
noremap q :back<cr>
noremap w :forward<cr>
" search
noremap <c-f> /
" close tab
noremap c :q<cr>
" F5
noremap <f5> :reload<cr>
" 解决全选、复制、粘帖、剪切和撤销与vimperator冲突的问题
noremap <c-V> <c-v>
noremap <c-Z> <c-z>
noremap <c-c> <c-v><c-c>
noremap <c-a> <c-v><c-a>
cnoremap <c-c> <c-v><c-c>
cnoremap <c-v> <c-v><c-v>
cnoremap <c-x> <c-v><c-x>
inoremap <c-a> <c-v><c-a>
inoremap <c-c> <c-v><c-c>
inoremap <c-v> <c-v><c-v>
inoremap <c-x> <c-v><c-x>
inoremap <c-z> <c-v><c-z>
inoremap <c-y> <c-v><c-y>
set titlestring=Mozilla Firefox
" 齐全的next和previous……
set nextpattern=\s*下一页|下一张|下一篇|下一????下页|后页\s*,^\bnext\b,\bnext\b,\bsuivant\b,^>$,^(>>|??????|??)$,^(>|??),(>|??)$,\bmore\b
set previouspattern=\s*上一页|上一张|上一篇|上一????上页|前页\s*,^\bprev|previous\b, \bprev|previous\b,\bprécédent\b,^<$,^(<<|??????|??)$,^(<|??),(<|??)$
" PassThrough gmail and greader
autocmd LocationChange .* js modes.passAllKeys = /.*(mail\.google\.com|www\.google\.com\/reader).*/.test(buffer.URL)
" Commands
" noimg可以减少流量,nojs用于调控一些不听话的网页
command noimg set! permissions.default.image=2
command ysimg set! permissions.default.image=1
command nojs set! javascript.enabled=false
command ysjs set! javascript.enabled=true
虽然痛恨配置,不过确实也是一劳永逸的东西。只要快捷键不要冲突,vimperator里设置的这些键还是很顺手的。看文档说貌似还可以用javascript扩展vimperator命令,想起来mozilla官方搞的那个Ubiquity,感觉两个东西貌似有点像!或许vimperator还要更强大些? :p
原地址:http://tnerual.eriogerg.free.fr/vim.html
翻译:ssword
这里的排版弄的挺难看的,大家如果觉得有用,就将就下吧。
Basic movement
基本移动
| h l k j |
左移、右移一个字符;上一行,下一行; |
| b w |
左移、右移一个词元 |
| ge e |
左移、右移到一个词元末尾 |
| { } |
前、后移动一个段落 |
| ( ) |
前、后移动一个句子 |
| 0 ^ $ |
句子的开头、首字符、最后一个字符 |
| nG ngg |
第n行的句首、句尾 |
| n% |
文件的n%处(n不可省略) |
| n| |
当前行的第n列 |
| % |
匹配下一个括号,中括号,大括号,注释或#define |
| nH nL |
当前窗口从顶数、从底数第n行 |
| M |
当前窗口的中间行 |
Insertion & replace→ insert mode
插入&替换 ->插入模式
| i a |
在光标前、后插入 |
| I A |
在当前行前、后插入 |
| gI |
在当前行的第一列插入 |
| o O |
在当前行的上、下插一新行 |
| rc |
把光标下的字符替换为c |
| grc |
同rc相似,不过不影响布局 |
| R |
替换从光标往后的所有字符 |
| gR |
同R相似,不过不影响布局 |
| cm |
修改到移动命令m指向的位置 |
| cc or S |
修改当前行 |
| C |
修改到行尾 |
| s |
修改一个字符,并进入插入模式 |
| ~ |
转换当前字符的大小写,并右移光标 |
| g~m |
转换字符大小写到移动命令m指向的位置 |
| gum gUm |
将移动命令m中间的字符转换为大写、小写 |
| m |
按照移动命令m,左移、右移缩进 |
| n< < n>> |
左移、右移n个缩进 |
Deletion
删除
| x X |
删除当前字符、前一个字符 |
| dm |
删除到移动命令m指向的位置 |
| dd D |
删除当前行 |
| J gJ |
将当前行与下一行合并 |
| :rd↵ |
删除区间内的文本 |
| :rdx↵ |
删除区间内的文本,并将其存入寄存器x |
Insert mode
插入模式
| ^Vc ^Vn |
逐字插入字符c、数值n |
| ^A |
在当前输入的文本前插入 |
| ^@ |
同^A,并退出到命令模式 |
| ^Rx ^R^Rx |
逐字)插入x寄存器的内容 |
| ^N ^P |
在光标前、光标后自动完成 |
| ^W |
删除光标前一个单词 |
| ^U |
删除前面输入的文本 |
| ^D ^T |
左移、右移一个缩进 |
| ^Kc1c2 or c1←c2 |
插入一个digraph |
| ^Oc |
进入临时命令模式执行c |
| ^X^E ^X^Y |
向上、向下滚动 |
|
回到命令模式 |
Copying
复制
| “x |
将下个用于删除、复制、粘贴的寄存器设置为x |
| :reg↵ |
显示所有寄存器的内容 |
| :reg x↵ |
显示x寄存器的内容 |
| ym |
复制移动命令m之间的文本 |
| yy or Y |
复制当前行 |
| p P |
将寄存器中的文本粘贴到光标前、后 |
| ]p [p |
同p P,并自动处理缩进 |
| gp gP |
同p P,并保留光标。 |
Advanced insertion
高级插入
| g?m |
对移动命令m中间的文本进行rot13加密 |
| n^A n^X |
对移动命令m中间的文本进行rot13加密 |
| gqm |
将移动命令m中间的多行文本格式化为同一宽度 |
| :rce w↵ |
将区间r中的内容以w为宽度居中 |
| :rle i↵ |
将区间r中的内容以i个缩进左对齐 |
| :rri w↵ |
将区间r中的内容以w为宽度右对齐 |
| !mc↵ |
以c命令过滤处理移动命令m中间的文本 |
| n!!c↵ |
以c命令过滤处理n行文本 |
| :r!c↵ |
以c命令处理区间r中间的文本 |
Visual mode
可视模式
| v V ^V |
开始、退出选取文本 |
| o |
将光标移动到选取文本的开始 |
| gv |
回到上一个选取的文本 |
| aw as ap |
选取一个单词、句子、段落 |
| ab aB |
选取一个()、{}块 |
Undoing, repeating & registers
撤销,重复和寄存器
| u U |
撤销上一个命令,返回上一个修改的行 |
| . ^R |
重复上一个修改,重复上一个撤销 |
| n. |
重复上一个修改n次 |
| qc qC |
记录、追加输入的字符到寄存器c |
| q |
停止记录 |
| @c |
执行寄存器c的内容 |
| @@ |
重复执行上一个@命令 |
| :@c↵ |
把寄存器c作为Ex命令执行 |
| :rg/p/c↵ |
对区间r中匹配p的文本执行Ex命令c |
Complex movement
高级移动
| - + |
上移,下移到行首 |
| B W |
按空格左移、右移一个词元 |
| gE E |
按空格左移、右移到一个词元的末尾 |
| n |
|
下移n-1行到行首 |
| g0 gm |
当前行首、行中央 |
| g^ g$ |
当前行的首字符、尾字符 |
| gk gj |
上移、下移 |
| fc Fc |
下一个、前一个字符c |
| tc Tc |
下一个、前一个字符c的前面 |
| ; , |
重复上一个fFtT操作,反方向 |
| [[ ]] |
上一个、下一个节开头 |
| [] ][ |
上一个、下一个节结尾 |
| [( ]) |
上一个、下一个未关闭的括号 |
| [{ ]} |
上一个、下一个未关闭的大括号 |
| [m ]m |
上一个、下一个java方法的开头 |
| [# ]# |
上一个、下一个未关闭的#if #else #endif |
| [* ]* |
上一个、下一个/* */的开头和结尾 |
Search & substitution
搜索 &替换
| /s↵ ?s↵ |
向前、向后搜索s |
| /s/o↵ ?s?o↵ |
按o个偏移向前、向后搜索s |
| n or /↵ |
向前重复上一个搜索 |
| N or ?↵ |
向后重复上一个搜索 |
| # * |
向前、向后搜索当前词元 |
| g# g* |
同上,额外匹配不完整的词元 |
| gd gD |
当前符号的局部、全局定义 |
| :rs/f/t/x↵ |
将区间r中匹配f的文本替换为t |
| :rs x↵ |
以新的区间和x重复替换 |
Special characters in search patterns
模式匹配中的特殊字符
| . ^ $ |
任一字符,行的首字符,尾字符 |
| \< \> |
单词的开头,结尾 |
| [c1-c2] |
在c1..c2之间的任一字符 |
| [^c1-c2] |
不在c1..c2之间的任一字符 |
| \i \k \I \K |
标志符,关键字;字母,数字 |
| \f \p \F \P |
文件名;可打印字符;字母;数字 |
| \s \S |
空格;非空字符 |
| \e \t \r \b |
←>键, , < ?>, < ←> |
| \= * \+ |
匹配0个或一个、0个或多个、一个或多个模式 |
| \| |
两个选择 |
| \( \) |
将一组模式组合成一个 |
| \& \n |
匹配全部、匹配第n个括号中的内容 * |
| \u \l |
匹配下一个大写、小写字母 |
| \c \C |
忽略、匹配下一个模式 |
Offsets in search commands
偏移
| n or +n |
下n行的第1列 |
| -n |
上n行的第1列 |
| e+n e-n |
匹配文本结尾右边、左边的第n个字符 |
| s+n s-n |
匹配文本右边开头右边、左边的第n个字符 |
| ;sc |
向下执行搜索命令sc |
Marks and motions
标记 &跳转
| mc,c∈[a..Z] |
把当前位置标记为c,c∈[a..Z] |
| `c `C |
跳到当前文件、任意文件的c标记 |
| `0..9 |
跳到上一个位置 |
| “ `” |
跳到上一个位置,上一次编辑的位置 |
| `[ `] |
跳到上一个修改段落的开头、结尾 |
| :marks? |
输出可用的标记列表 |
| :jumps? |
输出跳转列表 |
| n^O |
跳到跳转列表的前一个位置 |
| n^I |
跳到跳转列表的后一个位置 |
Key mapping & abbreviations
键映射 &缩写
| :map c e↵ |
在普通模式和可见模式中将c映射为e |
| :map! c e↵ |
在插入模式和命令模式中将c映射为e |
| :unmap c↵ :unmap! c↵ |
移除映射c |
| :mk f↵ |
将当前的映射和设置写入到文件f |
| :ab c e↵ |
把e设置为c的别名 |
| :ab c↵ |
显示c开头的所有别名 |
| :una c↵ |
移除别名c |
Tags
标签
| :ta t↵ |
跳到t匹配的tag |
| :nta↵ |
跳到列表中后面第n个tag |
| ^] ^T |
跳到光标指向的tag,从tag返回 |
| :ts t↵ |
列出匹配的tag供选择跳转 |
| :tj t↵ |
跳到标签t,如果有多个匹配则提示选择 |
| :tags↵ |
显示tag列表 |
| :npo↵ :n^T↵ |
向前返回、跳至第n个tag |
| :tl↵ |
跳到最后一个匹配的tag |
| ^W} :pt t↵ |
当前光标指向的前一个tag、 t匹配的tag |
| ^W] |
分割窗口,显示当前光标指向的tag |
| ^Wz or :pc↵ |
关闭显示tag的窗口 |
Scrolling & multi-windowing
滚动 &多窗口
| ^E ^Y |
向上、向下滚动一行 |
| ^D ^U |
向上、向下滚动半页 |
| ^F ^B |
向上、向下滚动一页 |
| zt or z↵ |
将当前行滚动到窗口顶部 |
| zz or z. |
将当前行滚动到窗口中央 |
| zb or z- |
将当前行滚动到窗口底部 |
| zh zl |
向右、向左滚动一个字符 |
| zH zL |
向右、向左移动半屏 |
| ^Ws or :split↵ |
将窗口分割成两个 |
| ^Wn or :new↵ |
创建一个新窗口 |
| ^Wo or :on↵ |
关掉当前窗口以外的其他窗口 |
| ^Wj ^Wk |
移动到下一个、上一个窗口 |
| ^Ww ^W^W |
移动到下一个、上一个窗口 (wrap)* |
Ex commands
Ex命令
| :e f |
编辑文件f,如果没有更改 |
| :e! f |
强制编辑文件(默认覆盖原先的修改) |
| :wn :wN |
写入文件,并编辑下一个、前一个文件 |
| :n :N |
编辑文件列表中的下一个、前一个文件 |
| :rw |
把区间r写入到当前文件 |
| :rw f |
把区间r写入到文件f |
| :rw>>f |
把如见r追加到文件f |
| :q :q! |
退出并确认,强制退出忽略修改 |
| :wq or :x or ZZ |
写入到当前文件并退出 |
| :r f |
将光标下的内容插入文件f |
| :r! c |
将光标下的内容经命令c处理的结果插入 |
| :args |
显示参数列表 |
| :rc a :rm a |
复制、移动区间r到a行下 |
Ex ranges
Ex区间
| . $ |
文件的当前行,最后一行 |
| % * |
整个文件、可视部分 |
| ‘t |
标记t指向的位置 |
| /p/ ?p? |
匹配的下一个、前一个位置 |
| +n -n |
当前行的前n-1行、后n-1行 |
Folding
折叠
| zfm |
创建折叠到移动命令m指向的位置 |
| :rfo |
为区间r创建折叠 |
| zd zE |
移除当前折叠、当前窗口的所有折叠 |
| zo zc zO zC |
打开、关闭一个折叠;递归地执行 |
| [z ]z |
移动到当前打开折叠的开头、结尾 |
| zj zk |
向下、向上移动到下一个折叠的开头、结尾 |
Miscellaneous
杂
| :sh↵ :!c↵ |
运行shell,执行shell命令c |
| K |
在man中搜索当前关键字 |
| :make↵ |
执行make,读取错误并跳转到首个错误 |
| :cn↵ :cp↵ |
显示下一个、前一个错误 |
| :cl↵ :cf↵ |
显示所有错误、从文件中读取错误 |
| ^L ^G |
重绘屏幕,显示文件名及位置 |
| g^G |
显示光标所在行、列及字符位置 |
| ga |
显示当前字符的ascii值 |
| gf |
打开当前光标下的文件名 |
| :redir>f↵ |
将输出重定向到文件f |
| :mkview ↵ |
保存view配置[到文件f] |
| :loadview ↵ |
装载view配置[从文件f] |
ps:高数59分华丽地挂掉鸟~
使用gvim也有一段时间了,还不敢说得心应手,不过倒也不会再碰editplus之类的编辑器了。它真的很好用,熟悉起来也真的需要很长时间。前辈们说的话里还是很多实话的。
使用gvim是个有趣的过程,按下一个i,鼠标 + 箭头 它就跟普通的编辑器没有两样,初学之时不至于像在vi中完全无从下手。诚然,在键盘上的手移动到鼠标处是相当累人的,按着箭头等着光标挪到那地方也很磨耐性!这就是gvim的好处,一个命令就可以将光标移动到你想要的地方。一般而言,学会了一个命令之后要再忘记就很难了,找到了近路,谁还会绕远呢?另外,个人觉得也不用总是纠结“这是vi!要按vi的法子来!”,我就觉得ctrl+s比esc+:w省力,ctrl+a比ggvG方便,反正用着舒服就好。
note几个命令:
o 在当前行下新建一行;
! 运行一个控制台的命令,例如 ! ruby % 解释执行当前文件,其中%代表当前的文件名;
) 移动光标到下一个自然段,在程序里可以跳到下个函数;
x 删除当前字符;
r 替换当前字符;
= 自动缩进当前行;
gg=G 自动缩进整个文本;
=a{ 自动缩进{}内的文本;
va” 选择”"内的文本;
. 重复上一条命令;
如果光标目前在一个字符串的第一个引号上,”blah blah blah”,要删除引号中的内容,就d/”+enter,对删除括号中的内容同理;(update:感谢reus同学, 使用di”命令更简单 ^^ )(update:貌似da”也可以 ^_^)
另外发现vi的很多命令都是有参数的:
>3> 可以让光标下的三行右移一个缩进;
tabn 2 可以切换到第二个tab;
17gg 跳到第17行;
12| 跳到当前行的第12个字符;
8l 右移8个字符,结合gg可以快速定位错误的位置;
update: 感谢ginkgo同学,有时vim在处理中文标点时会发生错位,解决方法就是在~/.vimrc里加上set ambiwidth=double
update: 刚从editplus,notepad++过来的同学有一点可能不大能接受的是,vim不会自动记住配置,重启一下vim又完全复原。而配置.vimrc对新人的门槛又太高。其实有个命令:mkv!,即可自动保存当前的所有配置到.vimrc。不过使用前最好备份一下原先的.vimrc。
Ps:动物园出版社貌似有本《学习vi编辑器》,眼镜猴的封面,感觉不是很全,不过作为入门还是不错的。
Comment