【问题标题】:Emacs: Keybinding to TAB breaks autocompletion in minibufferEmacs:与 TAB 的键绑定会破坏 minibuffer 中的自动完成功能
【发布时间】:2014-11-23 12:13:49
【问题描述】:

简单地说,我只是在 TAB 键上设置了一个键绑定,但是现在当我在 minibuffer 中按下 TAB 以自动完成命令时,它会失败并显示以下消息:The mark is not set now, so there is no region

换句话说,当我的光标在缓冲区(而不是迷你缓冲区)中时,我只需要我的 TAB 键绑定。

在下面的示例中,当我在缓冲区中处于文本/基本模式时,如何将选项卡设置为缩进,而不会在迷你缓冲区中丢失自动完成功能?我有以下功能和键绑定:

;; Shift the selected region right if distance is postive, left if
;; negative

 (defun shift-region (distance)
   (let ((mark (mark)))
     (save-excursion
       (indent-rigidly (region-beginning) (region-end) distance)
       (push-mark mark t t)
       ;; Tell the command loop not to deactivate the mark
       ;; for transient mark mode
       (setq deactivate-mark nil))))

(defun shift-right ()
  (interactive)
  (shift-region 2))

(defun shift-left ()
  (interactive)
  (shift-region -2))

;; Bind (shift-right) and (shift-left) function to your favorite keys. I use
;; the following so that Ctrl-Shift-Right Arrow moves selected text one 
;; column to the right, Ctrl-Shift-Left Arrow moves selected text one
;; column to the left:

;; (global-set-key [C-S-right] 'shift-right)
;; (global-set-key [C-S-left] 'shift-left)
(global-set-key [tab] 'shift-right)
(global-set-key [backtab] 'shift-left)

【问题讨论】:

  • 我会为你的shift-right 选择另一个键而不是tab -- tab 被许多流行的库使用,这只是尚未出现的许多问题中的第一个(导致通过对tab 进行全局控制)。

标签: emacs autocomplete elisp minibuffer


【解决方案1】:

问题只是您将命令绑定到[tab] 而不是"\t"tab 表示 GUI 下的 TAB 键,但在 tty 下 Emacs 接收的是 TAB 字符(即?\t),所以当您点击tab 时,Emacs 首先查找tab 绑定,如果没有,function-key-map 重新映射将其变为?\t 并重试。 minibuffer 只绑定"\t",所以任何到[tab] 的全局绑定都将优先。

总之,使用(global-set-key "\t" 'shift-right),这个问题就会消失。

【讨论】:

    【解决方案2】:

    除了别人说的:

    1. TAB 键通常<tab> 相同,这是您通过指定 [tab] 使用的键。 TAB 键与C-i 相同,可以使用(kbd "TAB") 进行绑定。

    2. 如果您愿意,您可以继续将 TAB 绑定到您在 global-map 中的命令,就像您所做的那样,然后通过将每个 minibuffer 键映射中的 minibuffer 重新绑定到任何内容来覆盖它你喜欢他们的命令。

      例如,如果您想要 TAB 的常用 minibuffer 绑定,则执行以下操作:

      1. 使用 emacs -Q 启动 Emacs(无初始化文件)。

      2. 可选择加载任何为TAB 建立非默认迷你缓冲区绑定的库(例如自动完成?)。

      3. 加载库help-fns+.el,获取命令describe-keymap,全局绑定C-h M-k

      4. 使用C-h M-k 在您的Emacs 版本使用的每个小缓冲区键映射中检查TAB 的绑定。 这将包括minibuffer-local-mapminibuffer-local-completion-mapminibuffer-local-must-match-map,并且可能包括更多。请参阅 (elisp) Completion Commands 以获取 minibuffer 键映射变量列表。

        例如,C-h M-k minibuffer-local-completion-map 向您显示该键映射中的绑定。在列表中查找TAB

        (如果您不想下载help-fns+.el,那么您可以使用lookup-key。该库只是使在键盘映射中列出键变得容易。)

      5. 在将TAB 全局绑定到非面向小缓冲区的命令后,在初始化文件中将其绑定到默认绑定。 IOW,将 minibuffer 绑定恢复为应有的状态。

    【讨论】:

      【解决方案3】:

      您可以使用window-minibuffer-p 函数检查您是否在迷你缓冲区中。来自文档

      如果 WINDOW 是一个 minibuffer 窗口,则返回非 nil。 WINDOW 必须是有效的窗口,并且默认为选定的窗口。

      另外emacs 24.4已经在上面的功能中提供了你想要实现的东西。命令 indent-rigidly 已得到增强,您可以使用 leftrighttabshift-tab 键。

      您可以选择要缩进的区域并点击 C-xtab 之后您就可以使用 right 和 left 键。您还可以使用 tabshift-tab 键将所选区域移动一个制表符空间,这非常方便,因为上面的键绑定保持活动状态,直到您按下任何其他键.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        相关资源
        最近更新 更多