最近发现emacs29版本中的find-dired
包中多了个命令find-dired-with-command
,这个命令对构建shell command
与生成dired
界面进行了解耦,那么使用fd
(或其它可生成path列表的命令)+find-dired-with-command
可以很简单的配置出类似fd-dired
包中的fd-dired
命令。
以下是我的配置,仅供参考。
(use-package find-dired
:init
(defvar dired:fd-args nil
"Last arguments given to `fd' by \\[dired:fd-dired]")
;; History of fd-args values entered in the minibuffer.
(defvar dired:fd-args-history nil)
(defconst dired:fd-dired-fd-pre-args
(concat " --color never"
(if def:win-p
(concat " --path-separator "
(shell-quote-argument "/")))
" "))
(defconst dired:fd-dired-rg-pre-args
(concat " --color never"
" --files-with-matches"
" -0"
" --regexp"
" "))
:config
(defun dired:fd-dired (dir args)
"Run `fd' and go into Dired mode on a buffer of the output.
The default command run is
fd ARGS -l
."
(interactive (list
(read-directory-name "Run fd in directory: " nil "" t)
(read-string "Run fd (with args): " dired:fd-args
(if dired:fd-args
'(dired:fd-args-history . 1)
'dired:fd-args-history))))
(setq dired:fd-args args
args (concat "fd"
dired:fd-dired-fd-pre-args
(unless (string= args "")
(concat args " "))
"-l"))
(find-dired-with-command dir args))
(defun dired:fd-dired-dwim (args)
"Run `fd' and go into Dired mode on a buffer of the output in `default-directory'."
(interactive (list
(read-string "Run fd (with args): " fd-args
(if fd-args
'(fd-args-history . 1)
'fd-args-history))))
(dired:fd-dired default-directory args))
(defun dired:fd-name-dired (dir pattern)
"Search DIR recursively for files matching the globbing PATTERN.
and run Dired on those files.
PATTERN is a shell wildcard (not an Emacs regexp) and need not be quoted.
The default command run is
fd -g PATTERN -l
."
(interactive
"DFd-name (directory): \nsFd-name (filename wildcard): ")
(dired:fd-dired dir (concat "-g" " " (shell-quote-argument pattern))))
(defun dired:fd-rg-dired (dir regexp)
"Find files in DIR that contain matches for REGEXP and Dired on output.
The default command run is
fd -X rg -l0 --regexp REGEXP | xargs -0 ls
."
(interactive "DFd-rg (directory): \nsFd-rg (rg regexp): ")
(find-dired-with-command dir
(concat "fd"
dired:fd-dired-fd-pre-args
"-X"
" "
"rg"
dired:fd-dired-rg-pre-args
(shell-quote-argument regexp)
" "
"|"
" "
"xargs -0"
" "
"ls"
" "
(cdr find-ls-option))))
:bind
(("M-s d" . dired:fd-dired)
:map dired-mode-map
("r" . dired:fd-dired-dwim))
:commands dired:fd-rg-dired
:custom
(find-ls-option find-ls-option-default-ls))
配置用到了xargs
和ls
命令,Windows系统用户可将git下的usr/bin
目录加入系统路径中来获取相关命令。