Правильный способ использования функции запуска процесса

#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)
      )
    )
  )