İmlecin Vim'de ekleme moduna girmeden olduğu yerde bir satır sonu nasıl ekleyebilirim?


89

İmlecin Vim'de olduğu yerde ekleme moduna girmeden satır sonu eklemek mümkün müdür? İşte bir örnek ( [x]imlecin açık olduğu anlamına gelir x):

if (some_condition) {[ ]return; }

Bazen daha fazla kod girmek isteyebilirim. Bu yüzden i, ekleme moduna geçmek için tuşuna Enter, satır sonunu eklemek için tuşuna basıp fazla boşluğu silerim. Daha sonra, normal moda girer ve imleci kapanış ayracının önüne konumlandırır ve ardından kendi satırına getirmek için aynı şeyi yaparım.

Bunu bir süredir yapıyorum ama kesinlikle daha iyi bir yolu var mı?


INSERT moduna girmeden bir şey eklemek mi istiyorsunuz?
Jeremy Cantrell

26
@ jeremy-cantrell Evet, tıpkı "J" nin bir sonraki satıra katılması ve INSERT moduna girmeden bir boşluk eklemesi gibi!
awendt

Yanıtlar:


108

Verdiğiniz örnek için, rEntertek bir karakteri (boşluk) Enter ile değiştirmek için kullanabilirsiniz . Ardından, bir fspace.sonraki boşluğa ilerlemek ve son komutu tekrarlamak için.

Otomatik girinti ayarlarınıza bağlı olarak, yukarıdakiler return ifadesini düzgün şekilde girintilendirebilir veya etmeyebilir. Değilse sEnterTabEsc, boşluğu yeni satırla değiştirmek için kullanın , satırı girintili hale getirin ve ekleme modundan çıkın. İkinci boşluğu farklı bir komutla değiştirmeniz gerekir, böylece '.' Kullanamazsınız. bu durumda.


1
Bunun en kolay çözüm olduğunu düşünüyorum. Teşekkürler Greg.
Mark A. Nicolosi

4
'f [boşluk]', 'W' ile eşdeğer olmalıdır (yani bir sonraki beyaz bipe git)
Nathan Fellman

4
Çok uzakta bir karakter 'W' hamle, bir sonraki karaktere hareket sonrasında bir sonraki boşluk.
Greg Hewgill

1
Ekleme moduna ile girmek istemiyorsanız, girintilemeye yardımcı olması için >>ve tuşunu da kullanabilirsiniz . <<s
Conner

12

İşte uçlar Eğer 'g' imleç bir yeni satır bastığınızda bir makro oluşturmak için aşağıdaki adımları ederken değil ekleme modunda:

Vim içinden şunu yazın:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Nerede:

  • [Ctrl + V] , Ctrl tuşunu basılı tutun ve "v" ye basın anlamına gelir
  • [Enter] , Enter tuşuna basılması anlamına gelir
  • [Esc] , Esc tuşuna basmak anlamına gelir

Son Enter tuşuna basana kadar vim pencerenizin altında aşağıdakileri göreceksiniz:

:map g i^M^[

Açıklama:

[Ctrl + V], "aşağıdaki karakteri tırnak içine almak" anlamına gelir - yeni satırı ve kaçış karakterlerini komuta yerleştirmenize olanak tanır.

Yani 'g' anahtarını diziye eşliyorsunuz:

i [Enter] [Escape]

Bu, imleçten önce bir satırsonu eklemek ve ardından ekleme modundan çıkmak için vim'dir .

Tweaks:

  • 'G' harfini, kullandığınız bir komutla bağlantılı olmayan herhangi bir karakterle değiştirebilirsiniz.
  • Komuta, daha ekle örneğin f}i^M^[O - Bu olacak f ind } ve ben başka yeni satır nsert, ardından ek modu ve kaçmak Ey kalem daha kodu girmek için boş bir satır.
  • Kalıcı hale getirmek için komutu .vimrc veya .exrc dosyanıza ekleyebilirsiniz. İki nokta üst üste işaretini baştan çıkarmanız yeterlidir, böylece komut "harita" ile başlar

Zevk almak!


Gönderideki soru yerine konudaki kötü ifade edilen soruyu cevapladınız. Bilmek istediği şey, çizginin kesildiği noktada olan ancak artık bir amaca hizmet etmeyen beyaz boşluktan nasıl kolayca kurtulabileceğidir.
Aristo Pagaltzis

Teşekkürler. Yazarın istediğini (sanırım) başarmak için "Tweaks" bölümü güncellendi. Bunu test ettiğimde, vi ekstra boşlukları benim için otomatik olarak kaldırdı; sizinki değilse onları silmek için 'x' kullanın. Ve neden vi komutları modem hat gürültüsü gibi görünüyor? :-)
Adam Liss

11

Ctrl + Enter tuşlarına basarak imleçteki satırı kırmak için basit bir eşleme:

:nmap <c-cr> i<cr><Esc>

esasen 'ekleme' moduna girer, bir satır sonu ekler ve normal moda geri döner.

ileride kullanmak üzere .vimrc dosyanıza koyun.


5

Genellikle tek satırlık bir bloğu üç satıra genişletiyorsanız, değiştirmeyi deneyin. Açma parantezini parantez / dönüş olarak ve kapatma parantezini dönüş / dirsek olarak değiştirin.

Köşeli parantez / dönüş yerine parantez değiştirme komutu şuna benzer:

