×

vi 命令手册

vi/vim 命令大全

vim 命令手册

Vim 关于Vim 安装Vim 用法Vim 配置vim 配置.vimrc方案vim 配置.vimrc方案1vim 配置.vimrc方案2Vim 文件合并Vim 技巧和建议Vim 插件Vim 参阅

Vimscript 编程参考

Vimscript 前言Vimscript 鸣谢Vimscript 预备知识Vimscript 打印信息Vimscript 设置选项Vimscript 基本映射Vimscript 模式映射Vimscript 精确映射Vimscript LeadersVimscript 编辑你的Vimrc文件Vimscript AbbreviationsVimscript 更多的MappingsVimscript 锻炼你的手指本地缓冲区的设置和映射Vimscript 自动命令Vimscript 本地缓冲区缩写Vimscript 自动命令组Operator-Pending 映射Operator-Pending 更多映射Vimscript 状态条Vimscript 负责任的编码Vimscript 变量Vimscript 变量作用域Vimscript 条件语句Vimscript 比较Vimscript 函数Vimscript 函数参数Vimscript 数字Vimscript 字符串Vimscript 字符串函数Vimscript Execute命令Vimscript Normal命令Vimscript 执行normal!Vimscript 基本的正则表达式Grep 运算符Operator 第1部分Grep 运算符Operator 第2部分Grep 运算符Operator 第3部分Vimscript 列表Vimscript 循环Vimscript 字典Vimscript 切换Vimscript 函数式编程Vimscript 路径Vimscript 创建一个完整的插件Vimscript 基本插件配置方式用Pathogen配置插件Vimscript 检测文件类型Vimscript 基本语法高亮Vimscript 高级语法高亮Vimscript 基本折叠Vimscript 高级折叠Vimscript 段移动原理Vimscript Potion段移动Vimscript 外部命令Vimscript 自动加载Vimscript 文档Vimscript 发布Vimscript 还剩下什么?

Vimscript 自动命令


现在我们谈论一个跟映射一样重要的东西:自动命令。

自动命令可以让Vim自动执行某些指定的命令,这些指定的命令会在某些事件发生的时候执行。我们先看一个例子。

使用:edit foo打开一个新文件,然后立即使用:quit关闭。查看你的硬盘,你会发现这个文件并不存在。这是因为在你第一次保存这个文件之前,Vim_实际上_并没有真正创建它。

让我们对Vim做一些改变,使得Vim可以在你开始编辑文件的时候就创建它们。执行下面的命令:

:autocmd BufNewFile * :write

这里面有很多需要进一步说明的,不过在此之前我建议你先感受下它是怎么工作的。执行:edit foo,使用:quit关闭,然后查看硬盘。这个时候文件会存在(当然文件内容为空)。

你只有关闭Vim才能删除这个自动命令。我们会在后面的章节说明如何避免这种情况。

自动命令结构

让我们来深入分析下我们刚才创建的自动命令:

:autocmd BufNewFile * :write
         ^          ^ ^
         |          | |
         |          | 要执行的命令
         |          |
         |          用于事件过滤的“模式(pattern)”
         |
         要监听的“事件”

这个命令的第一部分是我们想监听的事件的类型。Vim提供了_很多_可以监听的事件。这些事件包括:

  • 开始编辑一个当前并不存在的文件。
  • 读取一个文件,不管这个文件是否存在。
  • 改变一个缓冲区的filetype设置。
  • 在某段时间内不按下键盘上面的某个按键。
  • 进入插入模式。
  • 退出插入模式。

上面只举出了可用事件里面的很小一部分。还有很多其他的事件,你可以利用这些事件来做一些有趣的事情。

这个自动命令的下一部分是一个“模式”,这个模式可以进一步限定你要执行的命令的执行范围。新开一个Vim实例,执行下面的命令:

:autocmd BufNewFile *.txt :write

这个跟之前的那个自动命令基本一样,不过这个自动命令只对后缀为.txt的文件有效,也就是说当你新建的文件为txt文件的时候,Vim会在文件创建的时候自动执行write命令将文件保存到硬盘上。

