VI常用操作宝典
时间:2006-01-21 来源:cnscn2008
|
对于 Unix:
:!cp -i $VIMRUNTIME/vimrc_example.vim ~/.vimrc
对于 MS-DOS, MS-Windows, OS/2:
:!copy $VIMRUNTIME/vimrc_example.vim $VIM/_vimrc
对于 Amiga:
:!copy $VIMRUNTIME/vimrc_example.vim $VIM/.vimrc
.vim全局变量目录
Unix ~/.vim/plugin/
PC 和 OS/2 $HOME/vimfiles/plugin 或 $VIM/vimfiles/plugin
Amiga s:vimfiles/plugin
Macintosh $VIM:vimfiles:plugin
RISC-OS Choices:vimfiles.plugin
1)文件操作
vi FileName 打开文件 FileName,并将光标置于第一行首。
vi +n FileName 打开文件 FileName,并将光标置于第 n 行首。
vi + FileName 打开文件 FileName,并将光标置于最后一行。
vi + /pattern FileName 打开文件 FileName,并将光标置于其中第一个于 pattern 匹配的字符串处。
vi –r FileName 在上次正用 vi 编辑 FileName 发生系统崩溃后,恢复FileName。
vi File1 … Filen 打开多个文件,依次对之进行编辑。
:%!xxd 以十六进制查看
:%!xxd -r 从十六进制返回
:n1,n2 co n3 将 n1 行到 n2 行之间的内容拷贝到第 n3 行下。
:n1,n2 m m3 将 n1 行到 n2 行之间的内容移至第 n3 行下。
:g/^.*uid.*;$/nu 查找含 uid 且以;结尾的行,并显示行号
:g/^.*uid.*;$/m 59 查找含 uid 且以;结尾的行,并把这些行move到第59行
:n1,n2 d 将 n1 行到 n2 行之间的内容删除。
:n1,n2 w filename 将 n1 行到 n2 行之间的内容保存到文件 filename 中
:n1,n2 w! Command 将文件中n1行到n2行的内容作为 Command的输入并执行之,若不指定 n1、n2,则将整个文件内容作为 Command 的输入。
:r! Command 将命令 Command 的输出结果放到当前行。
:nr <文件> 把<文件>插入到第n行
:so <文件> 读取<文件>,再执行文件里面的命令 (译注--文件中的命令应该都是一些ex命令)
:l1,l2w <文件> 把第l1和第l2行之间的文本写到<文件>中去
:w >> <文件> 添加到<文件>末尾. 也可以使用行号
: e! 重新编辑当前文件,忽略所有的修改
·(、[、{、)、]、}对应显示 % 显示当前(、[、{ 、)、] 、}的对应项
·(、[、{、)、]、}内数据选择
daB 删除{}及其内的内容 (在非v可视模式下)
diB 删除{}中的内容
ab 选择()中的内容
ib 选择()中的内容( 不含() )
aB 选择{}中的内容
iB 选择{}中的内容( 不含{} )
·语法提示与自动补齐
★ <C-N><C-P> 插入模式下的单词自动完成
★ <C-X><C-L> 行自动完成(超级有用)
1)设置建立ctags
#ctags -f _tags -R $JAVA_HOME/src /var/www/html/iychina/lib/
#ctags -f _tags -R /opt/j2sdk/src /usr/src/kernels/2.6.9-5.EL-i686 # VIMRUNTIME=/usr/local/vim7/share/vim/vim70aa # cp _tags ${VIMRUNTIME}/tags/_tags 2)设置~/.vimrc "标签文件位置
set tags=$VIMRUNTIME/tags/_tags
3)使用
^p 自动补齐上下文已有相近项
^n 自动补齐~/.tags中的相近函数
^] 显示~/.tags中的光标下的函数的原型,
显示函数原型列表,输入数字后按回车,则显示函数定义原型
按^t退出函数
:pta 函数名 或^w} 预览窗口快速打开相应函数所在文件,并将光标定位在对应函数的开
头
K 显示光标下的C函数的man说明手册
CTRL-X CTRL-F 文件名
CTRL-X CTRL-L 整行
CTRL-X CTRL-D 宏定义 (包括包含文件里的)
CTRL-X CTRL-I 当前文件以及所包含的文件
CTRL-X CTRL-K 字典文件内的单词
CTRL-X CTRL-T 同义词词典文件内的单词
CTRL-X CTRL-] 标签
CTRL-X CTRL-V Vim 命令行
全能补全的热键是 CTRL-X CTRL-O。显然,O 在这里代表全能 (Omni),这样方便我们记忆。让我们以编辑 C 程序为例:
{
struct foo *p;
p-> 光标在 "p->" 之后。现在键入 CTRL-X CTRL-O。
Vim 会给你提供一个可选项的列表,这些可选项为 "struct foo" 所拥有。
这和使用 CTRL-P 有很大不同,后者补全任意单词,而我们这里只要求 "struct foo" 的成员。
大家一般都知道,在 Vim 的帮助窗口中的关键字上双击鼠标或者键入“Ctrl-]”即可跳转至该关键字相关的帮助主题。不过,“跳转至匹配的关键字”这一功能并不仅仅局限于帮助文 件。只要有合适的 tags 文件(参见“:help tags-file-format”),我们同样可以在源代码中使用这个方便的功能,跳转到与关键字匹配的“标记”处(通常是源代码中某一函数、类型、变 量或宏的定义位置)。
要产生 tags 文件,通常我们使用 Exuberant Ctags [15]。一般的 Linux 发布版中均带有这一工具。Ctags 带有的选项数量极多,此处我们仅简单介绍如何在一个典型的多文件、多层目录的项目中使用其基本功能:我们只需在项目的根目录处键入“ctags -R .”,Ctags 即可自动在文件中查找、识别支持的文件格式、生成 tags 文件。目前 Exuberant Ctags 支持多达 33 种编程语言 [16],包括了 Linux 下常用的 C、C++、Java、Perl、PHP 等。有了 tags 文件,以下的 Vim 命令就可以方便使用了(进一步的信息可参考“:help tags-and-searches”):
- :tag 关键字(跳转到与“关键字”匹配的标记处)
- :tselect [关键字](显示与“关键字”匹配的标记列表,输入数字跳转到指定的标记)
- :tjump [关键字](类似于“:tselect”,但当匹配项只有一个时直接跳转至标记处而不再显示列表)
- :tn(跳转到下一个匹配的标记处)
- :tp(跳转到上一个匹配的标记处)
- Ctrl-](跳转到与光标下的关键字匹配的标记处;除“关键字”直接从光标位置自动获得外,功能与“:tags”相同)
- g](与“Ctrl-]”功能类似,但使用的命令是“:tselect”)
- g Ctrl-](与“Ctrl-]”功能类似,但使用的命令是“:tjump”)
- Ctrl-T(跳转回上次使用以上命令跳转前的位置)
当 我们在项目的根目录下工作时,上面这些命令工作得很好。但如果我们进到多层目录的里层再运行 Vim 打开文件时,这些命令的执行结果通常就变成了错误信息“E433: No tags file”。这是因为缺省 Vim 只在文件所在目录和当前目录下寻找 tags 文件,而我们前面只在项目的根目录下生成了 tags 文件,Vim 无法找到该文件。解决方法有好几种,我认为一般较简单的做法是对每个项目都在 .vimrc 文件中增加一个路径相关设定。假设我们有两个项目,位置分别是 /home/my/proj1 和 /home/my/proj2,那我们可以使用:
au BufEnter /home/my/proj1/* setlocal tags+=/home/my/proj1/tags |
Vim 选项 tags 用于控制检查的 tags 文件,缺省值为“./tags,tags”,即前面所说的文件所在目录下和当前目录下的 tags 文件。上面两行自动命令告诉 Vim,在打开项目目录下的文件时,tags 选项中的内容要增加项目的 tags 文件的路径。进一步信息可参看“:help 'tags'”。
·变量定位 gd 转到光标下局部变量的定义处
Gd 转到光标下全局变量的定义处
·编译选项
F9 编译或执行当前程序
:cn 命令会把你带到下一个出错地点,而不考虑它在什么文件里。
:cc 命令会向你显示当前错误的编译器输出信息;
:cl 会生成一个列有项目所有错误的列表,以供浏览这些错误
.鼠标支持
不管是文本界面还是图形界面的 Vim,都支持鼠标。不过,在文本界面中,鼠标支持缺省没有被激活;这就意味着,在终端上使用鼠标,所有的功能仍和没有使用 Vim 时相同,并不受 Vim 影响。要激活文本界面中的鼠标支持也很容易,只需要执行一句“:set mouse=a”即可。
启用了鼠标支持之后,Vim 主要支持的鼠标操作有:
- 单击移动光标到点击的位置;
- 在帮助的关键字上双击显示该关键字相关的帮助信息;
- 在普通文本上双击选中点击位置的单词;
- 拖动鼠标选中文本;
- 使用鼠标滚轮滚动当前缓冲区中的文本;
- 多窗口编辑时可以拖动窗口分栏的位置。
进一步的信息可参看“:help 'mouse'”、“:help mouse-using”和“:help scroll-mouse-wheel”。
特 别需要值得一提的是,在远程访问 Linux 系统时也是可以使用鼠标的。如果使用 X Window 系统,自然不必说;而使用 SSH 远程连接时,大部分 Linux 下的终端客户程序,如 XTERM、GNOME-Terminal [13]、较新版本的 Konsole [14],以及 Windows 下的 PuTTY,支持鼠标的使用:你只需简单地启动 Vim、执行一句“:set mouse=a”就可以了(当然,也可以把上面的语句去掉起始的冒号放到 .vimrc 文件中)。
.空格、制表符和缩进
== 缩进当前行
=a{ 或 =a} 缩进当前行所在{....}之间的所有代码
gg=G 重新缩进整个文件
^t 插入模式下自动缩进当前行
>> 右移当前行一个shiftwidth个空格
>i} 右移当前行所在的{....}内的所有代码(不含"{"和"}")一个shiftwidth个空格
>a} 右移当前行所在的{....}内的所有代码(含"{"和"}")一个shiftwidth个空格
对于编写代码,缩进是最基本的概念之一。至于缩进是使用空格还是制表符(Tab),或者缩进是否正好使用一个制表符来表示,很多程序员,特别是 Windows 开发出身的程序员,很容易混淆。幸好,Vim 对于这些概念有非常完整的支持,足以应付各种复杂的情况。以下是相关的主要 Vim 选项:
- shiftwidth(缩进的空格数);
- tabstop(制表符的宽度);
- expandtab(是否在缩进和遇到 Tab 键时使用空格替代;使用 noexpandtab 取消设置);
- softtabstop(软制表符宽度,设置为非零数值后使用 Tab 键和 Backspace 时光标移动的格数等于该数值,但实际插入的字符仍受 tabstop 和 expandtab 控制);
- autoindent(自动缩进,即每行的缩进值与上一行相等;使用 noautoindent 取消设置);
- cindent(使用 C 语言的缩进方式,根据特殊字符如“{”、“}”、“:”和语句是否结束等信息自动调整缩进;在编辑 C/C++ 等类型文件时会自动设定;使用 nocindent 取消设置);
- cinoptions(C 语言缩进的具体方式,请参考“:help cinoptions-values”);
- paste(粘贴模式,会取消所有上述选项的影响来保证后面的操作——通常是从剪贴板粘贴代码——保持原有代码的风格;使用 nopaste 取消设置)。
下面给出一些常用的组合:
- shiftwidth=4 tabstop=4:很多 Windows 出身的程序员会习惯这样的设置,让缩进等于制表符宽度。
- shiftwidth=4 tabstop=8:很多 Unix 程序员的设置,仍使用较常用的 4 格缩进,但制表符宽度为标准的 8。
- cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1 shiftwidth=2 tabstop=8:标准的 GNU 编码风格的设置,对 Vim 缺省的 C 缩进风格作了很多微调,比如,if 语句下的“{”、“}”要在“if”后缩进两格,但函数定义部分“{”、“}”仍和函数名一行对齐。开源软件经常使用该种缩进风格。
在 编辑代码时一个很有用的命令是调整代码缩进,可以很方便地增加(或减少)若干级缩进,并自动根据选项设定使用正确的空格或制表符。只需要使用“V”选中你 要调整的代码行,然后键入“<”(或“>”)即可增加(或减少)一级缩进;在键入“<”(或“>”)之前键入数字则可以指定增加 (或减少)的缩进级数。
我们要讨论的最后一个相关的命令是“:retab”。在设定了 expandtab 选项时,该选项会把所有的制表符转换成空格。在没有设定 expandtab 选项时,使用“:retab!”可把空白字符转换成制表符(可能误转换,慎用),使用“:retab n”可以把 tabstop 重置为 n,并转换含制表符的连续空白字符为适当的制表符和空格的组合以保证含制表符的行看起来没有任何变化。详细信息请参看“:help :retab”。
制表符和空格'tabstop' 在缺省状态下被设定为 8。尽管你可以改变它,但很快你就会遇到麻烦。其它
的程序不知道你用的制表符间隔值是多少,你的文件看起来会一下子改变许多。另外,很
多打印机都将制表符间隔值固定为 8。所以最好还是保留 'tabstop' 值不变。(如果你编
辑使用其它制表符间隔值的文件,请参考 |25.3| 来修正。)
如果使用 8 个空格来缩进程序,你很快就会走到窗口的最右端;而用 1 个空格又看
不出足够的差别。因此很多人喜欢用 4 个空格。这的确是个很好的折衷。
由于一个制表符 (<Tab>) 是 8 个空格,而你又想使用 4 个空格来缩进,这样你就无
法使用制表符来完成缩进。这里有两种解决办法:
1. 混合使用制表符和空格。由于一个制表符占用 8 个空格的位置,你的文件会含有更少
的字节数。插入或删除一个制表符也要比 8 个空格快很多。
2. 只用空格。这就避免了那些使用不同制表符间隔值的文件所带来的麻烦。
幸运的是,Vim 能够同时很好地支持这两种方式。
混 合 使 用 空 格 和 制 表 符
如果你使用制表符和空格的组合,你直接按正常情况编辑就行。Vim 缺省状态下,能够很
好地处理这些情况。
通过设定 'softtabstop' 可以使工作变得更简便。这个选项能使 <Tab> 看起来像是
被设定为 'softtabstop' 所指定的值,但实际上使用的确是制表符和空格的组合。
当你执行下面的命令后,你每次按下 <Tab> 键,光标都会移动到下一个 "4 列" 边
界:
:set softtabstop=4
当你在第一列按下 <Tab> 键后,4 个空格会插入到文本中;再次按下 <Tab> 键,Vim 会
先删除那 4 个空格,然后再插入一个制表符。Vim 会尽可能地使用制表符,并辅以空格
填补。
删除会以相反的方式进行。<BS> 键总是删除 'softtabstop' 指定的数量。Vim 尽可
能地使用制表符,而用空格来填补空隙。
下面的例子显示了多次输入制表符然后使用 <BS> 的情况。"." 代表一个空格而
"------->" 代表制表符。
输入 结果
<Tab> ....
<Tab><Tab> ------->
<Tab><Tab><Tab> ------->....
<Tab><Tab><Tab><BS> ------->
<Tab><Tab><Tab><BS><BS> ....
另一种方法是使用 'smarttab' 选项。当它被设定,Vim 对每个在缩进行中的制表符使用
'shiftwidth',而对在第一个非空字符后输入的 <Tab> 使用真的制表符。但 <BS> 键不
会像在 'softtabstop' 选项下那样工作。
只 用 空 格
如果你不想在文件中出现制表符,可以设定 'expandtab' 选项:
:set expandtab
当这个选项被设定,<Tab>键会插入一系列的空格。这样你可以获得如同插入一个制表符
一样数量的空格。但你的文件中并不包含真正的制表符。
退格键 (<BS>) 每次只能删除一个空格。这样如果你键入了一个 <Tab>,你需要键入
8 次 <BS> 才能恢复。如果你在调整缩进中,输入 CTRL-D 会更快些。
制 表 符 与 空 格 的 相 互 转 换
设定 'expandtab' 选项并不会影响已有的制表符。如果你想将制表符转换为空格,可以
用 ":retab" 命令。使用下面的命令:
:set expandtab
:%retab
Vim 会在所有缩进中使用空格而非制表符。但是,所有非空字符后的制表符不会受到影
响。如果你想要转化这些制表符,需要在命令中加入 !:
:%retab!
这不大安全。因为它也许会修改字符串内的制表符。要检查这种情况是否存在,可以执
行:
/"[^"\t]*\t[^"]*"
这里建议你不要在字符串中直接使用制表符。请用 "\t" 来替代,麻烦会少些。
将空格转化为制表符的命令则恰好相反:
:set noexpandtab
:%retab!
3)光标移动
·字符
h 光标左移一个字符。
l 光标右移一个字符。
.用%来在配对的#ifdef...#else...#endif, {}, [], ()间移动
#ifdef USE_POPEN
fd = popen("ls", "r")
#else
fd = fopen("tmp", "w")
#endif
[# 到达#ifdef或#else
]# 到达#else或#endif
[[ 到达最外层的{
]] 到达最外层的}
[{ 到达当前块的开始
]} 到达当前块的结尾
[m 到达前一个方法的开始
]m 到达下一个方法的开始
[] 到达前一个函数的结尾
]] 到达下一个函数的开始
对于/*...*/
[/ 到达注释的开始
]/ 到达注释的结尾
[| 查询C程序中变量的声明是int还是unsigned
^o 在足迹间流动
:checkpath c程序中用于列出包含文件的可定位情况,即是否能找到所包的文件
·字
w 或 W 光标右移一个字至字首。
B 或 b 光标左移一个字至字首。
E 或 e 光标右移一个字至字尾。
·句
) 光标移至句尾。
( 光标移至句首。
·段
} 光标移至段落开头。
{ 光标移至段落结尾。
·行
k 或 Ctrl+p 光标上移一行。
j 或 Ctrl+n 光标下移一行。
Enter 光标下移一行。
nG 光标移至第 n 行首。
n+ 光标下移 n 行。
n- 光标上移 n 行。
n$ 光标移至第 n 行尾。
0 光标移至当前行首。
$ 光标移至当前行尾。
:number 回车 移动到第number行
number z 回车 同上
这两个比 number G 好用的多 毕竟大写的G敲起来麻烦
[[ 定位到上一个函数
]] 定位到下一个函数
% 定位到匹配的括号处
·屏幕
H 光标移至屏幕顶行。
M 光标移至屏幕中间行。
L 光标移至屏幕最后行。
Ctrl+u 向文件首翻半屏。
Ctrl+d 向文件尾翻半屏。
Ctrl+f 向文件尾翻一屏。
Ctrl+b 向文件首翻一屏。
nz 将第 n 行滚至屏幕顶部。不指定 n 时将当前行滚至屏幕顶。
4)插入
# 在文件中插入行号(不是显示行号,是插入!)
★:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
·光标
i 在光标前插入。
a 在光标后插入。
·行
I 在当前行首插入。
A 在当前行尾插入。
o 在当前行之下一新行插入。
O 在当前行之上新开一行插入。
合并多行
10,20 join 合并第10到20行的内容
或 v模式下选中多行执行命令 join
5)替换
r 替换当前字符。
R 替换当前字符及其后的字符,直至按 ESC 键。
s 从当前光标位置处开始,以输入的文本代替指定数目的字符。
S 删除指定数目的行,并以所输入的文本代替。
6)修改
ncw 或 nCW 修改指定数目的字符。
nCC 修改指定数目的行。
:r filename 将文件 filename 插入在当前行之下
7)查找替换
/<C-R><C-W> 把狭义单词 <cword> 写到 搜索命令 行
/<C-R><C-A> 把广义单词 <cWORD> 写到 搜索命令 行
:g/str/s/str1/str2/g
第一个g表示对每一个包括s1的行都进行替换,
第二个g表示对每一行的所有进行替换
包括str的行所有的str1都用str2替换
:%s/f $/for$/g 将每一行尾部的“f ”(f键和空格键)替换为for
:%s/^/mv /g 在每一行的头部添加“mv ”(mv键和空格键)
:s/fred/<c-r>a/g 替换fred成register a中的内容
:g/<input|<form/p 显示含<input或<form的行
# 替换一个visual区域
# 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
:'<,'>s/Emacs/Vim/g 前面的'<,'>是vim自动添加的
# 在多个文档中搜索
:bufdo /searchstr
:argdo /searchstr
.folder
可以在左花括号({)上按;c(加号),即可隐藏, 解除隐藏则在那行上按空格即可
添加如下两行到你的.vimrc文件中即可 set foldmethod=manual
map ;c v%zf
8)复制与剪切
xp 交换前后两个字符的位置
ddp 上下两行的位置交换
:g/fred/t$ 拷贝行,从fred到文件末尾(EOF)
:set paste 粘贴时常常都搞得天下大亂, 此设置可以做为开关键改变这种情况
9)窗口操作
F6 键打开一个当前目录浏览窗口
:vne [filename]
:sp [filename]
:S [filename]
:new [filename]
:^w + ^r 交换两个窗口的位置
^w = 窗口等宽
:res -n 窗口高度减小n
:res +n 窗口高度增大n
:vert res -n
:vert res +n
CTRL-W h 跳转到左边的窗口CTRL-W H 把当前窗口移到最左边
CTRL-W j 跳转到下面的窗口
CTRL-W k 跳转到上面的窗口
CTRL-W l 跳转到右边的窗口
CTRL-W t 跳转到最顶上的窗口
CTRL-W b 跳转到最底下的窗口
CTRL-W J 把当前窗口移到最下边
CTRL-W L 把当前窗口移到最右边
:qa 全部退出 :wa 全部保存 :qa! 全部无条件退出
TabPage
1):tabnew [++opt] [+cmd] {file} Open a new tab page
2):tabc
3):tabo
4):tabn || gt
:tabn n || n gt
5):tabp || gT
6):tabr
7):tabl
8):tabmove N
9):tabd[o] {cmd} Execute {cmd} in each tab page.
.打开字符串所标识的文件名 1)v 2)选择串 3)gf
10)DOS格式文本转成Unix格式文本
:1,$s/^M//g
11)书签
在阅读和编写大的程序文件时,利用标记(书签)功能定位是十分有帮助的。
将光标移到想做标记的位置。假如做一个名为“debug1”的标记,那么用户可在命令模式下输入做标记的命令“mdebug1”,然后敲入回车键,一个名为“debug1”的标记就做好了。
接下来用户可以随意将光标移到其它的位置,当在命令模式下输入“`debug1”后,就能快速回到“debug1”的标记所在行的行首。
12)删除操作
:%s/r//g 删除DOS方式的回车^M
:%s= *$== 删除行尾空白
:%s/^(.*)n1/1$/ 删除重复行
:%s/^.{-}pdf/new.pdf/ 只是删除第一个pdf
:%s/<!--_.{-}-->// 又是删除多行注释(咦?为什么要说「又」呢?)
:g/^s*$/d 删除所有空行
:%s/^[\s|\n]*$//g 删除所有含空白或\n换行符的行
:g! /^dd/d 删除不含字符串'dd'的行
:v/^dd/d 同上 (译释:v == g!,就是不匹配!)
:g/str1/,/str2/d 删除所有第一个含str1到第一个含str2之间的行
:v/./.,/./-1join 压缩空行
:g/^$/,/./-j 压缩空行
ndw 或 ndW 删除光标处开始及其后的 n-1 个字符。
d0 删至行首。
d$ 删至行尾。
ndd 删除当前行及其后 n-1 行。
x 或 X 删除一个字符。
Ctrl+u 删除输入方式下所输入的文本。
^R 恢复u的操作
J 把下一行合并到当前行尾
V 选择一行
^V 按下^V后即可进行矩形的选择了
aw 选择单词
iw 内部单词(无空格)
as 选择句子
is 选择句子(无空格)
ap 选择段落
ip 选择段落(无空格)
D 删除到行尾
x,y 删除与复制包含高亮区
dl 删除当前字符(与x命令功能相同)
d0 删除到某一行的开始位置
d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符)
dw 删除到某个单词的结尾位置
d3w 删除到第三个单词的结尾位置
db 删除到某个单词的开始位置
dW 删除到某个以空格作为分隔符的单词的结尾位置
dB 删除到某个以空格作为分隔符的单词的开始位置
d7B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d} 删除到某个段落的结尾位置
d{ 删除到某个段落的开始位置
d7{ 删除到当前段落起始位置之前的第7个段落位置
dd 删除当前行
d/text 删除从文本中出现“text”中所指定字样的位置,
一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
dfc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
dtc 删除当前行直到下一个字符“c”所出现位置之间的内容
D 删除到某一行的结尾
d$ 删除到某一行的结尾
5dd 删除从当前行所开始的5行内容
dL 删除直到屏幕上最后一行的内容
dH 删除直到屏幕上第一行的内容
dG 删除直到工作缓存区结尾的内容
d1G 删除直到工作缓存区开始的内容
修改命令操作
r 更改当前字符
cw 修改到某个单词的结尾位置
c3w 修改到第三个单词的结尾位置
cb 修改到某个单词的开始位置
cW 修改到某个以空格作为分隔符的单词的结尾位置
cB 修改到某个以空格作为分隔符的单词的开始位置
c7B 修改到前面7个以空格作为分隔符的单词的开始位置
c0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c} 修改到某个段落的结尾位置
c{ 修改到某个段落的开始位置
c7{ 修改到当前段落起始位置之前的第7个段落位置
ctc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
cc 修改当前行
5cc 修改从当前行所开始的5行内容
. 重复上一次修改!
.utf-8编码
比如,原有1个文档为utf-8编码的,现在要将它改为cp936编码,可用如下指令
:set fileencoding=cp936
然后再保存文件:w
.文本中的TAB转化为固定长度的空格
输入 :set expandtab
输入 :set tabstop=4
输入 :retab
13)Set 选项设置
set all 列出所有选项设置情况。
set term 设置终端类型。
set ignorecase 在搜索中忽略大小写。
set list 显示制表位(^I)和行尾标志($)。
set number 显示行号。
set showmode 示用户处在什么模式下
set report 显示由面向行的命令修改国的行数目。
set terse 显示简短的警告信息。
set warn 在转到别的文件时,若没有保存当前文件则显示 No write 信息。
set autowrite 在“:n”和“:!”命令之前都自动保存文件
set nomagic 允许在搜索模式中,使用前面不带\的特殊字符。
set nowrapscan 禁止 vi 在搜索到达文件两端时,又从另一端开始。
set mesg 允许 vi 显示其他用户用 write 写到自己终端上的信息。
set fo=tcromB1 自动加上wrap....
autoindent (ai) noai 使新行自动缩进,和上(下)行的位置对齐
autoprint (ap) ap 每条命令之后都显示出修改之处
autowrite (aw) noaw 在:n,:!命令之前都自动保存文件
beautify (bf) nobf 在输入的时候忽略所有的控制字符(除了制表键(tab),换行(newline),进纸(formfeed))
directory= (dir=) /tmp 存放缓冲区的目录名
edcompatible noedcompatible 在替换的时候使用类ed的用法
errorbells (eb) errorbells 出错的时候响铃
exrc (ex) noexrc 允许在主目录(home)外面之外放.exrc文件
hardtabs= (ht=) 8 设置硬制表的边界
ignore case (ic) noic 正规式里忽略大小写
lisp nolisp 打开lisp模式
list nolist 显示所有的制表键和行的结尾
magic agic 可以使用更多的正规表达式
mesg mesg 允许向终端发送消息
number (nu) nonumber 显示行号
open open 允许开放和可视化
optimize (opt) optimize 优化吞吐量,打印时不发回车
paragraphs= (para=) IPLPPPQPPLIbp 设置{ & }的分界符
prompt prompt 命令模式下的输入给出:的提示符
readonly (ro) noro 除非用!号否则不准保存文件
redraw noredraw 当编辑的时候重绘屏幕
remap remap 允许宏指向其他的宏
report= 5 如果影响的行数>这个数的话就报告
scroll 1/2 window 下卷屏幕时滚动屏幕的数目, 同样这也是z命令输出的行数(z 输出2倍滚屏的大小)
sections= SHNHH HU 定义节的末尾(当使用命令[[ 和 ]] 时)
shell= (sh=) /bin/sh 缺省的SHELL,如果设置了环境变量 SHELL的话,就使用变量
shiftwidth= (sw=) 8 当使用移动(shift)命令时移动的字符数 showmatch (sm) nosm 显示{, }, (, ), [, 或者 ] 的匹配情况
showmode noshowmode 显示你处在什么模式下面
slowopen (slow) 插入之后不要立刻更新显示
tabstop= (ts=) 8 设置制表停止位(tabstop)的长度
taglength= (tl=) 0 重要标记的字符个数(0表示所有的字符)
tags= tag, /usr/lib/tags 定义包含标记的文件路径
term = 设置终端类型
terse noterse 显示简短的错误信息
timeout (to) timeout 一秒钟后键盘映射超时
ttytype= 设置终端类型
warn warn 显示"No write since last change"信息
window= (w=) 可视模式下窗口的行数
wrapmargin= (wm=) 0 右边距,大于0的话最右边的单词将折行,留出n个空白位置
wrapscan (ws) ws 查找到文件尾后再重头开始
writeany (wa) nowa 可以保存到任意一个文件去
14)特殊字符
^ 匹配字符串位于行首。
$ 匹配字符串位于行尾。
. 用在模式串中,表示任何单个字符。
在命令模式下,重复上次的命令。
* 在模式串中,表示其前字符可出现任意多次。
[] 用在模式串中,表示指定方位内字符,其中可用-表示一个字
符范围,用^ 表示不在某个范围内的字符。
ESC 从插入状态转换到命令状态
^[ 功能同 ESC
15)大小写转换
guu 行小写
gUU 行大写
g~~ 行翻转(当然指大小写啦)
guw 字小写(狭义字) 译注:建议对比iw
gUw 字大写(狭义字)
g~w 字翻转(狭义字)
vEU 字大写(广义字)
vE~ 字翻转(广义字)
ggguG 把整个文章全部小写(ft!bt!)
16) 跳转足迹
'. 跳到最后修改的那一行 (超级有用)(ft,怎么又是这个评价)
`. 不仅跳到最后修改的那一行,还要定位到修改点
<C-O> 依次沿着你的跳转记录向回跳 (从最近的一次开始)
<C-I> 依次沿着你的跳转记录向前跳
:ju(mps) 列出你跳转的足迹
17)命令历史
:history 列出历史命令记录
:his c 命令行命令历史
:his s 搜索命令历史
q/ 搜索命令历史的窗口
q 命令行命令历史的窗口
:<C-F> 历史命令记录的窗口
18)寄存器
# 列出寄存器(Registers)
:reg 显示所有当前的registers
"1p "表示引用register,1表示一个名字叫做1的register,p就是粘贴(paste)命令
译释:
"也用来定义register
先输入 ",表示定义register
然后输入名字,如0~9,a~z
然后执行删除或复制命令,如dd或y,
或者是visual模式下的d(删除选中的部分)或y(复制选中的部分)
则被删除或复制的部分就被存入了这个命名的register
观察:一个特殊的register, "" ,里面存储了一个匿名的删除/复制
在你执行dd或y的时候,被作用的部分被存到了""中
19)命令行
"ayy@a 把当前行作为一个Vim命令来执行
译释:"ayy 是定义当前行到register a,然后@a是执行register a中存储的指令
10yy copy 当前行以下10行
11) 排序
:%!sort -u 使用sort程序排序整个文件(用结果重写文件)
!1} sort -u 排序当前段落 (只能在normal模式下使用!!)
:.,+5!sort 排序当前行及以下5行
20) 列操作
:%s= [^ ]+$=&&= 复制最后一列
:%s= f+$=&&= 一样的功能
:%s= S+$=&& ft,还是一样
:s/(.*):(.*)/2"1/ 颠倒用:分割的两个字段
:%s:((w+s+){2})str1:1str2: 处理列,替换所有在第三列中的str1
:%s:(w+)(.*s+)(w+)$:321: 交换第一列和最后一列 (共4列)
======================================
.在文件中置入行号
"------------------------------------------
"Macro Function : Source File Add Row_Num
" Date : 2001/12/01
" Author : Yan Shi
"------------------------------------------
:%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 的前面置入行号
:call setline(".",line) "将变量 LINE 的内容写回当前行
:+ "下移一行
:let num=num+1 "计数器加一
:endwhile "循环执行,直到文件结束
"------------------------------------------
==============================================================
.下列数据 1234567890ABCDEF ,将其变成 13579ACE 24680BDF 的形式
"----------------------------------------------------说明如下:
"Macro Function : Convert Char Arrange Direction
"
" Sample : 40 50 60 ==> 4 5 6
" 0 0 0
" Date : 2001/12/01
" Author : Yan Shi
"----------------------------------------------------
:s/.*/&^M/
:1
:map = malx+$p-`al=
⑴ :s/.*/&^M/ 在数据行下方添加一空行。
⑵ :1 回到文件的首行的首字符。
⑶ :map = malx+$p-`al= 将一大串VIM命令映像给字符=
① ma 将首字符标记为a
② l 光标右移一个字符
③ x 删除光标处字符
④ + 移至下一行
⑤ $ 到行尾
⑥ p 将删除的字符粘贴
⑦ - 回至上一行
⑧ `a 返回到标记字符处
⑨ l 光标右移一个字符
⑩ = 递归调用,重复以上步骤,直到将该行所有的数据处理完。
====================我的vim设置====================================
$cat ~/.vim/plugin/vimrc.vim
"set syntax on
:syntax on
"set no compatible
:set nocompatible
"set backspace
:set backspace=indent,eol,start
"set autoindent
:set ai
"set cautoindent
:set cindent
"set shiftwidth
:set shiftwidth=4
"set soft tab width
:set softtabstop=4
"change tab to spaces
:retab
"set line numbers
:set nu
"set show match (showmatch)
:set sm
"set foldmethod
:set fdm=syntax
"set extend tab
:set et
"set foldmarker
:set foldmarker={{{,}}}
"set match options
:set matchpairs=(:),{:},[:],<:>
:set complete+=k
"set the visualbell
:set visualbell
"set history length
:set history=50
"set the ruler
:set ruler
"set fileencoding=gb2312
"set show command line
:set showcmd
:set incsearch
"set tags file path
:set tags=~/.vim/_tags
"auto add *, when write /*...*/
:set formatoptions=tcro
"show tab and spaces
set listchars=tab:>-,trail:~
set list
syntax match Trail " +$"
highlight def link Trail Todo
""""""""""""""""""""""""Maps""""""""""""""""""""""""
if version >= 600
"find the current word
map <F3> /<c-r><c-w><CR>
"Type List
map <F2> :Tlist<CR>
"remove the space end of a line
map ;m :%s/ *$//g<CR>
"使用X调用Minmax()函数
map X :call Minmax() <CR>
"使用T调用MinmaxHeight()函数
map T :call MinmaxHeight() <CR>
"v%zf
:map ;c v%zf
endif
=============================================================================
处理多字节字符文件,如UTF-8, 把下面加入到~/.vim/plugin/cnsVimrc
" multi-encoding setting
if has("multi_byte")
"set bomb
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, untested
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
" Detect UTF-8 locale, and replace CJK setting if needed
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif