Beyaz olmayan bir karaktere ulaşana kadar dikey olarak nasıl hareket edebilirim?


27

Girintili (tam) kod içeren çok uzun bir dosyada, doğrudan girintiyi sınırlayan imlecin üstünde veya altında bir metin satırına geçmek yararlı olabilir.

(Bunu yapmanın bir yolu, girintili katlama çizgisini , imleç düzeyini sınırlayan çizgileri imleçten yalnızca bir jveya kuzakta olacak şekilde katlayan geçerli girinti düzeyini katlayarak olabilir . Ancak, girinti katlanmasının bulunmadığı örnekleri buldum İlgilendiğim girintiyle çalışabildi.)

İşte bir örnek alt çizgi ile işaretlenmiş imleç, var _(tanımları arasındaki ikinci karakter sütununda class Bazzve class Qux), ancak içindeki paragrafların veya satır sayısı hayal modules bilinmeyen veya değişken:

module Foo
  # lots of code...
end

module Bar
  class Baz
    # ...
  end

  class Bazz
    # lots of code...
  end
 _
  class Qux
    # ...
  end

  class Quux
    # lots of code...
  end
end

... nasıl çabuk gidin olabilir oait module Barimlecin üzerinde veya niçinde endçok son satırında imlecin altında? Dikey sütunun boşluk içerdiğini, ancak classtanımların arasındaki ikinci sütunda da karakter olmadığını unutmayın .


2
related: "Aynı girintili sonraki / önceki satıra taşı" Vim Tips Wiki'de vim.wikia.com/wiki/Move_to_next/…
alxndr

G ve ardından yön tuşlarına basmak, sekmeleri engelleyebilir ve çizgiler arasında hareket edebilir
SibiCoder

1
@ Alxndr'nin bağlantısındaki çözüm, beyaz boşluğun yetersiz tutulduğu durumlar dışında iyi çalışır (örneğin, yalnızca beyaz boşluklara sahip rasgele çizgiler vardır) ve beyaz boşluğu yoksaymak istersiniz. Aşağıdaki durumdaki süper askerin çözümü, bu durumdan endişe duyulması halinde daha iyidir.
nukeguy

Yanıtlar:


9

Peki ya bu işlev?

function FloatUp()
    while line(".") > 1
                \ && (strlen(getline(".")) < col(".")
                \ || getline(".")[col(".") - 1] =~ '\s')
        norm k
    endwhile
endfunction

Yapabilirsin nnoremap gU :call FloatUp()<CR>( gU"yukarı çık" için), ve sonra onu çağırabilirsin gU.

İşte bir açıklama:

  • Kod norm k, whilekoşul devam ettiği sürece imleci (ile ) art arda hareket ettirir .
  • whileBu ilk satırı (değilse koşul tutan line(".") > 1ya) ve
    • bu çizgi çok kısa (muhtemelen boş); veya
    • Geçerli satırdaki ( getline(".")) karakterin geçerli sütundaki ( [col(".") - 1]) karakteri boşluktur ( =~ '\s'; yani, boşluk modeliyle eşleşir).

1
Bu mükemmel (ve hızlı bir şekilde) çalışıyor gibi gözüküyor ve kolayca bir FloatDownişleve dönüştürülebilir . Benim .vimrc içine gider, teşekkürler! github.com/alxndr/dotfiles/commit/0e25a302
alxndr

1
Sadece bu çözümün görsel modda çalışmadığını keşfettim (hangi görsel moda bağlı olarak biraz farklı davranış, aynı konumda kalacak ya da sadece bir satır ilerleyecektir). Orada neler olduğuna dair herhangi bir işaret var mı?
alxndr

13

Bu gibi şeyleri aramayı seviyorum, çünkü Vim'in regex'lerinde belirli sanal sütun numaraları gibi arayabileceğiniz çok fazla sayıda şey var:

nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>

nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>

Kullanım cdinmek ve cuçıkmak için. Burada "sütun yukarı" ve "sütun aşağı" düşünüyorum. Neredeyse% 100 bunların varsayılan olarak işlem yapmadığından eminim. Veya kendi haritalarınızı seçin.

Bu, sekmeler veya boşluklar veya her ikisini de kullanmanız durumunda çalışmalıdır.


1
Bu komutları ayrıştırmada sorun yaşıyorum. Onları biraz genişletir misiniz?
davidlowryduda

1
/ veya? aşağı veya yukarı arama yapmak için, \% xv, 'x' sanal sütun numarasına göre aramayı sınırlandırır, bu durumda 'x', '<CR> = virtcol (".") <CR>' olup, virtcol komutunu çalıştırır ve ekler imleç ifadenin sanal sütun numarasıdır, \ S boşluk olmayan herhangi bir karakter anlamına gelir.
Chad,