:s/{/{\r/

Bunu sıklıkla kullanmak istediğiniz için, tüm diziyi şu şekilde kullanılmayan bir tuş vuruşuyla eşleyebilirsiniz:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Görmek yerde ^ M sekansı, tür [Ctrl-V] ve ardından pres butonu .

Şimdi imleciniz örnek satırınızın herhangi bir yerindeyken eşlenen tuşa basın ve şaryo dönüşleri eklenir.

Kontrol :help map-which-keysharitaya kullanılmayan tuş vuruşlarını seçme konusunda tavsiyeler.


BTW: gİki tuş vuruşundan oluşan birçok vim eşleştirmesi için 'ad alanı' anahtarı olarak kullanıldığından eşlenmez (bkz. :h g). Yani bu haritalama aslında yapılmaz.
Hotschke

gZaten 'ad alanı' anahtarı olarak kullanımda olan iyi bir komut var mı ?
slothbear

Özellikle değil. Dediğim gibi :help g, varsayılan g+ bir şey eşlemelerinin bir listesini görmenin bir yolu . z, [ ]ayrıca 'ad alanı' anahtarlarıdır, bkz :help index. :verbose map gG ile başlayan tüm geçerli tanımlanmış eşlemeleri görmek için çağırabilirsiniz . Yararlı web kaynakları şunlardır: viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (slaytlar: speakerdeck.com/nelstrom/follow-my lider )
Hotschke

3

KBaşka bir şeye eşlemede sorun olmadığını varsayarsak (beğeninize göre farklı bir anahtar seçin) ve 'geçici işaretçi olarak işaretçi kullanmak tamamdır, neden bunu yapmayasınız?

:nmap K m'a<CR><Esc>`'

şimdi normal modda, satır sonunun oluşmasını istediğiniz karakterin üzerinde K'ye basmak satırı böler ve imleci olduğu yerde bırakır.


1

Vim, autoindent(veya başka herhangi bir girinti yardımı) etkinken bir satırı ikiye bölerseniz, imlecin sağındaki beyaz boşlukları otomatik olarak öldürür .

Eğer bu ayarlardan herhangi birini kullanmak istemiyorsanız, kullanmak syerine iamacıyla s sadece ekleme yerine boşluğu için yeni metninizi yerini tutmaz. (Birden fazla boşluk varsa, imleci en sola getirin ve cwbunun yerine kullanın.)


1

Temel olarak, bir satırı böldüğünüzde ya sadece bir satır başı eklemek istersiniz ya da bir boşlukta olmanız durumunda, bunu bir satır başı ile değiştirin. Peki neden birine razı olalım? İşte K için eşlemem:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

İki eylemi tek bir anahtar haritada yoğunlaştırmak için üçlü operatörü kullanıyorum. Parçalamak <expr>, anahtar haritanın çıktısının dinamik olabileceği ve bu durumda vim'e getline('.')[col('.')-1]==' 'imlecin altındaki karakterin boşluk olup olmadığını sormanın uzun soluklu yolu olan koşula bağlı olduğu anlamına gelir . Son olarak, tanıdık üçlü operatör ? :boşluğu linebreak ( r<CR>) ile değiştirir veya yeni bir tane ekler ( i<CR><Esc>)

Şimdi Jkomuta için güzel bir kardeş anahtar haritanız var .


Bu oldukça şık. Kasıtlı olarak K kullandım mı emin değilim, ama bu onu başka bir yerde atmaya veya yeniden eşlemeye değer kılabilir.
dragon788

0

Bu anahtar eşlemesini vimrc'nizde ayarlayın

:map <C-m> i<CR><Esc>h

Vim'inizde kullanmak istiyorsanız Ctrl + m tuşlarına basın.


0

IMHO, yerleşik haritalama gsyararlı bir eşleme değildir (vim'i uyku moduna geçirin), bölme için bunu kullanabilirsiniz:

nmap gs i<CR><ESC>

0

In Vrapper Eğer mod ekleme girmeden bir çizgi bölecek GQL kullanabilirsiniz, ancak her zaman girinti korumak olmayabilir.


0

Aslında aşağıdaki birleşik işlemlere ihtiyacınız var:

  1. vGörsel Moda girmek için basın
  2. Bölmek istediğiniz hattı seçin
  3. :Komut Moduna girmek için basın
  4. s/\s/\r/g
  5. Bitti

0

Girişiniz varsa:

aaa bbb ccc ddd

ve çıktı almak istiyorum

aaa
bbb
ccc
ddd

Komutu kullanabilirsiniz

f r<ENTER>;.;.

0

Bunu, zıt davranıştan beklediğim şeyin en sadık uygulaması olarak buldum. J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

İmleçteki basit yeni satırı yapar, eğer varsa önceki satırdaki sondaki beyaz boşluklarla ilgilenir ve ardından imleci doğru konuma döndürür.

i <cr> <esc> - bu önerilen en yaygın çözümlerden biridir, imlecinizin altındaki boşluk olmayan karakterleri silmez, aynı zamanda sonunda boşluk bırakarak sizi bırakır

^mw - yeni satırın başlangıcına gidin ve altında bir işaret oluşturun w

gk - bir satır yukarı git

:silent! s/\v +$//<cr> - normal ifade satırın sonundaki beyaz boşlukları değiştirin

:noh<cr> - Normal ifadenin açılmış olabileceğini vurgulayan tüm aramaları temizleyin

`w - işareti altına geri getir w

Esasen ikisinin en iyilerini birleştirir r<esc><cr>vei<cr><esc>

Not: SPotansiyel olarak yararlı bir anahtarın üzerine yazan bir bağım var, ancak bu bir eşanlamlı ccve onu bölmeler kadar sık ​​kullanmadığım için üzerine yazmakta sorun yok.



-1

Bu eşleme, sahip olduğunuz herhangi bir tek satırlık işlevi parçalayacaktır. Normal modda imlecinizi satırın üzerine getirin ve 'g' tuşuna basın:

:map g ^f{malr<CR>`a%hr<CR>`a

Bu, açılış ayracından sonra bir boşluk ve kapanış ayracından önce bir boşluk olduğunu varsayar. Bunun sizin için işe yarayıp yaramadığını görün.

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.