Як вставити візуальний блок, починаючи з іншого рядка


10

Мені знадобилося дуже багато часу, щоб зрозуміти, що додавання (вклеювання) чогось із pчи того, Pщо візуальний блок вибирає із ctrl+vта витягування (копіювання) y, зберігає манеру раніше, так що, коли скопійований текст знаходився посеред рядків, він потім буде скопійовано серед іншого тексту, коли це можливо. Навпаки, select-line with Vне вставляє скопійований рядок серед іншого тексту, а починається з іншого рядка.

Наприклад, припустимо, що я маю:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Коли я хочу вирізати Avocadoі Beanі Cherryшляхом вибору (вибір представлений в вигляді _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

і натискання yта переміщення курсору до наступного рядка (курсор представлений як _),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

і натисніть P. Результати:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Але я хотів:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

Це щоразу плутало мене, поки я не зрозумів, що оскільки вони були скопійовані посередині рядка, вони були таким чином вставлені в середину рядка, імітуючи, як вони були.

Здається, найкращий спосіб вставити щось, починаючи з іншого рядка, - переміщення курсору на початок 0, а на 3 рядки вниз, на нове місце; і ввійти в режим вставки за допомогою iта, натиснувши <return>3 рази, і перемістити курсор назад на 6 рядків і вправо, назад до вихідного місця; і скопіюйте, і знову перейдіть на нове місце та вставте, як я робив вище.

Чи можу я врятувати кілька ударів? Або чим ти зазвичай займаєшся?

(Редагувати: Що було сказано вище, як я зрозумів це в той момент, коли я запитав це. Див. Ці відповіді для правильного пояснення:)

Відповіді:


11

Коли ви копіюєте якийсь текст, він переходить до реєстру. Текст всередині регістра має тип: characterwise, linewiseабо blockwise.

Цей тип визначає, яким способом буде розміщуватися текст.

У вашому прикладі ви скопіювали деякий текст із режиму візуального блоку. Отже, текст мав тип blockwiseі зберігався в реєстрі без назви ".
Через цей тип, коли ви вставите його всередину свого буфера, він буде вставлений як блок.


Якщо ви хочете вставити його як послідовність рядків, замість блоку, є 3 способи.

  1. З режиму вставки ви можете вставити його, натиснувши C-r ".
    У нього слід вставити вміст регістра, що не називається, так, як якщо б його тип був лінійним.

  1. З командного рядка можна використовувати :putкоманду.
    :putслід вставити текст всередині регістра так, ніби його тип був лінійним, незалежно від його початкового типу. Зауважте, що ви можете передати ім'я регістра як аргумент, а також адресу рядка, щоб вказати нижче, у який рядок потрібно вставити реєстр.

Наприклад:

:42put a

... слід розмістити вміст регістра a, нижче- 42го рядка.

Без імені реєстру, Vim припустить, що ви хочете вставити неназваний реєстр (або +регістр, якщо ви його зробили 'clipboard').
І без адреси Vim припустить, що ви хочете вставити його під поточний рядок.


  1. З командного рядка ви можете змінити тип неназваного реєстру за допомогою setreg()функції:

    :call setreg('"', '', 'al')

Тут setreg()слід додати порожній рядок до безіменного реєстру (завдяки aпрапору, переданому як третій аргумент) та змінити його тип на лінійний (завдяки lпрапору).

Потім, у звичайному режимі, ви зможете вставити регістр, використовуючи pзвичайну команду, так, як якщо б її тип був лінійним.


Це не пов'язано безпосередньо з вашою проблемою, але коли ви копіюєте якийсь текст, він також надходить у 0реєстр. І якщо ви заздалегідь задали значення unnamedplusпараметру 'clipboard', воно також переходить у +реєстр.

Ви можете перевірити тип реєстру за допомогою getregtype()функції:

:echo getregtype('"')

Якщо він повертає малі регістри v, це означає, що тип є символьним.
Якщо він повертає великі Vрегістри, це означає, що тип є лінійним.
Якщо він повертається ^V{some number}, це означає, що тип є блочно, а ширина блоку - {some number}.


3

Мені потрібно було так часто «кидати» реєстр вмісту в певний режим (персонаж / лінійно / блочно), я писав для нього плагін UnconditionalPaste . Це забезпечує gcp, glpі т.д. альтернативи вбудованої вставки команд , які змушують певний режим (і більш в даний час кілька варіацій на цю тему, як наклеювати з приєднався запитом або запитаних символів).

З ним можна просто використовувати glp/ glPвставити після / перед поточним рядком (як нові рядки), незалежно від того, як ви викреслили текст.


Я заздрю ​​вам, що у вас є час написати таку річ QQ. Але я задоволений :put. (Також вас схвалили)
Violapterin

@Aminopterin: Я відповів, що так часто у мене є фрагмент snipMate для першого абзацу. Тому мені просто потрібно трохи налаштувати. Дякуємо, що оцінили мою відповідь та нагороду!
Інго Каркат

О, я сказав, що я заздрю ​​вам, що ви встигнете написати плагін одноосібно, як-от так, ніби це зроблено з легкої душі .... лише за останні пів року я почав писати якийсь проект c ++ як проект хобі, щоб змусити себе вивчати програмування, і чи почав я використовувати vim ~~
Violapterin

2
@Aminopterin Ну добре, плагін починався як невеликий фрагмент, скопійований з Vimtips, і з часом повільно зростав. Оскільки це виявилося для мене таким корисним, я поступово сильно його посилював. Багато маленьких кроків є більш потужними, ніж великі зусилля!
Інго Каркат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.