杂项
:h XXX
帮助
:X 对文件进行加密
:set key= 取消加密
:abbr 别名,可用来使用简写或放置输入错误,编辑器会自动替换。如:abbr ms microsoft, :abbr corss cross
:!cmd 执行外部命令cmd
:sort 排序
:n,mw filename 将第 n 行到第 m 行 的文字存放的所指定的 filename 里去
:%!xxd ----> 切换到十六进制显示
:%!xxd -r ----> 切回文本方式显示
书签设置
mx 用于设置书签
'x 用于从书签返回;
(其中的x可以为任何字母, 但只能记录当前文件里的书签;退出vim后再次进入将不会保留这些书签)
:set nu 显示行号
编程
c语言风格缩进
:set cindent 打开缩进模式
:set shiftwidth=N 设置缩进量
:set cino=string 设置cindent的选项
:set cino 查看cindent的选项
(相关命令::h shiftwidth’, ‘:h cindent’,:h cinoptions’, :h cinoptions-values’,:h cinkeys’, `:h cinwords’ )
缩进
按v进入visual状态,选择多行,用>或<缩进或缩出
== (连按=两次), 或对多行用n==重新排版。使用gg=G可对整篇代码进行排版。
set smartindent
set tabstop=4
set shiftwidth=4 #用<>进行缩进的空格数
set expandtab
set softtabstop=4
高亮
语法高亮
:syntax on/off
搜索高亮
:hls
匹配高亮
highlight g1 ctermbg=green guibg=green
:match g1 /file/ #表示开头结尾的/也可以用"来代替
:match g1 /file|java/ #匹配多个关键字
:match g1 /file|Java\c/ #不区分大小写
可用 :2match 和 :3match 匹配多组关键字
匹配高亮高级玩法
:highlight MyGroup ctermbg=green guibg=green
:let m = matchadd(“MyGroup”, “TODO”)
:call matchdelete(m)
:echo getmatches()
:call clearmatches()
编译
:make 编译
:set makeprg=string 指定make程序(默认就是’make’)
可设置errorformat选项用于编译出错时vim进行错误位置定位,GCC格式的errorformat设置:%f:%l:%m
:cl 列出错误
:cn 让光标指向下一个错误
:cp 让光标指向上一个错误
:cnew 从头开始
使用Astyle
http://sourceforge.net/projects/astyle/files/
version 2.05 works well so far.
:%! astyle
cscope和ctags
安装很简单,只要将cscope的可执行文件放到PATH环境变量包含的目录中即可。
为了方便地使用cscope,我们还需要下载cscope的键盘映射设置,这样就可以在gvim中简单地通过快捷键来使用cscope,而不必敲复杂的命令了。键盘映射可以从这里下载:http://cscope.sourceforge.net/cscope_maps.vim。
将下载到的cscope_maps.vim放在gvim的插件目录里,如D:/Program Files/Vim/vimfiles/plugin中。Linux用户可以放在$HOME/.vim/plugin中。
建立符号数据库
(1) windows
cscope -f cscope/fc-drv.cscope.out -b -R -s C:\radisys\src\fc-drv -P C:\radisys\src\fc-drv
ctags -f cscope/fc-drv.ctags -R fc-drv
linux
find pwd/fc-drv -name ‘*.[ch]’ -fprint cscope/fc-drv.cscope.files
cscope -b -k -f cscope/fc-drv.cscope.out -i cscope/fc-drv.cscope.files
ctags -f cscope/fc-drv.ctags -R fc-drv
由ctags命令(vim的伴生工具)生成,如ctags *会在当前目录下创建一个名为tags的文件。包含当前目录下所有C/C++文件中的相关信息。
包含文件搜索 :h include-search
跳转到某程序元素定义处的三种方法:
1、vim -t foo_bar
该命令将会打开包含foo_bar定义的文件并定位到定义的那一行。
2、如果已经在vim中,可用 :ta foo_bar来定位。
可设置 autowrite(aw)选项在跳转时自动保存当前文件。
3、在该元素上按ctrl-]。
多数telnet都允许使用命令telnet -E hostname来打开或关闭脱字符^],
或者用telnet -e escape hostname来指定另外一个脱字符来代替^],
此外, 如果可能的话, 可以使用rsh来代替telnet来避免这个问题。
4、如果定义就在当前文件,可直接用输入进行定位。
如果vim不在在“tags”文件所在的目录下运行,则要用“:set tags=”命令设定“tags”文件的路径才能找到“tags”文件。
(相关命令:man ctags, :h ctags)
启动vim,加载tags和cscope.out,并打开taglist窗口
:set tags=PATH/tags
:cs add PATH/cscope.out
:TlistToggle
用:cs[cope]查看更多可用命令
光标定位
0 本行第一个字符
^本行第一个非空字符
$ 本行最后一个字符
h/j/k/l 左/下/上/右,前面可加数字
CTRL-b 向上一页 [PageUp]
CTRL-f向下一页 [PageDown]
CTRL-u 向上半页
CTRL-d向下半页
H 移动到视窗的第一行
M 移动到视窗的中间行
L 移动到视窗的最後行
b 移动到本字/上个字的第一个字母
e移动到本字/下个字的最後一个字母
w移动到下个字的第一个字母
nG 移动到第 n 行
gg 文件头
G 文件尾
% 跳转到光标所在括号(如(,{等)的相匹配的另一个括号处,或#if与#endif之间跳转。
[{ 跳转到当前代码块的开头
]} 跳转到当前代码块的结尾
n{ 左括弧移动到段落的最前面,前面加上数字可以指定往前移动 n 个段落 段落是以段落间的空白 行界定
n} 右括弧移动到下个段落的最前面,前面加上数字可以指定往後移动 n 个段落
[[ 跳转到上一个函数开头(zws)
]] 跳转到下一个函数开头(zws)
gd 跳转到当前变量的定义处。
编辑
u取消刚才的操作
^R 重做被取消的修改
.重复刚才的操作
插入
a 从游标所在位置後面开始新增资料,游标後的资料随新增资料向後移动。
A 从游标所在列最後面的地方开始新增资料。
i 从游标所在位置前面开始插入资料,游标後的资料随新增资料向後移动。
I 从游标所在列的第一个非空白字元前面开始插入资料。
o 在游标所在列下新增一列并进入输入模式。
O 在游标所在列上方新增一列并进入输入模式。
修改
r 修改游标所在字元, r 後接著要修正的字元。
R 进入取代状态,新增资料会覆盖原先资料,直到按 [ESC] 回到指令模式下为止。
cw 进行修改当前单词,
剪切
s删除游标所在字元,并进入输入模式。
S删除游标所在的行,并进入输入模式。
x 删除游标所在字元。
d 剪切
de剪切当前光标所在字符到所在单词的最后一个字符;
dd剪切当前行
D删除至行尾,相当于d$
Nd剪切多行(N代表数量)
还可与其他进行光标定位的快捷键(如0,^,$,}等)联合操作。
复制
y 复制(用法和d相同),后面可加进行定位的快捷键
y<数字>y 复制多行
粘贴
p/P 在当前字符后/前粘贴,前面可加数字,表示粘贴次数
列编辑
vim for windows: ctrl+q
vim for linux: ctrl+v
插入文件名: 在编辑模式下输入CTRL+R%
剪贴板缓冲
"xY 用于剪切或复制到一个名为x的缓冲区(Y 代表任何的删除(如d或x)或取样命令(如y)),
"xZ 用于粘贴内容(Z代表粘贴命令p 或 P),其中x可以为任何字母, 也可在跳转到另一文件中时继续生效。
宏
q录制宏,如qa录制名称为a的宏,再次按q结束录制。共可录制26个宏,@a执行宏a。
查找
/ 正向查找
?反向查找
n 保持上次的方向寻找下一个
N 与上次查找方向反向寻找下一个
* 跳到下一个与当前单词匹配的单词首字符
# 跳到上一个与当前单词匹配的单词首字符
贪婪搜索
文本ababab
/a.*b 将匹配ababab (默认贪婪)
/a.{-}b 将只匹配ab
替换
:[address] s//string/[g|c|N] (where N is an integer value).
此命令查找由grep风格的正则表达式指定的匹配模式, 并将其替换为由string指定的字符串
[address values] 可以是一个或是由逗号分开的两个辅助修改标志. (下面的x代表一个整数)
. 表示当前行(即光标所在的行, 译者注)
$ 当前文件的最后一行
% 整个文件(即对每一行, 等价于1,$ )
x 当前文件的第x行
+x 从当前行开始下面的第x行(如果当前行为第1行, 则+3 代表第4行)
-x 从当前行开始上面的第x行(如果当前行为第4行, 则-3 代表第1行)
g 全部,替换该行中所有匹配的字符串.
c 询问,在每次替换之前询问用户是否确定要进行替换.
N 第N次,只替换在一行中第N个匹配的字符串
(如果没有指定这些辅助修饰标志, 则vim默认为只替换一行中第一个匹配的字符串)
(即等价于address1, address2s//string/1 )
排序(外部程序)
:1,12!sort -r -n -k4.1,5
-r 是降序排序
-n 是按数字大小排序
-k 表示根据那个字段排序,4.1,表示第4列第一个字符开始 ,5表示到第5个字段为结束
-t 后面跟分隔符,缺省是空格
窗口
:vs 或者 :vsplit --vertical split,将当前窗口竖直分割,当前文件在两个窗口中显示
:vs filename 将当前窗口竖直分割,文件filename在新窗口中显示
:sp 或者 :split 将当前窗口水平分割,当前文件在两个窗口中显示
:sp filename 将当前窗口竖直分割,文件filename在新窗口中显示
Ctrl-W + 扩大窗口(多个窗口整体扩大)
Ctrl-W - 缩小窗口(多个窗口整体缩小)
Ctrl-W h 移动光标到左边窗口
Ctrl-W j 移动 光标到下边窗口
Ctrl-W k 移动 光标到上边窗口
Ctrl-W l 移动 光标到右边窗口
:res(ize) +N 把当前窗口高度增加N个像素
:res(ize) -N 把当前窗口高度减少N个像素
:vertical res(ize) +N 把当前窗口宽度增加N个像素
:vertical res(ize) -N 把当前窗口宽度减少N个像素
一些用法
插入行号
:%s//I/ 每一行的行首添加一个TAB字符
? 到文件的末行
:let end=line(".") 末行的行号 ==〉变量 END,函数line的功能是取得指定行的行号,此处参数".“表示当前行
:1 到文件的首行
“------------------------------------------
:let num=1 1 ==〉计数器
:while num<=end
:let line=getline(”.”) 取当前行的内容 ==〉变量 LINE
:let line=substitute(line,$,num,"") 在变量 LINE 的前面置入行号,注意此处 KaTeX parse error: Expected group after ‘^’ at position 13: 代表匹配空字符,等效于’^̲’(zws?),如果改为’’,则是匹配行尾
:call setline(".",line) 将变量 LINE 的内容写回当前行
:+ 下移一行
:let num=num+1 计数器加一
:endwhile 循环执行,直到文件结束
"------------------------------------------
插入行号(2)
:g/^/exe “?/^/”.line(".")
查找
/str1
/str1|str2
将第2-10行中的13改为连续数字
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
configure xdsl line 1/1/2/13 spectrum-profile 99 service-profile 99 admin-up
:let i=1
:2,10g/^/s//13/="/".i/ |let i=i+1
其中"g/^/"不可少,否则会一次性将所有行改为同一个数字。
如果vim不能按照文件名检测文件类型,可以手动指定。如:
:set filetype=cmake