Поставяне на код в прозореца на терминала във 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... set pastetoggle=‹F4› - person wom; 09.07.2014

АКТУАЛИЗАЦИЯ: Vim 8 включва естествена поддръжка за режим на поставяне в скоби. Той е активиран по подразбиране. Вижте xterm-bracketed-paste помощната тема на Vim. Потребителите вече не трябва да правят нищо, за да конфигурират 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). Когато получи екраниращата последователност, указваща началото на поставяне (ESC [ 200 ~), той активира режима на поставяне (задаване на поставяне) и превключва на режим на вмъкване, ако е необходимо ("i"). Когато получи съответстващия маркер за край на поставяне (ESC [ 201 ~), той деактивира режима на поставяне (pastetoggle) и остава в режим на вмъкване. Командите cmap организират командния ред на Vim да игнорира екраниращите последователности и да приема поставения текст такъв, какъвто е.

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

В терминал това работи с всички различни команди за поставяне, както и с плъзгане и пускане.

† Терминалът има основен екран и "алтернативен" екран. Всеки екран има собствено съдържание и състояние. Текстът в алтернативния екран не се превърта нагоре в журнала за превъртане назад. Обикновено се използва от програми, които поемат контрола върху целия екран и поради това се наричат ​​програми за "цял екран". Това включва например vim, emacs, less и top.

person Chris Page    schedule 13.08.2011
comment
Трябва също така да добавите съпоставяне за команден режим (въвеждате on с двоеточие). В противен случай губите възможността да поставите в командния ред: 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 wiki, но не мога да го намеря :/ Вярвам, че го намерих в проекта vitality.vim: github.com/sjl/vitality.vim Лесно е да се тества, просто отидете във визуален режим и натиснете ESC. трябва МОМЕНТАЛНО да се върне към нормален режим. Ако има забавяне, това може да го поправи. - person Aaron Jensen; 16.08.2012
comment
Освен това, тъй като коментирах, добавих vmap за това. Благодаря за това между другото, страхотно е. Освен това, ако първоначалният ви въпрос е по отношение на tmux опаковката, вижте и проекта vitality.vim. За документация вижте: sourceforge. 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
Също така зададох превключване на pastetoggle на ‹F2›, но го правя, като накарам F2 да извика функция. Това е така, защото когато съм в режим на поставяне, искам също vim да деактивира showbreak, за да мога да почистя копието от прозореца на редактора. - person anthony; 11.05.2017
comment
Забележка: Също така използвам добре listchars (превключвам с помощта на set list), така че когато не съм в режим на поставяне, мога да виждам интервали без прекъсване, раздели и допълнителни интервали в края на реда. Тези обикновено скрити символи ми причиняват много greif, а 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 плъгинът vim автоматично ще обработва поставяния без нужда от натискане на клавиши преди или след поставянето.

Това работи в терминал, iTerm2 и всички „модерни“ x-term съвместими терминали, които поддържат режим на поставяне в скоби. Като допълнителен бонус работи и за tmux сесии. Използвам го успешно с iTerm2 на Mac, свързващ се към Linux сървър и използвайки tmux.

Приставката е основно пакетирана версия на функционалността, която @Chris Page изброи в своя отговор.

person studgeek    schedule 09.04.2016
comment
Vim-8 го има вграден. НО също така прави вмъкване-поставяне, ако опитате да преминете, докато сте в команден режим. Това означава, че вече не можете да поставяте vim команди! Нещо, което правя повече от 30 години (от времето на „vi“ и „elvis“) - person anthony; 11.05.2017
comment
Vim 8 го има вграден... от Кръпка 8.0. 0210, но текущата стабилна версия на Debian, Stretch, не включва тази корекция, включва само избрани корекции след 0197. - person Martin Dorey; 26.04.2018