web-dev-qa-db-fra.com

Concaténer des cordes dans elisp

Je dois concaténer la chaîne de chemin comme suit, j'ai donc ajouté les lignes suivantes à mon .emacs fichier:

(setq org_base_path "~/smcho/time/")
(setq org-default-notes-file-path (concatenate 'string org_base_path "notes.org"))
(setq todo-file-path (concatenate 'string org_base_path "gtd.org"))
(setq journal-file-path (concatenate 'string org_base_path "journal.org"))
(setq today-file-path (concatenate 'string org_base_path "2010.org"))

Quand je fais C-h vtoday-file-path RET pour vérifier, aucune variable n'est affectée.

Qu'est ce qui ne va pas avec mon code? Existe-t-il un autre moyen de concaténer la chaîne de chemin?

ÉDITER

J'ai trouvé que le problème était dû à une mauvaise configuration, le code fonctionne réellement. Merci pour les réponses qui sont meilleures que mon code.

43
prosseek

Vous pouvez utiliser (concat "foo" "bar") plutôt que (concatenate 'string "foo" "bar"). Les deux fonctionnent, mais bien sûr, le premier est plus court.

64
offby1

Tout d'abord, n'utilisez pas "_"; utilisez '-' à la place. Insérez ceci dans votre .emacs et redémarrez emacs (ou évaluez le S-exp dans un tampon) pour voir les effets:

(setq org-base-path (expand-file-name "~/smcho/time"))

(setq org-default-notes-file-path (format "%s/%s" org-base-path "notes.org")
      todo-file-path              (format "%s/%s" org-base-path "gtd.org")
      journal-file-path           (format "%s/%s" org-base-path "journal.org")
      today-file-path             (format "%s/%s" org-base-path "2010.org"))
27
OTZ

Utilisez expand-file-name pour créer des noms de fichiers relatifs à un répertoire:

(let ((default-directory "~/smcho/time/"))
  (setq org-default-notes-file-path (expand-file-name "notes.org"))
  (setq todo-file-path (expand-file-name "gtd.org"))
  (setq journal-file-path (expand-file-name "journal.org"))
  (setq today-file-path (expand-file-name "2010.org")))
25
Jürgen Hötzel