在vim中,如何将文件类型的自动命令应用于文件区域?

在vim中,如何将文件类型的自动命令应用于文件区域?,vim,autocommand,Vim,Autocommand,我有一种polyglot文件类型,可以在其中嵌入C、python、ruby等(如果有帮助的话,可以考虑“wiki页面”)。是否有方法在文件区域上为已知文件类型执行自动命令 例如,我可能有: #!bash if [ a = b ]; then echo 'equal' fi #!python if a = b: print('equal') 我想将bash文件类型自动命令应用于第一部分,将python文件类型自动命令应用于第二部分 我可以通过使用方法定义一个区域来获得语法hili

我有一种polyglot文件类型,可以在其中嵌入C、python、ruby等(如果有帮助的话,可以考虑“wiki页面”)。是否有方法在文件区域上为已知文件类型执行自动命令

例如,我可能有:

#!bash
if [ a = b ]; then
   echo 'equal'
fi

#!python
if a = b:
    print('equal')
我想将bash文件类型自动命令应用于第一部分,将python文件类型自动命令应用于第二部分


我可以通过使用方法定义一个区域来获得语法hilighting,但我对自动命令的理解还不够,无法以类似的方式应用它们。

自动执行这项操作很有挑战性,因为文件类型设置是缓冲区本地的;Vim没有区域的概念,因此需要使用autocmds,正如您正确指出的那样

轻快 使用类似的插件,您可以克隆区域以分离暂存缓冲区;插件会在写入时自动将它们同步回。可以通过
:setf
为每个缓冲区指定一个单独的文件类型

更简单的方法是定义一些映射以快速切换文件类型:

:nnoremap <Leader>fp :setf python<CR>
:nnoremap <Leader>fs :setf sh<CR>
:nnoremap fp:setf python
:nnoremap fs:setf sh
在单个缓冲区中真正独立的区域 这一点很简单:

:autocmd CursorMoved,CursorMovedI <buffer> if line('.') >= 6 | setf python | else | setf sh | endif
:autocmd CursorMoved,CursorMovedI if line('.')>=6 | setf python | else | setf sh | endif
这依赖于每个文件类型插件进行适当的清理(或覆盖所有相关选项)

如何确定区域 您当然不希望像上面的草图那样明确地指定行号。如果您有/可以为每个块定义正确的语法区域,我的代码可能会有所帮助