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

Emacs 如何在标记区域内定义键绑定,emacs,vi,region,Emacs,Vi,Region,我有一个想法,可以更容易地在emacs中标记区域 我按C-SPC启动 我使用vi样式键来扩展选择。比如 与使用箭头键或C-n、C-p不同,单字符更容易按下 当完成选择时,我选择一个键来做一些事情,也使用vi风格的键 “c”:非活动区域,复制区域。 “d”删除区域 “#”注释区域 “空间”什么也不做就离开了 我知道我可以用“M-w”、“M-k”或其他什么来做,但我认为vi风格的键是一种更简单的方法 我到处搜索,但没有elip包可以做这样的事情 有人能帮我写一些函数吗?或者给我一些建议 我找到了一个

我有一个想法,可以更容易地在emacs中标记区域

  • 我按C-SPC启动

  • 我使用vi样式键来扩展选择。比如

  • 与使用箭头键或C-n、C-p不同,单字符更容易按下

  • 当完成选择时,我选择一个键来做一些事情,也使用vi风格的键

    “c”:非活动区域,复制区域。 “d”删除区域 “#”注释区域 “空间”什么也不做就离开了

  • 我知道我可以用“M-w”、“M-k”或其他什么来做,但我认为vi风格的键是一种更简单的方法

    我到处搜索,但没有elip包可以做这样的事情

    有人能帮我写一些函数吗?或者给我一些建议

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

    (

    现在,享受它,“活动区域模式地图”地图键绑定您喜欢的。例如:

    (define-key active-region-mode-map (kbd "j") 'next-line)
    

    你可以看一看。

    我不知道有足够的elisp/我自己没有足够的时间来做这件事,但是:你可以从j/k/c/d/#的“自我插入”中重新绑定对一些自定义代码进行编码,以检查标记是否处于活动状态。如果是,按照您的描述执行,如果不是,则调用自插入。我会尝试。我认为有些人可以编写区域模式映射。这样的代码可以使我更容易定义键绑定。是的,这可能是个好主意。自动执行“重新绑定自插入”这个区域不仅仅用于注释、删除等。该区域限制了许多命令的操作范围,例如“C-M-h C-x n”虽然你的项目很有趣,但我认为如果你掌握Emacs自己的范例,而不是从vim中移植东西,你的Emacs生产率将会提高。谢谢你!这段代码很棒!我用它来处理move-text.el、multiple-cursors.el和eval区域代码…真的节省了我很多时间来找出b键我知道viper模式,但我的想法是在emacs中更容易做到这一点。在区域内,可以使用单个键而不是组合键。它不是编辑模式,就像dired模式或ibuffer模式一样。我认为这是不可行的,除非你愿意为这个功能定义一个完整的模式。。。默认情况下,单键绑定到self-insert,这有点棘手,更不用说它违反了Emacs核心键绑定原则:-),但在某些模式下,可以使用这种键绑定。Dired模式,“n”“p”而不是区域内的“c-n”“c-p”,您也可以使用这样的密钥绑定。我希望有一个区域模式地图。因为在这种模式下没有编辑功能,所以它们明确地将键绑定到与自插入不同的内容。您可以潜在地在标记区域(或其名称)周围添加一些建议。该建议类似于面向方面的编程——它允许围绕其他代码调用代码。有了这样的建议,您可以在选择区域期间临时重新绑定密钥,然后恢复旧绑定。看看Emacs Lisp手册中的defadvice。我刚刚解决了这个问题,您可以编写一个简单的次要模式,命名为active region,并编写一个active region模式映射。使用此模式,您可以在区域中定义任何关键帧。重写默认键绑定非常容易(M-w到其他东西)。我在谷歌上找到了答案,但你的评论给了我很好的建议。非常感谢你。
    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)
    
    (define-key active-region-mode-map (kbd "j") 'next-line)