현재 문자가 해당 주 모드의 주석 문자인지 어떻게 알 수 있습니까?


12

다음 줄을 현재 줄로 끌어 올리는이 작은 기능을 연구 중입니다. 현재 줄이 줄 설명이고 다음 줄도 줄 설명 인 경우 "풀업"작업 후에 설명 문자가 제거되도록 기능을 추가하고 싶습니다.

예:

전에

;; comment 1▮
;; comment 2

부름 M-x modi/pull-up-line

;; comment 1▮comment 2

;;이전 의 문자는 제거됩니다 comment 2.

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      (while (looking-at "/\\|;\\|#")
        (delete-forward-char 1))
      (when (looking-at "\\s-")
        (delete-forward-char 1)))))

위의 기능이 작동하지만 지금에 관계없이 주요 모드의, 그것은 고려할 것 /또는 ;#주석 문자로 : (looking-at "/\\|;\\|#").

이 라인을보다 지능적으로 만들고 싶습니다. 주요 모드 별.

해결책

@ericstokes의 솔루션 덕분에 아래의 모든 유스 케이스가 아래에 있다고 생각합니다. :)

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      ;; Delete all comment-start or space characters
      (while (looking-at (concat "\\s<" ; comment-start char as per syntax table
                                 "\\|" (substring comment-start 0 1) ; first char of `comment-start'
                                 "\\|" "\\s-")) ; extra spaces
        (delete-forward-char 1)))))

다른 주석 시작 및 종료 문자와 다중 문자 주석 (예 : C 's /* ... */) 을 처리 할 수있을 정도로 똑똑해지기를 원하십니까 ?
erikstokes

아니, 그게 내가 필요한 전부 야 감사!
Kaushal Modi

@erikstokes 호기심에서 C 스타일 주석을 어떻게 처리 하시겠습니까?
Pradhan

이 솔루션은 여러 줄 주석과 함께 즉시 작동하며 여러 줄 주석에 참여할 때 문자를 삭제할 필요가 없으므로 특별한 조치가 필요하지 않습니다.
Kaushal Modi

2
@Pradhan comment-startcomment-end문자열은 "/ *"및 "* /"로 설정되어 있습니다 c-mode(하지만 아님 c++-mode). 그리고 c-comment-start-regexp두 스타일에 모두 일치합니다. 가입 후 끝 문자를 삭제 한 다음 시작을 삭제합니다. 하지만 내 솔루션에있을 거라고 생각 uncomment-region, 및 주석 문자가 무엇을 무엇에 대한 이맥스 걱정을 할 수 있습니다. join-linecomment-region
erikstokes

답변:


12

구문 테이블을 사용하여 현재 문자가 주석 문자인지 확인할 수 있습니다 (looking-at "\\s<"). 정규 표현식 \\s<은 모든 문자를 "comment start"구문과 일치시킵니다. \\s>"comment end"구문과 일치합니다.

또 다른 옵션은 변수입니다 comment-start. 이는 comment-dwim친구가 삽입 한 문자열 입니다. 일반적으로 주석 시작 문자와 공백이 설정됩니다.


2

훨씬 간단 솔루션 에서 내 코드를 공부하십시오 https://github.com/redguardtoo/evil-nerd-commenter/blob/master/evil-nerd-commenter.el

여기에 모든 코드를 복사 / 붙여 넣지 않습니다. 그러나 핵심 사항은 다음과 같습니다.

  • 주석에는 내 코드에서 자체 글꼴 얼굴, 검색 글꼴 잠금 주석 얼굴 및 글꼴 잠금 주석 구분 문자가 있습니다.

  • Emacs 자체 API를 사용하여 두 번째 줄의 주석 처리를 제거한 다음 첫 번째 줄과 결합하십시오.

현명한 주요 모드에서 작동해야합니다.

이 속임수는 나에 의해 발명되지 않았습니다. 실제로는 Emacs 자체 코드 (특히, flyspell)에서 가져온 것입니다. 따라서 솔루션은 모든 주요 모드 플라이 스펠 지원을 지원해야합니다.


3
주석으로 무언가를 강조 표시하려면 구문 테이블을 적절하게 설정해야하므로 구문을 보는 것보다 똑똑한 것 같습니다.
wasamasa

내 코드에 설명 된대로 Emacs 자체 코드 (실제로 플라이 스펠)를 읽음 으로써이 트릭을 배웠습니다.
chen bin

0

lisp 코드 (Elisp, Clojure, Scheme 및 Common Lisp)에 대해이 기능을 찾고 있다면 lispy 를 시도해야합니다 lispy-fill.이 함수 는 이런 종류의 기능을 수행합니다.

이 기능을 다른 언어로 찾고 있다면 rebox2 ( C및 확인 됨 Python), 호출 된 함수 rebox-fill또는 호출 된 다른 함수 rebox-dwim가 이런 종류의 작업을 수행해야합니다.

그들은 모두 큰 패키지이며, 그들은 서로 다른 메이저 모드에 사용되기 때문에 서로 충돌하지 않고, 그들은 둘 다 (이다 lispy-fillrebox-dwim)에 결합 M-q멋지다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.