2015-04-22 2 views
5

Dans emacs dired je veux faire quelque chose que je fais assez souvent dans Microsoft PowerShell.Emacs dired - en utilisant la variable prédéfinie

Dans PowerShell, j'ai un ensemble de dossiers que j'utilise toujours, et j'attribue leur chemin complet à des variables globales dans mon script de profil (similaire à init.el dans le monde emacs), par exemple:

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

Si Je suis dans un autre dossier et je veux copier quelque chose dans le dossier ci-dessus, je fais:

copy myFile $standardTemp 

Encore plus utile en tant que fonction, est si je mets une barre oblique inverse après $standardTemp, il l'étendre, alors je peut aller dans des sous-dossiers si j'en ai besoin. C'est une fonctionnalité très impressionnante et cela me fait gagner beaucoup de temps.

Avec la commande dired copy, puis-je faire quelque chose de similaire, si je définis des variables avec, par ex. setq dans mon fichier init.el?

+0

je ne l'utilise pas, alors peut-être que je suis vraiment mal , mais je suppose que vous pouvez faire quelque chose de similaire avec [dired bookmarks] (http://www.emacswiki.org/emacs/DiredBookmarks). Pourtant, je ne suis pas sûr de la fonctionnalité de copie que vous voulez. Donc ... en gros, vous pouvez ignorer ce commentaire: P – Choma

Répondre

3

Que diriez-vous de quelque chose comme ceci?

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

Il n'est pas exhaustive testé comme je l'ai fouetté il en 10 minutes, mais il fait le travail et il peut gérer plusieurs fichiers. Vous devrez ouvrir le tampon dired dans le répertoire dans lequel se trouvent les fichiers et marquer chaque fichier que vous voulez copier avec 'm', puis appeler my-dired-expand-copy et il vous demandera une destination cible (sous la forme d'un mot-clé de la table de hachage, nous avons mis en place) pour le fichier avant, enfin, la copie du fichier sur le répertoire qui correspond au mot-clé cible.

Cela ne couvre pas tout à fait les sous-répertoires que vous mentionnez, mais il ne devrait pas être trop difficile d'y arriver étant donné le piratage.

MISE À JOUR:

Cela devrait maintenant vous invite à être en mesure de descendre dans les sous-répertoires à partir d'une cible d'origine; peut-être pas le plus esprit shatteringly UX merveilleux dans l'ensemble, mais cela fonctionne:

(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

Quand je dois utiliser dired pour se rendre à des répertoires fréquemment utilisés, j'utilise les capacités de bookmarking standards emacs.

naviguer manuellement dans le répertoire, puis appuyez sur

C-x r m 

pour exécuter la commande

bookmark-set 

Vous serez invité à entrer un nom pour le signet. Entrez un raccourci dont vous pouvez vous souvenir.

A ce moment, chaque fois que vous voulez ouvrir ce répertoire au sein dired, il suffit d'exécuter la commande

signet saut

avec les touches

C-x r b 

Entrez votre raccourci vers le répertoire, et dired ouvrira à cet endroit.

Pour copier d'un répertoire à un autre, assurez-vous que vous avez ce qui suit défini dans votre fichier init

(setq dired-dwim-target t) 

Ensuite, vous pouvez ouvrir une fenêtre Dired pour le répertoire source, et une autre fenêtre pour le répertoire cible dans dans la même trame, et dired assignera automatiquement l'emplacement source et cible aux répertoires appropriés. Notez qu'il ne s'agit que d'un sous-ensemble de ce que les signets emacs peuvent faire pour vous!

  • Chris
0

En plus d'utiliser les signets, pensez à utiliser les alias de nom de répertoire (par exemple) ou symlinks directory-abbrev-alist. Voir le manuel d'Emacs, noeud File Aliases.

0

Si vous souhaitez insérer la valeur d'une variable d'environnement dans le mini-tampon, vous pouvez le faire de cette façon:

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

THE-VARIABLE est le nom de la variable. L'utilisation de C-u insère la valeur d'évaluation du sexp dans le tampon courant (dans ce cas, le mini-tampon).

Donc, vous, par exemple, utiliser C pour copier les fichiers marqués dans Dired, puis utilisez C-u avec un getenv sexp pour la variable existante que vous avez, d'insérer sa valeur dans le mini-tampon lorsque vous êtes invité pour le répertoire à copier sur .

(Selon votre configuration Emacs, vous devrez peut-être mettre à enable-recursive-minibuffers non nil, pour être en mesure d'utiliser M-: du mini-tampon.)