ทำซ้ำการแทรกข้อความล่าสุด


10

ในกลุ่มคุณสามารถกด.เพื่อทำซ้ำการเปลี่ยนแปลงล่าสุดรวมถึงการแทรกข้อความ

ในขณะที่ Emacs C-x zจะทำซ้ำคำสั่งสุดท้ายเท่านั้น ฉันรู้ว่าสามารถใช้มาโครได้ที่นี่ แต่บ่อยครั้งที่ฉันรู้ว่าฉันต้องแทรกข้อความเดิมช้าเกินไป เมื่อผมจำเป็นต้องใส่ก็เพียงเวลามากขึ้นหนึ่งในการกำหนดแมโครแล้วจะไม่มีจุดหมาย

ถาม:มีวิธีการแทรกข้อความซ้ำภายใน Emacs หรือไม่


1
"ข้อความ" ที่คุณต้องการทำซ้ำคืออะไร? เทคนิคการพูดการแทรกครั้งสุดท้ายเป็นเพียงตัวละครตัวสุดท้ายซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ ดังนั้นคุณจะกำหนด "การแทรกข้อความ" สำหรับวัตถุประสงค์ของคุณอย่างไร การอธิบายอย่างชัดเจนอาจช่วยคุณในการค้นหาวิธีที่จะทำให้สำเร็จ
T. Verron

อืมคำถามที่ดี - วิธีการกำหนดว่าที่ผ่านมาการปรับเปลี่ยนกันชนอย่างต่อเนื่อง บางทีการปรับเปลี่ยนบัฟเฟอร์ระหว่างการย้ายจุดสองจุดซึ่งไม่ใช่ผลลัพธ์ของการปรับเปลี่ยนบัฟเฟอร์ (การC-fค้นหา ฯลฯ ) ถ้ามันเป็นเหตุผลอะไรก็ตาม ...
ooi

อธิบายสิ่งที่คุณต้องการด้วยสูตร มี "การแทรก" หลายประเภท (วิธีแทรกข้อความ) คุณแทรกแบบโต้ตอบ? ถ้าเป็นเช่นนั้นได้อย่างไร
Drew

โต้ตอบ แต่ในอุดมคติมันไม่สำคัญว่าจะเกิดอะไรขึ้น มันเป็นถ้าฉันลืมที่จะเริ่มต้นการกำหนดแมโคร ซึ่งในกรณีนี้ปัญหาคือเมื่อใด บางทีอาจจะเป็นตะขอสามารถนำมาใช้
ooi

2
คุณจะกำหนด 'แทรกล่าสุด' ใน Emacs ได้อย่างไร เนื่องจากไม่มีสวิตช์โหมดแก้ไข / คำสั่งเหมือนใน vi เราควรไปไกลแค่ไหนในประวัติศาสตร์ ฉันมักจะเลือก "แทรกครั้งสุดท้าย" ( C-spaceเลื่อนเคอร์เซอร์M-wเพื่อคัดลอก) แล้วC-yวางหลายครั้งตามที่ต้องการ
Alain

คำตอบ:


7

dot-modeเป็น "โหมดรองเพื่อพิมพ์ซ้ำหรือคำสั่ง" และอาจทำสิ่งที่คุณต้องการ โดยพื้นฐานแล้วมันเป็นการทำซ้ำการแทรก / การลบล่าสุดที่คุณทำ มันค่อนข้างคล้ายกับ.ใน Vi (m)


2
สิ่งที่ไม่ได้ทำอย่างไร
Malabarba

1
ยินดีต้อนรับสู่ Emacs.SE ตอนนี้คำตอบของคุณอยู่ใกล้กับความคิดเห็นมากกว่าคำตอบ คุณช่วยแก้ไขมันได้เพื่ออธิบายว่าdot-modeมันทำอะไรได้บ้างและมันมีฟังก์ชั่นการทำงานที่ OP พยายามจะทำอย่างไร
แดน

7

มันเหมือนกับว่าฉันลืมที่จะเริ่มต้นกำหนดแมโคร

คุณสามารถใช้kmacro-edit-lossage( C-x C-k l) เพื่อ: ช่วยให้คุณดูการกดแป้นครั้งสุดท้าย 300 ครั้ง (รวมถึงการแทรกแบบง่าย) และแก้ไขเป็นแมโคร

สำหรับการใช้งานง่ายคุณก็จะหาจุดเริ่มต้นของการแทรกที่คุณต้องการทำซ้ำให้ลบข้อความทั้งหมดจาก "มาโคร" C-c C-cเพื่อจุดนั้นและกด ตอนนี้คุณมีมาโครที่คุณสามารถใช้เพื่อทำการกระทำแบบเดียวกันราวกับว่าคุณไม่ลืมที่จะบันทึกมันในตอนแรก

