43 votes

Emacs commenter/décommenter la ligne actuelle

Je sais qu'il y a déjà une question sur Emacs à ce sujet et qu'elle a été fermée, mais je la trouve assez pertinente et importante.

En gros, je veux commenter/décommenter la ligne actuelle. Je m'attendais à ce que ce soit assez facile avec une macro, mais j'ai trouvé que ce n'était pas vraiment le cas.

Si la ligne actuelle est commentée, décommentez-la. Si elle n'est pas commentée, commentez-la. Et je voudrais aussi commenter toute la ligne, pas juste à partir de la position du curseur.

J'ai essayé une macro comme ceci:

C-a

'comment-dwim

Mais cela ne fonctionne que pour commenter une ligne, pas pour la décommenter si elle est déjà commentée.

Je ne suis pas sûr de la facilité avec laquelle cela peut être fait, mais s'il y a un moyen, j'aimerais vraiment le savoir.

Aussi, la raison pour laquelle j'aime tellement cette idée est que quand j'utilisais Geany, je me contentais de faire C-e et c'était parfait.

94voto

Gerstmann Points 1830

La fonction de Trey fonctionne parfaitement, mais elle n'est pas très flexible.

Essayez ceci à la place:

(defun comment-or-uncomment-region-or-line ()
    "Commente ou décommente la région ou la ligne actuelle s'il n'y a pas de région active."
    (interactive)
    (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning) end (region-end))
            (setq beg (line-beginning-position) end (line-end-position)))
        (comment-or-uncomment-region beg end)))

Cela commente/décommente la ligne actuelle ou la région si une est active.


Si vous préférez, vous pouvez modifier la fonction pour aller à la ligne suivante après avoir commenté/décommenté la ligne actuelle de cette manière:

(defun comment-or-uncomment-region-or-line ()
    "Commente ou décommente la région ou la ligne actuelle s'il n'y a pas de région active."
    (interactive)
    (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning) end (region-end))
            (setq beg (line-beginning-position) end (line-end-position)))
        (comment-or-uncomment-region beg end)
        (next-line)))

Notez que la seule chose qui a changé est l'ajout de la commande next-line à la fin de la fonction.

40voto

Trey Jackson Points 49816

Essayez cette fonction, et associez-la à votre touche préférée :

(defun toggle-comment-on-line ()
  "commenter ou décommenter la ligne en cours"
  (interactive)
  (comment-or-uncomment-region (line-beginning-position) (line-end-position)))

10voto

Arne Points 1277

J'ai repris la réponse de Trey et l'ai affinée, de sorte qu'elle fonctionne également lorsque qu'une région est active, mais qu'elle fonctionne ensuite sur cette région :

(defun comment-or-uncomment-line-or-region ()
  "Commente ou décommente la ligne ou la région actuelle."
  (interactive)
  (if (region-active-p)
      (comment-or-uncomment-region (region-beginning) (region-end))
    (comment-or-uncomment-region (line-beginning-position) (line-end-position))
    )
  )

(define-key c-mode-base-map (kbd "C-/") 'comment-or-uncomment-line-or-region)

3voto

Michael Wilson Points 312

Je suis surpris que la routine comment-region n'ait pas été mentionnée. (Bien que j'admets que cela puisse indiquer que j'ai raté quelque chose.) J'ai eu la ligne suivante dans mon fichier .emacs depuis près de 20 ans. Cela fonctionne bien dans la plupart des modes de programmation majeurs qui m'intéressent.

(global-set-key "\C-c\C-c" 'comment-region)

À partir de la documentation de 'comment-region'

Documentation : Commenter ou décommenter chaque ligne dans la région. Avec simplement l'argument préfixé C-u, décommentez chaque ligne dans la région. L'argument préfixé numérique ARG signifie utiliser ARG caractères de commentaire. Si ARG est négatif, supprimez autant de caractères de commentaire à la place. Les commentaires se terminent sur chaque ligne, même pour la syntaxe dans laquelle un saut de ligne ne met pas fin au commentaire. Les lignes vides ne reçoivent pas de commentaires.

1voto

event_jr Points 9805

Je pense que vous ne comprenez pas comment fonctionnent les macros clavier. Ce que @Trey a fourni est une commande Emacs-Lisp. Vous auriez pu accomplir cela par vous-même sans comprendre Emacs-Lisp.

Commencez par déterminer la séquence de touches qui fait ce que vous voulez, puis enregistrez cette séquence comme macro.

Vous avez proposé ceci: C-a M-; (M-; est comment-dwim). Est-ce que cela fait ce que vous aviez en tête? Si ce n'est pas le cas, cela ne fonctionnera pas magiquement lorsque vous le rejouerez comme une macro clavier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X