Metni vim'e yapıştırırken otomatik girintiyi kapatma


1186

Vim'i öğrenmek için çaba sarf ediyorum.

Panodan belgeme kod yapıştırdığımda, her yeni satırın başında fazladan boşluk alıyorum:

line
  line
    line

Otomatik girintiyi kapatabileceğinizi biliyorum, ancak çalışamıyorum çünkü çakışan başka ayarlara veya başka bir şeye sahibim (bu .vimrc'mde oldukça açık görünüyor, ancak onları çıkardığımda önemli görünmüyor).

Kodu yapıştırdığımda otomatik kod girmeyi nasıl kapatabilirim, ancak kod yazarken hala vim otomatik girintisi var mı? İşte benim .vimrcdosya:

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

4
FWIW, vim 8.0.210 köşeli parantez için yerel destek ekler, böylece yapıştırılan metnin girintisini önler.
sh1

Yeni dosyalar için vim'in yapıştırma / nopaste ile uğraşmasını önlemek için Entercat > mynewfile.txt tuşuna basıp metninizi yapıştırabilir, tekrar Enter tuşuna ve kaydetmek için Ctr + D tuşlarına basabilirsiniz . Dosya şimdi oluşturulur ve ile düzenleyebilirsiniz . vim mynewfile.txt
ccpizza

Yanıtlar:


2065

Güncelleme: Burada daha iyi cevap: https://stackoverflow.com/a/38258720/62202

Kodu yapıştırdığınızda otomatik bildirimi kapatmak için özel bir "yapıştırma" modu vardır.

tip

:set paste

Sonra kodunuzu yapıştırın. Araç ipucundaki metnin artık söylediğine dikkat edin -- INSERT (paste) --.

Kodunuzu yapıştırdıktan sonra, yapıştırma modunu kapatın, böylece yazarken otomatik girintileme tekrar düzgün çalışır.

:set nopaste

Ancak, her zaman hantal buldum. Bu yüzden metni düzenlerken<F3> yapıştırma ve nopaste modları arasında geçiş yapabileceği şekilde eşleştiriyorum ! Bunu ekliyorum.vimrc

set pastetoggle=<F3>

38
Bunu :set noaitakip etmekten daha kolay değil :set ai. Önerisi :r! catdaha kısadır.
Leopd

68
Bence set pastekesinlikle daha kolay. "Noai" ve "macun" yazarken, dokunma daktiloları kadar yetkin olduğunuzda aynı önemsiz süreyi almak için daha önemli olan noaive hatta daha semantiktir noautoindent.
Victor Zamanian

52
:set noaiGirintiyle ilgili diğer ayarların OP'ye göre nasıl yapılandırıldığına bağlı olarak her zaman çalışmaz. :set pasteaynı anda birçok ayar için bir kısayol gibi görünüyor.
MarkHu

13
Partiye geç, ama set copyindentbunun için sorunsuz bir şekilde ilgilenir.
Matt Ryan

33
:set pasteayrıca, parantez tamamlanması gibi, kodu yapıştırırken de istenmeyen diğer özellikleri de devre dışı bırakır.
Manuel Faux

263

Yapıştırırken istenmeyen efektlerden kaçınmak için ayarlanması gereken bir seçenek vardır:

set paste

set pastetoggle=<F10>Yapıştır ve nopaste arasında kolayca geçiş yapmak için .vimrc dosyasında bulunması yararlı bir komuttur.


13
En sonunda! Yazmaya devam ettim: set paste /: set nopaste, ne kadar aptalca! Teşekkür.
imwilsonxu

4
pratik bir bakış açısından, cevabınız kabul edilen cevaptan daha yararlıdır
Lynob

8
Başka bir seçenek vimrc'nize bir makro eklemektir:nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Chris

Güzel öneri @Chris - girinti sorunları olmadan yapıştırmak için tek tuş dizisi!
RichVel

yapıştırma modunda asla kalmak istemezsem ne olur? kalıcı olarak devre dışı bırakmanın bir yolu var mı?
maxwell

132

Genellikle içeriği kullanıyorum :r! catve sonra yapıştırıyorum ( shift + insert )ve CTRL+D.

Doğrudan kullanımı etkinleştirmeye ve devre dışı bırakmaya gerek yok.


Bu doğrudan kullanım seçeneğini seviyorum. Yine de vim sözdizimini web sayfalarında okumayı öğreniyorum. Adımlarınız ne anlama geliyor? Özellikle, sistem panosunda bir şeyim olduğunu varsayarsak, vim'deki bir belgeye yapıştırmak için neye basarım?
jvriesem

9
Bu cevap, neden ve nasıl :r! catçalıştığı hakkında bilgi için daha yararlı olacaktır .
K Erlandsson

11
@KErlandsson, :rbir dosyanın içeriğini geçerli belgeye ekler. !catdiyor ki, temelde stdin (* nix kabukları) (shift + insert)veya bazı terminaller için açılan kedi çalıştır , sağ fare tıklaması panonun içeriğini terminale yapıştıracaktır CTRL+D, bu yüzden :r !catoturumu kapatır .
Daniel

Bu gerçekten 'doğrudan' mı? pasteSadece bu amaçla yapılmış bir seçenek belirlemekten daha mı? @jvriesem Bu kelimeyi anladığınızı düşündüğüm doğru ise, bu 'doğrudan' bir seçenek değildir.
0xc0de

Daha :r! catsonra CTRL+SHIFT+Vterminali yapıştırmak için de kullanabilirsiniz (o zaman CTRL+D).
Paul Rougieux

86

Yerel olarak çalışıyorsanız, sistem panosundan anahtar dizisiyle yapıştırabilirsiniz:

"+p

Bu uygun bir vim komutudur, bu nedenle bir ekleme moduna girme veya önce otomatik indenti kapatma konusunda endişelenmenize gerek yoktur.

Tabii ki uzaktan çalışıyorsanız (örneğin SSH üzerinden konsol), bu işe yaramaz ve :set noaiekleme moduna geçmeli, konsola yapıştırmalı, insertmode bırakmalı, :set aibaşka bir yerde açıklandığı gibi rota yapmalısınız .


10
Bu cevabı yıllar önce yazıyorum. Bugünlerde kullanıyorum :set pasteve :set nopastebunun yerine daha uzun olmasına rağmen hatırlanması daha kolay ve her seferinde aramam gerekmiyor!
thomasrutter

6
Bazı gömülü sistemlerde (esas olarak meşgul kutusuna dayalı olarak) :set pasteuygulanmaz, :set noaibunun yerine kullanılmalıdır.
jcarballo

Kopyalanacak büyük bir metniniz olduğunda, bunun yerine + kaydını kullanmak daha hızlı değil mi?
pedromanoel

1
@pedromanoel, yalnızca yerel olarak çalışırken çalışır. Örneğin yerel olarak bir şey kopyaladıysanız ve SSH oturumunuzdaki vim'e yapıştırmak istiyorsanız, SSH üzerinden vim'e erişmeye çalışmaz.
thomasrutter

1
@homasrutter ama ben bunu <leader>pçok kullanışlı!
Dane

51

Yapıştırma modunu paste/nopaste/pastetogglemükemmel şekilde ayarlamakla birlikte , yapıştırmadan önce yapıştırma modunu manuel olarak etkinleştirmeniz ve yapıştırmadan sonra yapıştırma modunu devre dışı bırakmanız gerekir. Aşağıda olduğum tembel kişi olarak, aşağıda bulduğum en iyi çözüm, yapıştırdığınızda yapıştırma modunu otomatik olarak değiştiriyor.

Yapıştırdığınızda Vim'in yapıştırma modunu otomatik olarak ayarlamak / ayarlamak için terminalin köşeli yapıştırma modunu kullanan küçük bir püf noktası. Aşağıdakileri .vimrc'nize koyun:

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

Artık yapıştırma modunu açıkça açmadan / kapatmadan yapıştırabilirsiniz - sizin için otomatik olarak ele alınır.

Kaynak: Coderwall

Not: Bu çözüm WSL'de (Linux için Windows 10 Alt Sistemi) çalışmaz. Herhangi birinin WSL için bir çözümü varsa, lütfen bu yanıtı güncelleyin veya yorumlara ekleyin.

Tmux tmux kullanılıyorsa, bildirimlerin iki kez kaçması gerekir. Bunun kodu da Coderwall'da


Bu çok parlak. Yine de bir şey ... Her macunla her macunun başında "0" (sıfır) karakter elde ederim. Bunun için bir ipucu var mı?
Julius Š.

Ayrıca tmux kullanıyorsanız çift ​​kaçış yapmanız gerektiğini unutmayın . Bunun kodu cevapta Coderwall bağlantısında
Daithí

1
Hatta daha tembelseniz ve yukarıdaki kodu .vimrc'nize kopyalarsanız, XTermPasteBegin () işlevinin girintisine dikkat edin.
k1133

Bunun nasıl çalıştığını merak ettim ve bu yüzden Yapıştır Basamaklama'yı araştırdım ve ve değişkenlerinin macun basamaklama ve devre dışı bırakmayı etkinleştirdiğini açıklayan gitlab.com/gnachman/iterm2/-/wikis/Paste-Bracketing buldum . Yapıştırma basamaklama açık olduğunda, yapıştırılan metnin önüne ve arkasından gelir . t_SIt_EIesc[200~esc[201~
PatS

37

Mac kullanıcıları aşağıdakilerle doğrudan çalışma alanından okuyarak otomatik biçimlendirmeyi önleyebilir:

:r !pbpaste

3
Bu harika bir yanıt. Ancak bunu yaptığımda, belgeyi gizler (komut satırına geri döndüğüm anlaşılıyor), ancak metni panomda var. Enter tuşuna basmamı istiyor, bu yüzden yapıyorum ve herhangi bir değişiklik yapmadan belgeme geri döndürüyor. Ne oldu ve söylediklerini nasıl yaparım?
jvriesem

Sadece yazarsanız :.!pbpaste, bu işlem geçerli satırı macun arabellekinin çıktısı ile değiştirerek çalışmalıdır. Genel olarak vim, geçerli dosyanızdaki verileri başka bir programa aktarmanıza ve metni komutun çıktısıyla değiştirmenize olanak tanır. Böylece :1,3!pbpastedosyanızın ilk üç satırını yapıştır arabelleği ile değiştirir. Kullandığım :.!ppjsonçok uzun (biçimlendirilmemiş JSON dizesi) alıp biçimlendirmek ve biçimlendirilmiş eşdeğer uzun dize yerine. ppjson sadece çalışan bir bash betiğidir python -m json.tool.
PatS

19

Burada, yapıştırma modunu otomatik olarak açmak ve sonra tekrar kapatmak için yapıştırma olayını nasıl yeniden eşleyeceğini anlayan birinin gönderisi . MacOSX üzerinde tmux / iTerm'de çalışıyor.


1
Bahşiş için teşekkürler. Ayrıca, kişinin benzer işlevleri paketlediği bir eklentiyi izledim - stackoverflow.com/a/36512548/255961 .
studgeek

Panodan bir metin parçası eklediğimde bu bir 'eeeeeee' dizesine neden oluyor gibi görünüyor.
John Jiang

16

Bunu kendinize ekleyin ~/.vimrcve yapıştırmadan önce ve sonra F2 tuşuna basmanız yeterlidir:

set pastetoggle=<F2>

12

Sadece set clipboard=unnamed.vimrc'mi koydum . Bu, X'in panosuna varsayılan yapıştırma arabellek haritasını yapar.

Yani, bir terminalde biraz metin işaretlersem p, vim'e yapıştırmak için basabilirim . Benzer şekilde, vim'deki şeyleri (örneğin YY, geçerli satırı arabelleğe çekmek için) ve yapıştırmak için herhangi bir pencerede orta tıklatabilirim.

Dunno. Süper uygun buluyorum.


IMHO, bu en iyi cevaptır, F11 ile değiştirmeye gerek yoktur (vim'de varsayılan olarak önceden yapılandırılmıştır). Bu Mac OSX sisteminde çalışır, diğerleri hakkında bilmiyorum.
LightMan

9

Bir terminalin içinde çalışırken, vim-basamalı macun vim eklentisi, macundan önce veya sonra herhangi bir tuş vuruşuna gerek kalmadan macunları otomatik olarak işleyecektir.

İTerm2, gnome terminali ve libvte kullanan diğer terminaller gibi "modern" x-term uyumlu terminaller tarafından gönderilen bir kaçış dizisi olan köşeli macun modunu tespit ederek çalışır . Ek bir bonus olarak tmux oturumları için de çalışır. Linux sunucusuna bağlanan ve tmux kullanan bir Mac'te iTerm2 ile başarılı bir şekilde kullanıyorum.


Ayrıca nelere dikkat ettiğine dikkat edin: Ne yazık ki, bu, terminale yapıştırdığınız herhangi bir şeyde yeni bir satır varsa, giriş arabelleğinin içeriğini de çalıştıracağı anlamına gelir.
0xc0de

1
@ 0xc0de, bu alıntı burada alakalı değil. Bu bir şey bahsediyor kabuk bunu ne zaman yapacak değil parantez macun modunu destekler. Bu, parantezli yapıştırma modunda nokta - bunun olmasını engellemek için.
sh1

Bu benim için diğer çözümlerden çok daha iyi çalıştı. Teşekkürler.
jjj

8

Bunu ~ / .vimrc'nize yapıştırın ve mutlu olun:

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

Düzenleme: yansıma üzerinde, :r !catkısa, anlamsal ve hiçbir özel vimrc gerektirdiğinden çok daha iyi bir yaklaşımdır. Bunu kullanın!


5

Her ne kadar :pastetoggleya :pasteve :nopasteiyi çalışıyor olmalıdır (eğer uygulanırsa - tartışmaya gördüğünüz gibi her zaman değil) ben çok salık yapıştırarak doğrudan yaklaşım kullanarak "+pveya "*pve okuma "+rveya "*r:

Vim kayıtları on türlerine rol vardır ( :help registers) ve sorgulayıcı ilgilenen edilir quotestarve quoteplusbölümünden

  1. Seçme ve damla kayıtlarını "*, "+ve "~

GUI için seçilen metni saklamak ve almak için bu kayıtları kullanın. Bkz quotestarve quoteplus. Pano kullanılamıyorsa veya çalışmıyorsa, bunun yerine adsız kayıt kullanılır. Unix sistemleri için pano yalnızca + xterm_clipboard özelliği mevcut olduğunda kullanılabilir. {Vi'da değil}

X11 sistemleri için yalnızca "* ve" + arasında bir ayrım olduğunu unutmayın.

:help x11-selectionDaha fazla açıklık getirmektedir farkı *ve +:

                                                  quoteplus quote+

Dokümante edilmiş üç X seçimi vardır: PRIMARY (mevcut görsel seçimi temsil etmesi bekleniyor - Vim'in Görsel modunda olduğu gibi), SECONDARY (kötü tanımlanmış) ve CLIPBOARD (kesme, kopyalama ve yapıştırma işlemleri için kullanılması bekleniyor) ).

Bu üçünden Vim, "* kaydını okurken ve yazarken PRIMARY (bu nedenle X11 seçimleri kullanılabilir olduğunda, Vim" autoselect "in" clipboard "için varsayılan bir değer ayarlar) ve" + register'ı okurken ve yazarken CLIPBOARD kullanır. Vim, SECONDARY seçimine erişmiyor.

Örnekler: (varsayılan seçenek değerlerini varsayarak)

  • Vim'de Görsel modda bir URL seçin. Tarayıcınıza gidin ve URL metin alanındaki orta fare düğmesini tıklayın. Seçilen metin eklenecektir (umarım!). Not: Firefox'ta middlemouse.contentLoadURL tercihini about: config içinde true olarak ayarlayabilirsiniz, ardından pencerenin çoğu yerinde orta fare düğmesine basıldığında seçilen URL kullanılır.

  • Fare ile sürükleyerek tarayıcınızda bir metin seçin. Vim'e gidin ve orta fare düğmesine basın: Seçilen metin eklenir.

  • Vim'de bir metin seçin ve "+ y." Tarayıcınıza gidin, fare ile sürükleyerek bir metin alanında bir metin seçin. Şimdi sağ fare düğmesini kullanın ve açılan menüden "Yapıştır" ı seçin. Seçilen metnin üzerine yazılır "+ register'daki metnin Görsel seçim yapılırken kullanılabilir kaldığına dikkat edin, bu da" * register'da diğer metni kullanılabilir hale getirir. Bu, seçilen metnin üzerine yazılmasına izin verir.

vim orta tıklama kullanarak fark ettim bu yüzden bir fikir olabilir girinti kadar karışıklık görünmüyor
Fuseteam

4

Bu benim için çalışıyor (+ kayıt için durum, ben aps arasında exchange buffer gibi kullandığım):

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

2

Mac kullanıyorsanız macvim, macunu değiştirmek zorunda kalmadan iyi idare ediyor gibi görünüyor.

demlemek yüklemek macvim - override-system-vim


OP yönergelerini .vimrcdosyanıza eklerseniz durum böyle mi ?
Drew Noakes

2

Doğal macun / köşeli macun, vim 8(2016'da piyasaya sürüldü) o zamandan beri en iyi ve en basit yoldur . Hatta ssh üzerinde çalışıyor! (Köşeli ayraçlama macunu Linux ve Mac'te çalışır, ancak Windows Git Bash'de çalışmaz)

  1. Vim 8+ sürümünüz olduğundan emin olun ( +clipboardveya +xterm_clipboardseçeneklerine ihtiyacınız yoktur ).

    vim --version | head -1

  2. Normal Modda OS yerel yapıştırma komutunu (örn. ctrl+shift+VVeya cmd+V) kullanmanız yeterlidir . iEkle Modu için basmayın .


Ölçek

  1. Bunun çıktısını (sekme girintili 2 satır) sistem panosuna kopyalayın ( ctrl+shift+Cveya cmd+C):

    echo -e '\ta\n\tb'

  2. Autoindent ile temiz bir vim 8+ başlatın:

    vim -u NONE --noplugin -c 'set autoindent'

  3. Normal modda sistem panosundan ( ctrl+shift+Vveya cmd+V) yapıştırın . iEkle Modu için basmayın . aVe btek bir sekme girinti ile uyumlu olmalıdır. Bunu, uzak bir makineye ssh yaparken bile yapabilirsiniz (uzak makinenin vim 8+'ye ihtiyacı olacaktır).

  4. Şimdi ikinci satırı ilave sekme ile otomatik olarak girecek olan eski yolu deneyin: iEkle Modu için basın . Sonra ctrl+shift+Vveya ile yapıştırın cmd+V. aVe bşimdi yanlış hizalanmış.


Vim 8'i Yükleme


1
en iyi ve en basit yol! Ayrıca, Google, Featured snippet'sekme içerik yok sekme yapıştır' aramam için önerdi , belki de, 'tab' anahtar kelimesini kullandım, çünkü sadece bu cevapta :)
David


1

Hemen bir kerelik bir yapıştırma için modu-insert yapıştırmak için gitmek farkındayım hızlı yolu tpope en olduğu zarar görmemiş , hangi özellikleri yove yOmuhtemelen anımsatıcılar “açık” için. Sadece vimdoc'unda şöyle belgeleniyorlar:

Yalnız yerleştirmenin tipik kullanım durumu çok israf olduğundan, 'yapıştırma' için bir geçiş sağlanmamıştır: İki kez geçiş yaparsınız, ancak yalnızca bir kez yapıştırırsınız (YOPO). Bunun yerine, önceden ayarlanmış 'yapıştır' ile o veya O'yu çağırmak için yo veya yO tuşuna basın. Ekleme modundan çıkıldığında otomatik olarak 'nopaste' ayarlanır.


1

Yapıştırmanın başka bir yolu da <CR>(ve genel sicil) kaydın içeriğini bırakmak ve bırakmaktır. Bakınız: :h i_ctrl-rve h i_CTRL-R_CTRL-O.

Vim yardım belgelerinden:
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}

İçeriği otomatik girintisiz olarak vim'e yapıştırmak <CR><CO>*için çoğu unix sisteminde kullanın .

Not: Bu yalnızca vim ile derlenmişse çalışır clipboard.



1

Şimdiye kadar görmediğim başka bir cevap:

:se paste noai

0

Ne yazık ki iTerm2 3.0.15 ile çalışmak için belirtilen vim eklentisi buldum (adil olmak için bu eski sürümlerde kırdı bilmiyorum) - ama bunun yerine bu kesmek bulundu.

Yapıştır ve iTerm2 vim tuşlarını kullanarak command-p'yi eşleştirin. Açıkçası bu sadece iTerm2 için çalışıyor.

Nasıl çalışır. Ben de ihtiyacınız olacak kaçış moduna girmek için "jk" kullanın:

: inoremap jk

.vimrc.

Sonra sadece P yapıştırma moduna girmek için çağırır, "+ p panodan yapıştırmak için ve sonra P yapıştırma modunu devre dışı bırakmak için. Hth.

resim açıklamasını buraya girin


1
Bekle, ne, bunun için 'jk' mi kullanıyorsun?
0xc0de

Oh evet, bundan bahsetmeyi unutmuştum. .Vimrc dosyanıza ": inoremap jk <esc>" eklemeniz yeterlidir. Gelince neden ben JK kullanın Apple sormak ve onlar taşımak ve fiziksel kaçış tuşu kurtulmak ihtiyacı hissetti neden. 8 (
Neil McGill

BTW biraz eğitim gerektiriyor ama bir süre sonra jk daha hızlı hissediyor ve sanırım şimdi kaçışta tercih ediyorum ... Yine de iTerm2'nin <ESC> 'i burada da kabul edip etmediğini bilmek ilginç olurdu.
Neil McGill

Apple'a gitmenin yolu!
0xc0de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.