मैं मॉडलइन में वर्तमान फ़ाइल की मूल निर्देशिका कैसे प्रदर्शित कर सकता हूं?


11

मैं वर्तमान फ़ाइल के मूल नाम से मौजूदा फ़ाइल के मूल निर्देशिका को देखने में सक्षम होना चाहूंगा।


शायद विशिष्ट पुस्तकालय का उपयोग करना वांछित समाधान है (गिल्स का जवाब देखें)
एलेक्स_ १

जवाबों:


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

या यदि आप बफ़र नाम भी रखना चाहते हैं, जैसा कि @ मलबर्बा दबाता है, तो:

(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
उनके शब्दों के बावजूद, मुझे लगता है कि उनका मतलब "इसके बजाय" "नहीं" के अलावा था। बेशक, मैं गलत भी हो सकता हूं।
मालाबार

1
@ मालाबार: शायद। यदि हां, तो अंतर तुच्छ है - जोड़ा गया।
ड्रू

7

आप उपयोग स्मार्ट-मोड-लाइन स्थापित करें जब भी यह प्रासंगिक हो, मोड-लाइन में फ़ाइल पथ प्रदर्शित करने के लिए इसे कॉन्फ़िगर किया गया है।

डार्क थीम

बस इसे स्थापित करें, और फिर इसे चालू करें (sml/setup)

उस डिस्प्ले को अधिक संक्षिप्त बनाने के लिए इसमें बहुत सारी विशेषताएं हैं। उदाहरण के लिए, "~ / .emacs.d /" को ": ED:" (और आप आगे के प्रतिस्थापन कॉन्फ़िगर कर सकते हैं) से बदल दिया जाता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.