killリングに移動せずに、バッファからすべてのコメントを削除する機能


9

elispコードのバッファからすべてのコメントを削除できるようにする必要があります。今のところ、私は使用しています:

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

ただし、comment-killはインタラクティブな機能であり、その主な用途は一度に1つのコメントを削除することです。さらに、キルしたリングにキルしたすべてのコメントを追加するため、目に見える副作用があります。

バッファからコメントの一部またはすべてを削除する(削除しない)ことができる関数はありますか?


あなたがすることができるM-x flush-lines ^\s-*\/\/か、その効果に何か。完璧ではありませんが、うまくいく場合もあります。
wvxvw

@wvxvw提案ありがとうございます!しかし、私は簡単にこの方法を検討し、それが複雑すぎると結論付けました。コメントが行全体をとらない場合があるため、フラッシュ行は機能しません(replace-regexpはおそらくOKでしょう)。さらに厄介なことに、コメントにはいくつかの構文があり、それらは入れ子にできるため、(おそらく)正規表現の範囲外になります。
T. Verron、2014

好奇心から、コメントを完全に削除しますか、それとも一時的にコメントを削除しますか?おそらくそれらを非表示にしたいだけですか?
2014

回答:


11

一般に、elispコードの一部としてコマンドを使用することには何の問題もありません。インタラクティブな使用のみを目的とした関数は、そのことを警告します(または警告します)。next-lineたとえばを参照してください 。

削除する代わりに、強制終了する代わりに、kill-ringが変更されていないことを確認してください:

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

はい、わかりました。このコマンドの私の主な問題は、キルリング(ユーザーが答える)と潜在的な最適化の問題(比較するものがない場合は潜在的に残る)です。
T. Verron、2014

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.バーロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.