Вставка кода в окно терминала в 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, что может изменить это поведение? Или это терминальная проблема?

661   6  

6 ответов:

в vim:

:set paste

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

обновление: Vim 8 включает в себя встроенную поддержку режима вставки в скобках. Он включен по умолчанию. Увидеть ВИМ-х xterm-bracketed-paste раздел справки. Пользователям больше не нужно ничего делать, чтобы настроить Vim для поддержки этого.

начиная с Mac OS X Lion 10.7, терминал поддерживает "режим вставки в скобках", который позволяет эмулятору терминала сообщать программе, подключенной к tty, когда пользователь вставляет текст, чтобы программа не интерпретировала его как команды редактирования. Программы, которые его поддерживают отправить терминал escape-последовательность для включения этого режима, в котором терминал окружает вставленный текст с парой 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 ~), он включает режим вставки (set paste) и переключается в режим вставки при необходимости ("i"). Когда он получает соответствующий маркер конца вставки (ESC [ 201~), он отключает режим вставки (pastetoggle) и остается в режиме вставки. Элемент cmap команды позволяют командной строке Vim игнорировать escape-последовательности и принимать вставленный текст как есть.

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

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

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

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

set pastetoggle=<F2>

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

в vim

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

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

: set nopaste

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

"+p

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

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

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

плагин в основном упакованная версия функциональности, которую @Chris Page перечислил в своем ответ.

Comments

    Ничего не найдено.