سؤال

أنا أبدأ مع 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)
      ...)
  ...
  )

في النهاية ما زلت أوصي كامل نظرًا لأن اسم الملف لا يبدو أنه يعمل بشكل صحيح. يبدو أكثر اكتمالا (رغم أنه أكثر تعقيدًا) ، وكنت سعيدًا به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top