「forward-word」の単語の先頭で停止する


17

私はよく、複数の呼び出しとforward-wordそれに続く単一の呼び出しを使用backward-wordして、ポイントを行の単語の先頭に移動します。私forward-wordはvimとは違う方法にw慣れたことはないと思いますし、Emacsを何年も使用した後でも、その違いに慣れることはできません。

forward-word単語を飛び越えず、単語の先頭で停止する代わりに使用できる関数はありますか?繰り返し実行を伴わない、ポイントを前方に移動するときに単語の先頭に移動する他の戦略はありforward-charますか?


(ある時点で)独自の前方/後方ワード/段落および関連するキルワード関数の作成に興味があるかもしれません。: -以下は、私が日常的に使用することを、いくつかのカスタム関数には3つのリンクされている行動は密接に私が長年にわたって使用されていることを特定のワードプロセッサに似ている stackoverflow.com/a/20456861/2112489を | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
法律リスト14

回答:


24

misc(emacsのに同梱)パッケージには、組み込みの機能を持っているforward-to-word私はあなたが欲しい何を考えていました、:

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.

それを使用するには、まず(require 'misc)設定ファイルに追加します。


おかげで、これは便利です。残念ながら、これは単語の終わりで止まりません。
rekado

1
本当ですが、vimも同様wです。私が見る限り、vimからemacsへのほぼ完璧なマッピングがあります:w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word。しかし、私はvimの専門家ではないので、おそらく微妙な点が欠けています。
非推奨(14

へえ、あなたは実際に正しいです。私はvimの中でよいつでも推測するwebだけ離れてぼかしと私は動き回ります。奇妙な。私はw両方のポイントで確実に止められました!それで、あなたの答えを受け入れます。私の質問にぴったりだからです:)
rekado 14

4

あなたはに機能の下にバインドできM-f、バインド元forward-wordM-F。この関数は単純にを受け取り、関数にarg渡しforward-wordます。そのため、普遍的な引数は元の関数と同じように機能します。

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

ただし、上記の関数が常に正しいことを行うとは限らないことに注意してください。ポイントが既に単語の先頭にあるかどうかに大きく依存します。


次に、上記を実装する別の方法を示します。ここで、単語の境界は構文表にあるのではなく、厳密に空白の区切りに基づいています。

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

クレジットに行く@glucasこのアイデアについて。


1

完璧な「前方/後方単語」機能を長時間苦労して検索した結果、次のことがわかりました。

(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

を使用する場合evilw、通常の状態でにバインドされますevil-forward-word-begin。これは、Vimスタイルの機能です。


evilはずっと前に使用していましたが、しばらくしてからgod-mode代わりに通常のEmacsバインディングを使用します。
レカド14

0

私はしばしば、前方ワードの複数の呼び出しに続いて単一の後方ワードを使用して、ポイントを行のワードの先頭に移動します。

あなたが言及したように、トリックは2つの単語を前方に、そして1つの単語を後方に進めることです。

以下はトリックを行う必要があり、サブワードモードなどの他のモードを尊重する必要があります。

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

これは/emacs//a/4272/508の初歩的なバージョンであり、一部のケースはカバーしていませんが、理解は容易です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.