vim 技巧集

vi技巧集

技巧1:关于帮助的帮助
查找帮助: 键入 “:help word”, 接着键入 CTRL-D 可以看到匹配”word” 的帮助主题.
类别 前缀 例子
普通模式命令 (无) :help x
Visual 模式命令 v_ :help vu
插入模式命令 i
:help i
命令行模式命令 : :help :quit
命令行编辑 c
:help c_
Vim 命令参数 - :help -r
选项 ‘ :help ‘textwidth’

技巧2:vi初学者30分钟教程
键入:vimtutor [语言]
语言参数可以是:fr it等,rh9有繁体的教程,暂时没有简体中文教程。

技巧3:确定你的位置
方法1:使用 命令。此命令显示vi状态信息,包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。有时你会看到一个“裂开”的列号,是由于使用了Tab字符。
方法2:设置’number’选项。
在每行的前面加上一个行号:“:set number”;
要重新关闭这个选项:“:set nonumber”。
方法3:设置’ruler’选项。这会在Vim窗口的右下角显示当前光标的位置:
:set ruler

技巧4: 中止命令
比如:输入”f“后发现应该是“F”,就可以用来中止f命令。

技巧5: 让最后一行处于屏幕的中间
当到达了最后一行的时候,光标会行处于屏幕的底部。
“zz”命令能让最后一行显示在屏幕中间;
“zt”把光标所在行移动到屏幕的顶部;
“zb”则移动到屏幕的底部。

技巧6: 显示标记
你可以用如下命令取得所有的标记的列表:“ :marks”
用这个命令后,你会发现有一下特殊的标记,包括:
‘ 跳转前的位置
“ 最后编辑的位置
[ 最后修改的位置的开头
] 最后修改的位置的结尾

技巧7: 操作符与动作
你可以使用“dw”命令来删除一个单词,它是命令“d”+动作“w”。还可以加上数字,如“d4w”或者“4dw”来删除4个单词。
类似的常用命令有:
x 表示 dl (删除当前光标下的字符)
X 表示 dh (删除光标左边的字符)
D 表示 d$ (删除到行尾)
C 表示 c$ (修改到行尾)
s 表示 cl (修改一个字符)
S 表示 cc (修改一整行)

技巧8: 替换单个字符
“rx”命令,使用x替换当前字符,x可以是任意字符,键也可以;
“nrx”命令,可以用一个字符替换多个字符,如”4ra”;

