openwith-mode 작동 방식은 약간 특이합니다. 실제로는 전체적으로 또는 전혀 사용하지 않는 것으로 가정합니다. 그러나 여기서 원하는 것은 로컬로, 즉 dired 버퍼 내에서만 사용하는 것입니다.
매우 쉽게 달성 할 수 없지만 여기에 방법이 있습니다.
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 ...)
표현입니다. 우리가 여기에서하는 5 개 가지 기능의 목록이 반복된다
- dired 찾기-대체 파일을
- dired 찾기 파일
- dired 찾기 파일 - 다른 창
- dired - 마우스 찾기 - 파일 - 다른 창
- dired-보기 파일 파일을 여는 제공 dired 기능입니다
. 이 함수들 각각에 advising이라는 기술로 소량의 코드를 추가합니다. (ad-add-advice...)
은이 5 가지 함수 중 하나가 호출 될 때마다 변수 openwith-mode
을 t
으로 설정합니다. 함수 호출 외부 변수는 nil
으로 설정되어 있습니다.
dired의 함수 중 하나를 사용하여 파일을 열 때마다 외부 응용 프로그램을 호출하는 openwith-mode의 함수는 변수가 t
으로 설정되고 즉시 외부 응용 프로그램을 열려고합니다 하나를 알고있다. 우리가 이러한 고리를 뛰어 넘어야하는 이유는 C-x C-f을 사용하여 이미지 파일을 열 때마다 동일한 openwith-mode 함수가 호출된다는 것입니다. 이것이 바로 openwith-mode가 구현 된 방식 일뿐입니다.
(NB : 안타깝게도 현재의 메이저 - 모드는 파일을 열 때 이미 생성 된 새로운 버퍼의 메이저 모드이므로 스위치로 사용할 수 없습니다. 항상 fundamental-mode
입니다.)
마지막으로 마지막 세 줄은 이전에 주석 처리 한 부 모드 정의의 & 붙여 넣기입니다. 그들은 내가 언급 한 많은 함수가 외부 응용 프로그램 (open-with-filehandler
)을 호출하는 역할을 담당하는 것으로, 소위 파일 처리기라고 말합니다. 실제로 파일에 실제로 액세스하기위한 특별한 작업을 수행하지 않으므로이 함수에 대해 safe-magic
을 t
으로 설정합니다. 또한, 우리는 연산 insert-file-contents
이 우리의 함수에 의해 다루어지기는 어렵지 않다고 선언합니다. 이러한 속성에 대한 자세한 내용은 here을 참조하십시오.
그리고 마지막으로 실제로 파일 처리기를 설치합니다.
중요 다음 openwith 모드 documenation는 당신이 당신의 이맥스 파일에 다음 두 줄을 넣어하는 것이 좋습니다
더 마이너 모드
openwith-mode
더 이상 (후이 없다는 것을 이제
(require 'openwith)
(openwith-mode t)
우리는 그 정의를 주석 처리했다), 두 번째 줄을 제거했는지 확인한다.그것도을 주석으로 :
;; (openwith-mode t)
후 dired와 이미지 파일을 열 경우, 그것은 외부 응용 프로그램에서 열립니다, 이맥스를 다시 시작하는 C-x C-f을 통해 열면 버퍼에 인라인됩니다.
Upvoted에 정의 된 함수를 사용하지만 설명하지 않은 -'평가 - 후 - load' 것 추가 코드를 추가하는 더 일반적인 방법). – phils
@phils 좋은 지적 - 나는 단지 그것에 대해 작은 논평을했지만, 명확하지는 않았다 : openwith-mode가 설계된 방식은 전역 적으로 또는 전역 적으로 * 될 예정이다 : 전역 파일 핸들러 모드가 켜져 있으면 해당 파일 처리기가 외부 응용 프로그램을 검사하고 꺼져 있으면 아무것도 수행하지 않습니다. – Thomas
그러나'eval-after-load'를 사용하여'fmakunbound 'openwith-mode)'와 나머지 코드를 감싸고 실제로 원래의 라이브러리를 건드리지 않고 동일한 결과를 얻지 않겠습니까? – phils