2

В vim я часто повторяю одни и те же шаги, чтобы скопировать раздел, прежде чем вносить в него изменения:

  1. V запустить визуальный режим
  2. j пока я не выбрал раздел, который хочу скопировать
  3. y чтобы восстановить выбор
  4. j чтобы прокрутить вниз до последней строки текста, который я только что выбрал
  5. p чтобы скопировать восстановленный раздел под текущей строкой
  6. O чтобы начать новую пустую строку над скопированным текстом
  7. ESC выйти из режима вставки

Есть ли более эффективный способ сделать это (или какую-то его часть)? В частности, кажется, что должен быть лучший способ поместить текст под выбранным выделением, а не прокручивать вниз, чтобы выделить его, восстановить его и снова прокрутить вниз.

2 ответа2

3

Если я понимаю, ваша цель состоит в том, чтобы иметь по существу две копии некоторого куска текста один за другим. В этом случае попробуйте это:

  1. Shift-V
  2. j, чтобы выбрать регион
  3. у, чтобы дергать
  4. Shift-P, чтобы поставить над вашим текущим местоположением
  5. Когда вы сделаете пут, он скажет вам, сколько строк он добавил. Введите это число и нажмите j
  6. Shift-O

Я понимаю, что все, что это делает, это убирает прокрутку, но для любого значительного объема текста, это будет самый длинный бит эволюции и наиболее склонный к съемке в нужном месте.

2

Узкое место, здесь , кажется, все jjjj… что вы делаете. Предполагаемое превосходство hjkl над клавишами со стрелками цитируется так часто, что люди склонны забывать об огромной ценности движений Vim и текстовых объектов над обоими утомительными методами.

Предположим, что вы находитесь в первой строке абзаца, как определено Vim (текст между пустыми строками), y'}P должен выдернуть весь абзац, включая следующую пустую строку, и вставить его над текущей строкой.

some text above 

[l]orem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit

some text below

y'}P

some text above

[l]orem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit

lorem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit

some text below

v}yP должен работать более комфортно.

Если ваш блок не является "абзацем", вероятно, есть способ определить выделение с помощью движения вместо jjj . Что-то вроде V/it$<cr> .

редактировать

Вот еще один вариант, который помещает копию ниже оригинала: y'}'}p .

редактировать

Я думаю, что самый общий способ сократить весь процесс - это расширить визуальный выбор:

  • с поисковым движением, если вы можете определить "крючок" в последней строке блока, который вы хотите дублировать (V/foo<CR>)

  • или счет (V5j).

Как только выбор сделан, вы можете:

  • дергать (y),

  • перейти к концу визуального выделения ('> или 5j но '> более обобщенно),

  • открыть новую строку (o),

  • выйти из режима вставки (<Esc>),

  • паста (p)

Этот метод, вероятно, самый общий, но он все еще требует много печатания. Вот где отображения приходят на помощь:

vnoremap <F9> y'>o<Esc>p

Идея здесь состоит в том, чтобы отделить контекстное от общего:

  • контекстная часть - это когда вы определяете блок для дублирования, потому что нет способа предсказать, что вы хотите дублировать. Я оставляю эту часть на ваше усмотрение, но я надеюсь, что вы будете использовать лучший метод, чем jjjjjj…

  • общая часть - это все, что следует за выделением, выполненное здесь с помощью простого сопоставления.

Весь процесс теперь сокращен до V5j<F9> который настолько быстр, насколько вы можете получить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .