авто отступ в замене строки vim новая строка? - PullRequest
3 голосов
/ 28 апреля 2010

Я использую следующую команду для автоматической замены некоторого кода (добавление нового сегмента кода после существующего сегмента)

%s/my_pattern/\0, \r some_other_text_i_want_to_insert/

Проблема в том, что с \r, some_other_text_i_want_to_insert вставляется сразу после новой строки:

mycode(
  some_random_text my_pattern
)

станет

mycode(
   some_random_text my_pattern
some_other_text_i_want_to_insert   <--- this line is NOT indented
)

вместо

mycode(
   some_random_text my_pattern
   some_other_text_i_want_to_insert  <--- this line is now indented
)

т.е. новая вставленная строка не имеет отступа.

Есть ли какая-либо опция в vim или trick, которую я могу использовать для отступа вновь вставленной строки?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 06 мая 2010

Попробуйте это:

:let @x="some_other_text_i_want_to_insert\n"
:g/my_pattern/normal "x]p

Вот оно, шаг за шагом:

Сначала поместите текст, который вы хотите вставить в регистр ...

:let @x="some_other_text_i_want_to_insert\n"

(Обратите внимание на символ новой строки в конце строки - это важно.)

Далее, используйте команду :global, чтобы поместить текст после каждой совпадающей строки ...

:g/my_pattern/normal "x]p

Команда ]p в нормальном режиме работает так же, как обычная команда p (то есть она помещает содержимое регистра после текущей строки), но также корректирует отступ в соответствии.

Подробнее:

:help ]p
:help :global
:help :normal
1 голос
/ 29 апреля 2010
%s/my_pattern/\=submatch(0).", \n".matchstr(getline('.'), '^\s*').'some_other_text'/g

Обратите внимание, что вместо & и \N вам нужно будет использовать подсовпадение и объединение Этот ответ основан на том факте, что команда замещения помещает курсор на строку, где она выполняет подстановку.

0 голосов
/ 17 мая 2016

Как насчет normal =``?

:%s/my_pattern/\0, \r some_other_text_i_want_to_insert/ | normal =``

<equal><backtick><backtick>: переиндексировать позицию перед последним прыжком

(Извините за странное форматирование, экранирование от backtick здесь действительно трудно использовать)

Чтобы сохранить их как отдельную команду, вы можете выполнить одно из следующих сопоставлений:

" Equalize and move cursor to end of change - more intuitive for me"
nnoremap =. :normal! =````<CR>

" Equalize and keeps cursor at beginning of change"
nnoremap =. :keepjumps normal! =``<CR>

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

Или вообще пропустите сопоставление, поскольку =`` - это всего лишь 3 клавиши, из которых 2 повторяются. Легко peasy, лимонная выжимка!

Ссылки

:help =
:help mark-motions
0 голосов
/ 30 июля 2014

Вы можете сделать это в два этапа. Это похоже на ответ Билла, но проще и немного более гибко, так как вы можете использовать часть исходной строки при замене. Сначала заменить, а затем отступ.

:%s/my_pattern/\0, \r some_other_text_i_want_to_insert/

:%g/some_other_text_i_want_to_insert/normal ==

Если вы используете часть исходной строки с \0, \1 и т. Д., Просто используйте общую часть строки замены для :global (второй) команды.

0 голосов
/ 28 апреля 2010

Вид округлого способа достижения того же самого: вы можете записать макрос, который находит следующее вхождение my_pattern и вставляет после него новую строку и вашу строку замены. Если авто-отступ включен, уровень отступа будет поддерживаться независимо от того, где находится вхождение my_pattern.

Примерно такая последовательность клавиш:

q 1                  # begin recording
/my_pattern/e        # find my_pattern, set cursor to end of match
a                    # append
\nsome_other_text... # the text to append
<esc>                # exit insert mode
q                    # stop recording

Повторяется нажатием @1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...