Vim: Замена линии другим, затянутым перед

Не реже одного раза в день у меня следующая ситуация:

A: This line should also replace line X
...
X: This is line should be replaced

Я считаю, что я не выполняю эту задачу эффективно.

Что я делаю:

  • Перейдите к строке A: AG
  • Yank line A: yy
  • Перейти к строке X: XG
  • Вставить строку A: P
  • Переход к старой строке: j
  • Удалить старую строку: dd

Это имеет дополнительный недостаток, что строка X теперь находится в регистре по умолчанию, что вызывает раздражение, если я нахожу другую строку, которую следует заменить A. Янкинг и вставка из дополнительного регистра ("ayy, " aP) делает эту простую задачу еще менее эффективной.

Мои вопросы:

  • Я пропустил встроенную команду Vim, чтобы заменить линию, дергавшуюся раньше?
  • Если нет, как я могу привязать свою собственную команду, которая оставляет (или восстанавливает) yanked строку в регистре по умолчанию?

Ответ 1

Что я буду делать:

  • aG
  • Y
  • xG
  • Vp

Вам не нужно покидать обычный режим, но он дергает линию. Тем не менее, вы можете использовать V"0p, который всегда будет помещать линию, затянутую на шаге 2.

Ответ 2

Vp: выберите строку, вставьте то, что было дернуто

Ответ 3

Это имеет дополнительный недостаток что строка X теперь находится в режиме по умолчанию зарегистрируйтесь, что раздражает, если я нахожу другую линию, которую нужно заменить с А.

Чтобы удалить текст без влияния на обычные регистры, вы можете использовать регистр черных дыр "_:

"_dd

Ответ 4

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

:XmA
:Ad

Это просто перемещает строку X только под A, а затем удаляет A, которые выстраиваются в линию

Например

:7m3
:3d

Ответ 5

  • уу
  • j (перейдите к строке, которую вы хотите заменить), а затем
  • Vp (верхний регистр v, а затем p, заменит на дернутый контент)

Ответ 6

  • Переместиться в начало первой строки.

  • y, $ - скопируйте строку без окончания строки в конце

  • Переместитесь в начало целевой линии.

    • V, p - заменить только одну целевую строку

    • c, c, Ctrl r, 0, Esc - заменить целевую строку на исходный yank

  • Переход к началу следующей целевой линии.

  • . - повторяет команду, выпущенную в 4.2.

Примечания:

  • 4.1 - y, $, потому что если вы выполняете y, y или y, вы скопируете строку, а Ctrl r, 0 фактически добавляет linebreak ниже вашей целевой линии.

  • 4.2 заменяет V p, который не работает с повторением, потому что технически последнее действие удаляется, поэтому . просто удалит строку.

  • Если кто-то знает, как выпустить "заменить текущую строку на регистр из режима EX (командной строки), я хотел бы услышать от вас (и знать, где вы нашли документацию). Может быть повторяемая команда EX, которая быстрее, чем 4.2, и/или не имеет очертания строки.

Ответ 7

Вы можете использовать это с визуальным режимом.

  • Перейдите к строке A: A G
  • Выберите линию с визуальным режимом: V ESC
  • перейти к строке X: X G
  • Введите режим замены для строки: S
  • Вставьте скопированную строку: shift + insert (или что-то другое, что вы сопоставили для вставки из буфера обмена).

Ответ 8

Вот что я буду делать

  • Переместить начало строки A, A G (где A - номер строки, очевидно)
  • Линия Yank к некоторому регистру, например. a (без новой строки). Тип " A y $
  • Переместить в строку вставки, X G
  • Заменить линию, S
  • Вставить из регистра a, Ctrl-R A

Ответ 9

Вы можете использовать эти команды в обычном режиме:

:AmX | Xd

команда m предназначена для m[ove], которая перемещает номер строки A после номера строки X, если вы хотите скопировать вместо перемещения строки, используйте co[py]. команда d предназначена для d[elete].

Вы можете перемещать (копировать с помощью co) диапазон строк, используя

:start,end m X

Ответ 10

Основываясь на ответах, которые предлагают использовать Vp или Vp для вставки над строкой - чтобы избежать изменения содержимого регистра yank, я считаю, что самая эргономичная команда просто:

VPY

Ответ 11

  • : ay (где a - номер строки. Пример: 20y). Это держит линию (каламбур).
  • Vp

Ответ 12

Мне часто приходится использовать одну строку и заменять ее в нескольких местах, каждая из которых имеет другое значение (что означает, что я не могу делать регулярное выражение).

Y, чтобы вынуть желаемую исходную строку

а затем на каждой строке, которую вы хотите заменить, V p zero Y

Ответ 13

Мне легче использовать команду Ex для этого; ех. для перемещения линии с 9 по 46:

 :46|9m.|-1d

Это переместит курсор в строку 46, переместит строку 9 ниже текущей, затем удалите предыдущую строку (поскольку перемещенная строка является текущей).

Или используя метки (метки), используя знак 'a':

:46ma a|9m'a|'ad

Ответ 14

я просто использовал бы регистр "Черная дыра":

Дано:

nnoremap < C-d > "_dd

решение будет:

< C-d > yy