Вставка кода в окно терминала в vim на Mac OS X

Когда я вставляю код в мое оконное окно Mac OS X в vim, он откладывает каждую строку. Для каждой строки он добавляет отступ, поэтому текст выглядит так:

"ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud        
   ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
        reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
             Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
                    deserunt mollit anim id est laborum."

Мое текущее обходное решение заключается в том, что я вставляю текст сначала в текстовый редактор textmate, который сохраняет правильное форматирование. Затем я сохраняю этот файл и открываю его в vim. Затем я использую vim yank, чтобы вставить его.
Есть ли параметр в моем .vimrc, который может изменить это поведение? Или это проблема термина?

Ответ 1

Внутри vim:

:set paste

Поместите Vim в режим вставки. Это полезно, если вы хотите вырезать или скопировать         некоторый текст из одного окна и вставьте его в Vim. Это позволит избежать         неожиданные эффекты.

Ответ 2

Как и в Mac OS X Lion 10.7, Terminal поддерживает "режим вставки в скобках", который позволяет эмулятору терминала сообщать программе, подключенной к tty, когда пользователь вставляет текст, чтобы программа не интерпретировала его как команды редактирования. Программы, которые его поддерживают, отправляют терминалу escape-последовательность, чтобы включить этот режим, в котором терминал окружает вложенный текст с помощью пары управляющих последовательностей, которые идентифицируют начало и конец.

Чтобы включить это в Vim, поместите следующий код в ваш файл ~/.vimrc:

if &term =~ "xterm.*"
    let &t_ti = &t_ti . "\e[?2004h"
    let &t_te = "\e[?2004l" . &t_te
    function XTermPasteBegin(ret)
        set pastetoggle=<Esc>[201~
        set paste
        return a:ret
    endfunction
    map <expr> <Esc>[200~ XTermPasteBegin("i")
    imap <expr> <Esc>[200~ XTermPasteBegin("")
    vmap <expr> <Esc>[200~ XTermPasteBegin("c")
    cmap <Esc>[200~ <nop>
    cmap <Esc>[201~ <nop>
endif

Это делает так, что, когда Vim переключает терминал на/из альтернативного экрана † (t_ti, t_te), он включает/отключает режим вставки в скобках (ESC [? 2004 h, ESC [? 2004 l]). Когда он получает escape-последовательность, указывающую начало вставки (ESC [200 ~), он включает режим вставки (установка пасты) и в случае необходимости переключается в режим вставки ( "i" ). Когда он получает соответствующий маркер конца пасты (ESC [201 ~), он отключает режим вставки (пастообразный) и остается в режиме Insert. Команды cmap устраивают командную строку Vim, чтобы игнорировать escape-последовательности и принимать вставленный текст как есть.

Обратите внимание, что это разрешает только режим вставки в скобки, когда значение $TERM начинается с "xterm..."; если вы устанавливаете $TERM на что-то еще, вы можете пересмотреть этот тест, включив в него значение $TERM. Или вы можете полностью отказаться от теста, поскольку он не является абсолютно необходимым - он просто пытается быть осторожным, чтобы не делать что-то, что может быть несовместимо с каким-либо другим типом терминала.

В терминале это работает со всеми различными командами вставки, а также с перетаскиванием.

† Терминал имеет главный экран и "альтернативный" экран. Каждый экран имеет собственное содержимое и состояние. Текст на альтернативном экране не прокручивается в журнал прокрутки. Он обычно используется программами, которые берут на себя управление всем экраном и поэтому называются "полноэкранными" программами. Например, vim, emacs, less и top.

Ответ 3

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

set pastetoggle=<F2>

на ваш .vimrc. Теперь вы можете переключать режим вставки, нажав F2 (или любую другую клавишу, которую вы выберете).

Ответ 4

В vim

: установить пасту

если вы хотите отключить его

: установить nopaste

Ответ 5

Другой способ сделать это, предполагая, что ваш системный буфер настроен правильно, - это делать

"+p

Это будет вставляться из системного буфера обмена.

Ответ 6

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

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

Плагин - это, в основном, упакованная версия функций, которые @Chris Page перечисляет в его ответе.