3 votes

Emacs supprime le dernier répertoire d'une chaîne de caractères

Supposons que j'aie une chaîne dont le nom de répertoire est "/sites/all/modules". Et je veux supprimer le dernier composant de cette chaîne, en produisant : "/sites/all". J'ai essayé de créer une fonction, mais elle renvoie : "/sites/all/modules".

(defun remove-last-dir (dir)
      (replace-regexp-in-string "(.*)/.+" "\1" dir))

(print (remove-last-dir "/sites/all/modules"))

7voto

phils Points 30543
ELISP> (directory-file-name (file-name-directory "/sites/all/modules"))
"/sites/all"

file-name-directory obtient le composant répertoire du chemin d'accès donné. Emacs considère les chemins se terminant par / sont des répertoires, de sorte que la valeur de retour sera précédée d'un /

directory-file-name renvoie une version sans répertoire du chemin d'accès (ce qui signifie qu'il supprime un / de la valeur, s'il y en a une).

Notez que si votre argument initial était (ou pourrait être) /sites/all/modules/ vous voudrez alors appeler directory-file-name le premier (comme par ailleurs) file-name-directory renverrait simplement la valeur originale, car le "composant répertoire" d'un chemin d'accès au répertoire est lui-même).

2voto

S4M Points 1046

Je vous ai écrit un code en ELisp qui devrait faire l'affaire :

(defun remove-last-dir (dir)
  (let* ((splits (cdr (split-string dir "/")))
         (res (mapconcat 'identity (butlast splits) "/")))
     (concat "/" res)))

J'espère que cela vous aidera !

1voto

user4035 Points 14765

Rédiger la solution efficace :

(defun remove-last-dir (dir)
      (string-match "\\(.*\\)/" dir)
      (match-string 1 dir))

(print (remove-last-dir "/sites/all/modules"))

Impressions :

"/sites/all"

1voto

sindikat Points 3533

Tandis que Réponse de @phils est correcte et idiomatique pour Emacs sans bibliothèques tierces, si vous travaillez fréquemment avec des fichiers et des chemins de fichiers dans votre Elisp, je recommande d'installer f.el qui introduit un grand nombre de fonctions liées aux fichiers et aux répertoires. f-dirname est ce qu'il vous faut :

(f-dirname "path/to/file.ext") ;; => "path/to"
(f-dirname "path/to/directory") ;; => "path/to"
(f-dirname "/") ;; => nil

Consultez également d'autres fonctions, si vous avez besoin d'un contrôle plus poussé des chemins.

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