Como posso fazer com que o plugin taglist do vim mostre informações úteis para javascript?

StackOverflow https://stackoverflow.com/questions/1790623

  •  22-09-2019
  •  | 
  •  

Pergunta

Recentemente abandonei editores de GUI específicos de plataforma e acionados por mouse e me comprometi inteiramente com o vim.A experiência até agora tem sido fantástica, mas estou travado quando se trata de Javascript.

O sempre popular utilitário taglist (usando Exuberant Ctags) tem sido ótimo para tudo, menos Javascript.Com a forma e a estrutura excessivamente livres da linguagem, o taglist só conseguiu pegar algumas funções quando eu o abri - apenas aquelas definidas no formato:

function FUNCNAME (arg1, arg2) {

mas nenhuma variável ou objeto de função definido como:

var myFunc = function (arg1, arg2) {

Então pesquisei um pouco no Google e encontrei o seguinte conjunto de definições para ctags, que coloquei em meu arquivo ~/.ctags:

--langdef=js
--langmap=js:.js
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/,object/
--regex-js=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/,function/
--regex-js=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*([^])])/\1/,function/
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/,array/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/,string/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/,string/

Depois disso, executar ctags na linha de comando foi fantástico.Ele encontrou todas as funções e objetos que eu precisava encontrar.

O problema é que o plugin taglist.vim não está vendo esses novos resultados.Quando abro meu arquivo javascript no vim e clico em :TlistToggle, obtenho exatamente o mesmo punhado de funções que obtive antes.Cliquei em 'u' para atualizar a lista, sem efeito.

Pesquisando em taglist.vim, encontrei isto:

" java language
let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' .
                               \ 'f:field;m:method'

" javascript language
let s:tlist_def_javascript_settings = 'javascript;f:function'

...o que implica que estamos olhando apenas para um tipo específico de saída do utilitário ctags para javascript.Infelizmente, não sou experiente o suficiente com taglist ou vim em geral (ainda) para descobrir que mudanças posso fazer para que todos aqueles maravilhosos resultados de linha de comando ctags apareçam no vim.

Ajuda apreciada!

Foi útil?

Solução

Entendi!Mergulhei no código taglist.vim por um tempo e foi isso que encontrei:

taglist.vim força os ctags a usar o mesmo tipo de arquivo que o vim está usando.Portanto, embora o trecho ~/.ctags que encontrei no Google esteja atribuindo minhas definições necessárias à nova linguagem "js" e aplicando-as a arquivos que terminam em .js, taglist está forçando os ctags a usar o tipo de arquivo "JavaScript" que o vim está usando - que já está embutido no ctags.

A solução é alterar o arquivo ~/.ctags do que postei acima para este:

