Вимкнення автоматичного відступу під час вставки тексту у формат vim


1186

Я докладаю зусиль, щоб пізнати Віма.

Коли я вставляю код у свій документ із буфера обміну, я отримую додаткові пробіли на початку кожного нового рядка:

line
  line
    line

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

Як вимкнути автоматичне відступ, коли я вставляю код, але все ще маю vim auto indent, коли я пишу код? Ось мій .vimrcфайл:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  

4
FWIW, vim 8.0.210 додає вбудовану підтримку кронштейнової пасти, тому це дозволить уникнути відступу вставленого тексту.
sh1

Для нових файлів, щоб уникнути перепаду з пастою / nopaste vim, ви можете cat > mynewfile.txtнатиснути Enter , вставити текст, знову натиснути Enter , а потім Ctr + D для збереження. Файл тепер створено, і ви можете його редагувати vim mynewfile.txt.
ccpizza

Відповіді:


2065

Оновлення: краща відповідь тут: https://stackoverflow.com/a/38258720/62202

Щоб вимкнути автозахист під час вставки коду, існує спеціальний режим "вставити".

Тип

:set paste

Потім вставте свій код. Зауважте, що текст у підказці тепер говорить -- INSERT (paste) --.

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

:set nopaste

Однак я завжди вважав це громіздким. Ось чому я <F3>малюю так, що він може перемикатися між режимами вставки та нопасти під час редагування тексту! Я додаю це до.vimrc

set pastetoggle=<F3>

38
Це не простіше, ніж :set noaiдалі :set ai. Пропозиція :r! catкоротша.
Леопд

68
Я думаю set paste, що простіше, безумовно. Це набагато семантичніше noaiчи навіть рівне noautoindent, що важливіше, коли вводити "noai" та "paste" потрібно приблизно стільки ж незначного часу, коли ти достатньо досвідчений, як дотик.
Віктор Заманян

52
:set noaiне завжди працює, залежно від налаштування інших параметрів, пов’язаних з відступом, відповідно до ОП. :set pasteвиявляється скороченням декількох налаштувань одночасно.
MarkHu

13
Пізно на вечірку, але set copyindentподбайте про це за вас без проблем.
Метт Райан

33
:set pasteтакож вимикає інші функції, такі як завершення брекетів, що також не потрібно при вставці коду.
Мануель Фокс

263

Щоб уникнути небажаних ефектів під час вставки, є параметр, який потрібно встановити:

set paste

Корисною командою, яку має у вашому .vimrc є set pastetoggle=<F10>чи інша кнопка, для легкого перемикання між пастою та nopaste.


13
Нарешті! Я продовжував друкувати: встановити paste /: встановити nopaste, як дурно! Дякую.
imwilsonxu

4
з практичної точки зору, ваша відповідь корисніша за прийняту відповідь
Lynob

8
Ще один варіант - додати макрос до свого vimrc:nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Кріс,

Приємна пропозиція @Chris - одна послідовність клавіш для вставки без проблем з відступом!
RichVel

що робити, якщо я ніколи не хочу перебувати в режимі вставки? чи є спосіб назавжди відключити?
Максвелл

132

Я зазвичай використовую, :r! catа потім вставляю ( shift + insert )вміст і CTRL+D.

Немає необхідності вмикати та відключати пряме використання.


Мені подобається цей варіант прямого використання. Я все ще вчуся читати синтаксис vim на веб-сторінках. Що означають ваші кроки? Зокрема, якщо припустити, що у мене є щось із буфера обміну системи, що я натискаю, щоб вставити його в документ in vim?
jvriesem

9
Ця відповідь була б кориснішою з інформацією про те, чому і як :r! catпрацює.
К Ерландссон

11
@KErlandsson, :rвставляє вміст файлу в поточний документ. !catкаже, запустіть кішку, яка по суті відкриває stdin (* nix оболонки) (shift + insert)або для деяких терміналів, клацанням правою клавішею миші вставити вміст буфера обміну в термінал CTRL+Dє кінцевим файлом, тому він закриє :r !catсеанс.
Даніель

Це насправді? Чим встановити варіант, pasteзроблений виключно для цієї мети? @jvriesem Це не прямий варіант, якщо я вважаю, що ви розумієте це слово.
0xc0de

Ви можете також використовувати :r! catте , CTRL+SHIFT+Vщоб вставити в терміналі (то CTRL+D).
Пол Рудьо

86

Якщо ви працюєте локально, ви можете вставити з системного буфера обміну ключовою послідовністю:

"+p

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

