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

Я стараюсь узнать Vim.

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

line
  line
    line

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

Как отключить авто отступы, когда я вставляю код, но все еще имею auto indent, когда я пишу код? Вот мой файл .vimrc:

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

Ответы

Ответ 1

Обновление: лучше ответ здесь: fooobar.com/questions/11596/...

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

Тип

:set paste

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

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

:set nopaste

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

set pastetoggle=<F3>

Ответ 2

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

set paste

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

Ответ 3

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

Не нужно включать и отключать прямое использование.

Ответ 4

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

"+p

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

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

Ответ 5

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

:r !pbpaste

Ответ 6

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

Ответ 7

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

Ответ 8

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

set pastetoggle=<F2>

Ответ 9

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

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

Незнайка. Я считаю, что это удобно.

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

Хотя :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+

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

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

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

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

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

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

Ответ 14

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

brew установить macvim --override-system-vim

Ответ 16

Самый быстрый способ, которым я должен быстро перейти в режим вставки вставки для одноразовой пасты, - это tpopes unimpaired, какие функции yo и yo, предположительно мнемоники для "вы открываете". Они описаны только в его vimdoc, так как:

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

Ответ 17

От vim: ]p

Со стороны: "*]p или "+]p

Ответ 18

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

Ответ 19

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

Задать команду map-p для вставки и использования iTm2 vim. Очевидно, что это работает только для iTerm2.

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

: inoremap jk

в вашем .vimrc.

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

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

Ответ 20

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

:se paste noai

Ответ 21

Собственная паста/скобки в скобках - лучший и самый простой способ со времен 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