2015-04-22 86 views
5

在emacs dired中,我想做一些我經常在Microsoft PowerShell中執行的操作。Emacs dired - 使用預定義變量

在PowerShell中,我有一組我一直使用的文件夾,我分配他們的完整路徑,在我的配置文件腳本中的全局變量(類似於​​在Emacs的世界),例如:

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

如果我在另一個文件夾,我想的東西複製到上述文件夾中,我做的:

copy myFile $standardTemp 

更實用的功能,是如果我把一個反斜槓$standardTemp後,它將展開它了,所以我如果需要的話,可以進入子文件夾。這是一個非常棒的功能,爲我節省了很多時間。

使用dired copy命令我可以做類似的事情,如果我用例如setq在我的​​文件中?

+0

我不使用它,所以也許我真的錯,但我想你可以用[dired書籤](http://www.emacswiki.org/emacs/DiredBookmarks)做類似的事情。但我不確定你想要的複製功能。所以......基本上,你可以忽略這個評論:P – Choma

回答

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,它會提示您輸入目標目標(形式爲最後,將文件複製到映射到目標關鍵字的目錄中。

它並不完全覆蓋你提到的子目錄用例,但在給予更多黑客攻擊的情況下,它應該不會太難。

UPDATE:

這個現在應該提示你要能夠下降到從原始目標子目錄;也許不是最令人shatteringly精彩UX總體上,但是,它的工作原理:

(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

當我需要使用dired得到頻繁使用的目錄,我用的是標準的Emacs書籤功能。

我手動導航到該目錄,並按

C-x r m 

執行命令

bookmark-set 

你會被提示爲書籤的名稱。輸入您可以記住的快捷方式。

在這一點上,任何時候要打開內dired該目錄中,只需執行命令

書籤,跳

與鍵

C-x r b 

輸入快捷方式的目錄,並直接打開該位置。

從一個目錄複製到另一個,確保您有以下在init文件設置

(setq dired-dwim-target t) 

然後你就可以打開源目錄dired窗口,並在另一個窗口中的目標目錄同一幀,並且dired會自動將源和目標位置分配給相應的目錄。

請注意,這只是emacs書籤能爲您做的一個子集!

  • 克里斯
0

除了使用書籤,可以考慮使用目錄名稱的別名(例如符號鏈接)或directory-abbrev-alist。請參閱Emacs手冊,節點File Aliases

0

如果你想一個環境變量的值插入到小緩衝區,你能做到這樣:

C-u M-: (getenv "THE-VARIABLE") 

其中THE-VARIABLE是變量名。使用C-u將評估sexp的值插入當前緩衝區(在本例中爲minibuffer)。

所以,你會,比方說,使用C來標記的文件中Dired複製,然後用C-ugetenv SEXP爲你已有的變量,插入它的值寫入小緩衝區提示時目錄複製到。

(根據您的Emacs的設置,您可能需要設置enable-recursive-minibuffers到非nil,以便能夠使用M-:從迷你緩衝區。)