Зачем нужен ENTER при выполнении обратного поиска из командной строки Vim? - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь запустить vim для файла и выполнить команду поиска, чтобы доставить меня в правильное местоположение.

Когда я использую:

vi myfile.py -c /print

правильно переводит курсор на строку (a) с первым появлением.

Однако, когда я использую опцию обратного поиска:

vi myfile.py -c ?print

мне кажется, что мне нужно нажать ENTER , прежде чем продолжить:

"myfile.py" 470L, 19634C
Press ENTER or type command to continue

После того, как я нажал ENTER , он находится на последней строке, содержащей ожидаемый текст, я просто не уверен , почему Мне нужно нажать ENTER первый.

Есть ли способ сделать это и сразу перейти к правильному тексту?


(а) Это еще одна загадка. Если я ищу в Vim, курсор находится в правильном месте на строке, а не на первом непробельном символе. Я думаю , потому что они обрабатываются как ex команды, а не vi команды (так что :/print вместо /print).

Ответы [ 2 ]

1 голос
/ 14 июня 2019

«поиск достигнет ТОП, продолжая НИЖНЯЯ», будет отображаться всякий раз, когда ваш поиск обтекает документ, если у вас нет s в вашем shortmess (:help 'shortmess').Это всегда будет происходить, если вы будете искать в обратном направлении с первой строки, но не произойдет, если вы будете искать в обратном направлении.

Могут быть и другие сообщения;проверьте :messages, чтобы увидеть, что все, что появилось.«Нажмите ENTER или введите команду для продолжения» (:help hit-enter) появляется, когда вы не можете разместить все сообщения на высоте командной строки (:help 'cmdheight'), и Vim боится, что вы что-то пропустите.

Я полагаю, что при поиске в обратном направлении Vim отображает ваше имя файла, а затем выводит запрос обтекания;и ваш cmdheight установлен на 1.

Вы можете попытаться избежать этого либо с помощью set cmdheight=2 (освободить место для обоих сообщений), либо с помощью set shortmess+=s (не отображать обтекание поиска)сообщение) в вашем vimrc.Третьим способом было бы явное предотвращение сообщения обтекания поиска только в этом случае, в отличие от установки глобальной опции (:help :silent): vim myfile.py -c "silent ?print"


Вы правы в том, что -c выполняетсябывшая команда;-c /print на самом деле делает :/print, а не /print (:help :/), поэтому вы приземляетесь в начале строки, а не в матче.

Вы можете обойти это явноиспользуя поиск в обычном режиме (help :normal).Обратите внимание, что каждая команда, переданная на :normal, должна быть завершена, иначе она будет отменена, поэтому нам также необходимо включить заключительный ключ Enter:

vim myfile.py +"norm /print^M"

, где ^M равно Ctrl-V Введите (я также использую + в качестве более короткого эквивалента опции командной строки -c: :help +cmd.) Если вам нужно написать скрипт и, таким образом, вставить литерал ^M не очень хорошо, вы также можете использовать это (:help :execute), чтобы иметь возможность использовать имя ключа Vim (:help key-notation):

vim myfile.py +'exe "norm /print\<cr>"'

Вместе с предыдущим выпуском оEnter, вы можете использовать следующую комбинированную команду для поиска последней print, приземлившись прямо на нее и не нажимая Enter.Это немного чудовищно, поэтому вы можете захотеть создать функцию bash или даже функцию Vim, если вам захочется использовать ее часто:

vim myfile.py +'exe "sil norm ?print\<cr>"'

Здесь вы можете использовать функцию Vim.просто добавьте в свой vimrc:

function! g:norm_silently(what)
  exe "sil norm " . a:what . "\<cr>"
endfunction
command! -nargs=1 F call g:norm_silently(<q-args>)

, который затем можно использовать как:

vim myfile.py +'F ?print'
0 голосов
/ 14 июня 2019

После дополнительного исследования, похоже, что сноска (a) в вопросе содержит ключ.Эти действительно являются командами в стиле *, поэтому они идут в начало строки.Об этом свидетельствует тот факт, что $ идет до последней строки, , а не G.

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

vim myfile.py -c \$ -c /print

И , что является фактическим решением.При условии, что последняя строка не содержит строку, которую вы ищете, используйте $, чтобы перейти к последней строке, а затем поиск в обратном направлении с помощью ?print поставит вас на последнюю строку с этой строкой, без необходимости нажимать ENTER .

...