Как применить match () для каждого буфера? - PullRequest
0 голосов
/ 31 января 2019

Я сделал небольшую функцию, которая подсвечивает текущее выделение указанным цветом, вызывая функцию matchadd ().Это в сочетании с картой для более удобного использования.

Это прекрасно работает, за исключением того, что он выполняется только в текущем буфере (или это окно?)

Я пытаюсь использовать только bufdo и windoдо вызова в сопоставлении (см. ниже), но я получаю сообщение об ошибке «Неверный адрес».

function! Mymatch(sel)
    "reselect and copy selection in unnamed reg
    normal gv""y 
    if a:sel == 1
        :call matchadd("MatchYellow",@")
    elseif a:sel == 2
        :call matchadd("MatchGreen",@")
    elseif a:sel == 3
        :call matchadd("MatchRed",@")
    elseif a:sel == 4
        :call matchadd("MatchBlue",@")
    elseif a:sel == 5
        :call matchadd("MatchPurple",@")
    elseif a:sel == 6
        :call matchadd("MatchWhite",@")
    elseif a:sel == 7
        :call matchadd("MatchOrange",@")
    elseif a:sel == 8
        :call matchadd("MatchPink",@")
    elseif a:sel == 9
        :call matchadd("MatchCyan",@")
    else
        :call matchadd("MatchYellow",@")
    endif
endfunction
map mm :call Mymatch(v:count)<CR>

, где MatchYellow и т. д. - группы подсветки, которые я определил

, которые я хотел бы получить, это такое же поведение, как * команда.где все совпадения выделены в каждом файле, который я просматриваю

1 Ответ

0 голосов
/ 01 февраля 2019

Ошибка

Ошибка неверный адрес вызвана введением count в сочетании с синтаксисом :call.Отображение выполняется точно так же, как и набранные команды, поэтому 9: превращается в :.,.+8, а ваш call выполняется несколько раз, по одному разу в каждой из этих строк.Если диапазон не существует, вы получите эту ошибку.Это легко исправить: если вы ссылаетесь на счет с помощью v:count и его нужно вызывать только один раз, вам не нужен диапазон, а команда <C-u> (в режиме командной строки) очищает диапазон:

map mm :<C-u>call Mymatch(v:count)<CR>

Применяя везде

Вы правы, matchadd() добавляет только совпадения для текущего окна.Если у вас есть несколько окон, вам нужно использовать :windo.Если у вас есть дополнительные вкладки, вам также нужно :tabdo.Если вы добавляете дополнительные окна и хотите, чтобы выделение также отображалось там (без необходимости повторного выполнения сопоставления), вам потребуется :autocmd с, например, на WinNew.

Дополнительная критика

  • Вы должны использовать :noremap;это делает отображение невосприимчивым к переназначению и рекурсии.
  • Вам не нужно : перед командами внутри :function.
  • Чтобы сделать ваше отображение более похожим на встроенный-в командах (например, *), оно должно использовать текущее слово (через expand('<cword>')) в обычном режиме и использовать только выделенный текст в визуальном режиме.
  • Ваше условиеэто громоздко.Вместо этого вы могли бы поместить группы выделения в List и использовать счетчик для индексации в нем:
call matchadd('Match' . ['None', 'Yellow', 'Green', 'Red'][a:sel], @")

Плагин альтернативы

Это должно быть ясно поТеперь, когда потребуется довольно много усилий, чтобы превратить ваше отображение в надежное решение.К счастью, эта идея не нова, и существует несколько плагинов на выбор.Мой плагин Mark является одним из таких решений.(На странице плагинов есть ссылки на множество альтернативных плагинов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...