技巧9: 重复命令“.”的使用
例如,假设你在编辑一个HTML文件,你想删除所有的标记。你把光标移到第一个“”命令删除,然后你就可以移到的”)。要删除下一个标记,移动到下一个<的位置,再执行“.”命令即可。 技巧10: 关于put的更多知识 “P”命令象“p”一样也是插入字符,但位置在光标前面。当你用“dd”删除一行,“P”会把它查回到光标所在行的前一行。而当你用“dw”删除一个单词,“P”会把它插回到光标前面。 你还可以执行这个命令多次,每次会插入相同的文本。 “p”和“P”命令接受个数前缀,被插入的文本就会被插入指定的次数。所以“dd”后加一个“3p”会把删除行的三个拷贝插入到文本中。 技巧11: 交换两个字符 当输入“teh”时,可以用“xp”命令左右交换光标处两字符的位置来得到“the”。 ddp 上下交换光标处两行的位置。技巧12: “daw”和“dw”,“daw”和“diw”的区别当光标在一个词的中间时,用“dw”来删除整个单词,需要先把光标移动到单词到开头;而“daw”可以直接完成这个操做。 “daw”包括单词后面的空白字符而“iw”不包括。 这里的“aw”“iw”是两个文本对象,即 “a word”“Inner Sentence”。 文本对象还有:“as”,“is”,即“A Sentence”“ Inner Sentence”。 技巧1. 我在那个文件? 使用“:args”就行了。 显示类似: one.c [two.c] three.c,[ ]表示当前文件。要移动到最后一个文件:“:last” 要移动到第一个文件: “:first”] 技巧2. 编辑另一个文件列表 我想编辑另一个文件列表而不想退出 Vim 。 用如下命令编辑另三个文件: :args five.c six.c seven.h 技巧3. “mx”和“mX”的区别 “mx”命令(x表示小写字母):此标记只在此一个文件中有效。每个文件都有一个自己的标记集,这些标记都由这个文件专用。 “mX”命令(X表示大写字母):这种标记是全局的,他们可以在任何文件中使用。 技巧4. 另存为….. “:saveas xxx” xxx是你要保存的文件名。 技巧5. 对全部窗口进行操作 “:qall”和“:qall!”用于退出全部窗口; “:wall”全部保存; “:wqall”全部保存后退出vim; 技巧6. 很多编辑另一个文件的命令都有一个分割窗口的变量。对于命令模式,这通过前置一个“s”实现。例如“:tag”跳到一个标记,“stag”分割出一个新窗口并跳到那个标记。 对于普通模式,前置一个 CTRL-W 可以完成这个功能。例如,CTRL-^ 跳到备选文件,而 CTRL-W CTRL-^ 打开一个新窗口并编辑备选文件。 技巧7. 使用记录命令 现在看看你可以怎么用这些命令。假设你有如下文件名列表: stdio.h fcntl.h unistd.h stdlib.h 而你想它变成这样: #include “stdio.h” #include “fcntl.h” #include “unistd.h” #include “stdlib.h” 先移动到第一行,接着执行如下命令: qa 启动记录,并使用寄存器a ^ 移到行首 i#include “ 在行首输入“#include “”
$ 移到行末
a” 在行末加上双引号“””
j 移到下一行
q 结束记录
现在,你已经完成一个修改了,你可以通过重复三次“@a”完成余下的修改。

技巧8. 寄存器的扩展技巧
记录到一个大写寄存器表示扩展命令到对应的小写寄存器。
假设已经记录了一个修改一个单词的命令到寄存器c中。它可以正常工作,现在你需要加一个搜索命令以便找到下一个单词来修改。这可以通过如下命令来完成:
qC/wordq
这种方法在宏记录,拷贝和删除命令中都有效。例如,你需要把选择一些行到一个寄存器中,可以先这样拷贝第一行:
“aY
然后移到下一个要拷贝的地方,执行:
“AY
如此类推。这样在寄存器a中就会包括所有你要拷贝的行。

技巧1.替换命令中的范围的确定
方法1. 使用行号:
例如,“n,m” –从第n行到第m行;
“n” –第n行
“-3,$+5” –从上面第三行到文末倒数第五行的范围;
方法2. 使用匹配模式:
例如,“:?^Chapter?,/^Chapter/s=grey=gray=g”,为了避免斜杠使用的混淆,在这种情况下,“=”字符用于代替斜杠。使用斜杠或使用其他字符也是可以的。
方法3. 使用标记:
例如,先用“mt”标记开头,再用“mb”标记结尾。然后就可以用标记表示一个范围(包括标记的那一行):
:’t,’b
方法4. 使用可视模式:
先用V选定范围,再输入“:”会出现“:’”,现在,只需要输入剩下的命令;
注意:
如果使用可视模式选中行的一部分,或者用 CTRL-V 选中一个文本块,然后
执行冒号命令,命令仍作用于行范围,而不是选中的范围。这可能会在以后
的版本中修正。

技巧2. 使用全局命令
它允许你找到一个匹配点并且在上面执行一个命令。它的一般形式是:
“:[range]global/{pattern}/{command}”
例如:把“foobar”修改为“barfoo”,但只需要修改C++风格的注释中的内容。这种注释以“//”开头。所以可以使用如下命令:
“:g+//+s/foobar/barfoo/g”
注意:global中只能使用冒号命令。普通命令不能在这里使用,如果需要,可以使用normal命令。

