SyntaxRange


Ⅰ. 插件描述

Define a different filetype syntax on regions of a buffer.

Ⅱ. 基本信息

创建日期:  2012-07-04
使用用户:  217
Github星:  68
插件作者:  Ingo Karkat

Ⅲ. 安装方法

使用Vundle管理器安装

在你的.vimrc下添加:
Plugin 'inkarkat/syntaxrange'
… 然后在Vim中运行以下命令:
:source %
:PluginInstall

对于Vundle版本 < 0.10.2,请用上面的Bundle替换Plugin。

使用NeoBundle管理器安装

在你的.vimrc下添加:
NeoBundle 'inkarkat/syntaxrange'
… 然后在Vim中运行以下命令:
:source %
:NeoBundleInstall

使用VimPlug管理器安装

在你的.vimrc下添加:
Plug 'inkarkat/syntaxrange'
… 然后在Vim中运行以下命令:
:source %
:PlugInstall

使用Pathogen管理器安装

在终端中运行以下命令:
cd ~/.vim/bundle
git clone https://github.com/vim-scripts/SyntaxRange

Ⅳ. 文档说明

SYNTAX RANGE

by Ingo Karkat

DESCRIPTION

This plugin provides commands and functions to set up regions in the current
buffer that either use a syntax different from the buffer's 'filetype', or
completely ignore the syntax.

