62 votes

Quelle est la manière correcte de joindre plusieurs composants de chemin en un seul chemin complet dans emacs lisp ?

Supposons que j'ai des variables dir y file contenant des chaînes de caractères représentant un répertoire et un nom de fichier, respectivement . Quelle est la façon correcte, dans emacs lisp, de les joindre en un chemin complet vers le fichier ?

Par exemple, si dir est "/usr/bin" y file est "ls" alors je veux "/usr/bin/ls" . Mais si à la place dir est "/usr/bin/" je veux toujours la même chose, sans barre oblique répétée.

1 votes

La formulation du titre ("joindre plusieurs composants de chemin") est vraiment un peu plus générale que le problème réel, mais si quelqu'un cherche une solution qui gère les valeurs de "multiple" > 2, voir stackoverflow.com/questions/9694661

0 votes

Eh bien, si vous pouvez joindre deux composants, alors vous pouvez utiliser la récursion pour joindre un nombre arbitraire. Je suppose que je considère les deux problèmes comme équivalents par induction.

4voto

sshaw Points 547

Voici ce que j'utilise :

(defun catdir (root &rest dirs)
  (apply 'concat (mapcar
          (lambda (name) (file-name-as-directory name))
          (push root dirs))))

Différences avec celles de @dbr :

  1. Renvoie un "nom de répertoire emacs", c'est-à-dire une valeur avec une barre oblique de fin de ligne.
  2. Il ne développe pas le chemin si root est relative (voir notes)
  3. Traitements root comme racine, alors que joindirs utilisera le premièrement composant commençant par "/" comme la racine.

Notes

De nombreuses fonctions de gestion de fichiers (all, most, ? ??) normaliseront les barres obliques redondantes et feront appel à expand-file-name (ou similaire) sur des chemins relatifs, donc les points 2 et 3 n'ont pas vraiment d'importance.

0voto

PRouleau Points 21

Juste pour compléter ce qui a été dit précédemment avec un lien vers le manuel Emacs :

Comme d'autres l'ont déjà dit, la réponse à la question de l'OP est d'utiliser la fonction expand-file-name . Il s'agit d'une fonction intégrée, implémentée en C et qui ne nécessite donc pas l'utilisation d'une bibliothèque externe.

Ceci est décrit dans le Manuel d'Emacs Lisp section intitulée Fonctions qui développent les noms de fichiers .

Et selon l'aide en ligne d'Emacs, cette fonction a été introduite dans la version ... 1.6 d'Emacs ! Donc... elle devrait être disponible !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X