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

时间:2014-11-29 05:52:59

标签: emacs ido minibuffer

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

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

(defun mytest ()
  (interactive)
  (ido-edit-input) ;#1
  (delete-minibuffer-contents) ;#2
  (insert "C:/users/family/" )) ;#3

我的期望是,在调用mytest之后,迷你缓冲区将包含给定的字符串(#3)。然而,似乎我需要运行mytest 2x才能将插入的字符串放入迷你缓冲区。在第一次调用之后,ido迷你缓冲区处于编辑模式,但就好像只运行了#1(原始文本仍然存在)。在第二次调用mytest之后,ido迷你缓冲区似乎已经执行了#1,#2和#3。

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

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;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运行相同的defs的行为与以交互方式运行相同的方式不同。

在ido-find-file

期间,Ido-edit-input是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)?

1 个答案:

答案 0 :(得分:0)

这不是标题中问题的答案,但它确实做了你想要的事情:

(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)