Отключение автоматического отступа при вставке текста в vim - PullRequest
1071 голосов
/ 25 марта 2010

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

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

line
  line
    line

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

Как отключить автоматический отступ, когда я вставляю код, но при написании кода у меня по-прежнему есть автоматический отступ vim? Вот мой .vimrc файл:

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

Ответы [ 21 ]

1888 голосов
/ 25 марта 2010

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

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

Тип

:set paste

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

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

:set nopaste

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

set pastetoggle=<F3>
255 голосов
/ 25 марта 2010

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

set paste

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

124 голосов
/ 30 марта 2010

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

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

84 голосов
/ 05 ноября 2011

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

"+p

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

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

37 голосов
/ 28 августа 2013

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

:r !pbpaste
32 голосов
/ 08 июля 2016

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

19 голосов
/ 09 февраля 2014

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

12 голосов
/ 22 марта 2015

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

set pastetoggle=<F2>
9 голосов
/ 09 апреля 2016

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

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

9 голосов
/ 20 января 2015

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

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

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

...