vim: Могу ли я заставить * только * сделать копию?


11

Я учусь любить vim, но одна вещь, которую я еще не полностью осознал, это ситуация с копированием и вставкой. В текстовом редакторе магглов я Ctrl- Cскопировать фрагмент текста , а затем редактировать / удалять , а затем вставить текст где - то в другом месте. Однако в vim я не могу этого сделать, потому что после того, как я скопирую текст с помощью y, изменение текста часто включает dи xуничтожает мой оригинальный текст.

Есть ли способ сделать dи xне копировать текст? Или как мне использовать эти функции vim?

Ответы:


16

9 предыдущих янки сохраняются в регистрах, вызываемых 1через 9. Вы можете вспомнить предпоследний рывок с "1p, предыдущий с "2pи так далее. Команда :regпоказывает регистры, которые доступны для вставки.

Если вы хотите, чтобы янки длились дольше, используйте регистр букв .

Для более неясных команд, связанных с янки, начните читать :help "в руководстве.


2
Кроме того, регистр 0 содержит последний восстановленный текст (в отличие от удаленного). Итак, вернувшись к исходному вопросу, вы можете нажать y, продолжить редактирование, включая dи x, и вставить вставленный текст с помощью"0p
Нефрубыр

@Nefrubyr, ваш комментарий выше является на самом деле самым простым ответом, но он не упоминается ни в одном из существующих трех ответов. Возможно, вам стоит добавить это? (Я могу, если вы не.)
Wildcard

9

Команды, о которых вы говорите, используют так называемый «неназванный» регистр. Он предназначен только для очень краткосрочного использования. «Я собираюсь вытащить это отсюда и поместить туда».

Если вы хотите удерживать что-то более нескольких секунд, пока вы занимаетесь чем-то другим, вам следует использовать именованные регистры.

Например, " a y yвыдернет строку, в которой находится курсор, в aрегистр. Ничто не заглушит его случайно, если вы не введете другую команду, включающую aрегистр. Минуты, часы и даже дни спустя вы можете набрать " a pэту выдернутую копию строки из aрегистра под той, на которой находится курсор.

(Для того, чтобы это работало действительно хорошо, у вас должна быть строка, как set viminfo='50,\"1000в вашем ~/.vimrcфайле, чтобы она помнила такие вещи, как регистрация содержимого в сеансах Vim. Затем вы можете уйти в отпуск между yank и put!)

Есть 26 именованных регистров (az). Если вы указываете их в верхнем регистре, а не как показано выше, вы добавляете их к текущему содержимому регистра, а не заменяете их. Таким образом, вы можете создать что-то действительно сложное, скажем, зарегистрировать по hодной части за раз, а затем добавить все сразу " h p.

Обратите внимание, что имя регистра необязательно. Это подразумевает, что может быть много команд, которые вы уже знаете и используете, где вы могли бы использовать именованные регистры. Скажите :help registersв Vim, чтобы получить представление о возможностях.

Кроме того, получите кружку Vi .


1

Если вам нужно удалить текст с помощью d, не изменяя свой регистр янки (скажем, вы уже скопировали в него текст, который вы не готовы вставить, например, до удаления какого-либо другого текста), вы можете использовать регистр черной дыры _ .

Если вы "_dd, например, текущая строка будет немедленно удалена и забыла.

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

Если вы склонны забывать использовать другой регистр при удалении, вы можете определить обертку макрос для dd, например , как это: :noremap dd "add.


0

Как было указано в комментариях к (текущему) принятому ответу, канонический способ сделать это - использовать регистр ноль ( "0). Нулевой регистр всегда содержит последний рывок и не будет перезаписан символами dи x, поэтому "0pвсегда помещает все, что вы дернули, независимо от того, что было отредактировано за это время.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.