1
Chad'i açıkladığın için teşekkürler. Sadece Ekle modunda ya da Komut satırı modunda <CR> 'nin bir kaydın içeriğini aldığını ekleyeceğim. =Yazmaç yerine bir ifade olarak değerlendirilir ekspresyon kayıt birimidir. Tuhaf görünümlü değilse, çok kullanışlı.
superjer

1
Bu yaklaşımın bir dezavantajı, aramayı vurgulamanız durumunda imlecin dikey sütunundaki tüm karakterlerin artık "sütun yukarı" ing veya "sütun aşağı" ing sonra vurgulandığını görmenizdir.
alxndr,

3
Mevcut aramanızı korumak istiyorsanız hazırlayabilir :let searchbak=@/<CR>ve ekleyebilirsiniz :let @/=searchbak<CR>. Ancak bu noktada biraz uzun ve ulaşılmaz oluyor ve belki de sadece bir fonksiyon olmalı.
superjer

7

JumpToVerticalOccurrence eklentisini kullanabilirsiniz (varsayılan ]|ve ile eşlenir [|). Bunun gibi ]V{char}çalışan fancak dikey olarak çalışan çok az kişi var . Elbette gerektiğinde onları yeniden eşleştirebilirsiniz.


Eğer eklenti kullanmasına istemiyorsanız, kullanmak deneyebilirsiniz :searchile virtcol(.)örneğin:

:call search('\%' . virtcol('.') . 'v\S', 'bW')

nerede:

  • virtcol('.') size geçerli sütunu verir,
  • \S boşluksuz kısaltmalar
  • bW geriye doğru arama içindir

:help searchDaha fazlasını öğrenmek için kontrol edin .

Kullanımı kolaylaştırmak için, haritalandırın, örneğin:

:map <C-k> :call search('\%' . virtcol('.') . 'v\S', 'bW')<CR>
:map <C-j> :call search('\%' . virtcol('.') . 'v\S', 'W')<CR>

Kod parantez içeriyorsa Alternatif kullanın %(örneğin onları eşleşen arasında atlamak için {, }, [, ], vb) ya da bütün paragraf (atlar kullanmak {, }birlikte Shiftgerekirse).


Bağlantılar / kaynaklar:


Kimden :h search(): waraçlar wrap around the end of the fileve Waraçlar don't wrap around the end of the file. Ama neden onları ikinciye bir araya getirdin :map?
Jair López,

@JairLopez Doğru, worada olmamalıydı, ben de kaldırdım, teşekkürler. Muhtemelen hareket tuşları anlamıyla kafam karışmıştı.
kenorb

3

Bu davranışı sağlamak için vim-indent-object eklentisinin değiştirilmiş bir sürümünü kullanıyorum . Değişikliklerim burada görülebilir .

Bu haritayla [io anki girinti seviyesinin başlangıcına ]igitmemi ve sonuna gitmemi sağlıyor.


2

O öyle olmadığını dikey hareket, ama hızlı, benzer olan bir şey, çünkü istedi ve geriye 2 paragraflar taşınıyor için yeterince iyi ne olabileceğini tam olarak değil: {{. Bu sizi hemen önce çizgiye götürecek module Bar.


2
İmleç ve üst düzey moduleçizgisi arasında bilinmeyen sayıda çizgi ve / veya paragraf olduğunu hayal edin . (Özellikle, bu durum son zamanlarda üçüncü taraf kodunda birkaç bin satır uzunluğunda, doğru girintili, ancak boş satırlar olmadan ve bir modülün tanımının dış bağlamını bulmaya çalışırken gezinirken ortaya çıktı.)
alxndr

Paragraflara göre atlamak, benim tercih ettiğim dolaşma şeklidir, ancak bir seçenek değildi: dosyanın tamamı bir "paragraf" idi.
alxndr


1

Bunun için kendi eklentimi move_until_char_changes.vim kullanıyorum.

Ben eşlersiniz gKve gJ.

Geçerli sütunda (sadece boşluk değil) aynı karakterde bulunan birçok satırın üstünden atlayarak, günlük dosyalarında veya tekrarlanan dizelerle SQL dökümlerinde yararlı olabilir.

Varsayılan olarak, "arama" karakterini almadan önce ilk önce bir satır hareket eder.

İki kez kullanmamanız koşuluyla Görsel modda çalışır ve satır içi ya da blok biçiminde olmamanız koşuluyla Görsel mod ... (düzeltme hoş geldiniz!)


1

Ben burada bir cevap olarak görmedim ( düzenleme sadece superjer'in çok benzer bir şeyden bahsettiğini fark ettim ). Basitçe / veya? arama.

Örneğin, aşağıdaki gibi 2. sütunda boşluk olmayan bir karakter için aşağı doğru arama yapabilirsiniz:

/\%2v\S

Arıza:

/    "search downward (use ? for upward movement)
\%2v "for the following char in the 2nd virtual column
\S   "any non white space character

Ardından aramayı tekrarlamak için normal operatörleri kullanabilirsiniz.

Konuyla ilgili daha fazla bilgi için bkz. :help \%cVe :help \%v.

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.