킬 링으로 이동하지 않고 버퍼에서 모든 주석을 삭제하는 기능


9

elisp 코드의 버퍼에서 모든 주석을 제거 할 수 있어야합니다. 지금은 다음을 사용하고 있습니다.

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

그러나 comment-kill대화식 기능이며 기본 사용법은 한 번에 하나의 주석을 삭제하는 것입니다. 또한 킬 링에 살해 한 모든 주석을 추가하기 때문에 성가신 부작용이 있습니다.

버퍼에서 일부 또는 모든 주석을 삭제할 수있는 기능이 있습니까?


당신은 M-x flush-lines ^\s-*\/\/그 일에 영향을 줄 수 있습니다. 완벽하지는 않지만 몇 번 작동 할 수 있습니다.
wvxvw

@wvxvw 제안 해 주셔서 감사합니다! 그러나 나는 이런 식으로가는 것을 간단히 고려하고 너무 복잡하다고 결론을 내렸다. 플러시 라인은 그렇지 않을 것이다. 더 성가신 것은 주석에 대한 몇 가지 구문이 있으며 중첩되어 정규 표현식의 범위를 벗어나게 할 수 있습니다.
T. Verron

호기심으로, 댓글을 영구적으로 제거하겠습니까, 아니면 일시적으로 중단시키고 싶습니까? 당신은 아마 그들을 숨기고 싶습니까?
Drew

답변:


11

일반적으로 elisp 코드의 일부로 명령을 사용하는 데 아무런 문제가 없습니다. 대화식으로 만 사용되는 기능은 이에 대해 경고합니다. 참조 next-line예를 들어.

삭제하지 않고 죽이는 대신 kill-ring변경되지 않았 는지 확인하십시오 .

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

예, 알겠습니다 이 명령의 주요 문제는 킬 링 (응답) 및 잠재적 최적화 문제 (비교 할 것이 없다면 잠재적으로 남아 있음)입니다.
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.