elisp compile ، أضف regexp إلى اكتشاف الأخطاء
-
21-09-2019 - |
سؤال
أنا أبدأ مع emacs ، ولا أعرف الكثير من Elisp. لا شيء تقريبا ، حقا.
أريد استخدام ACK كبديل لـ GREP.
هذه هي التعليمات التي تابعتها لاستخدام ACK من داخل Emacs:http://www.rooijan.za.net/؟q=ACK_EL
الآن لا أحب تنسيق الإخراج المستخدم في هذا الملف EL ، أود أن يكون الإخراج ack --group
.
لذلك تغيرت:
(read-string "Ack arguments: " "-i" nil "-i" nil)
ل:
(read-string "Ack arguments: " "-i --group" nil "-i --group" nil)
حتى الان جيدة جدا. لكن هذا جعلني أفقد القدرة على النقر فوق press_enter على صفوف المخزن المؤقت للإخراج. في السلوك الأصلي ، تم استخدام وضع الترجمة ليكون قادرًا على القفز إلى الخط المحدد.
كنت أحسب أنني يجب أن أضيف regexp إلى وضع ACK. يتم تعريف وضع ACK مثل هذا:
(define-compilation-mode ack-mode "Ack"
"Specialization of compilation-mode for use with ack."
nil)
وأريد إضافة regexp [0-9]+:
ليتم اكتشافها كخطأ أيضًا ، لأنه ما يتضمنه كل صف من صفوف الإخراج (رقم السطر).
لقد حاولت تعديل define-compilation-mode
أعلاه لإضافة regexp ، لكنني فشلت فشلا ذريعا.
كيف يمكنني جعل المخزن المؤقت للإخراج ack
اسمحوا لي أن أنقر على صفوفها؟
--- تحرير ، حاولت أيضا :-
(defvar ack-regexp-alist
'(("[0-9]+:"
2 3))
"Alist that specifies how to match rows in ack output.")
(setq compilation-error-regexp-alist
(append compilation-error-regexp-alist
ack-regexp-alist))
سرقت ذلك في مكان ما وحاولت التكيف مع احتياجاتي. لا حظ.
--- تحرير ، نتيجة بعد اقتراح إيفان ---
مع تحديث ACK.EL لتشمل:
(defvar ack-regexp-alist
'(("^[0-9]+:" ;; match the line number
nil ;; the file is not found on this line, so assume that it's the same as before
0 ;; The line is the 0'th subexpression (the whole thing)
)
("^[^: ]+$" ;; match a file -- this could be better
0 ;; The file is the 0'th subexpression
))
"Alist that specifies how to match rows in ack output.")
(setq compilation-error-regexp-alist
(append compilation-error-regexp-alist
ack-regexp-alist))
(define-compilation-mode ack-mode "Ack"
"Specialization of compilation-mode for use with ack."
nil)
ثم التحقق من compilation-error-regext-alist
متغير ، أحصل على القيمة:
(absoft ada aix ant bash borland caml comma edg-1 edg-2 epc ftnchek iar ibm irix java jikes-file jikes-line gnu gcc-include lcc makepp mips-1 mips-2 msft oracle perl rxp sparc-pascal-file sparc-pascal-line sparc-pascal-example sun sun-ada 4bsd gcov-file gcov-header gcov-nomark gcov-called-line gcov-never-called
("^[0-9]+:" nil 0)
("^[^: ]+$" 0))
أجد تنسيق المتغير غريبًا جدًا ، أليس كذلك؟ لا أعرف Elisp (حتى الآن) ، لذلك ربما يكون هذا صحيحًا بهذه الطريقة.
لا يزال لا توجد روابط أو لون في المخزن المؤقت * ACK *.
المحلول
هناك آخر full-ack
حزمة على ELPA الذي استخدمته من قبل ويتعامل --group
انتاج.
ومع ذلك ، قراءة الوثائق ل compilation-error-regexp-alist
ترى أنه يحتوي على النموذج:
(REGEXP FILE [LINE COLUMN TYPE HYPERLINK HIGHLIGHT...])
في حالة --group
الإخراج ، يجب أن تتطابق مع الملف والخط بشكل منفصل ، لذلك أعتقد أنك تريد شيئًا مثل (لم يتم اختباره)
(defvar ack-regexp-alist
'(("^\\S +$" ;; match a file -- this could be better
0 ;; The file is the 1st subexpression
)
("^[0-9]+:" ;; match the line number
nil ;; the file is not found on this line, so assume that it's the same as before
0 ;; The line is the 0'th subexpression (the whole thing)
))
"Alist that specifies how to match rows in ack output.")
-- محدث --
المتغير compilation-error-regext-alist
هي قائمة من الرموز أو العناصر مثل (REGEXP ...)
. يتم النظر في الرموز في compilation-error-regexp-alist-alist
للعثور على العناصر المقابلة. لذا ، نعم ، إنه أمر غريب بعض الشيء ، لكن من الأسهل رؤية ما يتم تشغيله وإيقافه دون الحاجة إلى النظر إلى regexes القبيحة وتخمين ما يفعلونه. إذا كنت ستقوم بتوزيع هذا ، أقترح إضافة regex إلى compilation-error-regexp-alist-alist
ثم تشغيله compilation-error-regext-alist
, ، لكن هذا يخبر إلى حد ما حتى تحصل عليه للعمل بشكل صحيح.
بالنظر عن كثب في ACK.EL ، لاحظت أنه يستخدم
(let (compile-command
(compilation-error-regexp-alist grep-regexp-alist)
...)
...
)
بمعنى آخر ، يكتب محليًا compilation-error-regexp-alist
مع grep-regexp-alist
, ، لذلك تحتاج إلى إضافة regexes هناك بدلاً من ذلك. أو حتى الأفضل من ذلك هو استبداله
(let (compile-command
(compilation-error-regexp-alist ack-regexp-alist)
...)
...
)
في النهاية ما زلت أوصي كامل نظرًا لأن اسم الملف لا يبدو أنه يعمل بشكل صحيح. يبدو أكثر اكتمالا (رغم أنه أكثر تعقيدًا) ، وكنت سعيدًا به.