*
和 #
对对当前光标所在的单词进行搜索(, {, [)
K
查看man手册:Man xxx
在新窗口中查看man手册ga
查看ascii值g CTRL-G
统计字数,使用Visual模式选取统计部分q:
打开历史记录窗口:marks
打开编辑标记窗口, `0
准确回到上一次退出vim的位置gf
打开光标下的指定文件, CTRL-W f
在新窗口中打开:set fileformat=unix
:set textwidth=70
gq
如: gqap
格式化一段, gggqG
格式化整个文档>>/<<
:set virtualedit=all
, 退出 :set virtualedit=
。特别适用于表格编辑gv
再次选定上次选择的Visual区域CTRL-A
, CTRL-X
对数字加/减ls | vim -
从标准输入读取要编辑的内容\c, \C
忽略/不忽略大小写匹配/
重复前一次搜索zM
关闭所有折行, zR
打开所有折行, zo, zc
打开,关闭某个折行"xy
复制到x缓冲区, "xp
粘贴x缓冲区, "+y
复制到系统剪贴板, "+p
从系统剪切板粘贴:20,100s/bc/a&d/g
Note
&
是一个特殊字符,表示被替换的内容。结果为把bc替换成abcd\&
将&转义:%s/((d+))/=”(”.(submatch(1)+1).”)”/g
Note
作用:
将“(1), ...., (2), ....,(100)”替换成“
(2), ...., (3), ...., (101)”。
即括号里的序号数字都加一。
解释如下:
% 全文(“%”是“1,$”范围的缩写)
s 替换
/ 搜索字符串开始
( 左括号
\( 开始记录匹配
\d+ 一个或多个数字
\) 结束记录匹配
) 右括号
/ 搜索字符串结束
\= 把后面的表达式计算出来作为替换字符串
"(" 左括号
. 字符串连接运算符
(submatch(1)+1) 把第一个匹配的结果加一作为一个整体返回
.")" 添上右括号
/g 替换字符串结束,g表示替换每一行的所有匹配结果。
消除多余空格
:%s/\s\+$// # "\s\+$"位于行尾的一个或多个空白字符
案例:将所有cpp文件中的”aaaa”替换为”bbb”。
vim *.cpp # 启动vim,同时指定了要编辑的文件列表
qa # 开始宏记录
:%s/\<aaa\>/bbb/ge # 在第一个文件中执行替换操作。使用‘e’在没有匹配目标时也不会报错
:wnext # 保存该文件并转到下一个文件进行编辑
q # 停止宏记录
@a # 执行名为a的宏。看看整个过程有没有错
999@a # 对其余文件执行同样操作
案例:
Doe, John ====> John Doe
Smith, Peter Peter Smith
在vim中只需一条命令:
``:%s/\([^,]*\), \(.*\)/\2 \1/`` # 可以使用的反向引用为9个,"\0"特指整个匹配到的内容
将所有行移到第0行后面
:g/^/m 0
将连续行移到某一行的后面
mt # 标记“某一行”
[n]j # 移到“连续行”的最后一行
:`t+1,.g/^/m `t
Note
会话:session
保存当前会话: :wa
后 :mks
:mks filename
产生”filename”脚本文件恢复会话: :so Session.vim
或 vim -S Session.vim
切换会话:
:wall
:mks! ~/.vim/secret.vim
:so ~/.vim/boring.vim
记住编辑信息:viminfo
:wviminfo ~/tmp/test.viminfo
:rviminfo ~/tmp/test.viminfo
视图:view
:mkview 1
或 :mkview ~/.vim/main.vim
:loadview 1
或 :so ~/.vim/main.vim
缓冲区:buffer
显示缓冲区列表: :buffer
或 :ls
, :ls!
:ls
1 h "[未命名]" 第 1 行
2 %a + "Proj/Uliweb/mysite/apps/Notes/files/Ubuntu/vim.rst" 第 145 行
3 #h "Proj/Uliweb/mysite/apps/Notes/files/Ubuntu/imagemagick.rst" 第 23 行
4 h "im" 第 0 行
编辑一个缓冲区:
:buffer 2
:buffer im
:sbuffer 3
# 新窗口遍历缓冲区:
:bnext
下一个缓冲区:bprevious
前一个缓冲区:bfirst
第一个缓冲区:blast
最后一个缓冲区删除缓冲区: :bdelete 3
案例:希望编辑所有包含了”frame_counter”的c文件
vim `grep -1 frame_counter *.c`
或
:grep frame_counter *.c
Note
:next
和 :first
来遍历文件列表:cnext, :cprev, :clist
遍历所有匹配vim -x test.txt
:X
:set key=
vim -b datafile
:set display=uhex
以十六进制格式显示使用xxd程序
vim -b datafile
:%!xxd
补全单词: CTRL-P
, CTRL-N
补全特殊的文档元素:
CTRL-X CTRL-F 文件名
CTRL-X CTRL-L 整行内容
CTRL-X CTRL-D 宏定义(也包括那些在include文件里定义的宏)
CTRL-X CTRL-I 当前文件和被当前文件include的文件
CTRL-X CTRL-K 来自一个字典文件的word
CTRL-X CTRL-T 来自一个thesaurus的word
CTRL-X CTRL-] tags
CTRL-X CTRL-V Vim的命令行
智能补全: CTRL-X CTRL-O
常用在c源码中:w
:iabbrev lyh lyhopq@gmail.com
abbreviate
unabbreviate lyh
abbreviate teh the
:abclear
居中对齐: :{range}center [width]
例: :1,5center 40
左/右对齐: :left/right
左右对齐:
使用宏: :runtime macros/justify.vim
_j
使用外部程序: :%!fmt
案例1:把多个C文件中名为”x_cnt”的变量都改为”X_counter”
:args *.c
:argdo %s/\<x_cnt\>/x_counter/ge | update
Note
args *.c
把所有要改的文件放到参数列表上:argdo
以另一个命令为参数,该命令将对所有待编辑的文件都执行一次|
用来分割两个命令update
在文件有所改变时进行保存:argdo
:windo
对所有窗口执行同样的操作:bufdo
对所有缓冲区进行操作, 这个要小心使用
,最好用 :ls
看一下有哪些缓冲区会被改动案例二:将多个文件中的”-person-“都改为”Jones”其后打印出来
将要执行的vim命令(Ex模式)放入”change.vim”中
%s/-person-/Jones/g
write tempfile
quit
以批处理模式运行vim
for file in \*.txt; do
vim -e -s $file < change.vim # "-e"Ex模式, “-s”告诉vim安静地运行
lpr -r tempfile # 打印"tempfile"的内容,然后删除它("-r")
done
偏移
/default/2
将光标停留在目标行向下的第二行/const/e-1
“e”使光标在找到目标串后以它的结尾作为移动的起始处/const/b+2
“b”目标串开头为起始处//e
重复前一次搜索使用不同的偏移?const?e-2
反向搜索必须以”?”来分割命令的不同部分多次匹配
/ab*
“*”匹配任意个(零个或多个)b/\(ab\)*
“ab”作为整体/ab\+
“+”至少一次/folders\=
“=”一次或零次/ab\{m,n}
匹配至少m次,至多n次/foo\|bar
“|”模式中的或操作字符范围:
/[a-z]
,使用”^”指定补集
预定义字符集
\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]
匹配一个断行:通过前缀”_”来同时包括断行,例: /the\_s\+word
匹配断行或多个空白字符
CTRL-W ]
分割当前窗口并跳转到光标下的tag, :tnext
下一个符合条件的地方, :tselect tagname
列出所有符合条件的地方:tag /xxx
,然后按<Tab>ptag tagname
,关闭窗口 :pclose
, :pedit defs.h
在预览窗口中编辑一个文件, :psearch popen
在预览窗口中显示搜索内容[#,]#
#if
内的移动[[,]]
{}
内的移动[(,])
()
内的移动[/,]/
注释内的移动[I
查找全局标识符,光标放在要查找的标识符上[<tab>
同 [I
,但它跳转到第一个匹配项[D
只查找以”#define”定义的gD
搜索限制在当前文件, gd
当前函数:make {arguments}
:cnext
, :cc
, :clist
, :clist!
, :cprevious
, :cfirst
, :clast
, :cc [n]
:colder
, :cnewer
==
, =a{
, gg=G