我希望 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-mode
与sfp-page-up/down
完美匹配?
答案 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)