Vim'de uzun çizgiler nasıl kesilir?


12

Gibi bloklardan oluşan oldukça büyük bir metin dosyam var

Short line.
Really long line.
Short line.

boş satırlarla ayrılmış ve uzun satırları parçalamak ve aşağıdaki gibi bloklar elde etmek için vim (Linux'ta) kullanmak istiyorum.

Short line.
This was
part of
a long line.
Short line.

gq(Ve gw) ile ilgili sorunum, her bloğun tamamını bir paragraf olarak yeniden düzenlemesi, yani her blok içindeki iki satır sonunu korumaması ve :help fo-tablehiçbir gqbiçimine göre istediğim şeyi yapmama izin vermiyor. Ayrıca paragraf sınırlayıcıları olarak yeni satır karakterleri tanımlayabilirsem hedefime ulaşabileceğimi düşündüm, ancak :help paragraphbunlara göre kodlanmış.

Edit: Ben biliyorum gqveya gwher uzun satır tek tek biçimlendirmek için biliyorum , ama benim dosya birkaç bin satır üzerinde çalıştığından bu otomatik olarak ulaşmak için bir yol arıyorum.


Bu arada: vim'in belgelerinde, burada SU'da ve web'de boş olarak ortaya çıkan sorunuma çözümler aradım. Açık bir şeyi göz ardı edersem bu soruyu memnuniyetle silerim.
AP


@ MartinSchröder: vi SE olduğunu bildiğim için memnunum! Bu cevaplar benim sorunuma değinmiyor, çünkü zaten biliyordum gqve gw. Ben de orada durmadım sevindim, aksi takdirde :gemir hakkında bilgi sahibi olmazdı . :)
AP

Yanıtlar:


16
:%norm! gww

Bu , özelleştirilmiş eşlemeleri hesaba katmadan (örneğin başka bir şeye eşlenmişse sorunlardan kaçınmak için) normalkomutu gww(geçerli satırı olduğu gibi biçimlendiren gw) tüm arabelleğe uygular gw.

Görmek

  • :help :%
  • :help :norm
  • :help gww

Bu alternatif, Ben'in yorumlardaki önerisine göre ve normal ifade eşleştirme yeteneği nedeniyle diğer benzer durumlarda daha iyi olabileceğinden aşağıda kaydedilen orijinal çözümden daha basittir. "Tüm satırları eşleştir" durumunda, gereksiz yere kaba olur.


Tampondaki gwwher satırda programlı olarak uygulama:

:g/^/norm gww

Bkz :help :gve :help norm. ^bir çizginin başıyla eşleşir, bu da pratikte bu çizgiyi her çizgiyle eşleştirir .

Ayrıca sadece 60 karakterden daha uzun satırları seçmeyi tercih edebilirsiniz.

:g/\%>60v/norm gww

(bkz. :help \%<) ancak pratikte gwwçizgileri textwidthzaten her zamankinden daha fazla yeniden biçimlendirecektir , bu nedenle ne hızda ne de sonuçta çok önemli olmayabilir.

(Ben v"sütun" yerine "sanal sütun" için kullanıyorum c, çünkü ikincisi gerçekten belirli sayıda bayt satır içine hesaplar. Uygulamada, yukarıdakiyle aynı nedenden ötürü gerçek bir konu değildir, bununla ilgili olarak, gwwsatırları textwidthzaten daha kısa yeniden biçimlendirmeyecektir .)


Görünüşe göre :gbir desen olmadan başarısız, bu yüzden :g//norm gwwçalışmıyor ama çalışıyor :g/.*/norm gww.
AP

@AP: Ha, benim için çalışıyor. Debian Unstable'dan Vim 7.4.488-6 kullanıyorum.
Daniel Andersson

4
:g//son arama düzenini yeniden kullanır; eğer yoksa, başarısız olur. Tüm satırlara :g/^/uygulamak için kullanın .
Ingo Karkat

@IngoKarkat: Ah, mantıklı, çünkü testler sırasındaki son kalıbım daha sonra gösterdiğim hat uzunluğu farkındaydı. Cevabı güncelleyeceğim. Yardımda bu "boş kalıp" davranışın nereden bahsedildiğini biliyor musunuz? Önemsizce bulamıyorum.
Daniel Andersson

El kitabına bakıldığında, :help last-patternnormal arama için verilen bilgilerin :globalkomut için de geçerli olduğu ima edilmektedir.
Daniel Andersson

4

Zaten manuel okudum yana gqve gwkomutlar, ben muhtemelen elle uzun hatlara hareketli ve daha sonra kullanmaktan daha kullanışlı bir şey istiyorum anlamaya gw0, gw$ya da başka gwyalnızca geçerli satırı biçimlendirmek için komut.

Bir metin bloğu üzerinde Vim'deki uzun satırları kırmanın kolay bir yolunu bilmiyorum. Ancak, Vim'i bir GNU / Linux sisteminde kullandığınızdan bahsettiğinizden, metninizi GNU fmtkomutu aracılığıyla filtrelemenizi öneririm .

Tüm dosya için:

:%!fmt --width=75 --split-only

Geçerli paragraf için (kısa seçenekleri kullanarak):

:'{,'}!fmt -75 -s

İlgili fmtseçeneklerin açıklaması :

  • -w, --width=WIDTH- maksimum çizgi genişliği (varsayılan 75 sütun). Seçenek -WIDTH, kısaltılmış bir biçimidir --width=DIGITS(bu kısaltılmış sürümü kullanıyorsanız, ilk seçenek olmalıdır).

  • -s, --split-only- uzun hatları ayırın, ancak yeniden doldurmayın; bu, önceden var olan sabit satır sonlarınızı koruyan seçenektir.


Bahsettiğiniz için teşekkürler fmt. Diğer cevabı kabul etmeyi tercih ettim, çünkü sadece vim gerektiriyor.
AP

@AP Endişelenme. Harika bir cevap ve ben de kabul ederdim, kendim. Hem o hem de sorunuz haklı.
Anthony Geoghegan

1

Gönderen:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

İşaretleyiciyi "lorem ipsum" çizgisine koymak ve gwwverim elde etmek ( textwidth=40netlik için):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

ki bana istediğin gibi görünüyor. Değilse, lütfen açıklığa kavuşturmaktan çekinmeyin.

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.