Masukkan nama file saat ini di minibuffer

12

Bagaimana saya bisa memasukkan nama file buffer file yang aktif ke dalam perintah?

Ketika saya menjalankan perintah yang membutuhkan nama file, saya sering melakukannya dari buffer file dan ingin nama file itu saat mengetik perintah ke minibuffer.

Saya mencari hipotesis C-xyang bisa saya ketik saat membentuk baris perintah di minibuffer.

Jadi jika buffer sementara adalah file bernama Lorem Ipsum.txt, saya ketik ini:

M-x grep RET 'foo' SPC C-x … RET

yang M-xgrepRETmenyajikan minibuffer bisikan untuk grepperintah. Sebagai tanggapan, saya telah mengetik argumen pola regex ( 'foo') dan memasukkan argumen nama file ( C-x). Minibuffer itu akan berakhir sebagai:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

Perintah apa yang ada mendapatkan nama file buffer file saat ini seperti ini? Apa yang mengikat kunci standarnya?

hidung besar
sumber
3
Saya terkejut tidak ada yang disebutkan M-n. Itu tidak bekerja di mana-mana, tetapi bekerja di banyak tempat. Juga, karena Anda mengerti, Anda mungkin menyukai lgrep dan rgrep, yang sedikit lebih interaktif, saya pikir.
Malabarba

Jawaban:

18

Perintah apa yang ada mendapatkan nama file buffer file saat ini seperti ini?

Sayangnya tidak ada perintah siap pakai untuk ini, tetapi kita dapat membuatnya sebagai berikut:

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Keajaibannya ada di fungsi minibuffer-selected-window ; itu melakukan hal yang benar dengan memilih buffer terakhir sebelum minibuffer diaktifkan. Kalau tidak hanya menggunakan nama file buffer tidak akan membawa kita nama file ke minibuffer. Menariknya, fungsi yang sama dapat digunakan dalam buffer biasa atau minibuffer untuk memasukkan nama file. Tidak diperlukan perawatan khusus.

Apa yang mengikat kunci standarnya?

Tidak ada, tetapi Anda dapat memilih yang mudah dan menetapkannya sebagai berikut:

(global-set-key (kbd "C-c f") 'name-of-the-file)

Masukkan baris kode lisp di atas dalam file init.el Anda.

Ini berfungsi dalam sebagian besar kasus sepele, tetapi sulit untuk memprediksi konflik apa yang mungkin terjadi dengan mode apa pun yang Anda aktif saat menjalankan fungsi ini.

Bagaimana jika buffer tidak mengunjungi nama file yang valid, seperti buffer awal? Kemudian kesalahan ini ditampilkan di area gema:

name-of-the-file: Wrong type argument: char-or-string-p, nil

Memilih buffer yang valid dengan nama file yang tepat sebelum memohon pintasan akan menghindari kesalahan tersebut.

Ada beberapa solusi lain seperti di atas, tetapi mereka terutama berbeda dalam cara mereka menangani pengecualian atau penggantian untuk setiap konflik. Sebagai contoh, beberapa menggunakan kait mode untuk membuat fungsi ini hanya tersedia dalam mode tertentu.

Pengguna Emacs
sumber
Agar ini berfungsi, saya pikir kita harus enable-recursive-minibuffers.
Dieter.Wilhelm
Jika perintah hanya seharusnya digunakan dalam minibuffer, maka pengikatan berikut ini dapat digunakan sebagai ganti (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function nama-of-the-buffer` yang saya gunakan untuk C-c bmemasukkan nama buffer saat ini.
Dov Grobgeld
2

Saat menggunakan dired-xpintasan keyboard C-x C-jterikat dired-jump. Jadi dari buffer file Anda, Anda berakhir di baris dired kanan dan dapat menyalin nama file dengan w. Dan kemudian Anda dapat menempelkannya di buffer mini.

Kemungkinan lain untuk mengisyaratkan pengetikan nama file adalah penyelesaian file buffer mini standar Emacs. Cukup ketikkan karakter pertama dari nama file Anda dan kemudian TAB.

Dieter.Wilhelm
sumber
1
Anda dapat menyalin nama file pada baris Dired saat ini hanya dengan menggunakan w(perintah dired-copy-filename-as-kill).
Drew
-1

Pertanyaannya meminta perintah Emacs yang ada untuk melakukan ini.

Seperti yang dinyatakan sebelumnya:

Sayangnya tidak ada perintah siap pakai untuk ini

yang ternyata menjadi jawaban untuk pertanyaan ini.

hidung besar
sumber
Ada cara untuk meringankan kasus penggunaan Anda dan yang lain menyarankan solusi pengkodean yang dipesan lebih dahulu, jadi saya pikir pernyataan Anda tidak benar. Anda tidak meminta secara khusus cara Emacs out-of-the-box !
Dieter.Wilhelm
Saya bertanya secara khusus untuk perintah yang ada untuk tujuan itu, jadi ya jawaban ini benar.
bignose