Emacs 使用非交互式defun将文本字符串插入ido迷你缓冲区

Emacs 使用非交互式defun将文本字符串插入ido迷你缓冲区,emacs,ido,minibuffer,Emacs,Ido,Minibuffer,在ido查找文件期间,需要使用绑定到键和弦的defun在ido迷你缓冲区中插入一些文本。此行为与以交互方式键入以下序列相同:C-x C-f,然后是C-e以编辑迷你缓冲区,然后是删除当前文本,然后键入或拖动要插入的文本。为此,我运行了这个defun,在我找到文件之后: (global-set-key [f10] 'mytest) (defun mytest () (interactive) (ido-edit-input) ;#1 (delete-minibuffer-content

在ido查找文件期间,需要使用绑定到键和弦的defun在ido迷你缓冲区中插入一些文本。此行为与以交互方式键入以下序列相同:C-x C-f,然后是C-e以编辑迷你缓冲区,然后是删除当前文本,然后键入或拖动要插入的文本。为此,我运行了这个defun,在我找到文件之后:

(global-set-key [f10] 'mytest)

(defun mytest ()
  (interactive)
  (ido-edit-input) ;#1
  (delete-minibuffer-contents) ;#2
  (insert "C:/users/family/" )) ;#3
我的期望是,在调用一次mytest之后,迷你缓冲区将包含给定的字符串(#3)。然而,似乎我需要运行mytest2x将插入的字符串放入迷你缓冲区。在第一次调用之后,ido迷你缓冲区处于编辑模式,但是就好像只运行了#1(原始文本仍然存在)。第二次调用mytest后,ido迷你缓冲区似乎已经执行了#1、#2和#3

我使用的是一对一库中的独立迷你缓冲区。
在Windows上运行GNU emacs 24.4

这是我在emacs启动时运行的ido的自定义配置

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;IDO Config
(setq ido-enable-flex-matching t)
;
(setq ido-everywhere t)
(ido-everywhere 1)
;
(require 'ido)
(ido-mode 1)
;
(setq ido-auto-merge-work-directories-length -1)
;
;https://github.com/gempesaw/ido-vertical-mode.el/blob/master/ido-vertical-mode.el
;; Display ido results vertically, rather than horizontally
  (setq ido-decorations (quote ("\n-> " "" "\n   " "\n   ..." "[" "]" " [No match]" " [Matched]" " [Not readable]" " [Too big]" " [Confirm]")))  
(defun ido-disable-line-trucation () 
(set (make-local-variable 'truncate-lines) nil))
(add-hook 'ido-minibuffer-setup-hook 'ido-disable-line-trucation)
;
 (setq ido-ignore-buffers '("\\` " "^\*Mess" "^\*Back" ".*Completion" 
"^\*Ido" "^\*trace" "^\*compilation" "^\*GTAGS" "^\*Help" "^session\.*" "^\*"))
;
;use IDO for more things
(setq recentf-max-saved-items 100)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
我已经确认,通过绑定各个命令,然后以交互方式运行它们,逻辑是合理的。似乎从lisp运行相同的def与以交互方式运行相同的def的行为不同

Ido查找文件期间,Ido编辑输入为C-e

(global-set-key [f11] 'delete-minibuffer-contents)
(global-set-key [f12] (lambda () (interactive) (insert "C:/users/family")))
还尝试了在mytest defun中插入(sit for 1),因为可能存在一些时间问题


如何修改defun mytest以通过一次调用插入字符串(#3)?

这不是标题中问题的答案,但它确实满足了您的需求:

(defun my-ido-find-file-in-dir ()
  (interactive)
  (let ((default-directory "C:/users/family"))
    (call-interactively 'ido-find-file)))

(global-set-key [f10] 'my-ido-find-file-in-dir)