Ctags: تُدرج علامات ctags العامة أحرف `utf-8` غير صالحة لملفات معينة

تم إنشاؤها على ٣٠ يوليو ٢٠١٨  ·  7تعليقات  ·  مصدر: universal-ctags/ctags

(
أشكركم على الاتصال بنا.

إذا كنت تبلغ عن مشكلة في تحليل الإخراج ، يرجى ملء
النموذج التالي. كما يمكن تكوين CTags المخصص الخاص بك
تؤثر على النتائج ، يرجى دائمًا استخدام --options=NONE كأول
الخيار عند تشغيل ctags .

وإلا ، فاحذف النموذج واكتب مشكلتك من البداية.
قد تساعد الأمثلة المطورين على فهم مشكلتك بشكل أفضل.

استخدم واجهة ويب GitHub وتدوين تخفيض السعر.
استخدام نتائج البريد عرض النص المقطوع الذي يجعل
المطورين بالجنون.
)


اسم المحلل اللغوي:

سطر الأوامر الذي استخدمته لتشغيل ctags:

$ ctags -R

ليس لدي أي تكوينات خاصة في .ctags أو في أي مكان آخر. هذا جهاز افتراضي جديد تم تشغيل هذا الاختبار عليه.

محتوى ملف الإدخال: https://github.com/pallets/jinja/blob/master/jinja2/_identifier.py

ناتج العلامات الذي لست راضيًا عنه:

Universal-ctags انطواء إدراج utf-8 الأحرف في ظل ظروف معينة.

إخراج العلامات الذي تتوقعه:

ناتج علامة متوقع مع كل أحرف valide utf-8 .

إصدار ctags:

$ ctags --version
Universal Ctags 0.0.0(3522685), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: July 27 1018, 23:16:36
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath

كيف تحصل على ثنائي ctags:

(
تم إنشاء ثنائي ctags على ubuntu-16.04 VM بدون تعديلات بخلاف تثبيت المكتبات الضرورية مثل automate ، autoreconf لتجميع ctags والمكتبات الضرورية لتجميع vim بناءً على https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source#a-for-a-debian-like-linux-distribution-like-ubuntu-type
)

أشار lilydjwg لي إلى أن ctags كان يُدرج أحرفًا غير صالحة utf-8 على الرغم من أن الملف الذي يتم استخدامه لإنشاء العلامات يحتوي على جميع الأحرف utf-8 الصالحة هنا:
https://github.com/vim/vim/issues/3213#issuecomment -406961075

النسخة المجمعة من ctags تعمل بشكل رائع بشكل عام.

اكتشف مؤخرًا ، أنه اتضح أن ctags به خطأ بسبب ملف
قديم Execuberant ctags مثبت بواسطة sudo apt-get install ctags على Ubuntu
16.04 لا يُدرج أي أحرف utf-8 غير صالحة ، لكن إذا قمت بالتجميع
Universal-ctags من المصدر وليس فقط بناءً على التعليمات الواردة هنا:
https://github.com/universal-ctags/ctags/blob/master/docs/autotools.rst ،
سيتم إدراج أحرف utf-8 غير صالحة. ها هي الأدلة:

مع تثبيت exuberant-ctags باستخدام sudo apt-get install ctags :

2018-07-29_19-03-44

مع Universal-ctags مجمعة من المصدر (أحدث التزام) اعتبارًا من هذا المنشور ،
مجمعة بالتعليمات من هنا:
https://github.com/universal-ctags/ctags/blob/master/docs/autotools.rst :

2018-07-29_19-10-22

هذا يسبب الكثير من المشاكل في vim ، لأنه إذا كان غير صالح utf-8 الأحرف
تم تمريره إلى vim.eval ، vim.eval فواصل وهذا يؤدي إلى عدم إرجاع أي علامات عند
الكل. حاليًا ، هناك طريقة واحدة فقط لنقل البيانات الواردة في viml
متغير إلى مساحة python-name ، باستخدام vim.eval . لذلك ، أي مكون إضافي آخر
vim وإلا سيكون لديك مشاكل مماثلة أيضًا. تضمين التغريدة
اضطر المثال إلى معالجة ملف العلامات الخاص به بعد ذلك لإيقاف مثل هذه المشكلات:
https://ludovic.chabant.com/devblog/2017/02/25/aaa-gamedev-with-vim/

