it-swarm-eu.dev

Vypnutí automatického odsazení při vkládání textu do vim

Snažím se naučit Vima.

Když vložím kód do schránky ze schránky, na začátku každého nového řádku dostanu další mezery:

line
  line
    line

Vím, že můžete vypnout automatické odsazení, ale nemůžu se dostat do práce, protože mám nějaké jiné nastavení v rozporu nebo něco (které vypadají docela zřejmé v mém .vimrc, ale nezdá se, že záleží, když jsem si je). 

Jak mohu vypnout automatické odsazování, když vkládám kód, ale když píšu kód, stále mám automatické odsazení? Zde je můj soubor .vimrc:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  
1021
Rimian

Aktualizovat: Lepší odpověď zde: https://stackoverflow.com/a/38258720/62202

Chcete-li automatické vkládání vypnout při vkládání kódu, je k dispozici speciální režim „vložit“.

Typ 

:set paste

Poté vložte kód. Všimněte si, že text v popisku nyní říká -- INSERT (paste) --.

Po vložení kódu vypněte režim vkládání, takže automatické odsazení při zadávání textu bude opět fungovat správně.

:set nopaste

Vždy jsem však zjistil, že je to těžkopádné. Proto mapuji <F3> tak, že může přepínat mezi režimy vkládání a nopaste při úpravách textu! Přidám to do .vimrc

set pastetoggle=<F3>
1811
P Shved

Chcete-li se vyhnout nežádoucím efektům při vkládání, existuje možnost, kterou je třeba nastavit:

set paste

Užitečný příkaz mít ve vašem .vimrc je set pastetoggle=<F10> nebo nějaké jiné tlačítko, abyste snadno přepínali mezi vkládáním a nopaste.

251
Jacob R

Obvykle používám :r! cat a pak vložte ( shift + insert ) obsah a CTRL+D.

Není třeba povolit a zakázat přímé použití.

123
thegeek

Pokud pracujete lokálně, můžete ze systémové schránky vložit klíčovou sekvenci:

"+p

Jedná se o správný příkaz vim, takže se nemusíte starat o to, abyste vstoupili do režimu vkládání nebo se vypnuli jako první.

Samozřejmě, pokud pracujete vzdáleně (například konzole přes SSH), pak to nebude fungovat a měli byste jít do režimu :set noai, vložit režim, vložit do konzoly, ponechat insertmode, :set ai trasu, jak je popsáno jinde.

82
thomasrutter

Uživatelé systému Mac se mohou vyhnout automatickému formátování čtením přímo z kartonu pomocí:

:r !pbpaste
37
maniacalrobot

Při nastavení režimu vkládání s paste/nopaste/pastetoggle je naprosto v pořádku, musíte ještě před vložením a zakázáním režimu vkládání po vložení ručně aktivovat režim vkládání. Být líný člověk, který jsem, níže je nejlepší řešení, které jsem našel tak daleko, který automaticky přepne režim vkládání, když vložíte.

Zde je malý trik, který používá terminálový režim bracketed past na Automaticky nastaví/zruší režim Vim vložení při vkládání. Vložte následující Do svého .vimrc:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Nyní můžete vkládat bez explicitního zapnutí/vypnutí režimu vkládání - je to Zpracované automaticky.

Zdroj: Coderwall

Poznámka: Toto řešení nefunguje ve WSL (Windows 10 Subsystem pro Linux). Pokud má někdo řešení pro WSL, aktualizujte tuto odpověď nebo ji přidejte do komentářů.

Tmux Pokud používáte tmux, pak je třeba deklarace zdvojnásobit. Kód je také v Coderwall

27
thdoan

Tady je post někdo, kdo přišel na to, jak přemapovat událost vložit automaticky zapnout režim vkládání a pak zpět. Pracuje pro mě v tmux/iTerm na MacOSXu.

19
Von

Přidejte to do souboru ~/.vimrc a budete muset stisknout F2 před a po vložení:

set pastetoggle=<F2>
12
anh_ng8

Při práci v terminálu bude plugin vim-bracketed-paste vim automaticky zpracovávat pasty bez nutnosti stisknutí kláves před nebo po vložení.

Funguje tak, že detekuje bracketed režim pasty který je úniková posloupnost poslaná "moderními" terminály kompatibilními s x-termem, jako jsou iTerm2, terminál gnome a další terminály používající libvte. Jako bonus navíc funguje i pro tmux relace. Používám ji úspěšně s iTerm2 na Mac připojení k linuxovému serveru a pomocí tmux.

9
studgeek

Vložil jsem set clipboard=unnamed do mého .vimrc. Díky tomu je výchozí mapa vyrovnávací paměti vložena do schránky X.

Pokud tedy v terminálu označím trochu textu, můžu jednoduše stisknout p a vložit jej do vim. Stejně tak můžu věci vim (např. YY vypouštět, aby se do vyrovnávací paměti vložil aktuální řádek) a prostředním kliknutím v libovolném okně jej vložte.

Nevím. Považuji to za super pohodlné.

9
Soren

Držte to ve vašem ~/.vimrc a buďte šťastní:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

Edit: on reflexe, :r !cat je mnohem lepší přístup, protože je krátký, sémantický a nevyžaduje žádný vlastní vimrc. Použijte to místo toho!

7
Dergachev