技巧3. 改变大小写
“gu”–改为小写;“gugu”“guu”是把一行变为小写;
“gU”–改为大写;“gUgU”“gUU”是把一行变为大写;
“g~”–改变大小写;“g~g~”“g~~”是改变一行。
这三个命令都可以作用于“动作”命令,文本对象和可视模式。

技巧4. 使用外部命令的例子
例子1:对1到5行进行排序。
先把光标定位在第一行,然后执行下面的命令: “!5G”
现在光标移到了屏幕的底部,并显示一个“!”作提示符。
现在你可以输入过滤程序的名字,在本例中就是“sort”了。因此,你整个命令将是: !5Gsort
例子2:“!!date”
用“date”的输出代替当前行。这在为文件加入时间戳的时候非常有用。

技巧5. 读入一个命令的输出
要把当前目录的内容读进来,可以用如下命令:“:read !ls”;
加上一个“!”让Vim知道后面是一个命令。这些命令还可以带参数。
而且前面还可以带一个范围用于告诉Vim把这行放在什么地方:“:0read !date -u”

技巧6. 把文本输出到一个命令
要统计当前文件有多少行,可以这样:
“:write !wc”
注意不要错写成: :write! wc
这会强制把当前文件存到当前目录的“wc”中。在这里空白字符的位置是非常重要的。

技巧7. 单词统计
如果你需要计算的是整个文件的字数,先移到文件第一行开头,然后用这个命令:
“g”“CTRL-G”
可以使用可视模式,选中要计算字数的文本,然后输入“g CTRL-G”;

技巧8. 查阅man信息
把光标移到对应的单词上然后输入:“K”
如果需要在新窗口中打开Man手册,则需要使用加载man文件类型的外挂:
“:source $VIMRUNTIME/ftplugin/man.vim”
然后用“:Man”命令打开一个显示man手册的窗口。如“Man feof”“Man 3 echo”;
现在,还可以用“K”开个新窗口显示Man手册了。

快速键入命令行命令

技巧0. 更快速的键入命令
Vim 具备若干基本功能,以简化键入命令的工作。 你可以缩写,编辑和重复分号命令,
而补全功能几乎可以用于所有的场合。

当你用分号(:)命令或者用 / 或 ? 搜索一个字符串时, Vim 就会把光标置于屏幕下方,
你在那儿键入命令或者搜索模式, 此处即称为命令行, 也是用来输入搜索命令的地方。

技巧1. 移动

命令行上移动光标时最常用的键:

左移一个字符
右移一个字符
或 左移一个单词
或 右移一个单词
CTRL-B 或 命令行首位
CTRL-E 或 命令行末位

注意:
并非在所有键盘上都有效。其它 Shift 和 Control组合键也有这个问题。

技巧2 删除
除了删除键,外,还可以用;
CTRL-W 删除光标前整个单词用 ;
CTRL-U 删除命令行上全部文字, 从而让你从头开始;

技巧3. 取消
方法1:用键删除全部字符;
方法2: 用取消;
方法3: 用CTRL+C取消;

技巧4. 命令行缩写
有些 “:” 分号命令确实很长。幸运的是所有 “:” 分号命令都可以被缩写。
比如可以把置换命令 “:substitute”缩写成”:s”。
“:s”是“:substitute”的缩写,而不是“:set”的缩写,它的缩写是“:se”。
“:substitute”最简形式是 “:s”,不可能更简单,但可以更复杂,即 “:su” 和 “:sub” 都有效。
最短的有效缩写形式可以在帮助文件里找到。

技巧5. 命令行补全
命令和文件都能用补全,并且能针对上下文做智能判断。
比如:键入“:e”,会出现“:edit”,再按一次,成了“:echo”,这和shell中的不一样;
假设要编辑的文件是:“foo.txt”,则键入“:edit f”,就会显示出以“f”开头的文件。
再最后一个匹配文件名上按,会出现最初键入的内容,vim会在匹配表内周而复始地循环。
:依相反方向循环匹配列表;
:显示全部匹配;
:把词补全为最长无歧义字符串;

