не останавливать сопоставление при не найдено

#vim #macros

#vim #макросы

Вопрос:

Существует важная часть сопоставления vim:

:map <C-j>r f{^

Я заметил, что когда { символ не найден в строке, остальная часть сопоставления не выполняется.

Есть ли способ, как принудительно продолжить сопоставление, даже если символ поиска не найден? (В этом случае выполните возврат к началу файла)

Комментарии:

1. во-первых, это не макрос, это сопоставление. можете ли вы вставить полный файл map cmd, чтобы мы могли видеть, что вы хотите сделать? теперь вы просто хотите перейти к { затем перейдите к 1-му непустому, что не имеет смысла.

2. Это не имеет смысла, но он все еще ведет себя так, как он описывает, что мне кажется странным.

3. @Kent спасибо за исправление моей терминологии, изменено на mapping . Ну, я только что опубликовал соответствующую часть mapping , я думаю, что за это можно отвечать, не зная контекста. Я не хочу объяснять это здесь, потому что я пытался свести вопрос к сути.

Ответ №1:

Да, Vim прерывается при ошибке в сопоставлении. Вы можете использовать :silent! normal! ... для продолжения независимо от ошибок. С помощью последовательности :normal! команд вы даже можете проверить (например, переместился ли курсор) и отреагировать на это. Эскиз:

 :map <C-j>r :exe 'normal! maf{'<Bar>if getpos("'a") == getpos(".")<Bar>echo "no move"<Bar>endif<CR>
  

Обратите внимание, что это плохо масштабируется. Вам лучше переместить команды в :function .

Кроме того, вам, вероятно, следует использовать :noremap ; это делает сопоставление невосприимчивым к переназначению и рекурсии.

Буквальный ответ на этот вопрос был бы:
:map <C-j>r :silent! exe "normal f{^"<CR>

Комментарии:

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