เดินต่อไปจนสุดบรรทัด


9

ค่าเริ่มต้นของการเชื่อมโยงคีย์C-a/C-eนั้นมีเพียงสิ่งเดียวเท่านั้นย้ายไปที่จุดเริ่มต้น / สิ้นสุดของบรรทัดมีแพ็คเกจใด ๆ ที่สามารถทำให้ Emacs ทำหน้าที่ดังนี้

  1. หากฉันไม่ได้อยู่ที่ท้ายบรรทัดC-eจะไปที่ท้ายบรรทัดมิฉะนั้นให้ไปจบบรรทัดถัดไป
  2. ถ้าฉันไม่อยู่ที่จุดเริ่มต้นของบรรทัดC-aจะไปที่จุดเริ่มต้นของบรรทัดมิฉะนั้นไปที่จุดเริ่มต้นของบรรทัดถัดไป

ประเด็นก็คือคุณก็สามารถให้การกดปุ่มC-a/eเพื่อไปยังจุดเริ่มต้น / C-n/pท้ายของทุกสายโดยไม่ต้องย้ายนิ้วของคุณเพื่อการเข้าถึง

และด้วยคำนำหน้า ( C-u) พวกเขาจะไปที่จุดเริ่มต้น / สิ้นสุดของบรรทัดในทิศทางตรงกันข้าม


ในความคิดเห็นต่อคำตอบด้านล่าง @kaushalmodi ชี้ให้เห็นว่าฉันอาจตีความคำถามของคุณผิด คุณต้องการที่C-aจะไป "ขึ้น" และC-eไปที่ "ลง"? กล่าวอีกนัยหนึ่งความหมายของ "บรรทัดถัดไป" นั้นเหมือนกันในรายการ 1 และ 2 หรือไม่
Constantine

@ แน่นอนฉันจริง ๆ คิดเกี่ยวกับปัญหา " C-aขึ้นและC-eลง" เมื่อฉันโพสต์คำถามนี้ แต่แล้วฉันคิดว่าถ้ามีคนให้defunทางออกเช่นคุณทุกคนจะรู้ว่าจะทำอย่างไรถ้าเขาชอบC-a"ขึ้น" ..
CodyChan

ตกลง; ฉันคิดว่ามันยังคงคุ้มค่าการแก้ไข ฉันจะอัปเดตคำตอบ - มันเป็นเพียงการเปลี่ยนแปลงบรรทัดเดียว
Constantine

คำตอบ:


11

ฉันไม่ทราบแพ็คเกจที่จะเปิดใช้งานลักษณะการทำงานนี้ แต่นี่เป็นวิธีหนึ่งในการดำเนินการ

กดC-h k C-aเพื่อค้นหาสิ่งที่C-aถูกผูกไว้กับmove-beginning-of-line; นี่คือฟังก์ชั่นที่เราจำเป็นต้องแก้ไข --- หรือเพียงแค่ใช้เพื่อดำเนินการส่วน "ย้ายไปที่จุดเริ่มต้น" ในทำนองเดียวกันC-h kฉันสามารถค้นหาforward-lineซึ่งจะใช้ในการเลื่อนขึ้น / ลง

เพื่อให้สามารถผูกฟังก์ชั่นกับคีย์เราจำเป็นต้องทำให้มันเป็นคำสั่งดังนั้นเราจึงจำเป็นต้องใช้interactiveรูปแบบพิเศษ (ดูการใช้อินเตอร์แอคทีฟ ) ในการรับC-uอาร์กิวเมนต์คำนำหน้าเราจำเป็นต้องมี"P"รหัสตัวอักษร

รวมสิ่งนี้กับbolp(ตรวจสอบว่าที่จุดเริ่มต้นของบรรทัด) และeolp(ตรวจสอบว่าในตอนท้ายของบรรทัด) เราสามารถเขียน:

(defun my-move-beginning-of-line (arg)
  (interactive "P")
  (when (bolp) (previous-line (if arg -1 1)))
  (move-beginning-of-line nil))

(defun my-move-end-of-line (arg)
  (interactive "P")
  (when (eolp) (forward-line (if arg -1 1)))
  (move-end-of-line nil))

