답변:
업데이트 (야간 후) : 이 답변에는 큰 결함이 있습니다. 이맥스 소스뿐만 아니라 모든 기능을 view-mode
탐색 할 때 가능 합니다. 이 문제는 해결 될 수 있지만 @phils 의 답변을 사용 하는 것이 좋습니다 .
이렇게함으로써 C-h f describe-function RET
다음의 소스 코드를 읽기 describe-function
I를이 함수 정의에 대한 링크는 특별한 유형의 "버튼"을 생성하는 발견했다 help-function-def
.
zrgrep
이 문자열 ( " help-function-def
")로 실행 하면을 가리 켰습니다 help-mode.el.gz
.
이 모든 것을 파고 나면이 버튼 유형을 자체 버튼으로 바꿀 수 있습니다 (코드의 주석 참고).
(define-button-type 'help-function-def
:supertype 'help-xref
'help-function (lambda (fun file)
(require 'find-func)
(when (eq file 'C-source)
(setq file
(help-C-file-name (indirect-function fun) 'fun)))
;; Don't use find-function-noselect because it follows
;; aliases (which fails for built-in functions).
(let ((location
(find-function-search-for-symbol fun nil file)))
(pop-to-buffer (car location))
(if (cdr location)
(goto-char (cdr location))
(message "Unable to find location in file")))
(view-mode t)) ; <= new line: enable view-mode
'help-echo (purecopy "mouse-2, RET: find function's definition"))
내가 알 수있는 한 조언을 추가 할 기능이 없습니다 : Emacs는 lambda
여기를 사용합니다 . 반면에 @rationalrevolt 로 지적한 것처럼 버튼 유형 의 help-function
속성을 바꿀 수 있습니다 help-function-def
.
(require 'help-mode)
(let ((help-func (button-type-get 'help-function-def 'help-function)))
(button-type-put 'help-function-def 'help-function
`(lambda (func file)
(funcall ,help-func func file) (view-mode t))))
button-type-get
하고 button-type-put
교체 하려고 시도 할 수 있다고 생각 합니다.
디렉토리 로컬 변수 를 사용하여 기본적으로 Emacs의 소스 파일을 읽기 전용으로 만들 수 있습니다 . (도 참조 C-hig (emacs) Directory Variables
RET).
.dir-locals.el
보호하려는 디렉토리 트리의 루트에서 다음 내용 으로 파일을 작성하십시오 .
((nil . ((eval . (view-mode 1)))))
편집 : Michał Politowski view-mode
는이 방법으로 활성화 하면 문제가 있음을 q지적 합니다. 버퍼를 해제하면 모드도 비활성화되므로 다음에 버퍼를 방문 할 view-mode
때 활성화되지 않습니다.
편집 2 : Constantine은 아래 주석에서 해당 문제에 대한 해결책을 제공했습니다.
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
이것은 버퍼가 이미 파일을 방문하고 있는지 확인하는 테스트를 유용하게 추가하지만 , 전자 가 입력 될 때 수행 할 작업을 결정 하는 인수를 사용하므로 키 변경은 view-mode-enter
대신 대신 사용하는 것입니다 . 이 경우 종료 조치는 버퍼를 강제 종료하여 다음에 파일을 방문 할 때 파일이 다시 종료되도록합니다 .view-mode
EXIT-ACTION
qview-mode
편집 3 : 해당 경로를 따라 지정된 함수 EXIT-ACTION
가 궁극적으로 view-mode-exit
함수에 전달되고 docstring이 대체 솔루션을 제공 한다는 것을 알 수 있습니다 .
view-no-disable-on-exit is a variable defined in `view.el'.
Its value is nil
Documentation:
If non-nil, View mode "exit" commands don't actually disable View mode.
Instead, these commands just switch buffers or windows.
This is set in certain buffers by specialized features such as help commands
that use View mode automatically.
따라서 다음을 사용할 수 있습니다.
((nil . ((eval . (when buffer-file-name
(setq-local view-no-disable-on-exit t)
(view-mode-enter))))))
파일을 작성하는 대신 init 파일에 완전히 지정할 수있는 대체 방법을 .dir-locals.el
사용하고 파일을 사용하지 않고 읽기 전용으로 만듭니다 view-mode
. 내 구성은 다음과 같습니다.
;; Emacs
(dir-locals-set-class-variables
'emacs
'((nil . ((buffer-read-only . t)
(show-trailing-whitespace . nil)
(tab-width . 8)
(eval . (whitespace-mode -1))))))
(dir-locals-set-directory-class "/usr/local/src/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/local/share/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/share/emacs" 'emacs)
분명히 elpa 디렉토리와 타사 소스 코드가 포함 된 다른 디렉토리에 대해 동일한 작업을 수행 할 수 있습니다.
.dir-locals.el
나 자신을 알고 사용 한다 ...)
find-file-hook
와 read-only-dirs
목록을 기반으로 같은 줄을 따라 왔지만이 접근법을 좋아합니다.
((nil . ((eval . (view-mode 1)))))
만들 수있는 간단한 방법은 무엇인가 View-quit
도움을 통해 액세스 할 수있는 버퍼를 죽일 수는? 그렇지 않으면을 눌러 소스보기를 종료 한 후 q
버퍼가 유지되고 나중에 도움말에서 동일한 파일에서 소스에 액세스 할 때 다시보기 모드가 시작되지 않습니다.
view-mode
.
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
( (view-mode-enter ...)
대신에 note (view-mode 1)
). 누르면 이런 식으로 q
버퍼를 죽이고 view-mode
있다 내가 같은 파일을 방문 할 때 할 수 있었다.
이것은 특정한 경우를 다루지는 않지만 view-mode
도움말 버퍼에서 소스 파일을 방문 할 때마다 전환하는보다 일반적인 경우입니다 . 나는 주석으로 읽을 수 없기 때문에 @Constantine의 답변에 대한 대안으로 제공하고 있습니다.
나는 원래 EmacsWiki 에서 이것을 얻은 것 같습니다 .
(defadvice find-function-search-for-symbol (after view-function-source last (symbol type library) activate)
"When visiting function source via Help, switch to view-mode"
(with-current-buffer (car ad-return-value)
(view-mode 1)))
(defadvice find-variable-noselect (after view-var-source last (variable &optional file) activate)
"When visiting variable source via Help, switch to view-mode"
(with-current-buffer (car ad-return-value)
(view-mode 1)))
다음은 내장 문서에 적합한 솔루션과 ELPA로 확장하는 방법을 보여주는 예입니다. 현재 파일의 경로를 일부 정규 표현식과 read-only-mode
일치시키고 일치하는 경우 적용하여 작동합니다.
dired
도움말뿐 아니라 방문해도 버퍼는 읽기 전용 입니다.
입력 후 실행되는 후크를 추가 emacs-lisp-mode
하여 파일 경로가 일치하는지 확인 /\.el\.gz$/
하고 일치하는 경우 읽기 전용 모드를 적용합니다.
(defun readonly-if-el-gz ()
(cond
((string-match "\\.el\\.gz\\'" (or (buffer-file-name) ""))
(read-only-mode +1))))
(add-hook 'emacs-lisp-mode-hook 'readonly-if-el-gz)
다음 .emacs.d/elpa
은 포함하는 경로 가 실제로 ELPA 코드 라는 휴리스틱을 사용하여 ELPA도 검사하는 예입니다 .
(defun readonly-if-internal ()
(let
((name (or (buffer-file-name) "")))
(cond
((string-match "\\.el\\.gz\\'" name) (read-only-mode +1))
((string-match "\\.emacs\\.d/elpa" name) (read-only-mode +1)))))
(add-hook 'emacs-lisp-mode-hook 'readonly-if-internal)
emacs-lisp-mode
에만 수행C-x C-q
합니다.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)