كيف يمكنني ربط تعبير عادي بمجموعة مفاتيح في إيماكس؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

بالنسبة للسياق، فأنا مبتدئ في نظام إيماكس.لم أستخدمه لفترة طويلة جدًا، لكني أستخدمه أكثر فأكثر (أحبه كثيرًا).كما أنني مرتاح مع اللثغة، لكني لست على دراية كبيرة بـ elisp.

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

ما كنت أفعله:

M-C-s ^.*Table\(\(.*\n\)*?GO\)

لاحظ أنني استخدمت السطر الجديد أعلاه، لكنني وجدت ذلك لـ isearch-forward-regexp, ، أنت حقا بحاجة إلى استبدال \n في التعبير العادي مع نتيجة ج-ف س-ي.يؤدي هذا إلى إدراج سطر جديد حرفيًا (دون إنهاء الأمر) مما يتيح لي وضع سطر جديد في التعبير ومطابقته عبر الأسطر.

كيف يمكنني ربط هذا بمجموعة مفاتيح؟

أفهم بشكل غامض أنني بحاجة إلى إنشاء وظيفة elisp يتم تنفيذها isearch-forward-regexp مع التعبير، ولكن أنا غامض بشأن التفاصيل.لقد بحثت في جوجل ووجدت أن معظم الوثائق مربكة بعض الشيء.

كيف يمكنني ربط تعبير عادي بمجموعة مفاتيح في إيماكس؟


كان لدى مايك ستون أفضل إجابة حتى الآن - لا بالضبط ما كنت أبحث عنه ولكنه نجح في تحقيق ما أحتاجه

تحرير - نجح هذا النوع من العمل، ولكن بعد تخزين الماكرو، وعندما عدت لاستخدامه لاحقًا، لم أتمكن من استخدامه مع ج-س ه.(على سبيل المثال، إذا قمت بإعادة تشغيل emacs ثم كتبت M-x اسم الماكرو, ، وثم ج-س ه, ، أتلقى رسالة في المخزن المؤقت الصغير مثل "لا يوجد ماكرو آخر kbd" أو شيء مشابه)


@ مايك ستون - شكرًا على المعلومات.لقد حاولت إنشاء ماكرو مثل ذلك:

C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)

أدى هذا إلى إنشاء الماكرو الخاص بي، ولكن عندما قمت بتنفيذ الماكرو الخاص بي، لم أحصل على نفس التمييز الذي أحصل عليه عادةً عندما أستخدمه isearch-forward-regexp.وبدلاً من ذلك، تم الانتقال إلى نهاية المطابقة التالية للتعبير.لذلك هذا لا يعمل حقًا لما أحتاجه.أيه أفكار؟

يحرر:يبدو أنني يستطيع استخدم وحدات الماكرو لفعل ما أريد، كل ما علي فعله هو التفكير خارج الصندوق isearch-forward-regexp.سأحاول ما اقترحته.

هل كانت مفيدة؟

المحلول

يمكنك استخدام وحدات الماكرو، فقط افعل ذلك ج-س ( ثم تفعل كل شيء للماكرو، ثم ج-س) لإنهاء الماكرو، ثم ج-س ه سيتم تنفيذ آخر ماكرو محدد.وبعد ذلك، يمكنك تسميته باستخدام M-x الاسم-الأخير-kbd-ماكرو والذي يتيح لك تعيين اسم له، والذي يمكنك بعد ذلك الاستدعاء به م-x تستيت, ، ثم قم بتخزين التعريف باستخدام M-x إدراج كيلو بايت ماكرو والذي سيضع الماكرو في المخزن المؤقت الحالي لديك، وبعد ذلك يمكنك تخزينه في ملفك .emacs ملف.

مثال:

C-x( abc *return* C-x)

سيتم تحديد ماكرو لكتابة "abc" ثم اضغط على "رجوع".

C-xeee

ينفذ الماكرو أعلاه على الفور، 3 مرات (يتم تنفيذه أولاً، ثم بعد 2 e سيتم تنفيذه مرتين أخريين).

M-x name-last-kbd-macro testit

تسمية الماكرو بـ "testit"

M-x testit

ينفذ الماكرو المسمى للتو (يطبع "abc" ثم يعود).

M-x insert-kbd-macro

يضع ما يلي في المخزن المؤقت الحالي الخاص بك:

(fset 'testit
   [?a ?b ?c return])

والتي يمكن بعد ذلك حفظها في ملفك .emacs ملف لاستخدام الماكرو المسمى مرارًا وتكرارًا بعد إعادة تشغيل emacs.

نصائح أخرى

لقد بدأت بحل مشكلتك حرفيا،

