Elencare i tipi di file noti


54

Come posso ottenere un elenco dei nomi dei tipi di file che Vim attualmente conosce?

Voglio essere in grado di farlo in modo tale che quando vim non rileva automaticamente un tipo di file, posso provare alcuni dei tipi di file che Vim sa che potrebbero essere simili e vedere se forniscono l'evidenziazione della sintassi ragionevole.

So che i file vimscript relativi ai tipi di file vengono inseriti nella ftplugindirectory per convenzione, ma non è necessario (non sono sicuro, ma non credo che i file vimscript nella ftplugindirectory siano speciali), quindi voglio solo chiedi a Vim quali tipi di file conosce, indipendentemente da come ne sia venuto a conoscenza.


1
È possibile visualizzare un elenco quando si tenta di completare automaticamente :setfiletype (ovvero con Tabdopo uno spazio). Non sono sicuro se si tratta dell'elenco completo o di come acquisirlo in un buffer / file.
VanLaser,

1
Utilizzare <c-d>invece di <tab>per elencare i completamenti.
Peter Rincker,

Digita una o più lettere per filtrare l'elenco e mostrare le voci che iniziano con queste lettere.
Shamaoke,

Risposte:


63

Soluzione semplice

Digitare :setfiletype (con uno spazio dopo) , quindi premere Ctrl-d.

Per :help cmdline-completionulteriori informazioni sul completamento automatico, consultare la riga di comando di vim.

Soluzione complicata

Questa soluzione utilizza l' 'runtimepath'opzione per ottenere tutte le directory di sintassi disponibili, quindi recupera un elenco dei file vimscript in quelle directory con le loro estensioni rimosse. Questo potrebbe non essere il modo più sicuro per farlo, quindi i miglioramenti sono i benvenuti:

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

È quindi possibile utilizzare questa funzione nel modo desiderato, ad esempio stampando tutti i valori nell'elenco. Potresti farlo in questo modo:

for f in GetFiletypes() | echo f | endfor

Si noti che probabilmente questo può essere compattato un po ', è proprio così per leggibilità. Non spiegherò tutte le funzioni e i comandi utilizzati qui, ma qui ci sono tutte le pagine di aiuto per loro:

  • :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
Quando scrivo set filetype<space><c d>, mi mostra un elenco, ma html non è nell'elenco. Java non è nell'elenco. Come faccio a mostrare i nomi dei tipi di file nel senso dei tipi di file che corrispondono alle configurazioni di formattazione della sintassi?
John Meyer,

6
@JohnMeyer: ho fatto lo stesso errore. Il comando è in realtà :setfiletypesenza lo spazio tipico tra "set" e "filetype". Puoi trovare maggiori informazioni con :help :setfiletypee :help ftdetect.
Sanscore,

L'ho provato e funziona! btw, posso usare :setfiletype ht<Ctrl+D>per elencare il tipo di file che inizia con ht, che filtra i risultati indesiderati. :)
pimgeek,

19

Se la tua versione di vim è abbastanza recente (v7.4.2011 +), puoi chiedere tipi di file noti con la funzione che ora possiamo usare per aiutare a definire il completamento automatico manuale: getcompletion()

:echo getcompletion('', 'filetype')

Se si desidera limitare l'elenco ai tipi di file che iniziano con un 'c', si chiamerebbe

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

e così via.

Nota: a differenza delle soluzioni che analizzano i nomi di file e di directory $VIMRUNTIME/{syntax,filetype}/, anche questa soluzione analizza 'runtimepath'. Per quanto ho capito, non vede nuovi tipi di file definiti / registrati al volo con set ft=foobar, né dopo i autocomandi.


3

Puoi anche stampare tutti i tipi di file nel terminale eseguendo i seguenti 2 comandi:

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

Il primo comando passa semplicemente al tuo percorso di runtime di vim (per me era / usr / share / vim / vim80 ).

Il secondo comando elenca tutti i nomi dei tipi di file nelle due cartelle in cui vim memorizza le definizioni dei tipi di file.

Aggiornare

Miglioramenti suggeriti ai due comandi di muru che offrono:

1.

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

2.

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

3
Questo è un gasdotto troppo complicato. Usando trper convertire newline in null solo per riconvertirlo al comando successivo, elaborare la sostituzione quando farebbe un semplice raggruppamento di comandi. Suggerirei qualcosa del tipo:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Muru,

Bello, molto più succinto. Qualche soluzione migliore per trovare il valore VIMRUNTIME anche dal terminale?
Samir Alajmovic, il

1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Penso.
Muru,

1
Yikes. Quel secondo comando è spaventoso. Scusate. Non sono carino. ;) Per divertimento, ecco una Bash alternativa al suggerimento di Muru che usi un solo comando esterno (supponendo che printfè un built-in): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Vedere "Espansione dei parametri" nella pagina man di Bash per una spiegazione dei geroglifici.
B Layer,

Questo ti darà i plug-in del tipo di file psuedo come bash, che non e 'un vero plug-in di tipo di file ... e ottiene l'effetto del tipo di file "sh"'
jeremysprofile

0

Prova a vedere in $ VIMRUNTIME / sintassi. Usa: echo $ VIMRUNTIME per conoscerne il valore. Nel mio computer, $ VIMRUNTIME / sintassi era / usr / share / vim / vim81 / sintassi. Ha tutti i file di sintassi.

Se hai un vim con gui, puoi anche usare il menu Sintassi per ottenere tutti i tipi di file supportati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.