Отключение автоматического отступа при вставке текста в 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
из раздела
- выбор и падение регистров
"*
,"+
и "~используйте эти регистры для хранения и извлечения выбранного текста для 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.