在 vim 中,如何将文件类型的自动命令应用于文件的某个区域?
-
02-01-2020 - |
题
我有一种多语言文件类型,可以嵌入 C、Python、Ruby 等(如果有帮助的话,请考虑“维基页面”)。有没有办法在文件区域上执行已知文件类型的自动命令?
例如,我可能有:
#!bash
if [ a = b ]; then
echo 'equal'
fi
#!python
if a = b:
print('equal')
我想将 bash 文件类型自动命令应用于第一部分,将 python 文件类型自动命令应用于后一部分。
我可以通过使用定义一个区域来获得语法高亮 这 方法,但我对自动命令的理解还不够,无法以类似的方式应用它们。
解决方案
自动执行此操作具有挑战性,因为文件类型设置是缓冲区本地的;Vim 没有区域的概念,所以 :autocmds
正如您所正确指出的那样,需要使用。
快捷方便
使用类似的插件 NrrwRgn - 类似于 Emacs 的窄区域插件, ,您可以克隆区域以单独的暂存缓冲区;该插件会在写入时自动将它们同步回来。每个缓冲区可以通过以下方式指定一个单独的文件类型 :setf
.
更简单的方法是定义一些映射来快速切换文件类型:
:nnoremap <Leader>fp :setf python<CR>
:nnoremap <Leader>fs :setf sh<CR>
单个缓冲区中真正独立的区域
这个草图很简单:
:autocmd CursorMoved,CursorMovedI <buffer> if line('.') >= 6 | setf python | else | setf sh | endif
这依赖于每个文件类型插件进行适当的清理(或覆盖所有相关选项)。
如何确定区域
您当然不想像上面的草图中那样明确指定行号。我的 OnSyntaxChange 插件 如果您有/可以为每个块定义正确的语法区域,可能会有所帮助。
不隶属于 StackOverflow