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、混合向上/向下搜索

posted @ 2012-07-03 07:27  小兔有点乖  阅读(732)  评论(0)    收藏  举报