在emacs dired中,我想做一些我经常在Microsoft PowerShell中做的事情。
在PowerShell中,我有一组我一直使用的文件夹,并且在我的配置文件脚本中分配了全局变量的完整路径(类似于emacs世界中的init.el
),例如:
$standardTemp = "C:\Long\Path\To\Folder"
如果我在另一个文件夹中,并且我想将某些内容复制到上面的文件夹,我会这样做:
copy myFile $standardTemp
作为一个功能更有用的是,如果我在$standardTemp
之后放一个反斜杠,它会将其展开,所以如果需要,我可以进入子文件夹。这是一个非常棒的功能,为我节省了很多时间。
使用dired copy命令可以执行类似的操作,如果我使用例如setq
文件中的init.el
?
答案 0 :(得分:3)
这样的事情怎么样?
;; 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)))
答案 1 :(得分:1)
当我需要使用dired来访问经常使用的目录时,我使用标准的emacs书签功能。
我手动导航到目录,然后按
C-x r m
执行命令
bookmark-set
系统会提示您输入书签的名称。输入您可以记住的快捷方式。
此时,只要您想在dired中打开该目录,只需执行命令
即可书签跳跃
用键
C-x r b
输入目录的快捷方式,dired将打开该位置。
要从一个目录复制到另一个目录,请确保在init文件中设置了以下内容
(setq dired-dwim-target t)
然后,您可以打开源目录的dired窗口,以及同一帧内目标目录的另一个窗口,dired将自动将源和目标位置分配给相应的目录。
请注意,这只是emacs书签可以为您做的一部分!
答案 2 :(得分:0)
除了使用书签外,还可以考虑使用目录名别名(例如符号链接)或 directory-abbrev-alist
。请参阅Emacs手册,节点File Aliases
。
答案 3 :(得分:0)
如果要将环境变量的值插入到迷你缓冲区中,可以这样做:
C-u M-: (getenv "THE-VARIABLE")
其中THE-VARIABLE
是变量名称。使用C-u
将评估sexp的值插入当前缓冲区(在本例中为迷你缓冲区)。
因此,您可以使用C
复制Dired中的已标记文件,然后将C-u
与getenv
sexp一起用于现有变量,以插入其值在提示要复制到的目录时进入迷你缓冲区。
(根据您的Emacs设置,您可能需要将enable-recursive-minibuffers
设置为非nil
,以便能够使用迷你缓冲区中的M-:
。)