Bagaimana cara mendapatkan nama file buffer saat ini di emacs?

19

Salah satu fitur utama yang saya lewatkan tentang Vim, adalah selalu menyimpan nama file file saat ini di %buffer ( info lebih lanjut ). Itu memungkinkan meluncurkan perintah dengan mudah seperti:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Saya ingin memiliki fungsi serupa di bawah emacs(versi 24, jika itu membuat perbedaan), yaitu memiliki cara mudah untuk memasukkan nama file yang dibuka di buffer saat ini.

Contoh apa yang ingin saya lakukan

Di sini saya menjelaskan beberapa kasus penggunaan dasar untuk menjelaskan lebih baik ketika saya merasa perlu untuk jalan pintas seperti itu

  1. Kompilasi: Ketika saya memasukkan M-x compileemacs meminta saya untuk mengkompilasi perintah. Saya ingin masuk gcc (current-buffer)dengan mudah.

  2. Load-file: Ketika saya mengedit file .emacs saya, saya ingin memuatnya segera untuk menguji perubahan. Cara saya melakukannya adalah M-x load-filedan kemudian saya selalu mengeja namanya . e m a c s. Saya mau jalan pintas.

  3. Luncurkan proses luar: Saya berikan du -shsebagai contoh, hanya untuk menggambarkan bahwa saya ingin pintasan juga tersedia ketika saya menjalankan perintah shell denganM-!

Apa yang saya temukan sejauh ini

  • Pertanyaan ini di sini di U&L. Jawaban yang diberikan pada dasarnya menunjukkan di mana menemukan nama file buffer sehingga orang dapat menambahkannya ke cincin bunuh. Ini bukan yang saya cari, saya tidak ingin harus secara manual mematikan nama file sebelum saya ingin menggunakannya. (Juga solusi yang dijelaskan dalam kedua jawaban tampaknya tidak bekerja dengan lancar di emacs saya dan memerlukan penekanan tombol tambahan yang membuat mereka sedikit sakit).

EDIT : Sedikit tidak berhubungan, oleh saya menemukan mengapa solusi ini tidak berhasil. Saya mengaktifkan IDO, baik atau buruk.

  • The (current-buffer)fungsi yang dijelaskan dalam manual tidak mengembalikan nama file dalam buffer saat ini, tapi tak dalam contoh saya berikan di atas, saya mengevaluasi kode elisp. Apakah ada cara untuk memasukkan hasil evaluasi fungsi ini dalam buffer (mini) dan mengikat cara ini ke jalan pintas?

Apakah saya salah berpikir seperti ini?

Saat ini saya sedang belajar menggunakan emacs (sebenarnya sudah beberapa bulan) setelah bertahun-tahun menggunakan Vim. Saya ingin menghindari jebakan menggunakan emacs-in-a-Vim-way . Jika Anda merasa bahwa apa yang saya minta tidak terlalu emacs-y , dan harus ada cara (bersih?) Yang lebih baik untuk melakukannya, harap sebutkan dalam jawaban Anda.

rahmu
sumber
Tentang nama file, di .emacs, masukkan (global-set-key (kbd "C-i") buffer-file-name)jika Anda ingin menjadi Ctrl + I. Tentang .emacs, M-x load-file RETlakukan yang Anda inginkan; Anda tidak perlu menulis apa pun.
Emanuel Berg
2
Alur kerja ini tidak cocok dengan Emacs dengan sangat baik, karena semua petunjuk di bagian bawah jendela berada dalam buffer di Emacs (disebut minibuffer). Jadi jika Anda menjalankan (buffer-file-name)saat Anda mengetik di minibuffer, Anda dapatkan nil, karena (current-buffer)minibuffer. Anda dapat mengganti buffer saat berada di minibuffer, jadi sulit untuk melacak buffer mana yang Anda pikirkan tentang buffer saat ini pada saat buffer saat ini, seperti yang Emacs lihat, adalah minibuffer.
Gilles 'SO- stop being evil'

Jawaban:

11

Anda bisa memasukkan fungsi seperti berikut ke dalam .emacs Anda dan mengikatnya ke tombol apa saja yang Anda suka.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Lihat juga pertanyaan ini , sepertinya mirip.

easyb
sumber
4

Varian sedikit pada jawaban @ easyb adalah menyalin path ke ring kill Anda alih-alih menempatkannya ke buffer Anda (berguna untuk file read only):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
pengguna338519
sumber