วิธีการตั้งค่าเครื่องหมายใน elisp และมีการเลือกกะ?


9

พฤติกรรมปกติของ Emacs เมื่อโหมด transient-mark-active นั้นทำงานเมื่อคุณทำการเลือก shift แล้วหากคำสั่งถัดไปเป็นการเคลื่อนที่แบบ non-shift เครื่องหมายนั้นจะถูกปิดการใช้งาน ตัวอย่างเช่นหลังจากคำสั่งM-l(เพื่อทำเครื่องหมายบรรทัดปัจจุบันด้วยฟังก์ชั่นด้านล่าง) และC-fเครื่องหมายถูกปิดการใช้งาน จะเลียนแบบพฤติกรรมดังกล่าวจาก elisp ได้(set-mark-command nil)อย่างไร

ตัวอย่างเช่น:

(defun my-mark-current-line ()
  (interactive)
  (beginning-of-line)
  (set-mark-command nil)
  (end-of-line)
  (forward-char))

(global-set-key (kbd "M-l") 'my-mark-current-line)

ตอนนี้ Ml Cf และภูมิภาคจะเติบโตขึ้น แต่ฉันต้องการพฤติกรรมเริ่มต้นเช่นพื้นที่จะปิดใช้งานเมื่อ Cf และเติบโตด้วย CSf

แก้ไข : ควรใช้ฟังก์ชั่นที่แตกต่างเพื่อ set-mark-command ที่อนุญาตสิ่งนี้หรือไม่ ฉันไม่พบอะไรเลย


ฉันเชื่อว่าเป็นไปไม่ได้ (และฉันอาจผิด) ตราบใดที่ภูมิภาคยังทำงานอยู่คำสั่งการนำทางจะเปลี่ยนการเลือก การเลือกการใช้กะC-S-fนั้นคล้ายคลึงกับC-SPC(การเปิดใช้งานภูมิภาค) + C-f(การนำทาง) คุณอาจได้สิ่งที่คุณต้องการโดยผูกC-f เข้ากับฟังก์ชั่น wrapper ซึ่งจะปิดการใช้งานพื้นที่ก่อนหากใช้งานอยู่และจะทำสิ่งที่C-fทำ ( forward-char); และผูกโดยตรงกับC-S-f forward-charโปรดทราบว่าหากคุณเคยใช้ emacs ในโหมดเทอร์มินัลC-fและC-S-fทั้งคู่จะทำงานC-fเหมือนที่เทอร์มินัลไม่สามารถแยกความแตกต่างระหว่างทั้งสองได้
Kaushal Modi

กระดาษห่อและการผูกที่คุณทำไว้C-fจะใช้กับคำสั่งการนำทางอื่น ๆ ทั้งหมดที่คุณใช้ด้วย
Kaushal Modi

btw C-fหลังจากM-lไม่ขยายขอบเขตเนื่องจากไม่มีพื้นที่ที่ใช้งานอยู่ที่ส่วนท้ายของM-l(ซึ่งถูกผูกไว้downcase-wordตามค่าเริ่มต้น)
Kaushal Modi

1
@KaushalModi ฉันคิดว่าการM-lอ้างอิงโดย OP ไม่ใช่การเชื่อมโยงเริ่มต้น ( downcase-word) แต่การเชื่อมโยงแบบกำหนดเองของmy-mark-current-line
nispio

แน่นอน @nispio
mikl

คำตอบ:


8

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

;; (source: http://emacs.stackexchange.com/a/22166/93)
(defun my-mark-current-line ()
  (interactive)
  (beginning-of-line)
  (setq this-command-keys-shift-translated t)
  (call-interactively 'end-of-line)
  (call-interactively 'forward-char))

(global-set-key (kbd "M-l") 'my-mark-current-line)

ปรับปรุง:

ตั้งแต่เขียนคำตอบข้างต้นฉันใช้เวลาในการเรียนรู้เพิ่มเติมเล็กน้อยเกี่ยวกับวิธีการเลือกกะทำงานภายใต้ประทุน มันตั้งค่าสัญลักษณ์ของtransient-mark-modeเป็นเซลล์ข้อเสียของรูปแบบ(only . OLDVAL)ที่OLDVALเป็นค่าก่อนที่จะเปลี่ยนการเลือก

วิธีการแก้ปัญหาด้านล่างหลีกเลี่ยงการใช้โดยการเปิดใช้เครื่องหมายตามความจำเป็นและการตั้งค่าที่เหมาะสมของcall-interactively transient-mark-modeโดยพื้นฐานแล้วฉันคิดว่าวิธีนี้จะทำให้แฮ็กน้อยกว่าครั้งแรก

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

;; (source: http://emacs.stackexchange.com/a/22166/93)
(defun my-mark-current-line (&optional arg)
  "Uses shift selection to select the current line.
When there is an existing shift selection, extends the selection
in the appropriate direction to include current line."
  (interactive "p")
  (let ((oldval (or (cdr-safe transient-mark-mode) transient-mark-mode))
        (backwards (and mark-active (> (mark) (point))))
        (beg (and mark-active (mark-marker))))
    (unless beg
      (if backwards (end-of-line) (beginning-of-line))
      (setq beg (point-marker)))
    (if backwards (end-of-line (- 1 arg)) (beginning-of-line (+ 1 arg)))
    (unless mark-active
      (push-mark beg nil t))
    (setq transient-mark-mode (cons 'only oldval))))

1
ทั้งทำงานได้อย่างสมบูรณ์แบบและสิ่งเก่า ๆ มีประโยชน์มาก! ขอบคุณมาก!
mikl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.