2010-01-16 15 views
8

No sé si hay algún problema con mi configuración, pero cuando presiono Mf (reenviar una palabra) no importa dónde esté, nunca coloca el cursor en la siguiente palabra (solo entre palabras). Esto no ocurre con M-b que coloca mi cursor al comienzo de la palabra anterior.Acerca del comportamiento de una palabra hacia delante y hacia atrás en Emacs

¿Es esto un comportamiento normal? ¿Cómo coloco mi cursor al comienzo de la siguiente palabra?

+0

Puede obtener ese resultado con M-f-f C :) –

+3

ya formuladas y contestadas: http://stackoverflow.com/questions/1771102/changing-emacs-forward-word-behaviour/1772365#1772365 – scottfrazer

Respuesta

7

bien, sólo para que quede claro, voy a suponer que usted está hablando sobre los comandos forward-word y backward-word éstos están obligados por defecto para Alt +f y Alt + b

por ejemplo cadena: "Hello Dolly estoy aquí"

Si el cursor está en la "H" de "Hola", y que hago forward-word el cursor se moverá al espacio entre "Hello" y "dolly", pero parece que desea que el cursor esté en la letra "d" de "dolly" en lugar de al frente.

Por lo tanto, haga la palabra directa dos veces, luego la palabra hacia atrás una vez.

Eso pondrá el cursor en la "d" de "dolly".

Esto se puede automatizar con una macro.

;; = Comentarios, no escriba ellos

Ctrl + x( ;; comenzar macro

Alt + fAlt + fAlt + b

Ctrl + x) ;; extremo macro

continuación para ejecutar la última definido macro hacer esto:

Ctrl + xe

EDIT: como pascal mencionado en un comentario, esto también se puede hacer con

Alt +fCtrl +f

Se podría poner esto en una macro y, en cualquier caso el resultado es el mismo.

+0

Gracias. Supongo que todavía estoy sufriendo de un trauma posterior a Vim (teclas w y b) – alexchenco

+2

Sí, tengo la sensación de que con lo que empiezas realmente colorea tu percepción del otro editor de texto. Empecé con VIM y no puedo creer que en emacs no puedas simplemente escribir 'w' y 'b' para omitir palabras como puedas en Vim. – user798719

+0

También soy un convertido ViM (aunque hace más de 3 años), y realmente echo de menos el comando 'w'. 'M-f C-f' no siempre funciona, especialmente si hay espacios múltiples entre palabras. – GergelyPolonkai

4

Ese es el comportamiento correcto. De acuerdo con el Emacs manual, "[f] el movimiento hacia delante se detiene justo después de la última letra de la palabra, mientras que el movimiento hacia atrás se detiene justo antes de la primera letra".

¿Por qué es así? Quizás sea consistente con kill-word (M-d).

9

La macro solución descrita es una gran manera de obtener este comportamiento en una sesión, pero es un poco incómodo si ese es el comportamiento predeterminado que desea, ya que debe definirlo cada vez que inicie emacs. Si desea que M-f funcione así todo el tiempo, puede definir una función elisp y vincularla a la clave. Poner esto en el fichero .emacs:

(defun next-word (p) 
    "Move point to the beginning of the next word, past any spaces" 
    (interactive "d") 
    (forward-word) 
    (forward-word) 
    (backward-word)) 
(global-set-key "\M-f" 'next-word) 
0

intentar algo así como lo siguiente:

;; 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))) 
4

Avanzando hacia atrás dos veces y una vez que está bien a menos que usted está al principio de una línea con espacios en la parte delantera. Luego, avanzar dos veces y volver una vez te llevará a la siguiente palabra, no a la primera palabra. El siguiente código imitará perfectamente el comando "w" de vi. Escribí esto bastante rápido para que este código pueda limpiarse más.

(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) 
Cuestiones relacionadas