#emacs
#emacs
Вопрос:
У меня есть небольшой пакет ELisp, который добавляет внешнее меню инструментов в Emacs. Он работает в Microsoft Windows, но мне трудно заставить его работать в других операционных системах. В Microsoft Windows я использую функцию w32-shell-execute . В других операционных системах я использую функцию запуска процесса.
Моя функция external-tools—exec выглядит следующим образом.
(defvar external-tools--exec-count 0)
(defun external-tools--exec (command amp;rest args)
(if args
(message "(external-tools--exec %s %s) called" command (mapconcat 'identity args " "))
(message "(external-tools--exec %s) called" command)
)
(setq external-tools--exec-count ( external-tools--exec-count 1))
(cond
((fboundp 'w32-shell-execute)
(if args
(w32-shell-execute "open" command (mapconcat 'identity args " "))
(w32-shell-execute "open" command)
)
)
(t
(let ((external-tools--exec-process-name (format "external-tools--exec-%i" external-tools--exec-count)))
(if args
(apply 'start-process external-tools--exec-process-name nil command args)
(start-process external-tools--exec-process-name nil command)
)
)
)
)
)
Это пример того, как я его использую.
(defun external-tools--explore-here ()
"Opens Windows Explorer in the current directory."
(interactive)
(let ((dir (external-tools--get-default-directory)))
(when (fboundp 'w32-shell-execute)
(w32-shell-execute "explore" (format ""%s"" dir))
)
(when (and (not (fboundp 'w32-shell-execute)) (executable-find "nautilus"))
(external-tools--exec (executable-find "nautilus") "-w" (format ""%s"" dir))
)
)
)
Функция external-tools—exec работает, если аргументы равны нулю, но она не работает, если указаны аргументы.
Я был бы признателен за любые советы о том, как исправить функцию external-tools—exec.
Редактировать: я изменил функцию так, чтобы она не использовала функцию convert-standard-filename, как рекомендовал Стефан, но функция по-прежнему не работает. Когда я использую функцию external-tools—explore-here в GNU / Linux, я получаю следующую ошибку.
Unable to find the requested file. Please check the spelling and try again.
Unhandled error message: Error when getting information for file '/home/bkey/src/SullivanAndKey.com/SnK/Emacs/Home/.emacs.d/"/home/bkey/src/SullivanAndKey.com/SnK/Emacs/Home/.emacs.d/"': No such file or directory
Комментарии:
1. Не используйте
convert-standard-filename
, потому что он не выполняет то, что вы думаете.2. @Stefan Спасибо за совет. Функция теперь работает благодаря вашим советам и тому факту, что я понял свою ошибку.
Ответ №1:
Я понял это. Ошибка не была в функции external-tools—exec. Это было в вызывающей функции, external-tools-explore-here . Я заключил каталог в кавычки, полагая, что необходимо учитывать возможность того, что в пути к каталогу могут быть пробелы.
Это оказалось ненужным.
Новая функция выглядит следующим образом.
(defun external-tools--explore-here ()
"Opens Windows Explorer or Nautilus in the current directory."
(interactive)
(let ((dir (external-tools--get-default-directory)))
(when (fboundp 'w32-shell-execute)
(w32-shell-execute "explore" dir)
)
(when (and (not (fboundp 'w32-shell-execute)) (executable-find "nautilus"))
(external-tools--exec (executable-find "nautilus") "-w" dir)
)
)
)