كيف يمكنني جعل مكون الإضافي Tagin's Vim's Tagin يعرض معلومات مفيدة لـ JavaScript؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

لقد تخليت مؤخرًا عن محرري واجهة المستخدم الرسومية الخاصة بالماوس المدفوعة بالماوس وملتزمون بالكامل بـ VIM. كانت التجربة حتى الآن رائعة ، لكنني عالق عندما يتعلق الأمر بجافا سكريبت.

كانت الأداة المساعدة TagList ذات الشعبية (باستخدام 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 على استخدام نفس filetype التي يستخدمها VIM. لذا ، على الرغم من أن مقتطف ~/.ctags الذي وجدته عبر Google يعين تعريفي الذي تمس الحاجة إليه على لغة "JS" الجديدة وتطبيقه على الملفات التي تنتهي في .js ، فإن TAGLIS يستخدم 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'

الكل في الكل ، خطوط Regex الجديدة ليست مثالية-ستحتاج بالتأكيد إلى بعض التغيير والتبديل لتجنب الكثير من الإيجابيات الخاطئة ، وقد يكون من الجيد فصل الثوابت وما شابه. لكن الآن ، على الأقل ، لدي القدرة على القيام بذلك :).

تعديل: الإضافة الإضافية حول كيفية تنشيط الأنواع دون تحرير المكون الإضافي ، وتحسين وظيفة CTAGS الرئيسية بشكل كبير لتجنب بعض الإيجابيات الخاطئة.

تحرير 2: تمت إضافة المزيد من تعريفات الصفيف والكائن إلى CTAGS regex.

نصائح أخرى

واجهت هذا المنشور على بحث Google ، وعلى الرغم من أن النتائج التي توصلت إليها ممتازة ، أعتقد أنه يمكننا تحسينها. هذه هي نتائج القليل من الاختراق على الحل الخاص بك:

--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 بطريقة أو بأخرى أو شيء يحتوي على بعض القيم الافتراضية ، وإذا لم تقم بتغييره ، فستحصل على الكثير من الزوجي حيث يتعلق الأمر بالوظائف والمتغيرات ، مما يدفعني حقًا إلى الجنون (أولي اهتمامًا كبيرًا بالتفاصيل. .: P)

تعديل: المزيد من التعديلات. إنها تلتقط إعلانات وظيفة النموذج الأولي الآن ، ولا تفعل بعض الأشياء الغبية الأخرى.

إن الحل الأفضل الممارسات ، وهو أيضًا طريقة جديدة جدًا وأنيقة وسهلة للحصول على قائمة تصفح / وضع العلامات المصدر JavaScript في VIM ، يستخدم Mozilla's دكتوراه (معروف سابقا ب JSCTAGS).

انظر إجابتي لهذا السؤال لمزيد من المعلومات.

يتمتع. قون

لم أستخدم javaScript أو قائمة TAGL :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" وتغيير langmap الخاص بك js:.mjs حتى تعمل بشكل صحيح. ثم على الأقل ستعرف ما إذا كانت مشاكلك مرتبطة بتحديدط الملفات أو التحليل الفعلي.

مرحبًا ، شكرًا لتوم فروست على سؤاله وأبحاثه ، أعتقد أن هناك مشكلة صغيرة في خط السطر الرابع لإجابتك النهائية:

--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 المنشور هنا لا تعمل على الإطلاق على الأقل بالنسبة لي:-؟

لتجنب الإدخالات المكررة من CTAGS "مدمجة في دعم JavaScript ، أقوم بتحديد لغة" JS "كما هو الحال في المنشور الأصلي ومساعدة قائمة TagList في استخدام CTAGs معها. أتأكد أيضًا من تجريد TagNames من بعض البتات الأقل فائدة (اقتباسات ، "هذا" ، ". لا أستخدم كائن/صفيف/سلسلة/var regexps ، لكن من السهل الجمع بين 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'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top