Ačkoliv :pastetoggle nebo :paste a :nopaste by měly být v pořádku (pokud jsou implementovány - nejsou vždy tak, jak je patrné z diskuse) Velmi doporučuji vkládání pomocí přímého přístupu "+p nebo "*p a čtení s "+r nebo "*r:

Vim má přístup k deseti typům registrů (:help registers) a tazatel se zajímá o quotestar a quoteplus z sekce

  1. Výběr a zrušení registrů "*, "+ a "~

Tyto registry slouží k ukládání a načítání vybraného textu pro GUI. Viz quotestar a quoteplus. Není-li schránka dostupná nebo není funkční , Použije se místo ní nepojmenovaný registr. Pro systémy Unix je schránka K dispozici pouze v případě, že je k dispozici funkce + xterm_clipboard. {ne ve Vi} 

Všimněte si, že existuje pouze rozdíl mezi systémy "* a" + pro systémy X11.

:help x11-selection dále objasňuje rozdíl * a +:

                                                  quoteplus quote+

Existují tři zdokumentované X výběry: PRIMÁRNÍ (což se očekává, že Představuje aktuální vizuální výběr - jako v vizuálním módu Vim), SEKUNDÁRNÍ (Což je špatně definované) a CLIPBOARD (což se očekává pro operace řezání, kopírování a vkládání).

Z těchto tří Vim používá PRIMARY při čtení a zápisu "* registru (Tedy když jsou k dispozici volby X11, Vim nastaví výchozí hodnotu pro 'Schránku'" autoselect ") a CLIPBOARD při čtení a zápisu registru „+ . Vim nemá přístup k SECONDARY výběru.

Příklady: (za předpokladu výchozích hodnot možností)

  • Vyberte adresu URL v režimu Vizuální v aplikaci Vim. Přejděte do prohlížeče a klikněte na prostřední tlačítko V textovém poli URL. Vybraný text bude vložen (.____.) (Doufejme!). Poznámka: Ve Firefoxu můžete nastavit preferenci Middlemouse.contentLoadURL na hodnotu true v souboru: config, poté zvolená adresa Bude použita při stisknutí prostředního tlačítka myši na většině míst v okně.

  • Vyberte nějaký text v prohlížeči přetažením myší. Přejděte na Vim a Stiskněte prostřední tlačítko myši: Vybraný text se vloží.

  • Vyberte nějaký text ve formátu Vim a do "+ y. Přejděte do prohlížeče, vyberte text v textovém poli Přetažením myší. Nyní použijte pravé tlačítko myši a Vyberte" Vložit "z Vybraný text je přepsán textem z Vimu. Všimněte si, že text v "+ registru zůstane k dispozici při volbě Visual , což činí další text, který je k dispozici v "* registru. To umožňuje přepsání vybraného textu.
3
codingdave

To funguje pro mě (případ pro + registr, co používám jako výměnný buffer mezi aps):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
3

Pokud jste na mac, macvim to zvládne dobře, aniž by museli přepínat pastu.

brew install macvim --override-system-vim

2
Marcus Ericsson

Nejrychlejším způsobem, jak jsem si vědom, že rychle přejdu do režimu vkládání vložek pro jednorázovou pastu, je tpope's unimpaired , které funkce yo a yO, pravděpodobně mnemonika pro „otevřete “. Jsou dokumentovány pouze v jeho vimdocu, jako:

Přepínač nebyl zadán pro „pastu“, protože typický případ použití obalu Samotného vložení je tak nehospodárný: přepínáte dvakrát, ale Vložíte pouze jednou (YOPO). Namísto toho stiskněte yo nebo yO pro vyvolání o nebo O s 'Pastou' již nastavenou. Opuštění režimu vkládání automaticky nastaví hodnotu „nopaste“.

1
Micah Elliott

Přečtěte si tento článek: Přepnout automatické odsazení pro vložení kódu

Někteří lidé mají rádi vizuální zpětnou vazbu zobrazenou ve stavovém řádku následující alternativou pro vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
1
d.danailov

Z vim: ]p

Z vnějšku: "*]p nebo "+]p

0
Bruno

Další způsob vložení je přes <CR> a upuštění obsahu registru (zde globální registr). Viz: :h i_ctrl-r a h i_CTRL-R_CTRL-O

Z dokumentace nápovědy vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Takže vložit obsah do vimu bez automatického odsazení použijte <CR><CO>* ve většině unixových systémů. 

Poznámka: Toto funguje pouze v případě, že je vim zkompilován s clipboard.

0
TheChetan

Bohužel jsem zjistil, vim plugin zmínil, že nebude pracovat s iTerm2 3.0.15 (abych byl spravedlivý nevím, jestli se to rozpadlo na starších verzích) - ale našel jsem to hack místo.

Mapujte příkaz-p, abyste provedli vložení a pomocí kláves klíče iTerm2. To samozřejmě funguje pouze pro iTerm2.

Jak to funguje. Používám "jk" pro vstup do režimu úniku, takže budete také potřebovat:

: inoremap jk 

ve vašem .vimrc.

Pak to prostě vyvolá P pro vstup do režimu vkládání, "+ p pro vložení ze schránky a pak P pro vypnutí režimu vkládání. Hth.

 enter image description here

0
Neil McGill

Další odpověď, kterou jsem dosud neviděl:

:se paste noai
0
sjas