⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usr_40.cnx

📁 Vim 中文文档
💻 CNX
📖 第 1 页 / 共 2 页
字号:
Vim 会显示 "Hello World"。 然而如果你加上一个双引号,就不行了。例如: >	:Say he said "hello"要把特殊字符变成一个字符串,必须在它们的前面加上反斜杠,用 "<q-args>" 就可以: >	:command -nargs=+ Say :echo <q-args>现在上面的 ":Say" 命令会引发下面的命令被执行: >	:echo "he said \"hello\""关键字 <f-args> 包括与 <args> 一样的信息,不过它将其转换成适用于函数调用的格式。例如:>	:command -nargs=* DoIt :call AFunction(<f-args>)	:DoIt a b c会执行下面的命令: >	:call AFunction("a", "b", "c")行 范 围有些命令的参数是一个范围。要告诉 Vim 你需要定义这样的一个命令,你得使用 -range选项。它可能的值如下:	-range		允许范围;缺省为当前行。	-range=%	允许范围;缺省为整个文件。	-range={count}	允许范围;其中的最后一个数字被用作一个缺省值为 {count}			的单独数字。 当一个范围被指定时,关键字 <line1> 和 <line2> 可以用来取得范围的首行和末行的行号。例如,下面的命令定义一个将指定的范围写入文件 "save_file" 的命令 -  SaveIt: >	:command -range=% SaveIt :<line1>,<line2>write! save_file其 它 选 项其它的一些选项有:	-count={number}		命令可以带一个数字,缺省为 {number}。				用 <count> 关键字可以使用该参数。	-bang			允许使用 !. 若出现,使用 <bang> 可以的结果				是一个 !.	-register		你可以指定一个寄存器。(缺省为				匿名寄存器。)				指定的寄存器可通过 <reg> (即 <register> ) 				来操作。.	-complete={type}	给处命令行补全的方式。				|:command-completion| 列出了所有可用值。	-bar			命令后可用 | 加另外一个命令,				或 " 加一个注释。	-buffer			命令仅对当前缓冲有效。最后,你还可以使用 <lt> 关键字来代表字符 <。重 定 义 和 删 除! 参数可以用来重新定义相同的命令: >	:command -nargs=+ Say :echo "<args>"	:command! -nargs=+ Say :echo <q-args>要删除自定义命令,使用 ":delcommand"。 该命令只带一个参数,那就是自定义命令的名字。例: >	:delcommand SaveIt要一次删所有自定义命令: >	:comclear要当心!这个命令无法取消。有关所有这些的更多信息,参阅: |user-commands|。==============================================================================*40.3*	自动命令自动命令是一类特殊的命令。当某些事件,例如文件读入或改变缓冲等事件发生时,它们会自动被执行。例如,通过自动命令你可以教 Vim 来编辑压缩文件。这个功能被用在|gzip| 插件里。   自动命令非常强大。如果你小心使用的话,自动命令可以省去你很多自己敲命令的麻烦。如果不当心的话你就是自找麻烦。假设你希望在每次写入文件时自动的替换文件尾部的日期戳。先定义一个函数: >	:function DateInsert()	:  $delete	:  read !date	:endfunction你需要在每次写入文件之前想办法调用该函数。下面这一行就能做到: >	:autocmd FileWritePre *  call DateInsert()"FileWritePre" 是这个自动命令的触发事件:写文件前(pre)。 "*" 是一个用来匹配文件名的模式。这儿它匹配所有文件。   如果这个命令生效,当你做 ":write", Vim 检查是否有匹配 FileWritePre 事件的自动命令并执行它们。然后才执行 ":write"。   通用的 :autocmd 命令格式如下: >	:autocmd [group] {events} {file_pattern} [nested] {command}组名  [group] 是可选的。它被用来管理和调用命令(后面再讲)。 {events} 参数是一个触发事件列表 (用逗号隔开)。   {file_pattern} 是文件命令,通常带有通配符。例如,用 "*.txt" 会使得自动命令对所有文件名以 ".txt" 结尾的文件被调用。 选项 [nested] 运行自动命令的嵌套(见下)。最后,{command} 是要被执行的命令。事 件最有用的事件之一是 BufReadPost。 它在一个文件被调入编辑之后被触发。常被用来设定相关的选项。例如,你已知 ".gsm" 文件是 GNU 汇编程序源码。为确保使用正确的语法文件,可以定义这样的自动命令: >	:autocmd BufReadPost *.gsm  set filetype=asm如果 Vim 能够正确的识别文件类型的话,它将为你设定 'filetype' 选项。这会触发Filetype 事件。你可以利用这个来为某一类型的文件做编辑的准备工作。例如,要为纯文文件调入一组缩写: >	:autocmd Filetype text  source ~/.vim/abbrevs.vim在开始编辑一个新文件时,你可以要求 Vim 插入一个模板: >	:autocmd BufNewFile *.[ch]  0read ~/skeletons/skel.c在 |autocmd-events| 可以找到一个完整的事件列表。匹 配 模 式 那个 {file_pattern} 参数实际上可以是一个以逗号分割开的模式列表。例如: "*.c,*.h"匹配所有文件名以 ".c" 和 ".h" 结尾的文件。   常见的通配符都可以使用。这里给出一个最常用的清单:	*		匹配任意字符,任意多次	?		匹配任意字符,一次	[abc]		匹配 a, b 或 c	.		匹配一个点 .	a{b,c}		匹配 "ab" 和 "ac"当模式包括一个斜杠 (/) 时 Vim 会同路径名作比较。否则只有文件名的最后部分才用来作比较。例如, "*.txt" 匹配 "/home/biep/readme.txt"。 模式 "/home/biep/*" 也可以匹配那个文件。但是 "home/foo/*.txt" 就不行。   当包括一个斜杠时,Vim 会试着匹配文件 ("/home/biep/readme.txt") 的完整路径和相对路径 (例如: "biep/readme.txt")。	Note:	当在使用反斜杠作为文件分割符的系统 (如 MS-Windows) 上工作时,你也得在	自动命令中使用正斜杠。因为反斜杠有特殊的意义,这会使编写匹配模式变得容	易些。同时也使自动命令更据可以移植性。删 除要删除一个自动命令,使用和定义它一样的命令格式。但不要包括后面的 {command}部分,而且要加上 !。  例如: >	:autocmd! FileWritePre *这样会删除为 "FileWritePre" 事件定义的匹配 "*" 文件名模式的所有自动命令。列 表要列出当前定义的所有自动命令,用这个: >	:autocmd这个列表可能会相当长,特别是在使用了文件类型检测时。你可以指定组,时间和/或文件名模式来要求仅列出相关的命令。例如,要列出所有 BufNewFile 事件的自动命令: >	:autocmd BufNewFile列出所有匹配文件名模式 "*.c" 的命令: >	:autocmd * *.c使用 "*" 作为事件会给出所有事件的列表。要列出 cprograms 组对应的自动命令: >	:autocmd cprograms当定义自动命令时用到 {group} 这一项时,自动命令会被分成组。比如说,这可以被用来删除一个组中的所有命令。   在为某一个组定义数个自动命令时,可以使用 ":augroup" 命令。例如,我们来定义一些用于 C 程序的自动命令: >	:augroup cprograms	:  autocmd BufReadPost *.c,*.h :set sw=4 sts=4	:  autocmd BufReadPost *.cpp   :set sw=3 sts=3	:augroup END这和下面的命令有一样的效果: >	:autocmd cprograms BufReadPost *.c,*.h :set sw=4 sts=4	:autocmd cprograms BufReadPost *.cpp   :set sw=3 sts=3要删除 "cprograms" 组中的所有自动命令: >	:autocmd! cprograms嵌 套一般的,某一事件触发的自动命令在被执行时不会再触发其它事件。例如,当因FileChangedShell 事件而读入一个文件时,那些被定义来设定语法的自动命令就不会被触发。要是那些命令被触发的话,加上一个 "nested" 参数: >	:autocmd FileChangedShell * nested  edit执 行 自 动 命 令Vim 允许你用模拟某一事件发生的办法了触发一个自动命令。这可以用来用一个自动命令来触发另外一个。例如: >	:autocmd BufReadPost *.new  execute "doautocmd BufReadPost " . expand("<afile>:r")这定义了一个被编辑新文件事件触发的自动命令。这个文件的文件名必须以 ".new" 结尾。 其中的 ":execute" 命令利用表达式求值来组成一个新的命令并执行之。当编辑文件 "tryout.c.new" 时被执行的命令将是: >	:doautocmd BufReadPost tryout.cexpand() 函数的参数是 "<afile>",用来代表自动命令执行所关联的文件。":r" 指定仅使用其根部分。":doautocmd" 执行于当前缓冲。":doautoall" 命令于 "doautocmd" 命令类似但执行于所有缓冲。使 用 普 通 模 式 命 令自动命令所执行的命令是 "命令行" 命令。如果你想在其中执行普通模式命令,可以使用":normal" 命令。例如: >	:autocmd BufReadPost *.log normal G这样,当你编辑 *.log 文件时 Vim 会将光标移动到最后一行。   使用 ":normal" 命令需要点技巧。首先,你要确保其参数是一个包括所有参数的完整命令。当你用 "i" 进入插入模式时,你必须用 <Esc> 离开。如果你用 "/" 来开始查找,你也必须用 <CR> 执行该查找命令。   ":normal" 命令会使用其后的所有文本作为将要执行的命令。因此不可能用 | 来后缀另一个命令。有个办法可以绕过这个约束:把 ":normal" 命令放在 ":execute" 命令之内。这同时也使得传入不能打印的字符作为参数变得简单。例如: >	:autocmd BufReadPost *.chg execute "normal ONew entry:\<Esc>" |		\ 1read !date上面的例子还展示了如何用反斜杠来将一个长命令分为几行。这可以用在 Vim 脚本中 (不能用在命令行)。如果你想让你的自动命令作一些复杂的操作,例如在文件间跳转,然后回到原来位置等,你可以恢复该文件的视图。 |restore-position| 有些例子。忽 略 事 件有些时候,你并不想触发自动命令。 'eventignore' 选项包括了一组会被 Vim 完全忽略的事件。例如,下面的命令会使得进入和离开窗口的事件被忽略掉: >	:set eventignore=WinEnter,WinLeave要忽略所有的事件,用下面的命令: >	:set eventignore=all要恢复到正常的状态,把 'eventignore' 设定为空即可: >	:set eventignore===============================================================================下一章: |usr_41.txt|  编写 Vim 脚本Copyright: see |manual-copyright|  vim:tw=78:ts=8:ft=help:norl:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -