Emacs lisp - проблемы с filename-строкой на win7 - PullRequest
2 голосов
/ 19 декабря 2011

В Win7 с Emacs24 я сталкиваюсь с проблемами, когда программы Emacs хотят открывать (pdf) файлы. Проблемы остаются, когда я активирую или деактивирую openwith-mode. Я либо получаю сообщение 'неправильный аргумент типа arrayp nil' внутри Emacs, либо запускается Acrobat Reader, но выдает сообщение об ошибке «не удается открыть / найти этот файл».

Я пытался его отладить и всегда заканчивал в файлах .el. Кажется, что имя открываемого pdf-файла создается путем объединения абсолютного имени файла и расширения файла .pdf. Однако строка имени файла, заданная для AcroRd32, выглядит следующим образом:

AcroRd32 "c:\\absolute\file\name".pdf

Это не работает и в командной строке. Я должен изменить его (вручную) на

AcroRd32 "c:\\absolute\file\name.pdf"

или

AcroRd32 c:\\absolute\file\name.pdf

чтобы заставить это работать.

Я не знаю, считается ли это ошибкой или это проблема только для меня. Я пытался изменить код elisp на что-то вроде

(format "%s" (concat absolute-filename file-extension))

чтобы избавиться от этих двойных кавычек, но безрезультатно. И в любом случае, я не чувствую себя комфортно, возиться с базовой библиотекой, такой как files.el, и действительно трудно отладить эту библиотеку, так как она вызывается постоянно.

Может, кто-то сталкивался с такой же проблемой и нашел решение?

[Я использую GNU Emacs 24.0.91.1 (i386-mingw-nt6.1.7601) 2011-11-22 для MARVIN.]

PS 1 Test Case 1

Я получаю следующее сообщение об ошибке, когда выполняю M-x toggle-debug-on-error и затем пытаюсь открыть pdf-файл в dired:

Debugger entered--Lisp error: (wrong-type-argument arrayp nil)
  file-truename(nil)
  find-file-noselect-1(#<buffer test.pdf<4>> "~/.emacs.d/org/projects/sandbox/test.pdf" nil nil "~/.emacs.d/org/projects/sandbox/test.pdf" ((2816 7 . 27468) (16087 . 35227)))
  find-file-noselect("c:/Users/tj2/.emacs.d/org/projects/sandbox/test.pdf" nil nil nil)
  find-file("c:/Users/tj2/.emacs.d/org/projects/sandbox/test.pdf")
  dired-find-file()
  call-interactively(dired-find-file nil nil)

и следующее сообщение:

Openwith mode enabled
find-file-noselect-1: Wrong type argument: arrayp, nil

Имеет ли значение, что мой .emacs.d действительно является символической ссылкой Windows (mklink) на папку Dropbox?

PS 2 Test Case 2

вот сообщение, которое я получаю в буфере компиляции maven, когда выполняю C-c C-s (LilyPond-command-view) в буфере ly:

-*- mode: compilation; default-directory: "~/.emacs.d/org/projects/sandbox/" -*-
Compilation started at Tue Dec 20 09:16:28

AcroRd32 "c:/Users/tj2/.emacs.d/org/projects/sandbox/2test".pdf

Compilation exited abnormally with code 1 at Tue Dec 20 09:16:35

В буфере сообщений я нахожу

Compilation exited abnormally with code 1
Error during redisplay: (invalid-regexp "Unmatched ( or \\(")

Эта ошибка не вызывает отладчик, хотя я сделал M-x toggle-debug-on-error.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Для меня это звучит как ошибка.Подумайте об этом: M-x report-emacs-bug.

Не знаю, почему Майкл Х. отправил вас на страницу Sunrise Commander с подсказкой о OpenWith .Возможно, я что-то упустил в вашем вопросе, где вы указываете, что используете один из этих пакетов?

Я бы предложил сообщить об ошибке Emacs.И если вы хотите узнать больше об открытии приложений Windows, связанных с типами файлов и т. Д., Я бы посоветовал обратиться к этой странице .

0 голосов
/ 08 сентября 2016

Это, похоже, проблема с openwith.el, поэтому я не думаю, что вы получите большую помощь с отчетом об ошибках Emacs, так как openwith.el не является частью Emacs.

Я обнаружил аналогичную ошибку (я в Linux) и решил, что было бы лучше использовать «более чистую» альтернативу, которая не настраивается find-file-noselect (см. Эту страницу на emacs.sxe почему). OpenWith вики-страница указала мне на менее популярный небольшой кусочек кода,

По умолчанию run-associated-program этого пакета плохо интегрируется с обычным рабочим процессом Emacs, но вот как вы можете интегрировать его с helm-find-files (также описано по ссылке выше).

(require 'run-assoc)
(setq associated-program-alist
      '(("evince" "\\.pdf$")
        ("play" "\\.mp3$")))

(defun helm-find-files-maybe-run-assoc (orig-fun &rest args)
  (let ((sel (helm-get-selection)))
    (if (string-match (mapconcat
               (lambda (x) (second x))
               associated-program-alist "\\|")
              (helm-get-selection))
    (run-associated-program sel)
      (apply orig-fun args))))

(advice-add 'helm-execute-selection-action
        :around #'helm-find-files-maybe-run-assoc)
...