«Найди следующего» в Vim

536

Для поиска вперед в Vim cake, я бы набрал /cake, но курсор переходит к первому совпадению, когда я нажимаю return. Есть ли команда Vim, аналогичная команде «найти следующее»?

Yktula
источник
33
Привыкайте к использованию :help. :help /показывает справку о поиске, и ответ на ваш вопрос появляется чуть-чуть вниз по странице.
Крис Морган

Ответы:

878

Это nдля следующего и Nдля предыдущего.

И если вы используете обратный поиск с ?(например, ?cake) вместо /, это наоборот.

Если он установлен в вашей системе, вы должны попытаться запустить vimtutorкоманду с вашего терминала, которая запустит учебник по основным командам Vim.

Rob Wells советы о том, *и #это тоже очень уместны.

Ксавье Т.
источник
1
см. также плагин поиска по индексу vim.org/scripts/script.php?script_id=1682
SergioAraujo
Есть ли способ перейти к следующему совпадению (не в текущей строке)?
user13107
@ user13107: n и N работают на весь буфер / файл. Вы не ограничены текущей строкой.
Ксавье Т.
@XavierT. Любая идея, как я могу перейти на фиксированное количество результатов в поиске. Я имею в виду, например, перейти к 10-й линии соответствия
GP cyborg
@GPcyborg: nкак и у большинства операторов vim, для повторения команды можно добавить префикс с номером. Если вы введете текст, 10nон перейдет к 10-му результату (после исходного). Это также работает для всех операторов движения, как 3jспуститься на 3 строки.
Ксавье Т.
212

Самый полезный ярлык в Vim, IMHO, это *ключ.

Поместите курсор на слово и нажмите *клавишу, и вы перейдете к следующему экземпляру этого слова.

#Ключ делает то же самое, но он переходит к предыдущему примеру слова.

Это действительно экономит время.

Роб Уэллс
источник
6
И в случае, если это не было очевидно, nи Nпроведет вас вперед и назад по *матчам, как только вы нажали *. (Или вы можете просто нажимать, *чтобы идти вперед или #назад, но использование этих сдвинутых клавиш, как правило, неоптимально.)
Герберт Ситц,
3
@ Херберт, на самом деле n и N не ведут вас вперед и назад. Как отмечалось выше @Xavier, n является следующим, а N является предыдущим . Управление поиском вперед и назад осуществляется путем указания поиска клавишей «/» и «?» или с помощью клавиши «*» и клавиши «#».
Роб Уэллс
Я не думаю, что * это полезно ... большую часть времени я ищу фрагмент слова (например, часть имени функции). Я не хочу, чтобы /Funcон взял меня, SomeFuncа затем нажмите «*», чтобы перейти к следующему экземпляру, SomeFuncкогда следующий экземпляр Funcнаходится в SomeOtherFunc.
weberc2
Еще хуже то, что с C ++ я считаю, что это не идет от вызова метода к реализации метода, потому /\<foo\>что не совпадает"className::foo()"
puk
84

Когда я начинал, мне нужно было посмотреть демо .

Как искать в Vim

  1. тип /
  2. введите поисковый запрос, например, "var"
  3. Нажмите enter
  4. для следующего экземпляра нажмите n(для предыдущего N )
iamnotsam
источник
2
Печатание *неверно. Т.е. файл aa aaa. Поиск /aa, вы должны совпадать. При первом совпадении нажатие *меняет условие поиска.
Бернхард
1
n не «следующий», а «повторить последний поиск». Таким образом, ввод? Var начнет поиск вверх от вашей текущей позиции для 'var'. И «N» на самом деле «повторяет последний поиск в противоположном направлении», так что для этого примера, который будет искать вниз «var» с текущей позиции.
Роб Уэллс
17

Возможно, вы ищете nключ.

Сэм Хоцевар
источник
16

Печатание nпойдет на следующий матч.

Джим девиль
источник
13

Как уже говорилось, есть несколько способов поиска:

/pattern
?pattern
* (and g*, which I sometimes use in macros)
# (and g#)

плюс, навигация назад / вперед с помощью Nи n.

Вы также можете отредактировать / вызвать историю поиска, открыв строку поиска с помощью, /а затем циклически нажав C-p/ C-n. Еще более полезным является то q/, что вы попадете в окно, где вы можете перемещаться по истории поиска.

Также для рассмотрения является все важное 'hlsearch'(тип, :hlsчтобы включить). Это значительно упрощает поиск нескольких экземпляров вашего шаблона. Возможно, вы даже захотите сделать ваши спички более яркими, например:

hi Search ctermfg=yellow ctermbg=red guifg=...

Но тогда вы можете сойти с ума от постоянных желтых матчей по всему экрану. Так что вы часто будете использовать :noh. Это так часто, что отображение в порядке:

nmap <leader>z :noh<CR>

Я легко запоминаю этот, zпоскольку я постоянно печатал /zz<CR>(что является необычным быстрым вводом), чтобы очистить подсветку. Но :nohотображение намного лучше.

Мика Эллиотт
источник
2
Если вы чувствуете себя вдохновленным q/, вы также должны поиграть с q:. Оба действительно удобны! (Хотя на самом деле не имеет отношения к этому вопросу.)
Мика Эллиотт
Спасибо, Михей. Я уже знал о «q:», хотя я не так часто его использую. Но «q /» был полностью пропущен в моем образовании vim, и я думаю, что он будет очень полезен.
Конюшня
2

Если вы нажмете Ctrl+ Enterпосле того, как нажмете что-то вроде «/ wordforsearch», то вы можете найти слово «wordforsearch» в текущей строке. Затем нажмите nдля следующего матча; нажмите Nдля предыдущего матча.

бас чак
источник
1
«Когда мы выполняем поиск, Vim сканирует вперед с текущей позиции курсора, останавливаясь на первом найденном совпадении». Как отмечает Практик Vim.
Бас Чак