Deténgase al comienzo de una palabra en `forward-word`

17

A menudo uso múltiples invocaciones forward-wordseguidas de una sola backward-wordpara mover el punto al comienzo de una palabra en una línea. Supongo que nunca me acostumbré a la forma en que forward-worddifiere de vim we incluso después de años de usar Emacs, no puedo acostumbrarme a la diferencia.

¿Hay una función que podría usar en lugar de forward-wordque no salte sobre las palabras sino que también se detenga al comienzo de una palabra? ¿Existen otras estrategias para avanzar al comienzo de una palabra al avanzar que no implican la ejecución repetida forward-char?

rekado
fuente
Puede (en algún momento) estar interesado en escribir su propia palabra / párrafo hacia adelante / atrás y las funciones relacionadas de matar palabras. Los siguientes son tres enlaces a algunas funciones personalizadas que uso a diario: el comportamiento se parece mucho a ciertos procesadores de texto que he usado a lo largo de los años: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
lawlist

Respuestas:

24

El miscpaquete (enviado con emacs) tiene la función incorporada forward-to-word, que hace lo que creo que desea:

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.

Para usarlo, primero agréguelo (require 'misc)a su archivo de configuración.

obsoleto
fuente
Gracias, esto es útil. Por desgracia, esto no también se detiene al final de una palabra, sin embargo.
rekado
1
Es cierto, pero tampoco lo hace vim w. Hasta donde puedo ver, hay un mapeo casi perfecto de vim a emacs: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Pero no soy un usuario experto de vim, así que tal vez me falta algo de sutileza.
desuso el
Je, de hecho tienes razón. Supongo que cada vez que estoy en vim w, ey bsimplemente me borro y me muevo. Extraño. Estaba seguro wdetenido en ambos puntos! Entonces, aceptaré tu respuesta, porque se ajusta exactamente a mi pregunta :)
rekado
4

Puede enlazar el siguiente función para M-fy se unen al original forward-worda M-F. Esta función simplemente toma el argy lo pasa a la forward-wordfunción. Por lo tanto, los argumentos universales funcionarán tan bien como con la función original.

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

Sin embargo, se debe advertir que la función anterior no siempre hace lo correcto ; depende mucho de si el punto ya está en el comienzo de una palabra o no.


Aquí hay otra forma de implementar lo anterior donde el límite de la palabra no es según la tabla de sintaxis sino estrictamente en la separación de espacios en blanco:

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

El crédito va a @glucas por esta idea.

Kaushal Modi
fuente
1

Después de una larga y dolorosa búsqueda de las funciones perfectas de 'palabra hacia adelante / hacia atrás', encontré lo siguiente con lo que ahora estoy muy feliz:

(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
fuente
0

Si está dispuesto a usar evil, wen estado normal está obligado evil-forward-word-begin, que es la funcionalidad de estilo Vim que está buscando.

Dan
fuente
Solía ​​usar evilhace mucho tiempo, pero desde hace un tiempo uso god-modeenlaces regulares de Emacs.
rekado
0

A menudo utilizo múltiples invocaciones de palabras hacia adelante seguidas de una sola palabra hacia atrás para mover el punto al comienzo de una palabra en una línea.

Como mencionas, el truco es avanzar dos palabras, luego una palabra hacia atrás.

Lo siguiente debería hacer el truco y respetar otros modos como el modo de subpalabras.

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

Esta es una versión rudimentaria de /emacs//a/4272/508 que no cubre algunos casos, pero es más fácil de comprender.

ustun
fuente