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

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

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

function FUNCNAME (arg1, arg2) {

но нет переменных или функциональных объектов, определенных как:

var myFunc = function (arg1, arg2) {

Итак, я немного искал googled и нашел следующее определение для 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.

Помогите оценить!

Ответ 1

Получил! Я немного покачу код 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'

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

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

Изменить 2: Добавлены дополнительные определения массивов и объектов в регулярное выражение ctags.

Ответ 2

Я столкнулся с этим сообщением в поиске 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 или что-то имеет определенные значения по умолчанию, и если вы не измените его, тогда вы получите много парней, в которых работают функции и vars, что действительно приводит меня в бешенство (я уделяю большое внимание деталям..: P)

Изменить: дополнительные настройки. Он теперь собирает объявления прототипов функций и не делает каких-либо других глупых вещей.

Ответ 4

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

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

Это предполагает, что ctags 'kind' является 'f' для функции и 'm' для метода. Посмотрите на свой файл тегов и посмотрите, как выглядит столбец "kind". В качестве примера мой файл тегов кода C включает в себя эту строку:

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

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

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

Ответ 5

Привет, спасибо Том Фрост за его вопрос и исследования, я думаю, что есть небольшая проблема с 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/

PD. Остальные ответы "regexps, размещенные здесь, не работают вообще для меня: -?

Ответ 6

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

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