Emacs:如何打破ido迷你冰箱?

abo*_*abo 5 emacs elisp

我一般都在使用ido-switch-buffer,但有时当候选人太多时, helm-buffers-list更可取.但是打破偶像,召唤掌舵并重新输入丢失的信息是一件麻烦事.

所以我编写了这段代码,它直接在helm中重用ido中输入的信息:

(require 'helm-buffers)
(defun switch-to-helm-buffers-list ()
  "Emulate `helm-buffers-list' call with ido contents as initial input."
  (interactive)
  (let ((str (minibuffer-contents-no-properties)))
    (helm :sources '(helm-source-buffers-list
                     helm-source-ido-virtual-buffers
                     helm-source-buffer-not-found)
          :buffer "*helm buffers*"
          :keymap helm-buffer-map
          :truncate-lines t
          :input str)
    ;; (ido-exit-minibuffer)
    ))

(add-hook
 'ido-setup-hook
 (lambda()
   (define-key ido-buffer-completion-map "\C-i"
     'switch-to-helm-buffers-list)))
Run Code Online (Sandbox Code Playgroud)

一个问题是ido留在迷你缓冲区中.当我ido-exit-minibuffer之前添加一个电话时helm,它没有被调用.当我在之后添加它时,它会重置窗口配置.我怎么解决这个问题?

art*_*can 2

查看答案/sf/answers/1481596091/


首先,我稍微修补一下你的函数。

(require 'helm-buffers)
(defun switch-to-helm-buffers-list ()
  "Emulate `helm-buffers-list' call with ido contents as initial input."
  (interactive)
  (let ((str ido-text))
    (helm :sources '(helm-source-buffers-list
                     helm-source-ido-virtual-buffers
                     helm-source-buffer-not-found)
          :buffer "*helm buffers*"
          :keymap helm-buffer-map
          :truncate-lines t
          :input str)
    ))
Run Code Online (Sandbox Code Playgroud)

我的食谱也修补了函数体ido-buffer-internal(内部的ido-switch-buffer)。您必须执行此代码一次。

(eval
 (read
  (replace-regexp-in-string
   "cond"
   "cond ((eq ido-exit 'eab-ido-helm) (call-interactively 'switch-to-helm-buffers-list)) "
   (save-window-excursion
     (find-function-do-it 'ido-buffer-internal nil 'switch-to-buffer)
     (let ((bgn (point)))
       (forward-sexp)
       (let ((end (point)))
     (buffer-substring-no-properties bgn end)))))))
Run Code Online (Sandbox Code Playgroud)

我还添加了一项辅助功能。

(defun eab/ido-helm ()
  (interactive)
  (setq ido-exit 'eab-ido-helm)
  (exit-minibuffer))
Run Code Online (Sandbox Code Playgroud)

请注意,我使用eab/ido-helm而不是switch-to-helm-buffers-listin define-key

(add-hook
 'ido-setup-hook
 (lambda()
   (define-key ido-buffer-completion-map "\C-i"
     'eab/ido-helm)))
Run Code Online (Sandbox Code Playgroud)