Вопрос или проблема
В vim я часто повторяю одни и те же действия, чтобы скопировать раздел перед тем, как внести в него изменения:
V
, чтобы начать визуальный режим по строкамj
, пока не выберу нужный мне раздел для копированияy
, чтобы вытащить выборj
, чтобы прокрутить вниз до последней строки текста, который я только что выбралp
, чтобы вставить вытащенный раздел под текущей строкойO
, чтобы начать новую пустую строку над скопированным текстомESC
, чтобы выйти из режима вставки
Существует ли более эффективный способ сделать это (или какую-либо его часть)?
В частности, кажется, что должно быть более удобное решение, чтобы поместить текст под выбором, который вы только что выбрали, вместо того чтобы прокручивать вниз для его выбора, вынимать его и снова прокручивать вниз до конца.
Настоящая проблема, похоже, заключается во всем этом jjjj…
, что вы делаете. Предполагаемое превосходство hjkl
над стрелками так часто упоминается, что люди склонны забывать об огромной ценности движений и текстовых объектов Vim по сравнению с обеими утомительными методами.
Предположим, что вы находитесь на первой строке абзаца, определяемого Vim (текст между пустыми строками), y'}P
должен вытащить весь абзац, включая пустую строку, которая следует далее, и вставить его над текущей строкой.
некоторый текст выше
[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
некоторый текст ниже
y'}P
некоторый текст выше
[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
некоторый текст ниже
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>
, что так быстро, как только можно.
Если я правильно понимаю, ваша цель — иметь, по существу, две копии какого-то фрагмента текста одну за другой. В этом случае попробуйте это:
- Shift-V
- j для выбора региона
- y для выемки
- Shift-P для вставки выше вашего текущего местоположения
- Когда вы будете вставлять, система сообщит, сколько строк добавлено. Введите это число, а затем нажмите j
- Shift-O
Я понимаю, что все это только убирает прокрутку, но для любого значительного объема текста это будет самой длительной частью эволюции и наиболее подверженной ошибкам при определении правильного местоположения.
Ответ или решение
Вопрос о том, как более эффективно копировать и вставлять текст в режиме Visual в Vim, на самом деле затрагивает важные аспекты использования текстового редактора, который изначально предназначен для повышения продуктивности. Позволяет более тщательно рассмотреть указанные шаги и предложить оптимизацию процесса.
1. Идентификация основной проблемы
Как вы уже заметили, часть процесса, связанная с повторяющимся использованием команды j
для перемещения вниз, является основным узким местом. Поскольку Vim предлагает множество мощных команд и движений, существует более эффективный способ работы с выделением текста, что значительно сократит затраты времени и усилий.
2. Этапы оптимизации копирования текста
Определите нужный текст для копирования:
- Вы можете использовать команду
V
для начала выделения текста, как вы делаете это сейчас. - Затем вместо нажатия нескольких раз клавиши
j
, используйте команды, которые позволят вам проще определить границы выделения. Например, команды поиска (/
для поиска по тексту) или другие движения.
Используйте более разумные подходы к выделению:
- Например, для копирования абзаца можно использовать комбинацию
y}
(где}
– перемещение к следующему абзацу) для Yank (копирования) выделенного текста. - Если ваш текст находится между пустыми строками, команда
y'}P
может скопировать абзац, включая следующую пустую строку, и вставить его над текущей строкой.
Сократим вставку:
- Как вы отметили, избежать лишнего перемещения можно с помощью команд
O
(открывает новую строку выше текущей) илиo
(открывает новую строку ниже текущей) после копирования, в зависимости от того, куда вы хотите вставить скопированный текст. - Команды вставки
p
иP
можно использовать более осмысленно:p
вставляет ниже курсора, аP
— выше него.
Оптимизация с помощью макросов и настроек:
Для дальнейшего упрощения процесса, вы можете создать макрос. Например, используя:
vnoremap <F9> y'P<CR>
Эта команда позволяет вам закладывать следующие действия после выделения: копирование текста, возврат на одну линию и вставка с учетом предотвращения прокрутки.
3. Общая процедура и преимущества
Таким образом, с использованием этих методов, более эффективная работа с Visual mode в Vim может выглядеть так:
V
(начать режим выделения);- Использовать
j
или более умные перемещения для выделения всего необходимого текста; y
(копировать выделение);O
илиo
(открыть строку);P
(вставить скопированное).
При этом вам больше не нужно прокручивать текст или повторять много раз одно и то же движение.
Заключение
В результате, благодаря изучению и практическому применению мощных команд Vim, вы сможете структурировать свои действия так, чтобы минимизировать количество нажатий и оптимизировать рабочий процесс. Эти методы не только обеспечивают более быстрые и удобные действия, но и делают Vim еще более мощным инструментом для редактирования текста.