Vim kıvrımlarını Atom veya Yüce Metne benzer şekilde tek bir satıra daralt


13

Ben Atom ve Yüce Metin satır katlama, her katlamanın ilk satırının görünür olduğu (sözdizimi vurgulama ile tamamlandı) ve katlamayı gösteren satırın sonuna bir işaretleyici eklendiği yolun hayranıyım.

Vim'in girinti katlamasını (üstte) ve Atom'un (altını) karşılaştıran aşağıdaki ekran görüntüsüne bakın:Vim ve Atom kodu katlama

Vim her kat için iki çizgi ayırır. İlk satır bir başlık görevi görür ve ikinci satır, katlamayla ilgili bazı bilgileri açıklar (katın içindeki satır ve metin sayısı).

Atom yalnızca bir satır kullanır ve soldaki satır numaralarına eklenen renkle birlikte katlamayı belirtmek için satırın sonunda küçük bir işaretçi kullanır. Atom'un katlama stili daha az ekran alanı kullanıyor ancak yine de gerçekten ihtiyacım olan tüm bilgileri iletiyor.

Atom katlama stilinin bir parçasıyım. Bence, özellikle bir satırda birden fazla yöntem veya özellik listelediğinde (yukarıdaki ekran görüntüsünde olduğu gibi) daha temiz ve daha tutarlı görünüyor.

Atom'un Vim'deki katlama stilini kabaca tahmin etmenin bir yolu var mı?


1
Bence kıvrımlarınız aslında açılış braketlerini içeren çizgiyle başlamıyor. Vim, yalnızca katlamanın başladığı satırdaki katlama metnini kullanır. Örneğin, küme
muru

Ama bu Python, parantez dahil değil ( from __future__ import braces) ... Katlamayı nasıl yapılandırdınız? Ve bu kod snippet'ini (veya sorunu gösteren başka bir kodu) yapıştırabilir misiniz? Vim tek bir çizgiye katlanır, ancak muru'nun belirttiği gibi, katlarınız bir çizgiye geç başlar.
Martin Tournoij

@Carpetsmoker diş telleri sadece katlamanın başladığı yer içindir. Aynı etki, örneğin Haskell'de de görülebilir.
muru

@MikeHearn Önceki yanıtım tamamen yanlıştı. Soruna bir çözüm içerecek şekilde güncelledim.
Zengin

Yanıtlar:


12

İki satır ve bir satır

Vim'de, bir kat içindeki tüm satırlar tek bir satıra daraltılır ve 'foldtext'seçenek daha sonra bu satırların özetini (genellikle kesik çizgiler, katlanmış satırların sayısı ve ilk (veya tüm) satırlardan gelen içerik) belirler.

Örneğin, Vim'de sadece {...}parametre bloğunun kendisi katlanır; yukarıdaki satır (parametreleri kullanan) ekranın bir parçası değildir. Buna karşılık, diğer editörde, parametreleri kullanan bu satır katlamaya aittir ve katlama metni (Vim terminolojisini kullanmak için) o satırın içeriği ve ekli işaretleyicidir.

uyarlanması

Vim'de kıvrımlar farklı yollarla üretilebilir (bakınız :help fold-methods) ve 'filetype'tamponun durumuna bağlıdır . Yukarıdaki çizgiyi katlamaya dahil etmenin zorluğu buna bağlıdır; ile kontrol edin :setlocal foldmethod?. İle girinti katlanması, sen etkileyebilir şey yok; başka bir yönteme geçmeniz gerekir. İçin sözdizimi katlama, o sözdizimi tanımları adapte anlamına gelecektir ve çok zor olabilir. Bir ifade kullanılırsa daha iyi şanslar elde edersiniz , ancak yine de mantığı anlamak ve değiştirmek anlamına gelir. (Filetype eklentisi yazarının bunu etkileyecek bir yapılandırma sağlaması pek olası değildir.)

Katlanmış çizginin sözdizimi vurgulaması

Ne yazık ki bu mümkün değil. Vim her zaman Foldedkatlanmış çizginin tamamı için vurgu grubunu kullanır . Bunu, :highlightiçindeki komutlar aracılığıyla ~/.vimrcdüzenleyebilirsiniz, ancak sözdiziminin bireysel farklılaşması kaybolacaktır.


