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


person eat_a_lemon    schedule 07.04.2011    source источник
comment
Паста в скобках решает эту проблему без необходимости вызывать другие команды, такие как :set paste. Паста в скобках доступна по умолчанию в vim 8. Но она будет включена только в том случае, если vim считает, что вы используете терминал, совместимый с Xterm. Есть несколько способов включить его, см. этот ответ на vi.stackexchange.   -  person Paul Rougieux    schedule 14.05.2020


Ответы (6)


В vim:

:set paste

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

person William Pursell    schedule 07.04.2011
comment
Я бы поставил его на тумблер; а именно; Это у меня в vimrc ... установите pastetoggle = ‹F4› - person wom; 09.07.2014

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

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

Чтобы включить это в 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 ~), он отключает режим вставки (pastetoggle) и остается в режиме вставки. Команды cmap позволяют командной строке Vim игнорировать escape-последовательности и принимать вставленный текст как есть.

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

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

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

person Chris Page    schedule 13.08.2011
comment
Вы также должны добавить сопоставление для командного режима (при вводе с двоеточием). В противном случае вы потеряете возможность вставить в командную строку: cmap <Esc>[200~ <nop> cmap <Esc>[201~ <nop> - person raimue; 09.09.2011
comment
Теперь это поддерживается iTerm2: iterm2.googlecode.com/svn/trunk/appcasts. /testing_changes.html - person Matt; 14.09.2011
comment
@ChrisPage некоторые дополнения, чтобы ускорить отображение esc и заставить его работать в tmux: github.com/aaronjensen/vimfiles/blob/master/vimrc#L449-483 - person Aaron Jensen; 11.08.2012
comment
@AaronJensen есть ли у вас ссылка на документацию, в которой объясняется, почему это необходимо и как это работает? - person Chris Page; 15.08.2012
comment
@ChrisPage Я не могу найти документы в данный момент, но в основном, если вы сопоставляете что-то с ‹Esc› XXX, когда вы нажимаете ‹Esc›, vim ждет, когда вы нажмете что-то еще (: help 'timeout'). Предлагаемое решение - это то, что я опубликовал, чтобы вместо этого использовать неиспользуемые клавиши F. Это где-то в вики vim, но я не могу его найти: / Кажется, я нашел его в проекте vitality.vim: github.com/sjl/vitality.vim Это легко проверить, просто войдите в визуальный режим и нажмите ESC. он должен МГНОВЕННО вернуться в нормальный режим. Если есть задержка, это может исправить. - person Aaron Jensen; 16.08.2012
comment
Также, поскольку я прокомментировал, я добавил для этого vmap. Спасибо за это, кстати, это здорово. Кроме того, если ваш исходный вопрос касается упаковки tmux, см. Также проект vitality.vim. Документацию см. На странице source rel=dress=tmoreferrer. net / mailarchive / - person Aaron Jensen; 16.08.2012
comment
Этот ответ был упакован в плагин: github.com/ConradIrwin/vim-bracketed-paste - person Denilson Sá Maia; 11.07.2014
comment
Если вы не используете альтернативный экран, вы можете включить его в режиме (просто) вставки, изменив t_SI и t_EI вместо t_ti и t_te (соответственно). - person rampion; 19.06.2015
comment
@AaronJensen: Я пробовал использовать ‹f28› и ‹f29›, но не вижу разницы в поведении. Кажется, все еще возникает задержка, когда я нажимаю ESC в визуальном режиме. (Vim 7.4, патчи 1-898) - person Chris Page; 10.02.2016
comment
@ChrisPage, то у вас либо есть еще одно сопоставление, которое начинается с esc, либо ваш ttimeoutlen слишком велик. Если это только в визуальном режиме, скорее всего, это другое отображение. Попробуйте проверить :vmap <esc>, чтобы увидеть, есть ли у вас что-нибудь на карте - person Aaron Jensen; 11.02.2016
comment
@AaronJensen: Я попробовал это снова и не уверен, что раньше видел задержку. Если я отображаю imap <Esc>l EL, когда я набираю ESC, индикатор -- INSERT -- немедленно исчезает. Кажется, что Vim достаточно умен, чтобы сразу выйти из режима вставки, когда увидит ESC, но если вы затем наберете l, он вернется в режим вставки и вставит EL. Я вижу очевидную задержку, только если я также сопоставляю imap <Esc>lm EM, и в этом случае ввод ESC с последующим l явно ожидает односекундную задержку по умолчанию, прежде чем продолжить. (Но все еще нет задержки между ESC и l.) - person Chris Page; 24.11.2016
comment
Я полагаю, что технически есть задержка, поскольку ввод следующего l интерпретируется как часть последовательности <Esc>l, если вы не ждете задержки перед вводом l, но с практической точки зрения кажется, что пользователи не испытывают задержки при вводе ESC для выхода Режим вставки. - person Chris Page; 24.11.2016

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

"+p

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

person Aaron Jensen    schedule 16.08.2012
comment
"*p или "+p. Регистр * - это первичный выбор X11, а + - буфер обмена. Я не знаю, имеет ли Mac OS X ту же концепцию, что и X11. - person Denilson Sá Maia; 11.07.2014

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

set pastetoggle=<F2>

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

person dancavallaro    schedule 09.04.2011
comment
Я также установил переключатель пасты на ‹F2›, но делаю это, вызывая функцию с помощью F2. Это потому, что в режиме вставки я также хочу, чтобы vim отключил showbreak, чтобы я мог очистить копию из окна редактора. - person anthony; 11.05.2017
comment
Примечание: я также хорошо использую listchars (переключение с помощью списка набора), поэтому, когда я не в режиме вставки, я могу видеть непрерывные пробелы, табуляции и дополнительные пробелы в конце строки. Эти обычно скрытые символы вызывают у меня много серых символов, а списки позволяют мне узнать, что они их. Есть также ряд других скрытых пробелов Юникода, которые vim не показывает. - person anthony; 11.05.2017

В vim

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

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

: set nopaste

person WenbinWu    schedule 07.04.2011
comment
Или :set paste!, чтобы переключить его. - person Denilson Sá Maia; 11.07.2014

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

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

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

person studgeek    schedule 09.04.2016
comment
В Vim-8 это встроено. НО также выполняет вставку-вставку, если вы пытаетесь пройти, находясь в командном режиме. То есть вы больше не можете вставлять команды vim! Что-то, чем я занимаюсь более 30 лет (еще во времена vi и элвиса) - person anthony; 11.05.2017
comment
В Vim 8 он встроен ... из патча 8.0. 0210, но текущая стабильная версия Debian, Stretch, не включает этот патч, а включает только выбранные патчи после 0197. - person Martin Dorey; 26.04.2018