SEE ALSO

  • If you also want different buffer options (like indent settings, etc.) for
    each syntax region, the OnSyntaxChange.vim plugin (vimscript #4085) allows

you to dynamically change the buffer options as you move through the buffer.

RELATED WORKS

  • If the highlighting doesn't work properly, you could alternatively edit the
    range(s) in a separate scratch buffer. Plugins like NrrwRgn (vimscript #3075)

provide commands to set these up, with automatic syncing back to the
original buffer.

SOURCE

USAGE

For quick, ad-hoc manipulation of the syntax withing a range of lines, the
following commands are provided:

:[range]SyntaxIgnore    Ignore the buffer's filetype syntax for the current
                        line / lines in [range]. (Top-level keywords will
                        still be highlighted.)
                        This can be a useful fix when some text fragments
                        confuse the syntax highlighting. (For example, when
                        buffer syntax set to an inlined here-document is
                        negatively affected by the foreign code surrounding
                        the here-document.)

:[range]SyntaxInclude {filetype}
                        Use the {filetype} syntax for the current line / lines
                        in [range].

                        Line numbers in [range] are fixed; i.e. they do not
                        adapt to inserted / deleted lines. But when in a
                        range, the last line ($) is interpreted as "end of
                        file".

For finer control and use in custom mappings or syntax tweaks, the following
functions can be used. You'll find the details directly in the
.vim/autoload/SyntaxRange.vim implementation file.

SyntaxRange#Include( {startPattern}, {endPattern}, {filetype} [, {matchGroup} [, {contains}]] )
                        Use the {filetype} syntax for the region defined by
                        {startPattern} and {endPattern}. Optionally highlight
                        {startPattern} and {endPattern} itself with
                        {matchGroup}, and additionally allow {contains} groups
                        inside the region.
SyntaxRange#IncludeEx( {regionDefinition}, {filetype} [, {contains}] )
                        Use the {filetype} syntax for the region defined by
                        {regionDefinition}. Additionally allow {contains}
                        groups inside the region.

EXAMPLE

To highlight the text between the markers with C syntax:

@begin=c@
int i = 42;
@end=c@

To do this statically, with fixed line numbers, for the first occurrence in
the file:

:1;/@begin=c@/,/@end=c@/SyntaxInclude c

The dynamic version will apply to all occurrences, handles changes in the line
numbers, and also can make the markers themselves fade into the background:

:call SyntaxRange#Include('@begin=c@', '@end=c@', 'c', 'NonText')

To highlight inline patches inside emails:

:call SyntaxRange#IncludeEx('start="^changeset\|^Index: \|^diff \|^--- .*\%( ----\)\@<!$" skip="^[-+@       ]" end="^$"', 'diff')

To install this automatically for the "mail" filetype, put above line into a
script in ~/.vim/after/syntax/mail/SyntaxInclude.vim

INSTALLATION

The code is hosted in a Git repo at

https://github.com/inkarkat/vim-SyntaxRange

You can use your favorite plugin manager, or "git clone" into a directory used
for Vim packages. Releases are on the "stable" branch, the latest unstable
development snapshot on "master".

This script is also packaged as a vimball. If you have the "gunzip"
decompressor in your PATH, simply edit the *.vmb.gz package in Vim; otherwise,
decompress the archive first, e.g. using WinZip. Inside Vim, install by
sourcing the vimball or via the :UseVimball command.

vim SyntaxRange*.vmb.gz
:so %

To uninstall, use the :RmVimball command.

DEPENDENCIES

  • Requires Vim 7.0 or higher.
  • Requires the ingo-library.vim plugin (vimscript #4433), version 1.022 or
    higher.

INTEGRATION

To automatically include a syntax in a certain {filetype}, you can put the
command into a script in

~/.vim/after/syntax/{filetype}/SyntaxInclude.vim

If you want to include a syntax in several (or even all) syntaxes, you can put
this into your vimrc:

:autocmd Syntax * call SyntaxRange#Include(...)

If you have a filetype1 syntax that includes filetype2 and vice versa, you
will run into E169: Command too recursive. This can be solved by inclusion
guards around each invocation. In ~/.vim/after/syntax/filetype1.vim:

let b:loaded_filetype1_syntax_includes = 1
if !exists('b:loaded_filetype2_syntax_includes')
    call SyntaxRange#Include('...', '...', 'filetype2')
endif
...
unlet b:loaded_filetype1_syntax_includes

And the inverse in ~/.vim/after/syntax/filetype2.vim:

let b:loaded_filetype2_syntax_includes = 1
if !exists('b:loaded_filetype1_syntax_includes')
    call SyntaxRange#Include('...', '...', 'filetype1')
endif
...
unlet b:loaded_filetype2_syntax_includes

LIMITATIONS

  • The original filetype's syntax may interfere with the syntax range, and vice

    1. To define the range with high priority, the commands inject it with
      "containedin=ALL".

CONTRIBUTING

Report any bugs, send patches, or suggest features via the issue tracker at
https://github.com/inkarkat/vim-SyntaxRange/issues or email (address below).

HISTORY

1.04 RELEASEME
  • Allow setting additional contains groups via an optional argument to
    SyntaxRange#Include[Ex](). Thanks to Sergey Vlasov for sending a patch.
1.03 01-Jul-2017
  • SyntaxRange#Include(): Escape double quotes in a:startPattern and
    a:endPattern; i.e. handle the patterns transparently. Found in tmsanrinsha's

fork.

  • ENH: Avoid to re-include same syntax file if multiple ranges are specified
    with :SyntaxInclude / if SyntaxRange#Include[Ex]() is invoked multiple times

per buffer. Found in tmsanrinsha's fork.

1.02 23-Apr-2015
  • Set main_syntax to the buffer's syntax during :syntax include of the
    subordinate syntax script. Some scripts may make special arrangements when

    1. Suggested by OOO.
  • Handle :.SyntaxInclude and :.SyntaxIgnore on folded lines correctly. Use
    ingo#range#NetStart/End().
  • Add dependency to ingo-library (vimscript #4433). __You need to separately
    install ingo-library (vimscript #4433) version 1.022 (or higher)!__
1.01 21-Nov-2013
  • Avoid "E108: No such variable: b:current_syntax" when the (misbehaving)
  1. syntax doesn't set it. Reported by o2genum at

http://stackoverflow.com/a/16162412/813602.

1.00 13-Aug-2012
  • First published version.
0.01 05-Jul-2012
  • Started development.

Copyright: (C) 2012-2018 Ingo Karkat -
The VIM LICENSE applies to this plugin.

Maintainer: Ingo Karkat <ingo@karkat.de>

添加新评论