mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 06:10:05 +08:00
1081 lines
40 KiB
Plaintext
1081 lines
40 KiB
Plaintext
*matchup.txt* modern matching words
|
|
*matchup* *match-up*
|
|
|
|
Author: Andy Massimino <a@normed.space>
|
|
Web: https://github.com/andymass/vim-matchup
|
|
Script ID: 5624
|
|
License: MIT license {{{
|
|
|
|
Copyright (c) 2020 Andy Massimino
|
|
|
|
Copyright (c) 2016 Karl Yngve Lervåg
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to
|
|
deal in the Software without restriction, including without limitation the
|
|
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
sell copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
IN THE SOFTWARE.
|
|
|
|
}}}
|
|
|
|
==============================================================================
|
|
CONTENTS *matchup-contents*
|
|
|
|
Introduction |matchup-introduction|
|
|
Feature overview |matchup-overview|
|
|
Usage |matchup-usage|
|
|
Default mappings |matchup-default-mappings|
|
|
Customizing mappings |matchup-custom-mappings|
|
|
Features |matchup-features|
|
|
Commands |matchup-commands|
|
|
Options |matchup-options|
|
|
File type options |matchup-file-types|
|
|
FAQ |matchup-faq|
|
|
Interoperability |matchup-interoperability|
|
|
Acknowledgments |matchup-acknowledgments|
|
|
Development |matchup-development|
|
|
|
|
==============================================================================
|
|
INTRODUCTION *matchup-introduction*
|
|
|
|
|match-up| is a plugin that lets you visualize, navigate, and operate on
|
|
matching sets of text. It is a replacement for the venerable vim plugin
|
|
|matchit|. match-up aims to replicate all of |matchit|'s features, fix a number
|
|
of its deficiencies and bugs, and add a few totally new features. It also
|
|
replaces the standard plugin |matchparen|, allowing all of |matchit|'s words to be
|
|
highlighted along with the 'matchpairs' symbols such as `()`, `{}`, and `[]`.
|
|
|
|
------------------------------------------------------------------------------
|
|
Feature overview~
|
|
*matchup-overview*
|
|
|
|
This plugin:
|
|
|
|
- Extends vim's |%| (see |matchup-%|) motion to language-specific words instead of
|
|
just single characters. The words depend on the specific |filetype| plugin
|
|
(|ftplugin|). The following built-in vim filetype plugins
|
|
currently provide support for match-up: >
|
|
|
|
abaqus, ada, aspvbs, c, clojure, cobol, config, context, csc, csh, dtd,
|
|
dtrace, eiffel, eruby, falcon, fortran, framescript, haml, hamster, hog,
|
|
html, ishd, j, jsp, kconfig, liquid, lua, make, matlab, mf, mp, ocaml,
|
|
pascal, pdf, perl, php, plaintex, postscr, ruby, sh, spec, sql, tex, vb,
|
|
verilog, vhdl, vim, xhtml, xml, zimbu, zsh
|
|
<
|
|
- Highlights symbols and words under the cursor along with their matches.
|
|
|
|
- Display off-screen matches in the |status-line|.
|
|
|
|
- Adds motions |g%|, |[%|, |]%|, and |z%|.
|
|
|
|
- Provides analogous text objects |i%| and |a%|.
|
|
|
|
==============================================================================
|
|
USAGE *matchup-usage*
|
|
|
|
------------------------------------------------------------------------------
|
|
Default mappings~
|
|
*matchup-default-mappings*
|
|
|
|
For customization, see |matchup-custom-mappings|.
|
|
|
|
*matchup-%*
|
|
% When on a recognized word, go forwards to its next
|
|
matching word. If at a close word, cycle back to the
|
|
corresponding open word. If the cursor is not on a
|
|
word, seek forwards to one and then jump to its match.
|
|
This is an |inclusive| motion.
|
|
|
|
*matchup-N%*
|
|
{count}% If {count} is less than 6, go forwards {count} times.
|
|
Otherwise, go to {count} percentage in the file (|N%|).
|
|
See |g:matchup_motion_override_Npercent|.
|
|
|
|
*g%*
|
|
g% When on a recognized word, go backwards to [count]th
|
|
previous matching word. If at an open word, cycle
|
|
around to the corresponding open word. If the cursor
|
|
is not on a word, seek forwards to one and then jump
|
|
to its match.
|
|
|
|
*[%*
|
|
[% Go to [count]th previous outer open word. Allows
|
|
navigation to the start of blocks surrounding the
|
|
cursor. This is similar to vim's built-in |[(| and |[{|
|
|
and is an |exclusive| motion (|matchup-feat-exclusive|).
|
|
|
|
*]%*
|
|
]% Go to [count]th next outer close word. Allows
|
|
navigation to the end of blocks surrounding the
|
|
cursor. This is similar to vim's built-in |])| and |]}|
|
|
and is an |exclusive| motion (|matchup-feat-exclusive|).
|
|
|
|
*z%*
|
|
z% Go to inside [count]th nearest block. This is an
|
|
|exclusive| motion when used with operators,
|
|
except it eats white-space. For example, where `█` is
|
|
the cursor position, >
|
|
|
|
█ call somefunction( param1, param2)
|
|
<
|
|
`dz%` produces >
|
|
|
|
param1, param2)
|
|
<
|
|
*v_a%* *a%*
|
|
a% Select an |any-block|.
|
|
This closely matches vim's built-in |ab|.
|
|
|
|
*v_Na%* *Na%*
|
|
{count}a% Select an |open-to-close-block|.
|
|
When {count} is greater than 1, select the {count}th
|
|
surrounding open-to-close block.
|
|
|
|
*v_i%* *i%*
|
|
i% Select the inside of an |any-block|.
|
|
This closely matches vim's built-in |ib|.
|
|
See also |matchup-feat-linewise|.
|
|
|
|
*v_Ni%* *Ni%*
|
|
{count}i% Select the inside of an |open-to-close-block|.
|
|
When {count} is greater than 1, select the inside of
|
|
the {count}th surrounding open-to-close block.
|
|
|
|
*ds%*
|
|
{count}ds% Delete {count}th surrounding matching words. This
|
|
only works for open and close words.
|
|
Requires |g:matchup_surround_enabled| = 1.
|
|
|
|
*cs%*
|
|
{count}cs% Change {count}th surrounding matching words. This
|
|
only works for open and close words. If vim-surround
|
|
is installed, you can type replacements according to
|
|
that plugin's rules. Otherwise, match-up will give
|
|
you the opportunity to type a single character. Some
|
|
simple replacement pairs are supported.
|
|
Requires |g:matchup_surround_enabled| = 1.
|
|
|
|
------------------------------------------------------------------------------
|
|
Customizing mappings~
|
|
*matchup-custom-mappings*
|
|
|
|
|match-up| provides a number of default mappings. Each right-hand side is
|
|
provided as a <plug>-mapping (see |using-<plug>|). For any given map, the
|
|
default mapping will only be created if it does not already exist. This means
|
|
that if a user defines a custom mapping, e.g., with >
|
|
|
|
nmap <leader>% <plug>(matchup-z%)
|
|
<
|
|
the corresponding default left-hand side will not be mapped.
|
|
|
|
-------------------------------------------------------------------------~
|
|
LHS RHS Mode Module
|
|
-------------------------------------------------------------------------~
|
|
% |<plug>(matchup-%)| nx motion
|
|
g% |<plug>(matchup-g%)| nx motion
|
|
[% |<plug>(matchup-[%)| nx motion
|
|
]% |<plug>(matchup-]%)| nx motion
|
|
z% |<plug>(matchup-z%)| nx motion
|
|
a% |<plug>(matchup-%)| x text_obj
|
|
i% |<plug>(matchup-%)| x text_obj
|
|
ds% |<plug>(matchup-ds%)| n surround
|
|
cs% |<plug>(matchup-cs%)| n surround
|
|
(none) |<plug>(matchup-hi-surround)| n matchparen
|
|
-------------------------------------------------------------------------~
|
|
Operator pending maps~
|
|
-------------------------------------------------------------------------~
|
|
% |<plug>(matchup-%)| o motion
|
|
... And so on for g%, [%, ]%, z%, a%, i% ...
|
|
|
|
Key: (n) normal, (x) visual, (o) operator-pending (|omap-info|).
|
|
|
|
Note: Prior to vim 8.1.0648, in order to support motion forcing (see |o_v|, |o_V|,
|
|
|o_CTRL-V|) for each operator-pending map, match-up made four maps corresponding
|
|
to each motion type:
|
|
|
|
-------------------------------------------------------------------------~
|
|
Obsolete operator pending maps~
|
|
-------------------------------------------------------------------------~
|
|
% |<plug>(matchup-o_)||<plug>(matchup-%)| o motion
|
|
v% |<plug>(matchup-o_v)||<plug>(matchup-%)| o motion
|
|
V% |<plug>(matchup-o_V)||<plug>(matchup-%)| o motion
|
|
<c-v>% |<plug>(matchup-o_<c-v>)||<plug>(matchup-%)| o motion
|
|
... And so on for g%, [%, ]%, z%, a%, i% ...
|
|
|
|
This meant, for example, `d2v%` would work (meaning delete 2 matches forward,
|
|
exclusively), but `dv2%` would not work as you would expect (the behavior is
|
|
undefined). After vim version 8.1.0648, this limitation of operator-pending
|
|
mapping was lifted and match-up is able to use simplified mappings.
|
|
|
|
------------------------------------------------------------------------------
|
|
Features~
|
|
*matchup-features*
|
|
|
|
What do we mean by open, close, mid? This depends on the specific file type
|
|
and is configured through the variable |b:match_words|. Here are a couple
|
|
of examples: >
|
|
|
|
if l:x == 1
|
|
call one()
|
|
elseif l:x == 2
|
|
call two()
|
|
else
|
|
call three()
|
|
endif
|
|
<
|
|
*any-block* *open-to-close-block*
|
|
|
|
For the vim-script language, match-up understands the words `if`, `else`, `elseif`,
|
|
`endif` and that they form a sequential construct. The "open" word is `if`, the
|
|
"close" word is `endif`, and the "mid" words are `else` and `elseif`. The `if`/`endif`
|
|
pair is called an "open-to-close" block and the `if`/`else`, `else`/`elsif`, and
|
|
`elseif`/`endif` are called "any" blocks.
|
|
|
|
C, C++: >
|
|
|
|
#if 0
|
|
#else
|
|
#endif
|
|
|
|
void some_func() {
|
|
if (true) {
|
|
one();
|
|
} else if (false && false) {
|
|
two();
|
|
} else {
|
|
three();
|
|
}
|
|
}
|
|
<
|
|
Since in C and C++, blocks are delimited using braces (`{` & `}`), match-up will
|
|
recognize `{` as the open word and `}` as the close word. It will ignore the if
|
|
and else if because they are not defined in vim's C file type plugin.
|
|
|
|
On the other hand, match-up will recognize the `#if`, `#else`, `#endif` preprocessor
|
|
directives.
|
|
|
|
See |matchup-feat-exclusive| and |matchup-feat-linewise| for some examples and
|
|
important special cases.
|
|
|
|
Highlighting matches~
|
|
|
|
To disable match highlighting at |startup|, use >
|
|
|
|
let g:matchup_matchparen_enabled = 0
|
|
>
|
|
in your vimrc. See |matchup-opts-matchparen| for more information and related
|
|
options.
|
|
|
|
You can enable highlighting on the fly using >
|
|
|
|
:DoMatchParen
|
|
<
|
|
Likewise, you can disable highlighting at any time using >
|
|
|
|
:NoMatchParen
|
|
<
|
|
After start-up, is better to use `:NoMatchParen` and `:DoMatchParen` to toggle
|
|
highlighting globally than setting the global variable since these commands
|
|
make sure not to leave stale matches around.
|
|
|
|
Display matches off screen~
|
|
|
|
If an open or close match which would have been highlighted is on a line
|
|
positioned outside of the current window, the match is shown in the status
|
|
line (the default). If both the open and close match are off-screen, the
|
|
close match is preferred.
|
|
See |g:matchup_matchparen_offscreen| for configuration.
|
|
|
|
*<plug>(matchup-hi-surround)*
|
|
Highlight surrounding~
|
|
|
|
To highlight the surrounding delimiters until the cursor moves, use a map such
|
|
as the following >
|
|
|
|
nmap <silent> <F7> <plug>(matchup-hi-surround)
|
|
<
|
|
There is no default map for this feature.
|
|
|
|
Parallel transmutation~
|
|
|
|
In insert mode, after changing text inside a word, matching words will be
|
|
changed in parallel. As an example, >
|
|
|
|
<pre>
|
|
text
|
|
</pre>
|
|
<
|
|
Changing `pre` to `div` and leaving insert mode will produce: >
|
|
|
|
<div>
|
|
text
|
|
</div>
|
|
<
|
|
Note: this currently only works for match words which define a backref
|
|
relation like `\1`. A wider set of transmutations are planned.
|
|
|
|
Parallel transmutation requires the matchparen module to be enabled.
|
|
|
|
*matchup-feat-exclusive*
|
|
Inclusive and exclusive motions~
|
|
|
|
In vim, character motions following operators (such as `d` for delete and `c` for
|
|
change) are either |inclusive| or |exclusive|. This means they either include
|
|
the ending position or not. Here, "ending position" means the line and column
|
|
closest to the end of the buffer of the region swept over by the motion.
|
|
match-up is designed so that `d]%` inside a set of parenthesis behaves exactly
|
|
like `d])`, except generalized to words.
|
|
|
|
Put differently, forward exclusive motions will not include the close word.
|
|
In this example, where `█` is the cursor position, >
|
|
|
|
if █x | continue | endif
|
|
<
|
|
pressing `d]%` will produce (cursor on the `e`) >
|
|
|
|
if endif
|
|
<
|
|
To include the close word, use either `dv]%` or `vd]%`. This is also
|
|
compatible with vim's `dv])` and `dv]}`.
|
|
|
|
Operators over backward exclusive motions will instead exclude the position
|
|
the cursor was on before the operator was invoked. For example, in >
|
|
|
|
if █x | continue | endif
|
|
<
|
|
pressing `d[%` will produce >
|
|
|
|
█x | continue | endif
|
|
<
|
|
This is compatible with vim's `d[(` and `d[{`.
|
|
|
|
*d%* *dg%*
|
|
|
|
Unlike `]%`, `%` is an |inclusive| motion. As a special case for the `d` (delete)
|
|
operator, if `d%` leaves behind lines white-space, they will be deleted also.
|
|
In effect, it will be operating line-wise. As an example, pressing `d%` will
|
|
leave behind nothing. >
|
|
|
|
█(
|
|
|
|
)
|
|
<
|
|
To operate character-wise in this situation, use `dv%` or `vd%`. This is vim
|
|
compatible with the built-in `d%` on items in 'matchpairs'.
|
|
|
|
*matchup-feat-linewise*
|
|
Line-wise operator/text-object combinations~
|
|
|
|
Normally, the text objects |i%| and |a%| work character-wise. However,
|
|
there are some special cases. For certain operators combined with |i%|,
|
|
under certain conditions, match-up will effectively operate line-wise
|
|
instead. For example, in >
|
|
|
|
if condition
|
|
█call one()
|
|
call two()
|
|
endif
|
|
<
|
|
pressing `di%` will produce >
|
|
|
|
if condition
|
|
endif
|
|
<
|
|
even though deleting ` condition` would be suggested by the object `i%`.
|
|
The intention is to make operators more useful in some cases. The
|
|
following rules apply:
|
|
|
|
1. The operator must be listed in |g:matchup_text_obj_linewise_operators|.
|
|
By default this is |d| and |y| (e.g., `di%` and `ya%`).
|
|
|
|
2. The outer block must span multiple lines.
|
|
|
|
3. The open and close delimiters must be more than one character long. In
|
|
particular, `di%` involving a `(`...`)` block will not be subject to
|
|
these special rules.
|
|
|
|
To prevent this behavior for a particular operation, use `vi%d`. Note that
|
|
special cases involving indentation still apply (like with |i)| etc).
|
|
|
|
To disable this entirely, remove the operator from the following variable, >
|
|
|
|
let g:matchup_text_obj_linewise_operators = [ 'y' ]
|
|
<
|
|
Note: unlike vim's built-in |i)|, |ab|, etc., |i%| does not make an existing visual
|
|
mode character-wise.
|
|
|
|
A second special case involves `da%`. In this example, >
|
|
|
|
if condition
|
|
█call one()
|
|
call two()
|
|
endif
|
|
<
|
|
pressing `da%` will delete all four lines and leave no white-space. This is
|
|
compatible with vim's `da(`, `dab`, etc.
|
|
|
|
------------------------------------------------------------------------------
|
|
Commands~
|
|
*matchup-commands*
|
|
|
|
*:NoMatchParen* *matchup-:NoMatchParen*
|
|
:NoMatchParen Disable matching after the plugin was loaded.
|
|
*:DoMatchParen* *matchup-:DoMatchParen*
|
|
:DoMatchParen Enable matching again.
|
|
|
|
*:MatchupShowTimes*
|
|
:MatchupShowTimes Display performance data, useful for debugging slow
|
|
matching. Shows last, average, and maximum times.
|
|
*:MatchupClearTimes*
|
|
:MatchupClearTimes Reset performance counters to zero.
|
|
|
|
*:MatchupWhereAmI*
|
|
:MatchupWhereAmI? Echos your position in code by finding successive matching
|
|
words, like doing `[%` repeatedly. Example:
|
|
>
|
|
1310 do_pending_operator( … { ⯈ if ((finish_op || VIsual_active) && oap- … {
|
|
<
|
|
Running this command twice in the same position will give
|
|
more verbose output.
|
|
|
|
:MatchupWhereAmI?? Be more verbose about your position in code by displaying
|
|
several lines. Example:
|
|
>
|
|
1310 do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank) … {
|
|
1349 if ((finish_op || VIsual_active) && oap->op_type != OP_NOP) … {
|
|
<
|
|
*:MatchupReload*
|
|
:MatchupReload Reload the plugin, mostly for debugging. Note that
|
|
this does not reload 'matchpairs' or `b:match_word`.
|
|
|
|
------------------------------------------------------------------------------
|
|
Options~
|
|
*matchup-options*
|
|
|
|
*g:matchup_enabled*
|
|
|
|
Set to 0 to disable the plugin entirely.
|
|
|
|
Default: 1
|
|
|
|
*g:matchup_mappings_enabled* all mappings
|
|
|g:matchup_matchparen_enabled| match highlighting
|
|
*g:matchup_mouse_enabled* double click to select matches
|
|
*g:matchup_motion_enabled* |matchup-%|, |%|, |[%|, |]%|
|
|
*g:matchup_text_obj_enabled* |a%|, |i%|
|
|
|
|
Set to 0 to disable a particular module or feature.
|
|
|
|
Defaults: 1
|
|
|
|
*g:matchup_transmute_enabled*
|
|
|
|
Set to 1 to enable the experimental transmute feature (|matchup-transmute|).
|
|
|
|
Default: 0
|
|
|
|
*g:matchup_delim_stopline*
|
|
|
|
Configures the number of lines to search in either direction while using
|
|
motions and text objects. Does not apply to match highlighting
|
|
(see |g:matchup_matchparen_stopline| instead).
|
|
|
|
Default: 1500
|
|
|
|
*g:matchup_delim_noskips*
|
|
|
|
This option controls whether matching is done within strings and comments.
|
|
By default, it is set to 0 which means all valid matches are made within
|
|
strings and comments. If set to 1, symbols like `()` will still be matched
|
|
but words like `for` and `end` will not. If set to 2, nothing will be
|
|
matched within strings and comments. >
|
|
|
|
let g:matchup_delim_noskips = 1
|
|
let g:matchup_delim_noskips = 2
|
|
<
|
|
Default: 0 (matching enabled within strings and comments)
|
|
|
|
*g:matchup_delim_start_plaintext*
|
|
|
|
When enabled (the default), the plugin will be loaded for all buffers,
|
|
including ones without a file type set. This allows matching to be done in
|
|
new buffers and plain text files but adds a small start-up cost to vim.
|
|
|
|
Default: 1
|
|
|
|
Variables~
|
|
|
|
*b:match_words*
|
|
*b:match_skip*
|
|
*b:match_ignorecase*
|
|
|
|
match-up understands these variables originally from matchit. These are set
|
|
in the respective |ftplugin| files. They may not exist for every file type.
|
|
To support a new file type, create a file `after/ftplugin/{filetype}.vim`
|
|
which sets them appropriately.
|
|
|
|
*matchup-opts-matchparen*
|
|
Module matchparen~
|
|
|
|
*g:matchup_matchparen_enabled*
|
|
|
|
This option will disable match highlighting at |startup|, e.g., use >
|
|
|
|
let g:matchup_matchparen_enabled = 0
|
|
<
|
|
in your vimrc.
|
|
|
|
Note: vim's built-in plugin |pi_paren| plugin is also disabled. The variable
|
|
`g:loaded_matchparen` has no effect on match-up.
|
|
|
|
Default: 1
|
|
|
|
You can also enable and disable highlighting for specific buffers using the
|
|
variable |b:matchup_matchparen_enabled|.
|
|
|
|
Customizing the highlighting colors~
|
|
|
|
match-up uses the |MatchParen| highlighting group by default, which can be
|
|
configured. For example, >
|
|
|
|
:hi MatchParen ctermbg=blue guibg=lightblue cterm=italic gui=italic
|
|
<
|
|
You may want to put this inside a |ColorScheme| |autocmd| so it is preserved
|
|
after colorscheme changes: >
|
|
|
|
augroup matchup_matchparen_highlight
|
|
autocmd!
|
|
autocmd ColorScheme * hi MatchParen guifg=red
|
|
augroup END
|
|
<
|
|
You can also highlight words differently than parentheses using the
|
|
`MatchWord` highlighting group. You might do this if you find the
|
|
`MatchParen` style distracting for large blocks. >
|
|
|
|
:hi MatchWord ctermfg=red guifg=blue cterm=underline gui=underline
|
|
<
|
|
There are also `MatchParenCur` and `MatchWordCur` which allow you to configure
|
|
the highlight separately for the match under the cursor. >
|
|
|
|
:hi MatchParenCur cterm=underline gui=underline
|
|
:hi MatchWordCur cterm=underline gui=underline
|
|
<
|
|
*b:matchup_matchparen_enabled*
|
|
|
|
Set to 0 to disable highlighting on a per-buffer basis (there is no command
|
|
for this). By default, when disabling highlighting for a particular buffer,
|
|
the standard plugin |pi_paren| will still be used for that buffer.
|
|
|
|
Default: undefined (equivalent to 1)
|
|
|
|
*b:matchup_matchparen_fallback*
|
|
|
|
If highlighting is disabled on a particular buffer, match-up will fall back
|
|
to the vim standard plugin |pi_paren|, which will highlight 'matchpairs' such
|
|
as `()`, `[]`, & `{}`. To disable this, set this option to 0.
|
|
|
|
Default: undefined (equivalent to 1)
|
|
|
|
A common usage of these options is to automatically disable matchparen for
|
|
particular file types: >
|
|
|
|
augroup matchup_matchparen_disable_ft
|
|
autocmd!
|
|
autocmd FileType tex let [b:matchup_matchparen_fallback,
|
|
\ b:matchup_matchparen_enabled] = [0, 0]
|
|
augroup END
|
|
<
|
|
*g:matchup_matchparen_singleton*
|
|
|
|
Whether or not to highlight recognized words even if there is no match.
|
|
|
|
Default: 0
|
|
|
|
*g:matchup_matchparen_offscreen*
|
|
|
|
Dictionary controlling the behavior with off-screen matches. If empty, this
|
|
feature is disabled. Else, it should contain the following optional keys:
|
|
|
|
method~
|
|
Sets the method to use to show off-screen matches.
|
|
Possible values are:
|
|
|
|
`'status'` (default): Replace the |status-line| for off-screen matches.
|
|
|
|
If a match is off of the screen, the line belonging to that match will be
|
|
displayed syntax-highlighted in the status line along with the line number
|
|
(if line numbers are enabled). If the match is above the screen border,
|
|
an additional Δ symbol will be shown to indicate that the matching line is
|
|
really above the cursor line.
|
|
|
|
`'status_manual'`: Compute the status-line but do not display it (future
|
|
extension).
|
|
|
|
`'popup'`: Use a popup window (requires at least vim 8.1.1406) or
|
|
a floating window (in neovim) to show the off-screen match.
|
|
|
|
scrolloff~
|
|
When enabled, off-screen matches will not be shown in the statusline while
|
|
the cursor is at the screen edge (respects the value of 'scrolloff').
|
|
This is intended to prevent flickering while scrolling with j and k.
|
|
|
|
Default: 0
|
|
|
|
highlight~
|
|
For popup method on vim only: set to a highlight group to override the
|
|
colors in the popup window. The default is to use *hl-Pmenu*. Example:
|
|
>
|
|
highlight! OffscreenPopup guibg=red guifg=blue
|
|
let g:matchup_matchparen_offscreen
|
|
\ = {'method': 'popup', 'highlight': 'OffscreenPopup'}
|
|
<
|
|
Default: `{'method': 'status'}`
|
|
|
|
*g:matchup_matchparen_stopline*
|
|
|
|
The number of lines to search in either direction while highlighting
|
|
matches. Set this conservatively since high values may cause performance
|
|
issues.
|
|
|
|
Default: 400
|
|
|
|
*g:matchup_matchparen_timeout*
|
|
*g:matchup_matchparen_insert_timeout*
|
|
|
|
Adjust the timeouts in milliseconds for highlighting.
|
|
|
|
Defaults: `g:matchparen_timeout`, `g:matchparen_insert_timeout`
|
|
(300, 60 respectively)
|
|
|
|
*b:matchup_matchparen_timeout*
|
|
*b:matchup_matchparen_insert_timeout*
|
|
|
|
Buffer local versions of the above.
|
|
|
|
*g:matchup_matchparen_deferred*
|
|
|
|
Deferred highlighting improves cursor movement performance (for example, when
|
|
using |hjkl|) by delaying highlighting for a short time and waiting to see if
|
|
the cursor continues moving.
|
|
|
|
Default: 0 (disabled)
|
|
|
|
Note: this feature is only available if your vim version has |timers| and
|
|
the function |timer_pause|, version 7.4.2180 and after. For neovim, this
|
|
will only work in nvim-0.2.1 and after.
|
|
|
|
*g:matchup_matchparen_deferred_show_delay*
|
|
|
|
Delay, in milliseconds, between when the cursor moves and when we start
|
|
checking if the cursor is on a match. Applies to both making highlights and
|
|
clearing them for deferred highlighting.
|
|
|
|
Note: these delays cannot be changed dynamically and should be configured
|
|
before the plugin loads (e.g., in your vimrc).
|
|
|
|
Default: 50
|
|
|
|
*g:matchup_matchparen_deferred_hide_delay*
|
|
|
|
If the cursor has not stopped moving, assume highlight is stale after this
|
|
many milliseconds. Stale highlights are hidden.
|
|
|
|
Note: this option cannot be changed dynamically.
|
|
|
|
Default: 700
|
|
|
|
*g:matchup_matchparen_deferred_fade_time* *matchup-fading*
|
|
|
|
When set to {time} in milliseconds, the deferred highlighting behavior
|
|
is changed in two ways:
|
|
1. Highlighting of matches is preserved for at least {time} even when
|
|
the cursor is moved away.
|
|
2. If the cursor stays on the same match for longer than {time},
|
|
highlighting is cleared.
|
|
The effect is that highlighting occurs momentarily and then disappears,
|
|
regardless of where the cursor is. It is possible that fading takes
|
|
longer than {time}, if vim is busy doing other things.
|
|
|
|
This value should be greater than the deferred show delay.
|
|
Note: this option cannot be changed dynamically.
|
|
|
|
Example: >
|
|
|
|
let g:matchup_matchparen_deferred = 1
|
|
let g:matchup_matchparen_deferred_fade_time = 450
|
|
<
|
|
Default: 0 (fading disabled)
|
|
|
|
*g:matchup_matchparen_pumvisible*
|
|
|
|
If set to 1, matches will be made even when the |popupmenu-completion| is
|
|
visible. If you use an auto-complete plugin which interacts badly with
|
|
matching, set this option to 0.
|
|
|
|
Default: 1
|
|
|
|
*g:matchup_matchparen_nomode*
|
|
|
|
When not empty, match highlighting will be disabled in the specified modes,
|
|
where each mode is a single character like in the |mode()| function. E.g., to
|
|
disable highlighting in insert mode,
|
|
>
|
|
let g:matchup_matchparen_nomode = 'i'
|
|
<
|
|
and in visual modes,
|
|
>
|
|
let g:matchup_matchparen_nomode = "vV\<c-v>"
|
|
<
|
|
Note: In visual modes, this takes effect only after moving the cursor.
|
|
|
|
Default: ''
|
|
|
|
*g:matchup_matchparen_hi_surround_always*
|
|
|
|
Always highlight the surrounding words, if possible. This is like
|
|
|<plug>(matchup-hi-surround)| but is updated each time the cursor moves.
|
|
This requires deferred matching (|g:matchup_matchparen_deferred| = 1).
|
|
|
|
Default: 0
|
|
|
|
*g:matchup_matchparen_hi_background*
|
|
|
|
Highlight buffer background between matches. This uses the `MatchBackground`
|
|
highlighting group and is linked to `ColorColumn` by default but can be
|
|
configured with >
|
|
|
|
:hi MatchBackground guibg=grey ctermbg=grey
|
|
<
|
|
Default: 0
|
|
|
|
Module motion~
|
|
|
|
*g:matchup_motion_override_Npercent*
|
|
|
|
In vim, {count}% goes to the {count} percentage in the file (see |N%|).
|
|
match-up overrides this motion for small {count} (by default, anything less
|
|
than 7). For example, to allow {count}% for {count} up to 11, >
|
|
let g:matchup_motion_override_Npercent = 11
|
|
<
|
|
To disable this feature, and restore vim's default {count}%, >
|
|
let g:matchup_motion_override_Npercent = 0
|
|
<
|
|
*g:matchup_motion_cursor_end*
|
|
|
|
If enabled, cursor will land on the end of mid and close words while
|
|
moving downwards (|%|/|]%|). While moving upwards (|g%|, |[%|) the cursor
|
|
will land on the beginning. Set to 0 to disable.
|
|
Note: this has no effect on operators: `d%` will delete |inclusive| of the
|
|
ending word (this is compatible with matchit).
|
|
|
|
Default: 1
|
|
|
|
*g:matchup_delim_count_fail*
|
|
|
|
When disabled (default), giving an invalid count to the |[%| and |]%| motions
|
|
and the text objects |i%| and |a%| will cause the motion or operation to fail.
|
|
When enabled, they will move as far as possible.
|
|
Note: targeting high counts when this option is enabled can become slow
|
|
because many positions need to be tried before giving up.
|
|
|
|
Default: 0
|
|
|
|
Module text_obj~
|
|
|
|
*g:matchup_text_obj_linewise_operators*
|
|
|
|
Modifies the set of operators which may operate line-wise with |i%|
|
|
(see |matchup-feat-linewise|).
|
|
|
|
You may use 'v', 'V', and "\<c-v>" (i.e., an actual CTRL-V character) to the
|
|
specify the corresponding visual mode.
|
|
|
|
You can also specify custom plugin operators with 'g@' and optionally, an
|
|
expression separated by a comma. For example, to make |commentary|'s |gc|
|
|
mapping work likewise when used in the operator `gci%`, >
|
|
|
|
function! IsCommentaryOpFunc()
|
|
return &operatorfunc ==? matchstr(maparg('<Plug>Commentary', 'n'),
|
|
\ '\c<SNR>\w\+\ze()\|set op\%(erator\)\?func=\zs.\{-\}\ze<cr>')
|
|
endfunction
|
|
|
|
let g:matchup_text_obj_linewise_operators = ['d', 'y',
|
|
\ 'g@,IsCommentaryOpFunc()']
|
|
<
|
|
Default: `['d', 'y']`
|
|
|
|
Module surround~
|
|
|
|
*g:matchup_surround_enabled*
|
|
|
|
Enables the surround module which provides maps |ds%| and |cs%|.
|
|
|
|
Default: 0
|
|
|
|
------------------------------------------------------------------------------
|
|
File type options~
|
|
*matchup-file-types*
|
|
|
|
*matchup-latex*
|
|
LaTeX~
|
|
|
|
By default, match-up is disabled for tex files when the plugin |vimtex| is
|
|
detected. To enable match-up for tex files, use the following in your vimrc: >
|
|
|
|
let g:matchup_override_vimtex = 1
|
|
<
|
|
This will replace vimtex's built-in highlighting and `%` map.
|
|
|
|
Note: matching may be computationally intensive for complex LaTeX documents.
|
|
If you experience slowdowns, consider using the following option: >
|
|
|
|
let g:matchup_matchparen_deferred = 1
|
|
<
|
|
Match preferences~ *g:matchup_matchpref*
|
|
|
|
A limited number of common preferences are available which affect how
|
|
matching is done for a particular filetype. They may be set through the
|
|
`matchup_matchpref` dictionary: >
|
|
|
|
let g:matchup_matchpref[&filetype].option_name = 1
|
|
<
|
|
HTML
|
|
|
|
*g:matchup_matchpref.html.nolists*
|
|
|
|
When set to 1, this option disables matching and navigation between groups
|
|
of list items in HTML documents such as the following >
|
|
|
|
<ul>
|
|
<li>One</li>
|
|
<li>Two</li>
|
|
</ul>
|
|
<
|
|
By default, `%` will navigate from `<ul>` to `<li>` to `<li>` to `</ul>`.
|
|
|
|
Default: 0
|
|
|
|
*g:matchup_matchpref.html.tagnameonly*
|
|
|
|
When set to 1, only the tag name will be highlighted, not the rest of the
|
|
tag, e.g., the "a" in >
|
|
|
|
<a href="http://example.com">Link</a>
|
|
<
|
|
This works for xml, html, and some other html-based types.
|
|
|
|
Default: 0
|
|
|
|
Customization~
|
|
|
|
*g:matchup_hotfix[&filetype]* *matchup-hotfix*
|
|
|
|
For each file type, this option can be set to the string name of a function
|
|
which will be called when loading files, prior to checking |b:match_words|
|
|
and |b:match_skip|. This option can be used to quickly customize matching for
|
|
particular file types: >
|
|
|
|
function! VimHotfix()
|
|
" customization
|
|
endfunction
|
|
let g:matchup_hotfix['vim'] = 'VimHotfix'
|
|
|
|
*b:matchup_hotfix*
|
|
|
|
This is an alternative buffer-local name for adding customization.
|
|
|
|
*matchup#util#patch_match_words* *matchup-patch*
|
|
>
|
|
call matchup#util#patch_match_words(before, after)
|
|
<
|
|
This function replaces the literal string `before` contained in |b:match_words|
|
|
with the literal string `after`. When placed in an autocommand or in the file
|
|
`after/ftplugin/{&filetype}.vim`, it can be used to customize the matching
|
|
regular expressions for a particular file type.
|
|
|
|
*matchup#util#append_match_words* *matchup-append*
|
|
>
|
|
call matchup#util#append_match_words(str)
|
|
<
|
|
Adds a set of patterns to |b:match_words|, adding a comma if necessary.
|
|
|
|
==============================================================================
|
|
FAQ *matchup-faq*
|
|
|
|
Q match-up doesn't work
|
|
|
|
A This plugin requires at least vim 7.4. It should work in vim 7.4.898 but at
|
|
least vim 7.4.1689 is better. I recommend using the most recent version of
|
|
vim if possible.
|
|
|
|
If you have issues, please tell me your vim version and error messages. Try
|
|
updating vim and see if the problem persists.
|
|
|
|
Q Why does jumping not work for construct X in language Y?
|
|
|
|
A Please open a new issue
|
|
|
|
Q Highlighting is not correct for construct X
|
|
|
|
A match-up uses matchit's filetype-specific data, which may not give
|
|
enough information to create proper highlights. To fix this, you may
|
|
need to modify |b:match_words|.
|
|
|
|
For help, please open a new issue and be a specific as possible.
|
|
|
|
Q I'm having performance problems
|
|
|
|
A match-up aims to be as fast as possible, but highlighting matching words can
|
|
be intensive and may be slow on less powerful machines. There are a few
|
|
things you can try to improve performance:
|
|
|
|
- Update to a recent version of vim. Newer versions are faster, more
|
|
extensively tested, and better supported by match-up.
|
|
|
|
- Try deferred highlighting, which delays highlighting until the cursor is
|
|
stationary to improve cursor movement performance.
|
|
|g:matchup_matchparen_deferred|
|
|
|
|
- Lower the highlighting timeouts. If highlighting takes longer than the
|
|
timeout, highlighting will not be attempted again until the cursor moves.
|
|
|g:matchup_matchparen_timeout|, |g:matchup_matchparen_insert_timeout|
|
|
|
|
If are having any other performance issues, please open a new issue and
|
|
report the output of `:MatchupShowTimes`.
|
|
|
|
Q Why is there a weird entry on the status line?
|
|
|
|
A This is a feature which helps you see matches that are outside of the
|
|
vim screen, similar to some IDEs. If you wish to disable it, use >
|
|
|
|
let g:matchup_matchparen_offscreen = {}
|
|
<
|
|
Q Matching does not work when lines are too far apart.
|
|
|
|
A The number of search lines is limited for performance reasons. You may
|
|
increase the limits with the following options: >
|
|
|
|
let g:matchup_delim_stopline = 1500 " generally
|
|
let g:matchup_matchparen_stopline = 400 " for match highlighting only
|
|
<
|
|
Q The maps `1i%` and `1a%` are difficult to press.
|
|
|
|
A You may use the following maps `I%` and `A%` for convenience: >
|
|
|
|
function! s:matchup_convenience_maps()
|
|
xnoremap <sid>(std-I) I
|
|
xnoremap <sid>(std-A) A
|
|
xmap <expr> I mode()=='<c-v>'?'<sid>(std-I)':(v:count?'':'1').'i'
|
|
xmap <expr> A mode()=='<c-v>'?'<sid>(std-A)':(v:count?'':'1').'a'
|
|
for l:v in ['', 'v', 'V', '<c-v>']
|
|
execute 'omap <expr>' l:v.'I%' "(v:count?'':'1').'".l:v."i%'"
|
|
execute 'omap <expr>' l:v.'A%' "(v:count?'':'1').'".l:v."a%'"
|
|
endfor
|
|
endfunction
|
|
call s:matchup_convenience_maps()
|
|
<
|
|
Note: this is not compatible with the plugin targets.vim.
|
|
|
|
Q How can I contribute?
|
|
|
|
A Read the contribution guidelines (CONTRIBUTING.md) and issue template
|
|
(ISSUE_TEMPLATE.md). Be as precise and detailed as possible when submitting
|
|
issues and pull requests.
|
|
|
|
==============================================================================
|
|
INTEROPERABILITY *matchup-interoperability*
|
|
|
|
vimtex, for LaTeX documents~
|
|
|
|
By default, match-up will be disabled automatically for tex files when vimtex
|
|
is detected. To enable match-up for tex files, use >
|
|
|
|
let g:matchup_override_vimtex = 1
|
|
<
|
|
match-up's matching engine is more advanced than vimtex's and supports middle
|
|
delimiters such as `\middle|` and `\else`. The exact set of delimiters recognized
|
|
may differ between the two plugins. For example, the mappings `da%` and `dad`
|
|
will not always match, particularly if you have customized vimtex's delimiters.
|
|
|
|
Matchit~
|
|
|
|
matchit.vim should not be loaded. If it is loaded, it must be loaded after
|
|
match-up (in this case, matchit.vim will be disabled). Note that some plugins,
|
|
such as vim-sensible, load matchit.vim so these must also be initialized after
|
|
match-up.
|
|
|
|
Matchparen emulation~
|
|
|
|
match-up loads |matchparen| if it is not already loaded. Ordinarily, match-up
|
|
disables matchparen's highlighting and emulates it to highlight the symbol
|
|
contained in the 'matchpairs' option (by default `()`, `[]`, and `{}`). If match-up
|
|
is disabled per-buffer using |b:matchup_matchparen_enabled|, match-up will use
|
|
matchparen instead of its own highlighting. See |b:matchup_matchparen_fallback|
|
|
for more information.
|
|
|
|
Other plugins~
|
|
|
|
match-up does not currently provide support for auto-completion. The
|
|
following plugins may be useful for this:
|
|
|
|
- |vim-endwise| https://github.com/tpope/vim-endwise
|
|
- |auto-pairs| https://github.com/jiangmiao/auto-pairs
|
|
- |delimitMate| https://github.com/Raimondi/delimitMate
|
|
- |splitjoin.vim| https://github.com/AndrewRadev/splitjoin.vim
|
|
|
|
There is basic support for deleting and changing surroundings, but you may
|
|
prefer to use one of the following:
|
|
|
|
- |vim-surround| https://github.com/tpope/vim-surround
|
|
- |vim-sandwich| https://github.com/machakann/vim-sandwich
|
|
|
|
==============================================================================
|
|
ACKNOWLEDGMENTS *matchup-acknowledgments*
|
|
|
|
Origins~
|
|
|
|
|match-up| was originally based on Karl Yngve Lervåg's |vimtex|. The concept
|
|
and style of this plugin and its development are heavily influenced by vimtex.
|
|
|
|
[vimtex]: https://github.com/lervag/vimtex
|
|
|
|
Other inspirations~
|
|
|
|
- |matchit|
|
|
- |matchparen|
|
|
- |MatchTag| https://github.com/gregsexton/MatchTag
|
|
- |MatchTagAlways| https://github.com/Valloric/MatchTagAlways
|
|
|
|
==============================================================================
|
|
DEVELOPMENT *matchup-development*
|
|
|
|
Development is tracked at https://github.com/andymass/vim-matchup.
|
|
|
|
Reporting problems~
|
|
|
|
This is a new plugin and there are likely to be some bugs. Thorough
|
|
issue reports are encouraged. Please read the issue template first
|
|
(ISSUE_TEMPLATE.md). Be as precise and detailed as possible when submitting
|
|
issues.
|
|
|
|
Feature requests are also welcome.
|
|
|
|
Contributing~
|
|
|
|
Please read the contribution guidelines (CONTRIBUTING.md) before contributing.
|
|
|
|
==============================================================================
|
|
vim:tw=78:ts=8:ft=help:norl:fen:fdl=0:fdm=marker
|