2015-04-22 17 views
5

Trong emacs dired tôi muốn làm một cái gì đó tôi làm khá thường xuyên trong Microsoft PowerShell.Emacs dired - sử dụng biến được xác định trước

Trong PowerShell, tôi có một tập các thư mục mà tôi luôn luôn sử dụng, và tôi gán đường dẫn đầy đủ của họ để biến toàn cầu trong kịch bản hồ sơ cá nhân của tôi (tương tự như init.el trong thế giới emacs) ví dụ:

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

Nếu tôi đang ở một thư mục khác và tôi muốn sao chép một cái gì đó vào thư mục trên, tôi làm:

copy myFile $standardTemp 

Thậm chí hữu ích hơn như một tính năng, được nếu tôi đặt một dấu gạch chéo sau $standardTemp, nó sẽ mở rộng nó ra, vì vậy tôi có thể đi vào các thư mục con nếu tôi cần. Đây là một tính năng rất tuyệt vời và giúp tôi tiết kiệm rất nhiều thời gian.

Với lệnh sao chép có hướng dẫn, tôi có thể làm điều gì đó tương tự, nếu tôi xác định các biến với ví dụ: setq trong tệp init.el của tôi?

+0

tôi không sử dụng nó, vì vậy có lẽ tôi thật sự sai , nhưng tôi đoán bạn có thể làm điều gì đó tương tự với [dired bookmarks] (http://www.emacswiki.org/emacs/DiredBookmarks). Tuy nhiên, tôi không chắc chắn về tính năng sao chép mà bạn muốn. Vậy ... về cơ bản, bạn có thể bỏ qua nhận xét này: P – Choma

Trả lời

3

Làm thế nào về một cái gì đó như thế này?

;; 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))) 

Nó không được kiểm tra đầy đủ khi tôi chỉ cần bỏ nó trong 10 phút, nhưng nó thực hiện công việc và có thể xử lý nhiều tệp.

Bạn sẽ cần phải mở bộ đệm dired trong thư mục tệp và đánh dấu từng tệp bạn muốn sao chép bằng 'm', sau đó gọi my-dired-expand-copy và nó sẽ nhắc bạn cho một đích đích (dưới dạng một từ khóa từ bảng băm mà chúng tôi đã thiết lập) cho tệp trước, cuối cùng, sao chép tệp qua thư mục ánh xạ tới từ khóa mục tiêu.

Nó không hoàn toàn bao gồm các trường hợp sử dụng các thư mục con mà bạn đề cập đến, nhưng không quá khó để có được sự xâm nhập một chút.

UPDATE:

tại Điều này sẽ nhắc bạn để có thể rơi vào thư mục con từ một mục tiêu ban đầu; có lẽ không phải là tâm-shatteringly UX nhất tuyệt vời trên toàn bộ, nhưng, nó hoạt động:

(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

Khi tôi cần phải sử dụng dired để có được thường xuyên sử dụng các thư mục, tôi sử dụng các khả năng emacs đánh dấu chuẩn.

tôi tự điều hướng đến thư mục, và nhấn

C-x r m 

để thực hiện lệnh

bookmark-set 

Bạn sẽ được nhắc nhở cho một tên cho bookmark. Nhập một phím tắt mà bạn có thể nhớ.

Tại thời điểm này, bất cứ lúc nào bạn muốn mở thư mục đó trong dired, chỉ cần thực hiện lệnh

bookmark-nhảy

với các phím

C-x r b 

Nhập phím tắt của bạn vào thư mục, và dired sẽ mở ra vị trí đó.

Để sao chép từ một thư mục khác, đảm bảo bạn đã sau đây thiết lập trong file init của bạn

(setq dired-dwim-target t) 

Sau đó, bạn có thể mở một cửa sổ dired cho thư mục nguồn, và một cửa sổ cho thư mục mục tiêu trong vòng trong cùng một khung, và dired sẽ tự động gán nguồn và vị trí đích cho các thư mục thích hợp.

Lưu ý đây chỉ là một tập con của những dấu trang emacs có thể làm cho bạn!

  • Chris
0

Ngoài việc sử dụng đánh dấu, xem xét sử dụng bí danh mục tên (ví dụ liên kết tượng trưng) hoặc directory-abbrev-alist. Xem sách hướng dẫn Emacs, nút File Aliases.

0

Nếu bạn muốn chèn giá trị của một biến môi trường vào minibuffer, bạn có thể làm theo cách này:

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

nơi THE-VARIABLE là tên biến. Sử dụng C-u chèn giá trị của việc đánh giá sexp vào bộ đệm hiện tại (trong trường hợp này là minibuffer).

Vì vậy, bạn có thể sử dụng C để sao chép các tệp được đánh dấu trong Dired và sau đó sử dụng C-u với một getenv sexp cho biến hiện tại bạn có, để chèn giá trị của nó vào minibuffer khi được nhắc cho thư mục sao chép .

(Tùy thuộc vào thiết lập Emacs, bạn có thể cần phải thiết lập enable-recursive-minibuffers để phi nil, để có thể sử dụng M-: từ minibuffer.)

Các vấn đề liên quan