Вставка кода в окно терминала в vim на Mac OS X - PullRequest
66 голосов
/ 07 апреля 2011

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

Ответы [ 6 ]

105 голосов
/ 14 августа 2011

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

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

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

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

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

84 голосов
/ 07 апреля 2011

В пределах vim:

:set paste

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

9 голосов
/ 09 апреля 2011

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

set pastetoggle=<F2>

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

6 голосов
/ 16 августа 2012

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

"+p

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

6 голосов
/ 07 апреля 2011

In vim

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

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

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

4 голосов
/ 09 апреля 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...