Отключение автоматического отступа при вставке текста в Vim
Я прилагаю усилия, чтобы узнать Vim.
когда я вставляю код в свой документ из буфера обмена, я получаю дополнительные пробелы в начале каждой новой строки:
line
line
line
Я знаю, что вы можете отключить автоматический отступ, но я не могу заставить его работать, потому что у меня есть некоторые другие настройки, конфликтующие или что-то (которые выглядят довольно очевидными в моем .vimrc, но, похоже, не имеет значения, когда я их вынимаю).
Как отключить автоматический отступ, когда я вставляю код, но все еще имею vim но когда я пишу код? Вот мой .vimrc file:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
19 ответов:
обновление: лучше ответьте здесь: https://stackoverflow.com/a/38258720/62202
отключить автоотступа, когда вы вставляете код, есть специальный режим "Паста".
тип
:set pasteзатем вставьте свой код. Обратите внимание, что текст во всплывающей подсказке теперь говорит
-- INSERT (paste) --.после того, как вы вставили свой код, выключите режим вставки, чтобы автоматический отступ при вводе работал правильно снова.
:set nopasteоднако, я всегда находил это громоздким. Вот почему я составляю карту
<F3>таким образом, что он может переключаться между режимами вставки и nopaste при редактировании текста! я добавляю это к.vimrcset pastetoggle=<F3>
чтобы избежать нежелательных эффектов при вставке, есть опция, которая должна быть установлена:
set pasteполезная команда, чтобы в вашем .vimrc составляет
set pastetoggle=<F10>или какая-то другая кнопка, чтобы легко переключаться между пастой и nopaste.
Я обычно использую
:r! catа потом вставить( shift + insert )содержание, иCTRL+D.нет необходимости включать и отключать, прямое использование.
Если вы работаете локально, вы можете вставить из системного буфера обмена с ключевой последовательностью:
"+pЭто правильное команду Vim, так что не надо беспокоиться о вводе в режиме вставки или отключения первого автоотступа.
конечно, если вы работаете удаленно (консоль через SSH, например), то это не будет работать, и вы должны пойти
:set noai, режим вставки, вставить в консоль, оставить insertmode,:set aiмаршрута, как описано в другом месте.
пользователи Mac могут избежать автоматического форматирования, читая непосредственно из картона с:
:r !pbpaste
вот пост кто-то, кто понял, как переназначить событие вставки, чтобы автоматически включить режим вставки, а затем отступить. Работает для меня в tmux / iTerm на MacOSX.
при установке режима вставки с
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
добавьте это в ваш
~/.vimrcи вам останется только нажать клавишу F2 до и после оклейки:set pastetoggle=<F2>
Я просто ставлю
set clipboard=unnamedв моем .vimrc. Это делает карту буфера вставки по умолчанию в буфер обмена X.Итак, если я отмечаю немного текста в терминале, я могу просто нажать
pчтобы вставить его в vim. Точно так же я могу дергать вещи в vim (напримерYYчтобы дернуть текущую строку в буфер) и средний щелчок в любом окне, чтобы вставить его.не знаю. Я считаю, что это очень удобно.
при работе внутри терминала vim-bracketed-paste Vim плагин будет автоматически обрабатывать пасты без необходимости каких-либо нажатий клавиш до или после вставки.
Он работает путем обнаружения режим вставки в скобках который является escape-последовательностью, отправленной" современными " X-терминальными совместимыми терминалами, такими как iTerm2, gnome-terminal и другими терминалами, использующими libvte. В качестве дополнительного бонуса он работает также на сессии tmux. Я использую его успешно с iTerm2 на Mac подключение к серверу linux и использование tmux.
положите его в ваш ~/.vimrc и будьте счастливы:
" enables :Paste to just do what you want command Paste execute 'set noai | insert | set ai'Edit: on reflection,
:r !catэто гораздо лучший подход, так как он короткий, семантический и не требует специального vimrc. Используйте это вместо этого!
это работает для меня ( случай для + register, что я использую как буфер обмена между aps):
imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
хотя
:pastetoggleили:pasteи:nopasteдолжно работать нормально (если реализовано-они не всегда, как мы можем видеть из обсуждения) я очень рекомендую вставку с использованием прямого подхода"+pили"*pи чтение с"+rили"*r:Vim имеет доступ к десяти типов регистров (
:help registers) и спрашивающий интересуетсяquotestarиquoteplusиз раздела
- выбор и падение регистров
"*,"+и "~использовать эти регистры для хранения и извлечения выделенного текста для GUI. Смотрите
quotestarиquoteplus. Когда буфер обмена недоступен или нет работая, вместо этого используется безымянный регистр. Для систем Unix буфер обмена доступно только тогда, когда функция +xterm_clipboard присутствует. {не в Vi}обратите внимание, что существует только различие между "* и "+ для систем X11.
:help x11-selectionдалее уточняет разницу*и+:quoteplus quote+есть три документированных выбора X: первичный (который, как ожидается , представляют текущий визуальный выбор-как в визуальном режиме Vim), вторичный (который плохо определен) и буфер обмена (который, как ожидается, будет использоваться для операции вырезания, копирования и вставки).
из этих трех, Vim использует первичный при чтении и записи " * регистр (следовательно, когда выбор X11 доступно, Vim устанавливает значение по умолчанию для "буфер обмена "из " автоселекта"), и буфер обмена при чтении и записи "+ реестр. Vim не имеет доступа к вторичному выбору.
примеры: (предполагая значения параметров по умолчанию)
выберите URL-адрес в визуальном режиме в Vim. Перейдите в браузер и нажмите кнопку средняя кнопка мыши в текстовом поле URL. Выделенный текст будет вставил (надеюсь!). Примечание: В Firefox вы можете установить middlemouse.предпочтение contentLoadURL к true в about: config, затем выбранный URL будет использоваться при нажатии средней кнопки мыши в большинстве мест в окне.
выберите текст в браузере, перетаскивая его мышью. Перейти к Vim и нажмите среднюю кнопку мыши: выделенный текст вставлен.
- выделить текст в Vim и у "+г. Заходим в браузер, выделите текст в в поле путем перетаскивания с помощью мыши. Теперь использовать правой кнопкой мыши и выберите "Вставить" из всплывающего меню. Выделенный текст заменяется текст из Vim. Обратите внимание, что текст в " + регистре остается доступным при создании визуального элемента выбор, который делает другой текст доступным в " * регистре. Что позволяет заменяя выделенный текст.
Если вы находитесь на mac, macvim, похоже, хорошо справляется с этим, не переключая вставку.
brew install macvim --override-system-vim
пожалуйста, прочитайте эту статью: переключение автоматического отступа для вставки кода
некоторым людям нравится визуальная обратная связь, показанная в строке состояния следующей альтернативой для вашего
vimrc:nnoremap <F2> :set invpaste paste?<CR> set pastetoggle=<F2> set showmode
самый быстрый способ, о котором я знаю, чтобы быстро перейти в режим вставки-вставки для одноразовой вставки,-это tpope живое, которая включает
yoиyO, предположительно мнемоника для "Вы открываете". Они только задокументированы в его vimdoc, как:переключатель не был предусмотрен для "вставить", потому что типичный случай использования обертывание одиночной вставки настолько расточительно: вы переключаете дважды, но вы вставляете только один раз (YOPO). Вместо этого нажмите yo или yO, чтобы вызвать o или O с помощью "вставить" уже установлен. Оставив nopaste вставить задает режим автоматического.
другой способ вставки через
<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.
к сожалению, я обнаружил, что плагин vim упомянул, что он не работает с iTerm2 3.0.15 (честно говоря, я не знаю, сломался ли он на более старых версиях), но вместо этого я нашел этот хак.
команда Map-p для выполнения вставки и использования ключей iTerm2 vim. Очевидно, что это работает только для iTerm2.
Как это работает. Я использую "jk" для входа в режим побега, поэтому вам также понадобится:
: inoremap jk
в свой .vimrc.
затем он просто вызывает P для ввода вставки режим " +p для вставки из буфера обмена, а затем P для отключения режима вставки. ХТ.

Comments