it-swarm.com.ru

Отключение автоматического отступа при вставке текста в vim

Я прилагаю усилия, чтобы изучить Vim.

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

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  
1021
Rimian

Обновление: Лучше ответ здесь: https://stackoverflow.com/a/38258720/62202

Чтобы отключить автоиндентирование при вставке кода, есть специальный режим «вставки».

Тип 

:set paste

Затем вставьте свой код. Обратите внимание, что текст во всплывающей подсказке теперь говорит -- INSERT (paste) --.

После того, как вы вставили свой код, отключите режим вставки, чтобы автоматический ввод отступа при вводе снова работал правильно.

:set nopaste

Тем не менее, я всегда находил это громоздким. Вот почему я отображаю <F3> так, что он может переключаться между режимами вставки и nopaste при редактировании текста! Я добавляю это к .vimrc

set pastetoggle=<F3>
1811
P Shved

Чтобы избежать нежелательных эффектов при вставке, необходимо установить параметр:

set paste

Полезная команда в вашем .vimrc - это set pastetoggle=<F10> или какая-либо другая кнопка, чтобы легко переключаться между вставкой и nopaste.

251
Jacob R

Я обычно использую :r! cat, а затем вставляю ( shift + insert ) содержимое и CTRL+D.

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

123
thegeek

Если вы работаете локально, вы можете вставить из системного буфера обмена последовательность клавиш:

"+p

Это правильная команда vim, поэтому вам не нужно беспокоиться о входе в режим вставки или отключении автоматического отступа.

Конечно, если вы работаете удаленно (например, через консоль через SSH), это не сработает, и вы должны перейти в режим :set noai, режим вставки, вставить в консоль, выйти из режима вставки, :set ai, как описано в другом месте.

82
thomasrutter

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

:r !pbpaste
37
maniacalrobot

Хотя установка режима вставки с помощью 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

27
thdoan

Вот сообщение кем-то, кто выяснил, как переназначить событие вставки, чтобы автоматически включить режим вставки и затем выключить. У меня работает в tmux/iTerm на MacOSX.

19
Von

Добавьте это к своему ~/.vimrc, и вам нужно будет только нажать F2 до и после вставки:

set pastetoggle=<F2>
12
anh_ng8

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

Он работает путем обнаружения режима вставки в скобках , который представляет собой escape-последовательность, отправляемую «современными» терминалами, совместимыми с x-term, такими как iTerm2, gnome-Terminal и другими терминалами, использующими libvte. В качестве дополнительного бонуса он работает также для сеансов tmux. Я успешно использую его с iTerm2 на Mac, подключаясь к серверу Linux и используя tmux.

9
studgeek

Я просто поместил set clipboard=unnamed в мой .vimrc. Это делает карту буфера вставки по умолчанию в буфер обмена X.

Поэтому, если я отмечу немного текста в терминале, я могу просто нажать p, чтобы вставить его в vim. Точно так же я могу перетянуть вещи в vim (например, YY, чтобы перетянуть текущую строку в буфер) и щелкнуть средней кнопкой мыши в любом окне, чтобы вставить его.

Не знаю. Я нахожу это супер удобным.

9
Soren

Вставьте это в ваш ~/.vimrc и будьте счастливы:

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

Правка: если подумать, :r !cat - гораздо лучший подход, поскольку он короткий, семантический и не требует никакого пользовательского vimrc. Используйте это вместо этого!

7
Dergachev

Хотя :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: PRIMARY (ожидается, что Будет представлять текущий визуальный выбор - как в визуальном режиме Vim), SECONDARY (который не определен) и CLIPBOARD (который, как ожидается, будет использоваться для операций вырезания, копирования и вставки).

Из этих трех Vim использует PRIMARY при чтении и записи "* register (Следовательно, когда выбор X11 доступен, Vim устанавливает значение по умолчанию для 'Clipboard'" autoselect ") и CLIPBOARD при чтении и писать "+ регистр. Vim не имеет доступа к ВТОРИЧНОМУ выбору.

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

  • Выберите URL в визуальном режиме в Vim. Перейдите в браузер и нажмите средняя кнопка мыши в текстовом поле URL. Выбранный текст будет вставлен (надеюсь!). Примечание: в Firefox вы можете установить middlemouse.contentLoadURL предпочтение true в about: config, а затем выбранный URL будет использоваться при нажатии средней кнопки мыши в большинстве мест в окне.

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

  • Выделите некоторый текст в Vim и выполните «+ y. Перейдите в браузер, выделите текст в Текстовое поле, перетаскивая его мышью. Теперь используйте правую кнопку мыши и Выберите« Вставить »во всплывающем меню. Выделенный текст перезаписывается текстом Из Vim . Обратите внимание, что текст в регистре «+» остается доступным при создании визуала выделение, которое делает другой текст доступным в регистре "*. Это позволяет перезаписать выделенный текст.
3
codingdave

Это работает для меня (случай + регистр, что я использую как буфер обмена между APS):

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

Если вы работаете на Mac, Macvim, кажется, справится с этим без необходимости переключения пасты.

brew install macvim --override-system-vim

2
Marcus Ericsson

Самый быстрый способ, которым я знаю, чтобы быстро перейти в режим вставки-вставки для вставки одним выстрелом, - это tpope's unimpaired , который содержит yo и yO, предположительно мнемонику для «вы открываете ». Они только зарегистрированы в его vimdoc, как:

Переключатель не был предоставлен для «вставки», потому что типичный вариант использования Обертывание одиночной вставки настолько расточительно: вы переключаетесь дважды, но Вы вставляете только один раз (YOPO). Вместо этого нажмите yo или yO, чтобы вызвать o или O с помощью «Вставить» уже установлено. Выход из режима вставки устанавливает 'nopaste' автоматически.

1
Micah Elliott

Пожалуйста, прочитайте эту статью: Переключить авто-отступ для вставки кода

Некоторым людям нравится визуальная обратная связь, отображаемая в строке состояния следующей альтернативой для вашего vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
1
d.danailov

Из vim: ]p

Снаружи: "*]p или "+]p

0
Bruno

Другой способ вставить это через <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.

0
TheChetan

К сожалению, я обнаружил, что упомянутый плагин vim не работает с iTerm2 3.0.15 (честно говоря, я не знаю, сломался ли он на старых версиях) - но вместо этого я нашел этот хак.

Сопоставьте команду p, чтобы выполнить вставку и используя ключи ver iTerm2. Очевидно, это работает только для iTerm2.

Как это устроено. Я использую "JK", чтобы войти в режим побега, поэтому вам также понадобится:

: inoremap jk 

в вашем .vimrc.

Затем он просто вызывает P, чтобы войти в режим вставки, "+ p, чтобы вставить из буфера обмена, а затем P, чтобы отключить режим вставки. Hth.

 enter image description here

0
Neil McGill

Другого ответа я не видел до сих пор:

:se paste noai
0
sjas