Vim'de Sözcük Kaydırma (girintiyi koruma)


92

Tüm kelimelerin vim'e nasıl sarılacağını açıklayan bu yazıya bakıyordum . Kabul edilen çözüm şuydu:

:set formatoptions=l
:set lbr

Bu metni alır (sekmeler \ t olarak gösterilir):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Bu, aşağıdaki gibi bir davranışı gerçekleştirir (sekmeler \ t olarak gösterilir):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Ancak bu işlevi yeniden tanımlamak isterim. Sarılı çizginin önünde, yukarıdaki satırda artı bir tane olmasıyla aynı sayıda sekme olmasını istiyorum. Yani:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Herhangi bir fikir?


34
Soruyu olabildiğince açık hale getirmek için harcanan çaba için +1.
Jeffrey Jose

Metnin pencerenin kenarında yumuşak sarılmasını mı yoksa satır belirli bir uzunluğa ulaştığında sert sarılmasını mı istiyorsunuz? Sanırım sert kaydırmak istiyorsunuz (metninize "will" kelimesinden sonra bir satırsonu eklendiğinde), ancak örneklerinizden anlamak zor.
Bill Odom

@Bill, çoğunlukla yazılımla sarma ile ilgileniyorum ama bir donanım paketi çözümü de kabul edilebilir.
sixtyfootersdude

1
İstediğiniz işlevsellik şu anda Vim'de yerleşik değildir. Bununla birlikte, yaklaşan bir yama var: groups.google.com/group/vim_dev/web/vim-patches (bu # 15, "Doğru şekilde sarılmış satırlar girintili").
Bill Odom

İlgili: VimCasts, bu sorunu çözmek için harici unix araçlarını kullanma konusunda güzel bir bölüm geçirdi
Damien Wilson

Yanıtlar:


18

Breakindent yama aradığınız şeye sahip. Bu ileti dizisinde bulunan talimatları kullanarak başarıyla uyguladım:

Homebrew ile OS X'te breakindent yama ile Vim'e yama yapın

Özellikle, echristopherson'un Homebrew formülü.

Bu iş parçacığının eski olduğunu biliyorum ama Google'da popüler ve bir çözüm bulmaya çalışırken defalarca karşılaştım.

DÜZENLEME: Bu yama artık 7.4.338 yaması olarak vim'e dahil edilmiştir. Bakınız: https://retracile.net/blog/2014/07/18/18.00

Yosemite'de (Mac OS X), snowbound komutunu hombrew ile kullandım:

brew install macvim --with-features=huge --override-system-vim --HEAD 

yama, homebrew'daki en son macvim ile çalışmıyor gibi görünüyor? @ Exit42 nasıl işe yaradınız?
kardan mahsur kalmış

nvm. Macvim'i homebrew bleeding edge ile derledimbrew install macvim --with-features=huge --override-system-vim --HEAD
snowbound

1
Aşağıdaki cevabıma bakın: stackoverflow.com/questions/2828174/… Yeni vim sürümlerinde yama gerekmez.
JoshuaD

26

Bu soru ilk sorulduğunda işe yaramadı, ancak 25 Haziran 2014 itibariyle bu işe yarayacak. (Vim'inizi o tarihten daha yeni bir sürüme güncellediğinizi varsayarsak)

.Vimrc dosyanıza ekleyin:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

Ve bu kadar!

-

Bazı kişiler (ben dahil) birden çok bilgisayarda tek bir .vimrc paylaşır. Bu durumda, bu satırın sağlam olması önemlidir (can sıkıcı hata mesajlarından kaçınmak için). Bu biraz daha iyi:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

Bu şekilde, vim'in önceki bir sürümünü kullanıyorsanız, hata mesajı almazsınız.


İlginç bir şekilde, bu cygwin'imin 7.4 vim'inde çalışıyor ama unbuntu'nun 7.4 vim'inde değil. Sanırım biraz daha yaygınlaşması gerekiyor, ancak yakında evrensel olarak benimsenecek.
JoshuaD

1
Vim 7.4 @ ArchLinux ile çalışır.
Andy Mikhaylenko

1
Bunun yerine bu testi kullanabilirsiniz:if has("patch-7.4.354")
Lawrence Kesteloot

Bu, OP'nin açıklamasıyla ilgili soruyu yanıtlamaz: aynı sayıda sekme (...) artı bir . Bu arada benim görüşüme göre de çok önemli, sık sık ek girinti tutmak ve sarılı bölümleri optik olarak sağa kaydırmak isteyebilirsiniz (sıkı düzenlenmiş listeler, notlar, vb.);
kanlı

8

Elde edeceğiniz en iyi şey showbreak, her sarılmış satırın önüne sabit bir dize koyacak seçenektir (kullanıyorum set showbreak=...).


@AlexanderBird'e göre :help 'showbreak', hayır, yapamazsınız - showbreaksadece bir dizedir.
Rory O'Kane

4

'Showbreak' en iyi seçenek diyen cevaba katılıyorum. Showbreak tipik olarak showbreak dizesine basılmayan karakterler (örneğin, boşluklar veya sekmeler) koymanıza izin vermez, bu nedenle tipik olarak kullanıldığı gibi size sadece sol kenar boşluğu boyunca bir gösterge verecektir, yani gerçek girinti yok. Bence bu harika değil, çünkü OP'nin asıl amacı, sarılı çizgilere girinti vermek, onları sol kenar boşluğunu karıştırmaktan ve kendilerine ait çizgiler gibi görünmekten korumaktır.

Bu nedenle, showbreak kullanarak (çirkin) bir girinti eklemenin bir yolu, sadece çok sayıda karakter kullanmaktır, .eg, ": set showbreak => --------------->". Bu, şuna benzer bir şeyle sonuçlanır:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Daha iyi bir alternatif, her biri ctrl-v, 160 tuş dizisi kullanılarak showbreak dizesine girilebilen bölünemez boşluk karakterlerini kullanmak olabilir (Vim örneğinizin unicode etkin olduğu varsayılarak). Bu şekilde, sol tarafta boş olan ve gerçek bir girinti gibi görünen bir showbreak dizesi girebilirsiniz. Örneğin, ": showbreak =............ >>" her biri '.' komutta aslında ctrl-V, 160 tuşlarına basılarak girilen bölünemez bir boşluk karakteridir. Bu şekilde, güzelce girintili olan bir sarma elde edersiniz, örneğin:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Hala bir önceki satırın girintisine göre girinti düzeyini değiştirme yeteneğiniz yok, ancak en azından pencerenin sol kenar boşluğu boyunca çok fazla görsel dağınıklık olmadan sarılmış satırların temiz girintisini elde edersiniz. Sarılmış bir satırın girintisi gerçek bir satırın başlangıcından daha azsa, yine de kafa karışıklığı olabilir, ancak bu, showbreak "girintisini" oldukça büyük (yani, kodunuzda yaygın olarak bulunan herhangi bir girintiden daha büyük) yaparak önlenebilir. ) ancak yine de metnin okunaklı şekilde kaydırılması için yeterli alan sağlayacak kadar küçük olmalıdır. Pek çok kullanım için 40 veya 50 boşlukluk bir showbreak girintisinin bunu oldukça iyi yapacağını düşünüyorum.


7
Bunları kaçan tarafından showbreak boşluk koyabilirsiniz: :set showbreak=\ \ \ \ . Ancak yine de sekmeler için çalışmıyor.
Bill Odom
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.