ฟังก์ชั่นเพื่อลบความคิดเห็นทั้งหมดจากบัฟเฟอร์โดยไม่ย้ายไปฆ่าแหวน


9

ฉันต้องสามารถลบความคิดเห็นทั้งหมดจากบัฟเฟอร์จากรหัส elisp ตอนนี้ฉันกำลังใช้:

(goto-char (point-min))
(comment-kill (count-lines (point-min) (point-max)))

อย่างไรก็ตามcomment-killเป็นฟังก์ชั่นอินเทอร์แอคทีฟและการใช้หลักของมันคือลบความคิดเห็นทีละรายการ นอกจากนี้ยังมีผลข้างเคียงที่น่ารำคาญเนื่องจากมันเพิ่มความคิดเห็นทั้งหมดที่ฆ่าไปยังริง - ริง

มีฟังก์ชั่นที่อนุญาตให้ลบ (ไม่ฆ่า) ความคิดเห็นบางส่วนหรือทั้งหมดจากบัฟเฟอร์หรือไม่?


คุณสามารถทำM-x flush-lines ^\s-*\/\/อะไรบางอย่างเพื่อผลกระทบนั้น ไม่สมบูรณ์แบบ แต่สามารถใช้งานได้บางครั้ง
wvxvw

@wvxvw ขอบคุณสำหรับคำแนะนำ! อย่างไรก็ตามฉันได้พิจารณาสั้น ๆ ว่าจะใช้วิธีนี้และสรุปว่ามันซับซ้อนเกินไป: ฟลัช - ไลน์จะไม่ทำเพราะความเห็นอาจไม่ได้รับทั้งบรรทัด (แทนที่ - regexp จะโอเคฉันเดา); น่ารำคาญยิ่งขึ้นมีหลายไวยากรณ์สำหรับความคิดเห็นและพวกเขาสามารถซ้อนกันทำให้ (อาจ) พ้นจาก regexps
T. Verron

จากความอยากรู้อยากเห็นคุณต้องการลบความคิดเห็นออกไปอย่างถาวรหรือคุณแค่อยากจะลบความคิดเห็นออกไปชั่วคราว? คุณอาจต้องการซ่อนพวกเขาหรือไม่?
ดึง

คำตอบ:


11

โดยทั่วไปไม่มีอะไรผิดปกติกับการใช้คำสั่งเป็นส่วนหนึ่งของรหัส elisp ฟังก์ชั่นเหล่านั้นมีไว้สำหรับการใช้งานแบบโต้ตอบเท่านั้น (หรือควร) เตือนคุณเกี่ยวกับเรื่องนั้น ดู next-lineตัวอย่าง

ในการลบแทนที่จะฆ่าให้ตรวจสอบว่าkill-ringไม่มีการเปลี่ยนแปลง:

(goto-char (point-min))
(let (kill-ring)
  (comment-kill (count-lines (point-min) (point-max))))

ใช่ฉันเข้าใจแล้ว ปัญหาหลักของฉันเกี่ยวกับคำสั่งนี้คือ kill-ring (ซึ่งคุณตอบ) และปัญหาการปรับให้เหมาะสมที่อาจเกิดขึ้น (ซึ่งจะยังคงเป็นไปได้หากไม่มีสิ่งใดเทียบได้)
T. Verron

7

คำตอบของ @ Malabarba ดูเหมือนเป็นทางออกที่ง่ายที่สุดและหรูหราที่สุด อย่างไรก็ตามหากคุณทำสิ่งนี้มากพอที่จะรับประกันฟังก์ชั่นของตัวเองคุณสามารถปรับตัวcomment-killเพื่อลบโดยไม่ต้องดัดแปลงวงแหวนฆ่า นี่คือซอร์สโค้ดของ comment-killการเปลี่ยนบรรทัดเดียวเพื่อกำหนดcomment-delete:

(defun comment-delete (arg)
  "Delete the first comment on this line, if any.  Don't touch
the kill ring.  With prefix ARG, delete comments on that many
lines starting with this one."
  (interactive "P")
  (comment-normalize-vars)
  (dotimes (_i (prefix-numeric-value arg))
    (save-excursion
      (beginning-of-line)
      (let ((cs (comment-search-forward (line-end-position) t)))
    (when cs
      (goto-char cs)
      (skip-syntax-backward " ")
      (setq cs (point))
      (comment-forward)
      ;; (kill-region cs (if (bolp) (1- (point)) (point))) ; original
      (delete-region cs (if (bolp) (1- (point)) (point)))  ; replace kill-region with delete-region
      (indent-according-to-mode))))
    (if arg (forward-line 1))))

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

(defun comment-delete-dwim (beg end arg)
  "Delete comments without touching the kill ring.  With active
region, delete comments in region.  With prefix, delete comments
in whole buffer.  With neither, delete comments on current line."
  (interactive "r\nP")
  (let ((lines (cond (arg
                      (count-lines (point-min) (point-max)))
                     ((region-active-p)
                      (count-lines beg end)))))
    (save-excursion
      (when lines
        (goto-char (if arg (point-min) beg)))
      (comment-delete (or lines 1)))))

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


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