Я работаю над этой маленькой функцией, которая подтягивает следующую строку к текущей. Я хочу добавить функциональность, чтобы, если текущая строка является комментарием к строке, а следующая строка также является комментарием к строке, символы комментария удаляются после действия «подтягивание».
Пример:
Перед
;; 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
, join-line
чтобы comment-region
и Emacs беспокоился о том, что такое символ комментария.
/* ... */
)?