2015-04-22 16 views
5

In Emacs Direct möchte ich etwas tun, was ich oft in Microsoft PowerShell tun.Emacs dired - mit vordefinierten Variablen

In Powershell, ich habe eine Reihe von Ordnern, die ich immer verwenden, und ich zuweisen ihren vollständigen Pfad zum globalen Variablen in meinem Profil Skript (ähnlich init.el in der Emacs-Welt) zB:

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

Wenn ich in einem anderen Ordner bin und ich möchte etwas zu dem obigen Ordner kopieren, ich mache:

copy myFile $standardTemp 

Noch nützlicher als ein Merkmal, ist, wenn ich nach $standardTemp einem umgekehrten Schrägstrich setze, wird es erweitern heraus, so dass ich kann in Unterordner gehen, wenn ich muss. Das ist eine tolle Funktion und spart mir viel Zeit.

Mit dem Dired Copy-Befehl kann ich etwas ähnliches tun, wenn ich Variablen mit z. setq in meiner init.el Datei?

+0

ich es nicht, verwenden Sie so vielleicht bin ich wirklich falsch , aber ich denke, Sie können etwas Ähnliches mit [Dired-Lesezeichen] (http://www.emacswiki.org/emacs/DiredBookmarks) machen. Aber ich bin mir nicht sicher über die Kopierfunktion, die Sie wollen. Also ... im Grunde können Sie diesen Kommentar ignorieren: P – Choma

Antwort

3

Wie wäre es mit so etwas?

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

ist erschöpfend Es ist nicht getestet, wie ich es nur in 10 Minuten aufgepeitscht, aber es macht den Job und es kann mehrere Dateien verarbeiten.

Sie müssen den Dired-Puffer in dem Verzeichnis öffnen, in dem sich die Dateien befinden und jede zu kopierende Datei mit 'm' markieren, dann my-dired-expand-copy aufrufen und Sie nach einem Zielort (in Form eines Schlüsselwort aus der Hash-Tabelle, die wir eingerichtet haben) für die Datei vor dem Kopieren der Datei in das Verzeichnis, das dem Zielschlüsselwort zugeordnet ist.

Es deckt nicht ganz die Unterverzeichnisse Use-Case, die Sie erwähnen, aber es sollte nicht zu schwer sein, dort ein bisschen mehr Hacking zu bekommen.

UPDATE:

Dies sollte nun aufgefordert, Sie in der Lage sein, in von einem ursprünglichen Zielverzeichnis absteigen; vielleicht nicht den Geist-erschütternd wunderbar UX im Großen und Ganzen, aber es funktioniert:

(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

Wenn ich brauche dired zu verwenden, um zu bekommen häufig verwendeten Verzeichnisse, verwende ich die Standard-Emacs-Bookmarking-Funktionen.

ich in das Verzeichnis manuell navigieren und

C-x r m 

drücken Sie den Befehl

bookmark-set 

Sie werden nach einem Namen für das Lesezeichen aufgefordert werden, auszuführen. Geben Sie eine Verknüpfung ein, an die Sie sich erinnern können.

An diesem Punkt, wenn Sie wollen innerhalb dired dieses Verzeichnis zu öffnen, führen Sie einfach den Befehl

Lesezeichen-Sprung

mit den Tasten

C-x r b 

Ihre Verknüpfung in das Verzeichnis eintragen, und Dired öffnet sich für diesen Ort.

von einem Verzeichnis in ein anderes zu kopieren, stellen Sie sicher, in Ihrer init-Datei folgende Einstellungen haben

(setq dired-dwim-target t) 

Dann können Sie für das Quellverzeichnis ein dired Fenster öffnen und ein weiteres Fenster für das Zielverzeichnis innerhalb in Derselbe Frame und dired werden den Quell- und Zielspeicherort automatisch den entsprechenden Verzeichnissen zuweisen.

Beachten Sie, dass dies nur ein Teil dessen ist, was Emacs-Lesezeichen für Sie tun können!

  • Chris
0

Zusätzlich Lesezeichen zu verwenden, sollten Sie Verzeichnis-Aliasnamen verwenden (z Symlinks) oder directory-abbrev-alist. Siehe das Emacs-Handbuch, Knoten File Aliases.

0

Wenn Sie den Wert einer Umgebungsvariablen in den Minipuffer einfügen möchten, können Sie es auf diese Weise tun:

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

wo THE-VARIABLE der Variablenname ist. Using C-u fügt den Wert der Auswertung der sexp in den aktuellen Puffer (in diesem Fall der Minipuffer) ein.

Sie würden also sagen wir verwenden C die markierten Dateien in Dired zu kopieren und dann C-u verwenden, um mit einem getenv sexp für die vorhandene Variable, die Sie haben, deren Wert in den Minipuffer einzufügen, wenn Sie dazu aufgefordert für das Verzeichnis zu kopieren .

(Je nach Emacs-Setup, müssen Sie enable-recursive-minibuffers einstellen nil, auf nicht der Lage sein, M-: vom Minipuffer zu verwenden.)

Verwandte Themen