这与这个问题有关:
如何拥有 emacs-helm-list-offer-files-in-current-directory-as-options
但不是从当前目录添加文件,我希望能够拥有一个固定的目录列表,helm-mini 总是会从中提供文件。理想情况下,我希望能够只拥有具有特定扩展名的文件,并且我希望这可以递归完成(实际上只有一层深)。
这与这个问题有关:
如何拥有 emacs-helm-list-offer-files-in-current-directory-as-options
但不是从当前目录添加文件,我希望能够拥有一个固定的目录列表,helm-mini 总是会从中提供文件。理想情况下,我希望能够只拥有具有特定扩展名的文件,并且我希望这可以递归完成(实际上只有一层深)。
这是 org 扩展的预过滤器略有不同。
(require 'helm-cmd-t)
(defvar my-org-folders (list "~/org")
"my permanent folders for helm-mini")
(defun helm-my-org (&optional arg)
"Use C-u arg to work with repos."
(interactive "P")
(if (consp arg)
(call-interactively 'helm-cmd-t-repos)
(let ((helm-ff-transformer-show-only-basename nil))
(helm :sources (mapcar (lambda (dir)
(helm-cmd-t-get-create-source-dir dir))
my-org-folders)
:candidate-number-limit 20
:buffer "*helm-my-org:*"
:input "org$ "))))
您可以利用helm-cmd-t库更好地解决它。它将目录递归地打包为可以用作源的存储库。
它了解如何非常快速地读取大量 DVCS 存储库。
默认功能并不完全是您在此处所追求的,但您可以轻松地利用机器来满足您的所有要求。
例如,在这里我定义了一个命令,它将两个 repos 添加到默认的 helm-mini 源中。
(require 'helm-cmd-t)
(defvar my-mini-folders (list "~/src/ember/data" "~/src/ember/ember.js")
"my permanent folders for helm-mini")
(defun helm-my-mini (&optional arg)
"my helm-mini. Use C-u arg to work with repos."
(interactive "P")
(if (consp arg)
(call-interactively 'helm-cmd-t-repos)
(let ((helm-ff-transformer-show-only-basename nil))
(helm :sources (nconc (list
helm-c-source-buffers-list
helm-c-source-recentf
helm-c-source-buffer-not-found)
(mapcar (lambda (dir)
(helm-cmd-t-get-create-source-dir dir))
my-mini-folders))
:candidate-number-limit 20
:buffer "*helm-my-mini:*"))))
干得好。我正在使用此代码列出特定目录中的所有 org 文件。如果要列出所有文件,只需删除源中的 Candidate-transformer 行,并删除 emagician/helm-ct-is-org-file。
您可能还想重命名源/变量/函数。;)
编辑:已修复,感谢查看 helm-cmd-t
注意:这是我第一次真正尝试制作 helm 源代码,但这个实现可能很糟糕。它还专门解决了我的问题(仅直接在一个中查找所有 org 文件)而不是更普遍的问题(基于特定目录中的文件构建 helm 源)。
(defvar emagician/helm-c-source-files
`((name . "Find Emagician Files")
(header-name . (lambda (_)))
(candidates . ,(lambda ()
(when (file-accessible-directory-p emagician-dir)
(directory-files emagician-dir t))))
(match helm-c-match-on-file-name helm-c-match-on-directory-name)
(keymap . ,helm-generic-files-map)
(candidate-transformer . emagician/helm-ct-is-org-file)
(help-message . helm-generic-file-help-message)
(mode-line . ,helm-generic-file-mode-line-string)
(type . file)))
(defun emagician/helm-ct-is-org-file (candidates)
(remove-if-not (lambda (c)
(and (string= (substring c -4) ".org")
(not (string= (substring (file-name-nondirectory c) 0 2) ".#"))))
candidates))
(defun emagician/helm-emagician-dir ()
"List all the org files in the Emagician dir"
(interactive)
(helm :sources emagician/helm-c-source-files
:candidate-number-limit 40
:buffer "*emagician-|-+-|-files*"))
(global-set-key (kbd "S-<f3>") 'emagician/helm-emagician-dir)