vim: Чи можу я зробити * тільки * y виконати копію?


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

Як було зазначено в коментарях до (поточної) прийнятої відповіді, канонічним способом цього є використання регістру zero ( "0). Реєстраційний нуль завжди містить останній yank, і не буде перезаписаний dі x, тому "0pзавжди ставить все, що ви постригли, незалежно від того, що було відредаговано тим часом.

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