Arrêtez-vous au début d'un mot sur "avant-mot"

17

J'utilise souvent plusieurs invocations forward-wordsuivies d'une seule backward-wordpour déplacer le point au début d'un mot sur une ligne. Je suppose que je ne me suis jamais habitué à la façon dont forward-worddiffère de Vim wet même après des années d'utilisation d'Emacs, je ne peux pas m'habituer à la différence.

Existe-t-il une fonction que je pourrais utiliser au lieu de forward-wordcela qui ne saute pas par-dessus les mots mais s'arrête également au début d'un mot? Existe-t-il d'autres stratégies pour passer au début d'un mot lors de la progression d'un point qui n'impliquent pas une exécution répétée forward-char?

rekado
la source
Vous pouvez (à un moment donné) être intéressé à écrire votre propre mot / paragraphe avant / arrière et les fonctions de mot de passe connexes. Voici trois liens vers certaines fonctions personnalisées que j'utilise quotidiennement - le comportement ressemble étroitement à certains traitements de texte que j'ai utilisés au fil des ans: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
lawlist

Réponses:

24

Le miscpaquet (livré avec emacs) a la fonction intégrée forward-to-word, qui fait ce que je pense que vous voulez:

forward-to-word is an interactive compiled Lisp function in `misc.el'.

It is bound to M-f.

(forward-to-word ARG)

Move forward until encountering the beginning of a word.
With argument, do this that many times.

Pour l'utiliser, ajoutez d'abord (require 'misc)à votre fichier de configuration.

obsolète
la source
Merci, c'est utile. Malheureusement, cela ne s'arrête pas également à la fin d'un mot.
rekado
1
Certes, mais pas non plus w. Pour autant que je sache, il existe un mappage vim-emacs presque parfait: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Mais je ne suis pas un utilisateur expert de Vim, alors il me manque peut-être une subtilité.
déconseillé
Hé, vous avez en fait raison. Je suppose que chaque fois que je suis dans vim w, eet bje m'éloigne et je me déplace. Bizarre. J'étais certain d'être warrêté aux deux points! Donc, j'accepte votre réponse, car elle correspond exactement à ma question :)
rekado
4

Vous pouvez lier la fonction ci-dessous à M-fet lier l'original forward-wordà M-F. Cette fonction prend simplement le arget le transmet à la forward-wordfonction. Ainsi, les arguments universels fonctionneront aussi bien qu'avec la fonction d'origine.

(defun modi/forward-word-begin (arg)
  "Move forward a word and end up with the point being at the beginning of the
next word.  Move point forward ARG words (backward if ARG is negative).
If ARG is omitted or nil, move point forward one word."
  (interactive "p")
  (forward-word arg)
  (forward-word 1)
  (backward-word 1))

Attention cependant, la fonction ci-dessus peut ne pas toujours faire la bonne chose ; cela dépend beaucoup du fait que le point se trouve déjà au début d'un mot ou non.


Voici une autre façon de mettre en œuvre ce qui précède où la limite de mot n'est pas conforme à la table de syntaxe mais strictement sur la séparation des espaces:

(defun modi/forward-word-begin (arg)
  "Move forward ARG (defaults to 1) number of words.
Here 'words' are defined as characters separated by whitespace."
  (interactive "p")
  (dotimes (_ arg)
    (forward-whitespace 1)))

Le crédit va à @glucas pour cette idée.

Kaushal Modi
la source
1

Après une longue et pénible recherche des fonctions parfaites de «mot avant / arrière», j'ai trouvé ce qui suit, dont je suis maintenant très heureux:

(progn
  (defun boundary ()
    (and      (= (char-syntax (char-after))  ?w)
         (not (= (char-syntax (char-before)) ?w))))
  (defun my-forward-word ()
    (interactive) 
    (while (progn (forward-char)  (not (boundary)))))
  (defun my-backward-word ()
    (interactive) 
    (while (progn (backward-char) (not (boundary)))))
  (global-set-key [M-right] 'my-forward-word)
  (global-set-key [M-left]  'my-backward-word)
  )
Ruy
la source
0

Si vous êtes prêt à utiliser evil, wdans un état normal est lié à evil-forward-word-begin, qui est la fonctionnalité de style Vim que vous recherchez.

Dan
la source
J'avais l'habitude d'utiliser evilil y a longtemps, mais depuis un certain temps j'utilise god-modedes liaisons Emacs régulières.
rekado
0

J'utilise souvent plusieurs invocations de mot avant suivies d'un seul mot arrière pour déplacer le point au début d'un mot sur une ligne.

Comme vous le mentionnez, l'astuce consiste à avancer deux mots, puis un mot à l'envers.

Ce qui suit devrait faire l'affaire et respecter les autres modes comme le mode sous-mot.

(define-key global-map (kbd  "M-f")
  (lambda ()
    (interactive)
    (forward-word)
    (forward-word)
    (backward-word)))

Il s'agit d'une version rudimentaire de /emacs//a/4272/508 qui ne couvre pas certains cas, mais plus facile à comprendre.

ustun
la source