답변:
원하는대로 모드 라인 형식 을 구성 할 수 있습니다 . 상위 디렉토리를 버퍼 이름 (일반적으로 파일을 방문하는 버퍼의 파일 이름)과 함께 표시하려면 수정 mode-line-buffer-identification
; 그렇지 않으면에 항목을 추가하십시오 mode-line-format
. "현재 파일의 상위 디렉토리" 에 대한 내장 구성 이 없으므로 예를 들어로 직접 빌드 해야합니다 :eval
. 다음은 버퍼 이름 뒤에 디렉토리 이름을 추가하고 파일을 방문하지 않는 버퍼 (Dired 포함)에서 아무것도 수행하지 않는 예입니다. 서식을 지정하여 다듬을 수 있습니다.
(defun mode-line-buffer-file-parent-directory ()
(when buffer-file-name
(concat "[" (file-name-nondirectory (directory-file-name (file-name-directory buffer-file-name))) "]")))
(setq-default mode-line-buffer-identification
(cons (car mode-line-buffer-identification) '((:eval (mode-line-buffer-file-parent-directory)))))
또 다른 방법은에 원하는 텍스트를 포함하는 변수를 설정하는 것입니다 find-file-hooks
. 또한 :propertize
구문을 사용하여 속성을 설정하는 방법을 보여줍니다 .
(defvar buffer-file-parent-directory nil
"Parent directory of the current directory.
This variable is nil if the current buffer isn't visiting a file.")
(make-variable-buffer-local 'buffer-file-parent-directory)
(put 'buffer-file-parent-directory 'permanent-local t)
(defconst mode-line-buffer-file-parent-directory
'(:propertize (list buffer-file-parent-directory "/") face mode-line-buffer-id))
(defun set-buffer-file-parent-directory ()
(when buffer-file-name
(setq buffer-file-parent-directory
(file-name-as-directory (file-name-nondirectory (directory-file-name (file-name-directory buffer-file-name)))))))
(add-hook 'find-file-hook 'set-buffer-file-parent-directory)
(let ((list mode-line-format))
(while (not (eq (car list) 'mode-line-buffer-identification))
(setq list (cdr list)))
(setcdr list (cons (car list) (cdr list)))
(setcar list 'mode-line-buffer-file-parent-directory))
다른 디렉토리에 동일한 이름을 가진 여러 개의 파일이있는 경우에 대비하여 디렉토리 이름을 갖고 자한다면, Emacs는 uniquify library 와 함께 내장되어 있습니다 . 같은 이름을 가진 여러 개의 버퍼가 될 때,이 라이브러리처럼 보이게 버퍼 이름 원인 file.ext<foo>
과 file.ext<bar>
대신 file.ext
과 file.ext<2>
. 을 사용자 정의하여 형식을 미세 조정할 수 있습니다 uniquify-buffer-name-style
.
(require 'uniquify)
버퍼 이름 대신 디렉토리를보고 싶다고 가정합니다 .
(setq-default mode-line-buffer-identification
'(:eval default-directory))
또는 ~/
루트에서 절대 파일 이름 대신 홈 디렉토리를 약어로 사용하려면 다음을 수행하십시오.
(setq-default mode-line-buffer-identification
'(:eval (abbreviate-file-name default-directory)))
또는 단일 디렉토리 구성 요소 이름으로 상위 디렉토리 이름 만 원하는 경우 다음을 수행하십시오.
(setq-default mode-line-buffer-identification
'(:eval (file-name-nondirectory
(directory-file-name default-directory))))
또는 @Malabarba가 가정하는 것처럼 버퍼 이름도 유지하려면 다음을 수행하십시오.
(setq-default mode-line-buffer-identification
(let ((orig (car mode-line-buffer-identification)))
`(:eval (cons (concat ,orig (abbreviate-file-name default-directory))
(cdr mode-line-buffer-identification)))))
요점은의 값 default-directory
(원하는 경우 절대 이름에서 단순화 될 수 있음) 을 사용해야한다는 것 입니다 mode-line-buffer-identification
. 해당 변수를 디렉토리 이름으로 만 설정하거나 버퍼 이름을 유지하는 값으로 설정할 수 있습니다.
원하는 것이 모두 원하는 경우을 포함하도록 모드 행을 구성하는 것이 간단 default-directory
하지만 원하는대로 표시합니다. 이를 위해 여러 라이브러리를로드 할 필요가 없습니다 (그렇습니다 smart-mode-line
).
use smart-mode-line을 설치합니다 . 관련이있을 때마다 모드 행에 파일 경로를 표시하도록 구성되어 있습니다.
설치 한 다음로 켜십시오 (sml/setup)
.
또한 더 간결하게 표시 할 수있는 많은 기능이 있습니다. 예를 들어 "~ / .emacs.d /" 는 ": ED :" 로 바뀌며 추가 교체를 구성 할 수 있습니다.