Можно ли с помощью vim выбрать объект heredoc или «здесь документ»?
-
23-09-2019 - |
Вопрос
Одной из сильных сторон Vim является выбор объекта, предлагая быстрое манипулирование содержимым внутри слов, абзацев и различных разделителей.
Например,
vi{
выберет все внутри пары фигурных скобок {}.
Есть ли эквивалентная функция для выбора здесь документ или здесьдок:
<<<HTML
....
....
HTML;
На основе Ответ ErichBSchulz: Я придумал следующее для внутреннего селекта heredoc:
nmap <F6> ?<<<<CR>w*kV?<<<<CR>j
?<<<<CR>w " find beginning tag (after <<<)
*k " find matching end tag and go up 1 line
V " enter visual mode
?<<<<CR>j " find beginning tag and go down 1 line
Решение
Думая о предыдущих постах и пытаясь приблизиться к ним на шаг.Это не будет на 100% надежным (т.е. сломается, если начальный тег встречается внутри heredoc, но что-то вроде:
?<<< "find begining
w " go to starting tag
* " find starting tag
v " enter visual mode (could use Upper V to do an 'ambientish' object select
n " find end tag
e " optional include end tag
Редактировать:Кен улучшил описанную выше последовательность, поэтому я предлагаю вам использовать его лучшее сопоставление клавиш для «внутреннего» выбора heredoc:
nmap <F6> ?<<<<CR>w*kV?<<<<CR>j
(это основано на документации в стиле PHP)
Другие советы
Для выбора документов я обычно помещаю курсор в первую строку над идентификатор Heredoc и нажмите В*
В начнет выбор линии, и * начнет поиск, переходя к следующему совпадению идентификатора, концу heredoc...
А <<''
heredoc завершается пустой строкой, это легко, если вы уже в начале (?<<^M^M
): v}
выбирает отсюда до пустой строки.
В противном случае в вашем примере лучшее, что я могу придумать, это v/^HTML
.
Есть плагин, который позволяет вам определять свои собственные текстовые объекты.
http://www.vim.org/scripts/script.php?script_id=2100
Я думаю, было бы неплохо определить его, чтобы вы могли сказать «да» (дернуть в heredoc), чтобы вам не приходилось явно переходить к началу.
Заметьте, я сам с этим не дурачился.
Если вам просто нужен визуальный выбор, вы можете.
nnoremap <leader>ih ?HTML<cr>V/HTML<cr>