EMACS重新绑定C-spc禁用所选区域的突出显示

时间:2012-06-18 09:37:15

标签: emacs elisp

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-x set-mark-command它可以工作。 请有人帮助我使这个功能正常工作??

2 个答案:

答案 0 :(得分:5)

修改命令会导致变量deactivate-mark重置,从而导致标记丢失。在save-excursion的文档中,它通过将deactivate-mark变量与let绑定来说明如何禁用该行为。然后,您可以将代码更改为:

(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

答案 1 :(得分:2)

迭戈解释了你想知道什么。我只想注意重新映射 C-SPC 不是个好主意。 C-SPC操纵标记环, 这非常有用。见manual,特别参见 C-u C-SPC