2

EMACS 24.1。我需要重新绑定Ctrl-space到一个自定义函数:

  • 走到行尾
  • 删除尾随空格(如果有)
  • 设置标记(正常Ctrl-space

这是我的代码不起作用:

(define-key global-map [?\C- ] 'my-set-mark-command)
(defun my-set-mark-command()
   (interactive)
   (end-of-line)
   (delete-char (* -1 (skip-chars-backward "\t\s")));;delete trailing spaces
   (set-mark-command nil))

当没有尾随空格时,它正常工作:开始选择并突出显示区域。尾随空格时:删除尾随空格,在行尾停止,设置标记但不突出显示区域。

如果我删除最后一个命令 ( set-mark-command) 并手动运行它,M-xset-mark-command它就可以工作。请有人可以帮助我使此功能正常工作吗?

4

2 回答 2

5

修改命令导致变量deactivate-mark被重置,导致标记丢失。在它的文档中说明了如何通过将变量save-excursion绑定到. 然后,您可以将代码更改为:deactivate-marklet

(defun my-set-mark-command ()
   (interactive)
   (end-of-line)
   (let (deactivate-mark)
     (delete-char (* -1 (skip-chars-backward "\t\s"))))  ;;delete trailing spaces
   (set-mark-command nil))

甚至将整个包含let在一个save-excursion.

见手册:

http://www.gnu.org/software/emacs/manual/html_node/elisp/The-Mark.html#index-deactivate_002dmark-2801

于 2012-06-18T10:05:08.953 回答
2

迭戈解释了你想知道的。我只想指出,重新映射 C-SPC不是一个好主意。C-SPC 操纵标记环,非常有用。见手册,特别是见C-u C-SPC

于 2012-06-18T12:29:38.570 回答