Почему Vim неправильно вставляет код?


101

В Vim, если я вставлю этот скрипт:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Я получаю эти странные результаты:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Появились хеш-знаки (#) и вкладки. Почему?


31
Это может быть лучше вопрос для vi.stackexchange.com
Эрик Ренуф

@EricRenouf почему? (честный вопрос)
Qix

3
@qix я думал, что это вопрос о том, как работает vim, который является распространенным инструментом для * nix, но * nix не является обязательным требованием для использования vim
Эрик Ренуф,

1
@JaredBurrows Я очень надеюсь, что это удастся
Эрик Ренуф

1
Как вы запускаете пасту? С мышью?
Бен Фойгт

Ответы:


123

Есть две причины:

Для вставки vimпри включенном автоматическом отступе необходимо перейти в режим вставки , набрав:

:set paste

Затем вы можете перейти в режим вставки и вставить свой код. После завершения вставки введите:

:set nopaste

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

set pastetoggle=<F2>

Вы можете переключиться F2на любую клавишу, которую захотите, и теперь вы можете легко включать и выключать вставку.


Чтобы отключить автоматическую вставку комментариев, вы можете добавить эти строки в ваш vimrc :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimтакже предоставляет регистр вставки для вставки текста из системного буфера обмена. Вы можете использовать "*pили в "+pзависимости от вашей системы. В системе без X11, такой как OSX или Windows, вы должны использовать *регистр. В системе X11, такой как Linux, вы можете использовать оба.

дальнейшее чтение


2
Я использовал Vim навсегда и никогда не знал об этом. Большое спасибо.
Каха

Большинство современных графических эмуляторов терминала поддерживают функцию, которая называется «режим вставки в скобках». Vim может попросить терминал включить этот режим, который, в свою очередь, будет окружать вставленный текст определенными escape-последовательностями. Vim может распознать это и отключить перенос / отступ на время вставки. Длинная история: вставка будет «работать как положено». Я не пользователь vim, но быстрый веб-поиск наверняка подскажет вам, как настроить этот режим.
egmont

2
@MichaelDurrant set pasteникогда не должен быть в вашем vimrc. Он отключает или сбрасывает множество вещей, включая сопоставления режима вставки, сопоставления командной строки, сокращения, текстовую ширину, wrapmargin, автоиндентирование, smartindent, softtabstop, formatoptions, indentexpr и несколько других. :h pasteесть весь список. Большинство людей используют некоторые или все эти вещи и задаются вопросом, почему настройки игнорируются.
FDinoff

4
Я обычно использую, :r!catчтобы вставить дословно.
Саймон Рихтер

1
Возможно, стоит обсудить взаимодействие с set mouseкоторым можно автоматически входить и выходить из режима вставки при вставке с помощью мыши.
Бен Фойгт

36

Используйте пасту vim. То, что вы хотите, это вставить то, что находится в буфере буфера обмена "+p

Это выбирает +и вставляет его на место.

Если вы используете Linux, *это буфер X / middle-click (последний выделенный текст).

Тогда Вим знает, что это паста.

В противном случае vim думает, что вы ввели вставляемые ключи, и выполняет свой собственный автоматический отступ (поверх скопированного отступа) вплоть до конца вставки.

В качестве примечания, чтобы это работало над SSH, вам нужно установить опцию для вашего буфера обмена для совместного использования. -Y

Смотрите man sshдля более подробной информации.


4
Это на самом деле правильный ответ imho
Кристоффер Салл-Сторгард

Похоже, это работает только для графического vim ( gvim); vim, запущенный в эмуляторе терминала, вставляет последний удаленный текст с "* p, а не текущим выбором.
wurtel,

Я не использую gvim, только терминал vim. какая у тебя настройка мыши? моя настройка мыши - c. Не уверен, как это работает, когда выбор мыши разрешен. set mouse?
Exussum

2
также проверьте, чтобы vim --versionувидеть, была ли она скомпилирована с поддержкой буфера обмена, +xterm_clipboardдолжна быть в выводе
exussum

@wurtel: Может быть, вы установили буфер обмена со unnamedстрокой.
Cuonglm

8

Вкладки были вставлены, потому что у вас включен автоиндент, и вы можете отключить это поведение, отключив autoindent ( :set noai) перед вставкой в терминал.

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

В качестве альтернативы этим вы должны получить желаемое поведение, используя переключатели :set paste, вставляя отформатированный код и :set nopasteвосстанавливая нормальное поведение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.