Макрос Vim: Увеличение чисел на непоследовательных строках - PullRequest
5 голосов
/ 18 января 2012

Я работаю с файлом YAML, у которого в качестве идентификатора указано целое число, которое появляется каждые 4-6 строк. Я ищу, чтобы добавить запись в середине этого файла (для удобства чтения), которая сохраняет последовательную нумерацию без изменений.

Формат файла ниже. Есть идеи?

- id: 1
  type: string
  option: diff_string
  other: alt_string   // note: 'other' option does not appear for all records

- id: 2
  type: string
  option: diff_string

//new record would go here as id: 3, increasing id: # of all following records by 1

- id: 3
  type: string
  option: diff_string
  other: alt_string

Ответы [ 3 ]

6 голосов
/ 18 января 2012

Я полагаю, что вы можете достичь того, что вы хотите, установив счетчик (здесь: переменная g:I) в 1:

let g:I=1

И затем выполнить подстановку в каждой строке, которая соответствует ^- id: \d\+$:

%g/^- id: \d\+$/ s/\d\+/\=g:I/|let g:I=g:I+1

Подстановка использует вещь \= (см. :help sub-replace-expression) для подстановки \d\+ с фактическим значением g:I. После подстановки счетчик увеличивается (let g:I=g:I+1).

С помощью g/^- id: \d\+$/ вы гарантируете, что подстановка будет выполняться только для строк, соответствующих ^- id: \d\+.

Редактировать Если вы хотите иметь карту для нее, вы можете поместить следующий фрагмент в ваш .vimrc :

nnoremap resync :let g:I=1<CR>:%g/^- id: \d\+$/ s/\d\+/\=g:I/\|let g:I=g:I+1<CR>

, что позволяет повторно синхронизировать ваши идентификаторы, набрав resync в нормальном режиме .

Обратите внимание на экранирование | с \ и использование <CR> там, где вы нажимаете ввод.

3 голосов
/ 18 января 2012

, чтобы увеличить все последующие идентификаторы из строки курсора + 1:

:.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1)

(nr2char(1) похоже на нажатие клавиши CTRL-A).

Вы также можете сделать:

:.+1,$g/^- id: \d\+$/normal! 0^A

Где вы вводите ^A, набирая CTRL-V, затем CTRL-A. Обратите внимание, что я предпочитаю первую версию: вы можете скопировать и вставить ее, в коде нет буквального управляющего символа.

Detail:

  • .+1,$ - диапазон от следующей строки до конца файла. :help range.
  • :g работает на всех линиях, подчиняющихся шаблону. Противоположность :v. :help :g
  • /^- id: \d\+$/ соответствует - id: в начале строки, за которой следуют 1 или более цифр и затем конец строки (:help pattern)
  • :normal! воспроизводит обычные команды: 0 для перехода к началу строки, CTRL-A для увеличения следующего числа.

Если вы хотите сопоставить:

nnoremap <F1> :.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1)<enter>

Поместите это в свой vimrc, и теперь наслаждайтесь нажатием клавиши F1 в обычном режиме и смотрите все идентификаторы ниже приращения курсора.

1 голос
/ 19 января 2012

Я бы использовал следующую короткую и прямую команду подстановки.

:,$s/^- id: \zs\d\+/\=submatch(0)+1/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...