Emacs:cua-mode有更好的PgDn / PgUp行为吗?

时间:2010-12-22 21:03:18

标签: emacs keyboard-shortcuts cua cua-mode

我希望 PgUp PgDn 键只是向上或向下移动显示文件的内容,但光标( point 在Emacs Lingo中)应该留在原处(在屏幕上)。不幸的是,默认的Emacs行为是不同的。默认行为很难描述,但如果按 PgDn 后跟 PgUp ,则不会结束之前的位置(!)。

这不是一个新问题,sfp-page-up and sfp-page-down中有一个名为EmacsWiki的好解决方案。

(defun sfp-page-up ()
  (interactive)
  (setq this-command 'previous-line)
  (previous-line
   (- (window-text-height)
      next-screen-context-lines)))

然而,有一个问题与cua - 模式相结合,它提供了(其中包括)移位选择(按 Shift 和光标移动键,如 PgDn 开始突出显示所选区域):

cua-mode无法识别重新定义的 PgUp / PgDn 键,即它们不会启动选择。解决方法是先按键,然后继续 PgUp / PgDn

如何使cua-modesfp-page-up/down完美匹配?

2 个答案:

答案 0 :(得分:3)

如果您添加^以启动函数的(interactive "...")规范(在双引号内),它们将支持Emacs 23.1及更高版本中的班次选择。

答案 1 :(得分:1)

我在if I set home key (...) then shift+home does not select text in cua-mode上的帖子gnu.emacs.help中找到了另一半解决方案:

要参与cua-mode的班次选择,函数(在我的情况下为sfp-page-xxx)必须将符号属性CUA设置为move

(put 'sfp-page-up 'CUA 'move)

(对于解决方案的前半部分,请参阅JSON's answer)。

所以这是我的完整解决方案:

(defun sfp-page-down (&optional arg)
  (interactive "^P")
  (setq this-command 'next-line)
  (next-line
   (- (window-text-height)
      next-screen-context-lines)))
(put 'sfp-page-down 'isearch-scroll t)
(put 'sfp-page-down 'CUA 'move)

(defun sfp-page-up (&optional arg)
  (interactive "^P")
  (setq this-command 'previous-line)
  (previous-line
   (- (window-text-height)
      next-screen-context-lines)))
(put 'sfp-page-up 'isearch-scroll t)
(put 'sfp-page-up 'CUA 'move)