Làm cách nào để hiển thị thư mục mẹ của tệp hiện tại trong modeline?


11

Tôi muốn có thể xem vị trí của thư mục mẹ của tệp hiện tại, độc lập với tên bộ đệm hiện tại.


Có lẽ sử dụng thư viện duy nhất là giải pháp mong muốn (xem câu trả lời của Gilles)
alex_1948511

Câu trả lời:


12

Bạn có thể định cấu hình định dạng dòng chế độ theo ý muốn. Nếu bạn muốn hiển thị thư mục mẹ cùng với tên bộ đệm (thường là tên tệp, đối với bộ đệm đang truy cập tệp), hãy sửa đổi mode-line-buffer-identification; nếu không, thêm một mục vào mode-line-format. Không có một built-in xây dựng cho “thư mục cha của tập tin hiện tại”, vì vậy bạn sẽ cần phải xây dựng cho mình rằng , ví dụ với :eval. Dưới đây là một ví dụ bổ sung tên thư mục sau tên bộ đệm và không có gì trong bộ đệm không truy cập tệp (bao gồm cả Dired); bạn có thể muốn tinh chỉnh nó với định dạng.

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

Một phương pháp khác là đặt một biến chứa văn bản bạn muốn find-file-hooks. Tôi cũng chỉ ra cách bạn có thể thiết lập các thuộc tính với :propertizecấu trúc.

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

Nếu điều bạn thực sự muốn là có tên thư mục trong trường hợp bạn có nhiều tệp có cùng tên trong các thư mục khác nhau, thì Emacs đã được tích hợp sẵn trong thư viện này . Khi có nhiều bộ đệm có cùng tên, thư viện này làm cho tên bộ đệm trông giống file.ext<foo>file.ext<bar>thay vì file.extfile.ext<2>. Bạn có thể tinh chỉnh định dạng bằng cách tùy chỉnh uniquify-buffer-name-style.

(require 'uniquify)

9

Tôi giả sử bạn có nghĩa là bạn muốn xem thư mục thay vì tên bộ đệm.

(setq-default mode-line-buffer-identification
              '(:eval default-directory))

Hoặc nếu bạn muốn thư mục chính của bạn viết tắt thành ~/(thay vì tên tệp tuyệt đối, từ thư mục gốc), thì:

(setq-default mode-line-buffer-identification
              '(:eval (abbreviate-file-name default-directory)))

Hoặc nếu bạn chỉ muốn tên thư mục mẹ, như một tên thành phần thư mục, thì:

(setq-default mode-line-buffer-identification
              '(:eval (file-name-nondirectory
                        (directory-file-name default-directory))))

Hoặc nếu bạn cũng muốn giữ tên bộ đệm, như @Malabarba giả sử, thì:

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

Vấn đề là bạn chỉ cần sử dụng giá trị của default-directory(có thể được đơn giản hóa từ một tên tuyệt đối, nếu bạn muốn) trong mode-line-buffer-identification. Bạn có thể đặt biến đó thành chỉ tên thư mục hoặc bạn có thể đặt biến đó thành một giá trị giữ tên đệm.

Nếu những gì bạn yêu cầu là tất cả những gì bạn muốn, thật đơn giản để định cấu hình dòng chế độ để bao gồm default-directory, tuy nhiên bạn muốn nó xuất hiện. Không cần phải tải nhiều thư viện cho việc này (đó là những gì smart-mode-line).


1
Mặc dù từ ngữ của anh ấy, tôi nghĩ rằng anh ấy có nghĩa là "ngoài" không "thay vì". Tất nhiên, tôi có thể sai.
Malabarba

1
@Malabarba: Có thể. Nếu vậy, sự khác biệt là tầm thường - được thêm vào.
vẽ

7

Bạn cài đặt sử dụng chế độ thông minh-line . Nó được cấu hình để hiển thị đường dẫn tệp trong dòng chế độ, bất cứ khi nào có liên quan.

chủ đề tối

Chỉ cần cài đặt nó, và sau đó bật nó lên (sml/setup).

Nó cũng có rất nhiều tính năng để làm cho màn hình đó ngắn gọn hơn. Ví dụ, “~ / .emacs.d /” được thay thế bằng “: ED:” (và bạn có thể cấu hình thay thế thêm).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.