ViM: поиск и выделение, но не прыгать - PullRequest
42 голосов
/ 23 ноября 2010

Клавиша super star (*) в ViM будет искать слово под курсором и переходить к следующему совпадению. Пользователь может перейти к следующим матчам с помощью клавиши n. Если hlsearch включен, он также подсвечивает совпадения.

Я хочу иметь возможность нажимать * и получать выделенные совпадения и иметь возможность перемещаться по совпадениям с помощью клавиши n. Однако я не хочу, чтобы ViM переходил к следующему совпадению при нажатии *, оно должно оставаться в текущем слове. Есть ли способ сделать это?

Ответы [ 9 ]

26 голосов
/ 23 ноября 2010

Я бы отобразил:

nnoremap * *``

Работает точно так, как вы хотите, за исключением того, что он добавляет переход в список переходов.Для предотвращения этого вам необходимо:

nnoremap * :keepjumps normal *``<cr>
6 голосов
/ 03 декабря 2012

Лучшее решение:

  1. не добавлять прыжок в список прыжков
  2. поведение звездочки не изменится

Итак, попробуйте плагин: http://www.vim.org/scripts/script.php?script_id=4335

Намного лучше, чем:

" a jump adds to the jump list
nnoremap * *``
" I got a dead loop on macvim
nnoremap * :keepjumps normal *``<cr>
" the behavior is changed
nnoremap <silent> <Leader>* :let @/='\<<C-R>=expand("<cword>")<CR>\>'<CR>:set hls<CR>
5 голосов
/ 28 января 2011

Если вы хотите сохранить текущий вид и добавить поиск в историю, попробуйте это [не очень эффективное] решение:

noremap * msHmt`s*`tzt`s

Используются метки s (сохранить) и t (вверху).

5 голосов
/ 24 ноября 2010

В моем .vimrc есть следующее, которое, я думаю, работает лучше, чем другие альтернативы:

" Put word under cursor into search register and highlight
nnoremap <silent> <Leader>* :let @/='\<<C-R>=expand("<cword>")<CR>\>'<CR>:set hls<CR>
vnoremap <silent> <Leader>* :<C-U>
  \let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
  \gvy:let @/=substitute(
  \escape(@", '/\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR>
  \gV:call setreg('"', old_reg, old_regtype)<CR>:set hls<CR>
3 голосов
/ 30 января 2017

Я еще не видел этого:

nmap <silent> * "syiw<Esc>: let @/ = @s<CR>

Он очень короткий и не требует прыжков, что может привести к миганию.

Объяснение:скопируйте слово под курсором в регистр s, а затем установите регистр поиска (/) на содержимое регистра s.Регистр поиска не может быть записан напрямую, поэтому необходим let и, следовательно, silent для поддержания командной строки vim в чистоте.

3 голосов
/ 23 ноября 2010

Мне пришло в голову простое решение: поместите map * *# в .vimrc файл (хотя он будет мигать).

1 голос
/ 20 апреля 2018

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

nnoremap <silent> * :let @/= '\<' . expand('<cword>') . '\>' <bar> set hls <cr>

Или, если вы хотите поведение g*:

nnoremap <silent> g* :let @/=expand('<cword>') <bar> set hls <cr>
0 голосов
/ 23 января 2019

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

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

  • Мой Плагин SearchHighlighting изменяет команду *, расширяет ее до визуального выбора и предлагает опциональный автоматический поиск слова под курсором.
  • поиск по звездам изменяет поведение *, чтобы не переходить к следующему совпадению, и включает визуальный поиск из следующего плагина
  • vim-visual-star-search обеспечивает поиск визуального выделения
  • visualstar.vim обеспечивает поиск визуального выбора
  • select & search может использовать либо n/N или * в визуальном отборе, и может избежать прыжков.
  • vim-asterisk обеспечивает отображение z*, которое также не прыгает, визуальное *, более интуитивно понятное управление смарт-регистром и может сохранять положение курсора при прыжке (например, ,*)
  • searchant.vim подключается к встроенным командам поиска и обеспечивает отдельную подсветку для последнего прыжкового совпадения.
0 голосов
/ 15 августа 2018

Другие ответы здесь хороши, особенно @ rodrigo, но я хотел написать решение, которое сохраняет положение прокрутки и делает это, не затрагивая ни одну из меток.

Это работает для меня:

function! StarPositionSave()
  let g:star_position_cursor = getpos('.')
  normal! H
  let g:star_position_top = getpos('.')
  call setpos('.', g:star_position_cursor)
endfunction
function! StarPositionRestore()
  call setpos('.', g:star_position_top)
  normal! zt
  call setpos('.', g:star_position_cursor)
endfunction
nnoremap <silent> * :call StarPositionSave()<CR>*:call StarPositionRestore()<CR>

Ввод normal! * непосредственно в функцию, похоже, не работает, поскольку (по крайней мере, в neovim) он подавляет подсветку поиска от запуска (как если бы :nohlsearch был запущен).

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