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