Vim基础
常用设置
set (no)wrap % 是否换行 set (no)list % 显示空白字符,`^I`为Tab,`$`为行结束符
多文件操作
编辑远程文件
vim已经包含了netrw插件,直接vim scp://host/path/to/file
找到已经打开文件的窗口
定义了SwitchToBuf()
函数,它在所有标签页的窗口中查找指定的文件名,如果找到这样
一个窗口,就跳到此窗口中;否则,它新建一个标签页来打开vimrc文件。
(注:标签页(tab)功能只有在vim 7.0版本以上才支持。)
function! SwitchToBuf(filename) "let fullfn = substitute(a:filename, "^\\~/", $HOME . "/", "") " find in current tab let bufwinnr = bufwinnr(a:filename) if bufwinnr != -1 exec bufwinnr . "wincmd w" return else " find in each tab tabfirst let tab = 1 while tab <= tabpagenr("$") let bufwinnr = bufwinnr(a:filename) if bufwinnr != -1 exec "normal " . tab . "gt" exec bufwinnr . "wincmd w" return endif tabnext let tab = tab + 1 endwhile " not exist, new tab exec "tabnew " . a:filename endif endfunction
移动和跳转
基本移动
-
当前行位于屏幕中间:
zz
。 -
跳回之前修改的地方:
Control + o
,回到跳来的地方:Control + i
。
查看操作
十六进制查看
:%!xxd
回到文本模式
:%!xxd -r
比对不同
vimdiff
vimdiff 命令,它可以使用分离模式打开 Vim 并比较两个文件的不同。语法如下:
$ vimdiff [文件1] [文件2]
diffthis
- 在分割出多个窗口中,不同窗口中打开不同文件。
-
在要对比的窗口中命令模式
:diffthis
,或在一个窗口中windo diff
也可以直接在一个缓冲区里使用命令:windo diffthis
,而不用输入 :diffthis 两次)
要停止比较,使用::diffoff
编辑操作
书签
方法是按Escape
键,再按M
键,然后输入a
到z
中的一个表示书签,
所以最多可以有26个书签。
跳转到书签,按Escape
键,再按反引号加标签。
选择
windows下块选择默认是Control + q
。
命令模式
命令模式下粘贴寄存器的内容,通过CTRL+R
加寄存器的名字:
-
默认寄存器就是
CTRL+R"
-
第一寄存器就是
CTRL+R1
保存与版本控制
部分内容另存为
:5,77w>>tmp.txt
-
5,77
表示范围从5行到55行;可以用美元符表示最后一行。 -
w
是保存,加上了>>
表示是追加而不是覆写。
以root权限保存
:w !sudo tee %
这会直接以 root 方式保存。
按时间回退文件
Vim 会记录文件的更改,你很容易可以回退到之前某个时间。该命令是相当直观的。比如:
:earlier 1m
会把文件回退到 1 分钟以前的状态。
注意,你可以使用下面的命令进行相反的转换:
:later
调用内部命令
表达式求值
在插入模式下:
-
Control + r
-
=表达式
如:= 2 + 2
会在光标位置加计算结果。
加密
普通模式下通过g?
对文件进行ROT13编码。
调用外部命令
在普通模式下:
:<范围>!<命令>
例如:
:!ls -l
通过:r
添加命令输出的文本到当前打开的文档中:
:r !ls -l
指定行号
例如,对全文内容进行排序:
:1,$!sort
注意1,美元符
表示范围:其中1
表示是第一行;美元符
表示最后一行。
然后sort
命令的结果会替换全文。
指定行数
在普通模式下,先是输入行数,然后两个感叹号!!
来调用外部命令。
如,要对当前行开始的两行排序:要先Esc
到普通模式,然后2!!sort
。
用管道连接外部命令
可以使用管道分隔符|
把 UNIX 命令连接在一起。
例如,要把缓冲区中内容是由空格分成的多个列。现在要进行多个操作:
- 取第一列
- 按升序排序
- 全转换为大写
那么在普通模式下:
:1,$!awk '{print $1}' | sort | tr [:lower:] [:upper:]
执行当前正编辑的文件
运行当前文件普通模式下:
:!./%
-
:
进入command-mode -
!
在shell执行后面的命令 -
./
这个是shell里面执行当前目录下可执行文件的必要前缀 -
%
表示当前文件, 会自动扩展为当前文件名
先保存再运行:
:w|!./%
就是先保存再运行:
-
w
是保存文件 -
|
是命令连接符, 和shell中的管道差不多
%
只会扩展为文件名, 不带路径, 所以当前路径:pwd
必须是这个文件的路径
quickfix
调用外部命令以后,如果想要仔细查看命令的输出,如编译的错误信息并跳转到对应的行 ,quickfix就很管用了。
-
:cc
:显示详细条目信息 ( :help :cc ) -
:cw
:如果有条目列表,则打开quickfix窗口 ( :help :cw ) -
:cp
:跳到上一个条目 ( :help :cp ) -
:cn
:跳到下一个条目 ( :help :cn ) -
:cl
:列出所有条目 ( :help :cl ) -
:col
:到前一个旧的条目列表 ( :help :col ) -
:cnew
:到后一个较新的条目列表 ( :help :cnew )
对于经常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定义:
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr> nmap <leader>cn :cn<cr> nmap <leader>cp :cp<cr> nmap <leader>cw :cw 10<cr>
现在使用,<space>
(先按,再按空格)就可以编译,使用,cp
和,cn
跳到上一个和下一个
错误,使用,cw
来打开一个quickfix窗口。这下顺手多了!
如果你希望跳转到出错的文件时,使用一个分隔的窗口打开,请参阅switchbuf
选项的
值。
在vim7中,每个窗口都可以拥有自己的位置列表,这样,你就能够同时打开多个位置列表
了,而quickfix列表在整个vim中只有一个。你可以使用位置列表来显示编译错误信息,
具体命令参阅手册::help location-list
以及:help :lmake
。