【问题标题】:Concatenate strings in elisp在 elisp 中连接字符串
【发布时间】:2011-04-13 10:39:52
【问题描述】:

我需要如下连接路径字符串,所以我在我的.emacs 文件中添加了以下几行:

(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"))

当我执行 C-h v today-file-path RET 检查时,它没有分配变量。

我的代码有什么问题?有没有其他方法可以连接路径字符串?

编辑

我发现问题是由错误的设置引起的,代码确实有效。感谢您提供比我的代码更好的答案。

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    您可以使用(concat "foo" "bar") 而不是(concatenate 'string "foo" "bar")。两者都有效,当然前者更短。

    【讨论】:

    • 连接甚至没有绑定在我的 emacs 版本中。连接被删除还是什么?
    • @Cameron 看起来 concatenatecl-concatenate 的过时别名,只有在加载过时库 cl 时才可用。
    【解决方案2】:

    使用 expand-file-name 构建相对于目录的文件名:

    (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")))
    

    【讨论】:

    • 这真的很有用。谢谢!
    【解决方案3】:

    首先,不要使用“_”;改用'-'。 将其插入 .emacs 并重新启动 emacs(或评估缓冲区中的 S-exp)以查看效果:

    (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"))
    

    【讨论】:

    • 查看@Jürgen 的回答,了解从多个元素构建路径的更好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2014-03-31
    • 1970-01-01
    • 2013-04-12
    • 2011-12-06
    • 2016-05-28
    • 2013-10-13
    相关资源
    最近更新 更多