Как я могу заставить плагин taglist vim отображать полезную информацию для javascript?

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

  •  22-09-2019
  •  | 
  •  

Вопрос

Недавно я отказался от графических редакторов с графическим интерфейсом, управляемых мышью, и полностью посвятил себя vim.Пока что опыт был фантастическим, но я застрял, когда дело доходит до Javascript.

Популярная утилита taglist (с использованием Exuberant Ctags) отлично подходит для всего, кроме Javascript.Из-за слишком свободной формы и структуры языка taglist мог подобрать лишь несколько функций, когда я его открыл — только те, которые определены в формате:

function FUNCNAME (arg1, arg2) {

но никакие переменные или функциональные объекты не определены следующим образом:

var myFunc = function (arg1, arg2) {

Итак, я немного погуглил и нашел следующий набор определений для ctags, который я поместил в свой файл ~/.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/

После этого запуск ctags из командной строки стал фантастическим.Он нашел каждую функцию и объект, которые мне нужно было найти.

Проблема в том, что плагин taglist.vim не видит этих новых результатов.Когда я открываю свой файл javascript в vim и нажимаю :TlistToggle, я получаю ту же самую скудную горстку функций, что и раньше.Я нажал «u», чтобы обновить список, но безрезультатно.

Покопавшись в taglist.vim, я нашел это:

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

... это означает, что мы рассматриваем только один конкретный вид вывода утилиты ctags для javascript.К сожалению, я недостаточно разбираюсь в taglist или vim в целом (пока), чтобы понять, какие изменения я могу внести, чтобы все эти замечательные результаты командной строки ctags отображались в vim.

Помощь оценена по достоинству!

Это было полезно?

Решение

Понятно!Я немного покопался в коде taglist.vim и вот что нашел:

taglist.vim заставляет ctags использовать тот же тип файла, что и vim.Таким образом, хотя фрагмент ~/.ctags, который я нашел через Google, присваивает мои столь необходимые определения новому языку «js» и применяет его к файлам, которые заканчиваются на .js, taglist заставляет ctags использовать тип файла «JavaScript», который vim использует -- который уже встроен в ctags.

Решение состоит в том, чтобы изменить файл ~/.ctags с того, что я опубликовал выше, на этот:

--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/

который напрямую изменяет ранее существовавшее определение языка JavaScript, а не создает новое определение языка в ctags.Теперь, когда taglib принудительно использует зарегистрированный тип файла vim, используются новые определения.В ранее опубликованных строках ~/.ctags также отсутствовало «доброе» письмо, о котором Ал упомянул в своем ответе, поэтому оно также включено в мою обновленную версию.

Оттуда поместите следующее в ваш ~/.vimrc, чтобы активировать новые типы:

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

В целом, новые строки регулярных выражений не идеальны — их определенно потребуется немного подправить, чтобы избежать большого количества ложных срабатываний, и, возможно, было бы неплохо отделить константы и тому подобное.Но теперь, по крайней мере, у меня есть возможность это сделать :).

Редактировать: Добавлены инструкции о том, как активировать типы без редактирования плагина, а также значительно улучшено регулярное выражение основной функции ctags, чтобы избежать некоторых ложных срабатываний.

Редактировать 2: В регулярное выражение ctags добавлено больше определений массивов и объектов.

Другие советы

Я наткнулся на этот пост в поиске Google, и хотя ваши результаты превосходны, я думаю, мы можем их улучшить.Это результаты небольшого взлома вашего решения:

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

Это избавляет от еще нескольких ложных срабатываний и добавляет еще несколько функций в качестве компромисса за избавление от некоторых наиболее проблемных регулярных выражений.Я буду продолжать обновлять, если считаю, что мне нужно больше.

Редактировать:Теперь у меня все работает очень хорошо;Я считаю, что этот результат является устойчивым.Единственным существенным недостатком является то, что он не работает с определениями переменных, разделенных запятыми.Это кажется особенно противным.Может быть в другой день.:)

Также обратите внимание, что я изменил файл .vimrc.Это не потому, что я урод;это потому, что каким-то образом taglist или ctags или что-то еще имеют некоторые значения по умолчанию, и если вы их не измените, то вы получите много дублей, когда речь идет о функциях и переменных, что действительно сводит меня с ума (я уделяю огромное внимание деталям. .:П )

Редактировать:Больше настроек.Теперь он учитывает объявления прототипов функций и не делает других глупостей.

Лучшее решение, которое также является новым, аккуратным и простым способом просмотра исходного кода JavaScript / списка тегов в Vim, — это использование Mozilla ДокторJS (ранее известный как jsctags).

Смотрите мой ответ на этот вопрос для получения дополнительной информации..

Наслаждаться.:)

Я не часто использовал JavaScript или список тегов, но просматривал :help taglist-extend, похоже, что ваши определения (перечисленные выше) переименовывают вывод javascript в js, поэтому вам, вероятно, понадобится что-то вроде (в вашем vimrc):

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

Это предполагает, что «вид» ctags равен «f» для функции и «m» для метода.Посмотрите файл тегов и посмотрите, как выглядит столбец «вид».Например, мой файл тегов кода C содержит следующую строку:

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

Это #define символа ADC_CR1_AWDCH_0, который находится в указанном файле в строке 2871.«d» — это «вид» ctags для определенного имени.Надеюсь, этого будет достаточно, чтобы начать работу.

Кроме того, я не уверен, будет ли переопределение работать правильно, поэтому, возможно, стоит назвать ваш файл «myfile.mjs» и изменить вашу языковую карту на js:.mjs пока он не заработает должным образом.Тогда вы хотя бы будете знать, связаны ли ваши проблемы с неправильной идентификацией файлов или с реальным парсингом.

Привет, спасибо Тому Фросту за его вопрос и исследование. Я думаю, что есть небольшая проблема с регулярным выражением 4-й строки вашего окончательного ответа:

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

У меня не сработало, я немного потянул и теперь работает нормально:

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

ПД.Опубликованные здесь регулярные выражения других ответов вообще не работают, по крайней мере, для меня :-?

Чтобы избежать дублирования записей из ctags, встроенной в поддержку javascript, я определяю язык «js», как в исходном сообщении, и помогаю taglist использовать ctags с ним.Я также слежу за тем, чтобы из тэгов были удалены некоторые менее полезные части (кавычки, "this.", ".prototype").Я не использую регулярные выражения объекта/массива/строки/var, но мои регулярные выражения легко комбинировать с другими предложениями.

~/.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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top