Я працюю над цією маленькою функцією, яка підтягує наступний рядок до поточного рядка. Я хочу додати функціональність, так що якщо поточний рядок - це коментар до рядка, а наступний - також коментар до рядка, то символи коментарів видаляються після дії "підтягування".
Приклад:
До цього
;; 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
/* ... */
)?