Zatrzymaj na początku słowa w „naprzód”

17

Często używam wielu wywołań, forward-worda następnie jednego, backward-wordaby przenieść punkt na początek słowa w wierszu. Chyba nigdy nie przyzwyczaiłem się do sposobu, w jaki forward-wordróżni się od vima wi nawet po latach używania Emacsa nie mogę przyzwyczaić się do różnicy.

Czy jest jakaś funkcja, której mogłabym użyć zamiast tego forward-word, która nie przeskakuje słów, ale zatrzymuje się również na początku słowa? Czy istnieją inne strategie przejścia do początku słowa podczas przesuwania punktu do przodu, które nie wymagają wielokrotnego wykonywania forward-char?

rekado
źródło
W pewnym momencie możesz być zainteresowany napisaniem własnego słowa / akapitu do przodu / do tyłu i powiązanych funkcji słów-zabójstw. Poniżej znajdują się trzy łącza do niektórych niestandardowych funkcji, których używam na co dzień - zachowanie przypomina niektóre edytory tekstu, z których korzystałem przez lata: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
lista prawników

Odpowiedzi:

24

miscPakiet (dostarczany z emacs) ma wbudowaną funkcję forward-to-word, która robi to, co myślę, że chcesz:

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.

Aby go użyć, najpierw dodaj (require 'misc)do pliku konfiguracyjnego.

przestarzałe
źródło
Dzięki, to się przydaje. Niestety, to nie również zatrzymują się na końcu wyrazu, choć.
rekado
1
To prawda, ale nie ma też vima w. O ile widzę, istnieje prawie idealne mapowanie vim-to-emacs: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Ale nie jestem ekspertem od vimów, więc może brakuje mi subtelności.
przestarzałe
Heh, masz rację. Chyba gdy jestem w vim w, ei btylko rozmycie się i po prostu poruszać. Dziwne. Byłem pewien, że wzatrzymałem się w obu punktach! Przyjmuję twoją odpowiedź, ponieważ dokładnie pasuje do mojego pytania :)
rekado
4

Można powiązać poniżej funkcji do M-fi wiążą oryginału forward-worddo M-F. Ta funkcja po prostu przyjmuje argi przekazuje ją do forward-wordfunkcji. Tak więc uniwersalne argumenty będą działać tak samo dobrze, jak w przypadku oryginalnej funkcji.

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

Należy jednak pamiętać, że powyższa funkcja może nie zawsze działać prawidłowo ; to bardzo zależy od tego, czy punkt jest już na początku słowa, czy nie.


Oto inny sposób implementacji powyższego, w którym granica słowa nie jest zgodna z tabelą składni, ale ściśle z separacją białych znaków:

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

Zasługa @glucas dla tego pomysłu.

Kaushal Modi
źródło
1

Po długim i bolesnym poszukiwaniu idealnych funkcji „do przodu / do tyłu” znalazłem następujące, z których jestem teraz bardzo zadowolony:

(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
źródło
0

Jeśli zechcesz użyć evil, ww normalnym stanie jest to związane z evil-forward-word-beginfunkcjonalnością w stylu Vima, której szukasz.

Dan
źródło
Kiedyś używałem evildawno temu, ale od pewnego czasu używam god-modezamiast tego zwykłych powiązań Emacsa.
rekado
0

Często używam wielu wywołań słowa do przodu, a następnie jednego słowa do tyłu, aby przenieść punkt na początek słowa w wierszu.

Jak wspominasz, sztuczka polega na przejściu dwóch słów do przodu, a następnie jednego słowa do tyłu.

Następujące czynności powinny załatwić sprawę i szanować inne tryby, takie jak tryb pod słowem.

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

Jest to podstawowa wersja /emacs//a/4272/508 , która nie obejmuje niektórych przypadków, ale jest łatwiejsza do zrozumienia.

ustun
źródło