ตอนนี้เราสามารถผูกใหม่C-aและC-eเรียกสิ่งเหล่านี้:

(global-set-key [remap move-beginning-of-line] #'my-move-beginning-of-line)
(global-set-key [remap move-end-of-line] #'my-move-end-of-line)

อีกทางเลือกหนึ่งที่สามารถเพิ่มคำแนะนำการและmove-beginning-of-linemove-end-of-line


นี่เป็นคำอธิบายที่ดีมากและเป็นคำตอบที่สง่างาม มีmy-move-beginning-of-lineฟังก์ชั่นการพิมพ์ผิด.. ควรเป็น(previous-line (if arg -1 1))หรือ(forward-line (if arg 1 -1))(1 และ -1 สวิตช์) หรือไม่?
Kaushal Modi

@kaushalmodi: ในคำถามทั้งข้อ 1 และ 2 พูดว่า "บรรทัดถัดไป" ซึ่งฉันตีความว่าเป็น "ลง" ดังนั้นขอถามผู้เขียนคำถาม! :-)
Constantine

อาฉันเพิ่มข้อสันนิษฐานของตัวเองในคำถามของ OP คุณมีสิทธิที่เขาไม่ระบุที่จะไปต่อไปสายเมื่อใช้อย่างใดอย่างหนึ่งหรือC-a C-e
Kaushal Modi

@kaushalmodi: ปรากฎว่าคุณพูดถูก! ฉันอัปเดตคำตอบเพื่อทำการC-a"ขึ้น"
Constantine

8

ห้องสมุดmisc-cmds.elมีคุณลักษณะนี้มานานแล้ว

เหล่านี้คือคำสั่งที่เกี่ยวข้องและการโยงคีย์ที่แนะนำ (การโยงเหล่านี้ทำขึ้นsetup-keys.el)

(cond ((fboundp 'move-beginning-of-line)
       (substitute-key-definition 'move-beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'move-end-of-line 'end-of-line+ global-map))
      (t
       (substitute-key-definition 'beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'end-of-line 'end-of-line+ global-map)))
(when (boundp 'visual-line-mode-map)
  (define-key visual-line-mode-map [remap move-beginning-of-line] nil)
  (define-key visual-line-mode-map [remap move-end-of-line]       nil)
  (define-key visual-line-mode-map [home] 'beginning-of-line+)
  (define-key visual-line-mode-map [end]  'end-of-line+)
  (define-key visual-line-mode-map "\C-a" 'beginning-of-visual-line+)
  (define-key visual-line-mode-map "\C-e" 'end-of-visual-line+)))

นี่คือสิ่งที่C-h f end-of-line+พูดเป็นตัวอย่างหนึ่ง:

end-of-line+ is an interactive compiled Lisp function in
`misc-cmds.el'.

It is bound to C-e, end.

(end-of-line+ &optional N)

Move cursor to end of current line or end of next line if repeated.
This is similar to `end-of-line', but:
  If called interactively with no prefix arg:
     If the previous command was also `end-of-line+', then move to the
     end of the next line.  Else, move to the end of the current line.
  Otherwise, move to the end of the Nth next line (Nth previous line
     if N<0).  Command `end-of-line', by contrast, moves to the end of
     the (N-1)th next line.

นั่นเป็นสิ่งที่สวยงามมาก
sanityinc

1

ฟังก์ชั่นสองอย่างต่อไปนี้ทำการกระทำที่ต้องการ

(defun move-beginning-of-line-or-previous (&optional pre)
  "Move to the start of the line. If we are already at the start
of the line, move to the start of the previous line or, if called 
with a prefix argument, the next line."
  (interactive "P")
  (let* ((pos (point)))
    (move-beginning-of-line nil)
    (if (= (point) pos)
        (if pre
            (next-line)
          (previous-line)))))

(defun move-end-of-line-or-next (&optional pre)
  "Move to the end of the line. If we are already at the end of
the line, move to the end of the next line or, if called with a 
prefix argument, the previous line."
  (interactive "P")
  (let* ((pos (point)))
    (move-end-of-line nil)
    (if (= (point) pos)
        (if pre
            (previous-line)
          (next-line)))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.