Bilinen dosya türlerini listeleme


54

Vim'in halihazırda bildiği filetypes adlarının listesini nasıl alabilirim?

Bunu yapabilmek istiyorum, böylece vim otomatik olarak bir dosya türünü algılamıyorsa, bazı benzer dosya türlerini deneyebilirim.

Filetolarla ilgili vimscript dosyalarının ftpluginkongre tarafından dizine konulduğunu biliyorum ama olmaları gerekmiyor (emin değilim ama dizindeki vimscript dosyalarının ftpluginözel olduğunu sanmıyorum ) bu yüzden sadece Vim'e, ne hakkında öğrendiklerinden bağımsız olarak, hangi dosya türlerini bildiğini sorun.


1
Otomatik tamamlamaya çalıştığınızda bir listeyi görüntüleyebilirsiniz :setfiletype (örn Tab. Bir boşluktan sonra). Listenin tam olup olmadığından veya bir arabellek / dosyaya nasıl alınacağından emin değil.
VanLaser

1
Tamamlamaları listelemek için <c-d>yerine kullanın <tab>.
Peter Rincker

Listeyi filtrelemek ve bu harflerle başlayan girişleri göstermek için bir harf veya birkaç yazın.
Shamaoke,

Yanıtlar:


63

Basit bir çözüm

Tip :setfiletype (sonradan boşlukla) , ardından Ctrl-d.

:help cmdline-completionVim'in komut satırında otomatik tamamlama hakkında daha fazla bilgi için bkz .

Karmaşık Çözüm

Bu çözüm kullanılabilir 'runtimepath'tüm sözdizimi dizinlerini almak için bu seçeneği kullanır ve ardından uzantıları kaldırılmış olarak bu dizinlerdeki vimscript dosyalarının bir listesini getirir. Bu, bunu yapmanın en güvenli yolu olmayabilir, bu yüzden iyileştirmeler memnuniyetle karşılanır:

function! GetFiletypes()
    " Get a list of all the runtime directories by taking the value of that
    " option and splitting it using a comma as the separator.
    let rtps = split(&runtimepath, ",")
    " This will be the list of filetypes that the function returns
    let filetypes = []

    " Loop through each individual item in the list of runtime paths
    for rtp in rtps
        let syntax_dir = rtp . "/syntax"
        " Check to see if there is a syntax directory in this runtimepath.
        if (isdirectory(syntax_dir))
            " Loop through each vimscript file in the syntax directory
            for syntax_file in split(glob(syntax_dir . "/*.vim"), "\n")
                " Add this file to the filetypes list with its everything
                " except its name removed.
                call add(filetypes, fnamemodify(syntax_file, ":t:r"))
            endfor
        endif
    endfor

    " This removes any duplicates and returns the resulting list.
    " NOTE: This might not be the best way to do this, suggestions are welcome.
    return uniq(sort(filetypes))
endfunction

Ardından bu işlevi listedeki tüm değerlerin yazdırılması gibi istediğiniz şekilde kullanabilirsiniz. Öyle başarabilirsin:

for f in GetFiletypes() | echo f | endfor

Bunun muhtemelen biraz sıkıştırılabileceğine dikkat edin, okunabilirlik için tam da böyle. Burada kullanılan her işlevi ve komutu açıklamayacağım, ancak işte onlar için yardım sayfalarının tümü:

  • :help 'runtimepath'
  • :help :let
  • :help :let-&
  • :help split()
  • :help :for
  • :help expr-.
  • :help :if
  • :help isdirectory()
  • :help glob()
  • :help fnamemodify()
  • :help add()
  • :help uniq()
  • :help sort()

1
Yazarken set filetype<space><c d>, bana bir liste gösterir, ancak html listede yok. Java listede yok. Dosya türü adlarını sözdizimi biçimlendirme yapılandırmalarına karşılık gelen dosya türü anlamında nasıl gösteririm?
John Meyer,

6
@JohnMeyer: Ben de aynı hatayı yaptım. Komut aslında :setfiletype"set" ve "filetype" arasındaki tipik boşluk olmadan. :help :setfiletypeVe ile daha fazla bilgi bulabilirsiniz :help ftdetect.
sanscore

Bunu denedim ve işe yarıyor! btw, :setfiletype ht<Ctrl+D>istenmeyen sonuçları filtreleyen ht ile başlayan dosya tipini listelemek için kullanabilirim . :)
pimgeek

18

Eğer vim sürümünüz yeterince yeni ise (v7.4.2011 +), manuel otomatik tamamlamanın tanımlanmasına yardımcı olmak için şimdi kullanabileceğimiz fonksiyon ile bilinen dosya tiplerini isteyebilirsiniz: getcompletion()

:echo getcompletion('', 'filetype')

Listeyi a ile başlayan dosya tipleriyle sınırlamak istiyorsanız 'c',

:echo getcompletion('c', 'filetype')

ve bunun gibi.

Not: Dosya adlarını ve dizin adlarını ayrıştıran çözümlerin aksine $VIMRUNTIME/{syntax,filetype}/, bu çözüm de analiz eder 'runtimepath'. Anladığım kadarıyla set ft=foobar, ne anında ne de otomatik komutlardan sonra tanımlanmış / kaydedilmiş yeni dosya türlerini görmüyor .


3

Aşağıdaki 2 komutu çalıştırarak da terminaldeki tüm dosya türlerini yazdırabilirsiniz:

1.

cd $(vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '\015')

2.

cat <(ls -1 ftplugin/*.vim) <(ls -1 syntax/*.vim) | tr '\n' '\0' | xargs -0 -n 1 basename | sort | uniq | cut -f 1 -d '.'

İlk komut basitçe vim çalışma zamanı yolunuza gider (benim için / usr / share / vim / vim80 idi ).

İkinci komut, vim'in dosya tipi tanımlarını sakladığı iki klasördeki tüm dosya tipi adlarını listeler.

Güncelleme

Muru tarafından sunulan iki komut için önerilen iyileştirmeler:

1.

cd $(vim -Nesc '!echo $VIMRUNTIME' -c qa)

2.

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u

3
Bu çok sıkıntılı bir boru hattını karmaşıklaştırıyor. Yeni trsatırları null'a dönüştürmek için yalnızca bir sonraki komutu geri dönüştürmek için kullanmak, basit komut gruplandırması yapıldığında işlemi değiştirme. Gibi bir şey öneriyorum:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru

Güzel, çok daha özlü. Terminalden VIMRUNTIME değerini bulmak için daha iyi bir çözüm var mı?
Samir Alajmoviç

1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Bence.
muru

Amanın. Bu ikinci komut korkutucu. Üzgünüm. Ben kibar değilim ;) Eğlenmek için buraya varsayarak sadece bir dış komut kullanır MURU önerisine bir Bash alternatif (var printf) bir yerleşik olduğu: f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Hiyerogliflerin açıklaması için Bash man sayfasındaki "Parametre Genişletme" bölümüne bakın.
B Katmanı

Bu size bash, 'gerçek bir filetype eklentisi değil ...' ve filetype "sh" 'nin etkisi olan psuedo filetype eklentilerini verecek
jeremysprofile
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.