Как вытащить определенную строку, не перемещая курсор в vim?

40

Например

альтернативный текст

Как я могу вытащить и вставить строку 4 только в строку 12, не перемещая курсор на строку 4?

альтернативный текст

Lazer
источник
Я ответил на ваш вопрос, основываясь на том факте, что "дергай меня!" в строке 4. На втором снимке экрана он отображается в строке 5.
Луи Салин
Спасибо @Louis за ответ. Я обновил скриншот.
Лазер

Ответы:

52

Если курсор уже находится в строке 12, то простой

: 4y
п

делает это для меня.

радостный
источник
1
Ницца! Есть ли эквивалент для x? Когда я пытаюсь, :4xя получаю E140: Use ! to write partial buffer. Благодарность!
dotancohen
Я должен сказать, что это удивительно: D
nXqd
@dotancohen:4d
n.st
Есть ли хороший способ сделать это с относительным номером строки?
TrungDQ
С относительными числами просто используйте + и -. Таким образом, -4 - это четыре строки над курсором, а +4 - четыре строки под ним.
rickythefox
10

Как насчет этого: курсор находится в строке 11, вы находитесь в режиме "vi".

:4co.<return>

Вы также можете сделать это с помощью шаблона:

:/^Yank/co.<return>

Вы можете использовать «mo» (переместить) вместо «co» (копировать), чтобы просто переместить строку вместо yank и put.

Брюс Эдигер
источник
1
Еще короче ( t, поскольку команда копирования:4t.
остаток
8

Пытаться:

:4co11

Вы можете использовать аргумент 0для вставки в строку 1. Это также будет работать с диапазонами:

:m,n co k

скопирует линии mчерез nк линии k+1. Кроме того, не имеет значения, где вы находитесь в буфере. moveКоманда, m, работает аналогично.

gvkv
источник
2

Это должно сделать это:

:4,12y
p
k
Umang
источник
1
Нет, это срывает строки с 4 по 12.
Lazer
Я имел в виду скопировать и вставить строку 4 в строку 12.
Lazer
Ред. Это то, что вы хотели?
Уманг
2

Другие уже упоминали самый прямой способ сделать это, :4yно я хочу добавить две заметки об этом, которые могут быть полезны:

Во-первых, если вы введете текст, :help rangeвы узнаете все об использовании диапазонов для применения к командам в стиле Ex. ОЧЕНЬ полезно во многих случаях и гораздо более универсально, чем использование номеров строк. Например, если вы хотите восстановить первую строку, начинающуюся с «yank» после начала документа (даже если она находится в первой строке), используйте :0/^yank/y. Самая мощная часть диапазонов - это возможность комбинировать их, например, :./^Chapter/+50?Pete?dозначает «Найти следующую строку, чтобы начать со слова Глава (поиск вперед от текущей строки), затем перейти на 50 строк вперед и найти слово Пит назад». и удалите первую строку, в которой вы найдете его. " За исключением того, что он на самом деле не двигает курсор, он просто делает то, что вы говорите.

(Я использовал этот тип спецификации диапазона, чтобы автоматизировать создание документации, включающей в себя поиск имени функции под курсором, затем поиск вперед следующей строки с надписью «Description» и возврат ее в определенный регистр ... и т. Д.)

Другой совет, что вы должны знать о прыжках. Напечатайте, :help jump-motionsчтобы узнать об этом полностью, но способ, которым это здесь связано, заключается в том, что вы можете перейти к строке 4, вернуть ее, а затем ВЕРНУТЬСЯ 4Gyy''(или использовать обратные тики вместо апострофов, чтобы вернуться к вашей точной стартовой позиции, а не просто к той же ЛИНИЯ Вы начали в.)

Wildcard
источник
2

Кратчайший:

:1t. копирует первую строку ниже текущей

С диапазонами: :1,4t.копирует строки с 1 по 4 (включительно) ниже текущего.

Также возможно с относительными номерами строк:

:-1t. копирует предыдущую строку ниже текущей.

В вашем примере :4t-1скопируйте четвертую строку ниже требуемой строки.

Примечание: :tэто синоним :co[py]команды.

Эрвин Ройяккерс
источник