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

41

Скажите, что я на линии 20, и я хотел бы вырвать строку 4, как я могу это сделать?

И точно так же, как я могу выдернуть линию относительно моей позиции курсора, скажем, на 3 строки вверх?

pfrenssen
источник

Ответы:

59

От :help :yank:

:[range]y[ank] [x]      Yank `[range]` lines [into register x].

Итак, чтобы восстановить строку 4, нужно набрать:

:4yank

Обратите внимание, что вы можете легко сделать это из режима вставки с помощью <C-o>; это позволяет вам выполнить одну команду, после чего вы вернетесь в режим вставки; например:

<C-o>:4yank

Конечно, вы можете использовать и другие диапазоны. Некоторые примеры:

  • Строки с 1 по 3: :1,3yank
  • Весь буфер: :%yank
  • От текущей строки до конца буфера: :.,$:yank
  • Текущая строка и следующие 3: :.,+3yank
  • Текущая строка и предыдущие 3: :-3,.yank
  • Строка на 3 строки выше текущей строки: :-3yank

Самые полезные вещи, которые нужно помнить о диапазонах:

  • Это в форме :line1,line2command.
  • .Является текущей строкой (вы на самом деле можно опустить точку , в большинстве случаев, :.,+3yankи :,+3yankто же)
  • Вы указываете строки относительно текущей позиции с помощью +nи -n.

Смотрите :help [range]для получения дополнительной информации.

Мартин Турной
источник
6
Бонусные баллы за упоминание <Co>, я недооцениваю это.
PhilippFrank
7
Стоит также упомянуть, что вы можете сокращать :4yankс:4y
NewbieOnRails
35

В дополнение к ответу Carpetsmoker, я должен указать на удивительный :help :mи :help :t.

Если вы хотите скопировать строку 4 прямо под текущей строкой, вы можете сделать это:

:4t.

или что, если вы хотите скопировать эту строку прямо над текущей строкой:

:4t-
romainl
источник
1

Помимо команд ex-mode, которые вы получили, вы можете добиться этого и в командном режиме, например, с помощью: 4GY''-, что означает: перейти к строке 4 ( 4G), yank line ( Y) и вернуться к предыдущей строке ( '').

Вы также можете использовать метки прыжка; для вашего второго вопроса, например: mm3kY'm- что означает: установить метку m ( mm), пройти три строки вверх ( 3k), yank line ( Y), вернуться к метке m ( 'm).

Janis
источник
1
Использование ``, вероятно, является лучшей рекомендацией, чем '', поскольку первая возвращается к той же строке и столбцу. То же самое для "м против" м.
Jamessan
Я согласен. (Есть идеи, как создать буквенные обратные выражения в разметке вики, поскольку они имеют особое значение?) - В противном случае ваш комментарий послужит хорошим дополнением к моему ответу и подсказкой для читателей.
Янис
Вы должны использовать несколько обратных кавычек для разграничения встроенного кода (см. Daringfireball.net/projects/markdown/syntax#code ). Я знаю, что это работает в вопросах / ответах, но я не мог заставить это работать в моем комментарии.
Jamessan
1

Просто наберите

:4y

выдернуть 4-ю линию

это войдет в неназванный регистр. Затем (например) вы можете использовать его, pчтобы поместить его в другом месте. Вы также можете использовать [n]p, например, 10p, чтобы вставить его 10 раз.

Вы можете поместить его в именованный регистр, такой как «а» с

:4y a
Майкл Даррант
источник
2
Часть, касающаяся помещения его в именованный регистр с «ay4», выглядит неправильно. Если вы это сделаете, vim будет ждать, пока вы скажете «4 что?». Например, если вы затем нажмете Enter, вы получите 4 строки, начиная с текущая позиция, если вы введете / foo <Enter>, она будет дергаться до 4-го числа после появления «foo» и т. д.
Дон Хэтч
Последняя команда должна прочитать 4G"ayy.
Ромен
0

Ты можешь сделать

:10y <Enter> (to copy the line 10)
p (paste line 10 where the cursor is)

Настройка относительного числа также помогает перемещаться между строками кода.

:set relativenumber

Теперь вы можете скопировать 5-ю строку над курсором с помощью:

:-5y <Enter>
:p (to paste)
Stryker
источник