有条件地运行vim格式化程序

时间:2018-02-15 11:28:10

标签: vim vi

我有一个回调设置,在保存缓冲区后自动格式化代码(取决于文件类型)。我想在很长的文件中避免这种行为。当文件长于N行时,是否可以使:w:noa w的行为相同?

1 个答案:

答案 0 :(得分:2)

直接实施您的要求是通过映射:w。通过使用:help map-expr,您可以动态地对条件做出反应(这里:缓冲区中的行数):

:nnoremap <expr> :w ':' . (line('$') >= 1000 ? 'noa ' : '') . 'w'

请注意,有更强大的方法可以覆盖内置的Ex命令。 (例如cmdalias.vim - Create aliases for Vim commands。)

推荐替代

映射的优点是你可以直接看到它有什么效果(尽管你必须记住:noautocmd在这里有什么效果),你可以轻易地影响/覆盖它。

但是,它不适用于直接调用:update的映射或插件。我宁愿修改回调设置。你可能有像

这样的东西
:autocmd BufWritePost <buffer> call AutoFormat()

我会引入一个保护它的布尔标志:

:autocmd BufWritePost <buffer> if exists('b:AutoFormat') && b:AutoFormat | call AutoFormat() | endif

然后设置一个初始化它的钩子:

:autocmd BufWritePre <buffer> if ! exists('b:AutoFormat') | let b:AutoFormat = (line('$') < 1000) | endif

这样,您可以看到是否启用了自动格式化(您甚至可以将b:AutoFormat放入状态行),并且可以通过操作标志来调整行为:

:let b:AutoFormat = 0   " Turn off auto-formatting even though the buffer is small.
:let b:AutoFormat = 1   " Force auto-formatting even though it's a large buffer.