如何在文件中按块更改文件类型(或其他 Vim 设置)?

5
我经常在Vim中编写Perl代码。通常我会将CSS样式直接放入程序代码中,编写CGI脚本。所以最近我问自己是否可能在这些代码块周围放置一些特定于Vim的注释,以便Vim将特定区域突出显示为层叠样式表而不是Perl脚本。
当使用Mojolicious嵌入整个模板到数据区域时,也可以使用此方法解决HTML高亮丢失的问题。
当然,我可以手动切换文件类型/高亮度。但我想知道是否有更好的方法。
谢谢, Sven

在我看来,vim语法高亮的最大限制之一是需要使用一些相当烦人的技巧才能实现这一点。 - kenny
4个回答

7
您可以为单个文件设置多个文件类型:
:set ft=perl.css

这样,您可以获得两种语言的omnicompletion(如果适用还包括代码片段)以及半正确的高亮显示:如果您将CSS规则放在引号中,则它将被突出显示为字符串。

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


4

如果您不想自己制定混合高亮规则:

:set syntax=perl

那么当你想要编辑CSS时,

:set syntax=css

为了更加方便,你可以在 .vimrc 文件中为这两个按键设置映射,这样就可以轻松地在两者之间切换了。
map <F3> :execute "set syntax=perl" <CR>
map <F4> :execute "set syntax=css" <CR>

此外,这里有一个 Vim 插件可以实现你想要的功能,只适用于 Ruby 和 HTML:http://www.vim.org/scripts/script.php?script_id=403 或许你可以调整它以满足你对 Perl/CSS 的需求。 - tester

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代码,它就会被突出显示:

The 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 --

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接