modeline에서 현재 파일의 상위 디렉토리를 표시하려면 어떻게해야합니까?


11

현재 버퍼 이름과 관계없이 현재 파일의 상위 디렉토리 위치를 볼 수 있기를 원합니다.


어쩌면 요구되는 솔루션을 uniquify 라이브러리를 사용하여 (질 응답 참조)
alex_1948511

답변:


12

원하는대로 모드 라인 형식 을 구성 할 수 있습니다 . 상위 디렉토리를 버퍼 이름 (일반적으로 파일을 방문하는 버퍼의 파일 이름)과 함께 표시하려면 수정 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.extfile.ext<2>. 을 사용자 정의하여 형식을 미세 조정할 수 있습니다 uniquify-buffer-name-style.

(require 'uniquify)

9

버퍼 이름 대신 디렉토리를보고 싶다고 가정합니다 .

(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).


1
그의 말에도 불구하고, 그는 "대신"이 아니라 "추가"를 의미 한다고 생각 합니다. 물론, 나는 틀릴 수 있습니다.
Malabarba

1
@ 말라 바바 : 아마도. 그렇다면 차이점은 사소한 것입니다.
Drew

7

use smart-mode-line을 설치합니다 . 관련이있을 때마다 모드 행에 파일 경로를 표시하도록 구성되어 있습니다.

어두운 테마

설치 한 다음로 켜십시오 (sml/setup).

또한 더 간결하게 표시 할 수있는 많은 기능이 있습니다. 예를 들어 "~ / .emacs.d /"": ED :"바뀌며 추가 교체를 구성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.