Ich arbeite an dieser kleinen Funktion, die die nächste Zeile zur aktuellen Zeile hochzieht. Ich möchte eine Funktionalität hinzufügen, damit, wenn die aktuelle Zeile ein Zeilenkommentar ist und die nächste Zeile auch ein Zeilenkommentar ist, die Kommentarzeichen nach der Aktion "Hochziehen" entfernt werden.
Beispiel:
Vor
;; comment 1▮
;; comment 2
Berufung M-x modi/pull-up-line
Nach
;; comment 1▮comment 2
Beachten Sie, dass die ;;
Zeichen entfernt werden, die zuvor waren 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)))))
Die obige Funktion funktioniert , aber für jetzt, unabhängig von dem Haupt-Modus, wird es betrachten /
oder ;
oder #
als Kommentarzeichen: (looking-at "/\\|;\\|#")
.
Ich möchte diese Zeile intelligenter gestalten. Hauptmodus spezifisch.
Lösung
Dank der Lösung von @ericstokes glaube ich, dass das Folgende jetzt alle meine Anwendungsfälle abdeckt :)
(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
und comment-end
, die in c-mode
(aber nicht c++-mode
) auf "/ *" und "* /" gesetzt sind . Und c-comment-start-regexp
das passt zu beiden Stilen. Sie löschen die Endzeichen dann am Anfang nach dem Beitritt. Aber ich denke meine Lösung wäre es uncomment-region
, join-line
den comment-region
Emacs zu überlassen, welcher Kommentarcharakter was ist.
/* ... */
) zu verarbeiten?