Fermati all'inizio di una parola su "forward-word"


17

Uso spesso più invocazioni forward-wordseguite da una singola backward-wordper spostare il punto all'inizio di una parola su una riga. Immagino di non essermi mai abituato al modo in cui forward-worddifferisce da VIM we anche dopo anni di utilizzo di Emacs non riesco ad abituarmi alla differenza.

C'è una funzione che potrei usare al posto di forward-wordquella che non salta sopra le parole ma si ferma anche all'inizio di una parola? Esistono altre strategie per spostarsi all'inizio di una parola quando si sposta il punto in avanti che non comportano l'esecuzione ripetuta forward-char?


Potresti (ad un certo punto) essere interessato a scrivere la tua parola / paragrafo avanti / indietro e le relative funzioni kill-word. Di seguito sono riportati tre collegamenti ad alcune funzioni personalizzate che utilizzo quotidianamente: il comportamento ricorda da vicino alcuni elaboratori di testi che ho usato negli anni: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
elenco delle leggi

Risposte:


24

Il miscpacchetto (spedito con emacs) ha la funzione integrata forward-to-word, che fa quello che penso tu voglia:

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.

Per usarlo, prima aggiungi (require 'misc)al tuo file di configurazione.


Grazie, è utile Sfortunatamente, questo non si ferma anche alla fine di una parola.
rekado,

1
Vero, ma neanche Vim's w. Per quanto posso vedere, esiste una mappatura quasi perfetta di vim-to-emacs: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Ma non sono un utente esperto di VIM, quindi forse c'è qualche sottigliezza che mi manca.
deprecato l'

Heh, in effetti hai ragione. Immagino ogni volta che sono in vim w, ee bsolo sfocato e mi muovo. Strano. Ero certo wfermato in entrambi i punti! Quindi, accetterò la tua risposta, perché si adatta esattamente alla mia domanda :)
rekado l'

4

È possibile associare la funzione di seguito M-fe si legano l'originale forward-worda M-F. Questa funzione prende semplicemente il arge lo passa alla forward-wordfunzione. Quindi gli argomenti universali funzioneranno altrettanto bene che con la funzione originale.

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

Avvertenza, tuttavia, che la funzione sopra potrebbe non fare sempre la cosa giusta ; dipende molto se il punto è già all'inizio di una parola o no.


Ecco un altro modo di implementare quanto sopra in cui il limite di parole non è secondo la tabella della sintassi ma strettamente sulla separazione degli spazi bianchi:

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

Il merito va a @glucas per questa idea.


1

Dopo una lunga e dolorosa ricerca delle perfette funzioni "avanti / indietro" ho trovato quanto segue con il quale sono ora molto felice:

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

0

Se sei disposto a utilizzare evil, win condizioni normali è vincolato evil-forward-word-begin, che è la funzionalità in stile Vim che stai cercando.


Usavo evilmolto tempo fa, ma da un po 'di tempo utilizzo god-modeinvece i normali attacchi Emacs.
rekado,

0

Uso spesso più invocazioni di parole in avanti seguite da una singola parola in senso inverso per spostare il punto all'inizio di una parola su una riga.

Come accennato, il trucco è di andare avanti di due parole, poi una parola indietro.

Quanto segue dovrebbe fare il trucco e dovrebbe rispettare altre modalità come la modalità subword.

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

Questa è una versione rudimentale di /emacs//a/4272/508 che non copre alcuni casi, ma più facile da comprendere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.