น่าเศร้าที่นี่ล้มเหลวหากการกดแป้น 300 ครั้งล่าสุดมีการคลิกเมาส์

แก้ไข:รหัสต่อไปนี้จะเปลี่ยนเพื่อให้มีเพียงคีย์หลังจากเหตุการณ์เมาส์ครั้งสุดท้ายเท่านั้น

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)

ฉันมักจะเลื่อนโดยใช้เมาส์มันจะเจ๋งเมื่อเห็นว่าจะลบออกจากมาโครได้อย่างไร
ooi

ว้าวคำสั่งนี้จะมีประโยชน์หากไม่ได้ล้มเหลวอย่างสมบูรณ์หากการคลิกเมาส์ 300 ครั้งล่าสุด อาจจะไม่รวมการคลิกและให้ผู้ใช้ทราบแทนที่จะปฏิเสธที่จะทำงาน
พี่เลี้ยง

@ พี่เลี้ยงฉันได้เพิ่ม elisp เพื่อเปิดใช้งาน (imo) ทางเลือกที่ดีกว่าการล้มเหลวด้วยข้อความแสดงข้อผิดพลาด: ด้วยฟังก์ชั่นนี้เฉพาะปุ่มหลังจากเหตุการณ์เมาส์ล่าสุดจะถูกเก็บไว้ การวางกิจกรรมเมาส์อย่างสมบูรณ์ก็อาจเป็นไปได้เช่นกัน แต่ผลลัพธ์ของมาโครจะไม่สามารถคาดเดาได้
ต. Verron

@ooi ไม่ทราบว่าคุณได้รับการ Ping โดยอัตโนมัติจากความคิดเห็นก่อนหน้าดังนั้นนี่คือ ping ของคุณด้วย
T. Verron

ขอบคุณฉันกำลังทำงานในสิ่งเดียวกัน ฉันคิดว่ามันอาจจะเป็นไปได้ที่จะกรอง args edmacro-fix-menu-commandsของ ใช้อาร์กิวเมนต์ตัวเลือกซึ่งสามารถละเว้นเหตุการณ์เมาส์ แต่ฉันก็ไม่รู้พอเกี่ยวกับระบบคำแนะนำเพื่อให้มันทำงานได้
พี่เลี้ยง

4

ฉันคิดว่าdabbrev-expandฟังก์ชั่นสามารถทำเคล็ดลับ สมมติว่าคุณพิมพ์คำบางคำแล้ว: emacs, อารมณ์, อิโมจิ, ... ในครั้งต่อไปที่คุณพิมพ์คำที่ขึ้นต้นด้วย 'em' คุณสามารถกดM-/และ emacs จะเสนอให้คุณแทรกคำใดคำหนึ่งที่แทรกอยู่แล้ว เริ่มต้นด้วย 'em' กดปุ่มM-/ค้างไว้และ emacs จะแสดง 'emoji' แล้ว 'อารมณ์แล้ว ...

นอกจากนี้คุณยังอาจได้ดูไปซ้ำซับซ้อนคำสั่ง ตัวอย่างที่ได้รับความนิยม: คุณต้องการทำซ้ำคำสั่งquery-replaceในบัฟเฟอร์ที่แตกต่างกันจำนวนมากโดยใช้อาร์กิวเมนต์เดียวกันเสมอแทนที่ "pitt" โดย "patt"

คุณเรียกใช้ครั้งเดียวไปที่หน้าต่างอื่นแล้วพิมพ์C-x ESC ESCเพื่อเรียกใช้อีกครั้ง

และเพื่อสิ้นสุดฉันขอแนะนำให้ใส่เม็ดมีดซ้ำได้หรือไม่ ไฟล์ el นี้จะช่วยให้คุณทำการแทรกโดยใช้ตรรกะบางชนิด มันเป็นเหมือน "เพิ่มการแทรกครั้งล่าสุดซ้ำ แต่สำหรับการวนซ้ำแต่ละครั้งอาร์กิวเมนต์จะเปลี่ยนไป

ตัวอย่างนี้สามารถพบได้ในไฟล์el :

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

ฉันหวังว่าจะช่วย


1
บางทีคุณสามารถขยายตัวเล็กน้อย ...
T. Verron

@ T.Verron Done :)
Nsukami _

1
ทำซ้ำคำสั่งที่ซับซ้อนเป็นเหมือนrepeat(ซึ่ง OP กล่าวถึง) ไม่ได้มีประโยชน์จริงๆสำหรับการแทรกข้อความ Repeat-insertจำเป็นต้องคำนึงถึงก่อนที่จะแทรกข้อความเช่นเดียวกับแมโคร แต่dabbrev-expandเป็นความคิดที่ดี!
T. Verron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.