Звичайно, якщо ви працюєте віддалено (наприклад, консоль над SSH), це не спрацює, і вам слід перейти в :set noaiрежим вставки, вставити в консоль, залишити модуль insertmode, прокласти :set aiмаршрут, як описано в іншому місці.


10
Я пишу цю відповідь століттями тому. В даний час я використовую, :set pasteа :set nopasteнатомість, тому що, незважаючи на те, що довше, запам'ятовується простіше, і мені не доведеться шукати це щоразу!
thomasrutter

6
У деяких вбудованих системах (в основному на базі зайнятих в основному) :set pasteне реалізовано, тому :set noaiслід використовувати їх замість.
jcarballo

Якщо у вас є великий текст для копіювання, чи не швидше скористатись регістром +?
pedromanoel

1
@pedromanoel, який працює лише при локальній роботі. Наприклад, він не працюватиме з доступом до vim через SSH, наприклад, якщо ви скопіювали щось локально і хочете вставити його у vim, який є у вашому сеансі SSH.
thomasrutter

1
@thomasrutter, але я відобразив це на <leader>p.. дуже корисно!
Дейн

51

Хоча налаштування режиму вставки paste/nopaste/pastetoggleідеально добре, вам залишається вручну ввімкнути режим вставки перед вставкою та відключити режим вставлення після вставки. Будучи ледачою людиною, якою я є, - це найкраще рішення, яке я знайшов поки що, яке автоматично перемикає режим вставки, коли ви вставляєте.

Ось невеликий трюк, який використовує режим вставки, що складається з брекетом, для автоматичного встановлення / вимкнення режиму вставки Vim під час вставки. Введіть наступне у свій .vimrc:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Тепер ви можете вставляти, не вмикаючи або вимикаючи режим пасти - це обробляється автоматично для вас.

Джерело: Coderwall

Примітка. Це рішення не працює в WSL (підсистема Windows 10 для Linux). Якщо хтось має рішення для WSL, будь ласка, оновіть цю відповідь або додайте її до коментарів.

Tmux Якщо використовується tmux, тоді декларації потрібно подвоїти. Код для цього також є в Coderwall


Це геніально. Хоча одне, однак ... З кожною пастою я отримую "0" (нульовий) шаррактер на початку кожної пасти. Якась порада для цього?
Юлій Ш.

також зверніть увагу, якщо ви використовуєте tmux, вам потрібно подвоїти втечу. Код для цього знаходиться у посиланні Coderwall у відповідь
Daithí

1
Якщо ви ще лазурніше і копіюєте вставлення вище коду у свій .vimrc, подбайте про відступ функції XTermPasteBegin ().
k1133

