Получение корневой папки установки пакета 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 неоптимально. Пожалуйста, смотрите принятый ответ для лучшего подхода.