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)))))
quelle
/* ... */
) zu verarbeiten?comment-start
undcomment-end
, die inc-mode
(aber nichtc++-mode
) auf "/ *" und "* /" gesetzt sind . Undc-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 esuncomment-region
,join-line
dencomment-region
Emacs zu überlassen, welcher Kommentarcharakter was ist.Antworten:
Sie können überprüfen , ob das aktuelle Zeichen ein Kommentarzeichen unter Verwendung der Syntax - Tabelle ist:
(looking-at "\\s<")
. Der reguläre Ausdruck entspricht einem\\s<
beliebigen Zeichen mit der Syntax "Kommentaranfang".\\s>
Entspricht der Syntax "Kommentarende".Eine weitere Option ist die Variable
comment-start
, bei der es sich um die voncomment-dwim
und friends eingefügte Zeichenfolge handelt . Es wird normalerweise auf das Kommentar-Startzeichen plus ein Leerzeichen gesetzt.quelle
Es gibt eine viel einfachere Lösung . Bitte lesen Sie meinen Code unter https://github.com/redguardtoo/evil-nerd-commenter/blob/master/evil-nerd-commenter.el
Ich werde hier nicht den gesamten Code kopieren / einfügen. Aber hier sind die wichtigsten Punkte:
Kommentar hat seine eigene Schriftart, Suche Schriftart-Sperre-Kommentar-Gesicht und Schriftart-Sperre-Kommentar-Trennzeichen-Gesicht in meinem Code
Verwenden Sie die Emacs-eigene API, um das Kommentarzeichen für die zweite Zeile zu entfernen, und verbinden Sie sie dann mit der ersten Zeile
Es sollte auf allen vernünftigen Hauptmodi funktionieren.
Dieser Trick ist nicht von mir erfunden. Es ist eigentlich aus Emacs eigenem Code (genauer gesagt Flyspell). Die Lösung sollte daher alle von Flyspell unterstützten Hauptmodi unterstützen
quelle
Wenn Sie mit dieser Funktion nach Lisp-Code suchen (Elisp, Clojure, Scheme und Common Lisp), sollten Sie lispy ausprobieren . Eine Funktion namens
lispy-fill
erledigt dies.Wenn Sie diese Funktion für eine andere Sprache suchen, sollten Sie rebox2 (überprüft für
C
undPython
), eine aufgerufene Funktionrebox-fill
oder eine andere aufgerufene Funktion sorebox-dwim
etwas tun.Sie sind beide großartige Pakete, und sie stehen nicht in Konflikt miteinander, da sie für verschiedene Hauptmodi verwendet werden, und sie sind beide (
lispy-fill
undrebox-dwim
) daran gebundenM-q
, ziemlich ordentlich.quelle