Мені було цікаво, як це працює, і тому я шукав Вставити Bracketing і виявив gitlab.com/gnachman/iterm2/-/wikis/Paste-Bracketing, який пояснює, що t_SIі t_EIзмінні дозволяють скопіювати пасту і вимкнути її. Коли ввімкнено кронштейн для вставки, текст, який вставляється, є префіксом esc[200~і за ним esc[201~.
PatS

37

Користувачі Mac можуть уникнути автоматичного форматування, читаючи безпосередньо з картону за допомогою:

:r !pbpaste

3
Це дивовижна відповідь. Коли я це роблю, він приховує документ (схоже, що я знову в командному рядку), але має текст у своєму буфері обміну. Це спонукає мене натиснути клавішу Enter, і я це роблю, і він повертає мене назад до свого документа без будь-яких змін. Що сталося, і як я можу робити те, що ви говорите?
jvriesem

Якщо ви просто введете :.!pbpaste, це має спрацювати, замінивши поточний рядок на висновок буфера вставки. Загалом, vim дозволяє передавати дані, які є у вашому поточному файлі, в іншу програму та замінювати текст на вихід команди. Тому :1,3!pbpasteзамінює перші три рядки вашого файлу буфером вставки. Я використовую :.!ppjsonдуже довгий (неформатований рядок JSON) і відформатую його і замінюю довгу рядок форматним еквівалентом. ppjson - це просто баш сценарій, який працює python -m json.tool.
PatS

19

Ось публікація того, хто придумав, як перевстановити подію вставки, щоб автоматично увімкнути режим, а потім відключити його. Працює для мене в tmux / iTerm на MacOSX.


1
Дякую за пораду. Я також відстежив плагін, де людина зібрав подібну функціональність - stackoverflow.com/a/36512548/255961 .
studgeek

Це, мабуть, спричиняє рядок "eeeeeee", коли я вставляю фрагмент тексту з буфера обміну.
Джон Цзян

16

Додайте це до свого, ~/.vimrcі вам потрібно буде лише натиснути клавішу F2 до і після вставки:

set pastetoggle=<F2>

12

Я просто вклав set clipboard=unnamedу свій .vimrc. Це робить карту буфера за замовчуванням відображенням у буфер обміну X.

Отже, якщо я позначу трохи тексту в терміналі, я можу просто натиснути, pщоб вставити його в vim. Так само я можу витягнути речі у vim (наприклад, YYвитягнути поточний рядок у буфер) та середнім клацанням у будь-якому вікні, щоб вставити його.

Данно. Я вважаю це супер зручним.


IMHO, це найкраща відповідь, немає потреби в перемиканні з F11 (що попередньо конфігурується за замовчуванням у vim). Це працює в системі Mac OSX, про інших я не знаю.
LightMan

9

Під час роботи всередині терміналу плагін vim-bracketed-paste vim автоматично оброблятиме пасти, не потребуючи жодних натискань клавіш до або після вставки.

Він працює за допомогою виявлення скобоподібного режиму вставки, який є послідовністю виходу, що надсилається "сучасними" сумісними терміналами терміналами, такими як iTerm2, gnome-термінал та іншими терміналами за допомогою libvte. Як додатковий бонус, він працює також для tmux сесій. Я успішно використовую його з iTerm2 на Mac, що підключається до Linux-сервера та використовує tmux.


Остерігайтеся того, що він також зазначає далі: На жаль, це означає, що вони також будуть запускати вміст буфера введення, якщо в що-небудь, що ви вставите в термінал, є новий рядок.
0xc0de

1
@ 0xc0de, ця цитата тут не стосується. Це говорить про те, що оболонка буде робити, якщо вона не підтримує режим скореного вставки. Це сенс у режимі скоригованої пасти - щоб не допустити цього.
sh1

Це працювало для мене набагато краще, ніж інші рішення. Дякую.
jjj

8

Вставте це у своєму ~ / .vimrc і будьте раді:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

Редагувати: :r !catзамислившись , це набагато кращий підхід, оскільки він короткий, семантичний і не вимагає спеціального vimrc. Використовуйте це замість цього!


5

Незважаючи на те, :pastetoggleчи :pasteі :nopasteповинні працювати нормально (якщо реалізовані - вони не завжди , як ми можемо бачити з обговорення) Я дуже рекомендую склеювання з використанням прямого підходу "+pабо "*pі читання з "+rабо "*r:

Vim має доступ до десяти типів регістрів ( :help registers), і запитувача цікавить розділ quotestarі quoteplusз нього

  1. Реєстри вибору та випаду "*, "+і "~

Використовуйте ці регістри для зберігання та отримання вибраного тексту для графічного інтерфейсу. Дивіться quotestarі quoteplus. Якщо буфер обміну недоступний або не працює, замість цього використовується неназваний реєстр. Для систем Unix буфер обміну доступний лише тоді, коли присутня функція + xterm_clipboard. {не в Vi}

Зауважте, що для систем X11 існує лише відмінність між "* і" +.

:help x11-selectionдалі уточнює різницю *та +:

                                                  quoteplus quote+

Існує три задокументовані X вибору: ПЕРВІЙНИЙ (який, як очікується, представлятиме поточний візуальний вибір - як у візуальному режимі Vim), SECONDARY (неправильно визначений) та CLIPBOARD (який, як очікується, буде використовуватися для операцій вирізання, копіювання та вставки. ).

З цих трьох, Vim використовує PRIMARY під час читання та запису регістру "* (отже, коли доступні виділення X11; Vim встановлює значення за замовчуванням для" буфера обміну "" автовибору "), а CLIPBOARD під час читання та запису в регістр" + ". Vim не отримує доступу до ВТОРИННОГО вибору.

Приклади: (припускаючи значення параметрів за замовчуванням)

  • Виберіть URL у візуальному режимі у Vim. Перейдіть до свого браузера та натисніть середню кнопку миші в текстовому полі URL-адреси. Вибраний текст буде вставлено (сподіваємось!). Примітка: у Firefox ви можете встановити перевагу midmouse.contentLoadURL істинному в about: config, тоді вибрана URL-адреса буде використана при натисканні середньої кнопки миші в більшості місць у вікні.

  • Виберіть текст у своєму браузері, перетягуючи мишкою. Перейдіть до Vim і натисніть середню кнопку миші: вибраний текст вставляється.

  • Виберіть текст у Vim та зробіть "+ y. Перейдіть у свій браузер, виберіть текст у текстовому полі, перетягнувши мишкою. Тепер скористайтесь правою кнопкою миші та виберіть" Вставити "зі спливаючого меню. Вибраний текст буде перезаписаний текст від Vim. Зауважте, що текст у "+ регістрі" залишається доступним під час вибору Visual, що робить інший текст доступним у регістрі "*". Це дозволяє перезаписувати вибраний текст.

я помітив, що за допомогою середнього клацання vim не здається, що
псує

4

Це працює для мене (випадок для + реєстру, що я використовую як буфер обміну між aps):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>

2

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

варити встановити macvim --override-system-vim


Це так, якщо ви включаєте в свій .vimrcфайл директиви ОП ?
Дрю Ноакс

2

Рідна паста / брекет-паста - це найкращий і найпростіший спосіб з тих пір vim 8(вийшов у 2016 році). Це навіть працює над ssh! (Вставну в рамку пасту працює на Linux і Mac, але не на Windows Git Bash)

  1. Переконайтеся, що у вас vim 8+ (вам не потрібні +clipboardабо +xterm_clipboardпараметри).

    vim --version | head -1

  2. Просто використовуйте натиснуту команду ОС (наприклад, ctrl+shift+Vабо cmd+V) у звичайному режимі. Не натискайте iдля режиму вставки.


Тест

  1. Скопіюйте ( ctrl+shift+Cабо cmd+C) вихід цього (2 рядки з відступом вкладки) у буфер обміну системи:

    echo -e '\ta\n\tb'

  2. Запустіть чистий vim 8+ з автоіндексом:

    vim -u NONE --noplugin -c 'set autoindent'

  3. Вставте із буфера обміну системи ( ctrl+shift+Vабо cmd+V) у звичайному режимі. Не натискайте iдля режиму вставки. aІ bповинні бути приведені в відповідність з однієї вкладки відступу. Ви навіть можете це зробити під час переходу на віддалену машину (віддаленій машині знадобиться vim 8+).

  4. Тепер спробуйте старий спосіб, який дозволить автоматично встановити другий рядок із додатковою вкладкою: Натисніть iдля вставки режиму. Потім вставте за допомогою ctrl+shift+Vабо cmd+V. Зараз aі bнерівні.


Встановлення Vim 8


1
найкращий і найпростіший спосіб! Також Google запропонував це Featured snippetдля мого пошуку "вставити вміст без вкладок vim", можливо тому, що я використав ключове слово "вкладка", лише у цій відповіді згаданий :)
Девід


1

Найшвидший спосіб я знаю , щоб швидко перейти до пастообразному режиму вставки для одноразової пасти tpope - х неушкоджені , який показує yoі yO, імовірно мнемоніку для «відкриття». Вони задокументовані лише у його vimdoc, як:

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


1

Ще один спосіб вставки - це через <CR>і видалення вмісту регістра (тут глобальний реєстр). Див .: :h i_ctrl-rі h i_CTRL-R_CTRL-O.

З довідкової документації vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Отже, щоб вставити вміст у vim без автоматичного відступу, використовуйте <CR><CO>*в більшості систем Unix.

Примітка. Це працює лише в тому випадку, якщо компілюється vim clipboard.



1

Ще однієї відповіді я до цього часу не бачив:

:se paste noai

0

На жаль, я виявив, що згаданий плагін vim не працює з iTerm2 3.0.15 (якщо чесно, я не знаю, чи не вдалось це виконати на старих версіях) - але я знайшов цей хак.

Команда map-p для вставки та використання клавіш vim iTerm2. Очевидно, це працює лише для iTerm2.

Як це працює. Я використовую "jk" для входу в режим втечі, і вам також знадобиться:

: inoremap jk

у вашому .vimrc.

Тоді він просто викликає P для входу в режим вставки, "+ p для вставки з буфера обміну", а потім P для відключення режиму вставки. Hth.

введіть тут опис зображення


1
Зачекайте, що ви використовуєте для цього "jk"?
0xc0de

О так, я забув це згадати. Просто додайте ": inoremap jk <esc>" у свій .vimrc. Щодо того, чому я використовую jk, запитайте Apple і чому вони відчували потребу рухатися та позбуватися фізичного ключа втечі. 8 (
Ніл Макгілл

До речі, це займає певну підготовку, але через деякий час jk відчуває себе швидше, і я думаю, що я вважаю за краще це зараз, ніж бігти ... Як би там не було цікаво знати, чи iTerm2 приймає <ESC> і тут.
Ніл Макгілл

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