كما كان عليه تغيير ctrl-py-matcher للقبض على هذه المشكلة.
https://github.com/ludovicchabant/ctrlp-py-matcher/blob/2f6947480203b734b069e5d9f69ba440db6b4698/autoload/pymatcher.py#L22

هناك العديد من الملفات الأخرى التي رأيتها ولديها مشاكل مماثلة ، لكنني
لقد قدمت للتو واحدة هنا لتضييق نطاق المشكلة.

تخميني هو أن هذا خطأ ، ولا أتوقع أن ctags سيفعل ذلك من خلال
التصميم. هل يمكن تصحيح ذلك ، لأن هذا كان يعمل بشكل جيد في Exuberant Ctags
التي تستند إليها Universal-ctags؟

المرجع: https://github.com/vim/vim/issues/3213#issuecomment -408727629

ال 7 كومينتر

يبدو لي مثل # 1275: الخيار pattern-length-limit يتم قطعه في موضع بايت عشوائي ، والذي يحدث في منتصف تسلسل الأحرف. انظر # 163 و # 640 و # 1018.

ربما يجب تنفيذ شيء مثل https://github.com/universal-ctags/ctags/issues/1275#issuecomment -274489859 لإصلاح ذلك.

@ alphaCTzo7G انظر # 1807 ، هل هذا يصلح لك بشكل صحيح؟

@ b4n ، شكرا لاستجابتك السريعة ...

في الملف الذي قمت بنشره هنا _identifier.py ، باستخدام الالتزام # 1805 ، لم يعد ctags بإدراج أحرف / قطع غير صالحة في موقع عشوائي.

سأجرب هذا العلاقات العامة على نظامي الحقيقي خلال الأيام القليلة القادمة لمعرفة ما إذا كان يعمل مع مستودعاتي بأكملها أو ينبعث منها أخطاء أخرى

نظرًا لأن ctrlp و ctrlp-py-matcher من المكونات الإضافية الشائعة جدًا ، فسيكون رائعًا إذا تم دمج # 1807 حتى يتمكن vim ومستخدمي محرر النصوص الآخرين من استخدام ctrlp و ctrlp-py-matcher دون الحاجة إلى القلق بشأن هذه المشكلة.

كان هناك ملف آخر وجدته يسبب مشاكل ، مع vim.eval ، وكان يحتوي على أحرف utf-8 غير صالحة كما حددها grep -axv '.*' misc.html ( misc.html في https: / /github.com/alphaCTzo7G/test). ما لاحظته هو أن ctags سيُدخل الأحرف غير القانونية utf-8 في ملف العلامات من misc.html .

هل يعقل أن يقوم ctags باكتشاف الأحرف غير الصالحة في الملفات واستبدالها بشيء مثل ما اقترحهtonymec هنا؟ (استبدل التسلسل غير الصحيح بمثيل واحد أو أكثر من الحرف (U + FFFD REPLACEMENT CHARACTER) والمقصود لهذا الغرض بالضبط.): https://github.com/vim/vim/issues/3213#issuecomment -405211243 ؟

