Listar tipos de arquivos conhecidos

54

Como posso obter uma lista dos nomes de tipos de arquivos que o vim conhece atualmente?

Quero poder fazer isso para que, quando o vim não detecte automaticamente um tipo de arquivo, eu possa experimentar alguns dos tipos de arquivos que o vim sabe que podem ser semelhantes e ver se eles fornecem realce razoável de sintaxe.

Eu sei que os arquivos vimscript que lidam com tipos de arquivos são colocados no ftplugindiretório por convenção, mas eles não precisam ser (não tenho certeza, mas não acho que os arquivos vimscript no ftplugindiretório sejam especiais), então eu quero apenas pergunte ao vim quais tipos de arquivos ele conhece, independentemente de como aprendeu sobre eles.

Praxeolitic
fonte
11
Você pode visualizar uma lista ao tentar completar automaticamente :setfiletype (ou seja, Tabapós um espaço). Não tenho certeza se é a lista completa ou como capturá-la em algum buffer / arquivo.
VanLaser
11
Use em <c-d>vez de <tab>para listar conclusões.
Peter Rincker
Digite uma letra ou algumas para filtrar a lista e mostrar as entradas que são iniciadas com essas letras.
Shamaoke 15/01/19

Respostas:

63

Solução Simples

Digite :setfiletype (com um espaço depois) e pressione Ctrl-d.

Veja :help cmdline-completionpara mais informações sobre o preenchimento automático na linha de comando do vim.

Solução complicada

Esta solução usa a 'runtimepath'opção de obter todos os diretórios de sintaxe disponíveis e, em seguida, busca uma lista dos arquivos vimscript nesses diretórios com suas extensões removidas. Esta pode não ser a maneira mais segura de fazê-lo, portanto, as melhorias são bem-vindas:

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

Você pode usar esta função da maneira que desejar, como imprimir todos os valores da lista. Você poderia fazer isso assim:

for f in GetFiletypes() | echo f | endfor

Observe que isso provavelmente pode ser compactado um pouco, é assim para facilitar a leitura. Não explicarei todas as funções e comandos usados ​​aqui, mas aqui estão todas as páginas de ajuda para eles:

  • :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()
EvergreenTree
fonte
11
Quando digito set filetype<space><c d>, ele me mostra uma lista, mas o html não está na lista. Java não está na lista. Como mostro nomes de tipos de arquivos no sentido de tipos de arquivos que correspondem às configurações de formatação da sintaxe?
John Meyer
6
@ JohnMeyer: Cometi o mesmo erro. O comando é, na verdade, :setfiletypesem o espaço típico entre "set" e "filetype". Você pode encontrar mais informações com :help :setfiletypee :help ftdetect.
sanscore
Eu tentei isso, e funciona! btw, eu posso usar :setfiletype ht<Ctrl+D>para listar o tipo de arquivo começando com ht, que filtra resultados indesejados. :)
pimgeek
19

Se sua versão do vim é recente o suficiente (v7.4.2011 +), você pode solicitar tipos de arquivos conhecidos com a função que agora podemos usar para ajudar a definir o preenchimento automático manual: getcompletion()

:echo getcompletion('', 'filetype')

Se você deseja restringir a lista a tipos de arquivos começando com a 'c', chame

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

e assim por diante.

Nota: ao contrário das soluções que analisam os nomes de arquivos e diretórios $VIMRUNTIME/{syntax,filetype}/, esta solução também analisa 'runtimepath'. Tanto quanto eu entendo, ele não vê novos tipos de arquivos definidos / registrados em tempo real com set ft=foobar, nem após comandos automáticos.

Luc Hermitte
fonte
3

Você também pode imprimir todos os tipos de arquivos no terminal executando os 2 comandos a seguir:

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

O primeiro comando simplesmente navega para o caminho do tempo de execução do vim (para mim era / usr / share / vim / vim80 ).

O segundo comando lista todos os nomes de tipo de arquivo nas duas pastas em que o vim armazena as definições de tipo de arquivo.

Atualizar

Melhorias sugeridas para os dois comandos do muru que oferecem:

1

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

2)

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Samir Alajmovic
fonte
3
Isso é muito complicado um pipeline. Usando trpara converter novas linhas em nulo apenas para convertê-lo de volta no próximo comando, processe a substituição quando um agrupamento de comandos simples for suficiente. Eu sugiro algo como:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Muru
Bom, muito mais sucinto. Alguma solução melhor para encontrar o valor VIMRUNTIME também do terminal?
Samir Alajmovic 26/01
11
vim -Nesc '!echo $VIMRUNTIME' -c qa, Eu acho que.
muru
11
Caramba. Esse segundo comando é assustador. Desculpa. Eu não estou sendo legal. ;) Para se divertir, aqui está uma alternativa Bash à sugestão de Muru que usa apenas um comando externo (assumindo que printfé um builtin): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Consulte "Expansão de parâmetros" na página do manual Bash para obter uma explicação dos hieróglifos.
Camada B:
Isso fornecerá a você plugins do tipo de arquivo psuedo bash, que 'não é um plug-in de tipo real ... e obtém o efeito do tipo de arquivo "sh"'
jeremysprofile 30/07
0

Tente ver em $ VIMRUNTIME / sintaxe. Use: echo $ VIMRUNTIME para saber seu valor. No meu computador, $ VIMRUNTIME / syntax era / usr / share / vim / vim81 / syntax. Possui todos os arquivos de sintaxe.

Se você tem um vim com GUI, também pode usar o menu Sintaxe para obter todos os tipos de arquivos suportados.

silversilva
fonte