技巧6. 命令行历史
:用在命令行上已经键入的文本去跟历史记录里的命令作比较, 只有匹配的命令才被显示出来;
:回到较晚的命令,命令能帮你消除光标前的字符以便重新输入;
“:history” :显示”:” 分号命令的历史记录;
“:history /”:显示搜索命令的历史记录;
“q:”:打开命令行窗口;

离开和回来

技巧1. 挂起和继续
方法1:用 CTRL-Z 挂起vim程序,进入shell,最后用 “fg” 命令回到 Vim ;
方法2:当 CTRL-Z 不起作用时,可以用“:suspend”;
注意:别忘了把 Vim 引导回前台,否则你会失去所有的修改!

技巧2. 执行shell命令
方法1:使用CTRL+Z 挂起Vim;
方法2:“:shell”命令重开一个终端,“exit”退出后就返回;
方法2:”:!{command}”,比如:“:!ls”;
常用的“!”命令有:
:!{program} 执行 {program}
:r !{program} 执行 {program} 并读取其输出
:w !{program} 执行 {program} 传送文本至其输入
:[range]!{program} 经由 {program} 过滤文本

技巧3. 在编辑模式下执行命令
方法1:用退出编辑模式,进入命令模式;
方法2:用进入命令模式,执行完命令后返回编辑模式;

文件浏览器

技巧1. 文件浏览器怎么用?
“:edit .”:“.”表示当前路径,用其他路径也行;
编辑文件:移动到一个文件名上并按下 键;
进入该目录:移动到目录上并按下 键;
常用键:
“-“ 键 进入父目录“..”
o 开启一个新窗口
O 利用最近访问过的窗口
p 利用预览窗口, 并把光标撤回浏览器窗口

技巧2. 排序
i 显示文件大小和日期. 再执行一次 i 命令将隐藏这些信息
s 根据光标所在的字段排序, 先以 i 命令显示文件大小和日期,
然后把光标移到任一文件的一个字段上, 并按 s 键
r 逆转排列顺序 (大小或日期二者择一)

技巧3. 常用操作
c 把当前目录改成显示在窗口中的那个目录
:cd 改变当前目录
:pwd 发现哪个目录是当前目录
R 为光标下文件改名
D 删除光标下文件

技巧4. 查找文件
假设有一个 C 程序, 该程序有这样一行:

#include “inits.h”
想要查看文件 “inits.h” 里有些什么。
把光标移到该文件名上, 并键入: “gf”
Vim 就会找到并打开这个文件。

技巧5. 加密
方法1: “-x” 参数,比如“vim -x foo.txt”,读加密文件是不要加上“-x”参数;
方法2:“:set key=xxx”命令。“key”“key=”“key=”xxx””都是去掉密码的意思;
技巧:“””“”等有特殊意义的符号,写成“””“\”;
方法3:“:X”命令,好处在于不会以明文显示密码,同时也不用输入多余的“”符号;

技巧6. 加密的麻烦
麻烦1:Vim 采用的加密算法有弱点的,防止偷窥者是绰绰有余了, 但不足以防止一个手上有大量时间的密码专家
麻烦2:交换文件是不加密的; 所以当你在编辑文件时, 拥有超级用户权限的人是能够读取未经加密的来自这个文件的交换文件文本的,
可以使用“vim -x -n file.txt”或者“:setlocal noswapfile”来防止产生交换文件;
麻烦3:打开一个加密文件,然后输入错误密码,再对文件进行“:X”操作,这样,谁都没法看文件了。

二进制文件的一些技巧

技巧1. 打开二进制文件
打开二进制文件,要使用“-b”的参数,
这是为了不让vim对文件做任何改动,
vim是个聪明的程序,但不能用在这里;

技巧2. 用 Hex 格式来阅读字符
方法1:“:set display=uhex”命令;
方法2:“ga”命令显示光标下的字符值;

技巧3. 显示当前字节位置,和移到
“g CTRL-G”;
要移到文件中某个指定的字节,用“go”命令,

