2012-06-27 1 views
6

Я хочу настроить emacs для использования внешних приложений , когда я открываю файлы изображений из режима ожидания.emacs dired and openwith

С другой стороны, я также хочу использовать встроенные изображения в буферах emacs.

Чтобы открыть файлы во внешних приложениях я использую openwith.el пакет http://www.emacswiki.org/emacs/OpenWith

Проблемы с второстепенным режимом OpenWith является то, что он является глобальным и, когда он включается в Dired-режиме крюком

(add-hook 'dired-mode-hook 
      (lambda() 
      (setq truncate-lines t) 
      (openwith-mode t) 
      )) 

он действует везде, и все встроенные изображения в буферах emacs открыты во внешних приложениях.

Я попытался изменить

:global t 

в

:global nil 

в openwith.el, но это как-то отключает OpenWith режим полностью.

Итак, мой вопрос: как сказать emacs использовать openwith второстепенный режим только с буфером с буфером и нигде?

Спасибо.

ответ

0

Одним из способов может быть установка emacsclient в качестве предпочтительной программы для типов файлов, которые вам нравятся в openwith-associations в openwith.el, и начать использовать emacsclient.

Вы можете запускать новую сессию emacs каждый раз, но это звучит уродливее, чем предыдущее предложение.

4

Путь openwith-mode работает немного странно: он действительно предполагает, что вы используете его либо глобально, либо вообще нет. Однако вы хотите использовать его локально, а именно только в буфере с буфером.

Это не может быть достигнуто очень легко, но вот путь.

Откройте исходный файл openwith-mode, openwith.el. Затем прокрутите весь путь вниз, пока не дойдете до определения фактического второстепенного режима. Тогда закомментируйте это определение, поставив точку с запятой в начале каждой строки:

;;;###autoload 
; (define-minor-mode openwith-mode 
; "Automatically open files with external programs." 
; :lighter "" 
; :global t 
; (if openwith-mode 
;  (progn 
;   ;; register `openwith-file-handler' for all files 
;   (put 'openwith-file-handler 'safe-magic t) 
;   (put 'openwith-file-handler 'operations '(insert-file-contents)) 
;   (add-to-list 'file-name-handler-alist '("" . openwith-file-handler))) 
;  (setq file-name-handler-alist 
;   (delete '("" . openwith-file-handler) file-name-handler-alist)))) 

Тогда под этим кодом (но до (provide 'openwith)), вставьте следующий код:

(defvar openwith-mode nil) 

(mapc (lambda (function) 
     (ad-add-advice function 
         '(dired-openwith nil t (advice . (lambda() (let ((openwith-mode t)) ad-do-it)))) 
         'around 0)) 
     '(dired-find-alternate-file 
     dired-find-file 
     dired-find-file-other-window 
     dired-mouse-find-file-other-window 
     dired-view-file)) 

(put 'openwith-file-handler 'safe-magic t) 
(put 'openwith-file-handler 'operations '(insert-file-contents)) 
(add-to-list 'file-name-handler-alist '("" . openwith-file-handler)) 

Этот код делает несколько вещей.

Во-первых, он определяет переменную, называемую openwith-mode. Эта переменная используется внутри одной из функций openwith-mode, которая решает, использовать ли внешнее приложение или нет. Обычно такая переменная предоставляется автоматически Emacs, когда вы определяете второстепенный режим, однако, поскольку мы просто прокомментировали определение текущего второстепенного режима выше, мы явно вводим эту переменную здесь.

Назначение переменной - работать как своего рода переключатель, через который мы можем контролировать, должен ли файл изображения быть встроен или передан внешнему средству просмотра.

Далее у нас есть выражение (mapc ...). Что мы делаем здесь перебирать список из пяти функций:

  • Dired-найти-альтернативный-файл
  • Dired-найти-файл
  • Dired-найти-файлы другого окна
  • Dired -Мышьте-найти-файлы другого окна
  • Dired-вид-файл

которые являются функциями Dired предоставляет для открытия файла. К каждой из этих функций добавляется небольшое количество кода в методе advising: то, что вызывается (ad-add-advice...), задается переменной openwith-mode в t при вызове одной из этих пяти функций. Вне вызова функции переменная остается установленной на nil.

Это приводит к тому, что всякий раз, когда вы используете одну из функций dired для открытия файла, функция openwith-mode, которая отвечает за вызовы внешних приложений, видит переменную, установленную на t, и сразу же пытается открыть внешнее приложение, если оно знает один. Причина, по которой нам приходится перепрыгивать через такие обручи, заключается в том, что одна и та же функция openwith-mode также вызывается всякий раз, когда вы открываете файл изображения, используя C-x C-f - это так, как реализовано openwith-mode.

(NB: к сожалению, мы не можем использовать текущий основной режим в качестве коммутатора, потому что это будет основной режим нового буфера, который будет создан для открытия файла. Это всегда fundamental-mode.)

Наконец, последние три строки просто скопируют & пасту из определения второстепенного режима, о котором мы уже прокомментировали. Они говорят, что функция, о которой я уже упоминал много, и которая отвечает за вызов внешних приложений, называется open-with-filehandler - это так называемый обработчик файлов. Это действительно не делает ничего особенного для фактического доступа к файлу, поэтому мы устанавливаем safe-magic для этой функции на t. Кроме того, мы заявляем, что операция insert-file-contents обрабатывается нашей функцией нетривиальным способом. (См. here для получения дополнительной информации об этих свойствах.)

И в самом конце мы фактически устанавливаем обработчик файла.


Важны: OpenWith режим documenation рекомендует поместить следующие строки в ваш файл .emacs:

(require 'openwith) 
(openwith-mode t) 

Теперь, когда нет второстепенного режима openwith-mode больше (после мы прокомментировали его определение), пожалуйста, убедитесь, что вы удалите вторую строку, напримеркомментируя это тоже:

;; (openwith-mode t) 

После повторного запуска Emacs, если открыть файл изображения с Dired, он должен открыть во внешнем приложении; если вы откроете его через C-x C-f он будет встроен в буфер.

+0

Upvoted, но не объяснили, почему вам необходимо закомментировать определение режима (или непосредственно модифицировать библиотеку вообще - 'Eval-после-load' будет более нормальный подход к добавлению этого дополнительного кода). – phils

+0

@phils хорошая точка - я только сделал небольшой комментарий об этом, но это было не очень ясно: способ openwith-mode разработан, он должен быть включен или включен * глобально *: он добавляет глобальный обработчик файлов и когда этот режим включен, этот обработчик файлов проверяет внешние приложения, если он выключен, он ничего не делает. – Thomas

+0

Но не удалось бы достичь такого же результата, используя 'eval-after-load' для wrap' (fmakunbound 'openwith-mode)' и остальную часть вашего кода, а не касаться оригинальной библиотеки? – phils

 Смежные вопросы

  • Нет связанных вопросов^_^