/vim-matchtag

Highlight matching tags in any files such as html, xml, js, jsx, vue, svelte.

Primary LanguageVim Script

icon

vim-matchtag

screenshot screenshot screenshot

Highlight matching tags in any files such as html, xml, js, jsx, vue, svelte.

Installation

How to install
  • VundleVim

      Plugin 'leafOfTree/vim-matchtag'
    
  • vim-pathogen

      cd ~/.vim/bundle && \
      git clone https://github.com/leafOfTree/vim-matchtag --depth 1
    
  • vim-plug

      Plug 'leafOfTree/vim-matchtag'
    
  • Or manually, clone this plugin to path/to/this_plugin, and add it to rtp in vimrc

      set rtp+=path/to/this_plugin
    

How it works

This plugin finds the matching tag and highlight it. Mainly inspired by vim builtin matchparen using searchpairpos and matchaddpos. Feel free to open an issue or a pull request.

Configuration

Set global variable to 1 to enable or 0 to disalbe. Or a proper value to make it effective. Ex:

let g:vim_matchtag_enable_by_default = 0
let g:vim_matchtag_files = '*.html,*.xml,*.js,*.jsx,*.vue,*.svelte,*.jsp'
variable description default
g:vim_matchtag_files Enable on these files. See ^
g:vim_matchtag_enable_by_default Enable by default. 1
g:vim_matchtag_highlight_cursor_on Highlight the tag when the cursor is on it. 0
Mappings / Performance / debug related
g:vim_matchtag_mapping_toggle Key mapping to toggle highlighting. ''
g:vim_matchtag_mapping_toggle_highlight_cursor_on Key mapping to toggle highlight_cursor_on. ''
g:vim_matchtag_skip Syntax to skip. See +
g:vim_matchtag_skip_except Syntax not to skip. See +
g:vim_matchtag_timeout The search stops after timeout milliseconds. 50
g:vim_matchtag_disable_cache Disable the cache for lines.
(By default the lines are cached until text changed)
0
g:vim_matchtag_debug Echo debug messages. 0

Note

  • If you prefer to enable it on demand, you can set g:vim_matchtag_enable_by_default to 0 then toggle it by :MatchTagToggle.

  • ^: It is a comma separated file pattern (:h autocmd-patterns). It defaults to

    let g:vim_matchtag_files = '*.html,*.xml,*.js,*.jsx,*.ts,*.tsx,*.vue,*.svelte,*.jsp,*.php,*.erb'
  • +: Both are patterns (:h pattern). The default values are

    let g:vim_matchtag_skip = 'javascript\|css\|script\|style'
    let g:vim_matchtag_skip_except = 'html\|template'
  • See performance if there are lags.

Highlighting

When the matching tag is found, the highlight group is matchTag (by default Visual). Otherwise, it's matchTagError (by default Error).

You could change them as follows.

highlight link matchTag Search
highlight link matchTag MatchParen
highlight matchTag gui=reverse

highlight link matchTagError Todo

If these don't take effect, try putting them at the end of your vimrc.

Commands

There are commands you can call directly or add key mapping to.

  • :MatchTagToggle Toggle highlighting.

  • :MatchTagToggleHighlightCursorOn Toggle highlighting of the tag when the cursor is on it.

Performance

The highlighting should take about 0.001~0.01 depending on the file content. If there is a freeze, you can try

let g:vim_matchtag_skip = '<pattern>'         " Syntax to skip
let g:vim_matchtag_skip_except = '<pattern>'  " Syntax not to skip

call matchtag#ReportTime()

and feel free to open an issue.

You can show the syntax stack under the cursor by running

echo map(synstack(line('.'), col('.')), { _, id -> synIDattr(id, 'name') })

Others

  • Jump between matching tags? See :h matchit.

Credits

  • matchparen.vim