6 votes

Emacs : déplacer le point vers le dernier caractère non blanc

M-m ( back-to-indentation ) se déplace vers le premier caractère non blanc de la ligne. J'aimerais faire l'inverse : déplacer le point vers le dernier caractère sans espace sur la ligne. Je n'ai pas réussi à trouver une commande "intégrée" pour cela et je ne suis pas assez familier avec ELisp pour écrire quelque chose, donc toute aide serait appréciée.

7voto

phils Points 30543
(defun my-move-end-of-line-before-whitespace ()
  "Move to the last non-whitespace character in the current line."
  (interactive)
  (move-end-of-line nil)
  (re-search-backward "^\\|[^[:space:]]"))

5voto

nullptr Points 5432

Normalement, dans cette situation, je veux atteindre le dernier caractère qui n'est pas un espace blanc et aussi supprimer l'espace de fin de ligne, donc j'utilise ceci :

M-\ runs the command delete-horizontal-space, which is an interactive
compiled Lisp function in `simple.el'.

Dans les rares cas où je voudrais préserver les espaces, j'utilise simplement M-b M-f ( backward-word , forward-word ), ce qui est généralement assez proche.

1voto

kindahero Points 2708

Je pense que Phils a déjà répondu à votre question. Juste un autre POW les espaces blancs traînants sont très ennuyeux, invisibles et sujets à des bugs( ?). J'ai donc un crochet pour before-save-hook pour les supprimer.

;;; delete nasty hidden white spaces at the end of lines
(add-hook 'before-save-hook 'delete-trailing-whitespace)

Ainsi, votre opération en retrait devient simplement C-e pour moi.

1voto

justinokamoto Points 151

J'ai écrit cette fonction pour se lier à C-e (habituellement move-end-of-line ). C-e fonctionne comme d'habitude, mais si votre pointeur est déjà à la fin de la ligne, il enlèvera les espaces de fin de ligne.

(defun my/smarter-move-end-of-line (arg)
  "Move to the last non-whitespace character in the current line.

Move point to end of this line. If point is already there, delete
trailing whitespace from line, effectively moving pointer to last
non-whitespace character while also removing trailing whitespace.

If ARG is not nil or 1, move forward ARG - 1 lines first."
  (interactive "^p")
  (setq arg (or arg 1))

  ;; Move lines first
  (when (/= arg 1)
    (let ((line-move-visual nil))
      (forward-line (1- arg))))
  (let ((orig-point (point)))
    (move-end-of-line 1)
    (when (= orig-point (point))
      (delete-horizontal-space))))

Remap C-e :

;; remap C-e to 'smarter-move-end-of-line'
(global-set-key [remap move-end-of-line]
        'my/smarter-move-end-of-line)

0voto

Bach Lien Points 670

Ma version : Déplacer à la fin de la ligne ou au dernier non-espace (en supprimant les espaces de fin)

(defun smart-end-of-line ()
  "Move to end of line or last non-space (by deleting ending spaces)"
  (interactive "^")
  (let ((p (point)))
    (end-of-visual-line)
    (if (= p (point)) (end-of-line))
    (if (= p (point)) (let (deactivate-mark) (delete-horizontal-space)))))
(global-set-key [end] 'smart-end-of-line)
(global-set-key "\C-e" 'smart-end-of-line)

El [end] y "\C-e" (control+e) :

  • Déplacez le curseur (point) à l'extrémité de la ligne visuelle.
  • S'il se trouve déjà à la fin de la ligne visuelle, déplacez-le à la fin de la ligne.
  • S'il est déjà là, déplacez-le vers le dernier caractère sans espace blanc de la ligne en supprimant tous les espaces blancs de fin de ligne.
  • Pendant le déplacement, gardez la région ( interactive "^" ).
  • El let (deactivate-mark) est de s'assurer que la région est conservée.

Ceci est tiré de @justinokamoto ; puis j'ajoute la fin de la ligne visuelle. (Désolé pour mon anglais approximatif).

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