关于Emacs中前进和后退的单词行为

时间:2010-01-16 20:45:16

标签: emacs command

我不知道我的设置是否有问题,但是当我按下M-f(转发一个单词)时 无论我在哪里,它都不会将光标放在下一个单词中(只在单词之间)。使用M-b时不会发生这种情况,将光标放在上一个单词的开头。

这是正常行为吗?如何将光标放在下一个单词的开头?

6 个答案:

答案 0 :(得分:9)

描述的宏解决方案是在会话中获得此行为的好方法,但如果这是您想要的默认行为,则有点不方便,因为每次启动emacs时都必须定义它。如果你希望M-f一直这样工作,你可以定义一个elisp函数并将其绑定到密钥。把它放在.emacs文件中:

(defun next-word (p)
   "Move point to the beginning of the next word, past any spaces"
   (interactive "d")
   (forward-word)
   (forward-word)
   (backward-word))
(global-set-key "\M-f" 'next-word)

答案 1 :(得分:7)

好的,我们很清楚,我会假设您正在谈论命令前向词后向词这些命令默认绑定到< kbd> Alt + f Alt + b

例如string:“Hello dolly我在这里”

如果您的光标位于“Hello”的“H”,并且您执行前向词,则光标将移动到“Hello”和“dolly”之间的空格,但听起来像你希望光标位于“dolly”的字母“d”而不是它前面。

所以,做两次前向词,然后做一次后向词。

这会将你的光标放在“dolly”的“d”上。

这可以通过宏自动完成。

;; =评论,不要输入

Ctrl + x ;; start macro

Alt + f Alt + f Alt + b

Ctrl + x ;;结束宏

然后运行最后定义的宏执行此操作:

Ctrl + x e

编辑:正如评论中提到的pascal,这也可以用

完成

Alt + f Ctrl + f

您也可以将其放入宏中,无论哪种方式结果相同。

答案 2 :(得分:4)

这是正确的行为。根据{{​​3}},“[f]向前运动在单词的最后一个字母后面停止,而向后运动在第一个字母之前停止。”

为什么会这样?也许与杀词(M-d)保持一致。

答案 3 :(得分:4)

向前移动两次并向前移动一次是正常的,除非你在前面有空格的线的开头。然后前进两次并返回一次将使您转到下一个单词而不是第一个单词。下面的代码将完美地模仿vi的“w”命令。我写得很快,所以可以进一步清理这段代码。

(defun forward-word-to-beginning (&optional n)
  "Move point forward n words and place cursor at the beginning."
  (interactive "p")
  (let (myword)
    (setq myword
      (if (and transient-mark-mode mark-active)
        (buffer-substring-no-properties (region-beginning) (region-end))
        (thing-at-point 'symbol)))
    (if (not (eq myword nil))
      (forward-word n))
    (forward-word n)
    (backward-word n)))

(global-set-key (kbd "M-C-f") 'forward-word-to-beginning)

答案 4 :(得分:0)

尝试以下内容:

;; replace common word-operations on same-syntax-operations

(require 'thingatpt)

(global-set-key "\M-f" 'forward-same-syntax)

(global-set-key "\M-b" (lambda() 
                         (interactive)
                         (forward-same-syntax -1)))

(defun kill-syntax (&optional arg)
  "Kill ARG sets of syntax characters after point."
  (interactive "p")
  (let ((opoint (point)))
    (forward-same-syntax arg)
    (kill-region opoint (point))))

(global-set-key "\M-d" 'kill-syntax)

(global-set-key [(meta backspace)] (lambda()
                                     (interactive) 
                                     (kill-syntax -1)))

答案 5 :(得分:0)

您可以通过使用forward-to-word中的backward-to-wordmisc.el来实现此行为。我将这些绑定到Meta-F/Meta-B(即按住Shift键)。这些等效于Meta-f/Meta-b

forward-word/backward-word

我的.emacs具有以下绑定

(global-set-key (kbd "M-F") #'forward-to-word)
(global-set-key (kbd "M-B") #'backward-to-word)