изменить приоритеты vim

У меня есть четыре следующих типа выделения в моем .vimrc (каждый отображает разные цвета):

  • incsearch (совпадения с подсветкой по мере поиска)
  • match (текущее слово, a la visual studio editor)
  • 2match (конечные пробелы в конце строки)
  • hlsearch (обычный поиск /)

Приоритет выделения, похоже, точно такой, как я перечислял выше. Например. инкрементная раскраска поиска будет отменять любой из других совпадений цветов, если присутствует в том же символе.

Я хотел бы сделать hlsearch второй в приоритете, так что он переопределяет цвета match и 2match (если присутствует в том же символе).

Есть ли способ сделать это?

Для справки, это соответствующие строки в моем файле .vimrc :

[...]
set hlsearch
set incsearch
[...]
function Matches()
    highlight curword ctermbg=darkgrey cterm=bold gui=bold guibg=darkgrey
    silent! exe printf('match curword /\V\<%s\>/', escape(expand(''), '/\'))
    highlight eolspace ctermbg=red guibg=red
    2match eolspace /\s\+$/
endfunction
au CursorMoved * exe 'call Matches()'
[...]
4
nl ja de

2 ответы

Приоритет всего, что вы используете, исправлен; единственный способ указать приоритет - через matchadd() , который вы можете использовать для замены : match и : 2match . Поскольку приоритет hlsearch равен нулю, вам необходимо передать отрицательный приоритет, например. -1).

Например, замените

:match Match /\<\w\{5}\>/

с

if exists(w:lastmatch)
    call matchdelete(w:lastmatch)
endif
let w:lastmatch = call matchadd('Match', '\<\w\{5}\>', -1)
7
добавлено
Вы должны помнить возвращенный идентификатор и matchdelete() его при следующем вызове. Вероятно, вы, вероятно, определите для этого обычную команду : Match , поэтому добавьте эту дополнительную логику.
добавлено автор Ingo Karkat, источник
Готово. Я использовал локальную переменную окна, потому что совпадения также привязаны к окну. Пожалуйста, не забудьте принять мой ответ.
добавлено автор Ingo Karkat, источник
Это фиксирует приоритеты, но вводит проблему: matchadd не будет заменять предыдущее совпадение, вместо этого он добавляет новый. Следовательно, оно больше не соответствует текущему слову, а текущим словам и всем предыдущим .
добавлено автор STenyaK, источник
Спасибо, это сработало. Измените свой ответ, чтобы убедиться, что matchadd не эквивалентен совпадению при повторном использовании, если требуется if exists (g: lastmatch) call matchdelete (g: lastmatch) endif; let g: lastmatch = вызов matchadd (...)
добавлено автор STenyaK, источник

Приоритет всего, что вы используете, исправлен; единственный способ указать приоритет - через matchadd() , который вы можете использовать для замены : match и : 2match . Поскольку приоритет hlsearch равен нулю, вам необходимо передать отрицательный приоритет, например. -1).

Например, замените

:match Match /\<\w\{5}\>/

с

if exists(w:lastmatch)
    call matchdelete(w:lastmatch)
endif
let w:lastmatch = call matchadd('Match', '\<\w\{5}\>', -1)
7
добавлено
Вы должны помнить возвращенный идентификатор и matchdelete() его при следующем вызове. Вероятно, вы, вероятно, определите для этого обычную команду : Match , поэтому добавьте эту дополнительную логику.
добавлено автор Ingo Karkat, источник
Готово. Я использовал локальную переменную окна, потому что совпадения также привязаны к окну. Пожалуйста, не забудьте принять мой ответ.
добавлено автор Ingo Karkat, источник
Это фиксирует приоритеты, но вводит проблему: matchadd не будет заменять предыдущее совпадение, вместо этого он добавляет новый. Следовательно, оно больше не соответствует текущему слову, а текущим словам и всем предыдущим .
добавлено автор STenyaK, источник
Спасибо, это сработало. Измените свой ответ, чтобы убедиться, что matchadd не эквивалентен совпадению при повторном использовании, если требуется if exists (g: lastmatch) call matchdelete (g: lastmatch) endif; let g: lastmatch = вызов matchadd (...)
добавлено автор STenyaK, источник