редактор vi / vim, скопіюйте блок (не звичайна дія)


76

У редакторі vi / vim мені потрібно скопіювати блок. Існує багато способів, але один із них дуже швидкий.

  1. позначте перший рядок якимось чином,

  2. потім якось позначте кінцевий рядок,

  3. потім поставте якусь команду для копіювання позначених рядків.

  4. потім скопіюйте, можливо, використовуючи 'p', але не впевнений.

Хтось знає команди (не yy або 10yy)? Заздалегідь спасибі.

Відповіді:


41

Ще одним варіантом, який може бути легше запам’ятати, було б розміщення позначок на двох рядках за допомогою maта mb, а потім запуск :'a,'byank.

Багато різних способів виконати це завдання, просто пропонуючи інше.


1
Так. Ви також можете втягнутись до певного реєстру, наприклад. :'a,'by a.
glts

1
Я ніколи не знаходив задовільного та повторного виклику способу копіювання-вставки в vi, але це рішення справді першочергове. Крім того, я додав це до команди .vimrc "P: 'a,' byank", щоб клавіша "P" могла функціонувати як ярлик
sphere4a

129

просто використовуйте Vдля виділення рядків або vдля виділення символів або Ctrlvдля вибору блоку.

Коли виділення охоплює область, яку ви хочете скопіювати, просто натисніть yі використовуйте, pщоб вставити його куди завгодно ...


3
На ПК з Windows, де Ctrl+vє пастиг із буфера обміну, вам слід Ctrl+qвибрати блок
Wouter J

1
У macOS (принаймні) вам потрібно увійти в режим VISUAL, натиснувши vабо, Vа потім натиснувшиp
arshbot

98

В їхній документації сказано:

Вирізати і вставити:

  1. Помістіть курсор там, де потрібно розпочати різання.
  2. Натисніть, vщоб вибрати символи (або великі регістри, Vщоб виділити цілі рядки).
  3. Перемістіть курсор у кінець того, що потрібно вирізати.
  4. Натисніть, dщоб вирізати (або yскопіювати).
  5. Перейдіть туди, куди ви хочете вставити.
  6. Натисніть, Pщоб вставити перед курсором, або pвставити після.

Копіювання та вставка виконується з тими ж кроками, за винятком кроку 4, де ви натискаєте y замість d:

d = delete=cut

y= yank=copy


OP запитує про VI, ваша відповідь стосується VIM, це не допомагає в VI.
volkit

@Kamil afaik команда vi на mac os запускає vim, а не vi. Але в будь-якому випадку ops питання було змінено, і тепер воно включає vim. Тому я думаю, що відповідь Kaleems - це нормально. Мій перший коментар, можливо, допомагає комусь, хто використовує vi (що дещо відрізняється від vim), і дивується, чому ця відповідь для нього не працює.
volkit

20

Я знайшов наведену нижче команду набагато зручнішою. Якщо ви хочете скопіювати рядки з 6 по 12 та вставити з поточної позиції курсору.

:6,12 co .

Якщо ви хочете скопіювати рядки з 6 по 12 та вставити зі 100-го рядка.

:6,12t100

Джерело: https://www.reddit.com/r/vim/comments/8i6vbd/efficient_ways_of_copying_few_lines/


18

Здається, ви хочете розмістити позначки у файлі.

mxставить під курсором позначку x

y'xyanks все між поточною позицією курсора та рядком, що містить позначку x .

Ви можете використовувати 'xдля простого переміщення курсору до рядка зі своїм позначенням.

Ви можете використовувати `x(зворотний галочку), щоб перейти до точного місця знака.


Одне, що я роблю постійно, - це витягнути все, що знаходиться між курсором і позначити х у буфер обміну .

Ви можете зробити це так:

"+y'x

ПРИМІТКА: У деяких середовищах буфер буфера обміну представляється *замість +.


Подібні запитання з декількома хорошими відповідями:


Так, позначки - це також чудовий спосіб зробити це, особливо коли ви використовуєте чистий vi, а не vim ...
Андре Келлер

Думаю, я вже давно запізнився ввести Vв свій робочий процес. Не знаю, чому я цим не користуюсь ...
jahroy

9

Сполучення клавіш для цього:

  1. Для копіювання: Наведіть курсор на початок блоку та натисніть md, а потім перейдіть до кінця блоку та натисніть y'd . Це вибере блок, щоб вставити його, натисніть p

  2. Для вирізання: Наведіть курсор на початок блоку та натисніть ma, а потім перейдіть до кінця блоку та натисніть . Це вибере блок, щоб вставити його, натисніть p


1

Ви можете зробити це так само, як і в vi, наприклад, щоб потягнути рядки від 3020 до кінця, виконати цю команду (записати блок у файл):

: 3020, $ з / т / т

І щоб записати цей блок в інший рядок / файл, перейдіть у потрібне положення та виконайте наступну команду (вставте файл, написаний раніше):

: r / tmp / yank

(Нагадування: не забудьте видалити файл: / tmp / yank)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.