如何在标记区域内定义按键绑定

4

我有一个想法,可以更轻松地在emacs中标记区域。

  1. 按下C-SPC开始。

  2. 使用vi风格的键扩展选择。例如

"j" : line down
"k": line up

与其使用箭头键或C-n,C-p,单击一个字符更容易。

  1. 完成选择后,我选择一个键来执行某些操作,也使用vi风格的键

    "c": 取消选定区域,复制选定区域。 "d" 删除区域 "#" 注释区域 "空格" 只是离开而不做任何事情

我知道我可以使用"M-w" "M-k"或其他方法来完成它,但我认为vi风格的键是更容易完成工作的方法。

我到处搜寻,但没有elip包能够做到这样的事情。

有人可以帮我编写一些函数来完成吗?或给我一些建议。

我找到了一个好方法来解决它,分享解决方案:

(

defvar active-region-mode-map
  (let ((map (make-sparse-keymap)))
    map)
  )

(define-minor-mode active-region-mode
  "Active Region minor mode."
  :init-value nil
  :lighter " Region"
  :keymap active-region-mode-map
  :group 'active-region
  )

(defun active-region-on ()
  (active-region-mode 1))
(defun active-region-off ()
  (active-region-mode -1))
(add-hook 'activate-mark-hook 'active-region-on)
(add-hook 'deactivate-mark-hook 'active-region-off)

现在,您可以享受“active-region-mode-map”映射键绑定。例如:
(define-key active-region-mode-map (kbd "j") 'next-line)

我自己不太了解elisp,也没有足够的时间去做这件事,但是:你可以将j/k/c/d/#从它们的“self-insertion”代码重新绑定到一些自定义代码上,以检查标记是否处于活动状态。如果是,就执行你所描述的操作,如果不是,则调用self-insert。 - drysdam
我会尝试。我认为有些人可以编写区域模式映射。这样的代码可以使我更容易定义按键绑定。 - textpattern
是的,那可能是个好主意。自动化“重新绑定self-insert”这件事,然后就容易了。 - drysdam
区域的用途不仅限于注释、删除等。区域限制了许多命令的操作范围。例如,“C-M-h C-x n n”可缩小到当前函数等。虽然您的项目很有趣,但我认为如果您掌握Emacs自己的范例而不是从vim中移植东西,您在Emacs上的生产力会提高。 - Noufal Ibrahim
谢谢!这段代码非常好用!我用它来移动文本.el、多光标.el和在区域中评估代码...真的为我节省了很多时间,让我不必费心去研究按键绑定的问题,甚至也可能避免买键盘: )。 - wenjun.yan
1个回答

0

1
我认为这不可行,除非你愿意为此功能定义一个完整的模式... 单个键默认绑定到自插入,绕过它有点棘手,更不用说这违反了Emacs核心按键绑定原则 :-) - Bozhidar Batsov
但在某些模式下,您可以使用此类键绑定。 Dired模式,“n”“p”代替“c-n”“c-p” 在区域内,您也可以使用这样的键绑定。 我希望有一个区域模式映射。 - textpattern
1
由于这些模式中没有编辑功能,因此它们显然将键绑定到与自插入不同的内容。您可以潜在地添加一些关于mark-region(或称为其他名称)的建议。该建议类似于面向方面的编程-它允许在其他代码周围调用代码。通过这样的建议,您可以在选择区域的持续时间内临时重新绑定键,并在之后恢复旧的绑定。请查看Emacs Lisp手册中的defadvice。 - Bozhidar Batsov
1
我刚刚解决了这个问题,你可以编写一个简单的小模式,命名为active-region,并编写一个active-region-mode-map。有了这个模式,你可以在区域内定义任何按键绑定。覆盖默认按键绑定非常容易(将M-w改为其他内容)。我在Google上找到了答案,但是你的评论给了我很好的建议。非常感谢。 - textpattern
因为它太简单了。 有一个名为 activate-mark-hook 的内部钩子,使用这个钩子,你可以定义按键绑定或在区域中执行某些操作。 我会更新我的帖子,并将答案放在里面。 - textpattern
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接