次の行を現在の行に引き上げるこの小さな機能に取り組んでいます。現在の行が行コメントで、次の行も行コメントである場合、「プルアップ」アクションの後にコメント文字が削除されるように機能を追加します。
例:
前
;; 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)))))
comment-start
とcomment-end
に設定されている文字列「/ *」と「* /」でc-mode
(なくc++-mode
)。そしてc-comment-start-regexp
、両方のスタイルに一致するものがあります。終了文字を削除してから、結合後に開始文字を削除します。しかし、私は私の解決策は、になるだろうと思うuncomment-region
、とコメント文字が何であるかについてEmacsの心配をしましょう。join-line
comment-region
/* ... */
)を処理するのに十分スマートにしたいですか?