#vim #macvim
#vim #macvim
Вопрос:
В vim / gvim я хотел бы иметь возможность перемещаться к началу и концу текущего поискового запроса. Возможно ли это?
Например, с помощью этого файла:
A dog and a cat
A hat and a bat
Я хотел бы иметь возможность выполнять поиск, например /dogsand
, а затем иметь возможность перемещаться от начала выражения ‘dog and’ к концу и обратно, чтобы мой курсор начинался с столбца 3 под буквой ‘d’ слова ‘dog’, а затем перемещался в столбец 9 под буквой ‘d’ или словом ‘and’.
Причина, по которой я хочу иметь возможность делать это, заключается в том, чтобы я мог выполнять поиск выражения, а затем использовать команду change c
в сочетании с командой movement для замены этого конкретного поискового выражения. Я не хочу использовать здесь substitue и replace, я хочу выполнить эту операцию с помощью команды change и клавиши перемещения.
Ответ №1:
Вы ищете cgn. От :help gn
:
Search forward for the last used search pattern, like
with `n`, and start Visual mode to select the match.
If the cursor is on the match, visually selects it.
If an operator is pending, operates on the match.
E.g., "dgn" deletes the text of the next match.
If Visual mode is active, extends the selection
until the end of the next match.
Прелесть этого в том, что вы можете выполнить cgn, а затем повторить команду с помощью . и, да, она выполнит ту же операцию при следующем совпадении с шаблоном поиска. Это становится чрезвычайно полезным, когда вы начинаете поиск со сложными регулярными выражениями.
Комментарии:
1. Благословляю тебя, Хакер, за ответ на заданный вопрос. Поисковые системы приводят нас к соответствующим вопросам, но так часто мы находим «вместо этого сделайте это». Вы были в восторге от «красоты …», вот почему я знал, что это вопрос для поиска.
Ответ №2:
Попробуйте ths:
/pattern<cr> to place the cursor at the start of search pattern
/pattern/e<cr> to place the cursor at the end of search pattern
Комментарии:
1. Как бы я использовал это в качестве команды перемещения? Я вижу, как это позволяет мне выполнять поиск до конца выражения, но это не команда перемещения.
2. Извините за путаницу со словом
move
здесь./pattern<cr>
поместит курсор в начало шаблона поиска. И/pattern/e<cr>
поместит курсор в конец шаблона поиска.3. Верно, но как это можно использовать в качестве команды перемещения? Пожалуйста, посмотрите мой первоначальный вопрос. Я не могу использовать ваш ответ, например, с помощью команды change.
4. Поиск — это движения. Ответ не так хорош, хотя, потому что есть сокращение для «последнего шаблона поиска»;
//
.5. Обратите внимание, потому что я немного боролся: Если вы используете
?
, вам нужно использовать?pattern?e
.
Ответ №3:
Вы можете перейти к концу сопоставления с помощью c//e<CR>
. И //<CR>
приведет вас к началу следующего соответствия. Вероятно, вы могли бы разработать какие-то привязки для тех, которые имеют смысл. Например, я только что попробовал следующее, и, похоже, это работает хорошо:
:onoremap <silent>m //e<CR>
Чтобы вы могли сказать cm
, что изменения совпадают. Однако я не уверен, к чему бы я сопоставил //<CR>
. Я попытался сопоставить его с n
, и, похоже, это сработало нормально. Не знаю, будет ли это проблемой для вас.
:nnoremap <silent>n //<CR>
Комментарии:
1. Это немного грубо, потому что оно перезаписывает поведение Vim по умолчанию на менее полезное поведение; например, вы не смогли бы этого сделать
[count]n
.2. Согласовано.
gn
Команда, упомянутая в другом ответе, намного лучше, но я не думаю, что она существовала в мае 2011 года.3. @AustinTaylor Спасибо за //e<CR> и //<CR> Я пытался выяснить, как добраться до конца текста поиска. И cgn с периодом отлично подходит для повторной замены. Vim отключается.
4. Вместо этого используйте ответ от @QuinnStrahl, это именно то, что хотел бы здесь пользователь vim, и работает практически во всех связанных ситуациях. Ничего не имею против Остина, который нашел что-то, что может сработать в некоторых похожих ситуациях, и своевременно для задавшего вопрос.
Ответ №4:
Поскольку вы точно знаете, сколько слов вы ищете, почему бы просто не переместиться туда, а затем обратно, используя команды перемещения слов? Т.Е. «2w», чтобы перейти к концу текущего результата поиска, и «2b», чтобы вернуться назад.
Комментарии:
1. Я делаю это в тривиальном примере, но в более сложных случаях это не так просто. Что, если поисковое выражение включало знаки препинания и цифры?