Chức năng xóa tất cả các bình luận từ một bộ đệm, mà không di chuyển chúng để giết vòng


9

Tôi cần có thể xóa tất cả các bình luận khỏi bộ đệm từ mã elisp. Hiện tại, tôi đang sử dụng:

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

Tuy nhiên, comment-killlà một chức năng tương tác và cách sử dụng chính của nó là xóa một bình luận tại một thời điểm. Ngoài ra, nó có tác dụng phụ có thể nhìn thấy gây phiền nhiễu, vì nó thêm tất cả các ý kiến ​​mà nó đã giết vào vòng giết.

Có một chức năng cho phép xóa (không giết) một số hoặc tất cả các bình luận từ một bộ đệm?


Bạn có thể làm M-x flush-lines ^\s-*\/\/hoặc một cái gì đó để có hiệu lực. Không hoàn hảo, nhưng có thể làm việc một số lần.
wvxvw 16/12/14

@wvxvw Cảm ơn bạn đã gợi ý! Tuy nhiên, tôi đã cân nhắc ngắn gọn về cách này và kết luận rằng nó sẽ quá phức tạp: dòng không được thực hiện, bởi vì các bình luận có thể không lấy toàn bộ dòng (thay thế regrec sẽ ổn thôi tôi đoán vậy); khó chịu hơn, có một số cú pháp cho các bình luận, và chúng có thể được lồng vào nhau, làm cho nó (có thể) nằm ngoài tầm với của regexps.
T. Verron

Vì tò mò, bạn có muốn các bình luận bị xóa vĩnh viễn hay bạn chỉ muốn đưa chúng ra khỏi đường tạm thời? Bạn có lẽ chỉ muốn giấu chúng?
vẽ

Câu trả lời:


11

Nói chung, không có gì sai khi sử dụng các lệnh như một phần của mã elisp. Những chức năng chỉ dành cho sử dụng tương tác sẽ (hoặc nên) cảnh báo bạn về điều đó. Xem next-lineví dụ.

Để xóa, thay vì giết, chỉ cần đảm bảo kill-ringkhông thay đổi:

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

Vâng, tôi hiểu điều đó. Vấn đề chính của tôi với lệnh này là kill-ring (mà bạn trả lời) và các vấn đề tối ưu hóa tiềm năng (sẽ vẫn tiềm năng nếu không có gì để so sánh với).
T. Verron 16/12/14

7

Câu trả lời của @ Malabarba giống như giải pháp đơn giản và thanh lịch nhất. Tuy nhiên, nếu bạn làm điều này đủ để nó đảm bảo chức năng của chính nó, bạn cũng có thể điều chỉnh comment-killđể xóa mà không cần sửa đổi vòng kill. Đây là mã nguồn của comment-killthay đổi một dòng để xác định 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))))

Và đây là một chức năng (NB: được kiểm tra tối thiểu) cung cấp một số chức năng bổ sung, cho phép bạn xóa nhận xét trên dòng hiện tại, trong vùng hoạt động hoặc trong toàn bộ bộ đệm:

(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ôi đã không kiểm tra các vấn đề về hiệu suất, nhưng có lẽ có một vết sưng nhỏ khi không chạm vào vòng giết. Bất kể, tôi nghi ngờ bạn sẽ nhận thấy các vấn đề về hiệu suất trừ khi bạn làm việc với một bộ đệm thực sự lớn. Nhưng vì bạn không thể sử dụng chức năng này rất thường xuyên, nên có vẻ như nó không đáng để nỗ lực tối ưu hóa.


Oh, chức năng được chạy khá thường xuyên, và đôi khi trên bộ đệm lớn. Nhưng máy móc mà nó là một phần của một số nút thắt tồi tệ hơn, ít nhất là cho đến nay.
T. Verron 16/12/14
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.