--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Object\(/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/f,function/
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Array\(/\1/a,array/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/a,array/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/s,string/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/s,string/

que altera diretamente a definição de linguagem JavaScript pré-existente, em vez de criar uma nova definição de linguagem dentro dos ctags.Agora, quando taglib força o tipo de arquivo registrado do vim, as novas definições são usadas.Também faltando nas linhas ~/.ctags postadas anteriormente estava a carta "gentil" que Al mencionou em sua resposta, portanto, elas também estão incluídas em minha versão atualizada.

A partir daí, coloque o seguinte em seu ~/.vimrc para ativar os novos tipos:

let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function'

Resumindo, as novas linhas regex não são perfeitas - elas definitivamente precisarão de alguns ajustes para evitar muitos falsos positivos, e pode ser bom separar constantes e coisas assim.Mas agora, pelo menos, tenho capacidade para fazer isso :).

Editar: Adicionadas instruções sobre como ativar tipos sem editar o plugin e melhorou bastante o regex da função principal ctags para evitar alguns falsos positivos.

Editar 2: Adicionadas mais definições de array e objeto ao regex ctags.

Outras dicas

Encontrei este post em uma pesquisa no Google e, embora suas descobertas sejam excelentes, acho que podemos melhorá-las.Este é o resultado de um pouco de hacking em sua solução:

.ctags

--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \[/\1/a,array/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \{/\1/o,object/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = (^{^[)+/\1/r,var/
--regex-JavaScript=/^[ \t]*(this\.)?([A-Za-z0-9_$()]+)[ \t]*[:=][ \t]*function[ \t]*\(\)/\2/u,function/
--regex-JavaScript=/^[ \t]*function ([a-z0-9]+[A-Za-z0-9_]*)/\1/u,function/
--regex-JavaScript=/^[ \t]*([A-Za-z0-9]+)\.prototype\.([a-z0-9]+[A-Za-z0-9_]*)/\1 : \2/u,function/
--regex-JavaScript=/^[ \t]*function ([A-Z]+[A-Za-z0-9_]*)/\1/o,object/

.vimrc

let g:tlist_javascript_settings = 'javascript;r:var;s:string;a:array;o:object;u:function'

Isso elimina mais alguns falsos positivos e adiciona mais alguns recursos, como uma compensação para se livrar de algumas das expressões regulares mais problemáticas.Continuarei atualizando se achar que preciso de mais.

Editar:Fiz tudo funcionar muito bem agora;Sinto que esse resultado é sólido.A única grande deficiência é que ele não funciona em definições de variáveis ​​separadas por vírgula.Isso parece particularmente desagradável.Talvez outro dia.:)

Observe também que mudei o .vimrc.Isto não é porque eu sou uma aberração;é porque de alguma forma taglist ou ctags ou algo assim tem alguns valores padrão definidos, e se você não alterá-los, você obterá muitas duplicatas no que diz respeito a funções e vars, o que realmente me deixa louco (eu presto muita atenção aos detalhes. .:P)

Editar:Mais ajustes.Ele pega declarações de funções de protótipo agora e não faz outras coisas estúpidas.

A solução de práticas recomendadas, que também é uma maneira muito nova, simples e fácil de obter navegação no código-fonte / lista de tags JavaScript no Vim, é usar o Mozilla Doutor JS (anteriormente conhecido como jsctags).

Veja minha resposta para esta pergunta para mais informações.

Aproveitar.:)

Não usei muito javascript ou taglist, mas olhando :help taglist-extend, parece que suas definições (listadas acima) renomearam a saída javascript para js, então você provavelmente precisará de algo como (no seu vimrc):

let tlist_js_settings = 'js;f:function;m:method'

Isso pressupõe que o 'tipo' das ctags seja 'f' para função e 'm' para método.Dê uma olhada no seu arquivo de tags e veja como é a coluna 'tipo'.A título de exemplo, meu arquivo de tags de código C inclui esta linha:

ADC_CR1_AWDCH_0 .\LibraryModules\CMSIS\Headers\stm32f10x.h  2871;"  d

Isto é um #define de um símbolo ADC_CR1_AWDCH_0, que está no arquivo listado na linha 2871.O 'd' é o 'tipo' do ctags para um nome definido.Esperançosamente, isso lhe dará o suficiente para você seguir em frente.

Além disso, não tenho certeza se a substituição funcionará corretamente, então pode valer a pena nomear seu arquivo como 'myfile.mjs' e alterar seu langmap para js:.mjs até que esteja funcionando corretamente.Assim, pelo menos você saberá se seus problemas estão associados à identificação incorreta de arquivos ou à análise real.

Olá, obrigado a Tom Frost por sua pergunta e pesquisa. Acho que há um pequeno problema com o regexp da 4ª linha de sua resposta final:

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/

Não funcionou para mim, puxei um pouco e agora funciona bem:

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\)]*\)/\1/f,function/

PD.As expressões regulares das outras respostas postadas aqui não funcionam, pelo menos para mim :-?

Para evitar entradas duplicadas do suporte javascript integrado dos ctags, defino a linguagem 'js' como na postagem original e ajudo a taglist a usar ctags com ela.Também me certifico de que os tagnames sejam removidos de alguns bits menos úteis (aspas, "this.", ".prototype").Eu não uso regexps de objeto/matriz/string/var, mas é fácil combinar minhas regexps com as outras sugestões.

~/.ctags:

--langdef=js
--langmap=js:.js
--regex-js=/["']?(this\.)?([A-Za-z0-9_$]+)["']?((\.prototype)?(\.[A-Za-z0-9_$]+))?[ \t]*[:=][ \t]*function/\2\5/f,function/
--regex-js=/function[ \t]+([A-Za-z0-9_$]+)/\1/f,function/

~/.vimrc:

let g:tlist_javascript_settings = 'js;f:function'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top