코드 주석을위한 완전 자동 채우기-단락 모드가 있습니까?


18

입력하는 동안 항상 단락을 채울 수있는 마이너 모드를 찾고 있습니다 ( aggressive-indent-mode들여 쓰기 와 비슷한 기능 ). 또한 주석 만 채울 수있을 정도로 똑똑해야합니다 (언어에 따라 문자열 일 수도 있음).

내가 시도한 것들은 다음과 같습니다.

  • auto-fill-mode 새 단락을 입력하는 동안 자동으로 채워지지만 단락을 편집 할 때 다시 채워지지 않습니다.

  • refill-mode 끊임없이 단락을 채우지 만 주석뿐만 아니라 단락으로 코드를 감싸려고합니다.

  • 나는 후크에 추가 fill-paragraph를 시도했지만 after-change-functions실행 취소 및 많은 다른 것들을 망쳐 놓았습니다 (아마도 모두 고칠 수 있지만 약간의 노력이 필요할 것입니다).

더 좋은 아이디어가 있습니까?


6
따로 : Glickstein의 GNU Emacs Extension 작성 7 장에서는 사용자가 수행 한 기능을 구현하는 방법을 안내합니다. elisp로 배우고 연습 할 수있는 좋은 기회가 될 수 있습니다.
Dan

에서 자동 완성 단락 (자동 완성이 활성화 된 상태)을보고 org-mode있지만 rebox2를
CodyChan

답변:


4

이 기능을 구현하는 최소한의 방법을 찾았습니다. 스페이스 바를 바인딩하여 호출하십시오 (fill-paragraph)!

(defun fill-then-insert-space ()
  (interactive)
  (fill-paragraph)
  (insert " "))
(global-set-key (kbd "SPC") #'fill-then-insert-space)

내가 지금까지 우연히 발견 한 몇 가지주의 사항이 있습니다.

  1. elisp-mode(아마도 다른 사람들)은 호출 할 때 멋진 코드 작성을 수행합니다 fill-paragraph. 원하는 것이거나 아닐 수도 있습니다. 포인트가 주석 또는 docstring에있는 경우 테스트로 해결할 수는 있지만 어떻게 해야할지 모르겠습니다.

  2. fill-paragraph후행 공백을 죽이면 여러 공간을 쉽게 입력 할 수없는 경우가 있습니다 . 스페이스 바는 이제 just-one-space바인딩을로 대체해도 괜찮습니다 (insert " ").

나는이 기능을 포함하는 작은 모드, 그것은에 사용할 수 만든 GitHub의 또는 melpa 패키지 aggressive-fill-paragraph.


나는 그것이 아이러니 찾을 aggressive-fill-paragraph훨씬 덜 공격적보다 refill-mode꽤 쓸모있는 공격적인 최대 인 (당신도 누군가를 인용 할 수 없기 때문에 > 리필 모드 재배치 재료없이 : 당신이 교체 regexps '에를 사용하는 경우에도) .
안녕 천사

1

리필 모드의 동작 방식이 마음에 들지만 (:: p) 동작 하지 않을 때는 올바른 조건에 있지 않을 때마다이를 억제하여 비교적 쉽게 고칠 수 있습니다.

예를 들어

(defvar plop/refill-enabler-function nil)

(defun plop/region-in-comment (beg end)
  ;; should really be comment-only-p, but that seems really broken for me
  (not
   (loop for c from beg to end
      if (not (eq 'font-lock-comment-face (get-char-property c 'face)))
      return t)))

(defun plop/refill-after-change-function (beg end len)
  (unless undo-in-progress
    (when (and plop/refill-enabler-function
               (funcall plop/refill-enabler-function beg end))
      (setq refill-doit end))))

(defun plop/install-refill-hack ()
  (if refill-mode
      (progn
        (add-hook 'after-change-functions 'plop/refill-after-change-function nil t)
        (remove-hook 'after-change-functions 'refill-after-change-function t))
    (progn
      (remove-hook 'after-change-functions 'plop/refill-after-change-function t))))

(defun plop/refill-hook ()
  (set (make-local-variable 'plop/refill-enabler-function)
       #'plop/region-in-comment)
  (add-hook 'refill-mode-hook 'plop/install-refill-hack t t)
  (refill-mode))

(add-hook 'some-hook 'plop/refill-hook)

기본적으로 리필을 트리거하는 기능을 제거 after-change-functions하고 정확히 동일한 작업을 수행하기 전에 주석에 있는지 확인하는 기능으로 대체합니다.


좋은 시작처럼 보이지만 여전히 올바르지는 않습니다. 주석을 편집하는 동안 리필이 트리거되면 주변 코드를 포함하여 전체 단락을 리필합니다. 이것은 단락 제한을 올바르게 정의하지 않은 주변 모드의 결함 일지 모르지만 의심합니다. Emacs Lisp 모드에서 시도했습니다.
Gilles 'SO- 악마 그만해'

글쎄, 그것이 내가 싫어한다고 말한 이유이다 refill-mode.) 문제는 대신 을 refill-mode사용 fill-region하여 fill-paragraph, 명예를 fill-paragraph-function
Sigma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.