gpt4 book ai didi

Emacs dired - 使用预定义变量

转载 作者:行者123 更新时间:2023-12-04 11:51:51 27 4
gpt4 key购买 nike

在 emacs 中,我想做一些我经常在 Microsoft PowerShell 中做的事情。

在 PowerShell 中,我有一组我经常使用的文件夹,我将它们的完整路径分配给我的配置文件脚本中的全局变量(类似于 emacs 世界中的 init.el),例如:

$standardTemp = "C:\Long\Path\To\Folder"

如果我在另一个文件夹中,并且想将某些内容复制到上述文件夹中,则执行以下操作:
copy myFile $standardTemp

作为一个功能更有用的是,如果我在 $standardTemp 后面加一个反斜杠,它将展开它,因此我可以在需要时进入子文件夹。这是一个非常棒的功能,为我节省了很多时间。

使用 dired copy 命令可以做类似的事情,如果我定义变量,例如 setq在我的 init.el文件?

最佳答案

这样的事情怎么样?

;; Use ido
(require 'ido)
(ido-mode t)

;; Make a hash table to hold the paths
(setq my-target-dirs (make-hash-table :test 'equal))

;; Put some paths in the hash (sorry for Unix pathnames)
(puthash "home" "/home/jhrr/" my-target-dirs)
(puthash "target" "/home/jhrr/target/" my-target-dirs)

;; A function to return all the keys from a hash.
(defun get-keys-from-hash (hash)
(let ((keys ()))
(maphash (lambda (k v) (push k keys)) hash)
keys))

;; And the function to prompt for a directory by keyword that is looked
;; up in the hash-table and used to build the target path from the
;; value of the lookup.
(defun my-dired-expand-copy ()
(interactive)
(let* ((my-hash my-target-dirs)
(files (dired-get-marked-files))
(keys (get-keys-from-hash my-hash)))
(mapc (lambda (file)
(copy-file file
(concat
(gethash
(ido-completing-read
(concat "copy " file " to: ") keys) my-hash)
(file-name-nondirectory file))))
files)))

它没有经过详尽的测试,因为我只是在 10 分钟内完成了它,但它可以完成工作并且可以处理多个文件。

您将需要打开文件所在目录中的 dired 缓冲区并用“m”标记要复制的每个文件,然后调用 my-dired-expand-copy它会提示您输入文件的目标目标(以我们设置的哈希表中的关键字的形式),然后最后将文件复制到映射到目标关键字的目录中。

它并没有完全涵盖您提到的子目录用例,但是考虑到更多的黑客攻击,到达那里应该不会太难。

更新:

这现在应该提示您能够从原始目标下降到子目录;总的来说,这可能不是最令人震惊的美妙用户体验,但是,它有效:
(defun my-dired-expand-copy-2 ()
(interactive)
(let* ((my-hash my-target-dirs)
(files (dired-get-marked-files))
(keys (get-keys-from-hash my-hash)))
(mapc (lambda (file)
(let ((target (gethash
(ido-completing-read
(concat "copy " file " to: ") keys) my-hash)))
(if (y-or-n-p "Descend?")
;; Descend into subdirectories relative to target dir
(let ((new-target (ido-read-directory-name "new dir: " target)))
(copy-file file (concat new-target
(file-name-nondirectory file)))
(message (concat "File: " file " was copied to " new-target)))
;; Else copy to root of originally selected directory
(copy-file file (concat target (file-name-nondirectory file)))
(message (concat "File: " file " was copied to " target)))))
files)))

关于Emacs dired - 使用预定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29809698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com