Встановіть опцію вставки, але лише для однієї вставки


16

Я хочу швидко налаштувати параметр Vim 'paste', вставити текст і повернутись до попереднього значення 'paste'.

У типовому випадку використання вміст буфера обміну ОС вставляється буквально, незалежно від перезапису режиму вставки, який може бути активним, наприклад автоматичним відступом, і без зміни стану Vim. Іншим випадком використання було б дозволити макросистемі ОС вводити натискання клавіш у Vim та інтерпретувати їх як буквальний текст.

Це, очевидно, узагальнює інші варіанти - загальна ідея полягає у встановленні деяких варіантів, але лише протягом тривалості однієї поїздки через режим вставки.

В основному я хочу прив'язати послідовність ключів (скажімо _i) до макросу, який це робить

:set paste
i…<Esc>
:set nopaste

де i…<Esc>я маю на увазі переключитись на режим вставки (як у iкоманді) та відновити макрос після повернення до командного режиму, за винятком того, що я хочу закінчити 'paste'все ще активний, якщо він був активний попередньо. Як я можу це зробити?

Примітка. Вміст буфера обміну ОС відображається в "*регістр . Коли це працює, 'paste'варіант не дуже корисний. Мотиваційний сценарій цього питання є для тих часів, коли умови для "*підтримки реєстру не виконуються - Vim не компілюється з +xterm_clipboardфункцією, або він працює в терміналі, такому як Screen або через SSH, який ізолює його від оточуючого X-сервера.


1
Мені подобається ваше запитання (сам я там багато разів був). Однак хіба не простіше вставити +або *зареєструвати?
йо '

@yo ' Тільки коли вони працюють . Що, для моїх використання Vim, часто не так.
Жил "ТАК - перестань бути злим"

Відповіді:


15

Спробуйте:

function! Paste_Func()
    let s:inPaste = &paste
    if !s:inPaste
        set paste
    endif

    echom s:inPaste
    augroup paste_callback
        autocmd!
        autocmd InsertLeave <buffer> call Paste_End()
    augroup END

    startinsert
endfunction

function! Paste_End()
    augroup paste_callback
        autocmd!
    augroup END
    augroup! paste_callback

    if !s:inPaste
        set nopaste
    endif
endfunction

map _i :call Paste_Func()<cr>

Він зберігає ваш поточний статус вставки у змінній inPaste і встановлює пасту, якщо вона ще не встановлена. Потім він встановлює autocmd, коли ви виходите з режиму вставки, а потім переводить вас у режим вставки.

Коли ви виходите з режиму вставки, він запускає autocmd, який спочатку видаляє autocmd (тому він не запускається, коли ви виходите з режиму вставки іншим способом), і, нарешті, встановлює nopaste, якщо ви не були в режимі вставлення спочатку.

Крім того, якщо ви використовуєте vim в терміналі, ви можете поглянути на vim-bracketed-paste , яка використовує функцію режиму скореного вставки, надану декількома емуляторами терміналів, щоб виявити, якщо ви вставляєте та встановите режим автоматично.

Редагувати: виправлено сценарій


Це здається на правильному шляху (зокрема, я не мав уявлення, як "сковувати" ділянку вставки звичайними командами світу). Спасибі. Однак це не зовсім правильно, і я не бачу, де проблема: після _iцього pasteпараметр вимкнено, навіть якщо він був раніше.
Жил "ТАК - перестань бути злим"

Ти правий! Я впевнений, що це перевірив, але, мабуть, щось змінив. Я оновив сценарій у публікації, подивіться, чи працює він зараз для вас.
Чад

4

за винятком того, що я хочу закінчити 'paste'ще активний, якщо він був активним раніше.

'paste'має бути активним якомога коротший час. Це вимикає багато функціональних можливостей (включаючи карти), оскільки його єдиною метою є уникнення неправильного тлумачення тексту, який вставляється. Я вважаю, що ця вимога дійсно не повинна бути необхідною.

Це, насправді, досить просто вставити, не встановлюючи 'paste'. Якщо ви працюєте з gvim або маєте +xterm_clipboardконсоль vim, ви можете просто використовувати "+pдля вставки з буфера обміну ОС.

Проблема автоматичного відступу під час вставлення дійсно трапляється лише у двох сценаріях. Вставлення вмісту регістра в режимі вставки ( <C-r>+) або вставки мишею середнього клацання мишкою.

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

Якщо ви хочете вставити мишею вставки середнього клацання, то скористайтеся 'mouse'опцією, щоб Vim замість терміналу впорався з середнім клацанням. Потім Vim буде вставляти вміст буквально замість інтерпретації введеного тексту як введеного.


2
Нічого з цього не відповідає на моє запитання. Я висуваю чіткі вимоги з причини! Зазвичай раніше 'paste'не активний, але мені не хочеться думати про це. Я часто працюю в Vim, який не має доступу до буфера обміну X або миші, або тому, що мій Vim build не має xterm_clipboardфункції, або тому, що я працюю, наприклад, на сеансі екрана, який, як буває, приєднаний до X термінал.
Жил "ТАК - перестань бути злим"

@Gilles Тоді ви могли б пояснити, як ви вставляєте? Це відповідна інформація, щоб можна було надати відповідь, яка може охопити цю дію тим, що ви хочете зробити.
Jamessan

1
Основний мій варіант використання - це вставлення за допомогою середньої кнопки миші або за допомогою Shift + Insert. Це насправді не актуально: суть питання полягає в тому, як встановити параметр, перейти на режим вставки (з i, я не запитую, як це параметризувати), і відновити значення параметра після повернення з режиму вставки.
Жил "ТАК - перестань бути злим"

1
@Gilles Ядро вашого питання, про яке йдеться в цьому коментарі, для мене набагато зрозуміліше, ніж ваше первісне запитання. Спасибі.
jamessan

1
@Gilles Це не стосується вас , але може стосуватися майбутніх відвідувачів. Тому ви можете поставити це питання у самому питанні ("Я знаю, що можу використовувати "*pабо "+pвставляти з буфера обміну, але я не хочу використовувати можливості вставки системи"), і тоді ця відповідь не є зайвою. Або ви цього не зробите, і я думаю, що ця відповідь має тут своє місце.
йо '

4

Особисто я використовую yoприв'язку клавіш із чудового плазмового плагіна Тіма Попа з цією ж причиною. З його документації:

Перемикач не надано для "вставлення", оскільки типовий випадок використання обгортання одиночної вставки настільки марно: Ви перемикаєтесь двічі, але вставляєте лише один раз (YOPO). Замість цього натисніть yoабо, yOщоб викликати |o|або |O|з "вставити" вже встановленим. Залишивши режим вставки, автоматично встановлюється "nopaste".

Встановити плагін може бути надмірно просто для вашого запитання, але я вважаю, що він також надає безліч інших корисних прив'язок клавіатур (більше інформації в README ).


1

З Vim 8+ на Linux або Mac тепер ви можете просто використовувати вбудовану пасту терміналу (наприклад, середню кнопку миші, ctrl+shift+Vу Gnome, cmd+Vна Mac), якщо термінал підтримує вставну скобу. Не натискайте iдля режиму вставки.

Він буде вставляти вміст буфера обміну вашої ОС, зберігаючи пробіли та вкладки, не додаючи автозавад. Це еквівалентно старому :set paste, i, ctrl+shift+V, esc, :set nopasteметод.

Вам навіть більше не потрібні встановлені функції +clipboardабо +xterm_clipboardvim. Ця функція називається "скобованою пастою". Докладніше див. Https://stackoverflow.com/questions/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56781763

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