(defun search-maker (s)
  `(lambda ()
     (interactive)
     (let ((regexp-search-ring (cons ,s regexp-search-ring)) ;add regexp to history
           (isearch-mode-map (copy-keymap isearch-mode-map)))
       (define-key isearch-mode-map (vector last-command-event) 'isearch-repeat-forward) ;make last key repeat
       (isearch-forward-regexp)))) ;`

(global-set-key (kbd "C-. t") (search-maker "^.*Table\\(\\(.*\\n\\)*?GO\\)"))
(global-set-key (kbd "<f6>") (search-maker "HELLO WORLD"))

تسلسل لوحة المفاتيح من (kbd ...) يبدأ بحثًا فارغًا جديدًا.للبحث فعليًا عن السلسلة الخاصة بك، اضغط على المفتاح الأخير مرة أخرى عدة مرات حسب حاجتك.لذا C-. t t t أو <f6> <f6> <f6>.الحل هو في الأساس اختراق، لكنني سأتركه هنا إذا كنت تريد تجربته.

ربما يكون ما يلي هو الأقرب إلى ما تحتاجه،

(defmacro define-isearch-yank (key string)
  `(define-key isearch-mode-map ,key 
     (lambda ()
       (interactive) 
       (isearch-yank-string ,string)))) ;`

(define-isearch-yank (kbd "C-. t") "^.*Table\\(\\(.*\\n\\)*?GO\\)")
(define-isearch-yank (kbd "<f6>") "HELLO WORLD")

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

@ جاستن:

عند تنفيذ الماكرو، الأمر مختلف قليلاً...ستتم عمليات البحث المتزايدة مرة واحدة فقط، وسيتعين عليك تنفيذ الماكرو مرة أخرى إذا كنت تريد البحث مرة أخرى.ومع ذلك، يمكنك القيام بأشياء أكثر قوة وتعقيدًا، مثل البحث عن كلمة رئيسية، والانتقال إلى بداية السطر، ووضع علامة، والانتقال إلى نهاية السطر، M-w (للنسخ)، ثم الانتقال إلى مخزن مؤقت آخر، ثم C-y (لصق )، ثم انتقل مرة أخرى إلى المخزن المؤقت الآخر وقم بإنهاء الماكرو الخاص بك.بعد ذلك، في كل مرة تقوم فيها بتنفيذ الماكرو، سيتم نسخ سطر إلى المخزن المؤقت التالي.

الشيء الرائع حقًا في وحدات الماكرو emacs هو أنها ستتوقف عندما ترى الجرس ...والذي يحدث عندما تفشل في مطابقة البحث المتزايد (من بين أشياء أخرى).لذا، الماكرو أعلاه، يمكنك تنفيذ C-u 1000 C-x e والذي سينفذ الماكرو 1000 مرة...ولكن بما أنك قمت بالبحث، فسيتم نسخ 1000 سطر فقط، أو حتى يفشل البحث!مما يعني أنه إذا كان هناك 100 تطابق، فسيتم تنفيذ الماكرو 100 مرة فقط.

يحرر:تحقق من C-hf Highlight-lines-matching-regexp والذي سيُظهر مساعدة أمر يسلط الضوء على كل شيء يطابق regex...لا أعرف كيفية التراجع عن تسليط الضوء على الرغم من ...على أي حال، يمكنك استخدام ماكرو مخزن لتسليط الضوء على كل ما يطابق التعبير العادي، ثم ماكرو آخر للعثور على الماكرو التالي...؟

مزيد من التعديل:سيؤدي M-x unhighlight-regexp إلى التراجع عن التمييز، ويجب عليك إدخال آخر تعبير عادي (لكنه افتراضيًا هو التعبير العادي الذي استخدمته للتمييز)

بشكل عام، لتحديد رابط مفتاح مخصص في Emacs، عليك أن تكتب

(define-key global-map (kbd "C-c C-f") 'function-name)

define-key ومن غير المستغرب أن تكون وظيفة تحديد مفتاح جديد. global-map هي خريطة المفاتيح العالمية، بدلاً من الخرائط الفردية لكل وضع. (kbd "C-c C-f") تقوم بإرجاع سلسلة تمثل تسلسل المفاتيح C-c C-f.هناك طرق أخرى للقيام بذلك، بما في ذلك إدخال السلسلة مباشرة، ولكن هذا عادةً ما يكون الأكثر وضوحًا لأنه يأخذ التمثيل المكتوب العادي. 'function-name هو الرمز الذي هو اسم الوظيفة.

الآن، ما لم تكن وظيفتك محددة بالفعل، فستحتاج إلى تعريفها قبل استخدام هذا.للقيام بذلك، اكتب

(defun function-name (args)
  (interactive)
  stuff
  ...)

defun يحدد وظيفة - الاستخدام C-h f defun للحصول على معلومات أكثر تحديدا.ال (interactive) لا يوجد بالفعل استدعاء دالة؛يخبر المترجم أنه من المقبول أن يتم استدعاء الوظيفة بواسطة المستخدم باستخدام M-x function-name وعبر روابط المفاتيح.

الآن، بالنسبة للبحث التفاعلي على وجه الخصوص، يعد هذا أمرًا صعبًا؛ال isearch لا يبدو أن الوحدة قد تم إعدادها بالفعل لما تحاول القيام به.ولكن يمكنك استخدام هذا للقيام بشيء مماثل.

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