39 votes

La maison intelligente en Emacs

Peut-on avoir un comportement intelligent pour la touche d'accueil dans Emacs ? Par intelligent, j'entends qu'au lieu d'aller au caractère numéro 0, elle devrait aller au premier caractère non-blanc, et aller à 0 à la deuxième pression, et revenir au premier caractère non-blanc à la troisième pression et ainsi de suite. Une fin intelligente serait également appréciable.

63voto

cjm Points 44090
(defun smart-beginning-of-line ()
  "Move point to first non-whitespace character or beginning-of-line.

Move point to the first non-whitespace character on this line.
If point was already at that position, move point to beginning of line."
  (interactive "^") ; Use (interactive) in Emacs 22 or older
  (let ((oldpos (point)))
    (back-to-indentation)
    (and (= oldpos (point))
         (beginning-of-line))))

(global-set-key [home] 'smart-beginning-of-line)

Je ne suis pas sûr de ce que smart end ferait. Avez-vous normalement beaucoup d'espaces blancs à la fin ?

Note : La principale différence entre cette fonction et celle de Robert Vukovic est que la sienne se déplace toujours vers le premier caractère non blanc à la première pression sur la touche, même si le curseur s'y trouvait déjà. Dans ce cas, la mienne se déplace vers la colonne 0.

Aussi, il a utilisé (beginning-of-line-text) où j'ai utilisé (back-to-indentation) . Ils sont très similaires, mais il y a quelques différences entre eux. (back-to-indentation) se déplace toujours vers le premier caractère non blanc d'une ligne. (beginning-of-line-text) se déplace parfois au-delà des caractères non blancs qu'il considère comme insignifiants. Par exemple, sur une ligne de commentaire, il se déplace vers le premier caractère du texte du commentaire, et non vers le marqueur de commentaire. Mais l'une ou l'autre de ces fonctions peut être utilisée dans l'une ou l'autre de nos réponses, selon le comportement que vous préférez.

1 votes

Malheureusement, il ne fonctionne pas avec cua activé, dans ce cas shift pour la sélection ne fonctionne pas, shift home pour sélectionner la ligne complète ne fonctionne pas. Des suggestions ?

0 votes

@Alexander Stolz, je n'utilise jamais cua-mode, mais essayez d'ajouter (put 'smart-beginning-of-line 'CUA 'move) après le defun (c'est-à-dire juste avant le global-set-key ligne).

2 votes

Y a-t-il un moyen de faire fonctionner le mode shift-select sans activer le mode shift-select ?

12voto

Robert Vuković Points 2670

Cela fonctionne avec GNU Emacs, je ne l'ai pas essayé avec XEmacs.

(defun My-smart-home () "Odd home to beginning of line, even home to beginning of text/code."
    (interactive)
    (if (and (eq last-command 'My-smart-home)
            (/= (line-beginning-position) (point)))
    (beginning-of-line)
    (beginning-of-line-text))
)

(global-set-key [home] 'My-smart-home)

6voto

Gerard Thornley Points 51

Merci pour cette fonction très pratique. Je l'utilise tout le temps maintenant et je l'adore. J'ai juste fait un petit changement : (interactif) devient : (interactive "^")

Extrait de l'aide d'emacs : Si la chaîne de caractères commence par ^' and shift-select-mode' est non-nil, Emacs appelle d'abord la fonction `handle-shift-select'.

En gros, cela permet à shift-home de sélectionner depuis la position actuelle jusqu'au début de la ligne si vous utilisez le mode shift-select. C'est particulièrement utile dans le minibuffer.

4voto

Alex Coventry Points 11090

Notez qu'il existe déjà une fonction de retour à l'indentation qui fait ce que vous voulez que la première fonction smart-home fasse, c'est-à-dire aller au premier caractère non blanc de la ligne. Elle est liée par défaut à M-m.

0 votes

Oui, si vous lisez la réponse acceptée, vous remarquerez une discussion sur certaines des différences entre le retour à la ligne et le début de la ligne de texte.

0 votes

Pour moi, ce qui serait plus utile qu'une touche intelligente pour la maison serait de rendre M-m intelligente lors des appuis suivants, de la même manière que C-l est surchargé.

2voto

amynbe Points 77

Il existe maintenant un paquet qui fait exactement cela, mwim (Move Where I Mean)

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