Geçerli dosyanın tam yolunu mini arabellekte gösterme işlevi


98

Emacs ile düzenlediğim dosyanın tam yolunu almam gerekiyor.

  • Bunun bir işlevi var mı?
  • Değilse, bunu elde etmek için elisp işlevi nedir?
  • Sonucu (yol adı) yeniden kullanabilmek için bir panoya nasıl kopyalayabilirim?

Mac OS X ve Aqumacs kullanıyorum.

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

KATMA

(defun show-file-name ()
  "Mini arabellekte tam yol dosya adını gösterin."
  (etkileşimli)
  (mesaj (tampon-dosya-adı))
  (kill-new (dosya-gerçek-adı tampon-dosya-adı))
)
(genel-küme-anahtarı "\ C-cz" 'dosya-adını göster)

Aldığım iki yanıtı birleştirerek istediğimi elde edebilirim. Cevaplar için teşekkürler. Ve biraz daha soru.

  • (Dosya-adı) ne için?
  • Yol adını diğer uygulamalarla birlikte kullanabilmek için öldürme halkasına değil, Sistemin (OS) panosuna kopyalayabilir miyim?

Yanıtlar:


93

buffer-file-nameSize dosyanızın tam yolunu veren yerleşik işlevdir .

Yapılacak en iyi şey, emacs pencerenizin her zaman sistem adınızı ve şu anda düzenlemekte olduğunuz arabelleğin tam yolunu göstermesini sağlamaktır:

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

Bunun gibi bir şey de yapabilirsiniz:

(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

8
Emacs 24'te buffer-file-namebir değişken
barracel

6
... ama aynı zamanda bir işlev
phils

18
Bu bir işlevse, neden görünmüyor M-x?
asmeurer

9
asmeurer - etkileşimli olmadığı için
Ben Fitzgerald

2
@Talespin_Kit Evet, kesinlikle. Elisp, "lisp-1" yerine "lisp-2" dir, yani iki bağımsız isim boşluğu vardır (değişkenler ve fonksiyonlar). Bu nedenle her sembol bir "işlev yuvasına" ve bir "değer yuvasına" sahiptir ve hangi yuvaya erişildiği bağlama bağlıdır. Pratikte birçok örnek vardır (örneğin, herhangi bir küçük mod adı hem bir işlev hem de bir değişken olacaktır). Bu aynı zamanda funcall, bir değişkenin değeri olarak saklanan bir işlevi çağırmak için benzerlerini kullanmanız gerekmesinin nedenidir foo, çünkü eğer (foo)kullanırsanız foo, değer yuvası yerine işlev yuvasını kullanırsınız .
phils

74

Jérôme Radix'in cevabından ödünç almak için, sadece mevcut tamponun dosya yolunu hızlıca görmek istiyorsanız, yapabilirsiniz M-: buffer-file-name.

Alternatif olarak, (buffer-file-name)arabelleği bir yere yazın ve C-x C-ekapanış parantezini çalıştırın (bu sadece lisp modunda değil, herhangi bir modda çalışacaktır).


3
Teşekkürler, buffer-file-namebunun bir işlev olduğunu düşündüm , ancak görünmüyor M-x, ancak göründüğü M-:gibi emacs eval, cevabınız sayesinde orada komutu çalıştırabilirim :)
PeterZD

6
Evet, M-xyalnızca etkileşimli işlevleri M-:çalıştırırken, herhangi bir elisp işlevini çalıştırır.
asmeurer

41

Benim hünerim, C-x C-fbir dosyayı açmayı beğenmek, C-gçıkmak için mini düğmeyi mevcut dosya yolu ile önceden dolduracaktır . M-: buffer-file-nameDiğer yöntemlerden daha hızlı ama çok daha çirkin.


Bunu ben de yapıyorum. Sert emacs-y kadar değil ama tek umursadığım mevcut dosyanın yolu ise, işe yarıyor.
andrunix

Bir dosyayı açarsanız, örneğin A ve sonra başka bir dosyaya atlarsanız, örneğin, bir eklentinin tanım işlevine atlama kullanarak, bu yöntem B'nin değil, A'nın yolunu gösterir! Dolayısıyla, bu yanıt her zaman OP'nin istediğini sunmaz.
Abhishek Anand

5
Cx Cv size sadece mevcut yolu değil, mevcut dosyanın adını da
gösterecek

@ kuzzooroo, ido modu olmayan kullanıcılar için doğru (Bu isim, ido modunu kullanırken Cx Cf'de görüntülenir).
Julien Palard

16

İstediğiniz şeyin doğrudan uygulanması:

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

Bununla birlikte, mini arabellekte olanın tam yolunu alabilmeyi inanılmaz derecede yararlı buluyorum ve kullandığım şey bu:

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

Ve sonra panoda istersem, satırı ( C-a C-k) öldürürüm . Ancak yukarıdaki komutta gerçek adı panoya kolayca kopyalayabiliriz, sadece son satırı şu şekilde değiştirin:

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

Yeni kısım, 'kill-newipi öldürme halkasına yerleştiren çağrıdır .


Bu ayarları nasıl kullanacağınızı açıklar mısınız? Ve "\ Cr" ne anlama geliyor?
modeller

Boşver. Bunu anladım. Sanırım ido modundayken ve bir dosyaya işaret ettiğimde, o dosyanın tam yolunu almak için sadece Cr tuşuna basarım. Gerçekten yararlı. Yine de neden C yerine \ C kullanıldığını bilmiyorum
modeller

11

Ekstra işleve gerek yok, sadece

M-! pwd

Bu işe yarayabilirken, Windows sistemlerinde çalışmaz ve emacs'in mevcut çalışma dizininin mevcut arabellek dosyasının dizininden farklı olabileceği gerçeğini hesaba katamaz. Bir dosyayı ziyaret ederek C-x C-f, çalıştırarak M-! pwd, ardından M-x cdfarklı bir dizin seçerek ve ardından M-! pwdtekrar çalıştırarak bunu kendiniz görebilirsiniz .
josaphatv

3

Aşağıdaki kodu zaten uzun süredir kullanıyorum. Mod satırındaki arabellek adının ortasındaki fare düğmesine bastığımda tam dosya yolunu öldürme halkasına kopyalıyor. Mod satırında arabellek adı üzerinde shift-mouse-2 tuşuna bastığımda sadece arabellek adını kill-ring'e kopyalıyor.

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

3

C-x C-d, ayrıca çağrılabilir M-x list-directory, size mevcut dosyanızın dizinini gösterir ve mini arabelleği temizlemek için yalnızca "Enter" tuşuna basmanız gerekir. Ek ayrıntılar burada mevcuttur .


en sevdiğim cevap, basit, hızlı ve kolay!
ticktock

2

C-x C-b arabelleklerin bir listesini ve uygulanabilir olduğunda her arabellek için dosya yolunu gösterir.


2

C-u C-x C-b şu anda ziyaret edilen dosyaları listeler.


1

Yol adını diğer uygulamalarla birlikte kullanabilmek için öldürme halkasına değil, Sistemin (OS) panosuna kopyalayabilir miyim?

Xclip (Linux), pbcopy (Mac), putclip (Cygwin) gibi bir şeye kabuk verirseniz yapabilirsiniz.

Kişisel olarak sarıcı komut dosyalarını kullanıyorum cve psırasıyla kopyala ve yapıştır için, standart girdiden ilk okuma, ikincisi standart çıktıya yazma. Bu şekilde, bu tüm geliştirme platformlarımda çalışır:

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

Bunu Emacs pano desteğini kullanmaktan daha güvenilir ve yapılandırılabilir buluyorum. Örneğin, ckomutum girişi Linux'taki 3 panoya (birincil, ikincil, pano) kopyalar, böylece Ctrl-V veya orta tıklama ile yapıştırabilirim.


Bu işe yaramalı ama benim için değil. (Ubuntu 14.04.1.) Yani, date | xclipve xclip filekabuk olarak yazılmış olarak duyurulan her iki çalışma (tarihi veya birincil dosyasının içeriğini saklama). Ama bu komutlardan birini M-! 'Den sonra yazarsam! emacs'de (ve return tuşuna basıldığında) hiçbir şey olmaz; imleç, daha fazla girdi bekliyormuş gibi mini arabellekte kalır; ve kontrolü tekrar ele almak için araya girersem, birincilde hiçbir şey saklanmadı.
Silvio Levy

Tamam, fikriniz xclip yerine xsel ile iyi çalışıyor: (shell-command (format "echo '%s' | xsel -i" buffer-file-name))- ve etkileşimli bir komuta dönüştürüldüğünde (yukarıdaki @JeromeRadix tarafından en çok oylanan yanıtta önerildiği gibi), bu BÜYÜK BİR KAZANÇ! Teşekkürler!
Silvio Levy

0

En basit yol ve olurdu

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

Trey Jackson'dan ödünç alarak şunu buldum:

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

Sitede daha fazla bilgi bulabilirsiniz


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.