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

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

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

line
  line
    line

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

Как отключить автоматический отступ, когда я вставляю код, но все еще имею vim но когда я пишу код? Вот мой :

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

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

set 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-term совместимыми терминалами, такими как 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: по размышлении,: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 из раздела

  1. выбор и падение регистров "*, "+ и "~

используйте эти регистры для хранения и извлечения выбранного текста для GUI. См.quotestar и quoteplus. Когда буфер обмена недоступен или нет вместо этого используется неназванный регистр. Для систем Unix буфер обмена доступен только при наличии функции +xterm_clipboard. {не в Vi}

обратите внимание, что существует только различие между "* и "+ для систем X11.

:help x11-selection далее разъясняет разницу * и +:

                                                  quoteplus quote+

есть три документированных выбора X: первичный (который, как ожидается , представлять текущий визуальный выбор-как в визуальном режиме Vim), вторичный (который является неопределенным) и буфер обмена (который, как ожидается, будет использоваться для операции вырезания, копирования и вставки).

из этих трех Vim использует PRIMARY при чтении и записи "* register (следовательно, когда выбор X11 доступно, Vim устанавливает значение по умолчанию для "буфер обмена "из " autoselect"), и буфер обмена при чтении и записи "+ реестр. Vim не имеет доступа к вторичному выбору.

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

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

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

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

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

brew установить 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" для входа в режим escape, поэтому вам также понадобится:

:Джоан inoremap

в свой .vimrc.

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

enter image description here


от vim:]p

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