Редактирование каждой третьей строки файла в vim - PullRequest
0 голосов
/ 03 сентября 2018

Я составлял шаблонный список методов в vim для проекта на python. Я добавил строки между каждым методом и хотел добавить pass к каждому методу на данный момент - пока я не реализую метод, это все еще будет интерпретируемый код Python. В vim я знаю, как редактировать пространственно смежные строки файла, используя :10,17s/<search regex>/<substitute>/, но после внесения изменений, чтобы добавить пустые строки между методами, мне нужно было вставлять a pass в каждую третью строку. В способе, который я нашел, использовались трубы и & через: :10s/<search regex>/<substitute>|13&|16& и т. Д. У меня было около 15 амперсандов, соединенных вместе, чтобы заставить это работать. Есть ли более лаконичный способ получить такое поведение в vim?

Чтобы обратиться к комментарию, вот минимальный пример, в файле myfile.py у меня есть:

def _fun1(self):


def _fun2(self):


def _fun3(self):


def _fun4(self):

...etc

Во 2-й строке, 5-й строке, 8-й строке и т. Д. Я хочу вставить pass (с 4 пробелами перед тем, чтобы сохранить постоянные интервалы), / у меня это до _fun15(self):, поэтому хотелось бы получить поведение без 14 |lineNo& с скованы вместе. Возможно инкрементная функция с переменной для номеров строк или какой-то другой код, который создает поведение.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Вот один из возможных способов:

:g/def _fun/normal! opass
  • На каждой строке соответствия def _fun
  • открыть новую строку ниже…
  • и вставить pass.

Если вы хотите, чтобы между каждой заглушкой была одна строка:

:g/def _fun/normal! opass^OJ^Ox
  • На каждой строке соответствует def _fun
  • открыть новую строку ниже…
  • вставить pass
  • выйти из режима вставки для одной команды ...
  • соединить строку ниже с текущей строкой ...
  • выйти из режима вставки для одной команды ...
  • и уберите этого надоедливого <Space>.
0 голосов
/ 07 сентября 2018

Чтобы поставить 'pass' с отступом под каждым определением функции, я бы использовал:

:g/^def/put ='    pass'

^ ........... begining of each line
put ......... puts contents bellow

Чтобы сжать пустые строки:

:g/^$/,/./-1j 

a global command the gets from each empty line ^$
until next non-empty line minus one, performs a join command
0 голосов
/ 03 сентября 2018

Запись макроса

qajopass<Esc>jq

Теперь выполните его, запустив @a (в следующий раз вы можете использовать @@).


Как сказал @midor, его можно использовать с командой :g в виде:

:g/def _fun\d\+/norm @a

Чтобы выполнить этот макрос на всех совпадающих строках.

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