停在“ forward-word”上的单词开头


17

我经常使用多次调用,forward-word后跟单个调用,backward-word以将点移动到行上单词的开头。我想我从未适应过forward-word与vim不同的方式w,即使使用Emacs多年后,我也无法适应这种差异。

有没有我可以使用的功能forward-word,它不会跳过单词但也会停在单词的开头?在向前移动单词时,是否还有其他不重复执行的策略可以移动到单词的开头forward-char


您可能(在某个时候)有兴趣编写自己的前进/后退单词/段落和相关的杀伤词功能。以下是我每天使用的一些自定义函数的三个链接-该行为与我多年来使用的某些字处理器非常相似: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
法律列表

Answers:


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 2014年

1
是的,但是vim的都不是w。据我所知,有一个几乎完美的vim到emacs映射:w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word。但是我不是vim的专业用户,所以也许我缺少一些微妙之处。
2014年

嘿,你实际上是对的。我想每当我在vim中web就模糊起来,然后就四处走动。奇怪的。我确定w两点都停了下来!因此,我会接受您的回答,因为它完全符合我的问题:)
rekado 2014年

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绑定。
rekado 2014年

0

我经常使用前向单词的多次调用,后跟单个后向单词的调用,以将点移动到行上单词的开头。

正如您提到的,诀窍是将两个单词向前,然后向后一个单词。

以下应该可以解决问题,并应该尊重其他模式,例如子词模式。

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

这是/emacs//a/4272/508的基本版本,没有涵盖某些情况,但更易于理解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.