Получение корневой папки установки пакета orgmode в emacs через elisp

Как я могу получить папку, в которой установлен org-mode в emacs? В зависимости от того, как он был установлен, он будет отличаться. Есть ли переменная, которая содержит это значение?

Мне нужно было бы получить доступ к файлу, который является частью установки в режиме org.

Я не ищу определенную библиотеку, но файл.R, который является файлом R, который я хочу программно загрузить в R (из кода elisp).

Итак, используя

(locate-library "ob-R") "/Users/rainerkrug/.emacs.d/org-mode/lisp/ob-R.elc"

Тогда мне пришлось бы использовать следующее:

(concat (locate-library "ob-R") "/../etc/") "/Users/rainerkrug/.emacs.d/org-mode/lisp/ob-R.elc/../etc/"

И мне еще предстоит избавиться от об-рельса

Это работает, но я ищу функцию, которая дает мне путь

(IS-THERE-SOMETHING-LIKE-THIS "org") "/Users/rainerkrug/.emacs.d/org-mode/"

Спасибо

5 ответов

Решение

Emacs предоставляет богатый набор функций управления именами файлов, которые легко решают вашу проблему:

(expand-file-name "../etc/R" (file-name-directory (locate-library "ob-R")))

Вы можете использовать это:

(org-find-library-dir "org")

Или, в вашем случае:

(concat (org-find-library-dir "org") "etc/R")

M-x locate-library RET org RET

или, если вы хотите открыть:

M-x find-library RET org RET

Если вам не нужно делать это программно, вы можете использовать M-x describe-mode и в описании одна из первых строк Org mode defined in org.el Ссылка на org.el кликабельна и ведет в каталог org-mode.

Я нашел решение, которое эффективно использует locate-library и обрезает ненужные элементы (имя файла и последний каталог) и снова собирает их как путь:

(locate-library "org")
"/Users/rainerkrug/.emacs.d/org-mode/lisp/org.elc"

(split-string (locate-library "org") "/")
("" "Users" "rainerkrug" ".emacs.d" "org-mode" "lisp" "org.elc")


(butlast (split-string (locate-library "org") "/") 2)
("" "Users" "rainerkrug" ".emacs.d" "org-mode")

(append (butlast (split-string (locate-library "org") "/") 2) '("etc" "R"))
("" "Users" "rainerkrug" ".emacs.d" "org-mode" "etc" "R")

(mapconcat 'identity
           (append (butlast (split-string (locate-library "org") "/") 2) '("etc" "R"))
           "/")
"/Users/rainerkrug/.emacs.d/org-mode/etc/R"

Как указано в комментариях, использование split-string неоптимально. Пожалуйста, смотрите принятый ответ для лучшего подхода.

Другие вопросы по тегам