Daftar tipe file yang dikenal

54

Bagaimana saya bisa mendapatkan daftar nama tipe file yang saat ini diketahui vim?

Saya ingin dapat melakukan ini sehingga ketika vim tidak secara otomatis mendeteksi tipe file saya dapat mencoba beberapa tipe file yang diketahui vim tentang hal itu mungkin sama dan melihat apakah mereka memberikan highlight sintaksis yang masuk akal.

Saya tahu bahwa file vimscript yang berhubungan dengan tipe file dimasukkan ke dalam ftplugindirektori oleh konvensi tetapi mereka tidak perlu (saya tidak yakin, tapi saya tidak berpikir file vimscript dalam ftplugindirektori itu spesial) jadi saya ingin hanya tanyakan kepada vim jenis file apa yang diketahuinya, terlepas dari bagaimana mereka mengetahui tentang mereka.

Praxeolitic
sumber
1
Anda dapat melihat daftar ketika Anda mencoba untuk melengkapi otomatis :setfiletype (yaitu dengan Tabsetelah spasi). Tidak yakin apakah ini daftar lengkap, atau bagaimana cara menangkapnya ke beberapa buffer / file.
VanLaser
1
Gunakan <c-d>alih-alih <tab>untuk daftar penyelesaian.
Peter Rincker
Ketikkan huruf atau beberapa untuk memfilter daftar dan menampilkan entri yang dimulai dengan huruf-huruf ini.
Shamaoke

Jawaban:

63

Solusi Sederhana

Ketik :setfiletype (dengan spasi sesudahnya) , lalu tekan Ctrl-d.

Lihat :help cmdline-completionlebih lanjut tentang pelengkapan otomatis di baris perintah vim.

Solusi Rumit

Solusi ini menggunakan 'runtimepath'opsi untuk mendapatkan semua direktori sintaks yang tersedia, dan kemudian mengambil daftar file vimscript di direktori tersebut dengan ekstensi mereka dihapus. Ini mungkin bukan cara paling aman untuk melakukannya, jadi perbaikan dipersilahkan:

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

Anda kemudian dapat menggunakan fungsi ini dengan cara apa pun yang Anda inginkan, seperti mencetak semua nilai dalam daftar. Anda bisa mencapai itu seperti ini:

for f in GetFiletypes() | echo f | endfor

Perhatikan bahwa ini mungkin bisa dipadatkan sedikit, hanya saja ini agar mudah dibaca. Saya tidak akan menjelaskan setiap fungsi dan perintah yang digunakan di sini, tetapi di sini ada semua halaman bantuan untuk mereka:

  • :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()
Pohon cemara
sumber
1
Saat saya mengetik set filetype<space><c d>, ini menunjukkan kepada saya daftar, tetapi html tidak ada dalam daftar. Java tidak ada dalam daftar. Bagaimana cara menunjukkan nama tipe file dalam arti tipe file yang sesuai dengan konfigurasi format sintaksis?
John Meyer
6
@JohnMeyer: Saya membuat kesalahan yang sama. Perintah ini sebenarnya :setfiletypetanpa ruang khas antara "set" dan "filetype". Anda dapat menemukan lebih banyak info dengan :help :setfiletypedan :help ftdetect.
sanscore
Saya sudah mencoba ini, dan berhasil! btw, saya bisa gunakan :setfiletype ht<Ctrl+D>untuk daftar jenis file dimulai dengan ht, yang menyaring hasil yang tidak diinginkan. :)
pimgeek
19

Jika versi vim Anda cukup baru (v7.4.2011 +), Anda dapat meminta tipe file yang dikenal dengan fungsi yang sekarang dapat kita gunakan untuk membantu mendefinisikan pelengkapan otomatis manual: getcompletion()

:echo getcompletion('', 'filetype')

Jika Anda ingin membatasi daftar untuk tipe file dimulai dengan 'c', Anda akan menelepon

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

dan seterusnya.

Catatan: tidak seperti solusi yang menguraikan nama file dan nama direktori $VIMRUNTIME/{syntax,filetype}/, solusi ini menganalisis 'runtimepath'juga. Sejauh yang saya mengerti, itu tidak melihat tipe file baru didefinisikan / terdaftar dengan cepat set ft=foobar, atau setelah perintah otomatis.

Luc Hermitte
sumber
3

Anda juga dapat mencetak semua jenis file di terminal dengan menjalankan 2 perintah berikut:

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 '.'

Perintah pertama hanya menavigasi ke jalur runtime vim Anda (bagi saya itu adalah / usr / share / vim / vim80 ).

Perintah kedua mencantumkan semua nama tipe file dalam dua folder tempat vim menyimpan definisi tipe file.

Memperbarui

Perbaikan yang disarankan untuk dua perintah oleh muru yang menawarkan:

1.

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

2.

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Samir Alajmovic
sumber
3
Itu waaaay pipa yang terlalu rumit. Menggunakan truntuk mengkonversi baris baru ke null hanya untuk mengubahnya kembali perintah berikutnya, proses substitusi ketika pengelompokan perintah sederhana akan dilakukan. Saya sarankan sesuatu seperti:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru
Bagus, jauh lebih ringkas. Adakah solusi yang lebih baik untuk menemukan nilai VIMRUNTIME dari terminal juga?
Samir Alajmovic
1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Kupikir.
muru
1
Astaga. Perintah kedua itu menakutkan. Maaf. Aku tidak baik. ;) Untuk bersenang-senang, inilah alternatif Bash untuk saran Muru yang menggunakan hanya satu perintah eksternal (dengan asumsi printfadalah builtin a): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Lihat "Ekspansi Parameter" di halaman manual Bash untuk penjelasan tentang hieroglif.
B Layer
Ini akan memberi Anda seperti plugin filetype psuedo bash, yang 'bukan plugin filetype nyata ... dan mendapatkan efek dari filetype "sh"'
jeremysprofile
0

Coba lihat dalam $ VIMRUNTIME / sintaks. Gunakan: echo $ VIMRUNTIME untuk mengetahui nilainya. Di komputer saya, $ VIMRUNTIME / sintaks adalah / usr / share / vim / vim81 / syntax. Ia memiliki semua file sintaks.

Jika Anda memiliki vim dengan gui, Anda juga dapat menggunakan menu Sintaks untuk mendapatkan semua tipe file yang didukung.

silversilva
sumber