الوظيفة لإظهار المسار الكامل للملف الحالي في المخزن المؤقت المصغر

StackOverflow https://stackoverflow.com/questions/3669511

سؤال

أحتاج إلى الحصول على المسار الكامل للملف الذي أقوم بتحريره مع emacs.

  • هل هناك وظيفة لذلك؟
  • إذا لم يكن الأمر كذلك ، فما هي وظيفة ELISP للحصول على ذلك؟
  • كيف يمكنني نسخ النتيجة (اسم المسار) إلى حافظة حتى أتمكن من إعادة استخدامها؟

أنا أستخدم Mac OS X و Aqumacs.

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???

وأضاف

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name))
  (kill-new (file-truename buffer-file-name))
)
(global-set-key "\C-cz" 'show-file-name)

الجمع بين الإجابات اللتين حصلت عليهما ، يمكنني الحصول على ما أريد. شكرا على الإجابات. وبعض الأسئلة الأخرى.

  • ما هو ل (TRUENAME)؟
  • هل يمكنني نسخ اسم المسار إلى الحافظة على النظام (OS) ، وليس حلقة القتل حتى أتمكن من استخدام المعلومات مع التطبيقات الأخرى؟
هل كانت مفيدة؟

المحلول

إنها الوظيفة المدمجة buffer-file-name هذا يمنحك المسار الكامل لملفك.

أفضل ما عليك فعله هو أن تُظهر نافذة emacs الخاصة بك دائمًا اسم النظام الخاص بك والمسار الكامل للمخزن المؤقت الذي تقوم بتحريره حاليًا:

(setq frame-title-format
      (list (format "%s %%S: %%j " (system-name))
        '(buffer-file-name "%f" (dired-directory dired-directory "%b"))))

يمكنك أيضًا فعل شيء مثل هذا:

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))

(global-set-key [C-f1] 'show-file-name) ; Or any other key you want

نصائح أخرى

للاقتراض من إجابة Jérôme Radix ، إذا كنت تريد فقط رؤية مسار الملف للمخزن المؤقت الحالي ، يمكنك القيام بذلك بسرعة M-: buffer-file-name.

حيلتي هي القيام C-x C-f مثل فتح ملف ، فإنه يسبق الحافز مع مسار الملف الحالي ، C-g ليستقيل. اسرع من M-: buffer-file-name لكن أقصى بكثير من أي طرق أخرى.

التنفيذ المباشر لما تريده هو:

(defun copy-full-path-to-kill-ring ()
  "copy buffer's full path to kill ring"
  (interactive)
  (when buffer-file-name
    (kill-new (file-truename buffer-file-name))))

ومع ذلك ، أجد أنه من المفيد بشكل لا يصدق أن أتمكن من الحصول على المسار الكامل لما هو موجود في الحافلة الصغيرة ، وهذا ما أستخدمه:

(define-key minibuffer-local-completion-map "\C-r" 'resolve-sym-link)
(defun resolve-sym-link ()
  "Try to resolve symbolic links into true paths."
  (interactive)
  (beginning-of-line)
  (let* ((file (buffer-substring (point)
                                 (save-excursion (end-of-line) (point))))
         (file-dir (file-name-directory file))
         (file-true-dir (file-truename file-dir))
         (file-name (file-name-nondirectory file)))
    (delete-region (point) (save-excursion (end-of-line) (point)))
    (insert (concat file-true-dir file-name))))

ثم إذا أردت ذلك في الحافظة ، فأنا فقط أقتل الخط (كاليفورنيا CK). لكن يمكننا بسهولة نسخ اسم truename إلى الحافظة في الأمر أعلاه ، ما عليك سوى تغيير السطر الأخير ليكون:

(insert (kill-new (concat file-true-dir file-name)))))

الجزء الجديد هو الدعوة إلى 'kill-new مما يضع السلسلة في حلقة القتل.

لا حاجة لوظيفة إضافية ، فقط

M-! pwd

لدي الرمز التالي المستخدم بالفعل لفترة طويلة. يقوم بنسخ مسار الملف الكامل إلى حلقة القتل عندما أضغط على زر الماوس الأوسط على اسم المخزن المؤقت في خط الوضع. ينسخ اسم العازلة فقط إلى حلقة القتل عندما أضغط على Shift-Mouse-2 على اسم العازلة في خط الوضع.

(defun copy-buffer-file-name (event &optional bufName)
  "Copy buffer file name to kill ring.
If no file is associated with buffer just get buffer name.
"
  (interactive "eP")
  (save-selected-window
    (message "bufName: %S" bufName)
    (select-window (posn-window (event-start event)))
    (let ((name (or (unless bufName (buffer-file-name)) (buffer-name))))
      (message "Saved file name \"%s\" in killring." name)
      (kill-new name)
      name)))

(define-key mode-line-buffer-identification-keymap [mode-line mouse-2] 'copy-buffer-file-name)
(define-key mode-line-buffer-identification-keymap [mode-line S-mouse-2] '(lambda (e) (interactive "e") (copy-buffer-file-name e 't)))

C-x C-d, ، أيضا يمكن الاتصال بها عبر M-x list-directory, ، سوف تظهر لك الدليل لملفك الحالي ، وتحتاج فقط إلى ضرب مفتاح "Enter" لمسح المصغر. تفاصيل إضافية متوفرة هنا.

هل يمكنني نسخ اسم المسار إلى الحافظة على النظام (OS) ، وليس حلقة القتل حتى أتمكن من استخدام المعلومات مع التطبيقات الأخرى؟

يمكنك أن تصرف إلى شيء مثل Xclip (Linux) ، Pbcopy (Mac) ، putClip (cygwin).

أنا شخصيا استخدام البرامج النصية الغلاف c و p للنسخ واللصق على التوالي ، القراءة الأولى من الإدخال القياسي ، الكتابة الأخيرة إلى الإخراج القياسي. بهذه الطريقة ، يعمل هذا على جميع منصات التطوير الخاصة بي:

(shell-command (format "echo '%s' | c" buffer-file-name))

أجد هذا أكثر موثوقية وقابلة للتكوين من استخدام دعم حافظة EMACS. على سبيل المثال ، بلدي c يقوم الأوامر بنسخ الإدخال إلى جميع الألواح الثلاثة على Linux (الأساسي ، الثانوي ، الحافظة) ، حتى أتمكن من لصقها إما مع Ctrl-V أو النقر الوسطى.

C-x C-b يعرض قائمة بالمخازن المؤقتة ومسار الملف لكل مخزن مؤقت عند الاقتضاء.

C-u C-x C-b يسرد المخازن المؤقتة حاليا زيارة الملفات.

أبسط طريقة وستكون

(buffer-name)<(C-x)(C-e)> for the file name to appear in the echo area

(buffer-name)<(C-u)(C-x)(C-e)> would print the location <here>

استعارة من تري جاكسون ، توصلت إلى هذا:

(defun buffer-kill-path ()
  "copy buffer's full path to kill ring"
  (interactive)
  (kill-new (buffer-file-name)))

يمكنك العثور على مزيد من المعلومات حول موقع

copy-buffer-file-name-as-kill من [0] يفعل بالضبط ما تحتاجه على ما أعتقد. كما أن لديه خيار نسخ اسم الدليل فقط ، أو مجرد اسم الملف.

[0] http://www.emacswiki.org/emacs/download/buffer-extension.el

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top