5

Vim zaten katları tek bir satır olarak görüntüler. Ancak, Vim'in indentkatlanmasında, aynı girintiye sahip tüm çizgiler bir katlamaya dahil edilir. Ekran görüntünüzde, "üstbilgiler" olarak adlandırdığınız satırlar (ör. Bir başlangıç collection_base_url) katlamaların içinde değil .

Vim'leri kullanarak Atom'un katlanmasına benzer bir şey elde edebilirsiniz foldexpr foldmethod:

" Finds the indent of a line. The indent of a blank line is the indent of the
" first non-blank line above it.
function! FindIndent(line_number, indent_width)
    " Regular expression for a "blank" line
    let regexp_blank = "^\s*$"

    let non_blank_line = a:line_number
    while non_blank_line > 0 && getline(non_blank_line) =~ regexp_blank
        let non_blank_line = non_blank_line - 1
    endwhile
    return indent(non_blank_line) / a:indent_width
endfunction

" 'foldexpr' for Atom-style indent folding
function! AtomStyleFolding(line_number)
    let indent_width = &shiftwidth

    " Find current indent
    let indent = FindIndent(a:line_number, indent_width)

    " Now find the indent of the next line
    let indent_below = FindIndent(a:line_number + 1, indent_width)

    " Calculate indent level
    if indent_below > indent
        return indent_below
    elseif indent_below < indent
        return "<" . indent
    else
        return indent
    endif
endfunction

set foldexpr=AtomStyleFolding(v:lnum)
set foldmethod=expr

Bu, :help fold-expraşağıdaki gibi bir katlama ifadesini tanımlar (bkz. ):

  • Girintili satırlardan hemen önceki satırlar için, izleyen bloğun girintisini döndürür.
  • Girintili çizgiler için girintiyi döndürür. (Her girinti düzeyi döndürülen değeri 1 arttırır, böylece kaydırma genişliğine bölünür)
  • Girintili satır bloğunun sonundaki satırlar için, "<N"N girintiye ayarlandığı bir dize döndürür . Bu bir seviyede N kat olduğu Vim anlatır yüzeyler bu hatta.

Güncelleme

@alxndr yorumlarda bunu Ruby'nin modası geçmişleri endkıvrımlara dahil etmek için genişletmenin mümkün olup olmadığını sorar . " Calculate indent levelBölümü aşağıdaki ile değiştirerek başlayabilirsiniz :

if indent_below > indent
    return indent_below
elseif getline(a:line_number) =~ '^\s*end\s*$'
    return "<" . (indent + 1)
else
    return indent
endif

Olduğu gibi, bu en sağlam çözüm değildir (örneğin, enddeyim aynı satırda, noktalı virgülden sonra olursa başarısız olur ). Bunu ele almak için normal ifadeyi ve çevresindeki kodu düzenleyebilirsiniz, ancak şu anda dosyanın gerçek sözdizimini ayrıştırma alanları içinde olduğunuzdan, iyi bir çözüm bulmadan önce işlerin çok daha karmaşık olabileceğinden şüpheleniyorum.


Harika bir yaklaşım. Bu cevap, Ruby'yi endbir bloğu bitirmek için geride bırakmış olarak da ele almak için genelleştirilebilir mi?
alxndr

1
@alxndr Cevabımı bazı tartışmalarla düzenledim.
Zengin

@Rich: Ayrıca ...satır sonunda sadece katlanmış bir metin bloğunun sembolü olarak bir işaret gösteren Sublime text fold'u çok yararlı ve vim'deki gibi tüm metin bloğunun tüm satırını vurgulamaktan daha az dikkat dağıtıcı buluyorum. Yukarıdaki katınızı vim'in varsayılan katlama davranışı ile denedim, basit çalışmıyor. Python ile metin bloğunun ilk satırında bir işaret veren katlama nasıl yapılır? Yeni bir soru açmalı mıyım? Sadece katını tekrar test ediyorum, aslında girinti çizgisi ile çok iyi çalışıyor. Süper teşekkürler.
Tuyen Pham

Bu harika! Katlama gibi org modu yapan bir şey arıyordum ve bu çok yardımcı oluyor!
priomsrb
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.