Vim常用命令小记(2)——编辑文件
基本命令
:keepalt {cmd} 执行 {cmd},在此期间保持当前轮换文件名不变。间接调用的命令 (比如通过函数) 仍然可以设置轮换文件名。
CTRL-G 或 :f[ile] 显示当前文件名 、光标位置和文件状态。
:f[ile]! 和 ":file" 类似,但不会截短文件名。
{count}CTRL-G 和 CTRL-G 类似,但显示当前文件名的完整路径。如果计数大于 1,则同时给出当前缓冲区号。
g CTRL-G 显示当前光标位置,以五种方式表达: 列、行、单词、字符和字节计数。如果字符数和字节数相同,省略字符位置。
如果当前行有字符占据多于一个位置 (<Tab> 或其他特殊字符),"实际" 列和屏幕列同时显示,以连字号分隔。
{Visual}g CTRL-G 和 "g CTRL-G" 类似,但显示可视选择区域的单词、字符、行和字节计数。在面向列块模式里,列数也同时显示。
:f[ile][!] {name} 设置当前文件名为 {name}。可选的 ! 避免截短消息,就像 ":file" 那样。
如果缓冲区已有名字,该名字成为轮换文件名。新建一个列表外缓冲区来记住这个旧名字。
:0f[ile][!] 删除当前缓冲区的名字。可选的 ! 避免截短消息,就像 ":file" 那样。
:buffers 或 :files 或:ls 列出当前已知的文件名。
编辑单个文件
:e[dit] [++opt] [+cmd] 编辑当前文件。可用于在它被 Vim 之外的程序所改变的时候重新编辑当前文件。
如果当前缓冲区已经被修改而且没有置位 'autowriteall',或者文件不能被写入,本命令失败。
:e[dit]! [++opt] [+cmd] 强制重新编辑当前文件。放弃当前缓冲区任何已有的改变。
如果想从头来过,这就会很有用。
:e[dit] [++opt] [+cmd] {file} 编辑文件 {file}。
如果当前缓冲区已被修改,这会失败,除非置位了 'hidden' 或者 'autowriteall' 并且文件能够写入。
:e[dit]! [++opt] [+cmd] {file} 强制编辑文件 {file}。放弃当前缓冲区任何已有的改变。
:e[dit] [++opt] [+cmd] #[count] 编辑第 [count] 个缓冲区 (根据 :files 显示的结果)。
该命令和 [count] CTRL-^ 一样,但 ":e #" 在轮换缓冲区没有文件名无效,而 CTRL-^ 则可以。
:ene[w] 编辑一个新的无名缓冲区。
如果当前缓冲区已被修改,这会失败,除非置位了 'hidden' 或者 'autowriteall' 并且文件能够写入。
如果 'fileformats' 非空,其给出的第一个格式将用于新的缓冲区上。
如果 'fileformats' 为空,则使用当前缓冲区的 'fileformat'。
:ene[w]! 编辑新的无名缓冲区。放弃当前缓冲区任何已有的改变。
'fileformat' 的设置类似于 ":edit"。
:fin[d][!] [++opt] [+cmd] {file} 在 'path' 里找到 {file},然后编辑它。
:{count}fin[d][!] [++opt] [+cmd] {file} 和 ":find" 类似,但使用 'path' 的第 {count} 个匹配。
如果 'path' 里文件的匹配不足所需之数,将产生一个错误消息。
:ex [++opt] [+cmd] [file] 和 ":edit" 相同。
:vi[sual][!] [++opt] [+cmd] [file] 不使用 Ex 模式时和 ":edit" 相同。
:vie[w][!] [++opt] [+cmd] file 不使用 Ex 模式时和 ":edit" 相同。但为本缓冲区置位 'readonly' 选项。
CTRL-^ 编辑轮换文件 (和 ":e #" 等价)。
多数情况下,轮换文件就是上次编辑的文件。这是切换两个文件的一个快速方法。
如果 'autowrite' 或 'autowriteall' 选项打开并且缓冲区被修改,则写入文件。
大多数情况下,^ 字符在键 6 之上,同时按 CTRL 和 6 即可。
[count]CTRL-^ 编辑缓冲区列表里第 [count] 个文件 (和 ":e #[count]" 等价)。
[count]gf 编辑光标之上或之后的文件名。
'isfname' 选项来决定组成文件名的字符。拖尾的标点符号 ".,:;!" 被忽略。
在 'path' 选项组成的目录名列表查找文件。
{Visual}[count]gf 和 "gf" 相同,但是高亮文本被用来作为要编辑的文件名。
'isfname' 被忽略。开头的空白被忽略,除此以外,所有的空白和特殊字符被包括在文件名里。
[count]gF 和 "gf" 相同,但如果文件名后面跟随着数值,那么光标将定位在该文件名的该行上。
文件名和数值之间必须以一个非文件名 (见 'isfname') 和非数字字符分隔。
文件名、分隔符和数值之间的空白被忽略。
{Visual}[count]gF 和 "v_gf" 相同。
参数列表
:ar[gs] 显示参数列表,当前文件以方括号表示。
:ar[gs] [++opt] [+cmd] {arglist} 定义 {arglist} 为新的参数列表并编辑其中的第一个。
如果已经作了修改而 vim 不能放弃当前的缓冲区,该命令失败。
:ar[gs]! [++opt] [+cmd] {arglist} 定义 {arglist} 为新的参数列表并编辑其中的第一个。
忽略任何对当前缓冲区的改动。
:[count]arge[dit][!] [++opt] [+cmd] {name} 将 {name} 加到参数列表里,并编辑之。
如果 {name} 已经在参数列表里存在,只编辑之。
只允许单个文件名,文件名里的空格是允许的。
[count] 的用法和 ":argadd" 一样。
[!] 忽略任何对当前缓冲区的改动。
:[count]arga[dd] {name} .. 将若干文件名 {name} 等加到参数列表里。
如果忽略 [count], {name} 等添加到参数列表当前项之后。否则,加到第 [count] 个文件之后。
这里不会检查重复项,因此一个文件可能加入参数列表两次。
不改变当前编辑的文件。
:argd[elete] {pattern} .. 从参数列表里删除匹配 {pattern} (可有多个) 的文件。
{pattern} 为文件模式。"%" 可以用来删除当前入口项。
即使该命令从参数列表里删除了当前编辑文件,该文件仍然保持被编辑。
:{range}argd[elete] 从参数列表里删除 {range} 范围里的文件。
:[count]argu[ment] [count] [++opt] [+cmd] 编辑参数列表里的第 [count] 个文件。
在忽略 [count] 的时候,编辑当前入口项。
如果已经作了修改而 vim 不能放弃当前的缓冲区,该命令失败。
:[count]argu[ment]! [count] [++opt] [+cmd] 编辑参数列表里的第 [count] 个文件。
在忽略 [count] 的时候,编辑当前入口项。
忽略任何对当前缓冲区的已有修改。
:[count]n[ext] [++opt] [+cmd] 编辑向后第 [count] 个文件。
如果已经作了修改而 vim 不能放弃当前的缓冲区,该命令失败。
:[count]n[ext]! [++opt] [+cmd] 编辑向后第 [count] 个文件。
忽略任何对当前缓冲区的已有修改。
:n[ext] [++opt] [+cmd] {arglist} 和 ":ar[gs] [++opt] [+cmd] {arglist}" 相同。
:n[ext]! [++opt] [+cmd] {arglist} 和 ":ar[gs]! [++opt] [+cmd] {arglist}" 相同。
:[count]N[ext] [count] [++opt] [+cmd] 编辑向前第 [count] 个文件。
如果已经作了修改而 vim 不能放弃当前的缓冲区,该命令失败。
:[count]N[ext]! [count] [++opt] [+cmd] 编辑向前第 [count] 个文件。
忽略任何对当前缓冲区的已有修改。
:[count]prev[ious] [count] [++opt] [+cmd] :Next 相同。
:rew[ind] [++opt] [+cmd] 开始编辑参数列表的第一个文件。
如果已经作了修改而 vim 不能放弃当前的缓冲区,该命令失败。
:rew[ind]! [++opt] [+cmd] 开始编辑参数列表的第一个文件。
忽略任何对当前缓冲区的已有修改。
:fir[st][!] [++opt] [+cmd] ":rewind" 的别名。
:la[st] [++opt] [+cmd] 开始编辑参数列表的最后一个文件。
如果已经作了修改而 vim 不能放弃当前的缓冲区,该命令失败。
:la[st]! [++opt] [+cmd] 开始编辑参数列表的最后一个文件。
忽略任何对当前缓冲区的已有修改。
:[count]wn[ext] [++opt] 写回当前文件并开始编辑向后第 [count] 个文件。
:[count]wn[ext] [++opt] {file} 写入当前文件到 {file} 并开始编辑向后第 [count] 个文件。
如果 {file} 已经存在并且 'writeany' 选项被关闭,该命令失败。
:[count]wn[ext]! [++opt] {file} 写入当前文件到 {file} 并开始编辑向后第 [count] 个文件。
:[count]wN[ext][!] [++opt] [file] 或 :[count]wp[revious][!] [++opt] [file] 和 :wnext 相同,向前编辑而不是向后。
:argl[ocal] 复制一个全局参数列表的局部备份。并不开始编辑另外一个文件。
:argl[ocal][!] [++opt] [+cmd] {arglist} 定义一个新的局部于当前窗口的参数列表。
:argg[lobal] 当前窗口使用全局参数列表。并不开始编辑另外一个文件。
:argg[lobal][!] [++opt] [+cmd] {arglist} 当前窗口使用全局参数列表。
定义一个新的全局参数列表。所有使用全局参数列表的窗口都会看到这个新的列表。
:argdo[!] {cmd} 对参数列表里的每个文件执行 {cmd}。
如果当前文件不能被放弃而且不存在 [!],该命令失败。
如果一个文件检测到错误,参数列表里的其余文件将不再被操作。
参数列表里的最后一个文件 (或发生错误的那个) 成为当前文件。
{cmd} 可以包含 '|',从而连接多个命令。
{cmd} 不可修改参数列表。
以上命令的 [count] 缺省为 1。对有些命令可以使用两个计数。后者 (右面那个) 被使用。
写入与退出
如果 'write' 选项关闭,你不能写入任何文件。
:w[rite] [++opt] 将整个缓冲区写入当前文件。这是保存文件更动最普通的方式。
如果置位了 'readonly' 选项或者其他原因不能写入文件,它会失败。
:w[rite]! [++opt] 和 ":write" 类似。即使 'readonly' 已置位或者有其他原因写入被拒绝,还是强制写入。
'cpoptions' 里加 'W' 标志位避免改变文件的权限和所有者,或者破坏 (符号) 连接。
:[range]w[rite][!] [++opt] 将指定行写入当前文件。文件里将不会包含缓冲区的所有行。
:[range]w[rite] [++opt] {file} 将指定行写入文件 {file}。
如果 {file} 已经存在并且 'writeany' 选项被关闭,该命令失败。
:[range]w[rite]! [++opt] {file} 将指定行写入文件 {file},覆盖已存在的文件。
:[range]w[rite][!] [++opt] >> 将指定行附加到当前文件后。
:[range]w[rite][!] [++opt] >> {file} 将指定行附加到文件 {file} 之后。
'!' 强制写入,即使该文件还不存在。
:[range]w[rite] [++opt] !{cmd} 执行命令 {cmd},以 [range] 指定的行作为它的标准输入。(! 之前有空格)
{cmd} 以 ":!{cmd}" 类似的方式被执行,任何 '!' 被替换成前一个命令 ":!"。
:sav[eas][!] [++opt] {file} 用文件名 {file} 保存当前缓冲区,并设置当前缓冲区的文件名为 {file}。
前一个名字用作轮换文件名。
[!] 用以覆盖已存在的文件。
如果 'filetype' 为空,在写入文件前用新名字进行文件类型检测。
如果写操作成功,复位 'readonly'。
:[range]up[date][!] [++opt] [>>] [file] 和 ":write" 类似,但只有在缓冲区已修改的时候才写入。
:wa[ll] 保存所有已修改的缓冲区。没有文件名或者只读的缓冲区不在此列。
:wa[ll]! 保存所有已修改的缓冲区。即使是只读的。但没有文件名的缓冲区仍不会写入。
:q[uit] 退出当前窗口。如果是最后的一个窗口,退出 Vim。
如果已经有修改而且 Vim 拒绝放弃当前的缓冲区,或者参数列表的最后一个文件还没有被编辑,该操作失败。
如果有其它标签页,并且退出的是当前标签页的最后一个窗口,关闭当前标签页。
:conf[irm] q[uit] 退出,但如果已经有修改或者参数列表的最后一个文件还未被编辑,给出对话框提示。
:q[uit]! 退出不保存,即使有可见的缓冲区发生了修改。不适用于隐藏的缓冲区。
为了保证总能退出,可使用 ":qall!"。
:cq[uit] 在任何情形下,退出不保存,并返回一个错误代码。
:wq [++opt] 写回当前的文件并且退出。
如果文件只读或者该缓冲区无名,写回操作将失败。
如果参数列表的最后一个文件还没有编辑,那么退出操作将会失败。
:wq! [++opt] 写回当前的文件并且退出。
如果当前缓冲区无名,则写回操作将失败。
:wq [++opt] {file} 写入到 {file} 并且退出。
如果参数列表的最后一个文件还没有编辑, 那么退出操作将会失败。
:wq! [++opt] {file} 写入到 {file} 并且退出。
:[range]wq[!] [++opt] [file] 同上,但只写入 [range] 界定的那些行。
:[range]x[it][!] [++opt] [file] 和 ":wq" 类似, 但只有文件已修改时写入才会实际进行。
如果 'hidden' 被设置并且还有其他窗口,当前缓冲区会在写入后被隐藏。
:[range]exi[t][!] [++opt] [file] 同 :xit。
ZZ 如果文件被修改,写回当前文件。然后退出。(和 :x 相同)。
如果有当前文件有多个窗口,该文件在被修改时会被写回,当前窗口会被关闭。
ZQ 退出,不检查是否发生了修改 (等同于 ":q!")。
:qa[ll] 退出 Vim,除非存在修改过的缓冲区。(可以使用 ":bmod" 跳转到下一个修改过的缓冲区)。
如果置位了 'autowriteall',所有被修改的缓冲区将被保存,一如调用了 |:wqall|。{Vi 无此功能}
:conf[irm] qa[ll] 退出 Vim。如果存在修改过的缓冲区,给出提示。
:qa[ll]! 退出 Vim,不会保存任何的修改。
:quita[ll][!] 等同于 ":qall"。
:wqa[ll] [++opt] 或 :xa[ll] 保存所有修改过的缓冲区并退出 Vim。
如果其中有无名的、只读的、或者其他原因写入失败的缓冲区,Vim 不会退出。
:conf[irm] wqa[ll] [++opt] 或 :conf[irm] xa[ll] 保存所有修改过的缓冲区并退出 Vim。
如果其中有只读或者其他原因写入失败的缓冲区,给出提示。
:wqa[ll]! [++opt] 或 :xa[ll]! 保存所有修改过的缓冲区,甚至包括只读的,然后退出 Vim。
如果有无名或者其他原因写入失败的缓冲区,Vim 仍然不会退出。
对话框
:conf[irm] {command} 执行 {command},如果有操作需要确认,显示对话框。
可用于 ":q"、":qa" 和 ":w" 命令 (后者用于超越只读的设定)。
:bro[wse] {command} 为 {command} 的参数显示文件选择对话框。
如果所用的 Vim 版本不支持浏览,该命令照原样执行。
当前目录
用 ":cd" 和 ":lcd" 命令换到别的目录,就可以不用总是在文件名前输入目录名。这也影响到外部命令的执行。
:cd[!] 在非 Unix 系统上: 显示当前目录名。在 Unix 系统上: 改变当前目录到主 (home) 目录。
影响到外部命令的执行。
:cd[!] {path} 切换当前目录为 {path}。
如果 {path} 是相对路径,则在目录列表 ('cdpath') 列出的目录搜索之。
这不会改变已经打开的文件,因为记住的是它们的完整路径。但参数列表里的文件则可能会改变。
MS-DOS 上这会同时改变当前的驱动器。
影响到外部命令的执行。
:cd[!] - 切换到上一个当前目录 (在上个 ":cd {path}" 命令之前)。
:chd[ir][!] [path] 和 ":cd" 相同。
:lc[d][!] {path} 和 ":cd" 类似,但只设置当前窗口的当前目录。别的窗口的当前目录保持不变。
影响到外部命令的执行。
:lch[dir][!] 和 ":lcd" 相同。
:pw[d] 显示当前目录名。
相关概念
用 Vim 编辑一个文件意味着:
1. 把该文件读到缓冲区
2. 用编辑器命令修改缓冲区
3. 把缓冲区内容写回文件
----------------------------------------
{file} 里的通配符被扩展。支持什么通配符由系统决定。以下是一些通用的字符:
? 匹配一个字符
* 匹配任何东西,包括什么都没有
** 匹配任何东西,包括什么都没有,递归进入目录
[abc] 匹配 'a'、'b' 或 'c'
要避免通配符的特殊含义,在前面加上反斜杠。
----------------------------------------
[++opt] 参数可以用来为某个命令强制指定 'fileformat'、'fileencoding' 或 'binary' 的值,并指定遇到坏字符的行为。其形式是: ++{optname} 或 ++{optname}={value}。
其中 {optname} 是以下之一:
ff 或 fileformat 超越 'fileformat' 之值
enc 或 encoding 超越 'fileencoding' 之值
bin 或 binary 置位 'binary'
nobin 或 nobinary 复位 'binary'
bad 指定坏字符的行为
edit 只用于 ":read": 保持选项的值,就像编辑文件那样
{value} 不能包含空白。它可以是这些选项任何可取之值。
可以用多个 ++opt 参数,以空格分隔。它们都必须在任何 "+cmd" 参数之前。
参数"++bad=" 指定遇到不能转化或者包含非法字节的字符时的行为。它可以是以下三种形式之一:
++bad=X 单字节的字符,替代每个坏字符。
++bad=keep 保留坏字符,不予转化。这可能使得你的文本里出现非法字节!
++bad=drop 删除坏字符。
缺省就像用了 "++bad=?" 一样: 每个坏字符被问号代替。有些地方会使用一个倒转的问号。
不是所有的命令都接受 ++bad 参数,但也不会报错,例如 ":write"。
在读入文件时,'fileformat' 和 'fileencoding' 选项会被设为实际所用的格式。在写回时,这不会发生。因此下一次写会使用选项的旧值。'binary' 选项也同样如此。
'fileformat' 选项指定文件里的换行符 (<EOL>) 风格:
"dos" <CR><NL> 或 <NL> DOS 格式
"unix" <NL> Unix 格式
"mac" <CR> Mac 格式
在读入文件时,以上列出的字符被解释为换行符。当写入文件时,换行符用以上列出的字符写入。
在开始编辑二进制、可执行或 Vim 脚本文件时,你应该置位 'binary' 选项。一个简单的方式是以 "-b" 选项启动 Vim。该选项可以避免使用 'fileformat'。如果不设,将会面临有单个 <NL> 字符被莫名其妙地换成 <CR><NL> 的风险。
----------------------------------------
[+cmd] 参数可以用来在新打开的文件定位光标或执行任何其他命令:
+ 从最后一行开始。
+{num} 从第 {num} 行开始。
+/{pat} 从匹配 {pat} 的第一行开始。
+{command} 打开新文件以后执行 {command}。{command} 可以是任何 Ex 命令。
要在 {pat} 或 {command} 里包含空白,在它之前加上反斜杠。反斜杠本身则要加倍。
----------------------------------------
参数列表:
如果在启动 Vim 的时候给出多个文件名,这些文件将被记住,即参数列表。你可以跳转到该列表里的任何一个文件。
参数列表与缓冲区列表的不是同一个概念,但参数列表里的文件名会出现在缓冲区列表里存在。
只有一个全局参数列表,所有窗口缺省都使用它。但可以创建局部于窗口的新参数列表。
----------------------------------------
浏览对话框的过滤 (filter):
设置 g:browsefilter 或 b:browsefilter 变量,可以修改全局或局部于缓冲区的过滤设置。
变量应设为符合如下格式的字符串 "{过滤标签}\t{pattern};{pattern}\n"。其中的 {过滤标签} 是出现 "Files of Type" 组合框里应出现的文字,而 {pattern} 是过滤文件名的模式。可以给出多个模式,以 ";" 分隔。
----------------------------------------
三种不同类型的搜索:
1、向下搜索:
向下搜索使用 '*'、'**' 或其他操作系统支持的通配符。
'*' 和 '**' 是由 Vim 内部处理的,以适用于所有操作系统。
"**" 只在文件名开始处才被当作特殊的通配符。
'*':
匹配 0 个或更多字符。如果用搜索模式,应该是 ".*"。但文件搜索不使用 "." 元字符。
'**':
- 只匹配目录。
- 匹配缺省最多可达 30 层的目录。所以你可以用它整个目录树里查找
- 最大匹配的层数可以通过在 '**' 之后给出数字限定。
允许的数字范围是 0 ('**0' 被直接去掉) 到 100。如果给定的数字小于 0,则缺省为 30。
如果大于 100,则使用 100。系统本身还有路径长度的上限,通常是 256 或 1024 字节。
- '**' 只能用于路径的尾部,或者后面紧跟一个路径分隔符,或者后面紧跟一个数字加一个路径分隔符。
2、向上搜索:
这里,你可以给出一个目录,然后沿着目录树向上搜索一个文件。你可以给出若干终止目录来限制搜索的范围。
终止目录附加于路径 (对 'path' 选项而言) 或文件名 (对 'tags' 选项而言) 之后,中间以 ";" 分隔。
如果需要多个终止目录,一一列出,以 ';' 分隔。
如果你不想要终止目录 (搜索直到根目录),只要用 ";"。
3、混合向上/向下搜索

浙公网安备 33010602011771号