Поиск назад для выбора визуального режима - PullRequest
1 голос
/ 09 апреля 2020

Я хочу переназначить мои # и * клавиши в визуальном режиме в Vim, чтобы я мог выделить часть текста и искать его вперед и назад соответственно. С помощью предыдущего ответа мне удалось заставить работать поиски вперед. Однако у меня возникают трудности с поиском работы в обратном направлении. Ниже приведены соответствующие части моего .vimrc.

function! GetVisualSelection() abort
  try
    let a_save = @a
    silent! normal! gv"ay
    return @a
  finally
    let @a = a_save
  endtry
endfunction

" Map # and * to search for the highlighted text in visual mode
vnoremap <silent> * <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>n
vnoremap <silent> # <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>N

Начальное выделение и поиск в обратном направлении работают хорошо, но затем, когда я нажимаю n, чтобы искать следующее вхождение назад, вместо этого Vim возобновляет поиск вперед. Я подозреваю, что это связано с тем, что при поиске в обратном направлении вместо / используется оператор ?, что означало бы, что мне придется нажимать N вместо n. Однако это противоречит интуитивно понятному режиму работы # в обычном режиме, поэтому я попытался присвоить выбор регистру ?, но обнаружил, что нет регистра с именем ?. Как бы я решил эту проблему? В идеале я бы предпочел сделать это без установки плагина.

1 Ответ

2 голосов
/ 10 апреля 2020

Нет опции, которую вы можете включить или выключить, чтобы определить, к сожалению, должен быть поиск вперед или назад. Таким образом, самый простой способ - это выполнить поиск с помощью / или ?.

. В вашем случае:

vnoremap <silent> * <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>/<CR>
vnoremap <silent> # <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>?<CR>

Поиск без аргументов просто повторяет последний шаблон (см. :help ?<CR> )


Хотя я чувствую, что определение функции для этой цели немного излишне, вот что я имею в своем vimr c:

vnoremap * y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>/<CR>
vnoremap # y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>?<CR>

Здесь я копирую выделение установите регистр @/ для скопированного текста и выполните поиск таким же образом, как я показал выше. <C-r> позволяет пропустить содержимое регистра (см. :help <C-r>)

...