如何在ivy-minibuffer-map中彻底的修改 C-x 的键绑定?

一件非常有意思的事,我尝试这样定义ivy-minibuffer-map的一些keybinds,也都能work,除了调皮的这个。

(define-key ivy-minibuffer-map (kbd "C-x") 'ivy-kill-line)

…well ,然后我重启的Emacs, 启动后第一次使用ivy去补全, 按C-x也的确能kill-line,但是第二次按C-x的时候,居然变成了一个前缀???. What The FUXK??然后我尝试打开 which-key-mode, 然后发现在 C-x 为前缀的键位上,大概是这些描述:

  1. C-x 8(iso-transl-ctl-8-map) -> (许许多多奇怪的字符,真的,从没见过的…)
  2. C-x @ ->
    • (S -> event-apply-shift-modifier)
    • (h -> event-apply-hyper-modifier)…etc (后面差不多都类似的)
  3. C-x r -> ( 矩阵编辑相关的…)

非常奇怪啊,我从来没定义过???

哪位大侠能帮帮我。。。我只是想在ivy-minibuffer中使用C-x来kill line…

BTW,我试过下面这个方法,但不凑效。

(defvar ivy-minibuffer-map (let ((map (make-sparse-keymap)))define xxxxx)

只要有 minor-mode 绑定过以 C-x 为 prefix 的按键,(define-key ivy-minibuffer-map (kbd "C-x") 'ivy-kill-line) 之类就不会生效。

如何临时禁用所有 minor-mode?helm 用了这段。

(defun helm-disable-minor-mode ()
  (interactive)
  (let (active-minor-modes)
    (mapc (lambda (mode) (condition-case nil
                        (if (and (symbolp mode) (symbol-value mode))
                            (add-to-list 'active-minor-modes mode))
                      (error nil)))
          minor-mode-list)
    (helm
     :sources '((name . "Active minor modes")
                (candidates . active-minor-modes)
                (action . (lambda (_candidate)
                            (dolist (mode (helm-marked-candidates))
                              (funcall (intern mode) -1))))
                (persistent-action . helm-mode-manager-describe-mode)))))

只要把这个每次进入 ivy minibuffer 的时候跑一遍就可以了。

(defun disable-all-minor ()
  (interactive)
  (dolist (mode
           (mapcar
            (lambda (mode) (condition-case nil
                               (if (and (symbolp mode) (symbol-value mode))
                                   (add-to-list 'active-minor-modes mode))
                             (error nil)))
            minor-mode-list))
    (funcall mode -1)))

当然禁用所有 minor mode 副作用很明显。

很厉害啊~ 谢谢你的回复。 可是,

(add-hook 'ivy-mode-hook 'disable-all-minor)

并不凑效,我再好好看看你给的

直接加钩子可能会被覆盖。

你可以先把 disable-all-minor 帮一个按键上,同时绑定 C-x,在 ivy minibuffer 执行一次 disable-all-minor 以后,试试 C-x 绑定有没有生效。

如果这样能奏效,说明稍微 tweak 以下 ivy 以后是可行的。

我在这里只从可行性上提议,因为我不觉得绑 C-x 是个好想法。

恩,其实一开始只是容易误按到C-x 然后提示不能在此minibuffer中使用,觉得这个提示很烦,就想把C-x在minibuffer里给禁掉。你给的那个函数,运行不了呜呜

考虑用C-k kill-line?

我有在ivy-minibuffer-map做很多key-bind, 给C-k绑的是ivy-previous-line,也能work。

但是用同样的方法给C-x绑,只在启动emacs后第一次使用凑效, 就是有种如鲠在喉的感觉啊,很不舒服。。

一定想要弄好的那种感觉。。像这种经过很长时间的折腾,最后成功的那种感觉,无以言表。233333

你用的spacemacs?我最近发现这个问题把style改成hybrid了,比较make sense.就是一般输入模式下还是用c-n, c-p上下移动。这样做在ivy, term中都可以使用c-k kill line了,也跟终端中的操作比较匹配。

不是,自己配的www,恩。。其实我不仅C-n C-p,还有M-n M-p也上下移动。。23333 我这个人很奇怪。喜欢绑在好多快捷键上。。比如html里面的emmet-expanding, M-i, M-o,M-p都给绑上了…就算按错也能补全的感觉挺爽的哈哈。:roll_eyes:

我感觉问题应该就是楼上说的 helm-mode那样解决的。。

我刚试了下想在ido的map上绑定c-x也不行,只有在helm上才可以。

我已经慢慢往consistency方向走了。。感觉不然其他工具都不会用了。

我也一样,不过是个人喜好吧, 我用Vimium, Terminal, 上滚下滚,上一个命令下一个命令都是Ctrl+k和Ctrl+j, 要kill-line的话,用的M-q,恩。算个人使用习惯了,2333