จะเน้นบรรทัดใดบรรทัดหนึ่งใน emacs ได้อย่างไร

ฉันต้องเน้นสิ่งอำนวยความสะดวกสำหรับ emacs เพื่อทำเครื่องหมายบางบรรทัดในไฟล์ขณะทำงานกับมัน ควรเป็นแบบ smth เช่น M-s h l แต่ควรทำงานตามหมายเลขบรรทัด ไม่ใช่บน regexp ฉันต้องการเน้นบรรทัดปัจจุบัน แต่ hl-line-mode ไม่เหมาะ เนื่องจากฉันต้องไฮไลต์หลายบรรทัดทุกครั้งที่กดปุ่มเฉพาะบนแต่ละบรรทัด


person Necto    schedule 22.01.2013    source แหล่งที่มา
comment
เส้นบางเส้นเป็นเขต ดู stackoverflow.com/questions/491257/emacs-region-highlighting พฤษภาคม คุณต้องการห้องสมุด highlight.el   -  person artscan    schedule 22.01.2013
comment
บรรทัดเหล่านี้ไม่ต่อเนื่องกัน มันเป็นเพียงชุดของบรรทัดที่น่าสนใจ   -  person Necto    schedule 22.01.2013
comment
เจ๋ง ฉันไม่รู้ด้วยซ้ำว่าฉันต้องการสิ่งนี้ +1   -  person harpo    schedule 22.01.2013
comment
แพ็คเกจ bm จากด้านล่างคือสิ่งที่ฉันแนะนำแทนที่จะสร้างล้อขึ้นมาใหม่ แต่การประดิษฐ์วงล้อเป็นเรื่องสนุก!   -  person event_jr    schedule 23.01.2013


คำตอบ (3)


ฉันเพิ่งเขียนอย่างรวดเร็วต่อไปนี้:

(defun find-overlays-specifying (prop pos)
  (let ((overlays (overlays-at pos))
        found)
    (while overlays
      (let ((overlay (car overlays)))
        (if (overlay-get overlay prop)
            (setq found (cons overlay found))))
      (setq overlays (cdr overlays)))
    found))

