3

简单地说,我只是在 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)
4

3 回答 3

4

除了其他人所说的:

  1. TAB键通常<tab>您通过指定使用的不同[tab]。密钥与TAB相同C-i,您可以使用(kbd "TAB")它来绑定它。

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

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

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

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

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

    4. 用于检查您的 Emacs 版本使用的每个 minibuffer 键盘映射C-h M-k的绑定。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 绑定恢复为应有的状态。

于 2014-03-20T03:42:28.953 回答
4

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

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

于 2014-03-20T12:23:28.620 回答
2

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

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

此外,emacs 24.4 已经在上面的功能中提供了您想要实现的东西。该命令indent-rigidly已得到增强,您可以使用、 和leftright缩进区域。tabshift-tab

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

于 2014-03-20T03:08:03.960 回答