ฉันต้องการดูตำแหน่งของไดเรกทอรีหลักของไฟล์ปัจจุบันโดยไม่ขึ้นกับชื่อบัฟเฟอร์ปัจจุบัน
ฉันต้องการดูตำแหน่งของไดเรกทอรีหลักของไฟล์ปัจจุบันโดยไม่ขึ้นกับชื่อบัฟเฟอร์ปัจจุบัน
คำตอบ:
คุณสามารถกำหนดค่ารูปแบบบรรทัดโหมดตามที่คุณต้องการ หากคุณต้องการที่จะแสดงร่วมกันไดเรกทอรีแม่ที่มีชื่อบัฟเฟอร์ (ซึ่งมักจะเป็นชื่อไฟล์สำหรับบัฟเฟอร์ที่เข้ามาเยี่ยมชมไฟล์) แก้ไข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)
ฉันถือว่าคุณหมายความว่าคุณต้องการดูไดเรกทอรีแทนที่จะเป็นชื่อบัฟเฟอร์
(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
ทำ)
คุณติดตั้งการใช้งาน สมาร์ทโหมดเส้น มันถูกกำหนดค่าให้แสดงเส้นทางของไฟล์ในโหมดบรรทัดเมื่อใดก็ตามที่เกี่ยวข้อง
(sml/setup)
เพียงแค่ติดตั้งแล้วเปิดด้วย
นอกจากนี้ยังมีคุณสมบัติมากมายที่จะทำให้การแสดงนั้นกระชับยิ่งขึ้น ตัวอย่างเช่น“ ~ / .emacs.d /”ถูกแทนที่ด้วย“: ED:” (และคุณสามารถกำหนดค่าการเปลี่ยนเพิ่มเติมได้)