ฉันจะแสดงพาเรนต์ไดเร็กทอรีของไฟล์ปัจจุบันใน modeline ได้อย่างไร?


11

ฉันต้องการดูตำแหน่งของไดเรกทอรีหลักของไฟล์ปัจจุบันโดยไม่ขึ้นกับชื่อบัฟเฟอร์ปัจจุบัน


บางทีการใช้ไลบรารีที่ไม่ซ้ำเป็นโซลูชันที่ต้องการ (ดูคำตอบของ Gilles)
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 มีสิ่งนี้มาพร้อมกับไลบรารี่ที่ไม่ซ้ำใคร เมื่อจะมีบัฟเฟอร์หลายที่มีชื่อเดียวกันห้องสมุดนี้ทำให้ชื่อบัฟเฟอร์ให้มีลักษณะเหมือนfile.ext<foo>และfile.ext<bar>แทนและfile.ext คุณสามารถปรับแต่งรูปแบบโดยการปรับแต่งfile.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 supposes แล้ว:

(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
@Malabarba: อาจจะ ถ้าเป็นเช่นนั้นความแตกต่างเล็กน้อย - เพิ่ม
ดึง

7

คุณติดตั้งการใช้งาน สมาร์ทโหมดเส้น มันถูกกำหนดค่าให้แสดงเส้นทางของไฟล์ในโหมดบรรทัดเมื่อใดก็ตามที่เกี่ยวข้อง

ชุดรูปแบบสีเข้ม

(sml/setup)เพียงแค่ติดตั้งแล้วเปิดด้วย

นอกจากนี้ยังมีคุณสมบัติมากมายที่จะทำให้การแสดงนั้นกระชับยิ่งขึ้น ตัวอย่างเช่น“ ~ / .emacs.d /”ถูกแทนที่ด้วย“: ED:” (และคุณสามารถกำหนดค่าการเปลี่ยนเพิ่มเติมได้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.