Stoppen Sie am Anfang eines Wortes auf "Vorwärtswort"

17

Ich verwende oft mehrere Aufrufe von forward-wordgefolgt von einem einzelnen backward-word, um den Punkt an den Anfang eines Wortes in einer Zeile zu verschieben. Ich glaube, ich habe mich nie daran gewöhnt, wie forward-wordsich Vims unterscheiden, wund selbst nach Jahren mit Emacs kann ich mich nicht an den Unterschied gewöhnen.

Gibt es eine Funktion, die ich verwenden könnte, um forward-wordnicht über Wörter zu springen, sondern auch am Anfang eines Wortes anzuhalten? Gibt es andere Strategien, um an den Anfang eines Wortes zu springen, wenn Sie einen Punkt nach vorne bewegen, ohne wiederholt ausgeführt zu werden forward-char?

rekado
quelle
Sie könnten (irgendwann) daran interessiert sein, Ihr eigenes Wort / Absatz vorwärts / rückwärts und zugehörige Kill-Word-Funktionen zu schreiben. Im Folgenden finden Sie drei Links zu einigen benutzerdefinierten Funktionen, die ich täglich verwende. Das Verhalten ähnelt stark bestimmten Textverarbeitungsprogrammen, die ich im Laufe der Jahre verwendet habe: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
lawlist

Antworten:

24

Das miscPaket (im Lieferumfang von Emacs enthalten) verfügt über die eingebaute Funktion forward-to-word, die genau das tut, was Sie sich wünschen:

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.

Um es zu benutzen, füge es zuerst (require 'misc)deiner Konfigurationsdatei hinzu.

veraltet
quelle
Danke, das ist nützlich. Leider hört das aber auch nicht am Ende eines Wortes auf.
Rekado
1
Stimmt, aber Vims auch nicht w. Soweit ich sehen kann, gibt es eine fast perfekte Zuordnung von Vim zu Emacs: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Aber ich bin kein erfahrener Vim-Benutzer, also fehlt mir vielleicht etwas Subtilität.
Veraltet
He, du hast tatsächlich recht. Ich denke , wenn ich in vim bin w, eund bnur verschwimmen weg und ich bewege gleich um. Seltsam. Ich war mir sicher w, an beiden Punkten angehalten zu haben! Also, ich akzeptiere deine Antwort, weil sie genau zu meiner Frage passt :)
rekado
4

Sie können die folgende Funktion an M-fund das Original forward-wordan binden M-F. Diese Funktion übernimmt einfach die argund leitet sie an die forward-wordFunktion weiter. Die universellen Argumente funktionieren also genauso gut wie mit der ursprünglichen Funktion.

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

Achtung, obgleich die oben genannte Funktion möglicherweise nicht immer das Richtige tut . es hängt sehr davon ab, ob sich der Punkt bereits am Anfang eines Wortes befindet oder nicht.


Hier ist eine andere Art und Weise der Umsetzung von oben , wo das Wort Grenze ist nicht gemäß der Syntaxtabelle aber streng auf Leerzeichen Trennung:

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

Kredit geht an @glucas für diese Idee.

Kaushal Modi
quelle
1

Nach einer langen und schmerzhaften Suche nach den perfekten 'Vorwärts / Rückwärts-Wort'-Funktionen habe ich folgendes gefunden, mit dem ich jetzt sehr zufrieden bin:

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

Wenn Sie bereit sind evil, wim normalen Zustand zu verwenden evil-forward-word-begin, ist das die Vim-artige Funktionalität, die Sie suchen.

Dan
quelle
Früher habe ich vor evillanger Zeit verwendet, aber seit einiger Zeit verwende ich god-modestattdessen normale Emacs-Bindungen.
Rekado
0

Ich verwende oft mehrere Aufrufe des Vorwärtsworts, gefolgt von einem einzelnen Rückwärtswort, um den Punkt an den Anfang eines Wortes in einer Zeile zu verschieben.

Wie Sie bereits erwähnt haben, besteht der Trick darin, zwei Wörter vorwärts und dann ein Wort rückwärts zu gehen.

Das Folgende sollte den Trick machen und andere Modi wie den Subword-Modus respektieren.

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

Dies ist eine rudimentäre Version von /emacs//a/4272/508 , die einige Fälle nicht abdeckt, aber einfacher zu verstehen ist.

ustun
quelle