يتم توزيع IIUC ، ctags (Exuberant ctags ، أعني ، وهو واحد فقط من برامج ctags المتاحة) بشكل منفصل عن Vim (حتى لو كان مؤلفه يعرف Bram وحتى إذا كانا يعملان معًا في بعض الأحيان لجعل Vim و ctags يعملان بشكل أفضل معًا.

من وجهة نظر ctags ، من الشرعي التعامل مع نص البرنامج على أنه مجرد سلاسل من البايت: بغض النظر عما إذا كان UTF-8 أو Latin1 أو Latin9 أو أي مجموعة أحرف أخرى ISO 8859 ، فإن المسافة هي 0x20 ، وعلامة التبويب الثابتة هي 0x09 ، ربما يكون فاصل الأسطر هو 0x0A مسبوقًا بـ 0x0D ، وما إلى ذلك ؛ والبايت الفارغ ، الذي سيكون 0x00 ، يجب ألا يظهر في ملف نصي. يتعامل Ctags مع كل برنامج بنفس الطريقة بغض النظر عن الترميز المتوافق مع ASCII المكتوب فيه ، وبالتالي لا يحتاج إلى الاهتمام بأي برنامج. فقط بالنسبة لبعض مجموعات الأحرف الغريبة مثل EBCDIC ، هل تحتاج إلى التعامل مع النص على أنه غير ASCII بالتأكيد (في EBCDIC ، IIRC ، AI هي 0xC1-0xC9 ، JR هي 0xD1-0xD9 ، SZ هي 0xE2-0xE9 ، 0-9 هي 0xF0-0xF9 ، ولا أتذكر ما هي الرموز الخاصة بمسافة ، أو علامة تبويب ، أو فاصل أسطر ، أو شرطة ، أو شرطة سفلية ، وما إلى ذلك ؛ لكنك ترى أنه من وجهة نظر ASCII أمر غريب حقًا).

IMHO ، في حالة ctag ، ينطبق المبدأ القديم الجيد: القمامة في الداخل ، والقمامة.

تحياتي الحارة،
توني.

tonymec .. يبدو منطقيًا .. أدرك أنه قد تكون هناك برامج أخرى universal-ctags هو الأكثر شيوعًا ، ومن بين الأشخاص الذين يستخدمون universal-ctags أعتقد أن جزءًا كبيرًا هو vim المستخدمين.

لذا أتساءل عما إذا كان هذان العنصران قد يعملان أم أن لديك أي أفكار أخرى حول كيفية التعامل مع الملفات التي تحتوي على أحرف utf-8 غير قانونية؟

  1. لقد لاحظت أيضًا أن ctags لديه هذا الخيار +iconv ، والذي يتيح استخدام libiconv . عندما تستخدم على سطر الأوامر iconv يمكن إزالة غير القانونية utf8 حرفا. لذا فإنني أتساءل إذا قمت بتمرير --input-enconding=utf-8 و --output-encoding=utf-8 ، فسيتم تغيير جميع أحرف utf-8 غير القانونية إلى أحرف utf-8 .

هذا موضح في القسم 1.3.4 من https://media.readthedocs.org/pdf/ctags/latest/ctags.pdf :

Two new options have been introduced (--input-encoding=IN and --output-encoding=OUT). Using the encoding specified with these options ctags converts input from IN to OUT. ctags uses the converted strings when writing the pattern parts of each tag line. As a result the tags output is encoded in OUT encoding. In addition OUT is specified at the top the tags file as the value for the TAG_FILE_ENCODING pseudo tag. The default value of OUT is UTF-8. NOTE: Converted input is NOT passed to language parsers. The parsers still deal with input as a byte sequence. With --input-encoding-<LANG>=IN, you can specify a specific input encoding for LANG. It overrides the global default value given with --input-encoding

  1. اترك الأمر للمحرر للتعامل مع أحرف utf8 غير القانونية. في هذه الحالة ، يجب إصلاح إما vim.eval أو يجب أن تكون هناك وظيفة vimL يمكنها تحليل وإزالة الأحرف غير القانونية utf-8 قبل تمريرها إلى vim.eval ..

@ alphaCTzo7G أتفق مع tonymec واستنتاجه.

لسوء الحظ ، هناك مشكلة كبيرة في التعرف على الترميز المناسب - وأنا أصر على أنه مناسب ، لأنه من السهل العثور على ترميز يكون الإدخال فيه صالحًا تقنيًا ، على سبيل المثال ، إن لم يكن كل ترميزات 8 بت ، ولكن معرفة ما إذا كان ذلك صحيحًا واحد صعب أو مستحيل: لنفترض ، كيف يمكن للمرء أن يكون متأكدًا بين مثل ISO 8859-1 و 8859-15؟ تتضمن الحلول إرشادات معقدة حول تكرار الاستخدام والسياق ؛ أو فكرة أكثر سذاجة تنطبق على بعض اللغات مثل HTML ستكون استخراج بيان الترميز داخل الملف ، ولكن قد يكون هذا غير صحيح أيضًا.

أيضًا ، يقف ctags في وضع صعب هنا: لا يتعامل العديد من المستهلكين ، إن لم يكن معظمهم ، مع الترميزات ، ويجب أن تتطابق العلامات التي تم إنشاؤها على مستوى البايت. على سبيل المثال ، لا يؤدي استخدام نمط العلامة أو حتى الاسم إلى تحويل الترميز نيابةً عنك ، لذا يجب أن تتطابق العلامة مع الملف على مستوى البايت. كان الأمر سهلاً عندما كان كل ما كان علينا الاهتمام به هو ASCII ، لكننا لم نعد محظوظين بعد الآن ... لم يتم اعتماد UTF-8 في وقت مبكر بما فيه الكفاية.
ينطبق هذا أيضًا على فكرة الاستعاضة عن الأحرف النائبة: ما الذي يمكن أن يفعله المستهلك بهذه الشخصية البديلة؟ على الأقل يجب أن يتعامل معها بطريقة محددة.

ومع ذلك ، إذا كنت سعيدًا باستبدال UTF-8 غير الصالحة بـ U + FFFD أو تجريدها ، فربما يمكنك ببساطة إخراج ctags بعد العملية؟

@ b4n ، نقدر تعليقك. أنا أتعامل في الغالب مع ملفات utf-8 المشفرة ولديها utf-8 مشفرة للملفات التي أقوم بإنشائها. لسوء الحظ ، كما ذكرت ، فإنني أستخدم مكتبات تميل أحيانًا إلى استخدام ترميزات عشوائية.

أستخدم vim-gutentags ، وهو يوفر وظيفة ما بعد المعالجة. بينما كان بإمكاني معالجة ملف العلامات يدويًا لينتج عنه جميع الملفات بأحرف utf-8 ، عندما حاولت استخدام وظيفة post-processing في vim-gutentags ، لم تنجح . لذلك اعتقدت أنه قد يكون من الأفضل اكتشاف حل أكثر قوة .. ولكن إذا لم يكن ذلك موجودًا ، فسوف يتعين علي النظر فيه مرة أخرى ..

لاكتشاف تشفير الملف ، لا يمكنك استخدام المكتبات الأساسية خلف أحد هذه الخيارات: https://stackoverflow.com/questions/805418/how-to-find-encoding-of-a-file-in-unix عبر البرامج النصية

مثل enca ، file ، uchardet ، enguess ؟ هذه كلها أدوات مساعدة لسطر الأوامر .. ولكن يجب أن تكون هناك مكتبة في مكان ما يمكن استخدامها داخليًا بواسطة ctags ربما. أعتقد أنه بسبب عدد الترميزات ، كما ذكرت ، قد لا يكون من الممكن أبدًا توقع الترميز تمامًا ، ولكن الحل البسيط الذي يغطي معظمه قد يكون أفضل من لا شيء ..

سأحاول تجربة --input-encoding (and/or --input-encoding-<LANG>) and --output-encoding options .. لست متأكدًا مما إذا كان سيعمل طوال الوقت ، لأنه من المحتمل جدًا أن تحتوي ملفات معينة على ترميزات مختلفة في نفس المستودع ، ما لم يكتشف ctags الترميز الصحيح بشكل فردي ويبصقه بالتنسيق المطلوب.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

JulienPivard picture JulienPivard  ·  16تعليقات

jespinal picture jespinal  ·  8تعليقات

lvc picture lvc  ·  3تعليقات

blackb1rd picture blackb1rd  ·  8تعليقات

jagjordi picture jagjordi  ·  9تعليقات