技巧4. 使用xxd外部程序
首先以二进制方式编辑这个文件:“vim -b datafile”
然后用 xxd把文件转换成十六进制:“:%!xxd”
显示效果:
0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ….9..;..tt.+NI
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`…..b..4^.0
Vim 把这些信息当作普通文本来对待,
注意,修改了十六进制部分并不导致可打印字符部分的改变, 反之亦然(能理解吗?);
最后, 记得把它转换回来:“:%!xxd -r”;
注意,只有十六进制部分的修改才会被采用,右边可打印文本部分的修改忽略不计。

技巧5. 可视模式下的重复
“gv” 命令再次选择上次选过的文本;

技巧6. 查找时忽略大小写
默认情况下, Vim 的查找是大小写敏感的;
方法1:
“:set ignorecase”关闭大小写敏感;
“:set noignorecase”重新开启;
“:set ignorecase smartcase”:
如果键入的字符串全是小写,说明忽略大小写;如果出现了大写字母,则说明是大小写敏感的;
方法2:
在模式前附加 “c” 字符串表示忽略一个特定的模式里的大小写;
附加 “C” 将使该模式的匹配大小写敏感;

技巧7. 折叠命令“zi”实用的操作方法:

  • 创建折叠, 以获取文件的全貌
  • 移动到要操作的地方
  • 执行“zi”以便一边看着文本, 一边编辑
  • 再执行“zi”以便移动到另一处

技巧8. 复制, 删除和粘贴折叠
可以把折叠看成一个单行来对其进行操作,比如这个实用操作:

  • 把光标置于被移文本的首行
  • 用“V”键开始可视模式
  • 把光标置于被移文本的末行
  • 用“d”键删除被选中的行
  • 把光标移到新位置, 用“p” 键把文本粘贴在那儿

技巧9. “%”使用技巧
假设有这样一段代码:

#ifdef USE_POPEN
fd = popen(“ls”, “r”)

#else
fd = fopen(“tmp”, “w”)

#endif
在“#ifdef” 处按“ %”,Vim 会跳转到“#else”;继续按“%”会跳转到“#endif”;再次按下“%”又回到“#ifdef”;
注意,使用“%”需要光标在“#”所在行;如果光标在代码内部,可以用“[#”“]#”命令向前向后跳转;

技巧10. 键入任意编码
编码 键入 范围
8-bit CTRL-V 123 decimal 0-255
8-bit CTRL-V x a1 hexadecimal 00-ff
16-bit CTRL-V u 013b hexadecimal 0000-ffff
31-bit CTRL-V U 001303a4 hexadecimal 00000000-7fffffff

技巧11. 在类内部用“[m” 找到前一个方法的开始;“]m” 找到下一个方法的开始。

技巧1. “.”的使用例子
假设要把“four”修改成“five”,有好几个地方要作这种修改。
操作步骤:
/four 找到第一个“four”
cwfive 修改成“five”
n 找下一个“four”
. 重复修改操作
n 找下一个“four”
. 重复修改
如此类推……

技巧2. 分割窗口的技巧
很多编辑另一个文件的命令都有一个分割窗口的变量。
对于命令模式,这通过前置一个“s”实现。例如“:tag”跳到一个标记,“stag”分割出一个新窗口并跳到那个标记。
对于普通模式,前置一个 CTRL-W 可以完成这个功能。例如,CTRL-^ 跳到备选文件,而 CTRL-W CTRL-^ 打开一个新窗口并编辑备选文件。

技巧3. 使用.vimrc文件
这个文件放在“~/” 下;
常用设置:
set fileencodings=cp936
set encoding=cp936
source $VIMRUNTIME/ftplugin/man.vim 用“:Man”“K”开个新窗口查看man手册
set incsearch 增量匹配
set showcmd 窗口右下角,标尺的右边显示未完成的命令
set display=uhex 以形式显示不可打印字符
set showmatch 显示匹配,如“()”“[]”
set ignorecase smartcase 智能忽略大小写,可以用“c”“C”指点是否忽略;