Çıkmış metin Vim komut satırına nasıl yapıştırılır


Yanıtlar:


1157

Evet. Vur Ctrl- Rsonra ". Aldığınız şeyde değişmez kontrol karakterleriniz varsa Ctrl- R, Ctrl- O, kullanın ".

İşte yazmaçlarla neler yapabileceğinizin bir açıklaması. Kayıtlarla yapabileceğiniz şey olağanüstüdür ve bunları nasıl kullanacağınızı öğrendikten sonra onlarsız yaşayamazsınız.

Kayıtlar temelde dizeler için saklama yerleridir. Vim'in farklı şekillerde çalışan birçok kaydı vardır:

  • 0(yank kaydı: ynormal modda kullandığınızda, bir kayıt belirtmeden, yanık metin oraya ve ayrıca varsayılan kayda gider),
  • 1to 9(silme kayıtlarını değiştirmek, cveya gibi komutları kullandığınızda dsilinen şey kayıt 1'e gider, kayıt 1'de bulunanlar kayıt 2'ye gider vb. ),
  • "(varsayılan kayıt, adsız kayıt olarak da bilinir. Burası - , "buraya gelir ),CtrlR"
  • aiçin zkendi kullanımınız için (büyük harfle Aiçin Ziçin ilgili sicillere sona eklendiğini).
  • _( /dev/null(Unix) veya NUL(Windows) gibi davranır , ona yazabilirsiniz ancak atılır ve okuduğunuzda her zaman boştur),
  • - (küçük silme kaydı),
  • /(Birlikte metin baktığınızda arama desen kayıt, güncellenmiş /, ?, *veya #örneğin; ayrıca dinamik arama desenini değiştirmek için yazabildiğinizi),
  • :(son VimL yazılan komutu Qveya yoluyla :salt okunur olarak saklar ),
  • +ve *(sistem panosu kayıtları, panoya ayarlamak ve pano içeriğini onlardan okumak için onlara yazabilirsiniz)

Tüm :help registersreferans için bakınız .

İstediğiniz zaman :registerstüm kayıtların içeriklerini görüntülemek için kullanabilirsiniz . Bu komut için benzer kelimeler ve kestirme vardır :display, :regve :di.

Ekle veya Komut satırı modunda, Ctrl- Rartı bir kayıt adı, bu kaydın içeriğini ekler. Bunları tam anlamıyla eklemek istiyorsanız (otomatik girintileme yok 0x08, geri döndürme gibi kontrol karakterlerinin dönüştürülmesi yok vb.), Ctrl- R, Ctrl- O, kayıt adını kullanabilirsiniz. Daha :help i_CTRL-Rfazla referans için aşağıdaki paragraflara bakın .

Ancak aşağıdakileri de yapabilirsiniz (ve muhtemelen kayıtlar için birçok kullanımı unuttum).

  • Normal modda düğmesine basın ":p. Vim'de kullandığınız son komut arabelleğinize yapıştırılır.
    Ayrıştıralım: "Bir sonraki aşama, silme veya yapıştırma işlemi sırasında hangi kaydın kullanılacağını seçmenizi sağlayan Normal mod komutudur. Böylece ":kolon kaydını seçer (son komutu saklar). O pzaman zaten bildiğiniz bir komuttur, kaydın içeriğini yapıştırır.

    bakınız :help ",:help quote_:

  • Sen (örneğin sizin için bir VIML dosyasını düzenlerken .vimrc) ve şu anda ardışık birkaç satır yürütmek istiyoruz: yj:@"Enter.
    Buraya,yj geçerli ve sonraki satırı (bunun nedeni j'nin yeni bir hareket olması, ancak bu cevabın kapsamı dışında olması) varsayılan kayıt defterine (adsız kayıt olarak da bilinir) çeker. Ardından :@Ex komutu, bağımsız değişken olarak verilen kayıt defterinde depolanan Ex komutlarını çalar "ve adsız yazmacıya nasıl başvurduğunuzdır. Ayrıca ilgili bu cevabın üst kısmına bakınız.

    Karıştırma "Burada kullanılanı (bir kayıt adıdır) ", bir Normal mod komutu olan önceki örnekteki ile .

    bakınız :help :@ve:help quote_quote

  • Son arama desenini Ekle modunda dosyanıza veya komut satırına Ctrl-R ,/ .

    bakınız :help quote_/,help i_CTRL-R

    Doğal sonucu: Arama deseni tutun ama bir alternatif ekleyin: / Ctrl- R, / \|alternative.

  • Görsel modda bir satırın ortasında iki kelime seçtiniz, onları çektiniz y, isimsiz kayıttalar. Şimdi bu iki kelime ile, sadece nerede altına yeni bir satır açmak istiyoruz: :pu. Bu kestirme yol :put ". :putKomut, birçok Ex komutları gibi sadece linewise çalışır.

    bakınız :help :put

    Sen de yapabilirdin: :call setreg('"', @", 'V')o zaman p. setregFonksiyon ikinci argüman içeriğinin ile başlatır (ve adı ile değişkenler olarak kayıtlarını kullanabilirsiniz, adı (dize olarak) ilk argüman olarak verilir hangi kaydını ayarlar VIML içinde kayıt adıdır) ve üçüncü argümanda belirtilen moda çevirir,@xxV satırbaşı için, karaktersel için hiçbir şey ve bloklu ^Viçin değişmez .

    bakınız :help setreg(). Ters fonksiyonlar getreg()ve şeklindedir getregtype().

  • qa... ile bir makro kaydettiyseniz q, :echo @asize ne yazdığınızı söyler ve @amakroyu tekrar oynatır (muhtemelen bunu tekrarlayan görevleri önlemek için çok yararlı olduğunu biliyordunuz)

    bakınız :help q,help @

    Önceki örnekten sonuç: 8goPanoda varsa @+pano içeriğini makro olarak oynatır ve böylece dosyanızın 8. baytına gider. Aslında bu hemen hemen her kayıtta işe yarayacaktır. Son eklenen dizeniz ddEkle modundaysa @.( .kayıtta son eklenen dizeyi içerdiği için) bir satır silinir. O kayıtları belirtiyor beri (Vim belgeleri, bu konuda yanlış #, %, :ve .sadece birlikte çalışacaktır p, P, :putveCtrl - R).

    bakınız :help @

    Karıştırmayın :@(bir kayıttan Vim komutlarını çalan komut) ve@ (bir kayıt normal mod komutlarını çalan Normal mod komutu).

    Dikkate değer istisna @:. Komut yazmacı ilk iki noktayı içermez ve son satır başını da içermez. Ancak Normal modda, @:kayıt işlemini Ex komutu olarak yorumlayarak Normal modda oynatmaya çalışmadığından beklediğiniz şeyi yapar. Son komut olup olmadığını Yani :e, kayıt içeren eancak@: dosyası dosyayı yeniden yükler, kelimenin sonuna gitmez.

    bakınız :help @:

  • Eğer çalıştırmadan önce normal modda ne yaptığını olacaktır göster: @='dd' Enter. En kısa zamanda vurmak olarak =anahtar, Vim ifade değerlendirme geçer: Bir ifade ve hit girerken Enter, Vim bunu hesaplar ve sonuç bir kayıt içeriğine gibi davranır. Tabii ki kayıt= salt okunur ve tek seferliktir. Her kullanmaya başladığınızda, yeni bir ifade girmeniz gerekir.

    bakınız :help quote_=

    Sonuç: Bir komutu düzenliyorsanız ve komut satırınıza geçerli arabelleğinizden bir satır eklemeniz gerektiğini fark ediyorsanız: tuşuna basmayın Esc! Kullanımı Ctrl- R =getline(58) Enter. Bundan sonra komut satırı düzenlemesine geri döneceksiniz, ancak 58. satırın içeriğini ekledi.

  • Manuel olarak bir arama deseni tanımlayın: :let @/ = 'foo'

    bakınız :help :let

    Bunu yaptığınızda /, desende kaçmanız gerekmediğini unutmayın . Ancak elbette tüm tek tırnakları iki katına çıkarmanız gerekir.

  • Bütün ile başlayan satırları kopyalayıp foosonradan ve içeren tüm satırları barpanoya, zincir için bu komutları: qaq(sıfırlama bir içindeki boş makro depolamak kayıt), :g/^foo/y A, :g/bar/y A, :let @+ = @a.

    Büyük harf adı kullanmak, kaydın ekleme modunda çalışmasını sağlar

    Daha iyi bir Qşekilde yeniden eşlenmediyse mswin.vim, Ex modunu ile başlatın Q, aslında daha iyi "Ex komutları" olarak adlandırılan "iki nokta üst üste komutları" zincirleyin ve yazarak Normal moda geri dönünvisual .

    bakınız :help :g, :help :y,:help Q

  • Çift boşlukla dosya: :g/^/put _. Bu, /dev/nullher satırdan sonra kara delik kaydının içeriğini (okurken boş, ancak yazılabilir, davranıyor gibi ) satır içine koyar (çünkü her satırın bir başlangıcı vardır!).

  • İçeren bir satır ekleyin fooher satırdan önce: :g/^/-put ='foo'. Bu, ifade kaydının akıllıca kullanılmasıdır. Burada, (cf. ) ile -eşanlamlıdır . Yana satırdan sonra koyar metin, açıkça bir öncekine hareket etmeye söylememiz gerekir..-1:help :range:put

  • Tüm arabelleği sistem panosuna kopyalayın: :%y+ .

    bakınız :help :range( %bölüm için) ve :help :y.

  • Eğer bir makro yanlış kaydettiği varsa, yazabilirsiniz :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 've düzenleme o. Bu, kayıt defterinde saklanan makronun içeriğini değiştirir ve aburada bunu yapmak için ifade kaydını nasıl kullanabileceğiniz gösterilmektedir.

  • Eğer yaptıysanız dddd, uugeri almak için de yapabilirsiniz . İle pson silinen satırı alabilirsiniz. Ama aslında siz de kayıtları ile 9 siler kadar kurtarabilirsiniz @1yoluyla @9.

    Daha da iyisi, yaparsanız "1P, .Normal modda oynar "2Pvb.

    bakınız :help .ve:help quote_number

  • Mevcut tarihi Ekle moduna eklemek istiyorsanız: Ctrl- R=strftime('%y%m%d')Enter.

    bakınız :help strftime()

Bir kez daha, kafa karıştırıcı ne olabilir:

  • :@ bir kaydın içeriğini vimscript olarak yorumlayan ve onu kaynaklayan bir komut satırı komutudur.
  • @ bir kaydın içeriğini normal mod tuş vuruşları olarak yorumlayan normal mod komutunda ( :kayıt kullanma dışında , ilk iki nokta üst üste olmadan en son çalınan komutu içerir: bu durumda, iki nokta üst üste tuşunu yeniden yazmış gibi komutu yeniden yürütür ve son dönüş tuşu).

  • " yank, yapıştır, sil, düzelt vb. için bir kayıt seçmenize yardımcı olan normal mod komutunda

  • " aynı zamanda geçerli bir kayıt adıdır (varsayılan veya adlandırılmamış kayıt) ve bu nedenle kayıt adlarını bekleyen komutlar için bağımsız değişken olarak geçirilebilir

205
“Cevapla soru arasında 100/1 uzunluk oranı” rozeti yok mu? :)
Benoit

8
Harika bir cevap, ama yaklaşık 1400 kelime kısa 1400. :)

19
Bu cevap vim'i kullanma şeklimi değiştirdi. Teşekkürler Benoit
P. Myer Nore

11
Unutmayın: Tüm kayıtlarını içerikleriyle birlikte listeleyecek reg
eugenevd

3
Vim'in son sürümlerinde, bir satırdan daha küçük olan silme işlemleri, numaralandırılmış yazmaçlara girmek yerine "küçük silme yazmaçlarına" gider. Kaynaklar: Vi ve Vim , Vi ve Vim , Reddit
Christian Long

48

Sistem panosu olan bir şeyi yapıştırmak için SHIFT- kullanabilirsiniz INS.

Windows'da çalışıyor, ancak sanırım Linux'ta da iyi çalışıyor.


7
Yup, Linux'ta da çalışıyor. Hem Vim hem de GVim'de GNOME altında test edilmiştir.
Teoulas

3
Bu, çalışma alanını klavye girişi olarak Vim'e besler, bu nedenle normal modda ve yapıştırma yapıyorsanız :!rm -rf /<cr>, bunu yürütür. Bunun yerine kayıtları kullanın!
lericson

4
@lericson Cevabımda bunun sistem klavyesinde bulunan bir şey için yararlı olduğunu söylemedim mi? Aşağı oyu anlamıyorum. Ve örnek olarak, cidden mi? Gerçekten panoda var mı? Ve yazmanın shift-insdaha kolay olduğunu düşünmüyor ctrl-R+*musunuz? Bu tabii ki gvim iseniz. Terminalde başka bir makineye bağlıysanız ve panonuzdan bir şey yapıştırmak istiyorsanız, bundan daha iyi bir şey biliyor musunuz shift-ins? çünkü kayıtlar bu durumda çalışmaz. Lütfen yorum yapmadan ve başka şeyler yapmadan önce düşünün (aşağı oylama gibi).
skeept

Sanırım bu yanlış bilgi ve bu yargıya göre hareket ettim.
lericson

1
Benim için çalışmıyor. Sadece '<S-Insert>' komut satırına eklenir. Belki bir şey eksik. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman

39

"Yanmış metni Vim komut satırına yapıştırmak istiyorum."

En çok oy alan cevap çok eksiksiz olsa da, komut geçmişini düzenlemeyi tercih ederim.

Normal modda şunu yazın: q: . Bu, normal vim komutlarıyla düzenlenebilir ve aranabilir son komutların bir listesini verecektir. En alttaki boş bir komut satırından başlayacaksınız.

Makalenin sorduğu şey için, yanmış bir satırı (ya da herhangi bir şeyi) bir komut satırına yapıştırarak, metninizi alın ve sonra: q:p(komut geçmişi düzenleme moduna geçin ve (p) yanmış metninizi yeni bir komuta kullanın İstediğiniz zaman düzenleyin,enter yürütmek için.

Komut geçmişi modundan çıkmak için tam tersi. Komut geçmişinde normal modda şunu yazın: :q+enter


1
mevcut bir komutu zaten değiştiriyorsanız ve 'q:' tuşuna basmadıysanız, ctrl + f tuşlarına basın, komut geçmişini düzenleme yeteneğini artırır.
Clay

14

Sistem panosundan Vim komut satırına ("komut modu") bir şey yapıştırmak için Ctrl+ ve Rardından tuşlarını kullanın +. Benim için en azından Ubuntu'da Shift+ Insçalışmıyor.

Not: Neden Ctrl+ Rtakip ettiğinden emin değilim *, teorik olarak Ctrl+ Rtakip ettiği +gibi her zaman işe yaramıyor gibi görünüyor. +Sürümü araştırdım ve keşfettim ve her zaman, en azından kutumda çalışıyor gibi görünüyor.


2
Ctrl-r + ve Ctrl-r * arasındaki fark, birincisinin normal pano olmasıdır, ancak Linux'ta "birincil" adlı en son seçilen metni (ondan orta düğme fare yapıştırması) temsil eden ikinci bir pano türü vardır. . Bu Windows veya MAC'de mevcut değil
Matias Thayer

13

Yank kayıtlarının makro tamponlarla aynı olduğunu da belirtmek gerekir. Başka bir deyişle, tüm komutunuzu belgenize (yapıştırılan snippet'iniz de dahil olmak üzere) yazabilir, daha sonra "bybunu bkayıt defterine asabilir ve ardından ile çalıştırabilirsiniz @b.


1

Benzer bir sorun yaşıyordum. Seçilen metnin bir komutla bitmesini istedim, ancak yapıştırmaya güvenmiyorum. İşte bir eşleme yazmaya çalıştığım komut:

:call VimuxRunCommand("python")

Bu eklentiye ilişkin dokümanlar yalnızca dizgi değişmezlerini kullanarak gösterilir. Çift tırnak içeren bir metin seçmeye çalışırsanız aşağıdakiler kırılır:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Bu sorunu aşmak için, sadece aşağıdakileri kullanarak makronun içeriğine başvurursunuz @:

vnoremap y:call VimuxRunCommand(@")<cr>

Adsız kaydın içeriğini aktarır ve çift tırnak ve çok satırlı edgecas'lerimle çalışır.


Bence son örneğinizde bir "eksik. Belki de VimuxRunCommand (" @ ") demek istediniz.
kd8azz

Bu, @karakteri vimux komutuna gönderir . @aşağıdaki çift tırnak işareti kaçan ve normal bir karakter yerine bir kayıt olarak muamele düşünün . vnoremapI tarif ettik böylece seçilen metin verilirse, ve bu da bitişik bir bölmede çalışan bir yorumlayıcı göndermeden, vimux komuta yapıştırır, görsel modunda aktiftir. bir senaryo üzerinde çalışmak ve birkaç tuşa basarak küçük bölümlerini test etmek için gerçekten harika.
Conrad.Dean

1

OS X

Mac OS X'te Vim kullanıyorsanız, maalesef eski sürümle birlikte gelir ve pano seçeneklerine uymaz. Neyse ki, Homebrew bu sorunu kolayca çözebilir.

Vim'i yükleyin:

brew install vim --with-lua --with-override-system-vi

Vim'in GUI sürümünü yükleyin:

brew install macvim --with-lua --with-override-system-vi

Etkili olması için terminali yeniden başlatın.


Aşağıdaki satırı ekleyin ~/.vimrc
set clipboard=unnamed

Şimdi Vim'deki satırı ile yykopyalayıp sistem çapında yapıştırabilirsiniz.


1

Bağlam için, bu bilgiler kullanıma hazır, eklentiler yok, varsayılan seçeneklerle Linux Mint'te .vimrc Vim 7.4 davranışı yok.

Her zaman fare (veya kullanarak metni seçebilirsiniz Vya vve "* siciline seçimi yerleştirerek) ve komut satırına yapıştırın Shift+ Ctrl+ v.

Yazma Ctrl+ rkomut satırında bir kayıt adı için bir istem neden olur. böylece yazmak :CTRL-r*içerik kaydını * komut satırına yerleştirir. Sadece "* değil, herhangi bir kayıt yapıştıracaktır :help c_CTRL-R.

Ayrıca, orta fare düğmesi komut satırına yapışacaktır.

:help->quote-plusX Window'un seçimle nasıl başa çıktığıyla ilgili açıklama için bkz . Düz, kullanıma hazır bir Vim'de bile (yine, Linux Mint'teki Vim 7.4'te, yine de), sol fare düğmesiyle yapılan herhangi bir seçim, orta fare düğmesiyle komut satırına yapıştırılabilir.

Buna ek olarak, orta fare düğmesi, Vim'de seçilen metni, GUI olanlar da dahil olmak üzere diğer birçok X Window uygulamasına yapıştıracaktır (örneğin, Firefox ve Thunderbird ) yapıştıracak ve metnin diğer uygulamalardan seçildiği yerlerde komut satırına yapıştırmak da mümkündür. .

Ek bilgi için bkz. Yardım-> x11-seçimi.

tl; Dr.

Önce CTRL-r yaklaşımını deneyin ve sonra başka bir şeye ihtiyacınız varsa Shift+ Ctrl+ vveya orta fare düğmesini kullanın.

Kafa karıştırıcı olabileceği kabul edildi.


0
  1. "[a-z]y: Metni [az] kaydına kopyala

  2. Kullanım :!düzenleme komutuna gitmek

  3. Ctrl+ R: Kopyaladığınız şeyi yapıştırmak için kayıt kimliğini takip edin.

CentOS 7 kullanıyordu.


"CentOS 7 için kullanılır" ile kastedilmektedir. ?
Peter Mortensen

0

İki farklı yazmacıya ayrılmış iki değeriniz varsa (örneğin, kayıt ave kayıt b), bir değişken ayarlayabilir cve üzerinde işlem yapabilirsiniz.

Örneğin, :set c = str2float(@a) + str2float(@b)daha sonra içeriği istediğiniz cyere yapıştırabilirsiniz .

Örneğin INSERT modunda iken, CTRL + Rsonra yazın =ifadesi kayıt içine girip sadece yazın ceşittir işaretinden sonra ve ENTER tuşuna basın. Tamamlandı, şimdi ave bkayıtların toplamına sahip olmalısınız .

Tüm bunlar bir makroya kaydedilebilir ve tekrarlanabilir!

str2floatEğer yüzdürücülü çalışıyorsanız fonksiyonu yoksa, bunun yerine tamsayılar alacak kullanılır.

Bunun deyim olup olmadığından emin değilim ama arka arkaya 2 sayı eklemem ve 500 satır daha tekrarlamam gereken durumum için çalıştı.

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.