(defun highlight-or-dehighlight-line ()
  (interactive)
  (if (find-overlays-specifying
       'line-highlight-overlay-marker
       (line-beginning-position))
      (remove-overlays (line-beginning-position) (+ 1 (line-end-position)))
    (let ((overlay-highlight (make-overlay
                              (line-beginning-position)
                              (+ 1 (line-end-position)))))
        (overlay-put overlay-highlight 'face '(:background "lightgreen"))
        (overlay-put overlay-highlight 'line-highlight-overlay-marker t))))


(global-set-key [f8] 'highlight-or-dehighlight-line)

(ที่นี่ find-overlays-specifying มาจากหน้าคู่มือ)

โดยจะเน้นบรรทัดปัจจุบัน และเมื่อใช้อีกครั้งจะเป็นการลบออก

สิ่งต่อไปนี้อาจมีประโยชน์เช่นกัน: การลบไฮไลต์ทั้งหมดของคุณออกจากบัฟเฟอร์ (อาจเป็นอันตรายได้ คุณอาจไม่ต้องการมันหากคุณเน้นสิ่งสำคัญ)

(defun remove-all-highlight ()
  (interactive)
  (remove-overlays (point-min) (point-max))
  )

(global-set-key [f9] 'remove-all-highlight)
person PascalVKooten    schedule 22.01.2013
comment
วิธีนี้จะไม่ทำงานหากจุดที่จุดเริ่มต้นหรือจุดสิ้นสุดของบางบรรทัด - person Necto; 22.01.2013
comment
หรืออาจจะขัดแย้งกับการไฮไลท์เหล็กจัดฟันของฉัน - person Necto; 22.01.2013
comment
แต่การยกเลิกการไฮไลต์ยังคงใช้ไม่ได้กับจุดที่ท้ายสุดของบรรทัด - person Necto; 22.01.2013
comment
เมื่อคุณพูดถึงมันแล้ว มันใช้งานไม่ได้สำหรับฉันที่จะลบมันออกเมื่อจุดอยู่ท้ายบรรทัด - person PascalVKooten; 22.01.2013
comment
ถือเป็นการแก้ปัญหาชั่วคราวได้ดี แต่ก็ยังมีปัญหากับ show-paren-mode และ hl-line-mode - person Necto; 22.01.2013
comment
ฉันคิดว่าฉันใช้ hl-line-mode แต่เลิกใช้ด้วยเหตุผลบางอย่าง ภาวะแทรกซ้อนคืออะไร? - person PascalVKooten; 22.01.2013
comment
ตามที่กล่าวไว้ hl-line-mode ใช้การซ้อนทับเพื่อเน้นบรรทัดปัจจุบัน และฟังก์ชันของคุณจะตรวจพบว่าเป็นการซ้อนทับที่มีอยู่ และไม่ได้ใส่ของตัวเอง ดังนั้นเส้นจึงยังคงถูกเน้นด้วยโหมด Hl เท่านั้น และเมื่อฉันลบจุดออกจากมัน มันก็จะไม่ถูกทำเครื่องหมายเลย - person Necto; 22.01.2013
comment
ถ้าปิดโหมด hl ไฮไลท์จะยังคงอยู่หรือไม่? - person PascalVKooten; 22.01.2013
comment
และมีเหตุผลที่คุณต้องการใช้ทั้งสองสิ่งนี้หรือไม่? ไม่อย่างนั้นก็แค่ยึดติดกับอันใดอันหนึ่ง :) - person PascalVKooten; 22.01.2013
comment
แน่นอนว่าทั้งสองมีประโยชน์ เพราะ hl-line-mode ช่วยแก้ไขข้อความที่ยุ่งเหยิงด้วยบรรทัดยาวๆ และ highlight-or-degighlight-line ช่วยเน้นให้เห็นบางบรรทัดเพื่อทำเครื่องหมาย ถ้าฉันปิดโหมด hl ไฮไลท์ของคุณก็จะยังคงอยู่ ฉันคิดว่าคุณควรใช้การซ้อนทับที่มีชื่อบางประเภทเพื่อหลีกเลี่ยงการชนกับโหมดอื่น แต่ฉันยังไม่รู้ว่าจะทำอย่างไร - person Necto; 22.01.2013
comment
บางทีคุณลองส่วนนั้นในการแก้ไขได้ไหม? เมื่อฉันเข้าใจส่วนนั้นแล้วฉันก็สามารถแก้ไขปัญหานี้ได้ทันที :) - person PascalVKooten; 22.01.2013
comment
ฉันได้เพิ่มการซ้อนทับของคุณเป็นคุณสมบัติ uniq 'line-highlight-overlay-marker ดังนั้นมันจะไม่ขัดแย้งกับโหมดการใช้การซ้อนทับอื่น ๆ - person Necto; 22.01.2013
comment
และคำตอบของคำถามในคำตอบ: (#‹overlay จาก 619 ถึง 661 ใน *scratch*›) - person Necto; 22.01.2013
comment
อย่าลังเลที่จะอัปเดตคำตอบแล้ว ฉันไม่สามารถผ่านทรัพย์สินอื่นไปได้ด้วยเหตุผลบางอย่าง... - person PascalVKooten; 22.01.2013

คุณสามารถใช้ bm.el ได้ คุณสามารถติดตั้ง bm.el จาก MELPA

bm.el ให้ bm-toggle เพื่อไฮไลต์และยกเลิกการไฮไลต์บรรทัดปัจจุบัน bm.el ยังมี bm-bookmark-regexp ซึ่งเน้นเฉพาะบรรทัดที่ตรงกันเท่านั้น และคุณสามารถข้ามระหว่างบรรทัดที่ไฮไลต์ได้ bm-previous และ bm-next

ต่อไปนี้คือการกำหนดค่าตัวอย่างของ bm.el

(require 'bm)
(global-set-key (kbd "<f5>") 'bm-toggle)
(global-set-key (kbd "<f6>") 'bm-previous)
(global-set-key (kbd "<f7>") 'bm-next)
(global-set-key (kbd "<f8>") 'bm-bookmark-regexp)
person syohex    schedule 22.01.2013
comment
ขอบคุณ. ก็ดี แต่ฉันคิดว่าหนักไปหน่อยสำหรับงานง่ายๆ แบบนี้ - person Necto; 22.01.2013
comment
bm นั้นเรียบง่าย ยืดหยุ่น ทรงพลังและใช้งานง่าย - person EdwardGarson; 01.10.2015

Bookmark+ ทำในสิ่งที่คุณขอ ใช้ C-x p RET (โดยค่าเริ่มต้น) เพื่อตั้งค่าบุ๊กมาร์ก ณ จุดนั้น และคุณสามารถกำหนดค่าประเภทของการไฮไลต์ ที่คุณต้องการสำหรับบุ๊กมาร์กดังกล่าวได้ สิ่งนี้คล้ายกับสิ่งที่ bm.el เสนอ (คำตอบของ syohex) แต่มีความยืดหยุ่นมากกว่า

person Drew    schedule 26.09.2013
comment
โปรดทราบว่าบุ๊กมาร์กจะไม่ทำงานในบัฟเฟอร์ EWW เฉพาะในไดเร็กทอรีและไฟล์เท่านั้น ฉันกำลังค้นหาวิธีแก้ปัญหาใน Emacs ที่จะอนุญาตให้ฉันเน้นบางบรรทัดในบัฟเฟอร์ EWW และลงทะเบียนและบุ๊กมาร์กเข้ามาในใจของฉัน แม้ว่ารีจิสเตอร์สามารถใช้เพื่อจดจำบางจุดในบัฟเฟอร์หน้าเว็บแล้วข้ามไปยังจุดเหล่านั้นในภายหลัง แต่บุ๊กมาร์กไม่สามารถนำมาใช้ได้ (บัฟเฟอร์ EWW ไม่ใช่ข้อกำหนดสำหรับ OP ฉันแค่อยากขยายคำตอบของคุณ) - person hajovonta; 16.05.2019
comment
@hajovonta: ไม่ ฉันไม่คิดว่ามันจริง ด้วย Bookmark+ บุ๊กมาร์ก EWW ควรทำงานได้ดี รวมถึงบัฟเฟอร์ด้วย แน่นอนว่า EWW เปลี่ยนแปลงตลอดเวลา ดังนั้นการเปลี่ยนแปลงบางอย่างอาจทำให้เกิดปัญหาที่ฉันยังไม่รู้ หากคุณรู้สึกว่าคุณพบปัญหา โปรดรายงานให้ฉันทราบ: M-x customize-group bookmark-plus จากนั้นคลิก (เช่น คลิก) ลิงก์ Send Bug Report ซึ่งจะช่วยคุณเตรียมอีเมลถึงฉัน ขอบคุณ. - person Drew; 16.05.2019
comment
ฉันไม่ใช่ผู้เชี่ยวชาญ แต่อย่างใดฉันก็รู้สึกว่าบุ๊กมาร์ก EWW มีไว้สำหรับ URL ของ EWW เท่านั้น ฉันจำเป็นต้องบุ๊กมาร์กตำแหน่งในบัฟเฟอร์ EWW เป็นไปได้ด้วย Bookmark+ หรือไม่? - person hajovonta; 16.05.2019
comment
@hajovonta: ไม่ บุ๊กมาร์ก EWW ทำงานเหมือนกับบุ๊กมาร์กทั่วไป พวกเขาบุ๊กมาร์กไม่ใช่แค่ URL แต่ยังรวมถึงตำแหน่งบนหน้านั้น (เช่น หน้า HTML) ที่คุณตั้งค่าบุ๊กมาร์ก และคุณยังสามารถตั้งค่าบุ๊กมาร์กภูมิภาคที่ตำแหน่งดังกล่าวได้อีกด้วย - person Drew; 21.05.2019