在Vim中你可以把两行合并为一行
假设你要向上移动9行.
3a!<Esc>"命令
要退出Vim, 用命令"ZZ"
还可以用":e!"命令放弃所有修改并重新载入该文件的原始内容
按下CTRL-](跳转到一个标签的命令)
CTRL-T(弹出标签)可
以回到前一个位置. 用命令CTRL-O(跳转到较早的位置
:help i_CTRL-H
:help 'number'
:help i_<Up>
"3w"将光标向前移动3个words
"b"1命令则将光标向后移动到前一个word的首字符上:
"e"1命令会将光标移动到下一个word的最后一个字符
"e"命令有"ge", 它将光标移动到前一
个word的最后一个字符上
所以此处用了大写的WORD来区分于word
"^"命令将光标移动到当前行的第一个非空白字符上4. "0"命令则总是把光标移动到当前行的第一个字符上.
如"1$"会将光标移动到当前行行尾, "2$"则会移动到下一行的行尾, 如此类推.
命令"fx"
命令"3fl"
"F"命令向左方向搜索
"tx"命令形同"fx"命令,该命令的反方向版是"Tx":
这4个命令都可以用";"来重复. 以","也是重复同样的命令, 但是方向与原命令的方向相反1.
的()给弄糊涂.此时使用命令“%3
"33G"就会把光标置于第33行上
"gg"命令是跳转到第一行的快捷的方法
"50%"将会把光标定位在文件的中间
"H"意为Home, "M"为Middle, "L"为Last.
使用CTRL-G命令. 你会得到一些类似于下面的信息行
set nonumber
CTRL-U命令会使文本向下滚动半屏
CTRL-D命令将窗口向下移动半屏
要一次滚动一行可以使用CTRL-E(向上滚动)和CTRL-Y(向下滚动)
CTRL-F是向前1, CTRL-B是向后
"zz"命令会把当前行置为屏幕正中央"zt"命令会把当前行置于屏幕顶端"zb"则把当前行置于屏幕底端4.
"/"键 "3n"会去查找目标字符串的第3次出,
"?"命令与"/"的工作相同, 只是搜索方向相反3
:set ignorecase
"/o<Up>"1Vim就会把"/one"放在命令
行上.
"/o<Up>"1Vim就会把"/one"放在命令行上.
"#"命令是"*"的反向版. 还可以在这两个命令前加一个命令计数:"3*"查找当前光标下的word的第三次出现.
set hlsearch
:set nohlsearch
:nohlsearch
:set incsearch
:set nowrapscan
Go:set hlsearch<Esc>
``
命令"ma", `a
:marks
` 进行此次跳转之前的起跳点
" 上次编辑该文件时光标最后停留的位置
[ 最后一次修改的起始位置
] 最后一次修改的结束位
所以"d4w"命令是删除4个word.
所以"d$"命令就是删除自当前光标到行尾的内容.
操作符命令+位移命令.
"cw"改变一个word
这里的"c2wbe<Esc>
"cc"命令可以改变整行
"c$"改变当前光标到行尾的内容
命令"3dw"和"d3w"都是删除3个word
"3d2w"
"r"命令不是一个操作符命令. 它等待你键入下一个字符用以替换当前光标下的那个字符.
你也可以用"cl"或"s"完成同样的事情, 但用"r"的话就不需要再用<Esc>键回到Normal模式了
"df>"
"."命令是Vim中一个简单而强大的命令. 它会重复上一次做出的改
动.
/four<Enter> 找到第一个字符串"four"cwfive<Esc> 把它改为"five"
CTRL-V 现在可以用"3j"向下移动3 行
你以"d"或"x"这样的命令删除文本,可以用p命令把它取回来,"3p"
把光标置于"teh"的e上执行命令"xp".
那就用"ye" "yw"
"Y"也是复制整行的内容
复制当前光标至行尾的命令是"y$".
"daw".果光标位于一个单词的中间而你要删除这个单词,
要修改一整个句子使用命令"cis".
用"das"
"R"命令会让Vim进入replace模式.直到你键入<Esc>结束该模式1
x 删除当前光标下的字符("dl"的快捷命令)
X 删除当前光标之前的字符("dh"的快捷命令)
D 删除自当前光标至行尾的内容("d$"的快捷命令)
dw 删除自当前光标至下一个word的开头
db 删除自当前光标至前一个word的开始
diw 删除当前光标所在的word(不包括空白字符)
daw 删除当前光标所在的word(包括空白字符)
dG 删除当前行至文件尾的内容
dgg 删除当前行至文件头的内容
~ 改变当前光标下字符的大小写, 并将光标移至下一个字符. 这不是一个操作符命令(除非你设置了°tildeop° 1选项), 所以你不能让它与一个位移命令搭配使用. 但它可
以在Visual模式下改变所有被选中的文本的大小写.
I 将光标置于当前行第一个非空白字符处并进入Insert模式
A 当光标置于当前行尾并进入Insert模式
set autoindent
filetype plugin indent on
:map <F5> i{<Esc>ea}<Esc>
:map \p i(<Esc>ea)<Esc>
:map \c i{<Esc>ea}<Esc>
:filetype plugin on
:set nowrap
:set sidescroll=10
:set whichwrap=b,s,<,>
:set whichwrap=b,s,<,>,[,]
:set listchars=tab:>-,trail:-
:set iskeyword+=-
:set iskeyword-=_
:set iskeyword
:syntax enable
setenv TERM xterm-color
:set filetype=fortran
:set background=dark
:set background=light
:colorscheme evening
:syntax clear
:hide edit foo.txt
vim one.c two.c three.c
:next
:previous
:wnext
:args
:last
:first
:set autowrite
:set noautowrite
:args five.c six.c seven.h
使用CTRL-^ 两个文件间快速切换
`" 上次你离开该文件时光标所在的位置
`. 最后一次对文件做出改动处
50%mF
`B
:set backup
:set backupext=.bak
:set patchmode=.orig
"fyas
"l3Y
CTRL-Vjjww"by
"fp
"wdaw
:write >> logfile
vim -R file
:split
:close
:new
CTRL-W +
CTRL-W -
":vnew"
CTRL-W h 到左边的窗口
CTRL-W j 到下面的窗口
CTRL-W k 到上面的窗口
CTRL-W l 到右边的窗口
CTRL-W t 到顶部窗口
CTRL-W b 到底部窗口
:qall
:wall
vim -o one.txt two.txt three.txt
:vertical all
要找到两个文件的不同之处 ]c [c
do
:tabedit thatfile
tab help gt
qa 开始将后续的命令记入寄存器a
^ 将光标移动到行首
i\#include "<Esc> 在该行之前插入#include "
$ 移动到行尾
a"<Esc> 在行尾加上"字符
j 移到下一行
q 停止记录
现
3@a
"@@"
寄存器补救:错误命令
"aY
"AY
:[range]substitute/from/to/[flags]
1,3s/Include/include/
:%s/Professor/Teacher/c
":s"将只作用于当前行
:54s/President/Fool/
:.write otherfile
:.,$s/yes/no/
?背景?,/背景/s/"/'/g
/Chapter/-1
/Chapter/+2
:.+3,$-5
'a,'bs/'/"/g 使用标记
在Visual模式下选定了文本后按下了":"
‘<和‘>实际上就是标记, 分别代表一个Visual选择区域的开始和结束. 退出Visual模式后这两个标记仍然保持。
按下"5:"
:[range]global/{pattern}/{command}
:g+//+s/foobar/barfoo/g
Visual block模式下的"c"命令
"C"命令会删除文本块最左边至每一行末尾的所有内容
~ 交换大小写(a -> A, A -> a)
U 将小写变大写(a -> A, A -> A)
u 将大写变小写(a -> a, A -> a)
文本块后按下"rx"命令
左右移动">"命令"<"命令使文本块向左移动一个"shift 单位".
"J"命令使文本块纵跨的所有文本行被连接为一行,如果你想保留那些前导空白和后辍空白, 用"gJ"命令来代替"J"
读写部分文件
:$r patch
:.,$write tempo
:.write >>collection
:set textwidth=72
gqap
gggqG
命令"gqj"会格式化当前行和它下面的一行.接下来你可以使用"."命令来重复刚才的操作, 直到你格式化到满意为止
"gU"命令可担此任
guw"gugu" "g~g~" "g~~
"!{motion}{program}"
!5Gsort<Enter>
"!!"命令过滤当前行的内容."!!date<Enter>"
"!!date"是替换当前行的内容, 而":read !date"则是将输出结果插入到文件中
:write !wc
如果你在编辑一个没有指定文件名的缓冲区时死机了,vim -r ""
:%s/\<four\>/4/g
替换多个文件中的目标,用宏记录和回放功能qq
:%s/\<GetResp\>/GetAnswer/g
:wnext
q
@q
:%s/\<GetResp\>/GetAnswer/ge
:%s/\([^,]*\), \(.*\)/\2 \1/
%s/\([^=]*\)=\([^=]*\)/\2=\1/g
反转行序:g/^/m 0
:‘t+1,.g/^/m ’t
:10,20g/^/m9
统计字数g CTRL-G
使用Visual模式, 选择要统计的部分. 然后用"g CTRL-G".
查找帮助页K
消除多余空格:%s/\s\+$//
以一个空格和一个制表符作为要搜索的目标/
vim \VimBacktick{}grep -l frame_counter *.c\VimBacktick{}
ctags:
$ ctags –R *
$ vi –t tag
、:ts
、:tp
、:tn (
Ctrl + ] 到函数定义或声明 [ + tab
Ctrl + T 返回
gd 转到当前光标所指的局部变量的定义,gf打开头文件
11、{ 转到上一个空行
12、} 转到下一个空行
加速冒号命令
CTRL-B 或<Home>
CTRL-E 或<End>
<S-Left> 或<C-Left> 向左一个单词
<S-Right> 或<C-Right> 向右一个单词
要删除光标之前的整个单词, 命令是CTRL-W.
CTRL-U则删除光标之前的所有已键入的内容
插入键<Insert>可以切换是插入字符还是改写两种编辑模式
按下CTRL-C或<Esc> 可以放弃所有已经键入的命令
:se ai
命令行补齐 :edit b<Tab>
一个<Tab>补全
CTRL-P可以反序遍历整个列表
列出所有匹配用CTRL-D.
:se<Up>
q:
CTRL-Z
{执行任何shell命令}
fg
:!ls
:!dir
:shell
记住编辑信息:
:set viminfo=’1000,f1,<500
让VIM共享viminfo
:wviminfo! ~/tmp/viminfo
:rviminfo! ~/tmp/viminfo
会话
:mksession vimbook.vim
:source vimbook.vim
vim -S vimbook.vim
:set sessionoptions+=resize
:wall
:mksession! ~/.vim/secret.vim
:source ~/.vim/boring.vim
:edit .
" o : 为文件或目录打开一个新的窗口~
" O : 在前一个被访问过的窗口中打开指定的文件/目录
" p : 预览文件/目录~
" i : 切换大小/日期的列表显示~
" s : 选择一个排序键r : 逆向排序~
" - : 进入父目录c : 进入目录
" R : 文件重命名D : 删除文件
#include "inits.h"
gf
:set path+=./proto
要在另一窗口中打开指定的文件的话, 可以以"CTRL-W f" 替代"gf"命
令, 或者用":sfind"命令来替代":find"命令
:hide edit two.txt
:buffers
:ls
:buffer 2
:sbuffer 3
:bnext 跳转到下一个缓冲区
:bprevious 跳转到前一个缓冲区
:bfirst 跳转到第一个缓冲区
:blast 跳转到最后一个缓冲区
:bdelete 3
:set fileformats=unix,dos
unix <LF>
dos <CR><LF>
mac <CR>
:edit ++ff=unix file.txt
ftp://ftp.vim.org/pub/vim/README
gf
vim -x -n file.txt
:set key=
:setlocal noswapfile
vim -b datafile
:set display=uhex
"ga"命令可以来查明当前光标下字符的本来面目
直接编辑一个压缩文件
纠错 CTRL-W
:set showmatch
:set matchtime=15
自动补全CTRL-P, 使用CTRL-N可以往前查找word来补全.
补全文件名CTRL-X CTRL-F CTRL-N
CTRL-X CTRL-] tags
从其它行复制CTRL-Y
CTRL-R fregisterg, 在Insert模式下:"vyiw
iab cc CodeConverter
:iabbrev JB Jack Benny
:iabbrev #b /****************************************
:iabbrev #e <Space>****************************************/
更正打字错误 :abbreviate teh the
:abbreviations 列出已定义的缩写
:unabbreviate @f
:abclear
":unabbreviate"和":abclear"也有几种变体专用于Insert模式(":iunabbeviate"和":ia命令行模式(":cunabbreviate"和":cabclear").
c 命令行模式:cabbrev
! 同时适用于Insert模式和命令行模式:abbreviate
键入特殊字符
CTRL-V <Esc>
CTRL-V 127
CTRL-V 009.
CTRL-V x7f
CTRL-V o123
CTRL-V u1234
CTRL-V U12345678
连体字
:digraphs
Insert mode
CTRL-K E-
:digraph a" |d
使用CTRL-O {command}你可以在Insert模式下执行任何一个Normal模式下的命令
CTRL-O D
断行
:set textwidth=30
v4jgq
gqap
gggqG
对齐文本
:{range}center [width]
:1,5center 40
:1,5right 37
:{range}left [margin]
:1left 5
:2,5left
:runtime macros/justify.vim
:%!fmt
:set autoindent
增加缩进
"4>>"
set ts=4 et
:set tabstop=3
:retab 8
合并多行文本
:g/./,/^$/join
:g/S/,/^s*$/join
编辑表格
set virtualedit=all
"gv"命令再次选定同一文本
数字的加减时,CTRL-A
3 CTRL-A
:set nrformats-=octal
CTRL-X以类似的方式做减法操作.
:args *.c
:argdo %s/\<x_cnt\>/x_counter/ge | update
%s/-person-/Jones/g
write tempfile
quit
for file in *.txt; do
vim -e -s $file < change.vim
lpr -r tempfile
done
ls | vim -
producer | vim -S change.vim -
执行Normal模式 vim -s script file.txt ...
:set ignorecase
:set ignorecase smartcase
\Cword word
\CWord Word
\cword word, Word, WORD, WoRd, etc.
\cWord word, Word, WORD, WoRd, etc.\Cword word
\CWord Word
\cword word, Word, WORD, WoRd, etc.
\cWord word, Word, WORD, WoRd, etc.
:set ruler
:set nowrapscan
/default/2
/const/e
?const?e-2
/\(ab\)*
/ab\{3,5}
/ab\{-1,3}
/a.\{-}b
/one\|two\|three
/\(foo\|bar\)\+
/[0123456789abcdef]
/[0-9a-f]
[] 中 e \t \r \b
/"[^"]*"
预定义字符集
\d 数字[0-9]
\D 非数字[^0-9]
\x 十六进制数[0-9a-fA-F]
\X 非十六进制数[^0-9a-fA-F]
\s 空白字符[ ] (<Tab> 和<Space>)
\S 非空白字符[^ ] (除<Tab> 和<Space>之外)
\l 小写字母[a-z]
\L 非小写字母[^a-z]
\u 大写字母[A-Z]
\U 非大写字母[^A-Z]
文件名的字符串/\f\+
/the\nword
/the\_sword
/the\_s\+word
/[0-9][A-Z]\{3}[0-9]\{3}
手工折行
zfap
zo
zf 创建折行
zo 打开折行
zc 关闭折叠
zr
zm
zR
zM
:set foldopen=all
:set foldopen&
ctags
":tags"
:tag
CTRL-T可以带一个命令记数
:stag tagname
CTRL-W ]
:set tags=./tags,./../tags,./*/tags
:set tags=~/proj/**/tags
:tnext
:tselect tagname
:tfirst
:[count]tprevious
:[count]tnext
:tlast
:tselect /^write_
<Tab
:ptag write_char
:pedit defs.h
:psearch popen
在程序中移动按下%
[#
]#
[{
]}
"[("和"])
"[/
"]/"
[I
:checkpath
:set path+=/usr/local/X11
:set path+=/projects/invent/**/include
[<Tab> "[ CTRL-I"
3[<Tab>
[D
gD
gd
!make
:cnext
:cprevious
:cfirst 到第一个错误处
:clast 到最后一个错误处
:cc 3 到第3个错误处
:set makeprg=nmake
:set makeprg=nmake -f project.mak
:set cindent shiftwidth=4
==
=a{
gg=G
:filetype indent on
">>"和"<<" 命令来向右/左2. "
这为fg内的所有行增加一个缩进单位4. ">af"命令则包括了f 与g所
在的行本身
:set expandtab
:%retab
:%retab!
:set noexpandtab
:%retab!
gq]/
gq
:set comments=s1:/*,mb:*,ex:*/
:undolist
:earlier 10s
:later 1m
:undo 2
:map <F2> GoDate: <Esc>:read !date<CR>kJ
:imap <F2> <CR>Date: <Esc>:read !date<CR>kJ
:map Normal, Visual and Operator-pending
:vmap Visual
:nmap Normal
:omap Operator-pending
:map! Insert and Command-line
:imap Insert
:cmap Command-line
:omap <F7> a{
d<F7>可以删除一个C语言的程序
块(包括在花括号fg中的文本内容). 而y<F7>又可以yank这样一个程序块
到无名寄存器中.
:map <F2> G<F3>
:imap <F2> <Esc><F3>
:map <F3> oDate: <Esc>:read !date<CR>kJ
:map Q gq
:map ,, :s/5.1/5.2/<CR>:wnext<CR>,,
删除一个映射
:unmap Normal, Visual and Operator-pending
:vunmap Visual
:nunmap Normal
:ounmap Operator-pending
:unmap! Insert and Command-line
:iunmap Insert
:cunmap Command-line
:map <C-A> /---><CR>
:vunmap <C-A>
注意"<C-A>"代表的是单个的按键CTRL-A.
:command -nargs=+ Say :echo "<args>"
:function DateInsert()
: $delete
: read !date
:endfunction
:autocmd FileWritePre * call DateInsert()
:autocmd
shell 命令及求助系统
shell 命令
:!外部指令 执行外部指令。当然您的指令要在 $PATH 环境变量内。
:!! 执行前一次执行之外部指令。在这里的 ! 可不是强迫中止喔!
@: 这是 Vim 的一个很特殊的指令,可以重复前一次的冒号命令。
:sh(ell) 执行 shell。使用 exit 回到 vim。
这在 Vim GUI 会在原窗口内显示执行结果,在 elvis GUI 则会另开一 xterm 窗口。console 或 xterm 下的 vim 当然就是跳出 vim 进入 shell 中。至于是用哪一种 shell 是可以另外设定的,可由 :set shell= 来设定。
另外,在此补充一下补全的功能。不是只有 Tab 键的补全功能喔!也可以使用上下方向键,叫出历史指令,叫出历史指令可用于冒号命令及寻找命令(/)。例如,您前已下了 :!ps aux 这个指令,您可以按 : 后就直接按向上方向键。别忘了!寻找指令也是可以这样用喔!
:r !commond 这个就妙了!会在光标所在处次一行插入外部指令 commond 执行后的输出内容。
例如 :r !date 就会插入日期时间。这在 elvis 是会插入在游标所在处那一行。
:n,mw !commond 以 n 至 m 行内之数据,当做外部指令 commond 的 input。这算是相当高级的用法了,初学者大概还用不上,不过印H中留有一个这样的功能,以后总是会用得上的。
K 大写 K 会显示光标所在处之 word 的 man page 系统在线使用手册。
求助系统
原始 vi 是没有 on-line help 的,但 Vim 及 elvis 则有相当丰富的说明系统。Vim 沿用传统 tag 的方式来找主题,而 elvis 就高明了,是使用 HTML 的格式。原来 elvis 是可以直接阅读 HTML 档的,当然不能显示图文件,但会标明图档的名称。
用过 pe2(3) 吗?好像 F1 是救助键已让大家公认。Vim 预设按 F1 就会叫出说明档。elvis 当然没有,不过您可以自行设定,在 /.elvislib/elvis.rc 中加上
map #1 :help^M
就可以了。须注意的是 ^M 是按 Ctrl+v 后不放再按 M 或 Enter 键,表示马上执行。ㄟ,^M 是特殊字符,是一个字符,而不是两个字符,您移动光标在 ^M 上就知道了,不是我文中的,文中的是直接打出来的两字符 ^M。在 console 下要打特殊字符的话,要 Ctrl+Shift+v 然后按您要的键。
:h name 这样就会叫出 name 这个说明档,如果后面没接 name, 则会叫出 help.txt 这个总说明档(在 evlis 是 elvis.html) h 是 help 的缩写。ㄟ,name 记不清楚时,别忘了 Tab 补全。 在 Vim 的说明档中,遇有两个 |围住的主题,把光标移到上面 就可以使用 Ctrl+] 来叫出这个主题的说明,Ctrl+t 可以回到原来的地方。elvis 中也是可以这样用。:q 可结束说明档,回到原编辑档案。
:ver 会显示版本、编译信息,编译时加入之参数也会显示出来, 让您知道有加入些什么功能,因为有些功能在编译时就得加入。 其中正号 + 表示有此功能,减号 -表示无此功能。elvis/nvi 只能显示版本信息,无法显示编译信息。8.1
在此补充说明一点,各位有没有觉得 :q 很常用到,好了!就依 pe2 的习惯设为 F4 吧!怎么设?找上面叫出说明档怎么设,您就依样画葫芦就可以了!Vim 的设定档在 /.vimrc。个人是直接设成 :q! 以免麻烦,但要记得存盘喔!
vim高效使用总结(转)
之于我, vi即禅.
用vi如修禅,
vi命令如禅之心印.
用者不可窥其堂奥,
门外汉视其晦涩如天书.
常用之, 实可知其道.
高效移动 珍爱生命, 远离插入模式
一般情况下, 你应该尽量少把时间花在插入模式, 因为在这种模式下vi和其它sb编辑器区别不大. 这也是大部
分vim新手把大部分时间花在插入模式的原因 -- 插入模式很易用. 但是vim真正的优势在命令模式. 你会发现越了
解vim, 你花在插入模式的时间越少.
使用h,j,k, l
高效率用vim编辑的第一步是绝了你用方向键(上下左右)的念头. vim设计出"模式"操作方式的一大优势就是
可以让你不需要老是把手从方向键和字母键之间移来移去. 当你在命令模式下, 用字母h, j, k, l对应方向左, 下,
上, 右. 这个需要练习一下才能习惯, 但是你会发现一旦你习惯了它们, 比用方向键快多了. (译注: 这几个移动键
一定要动手试, 然后反复用, 靠记忆忒艰难了)
在你编辑电子邮件或其他段落式文本的时候, 你可能注意到移动方向跳的行数比你料想的多. 这是因为你的段
落对vim来说在很长的同一个行里. 用h, j, k, l移动前输入g可以让移动相对于屏幕看上去的行数而不是vim内部的
行数.
用motion在当前行移动
(译注: 没想到特别合适的词翻译motion, 可以理解为"高级移动", 另请注意, motion仅在当前行移动)
大部分编辑器只有简单的光标移动功能(上下左右, 行首行尾等等). vim有非常高级的光标移动命令, 这些命令
叫做Motion. 当用motion把光标从文本中的一个点移动到另一个点的时候, 两点间的文本(包括两个点本身)被
motion"掠过". (这个概念在接下来的教程中非常重要.) (译注: 举例说明一下"掠过"概念, 比如你有一行文本, 内容
是abcdefg, 当前光标在c上, 如果你用motion $, 光标移动到了g上, 那么从c到g这段文本就被motion $"掠过"了).
以下是一些有用的motion:
fx | 在当前行向前移动光标到下一个字符x (很明显, x可以是任意你想要移动到的字符). 这是一个超级有用的命令. 你可以输入;来重复前一个f命令. |
tx | 和上面的命令基本相同, 除了移动光标到字符x之前而不是x字符本身. (这个真的很有用) |
Fx | 在当前行向后移动光标到上一个字符x. |
w | 将光标向前移动一个词. |
b | 将光标向后移动一个词. |
0 | 将光标移动到当前行首. |
^ | 将光标移动到当前行的第一个字符. (译注: 第一个字符可能不是行首, 比如行首有space, tab等不可见符号, 0会把光标停在这些符号之前, 而^会把光jk标停在这些符号之后的第一个可见字符.) |
$ | 将光标移动到当前行尾. |
) | 将光标移动到下一个句子. (写电子邮件或者文本文档的时候很有用.) |
( | 将光标移动到上一个句子. |
在文件中高效移动
vim有很多命令可以让你在文件中任意移动光标 -- 很少需要手工一页一页滚动. 以下按键技术上说不算motion,
因为它们是在文件中移动, 而不是在某一特定的行.在文件中高效移动
<C-F> | 将光标向前(下)移动一页(屏幕). |
<C-B> | 将光标向后(上)移动一页. |
G | 移动到文件尾 |
numG | 将光标移动到某一行. (例如, 10G是把光标移动到第10行.) |
gg | 将光标移动到文件开头 |
H | 将光标移动到当前页的第一行. |
M | 将光标移动到当前页的中间一行. |
L | 将光标移动到当前页的最后一行. (译注: 有了HML3个命令, 可以把鼠标撇了, 爽) |
* | 读取光标下的字串, 然后移动到当前文件中下一次出现该字串的位置. (比如说如果你的光标所在的位置的字串为"bob,", 按了*之后, 光标将移动文件中下一个"bob"出现的位置.) |
# | 和*命令基本相同, 除了它移动到上一次出现字串的位置. |
/text | 从当前光标位置开始, 查找下一个含有text的字串并且移动到那里. 需要按回车(Enter)键来执行查找. 如果要重复执行查找, 输入n(n代表next occurance). (译注: text指你想搜索的字串, 比如你要在文件查找字串"abc", 就输入/abc然后回车) |
?text | 和/text相似, 区别是?text进行反向查找(查找上一个字串). |
ma | 给当前光标所在位置设置一个名字为a的书签. 书签的名字可以是任何小写字母. 你看不到书签, 但它确实在. |
`a | 移动光标到书签a. 注意`不是单引号, 大部分键盘上它在数字1的左面. (译注: 本人使用的vim 7.1 windows版本用单引号也能完成同样功能) |
`. | 移动到你之前编辑过的行. 这个又是"真有用". 如果你需要在文件中"滚来滚去"查看一些东西, 你可以用这个命令回到你之前编辑的行尽管你没把它设成书签. |
高效输入 使用关键字自动完成(补全)
vim 有个非常好的关键字自动完成系统. 就是说你可以只输入很长的词的一部分, 按一个键, vim帮你把这个词自
动补全. 比如说在你的代码中有一个变量叫iAmALongAndAwkwardVarName, 你可能不愿意每次用这个变量都把
整个词打一遍, 这时候就可以用自动完成功能.高效输入
使用关键字自动完成(补全)
要使用关键字自动完成, 只要输入一个字串的前几个字母 (比如 iAmAL) 然后按 <C-N> (按住Ctrl然后按N>)
或者<C-P>. 如果vim没有选择你需要的字串, 继续按<C-N>或<C-P> -- vim会遍历所有和你输入的前几个字母匹
配的字串.
用点脑子开始插入模式
大部分新用户输入i来进入插入模式. 这种方法有时候相当低效, vi有一堆可以高效进入插入模式的命令. 这里
是最常用的一些:
i | 在当前字符的左侧开始插入. |
I | 在当前行行首开始插入. |
a | 在当前字符的右侧开始插入. |
A | 在当前行行尾开始插入. |
o | 在当前行的下一行开始新的一行并在那插入. (译注, 写code用这个很爽) |
O | 在当前行的上一行开始新的一行并在那插入. |
c{motion} | 删除(change)motion"掠过"的文本然后插入新文本代替它. 比如说, c$会删除当前光标位置到当前行尾的文本并开始插入模式. ct!会删除当前光标位置到下一个!出现位置(不包括!本身)之间的文本并进入插入模式. 删除的文本会被复制到剪切板可以被粘贴使用. (译注: 可以到前面复习一下"掠过"的概念, 参考例子. 输入c{motion}命令的时候, 不需要输入花括号) |
d{motion} | 删除motion"掠过"的文本 -- 和c{motion}相似, 但是不进入插入模式. |
高效移动成块的的文本用可视化选择, 用合适的选中模式
和最早的vi不同, vim可以让你把文本置为高亮然后对高亮的文本操作. 以下是主要的3个可视化选中模式 (即
文本高亮模式).高效移动成块的的文本用可视化选择, 用合适的选中模式
v | 字符选中模式. 大部分人习惯用这个, 所以玩其他模式之前先把这个练熟. |
V | 行选中模式. 选中整行. 当你需要复制或移动几行的时候, 这个比字符选中模式要好. |
<C-V> | 块选中模式. 超级nb而且很少有其他的编辑器支持(译注: 还是有一些支持的, 比如ultraedit, 但是得付钱...). 你可以在任何文本中选择一个矩形块来操作. (译注: 在windows版本的vim中<C-V>默认被映射为粘贴, 可以通过更改键盘映射或者使用<C-Q>来进行块操作) |
在可视化选中模式下进行剪切和复制
所有常用的光标移动键都可以在可视模式使用, 比如vwww会进入字符选
中模式并且选中光标之后的3个词. Vjj将会进入行选中模式并且选中当前行及之后的两行.
一旦你有了高亮选择, 你可能想要干点啥. 以下是对选中的高亮文本最有用的命令:
d | 剪切(删除)高亮选中的文本到剪切板. (译注: 据本人所知, vim所有的删除其实都是剪切) |
y | 复制 (或者说"拽"(yank), vim用"拽"来表示复制...)高亮选中的文本到剪切板. |
c | 剪切高亮选中的文本到剪切板. 和d很相似, 只是c会进入插入模式. |
在非可视化选择模式进行剪切和复制
如果你确知你想要复制或者剪切什么, 你可以不进入可视化选择模式就完成这些操作. 这样速度更快.
d{motion} | 把由motion"掠过"的文本剪切到剪切板. 比如dw把当前光标开始的一个词剪切到剪切板, 而dfS把从当前行从光标是到下一个S之间的文本剪切到剪切板. |
y{motion} | 把motion"掠过"的文本复制到剪切板. |
c{motion} | 把motion"掠过"的文本剪切到剪切板并且进入插入模式. |
dd | 剪切当前行到剪切板. |
yy | 复制当前行到剪切板. |
cc | 剪切当前行到剪切板并且进入插入模式. |
D | 剪切光标当前位置到行尾的文本到剪切板. |
Y | 复制整行到剪切板, 和yy相似. (yes, 这个命令和命令D的操作方式没保持一致, 你可以用y$完成类似D的操作) |
C | 剪切光标当前位置到行尾的文本到剪切板并进入插入模式. |
x | 剪切当前字符. (类似于命令模式的退格(backspace)键) |
s | 剪切当前字符并进入插入模式. |
粘贴
粘贴很简单. 把光标移动到你想要粘贴的位置输入p. (译注: 粘贴操作需要在命令模式下, 另外P(大写)命令把剪切
板的内容粘贴到光标当前位置之前, 对用惯其它编辑器的人来说, P命令可能更符合习惯)
使用多个剪切板
大部分编辑器只有一个剪切板. (译注: 貌似不算太'大部分') vim有多个. 在vim里剪切板叫做寄存器
(regiseter). 你可以输入:reg列出所有当前定义过的寄存器和它们的内容. 大多数情况下你会使用以小写字母命
名寄存器, 其他的有各自不同的vim内部用途, 偶尔可能会有用.
要使用指定的某个寄存器来完成复制和粘贴, 很简单, 在复制粘贴操作之前输入"a, a表示你希望用的寄存器.
举个例子, 复制当前行到寄存器k, 输入"kyy. (也可以用V"ky. 想想为啥这个也成). 那一行就会被存放在寄存
器k里, 直到有其他的东西被复制到到寄存器k覆盖它. 复制之后可以用"kp来把寄存器k里存放的内容粘贴到到文
本中.
不干机械劳动 给你惊喜的.命令
在vi中, 输入.(英文的句号)可以重复上一个你执行过的命令. 比如你上一个命令是dw, 当你输入.命令, vi会删
除下一个词.
使用计数器执行重复操作
计数器是vim最nb的提速功能. 任何命令之前都可以加一个数. 这个数告诉vim你想把命令执行多少次. 例如:
3j会把光标向下移动3行.
10dd会删除10行文本.
y3"在当前行, 把光标当前位置到第三个双引号之间的文本复制到剪切板. 这种计数器用法可以大大扩展motion的
操作范围. (译注: 本人认为y3"不能完成这样的功能, 对应的命令应该是y3f", 可能原作者漏写了f命令, 有空的时
候问问原作者)
录制宏
你可能偶然会发现你对一个文档中的某块文本反反复复的进行相同的操作. vim可以录制一个特定的宏来完
成这些操作.
qregister | 开始录制一个宏并保存在某个有名字的寄存器. 比如qa开始录制一个宏并把这个宏存放在寄存器a中. |
q | 结束录制 |
@register | 回放存放在某个寄存器的宏. 比如@a播放寄存器a中的宏. |
用vim写程序代码
请注意宏只是记录你的按键并且回放; 不是神奇的魔法. 因为在vim中可以用多个命令执行
某个任务, 录制宏几乎成了一种艺术形式, 你必须非常小心的选择要用的命令才能用宏达到你想要的效果.
vim是优秀的源代码编辑器, 有很多的功能是专门为写程序设计的. 这里是一些常用的:
]p | 和p相似, 但是它可以自动调整粘贴的代码和已有的代码缩进. 试试吧. |
% | 把光标放在某个花括号{}, 中括号[]或者圆括号()上, 按%会把光标移动到与之对应的花括号, 中括号或者圆括号上. 对于修正多层嵌套逻辑代码块的括号解析问题来说, 这个功能堪称救人于水火之中. |
>> | 缩进高亮选中的代码. (对高亮选中请查看前面章节, 如果没有文本被高亮选中, 则将当前行缩进) |
<< | 和>>类似, 但是反方向(译注: 缩进是向右移动行, 反方向既向左移动). |
gd | 把光标移动到当前光标所在位置的函数或者变量的定义(definition)(或声明(declaration)). |
K | 打开当前光标所在词对应的手册页(man page). (比如你的光标当前在sleep这个词上, vim会显示sleep的手册页) (译注: 这个功能貌似只对vim的原生OS--unix上有用) |
代码编写功能)英文出处:jmcpherson.org/editing.html(译注: 结合ctags, cscope之类的辅助工具, vim可以提供
更强大的程序
Visual模式选中代码,然后=让它自动调整
=的概念要广泛得多,它只是filter,把选定的内容丢给了一个预定的程序(有equalprg选项可设置)去“过滤”,然后用过滤后的结果替换原来的内容。可以说,格式化只是一个应用而已。
参见 Vim用户手册603.0 30章
vimcdoc.sf.net下载
如果你是在花括号里键入一个语句块, Vim会在语句块的开始进行缩
进, 在语句块以"g" 结束时减小缩进, 因为毕竟Vim无法得知你会在中间
写下什么东西.
使用自动缩进的另一个辅助作用是帮助你发现程序里的错误. 当你键
入一个g符号来结束一个函数的定义时, 如果发现缩量与你的期望有出入
时, 很可能是在函数体中哪里漏掉了一个右花括号g. 可以使用"%"命令
来帮你找到当前的右花括号跟哪一个左花括号相匹配.丢了)和;符号也一样会引起异常的缩进. 所以如果你看到缩进量多
于预期时, 最好检查一下前面的程序段.
如果你正在接手一些缩进格式相当糟糕的代码, 或者要在已有的
代码里增删修补时. 或许你会想重新对这些代码的缩进进行整理. 使
用"="操作符命令, 最简单的形式是:
normal mode command
==这个简单的命令会重新为当前行进行适当的缩进. 与其它的操作符
命令一样, 它有三种命令形式. 在Visual模式下"="命令为被选择的行设
定缩进. 对于可用的文件对象, "af" 是有最用的--它选择的对象是当前
的fg程序块.
所以下面的命令会为当前的代码块重新设定缩进:
normal mode command
=a{
如果手头的代码实在是糟糕透顶, 你也可以用下面的命令重新为整个
文件进行缩进:
normal mode command
gg=G
不过, 对于用手工精心打造出来的缩进格式可不要轻易这么做, 虽
然Vim的自动缩进功能不错, 不过人们总是有自己的偏好.
设置缩进风格
不同的人喜欢不同风格的缩进, Vim对缩进风格的设置对90%的程序
来说正是他们所喜欢的. 不过, 还是应该允许不同的风格存在, 你可以
在°cinoptions°选项里定义自己的缩进风格.默认情况下°cinoptions°选项的值是一个空字串, Vim会使用默认的
风格. 如果你希望有改变某些情况下的缩进风格. 比如, 让花括号的缩进
看起来象下面这样:
code
if (flag)
{
i = 8;
j = 0;
}
可以使用下面的命令:
ex command
:set cinoptions+={2
还可以设置很多这样的在特定情形下的缩进风格, 请参考jcinoptions-valuej.
vim 每日一看
http://hi.baidu.com/xiyanxiyan_10/item/278fb83229b2e2d41a969607
vi的基本概念
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
1) 命令行模式command mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
2) 插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
3) 底行模式(last line mode)
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
2、vi的基本操作
a) 进入vi
在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
$ vi myfile
不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!
b) 切换至插入模式(Insert mode)编辑文件
在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
c) Insert 的切换
您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。
d) 退出vi及保存文件
在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:
: w filename (输入 「w filename」将文章以指定的文件名filename保存)
: wq (输入「wq」,存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)
3、命令行模式(command mode)功能键
1). 插入模式
按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;
按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
2). 从插入模式切换为命令行模式
按「ESC」键。
3). 移动光标
vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
按「ctrl」+「b」:屏幕往“后”移动一页。
按「ctrl」+「f」:屏幕往“前”移动一页。
按「ctrl」+「u」:屏幕往“后”移动半页。
按「ctrl」+「d」:屏幕往“前”移动半页。
按数字「0」:移到文章的开头。
按「G」:移动到文章的最后。
按「$」:移动到光标所在行的“行尾”。
按「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l。
4). 删除文字
「x」:每按一次,删除光标所在位置的“后面”一个字符。
「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。
「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。
「dd」:删除光标所在行。
「#dd」:从光标所在行开始删除#行
5). 复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
6). 替换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
7). 回复上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
8). 更改
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字
9). 跳至指定的行
「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。
4、Last line mode下命令简介
在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。
A) 列出行号
「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。
B) 跳到文件中的某一行
「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
C) 查找字符
「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
D) 保存文件
「w」:在冒号输入字母「w」就可以将文件保存起来。
E) 离开vi
「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。
「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
5、vi命令列表
1、下表列出命令模式下的一些键的功能:
h
左移光标一个字符
l
右移光标一个字符
k
光标上移一行
j
光标下移一行
^
光标移动至行首
0
数字“0”,光标移至文章的开头
G
光标移至文章的最后
$
光标移动至行尾
Ctrl+f
向前翻屏
Ctrl+b
向后翻屏
Ctrl+d
向前翻半屏
Ctrl+u
向后翻半屏
i
在光标位置前插入字符
a
在光标所在位置的后一个字符开始增加
o
插入新的一行,从行首开始输入
ESC
从输入状态退至命令状态
x
删除光标后面的字符
#x
删除光标后的#个字符
X
(大写X),删除光标前面的字符
#X
删除光标前面的#个字符
dd
删除光标所在的行
#dd
删除从光标所在行数的#行
yw
复制光标所在位置的一个字
#yw
复制光标所在位置的#个字
yy
复制光标所在位置的一行
#yy
复制从光标所在行数的#行
p
粘贴
u
取消操作
cw
更改光标所在位置的一个字
#cw
更改光标所在位置的#个字
2、下表列出行命令模式下的一些指令
w filename
储存正在编辑的文件为filename
wq filename
储存正在编辑的文件为filename,并退出vi
q!
放弃所有修改,退出vi
set nu
显示行号
/或?
查找,在/后输入要查找的内容
n
与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。
对于第一次用vi,有几点注意要提醒一下:
1、用vi打开文件,是处于「命令行模式(command
转)vim 使用技巧
先稍为介绍一下 vim. vi 是 unix/linux 下极为普遍的一种文本编辑器, 大部分机器上都
有. vi 有各种变种, 在不同的机器上常用不同的变种软件. 其中 vim 比较好用也用得比较
广泛. vim 是 Vi IMproved 的缩写, 表示更好的 vi. 我个人觉得它是非常好的编辑器(为
了避免 Emacs 粉丝挑眼, 就不说最好了). 没用过的也建议试试看, 当然 vim 对编写文本
文件很方便好用, 比如编写程序, html文档等等, 却不能用来编写 word 文档.
关于 vim 的安装, 基本使用方法等网络上能搜出许多, 就不在这里罗嗦了, 要是对 vim 有
兴趣, 那就看看这里(中文文档):http://vcd.gro.clinux.org/
本文就说些其中比较有用, 比较常用的命令, 若能熟练运用这些命令, 那么会发现编辑文件
很舒服.
说明:
以下的例子中 xxx 表示在命令模式下输入 xxx 并回车
以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车
小括号中的命令表示相关命令.
在编辑模式或可视模式下输入的命令会另外注明.
1. 查找
/xxx(?xxx) 表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
向上查找.其中xxx可以是正规表达式,关于正规式就不多说了.
一般来说是区分大小写的, 要想不区分大小写, 那得先输入
:set ignorecase
查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
*(#) 当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
向查找.
g*(g#) 此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
是匹配包含该单词的所有字符串. ( eg: *搜索resp不会匹配respFrom变量,用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/\/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/^\s*$/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 来替换文字, 也可以进行命令的宏定义. 有些命令输起来很费劲,
因此我把它们定义到 - 上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.
:nmap :nohls 取消被搜索字串的高亮
:nmap w 命令模式下转移光标到不同窗口
:imap 输入模式下运行
:nmap :%s= *$== 删除所有行尾多余的空格.
:imap 同上
:java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
会说到如何实现这一点)
:nmap :comp javac:mak -d . %
此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定
义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
setlocal makeprg=javac
setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
:nmap :comp ant:mak
此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装
vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用. 但是需要
在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
:nmap :cl 此命令用于查看所有的编译错误.
:imap
:nmap :cc 此命令用于查看当前的编译错误.
:imap
:nmap :cn 此命令用于跳到下一个出错位置.
:imap
:nmap :cp 此命令用于跳到上一个出错位置.
:imap
:nmap :JavaBrowser
此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.
在这个窗口中输入 ? 会看到帮助. 嘿嘿, 很好用, 不过需要 ctags 支持.
:imap
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 你可以发现很多脚本(scrīpt), 这些脚本常常有让你意想不到的作用.
我常用的有:
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, 会按照你的
颜色配置来转
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。
tips:
用*匹配字符串搜索
之后在末行搜索 //* 会自动替换为
/\<匹配的字符串\>
用g*号匹配字符串搜索
之后在末行搜索 //* 会自动替换为
/匹配的字符串
这也印证了*和g*的搜索方式的不同,*是整个匹配的搜索 g*是字符串部分匹配的搜索