试试执行:edit bar,然后执行:quit,再执行:edit bar.txt,然后再执行:quit。你会发现Vim会自动创建bar.txt,但不会创建bar,因为它的后缀名不是txt,不跟模式匹配。

这个自动命令的最后一部分是事件发生时我们想执行的命令。这个部分很容易理解,跟我们执行其他命令一样,除了不能在这个命令中使用特殊的字符,例如。我们会在本书后面的章节中谈论如何突破这个限制,现在你只需要遵守它就可以。

再来一个示例

我们再定义一个自动命令,这次使用一个不同的事件。执行下面的命令:

:autocmd BufWritePre *.html :normal gg=G

这里用到了normal命令,我会在本书的后面的章节里面讲到它,这可能有点超前,不过我觉得这是一个很好的使用自动命令的示例,所以请大家先忍受一下。

创建一个名为foo.html的新文件。用Vim编辑它,并输入下面的文本,请保证输入的文本完全一致,包括空白符:



 

Hello!

执行:w保存这个文件。看看会发生了什么?Vim似乎在文件保存之前重新进行了文本缩进处理。

ok,请先相信我文本缩进处理是:normal gg=G干的,先别纠结于为什么:normal gg=G可以干这个。

我们_应该_把注意力放在自动命令上。这个自动命令里面用到的事件是BufWritePre,这个事件会在你保存_任何_字符到文件之前触发。

我们使用了*.html这个模式,这个模式会保证命令只会在编辑html文件的时候被执行。这就是自动命令强大的地方,因为它可以专门针对特定类型的文件来执行我们想要执行的命令。ok,让我们继续探索它吧。

多个事件

你可以创建一个绑定_多个_事件的自动命令,这些事件使用逗号分隔开。执行下面的命令:

:autocmd BufWritePre,BufRead *.html :normal gg=G

这个跟上面的自动命令基本一样,不同的是它会让Vim不仅在写html文件的时候进行缩进处理,读html文件的时候也会进行缩进处理。如果你有些同事不喜欢把HTML文件格式搞得漂亮点,那么这个命令会很有用。

在Vim脚本编程中有一个不成文的规定,你应该同时使用BufReadBufNewFile(译注:这里不是BufWritePre)这两个事件来运行命令,这样当你打开某个类型的文件,不论这个文件是否存在命令都会执行。执行下面的命令:

:autocmd BufNewFile,BufRead *.html setlocal nowrap

上面的命令会使得无论你在什么时候编辑HTML文件自动换行都会被关闭。

FileType事件

最有用的事件是FileType事件。这个事件会在Vim设置一个缓冲区的filetype的时候触发。

让我们针对不同文件类型设置一些有用的映射。运行命令:

:autocmd FileType javascript nnoremap  c I//
:autocmd FileType python     nnoremap  c I#

打开一个Javascript文件(后缀为.js的文件),将光标移动到某一行,敲击c,光标所在的那一行会被注释掉。

现在打开一个Python文件(后缀为.py的文件),将光标移动到某一行,敲击c,同样的那一行会被注释掉,不同的是此时所用的是Python的注释字符!

在自动命令中包含我们上一章中学到的本地缓冲区映射,我们可以创建一些映射,这些映射会根据我们正在编辑的文件的类型来进行不同的处理。

这可以为我们在编码的时候减轻很多思考的负担。如果要添加一个注释,我们可能想到的是必须将光标移动到行首,然后添加一个注释字符,而使用上面的映射,我们只需要简单的将其理解为“注释掉这一行”。

练习

浏览:help autocmd-events查看自动命令可以绑定的所有事件。你不需要现在就记住每一个事件。仅仅只需要了解下你可以使用这些事件做哪些事情。

创建一些FileType自动命令使用setlocal对你喜欢的文件类型做一些设置。你可以针对不同的文件类型设置wraplist、 spellnumber这些选项。

对一些你会经常处理的文件类型创建一些类似“注释掉这一行”的命令。

把所有这些自动命令写到你的~/.vimrc文件里面。记住使用前面章节中提到过的快速编辑和加载~/.vimrc文件的映射来做这个事情,这是必须的!


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)