Как сохранить код в исходном коде при вставке в 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.