在文件中以块为单位更改文件类型(或其他Vim设置)?

时间:2011-07-28 19:15:48

标签: vim syntax-highlighting block file-type

我在Vim中编写了很多Perl。通常我只是将一些CGI脚本放在一起并将CSS放入程序代码中。最近我问自己是否可能,在我的代码中对这些块进行一些特定于Vim的注释,以便vim突出显示特定区域而不是Perl脚本,而是作为级联样式表。

使用Mojolicious时,这也很简洁,您可以将整个模板嵌入到DATA区域,但会丢失HTML的所有突出显示。

当然,我可以在文件类型/突出显示之间手动切换。但我想知道是否有更好的方法。

谢谢, 斯文

4 个答案:

答案 0 :(得分:6)

您可以为单个文件设置多个文件类型:

:set ft=perl.css

通过这种方式,您可以获得两种语言的omnicompletion(以及适用的片段)和半正确突出显示:如果您将CSS规则放在引号中,它将突出显示为字符串。

我刚刚发现(昨天)一个很酷的插件,受到名为NrrwRgn的Emacs功能的启发。它允许您选择代码的“区域”,比如Perl文件的CSS部分,并在您:set ft=css的临时窗口中编辑它。每个保存都会反映在原始窗口中。在处理完整的PHP / HTML / JS / CSS的PHP模板时非常有用。

答案 1 :(得分:4)

如果您不想提出自己的混合突出显示规则:

:set syntax=perl

然后当你想编辑css时,

:set syntax=css

为了方便起见,您可以在.vimrc中映射两个键,这样可以方便地来回切换。

map <F3> :execute "set syntax=perl" <CR>
map <F4> :execute "set syntax=css" <CR>

答案 2 :(得分:4)

我不熟悉Perl以及CSS如何适应代码,但是如果你使用heredocs,这里有一篇很好的文章来处理类似的问题:http://blogs.perl.org/users/ovid/2011/06/syntax-highlight-your-sql-heredocs-in-vim.html

作者试图做的是在标有SQL分隔符的heredocs中突出显示SQL。在您的情况下,您可以在.vim/after/ftplugin/perl.vim

中添加类似的内容
syntax on

unlet b:current_syntax
syntax include @CSS syntax/css.vim
syntax region cssSnip matchgroup=Snip start=+<<['"]CSS['"].*;\s*$+ end=+^\s*CSS$+ contains=@CSS

hi link Snip SpecialComment

只要你这样写,就会突出显示CSS:

my $css = <<"CSS";
  a {
    background-color: blue;
  }
CSS

如果您想将评论用作分隔符,则可以破解上述代码段,尤其是startend模式。例如,这个:

syntax region cssSnip matchgroup=Snip start=+^\s*# -- CSS --\s*$+ end=+^\s*# -- END CSS --\s*$+ contains=@CSS

让你在特定的评论中突出显示如下:

# -- CSS --
  a {
    background-color: blue;
  }
# -- END CSS --

答案 3 :(得分:1)

您可以使用我的SyntaxRange plugin。假设您使用@cssbegin@ / @cssend@分隔CSS行,请将以下内容放入~/.vim/after/syntax/perl/perl_cssinclude.vim

:call SyntaxRange#Include('^@cssbegin@', '^@cssend@', 'css', 'NonText')