继续移至行尾


9

键绑定的默认设置C-a/C-e仅适用于一件事,移至该行的开头/结尾,是否有任何软件包可以使Emacs像这样进行操作:

  1. 如果我不在一行的末尾,C-e将转到该行的末尾,否则,转到下一行的末尾
  2. 如果我不在一行的开头,C-a将转到该行的开头,否则转到下一行的开头。

关键是您可以一直按一下C-a/e以转到每一行的开头/结尾,而无需动手指即可到达C-n/p

并使用prefix(C-u),它们将以相反的方向转到行的开头/结尾。


@kaushalmodi在对以下答案的评论中指出,我可能对您的问题有误解。您要C-a“向上” C-e还是“向下”吗?换句话说,“下一行”在项目1和2中的含义是否相同?
君士坦丁

@Constantine其实我想起“ C-a到了,C-e到下”的问题时,我张贴了这个问题,但转念一想,如果有人给defun解决方案喜欢你,没有人会知道,如果他喜欢做什么C-a,以“涨” ...
CodyChan 2014年

好; 我认为仍然值得修复。我将更新答案-只是单行更改。
君士坦丁

Answers:


11

我不知道会启用此行为的程序包,但是这是一种实现方法。

按下C-h k C-a发现C-a必然move-beginning-of-line; 这是我们需要修改的功能---或仅用于实现“从头开始”部分。同样,通过C-h k我可以找到forward-line,它将用于上/下移动。

为了能够将功能绑定到键,我们需要使其成为命令,因此我们需要使用interactive特殊形式(请参见使用Interactive)。要使用C-uprefix参数,我们需要"P"代码字符。

将其与bolp(检查是否在行的开头)和eolp(检查是否在行的末尾)结合起来,我们可以编写:

(defun my-move-beginning-of-line (arg)
  (interactive "P")
  (when (bolp) (previous-line (if arg -1 1)))
  (move-beginning-of-line nil))

(defun my-move-end-of-line (arg)
  (interactive "P")
  (when (eolp) (forward-line (if arg -1 1)))
  (move-end-of-line nil))

现在我们可以重新绑定C-aC-e调用它们:

(global-set-key [remap move-beginning-of-line] #'my-move-beginning-of-line)
(global-set-key [remap move-end-of-line] #'my-move-end-of-line)

或者,可以向和添加建议move-beginning-of-linemove-end-of-line


这是一个很好的解释,也是一个优雅的解决方案。my-move-beginning-of-line函数中有错别字。应该是(previous-line (if arg -1 1))还是(forward-line (if arg 1 -1))((切换1和-1)?
2014年

@kaushalmodi:在问题1和2中都说“下一行”,我将其解释为“下”。所以,让我们问这个问题的作者!:-)
君士坦丁

嗯,我在OP的问题中添加了自己的假设。没错,他确实指定使用或时转到下一行。C-aC-e
Kaushal Modi 2014年

@kaushalmodi:事实证明您是对的!我更新了答案,以使C-a“向上”。
君士坦丁

8

图书馆misc-cmds.el早就拥有此功能。

这些是相关的命令,以及建议的键绑定(这些绑定在中创建setup-keys.el)。

(cond ((fboundp 'move-beginning-of-line)
       (substitute-key-definition 'move-beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'move-end-of-line 'end-of-line+ global-map))
      (t
       (substitute-key-definition 'beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'end-of-line 'end-of-line+ global-map)))
(when (boundp 'visual-line-mode-map)
  (define-key visual-line-mode-map [remap move-beginning-of-line] nil)
  (define-key visual-line-mode-map [remap move-end-of-line]       nil)
  (define-key visual-line-mode-map [home] 'beginning-of-line+)
  (define-key visual-line-mode-map [end]  'end-of-line+)
  (define-key visual-line-mode-map "\C-a" 'beginning-of-visual-line+)
  (define-key visual-line-mode-map "\C-e" 'end-of-visual-line+)))

C-h f end-of-line+例如,这就是说的内容:

end-of-line+ is an interactive compiled Lisp function in
`misc-cmds.el'.

It is bound to C-e, end.

(end-of-line+ &optional N)

Move cursor to end of current line or end of next line if repeated.
This is similar to `end-of-line', but:
  If called interactively with no prefix arg:
     If the previous command was also `end-of-line+', then move to the
     end of the next line.  Else, move to the end of the current line.
  Otherwise, move to the end of the Nth next line (Nth previous line
     if N<0).  Command `end-of-line', by contrast, moves to the end of
     the (N-1)th next line.

很好看
sanityinc 2014年

1

以下两个功能执行所需的操作。

(defun move-beginning-of-line-or-previous (&optional pre)
  "Move to the start of the line. If we are already at the start
of the line, move to the start of the previous line or, if called 
with a prefix argument, the next line."
  (interactive "P")
  (let* ((pos (point)))
    (move-beginning-of-line nil)
    (if (= (point) pos)
        (if pre
            (next-line)
          (previous-line)))))

(defun move-end-of-line-or-next (&optional pre)
  "Move to the end of the line. If we are already at the end of
the line, move to the end of the next line or, if called with a 
prefix argument, the previous line."
  (interactive "P")
  (let* ((pos (point)))
    (move-end-of-line nil)
    (if (= (point) pos)
        (if pre
            (previous-line)
          (next-line)))))
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.