Как сохранить код в исходном коде при вставке в vim?


37

Когда я копирую некоторый код с веб-страниц и вставляю его в VIM, я обнаруживаю, что он становится беспорядочным, как лестница

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Поскольку он так часто портится, я думаю, что-то не так с моим, .vimrcкак показано ниже:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Обычно я пишу python в VIM. И помощь будет принята с благодарностью.


1
Благодарю. Это раздражало меня годами, и я так и не удосужился спросить кого-нибудь об этом. +1.
DevSolar

Ответы:


50

Сделайте это раньше:

:set paste

Затем после:

:set nopaste

Не требуется для gvim; он включает и выключает их автоматически при вставке.
Бенджамин Банье

Есть идеи, почему это так?
Натан Феллман

1
Просто догадываюсь: обычный vim - это только командная строка, и он не «знает» о буфере обмена. Он принимает «вставить» в качестве входной последовательности символов и применяет авто-отступ. Gvim с поддержкой графического интерфейса может «знать», что входящие данные поступают из буфера обмена, и, таким образом, отключать автоматическое указание для этой цели.
DevSolar

Это правильно. Терминал обрабатывает операцию вставки как ввод необработанных символов.
Игнасио Васкес-Абрамс

Это не просто проблема vim - вы можете получить аналогичный эффект вставки в старый редактор DOS в командной строке. Эта программа отсутствует в 64-разрядной версии Windows 7 - возможно, потому, что она действительно является старым 16-разрядным приложением DOS, и ее обновление не стоило того. Это в Windows XP, однако, и вставка в это (1) работает очень медленно, выполняя посимвольный ввод, и (2) создает настоящий беспорядок.
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Переключить авто-отступ для вставки кода

Фон

Если вы используете команды Vim для вставки текста, ничего неожиданного не происходит. Проблема возникает только при вставке из другого приложения и только тогда, когда вы не используете версию Vim с графическим интерфейсом. В консольной или терминальной версии Vim нет стандартной процедуры вставки текста из другого приложения. Вместо этого терминал может эмулировать вставку, вставляя текст в буфер клавиатуры, поэтому Vim считает, что текст был набран пользователем. После окончания каждой строки Vim может перемещать курсор, чтобы следующая строка начиналась с того же отступа, что и предыдущая. Однако это изменит отступ уже в вставленном тексте.

Вставить переключатель

Вставьте следующее в ваш vimrc (измените на любой ключ, который вы хотите):

set pastetoggle=<F2>

Чтобы вставить из другого приложения:

  • Запустите режим вставки.
  • Нажмите F2 (включает опцию «вставить»).
  • Используйте свой терминал, чтобы вставить текст из буфера обмена.
  • Нажмите F2 (отключает опцию «вставить»).

Тогда существующий отступ вставленного текста будет сохранен.

Вам не нужно сначала запускать режим вставки, но если вы находитесь в обычном режиме и у вас есть отображение для F2, это отображение будет применяться, и функция «pastetoggle» не будет работать.

Некоторым людям нравится визуальная обратная связь, отображаемая в строке состояния следующей альтернативой для вашего vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Первая строка устанавливает отображение так, что нажатие клавиши F2 в обычном режиме инвертирует параметр «вставка», а затем отображает значение этого параметра. Вторая строка позволяет вам нажать F2 в режиме вставки, чтобы включить или выключить «вставку». Третья строка отображает, включена ли функция «вставить» в режиме вставки.


1
+1 для решения горячей клавиши. Для не слишком фирмы в VIM (как я), которая уже сопоставила F-клавиши с чем-то другим (как я), <C-F2> будет Ctrl-F2 ...
DevSolar

отлично - я сейчас использую это
hoju

почему бы просто не сопоставить ключи вставки, чтобы сделать это автоматически, например <S-Insert> или <Ctrl + V>, вместе с их исходными функциями? Или, напишите функцию, которая отключает вставку, когда в буфер в течение секунды записывается более нескольких входных символов, это просто идея, конечно, для меня у меня почти ВСЕ ключи сопоставлены с другими вещами, так что это боль У меня даже есть клавиатура с 12 F-клавишами и еще + 15 F-клавишами (G-клавишами), а также три уровня, которых все еще недостаточно :), но это только я. Единственная проблема заключается в том, что меню правой кнопки мыши не отправляется, если не отправляются какие-либо символы esc, чтобы сигнализировать о начале операции вставки ...
osirisgothra

2

Это автоиндент, который связывается с вами.

set autoindent
set smartindent

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


-2

Наименьшее количество усилий для достижения этого (может быть вложено .vimrc):

:set paste

Затем вставьте свой код.


3
'paste'Вариант никогда не должен был быть постоянно установлен. Он отключает много вещей, в том числе сопоставления и сокращения. Кроме того, предыдущий ответ уже охватывает 'paste'вариант.
Гептит

2
Добро пожаловать в Супер пользователя! Это дублирует существующий ответ и не добавляет новый контент. Пожалуйста, не публикуйте ответ, если у вас нет чего-то нового.
Тоби Спейт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.