11
votes

Sur le comportement de mot avant et en arrière dans Emacs

Je ne sais pas s'il y a quelque chose qui ne va pas avec mes paramètres, mais quand j'appuie sur M-F (en avant un mot) Peu importe où je suis, il ne place jamais le curseur dans le mot suivant (juste entre les mots). Cela n'arrive pas avec M-B qui placez mon curseur au début du mot précédent.

Est-ce un comportement normal? Comment placer mon curseur au début du mot suivant?


2 commentaires

Vous pouvez obtenir ce résultat avec M-F C-F :)


Déjà demandé et a répondu: Stackoverflow.com/ Questions / 1771102 / ...


6 Réponses :


4
votes

C'est un comportement correct. Selon le manuel de l'EMACS , "[F] Orbord Motion s'arrête juste après la dernière lettre du mot, tandis que le mouvement en retard s'arrête juste avant la première lettre. "

Pourquoi est-ce de cette façon? Peut-être être cohérent avec Kill-Word (M-D).


0 commentaires

7
votes

Ok, juste pour que ce soit clair, Im va supposer que vous parlez des commandes forward-word et en arrière-mot ceux-ci sont liés par défaut à < KBD> Alt + f et Alt + b

string par exemple: "Bonjour dolly Je suis ici"

Si le curseur est sur le « H » de « Bonjour », et vous faites forward-word le curseur se déplace à l'espace entre « Bonjour » et « dolly », mais il semble que vous voulez que le curseur soit sur la lettre « d » de « dolly » au lieu de en face.

Alors, faites-en avant-mot deux fois, puis mot en arrière une fois.

Cela va mettre votre curseur sur le "d" de "dolly".

Ceci peut être automatisé avec une macro.

;; = Commentaires, ne tapez pas les

Ctrl + x ( ;; début macro

Alt + f Alt + f Alt + b

Ctrl + x ) ;; macro final

Ensuite, pour exécuter la macro dernière défini faire ceci:

Ctrl + x e

EDIT: comme mentionné dans un pascals commentaire, cela peut aussi simplement être fait avec

Alt + f Ctrl + f

Vous pouvez mettre cela dans une macro aussi bien, de toute façon le résultat est le même.


3 commentaires

Merci. Je suppose que je suis toujours souffrant de traumatisme post-vim (W et B Keys)


Ouais, j'ai le sentiment que ce que vous commencez par vous de coloriera vraiment votre perception de l'autre éditeur de texte. J'ai commencé avec Vim et je ne peux pas croire que dans Emacs, vous ne pouvez pas simplement taper 'W' et 'B' pour sauter des mots comme vous le pouvez dans Vim.


Je suis aussi un Vim Convertir (bien que plus de 3 ans maintenant), et la commande w . M-F C-F ne fonctionne pas toujours, surtout s'il y a plusieurs espaces entre les mots.



12
votes

La solution macro décrite est un excellent moyen d'obtenir ce comportement dans une session, mais c'est un peu gênant si c'est le comportement par défaut que vous souhaitez, car vous devez le définir chaque fois que vous démarrez EMACS. Si vous voulez que M-F fonctionne comme tout le temps, vous pouvez définir une fonction ELISP et le lier à la clé. Mettez ceci dans votre fichier .emacs: xxx


0 commentaires

0
votes

Essayez quelque chose comme suit:

;; replace common word-operations on same-syntax-operations

(require 'thingatpt)

(global-set-key "\M-f" 'forward-same-syntax)

(global-set-key "\M-b" (lambda() 
                         (interactive)
                         (forward-same-syntax -1)))

(defun kill-syntax (&optional arg)
  "Kill ARG sets of syntax characters after point."
  (interactive "p")
  (let ((opoint (point)))
    (forward-same-syntax arg)
    (kill-region opoint (point))))

(global-set-key "\M-d" 'kill-syntax)

(global-set-key [(meta backspace)] (lambda()
                                     (interactive) 
                                     (kill-syntax -1)))


0 commentaires

4
votes

Avancer vers l'avant deux fois et vers l'arrière est une fois bien, sauf si vous êtes au début d'une ligne avec des espaces à l'avant. Ensuite, aller de l'avant deux fois et le dos vous déplacera une fois au mot suivant, pas le premier mot. Le code ci-dessous affichera parfaitement la commande "W" de VI. J'ai écrit cela assez vite afin que ce code puisse être nettoyé plus loin.

(defun forward-word-to-beginning (&optional n)
  "Move point forward n words and place cursor at the beginning."
  (interactive "p")
  (let (myword)
    (setq myword
      (if (and transient-mark-mode mark-active)
        (buffer-substring-no-properties (region-beginning) (region-end))
        (thing-at-point 'symbol)))
    (if (not (eq myword nil))
      (forward-word n))
    (forward-word n)
    (backward-word n)))

(global-set-key (kbd "M-C-f") 'forward-word-to-beginning)


1 commentaires

Cela rompt quand il y a un soulignement entre les mots.



0
votes

Vous pouvez réaliser ce comportement en utilisant le Forward-Word code> et en arrière-mot code> trouvé dans misc.el code>. J'ai ces éléments liés à Meta-F / Meta-B Code> (c'est-à-dire avec Maj enfoncé). Celles-ci sont équivalentes à Meta-F / Meta-B Code> pour Word Forward / Backward-Word Code>

My .emacs contient les liaisons suivantes P>

(global-set-key (kbd "M-F") #'forward-to-word)
(global-set-key (kbd "M-B") #'backward-to-word)


0 commentaires