Jadi saya bertanya pertanyaan ini tentang cara pintas direktori di shell. Idenya adalah saya ingin dapat membuka file /home/Documents/foo
, katakanlah, dengan mengetik C-x C-f ~foo/file
.
Jadi, apakah ada cara untuk meniru "direktori bernama" zsh di buffer emacs?
Secara kebetulan, definisi pintasan yang ingin saya gunakan sudah ada di .zshrc saya, jika ada solusi yang membacanya secara langsung, yang mendapat poin bonus.
Jawaban:
Komponen Emacs yang bertanggung jawab untuk memperluas
~
nama file adalahexpand-file-name
. Sayangnya, itu ditulis dalam C, dan jauh di dalam perutnya adalah kode yang mengasumsikan bahwa apa yang muncul setelah itu~
adalah nama pengguna. Untungnya, Emacs memiliki cara umum untuk menambahkan pembungkus di sekitar fungsi, sehingga Anda dapat melakukan apa yang Anda inginkan jika Anda tidak keberatan mengulangi beberapa logika dalam fungsi bawaan.Berikut adalah beberapa kode yang sama sekali belum diuji yang harus Anda jalani. Cari “Advising Emacs Lisp Functions” di manual Emacs Lisp untuk informasi lebih lanjut; ide dasarnya adalah
defadvice
menambahkan beberapa kode untuk dijalankan sebelum kode aktualexpand-file-name
. Mohon beri tanda kesalahan yang telah saya buat dalam komentar (apakah Anda tahu cara memperbaikinya atau tidak).Saya akan membiarkan parsing pintasan
.zshrc
untuk diisiexpand-file-name-custom-tilde-alist
(atau teknik apa pun yang Anda pilih untuk menjaga alias tetap selaras) sebagai latihan.sumber
(defun my/add-to-tilde-alist (hash) (let* ((tilde:dir (split-string hash "=")) (tilde (car tilde:dir)) (dir (cadr tilde:dir))) (push (cons tilde dir) expand-file-name-custom-tilde-alist))) (mapc #'my/add-to-tilde-alist (split-string (with-output-to-string (call-process "zsh" nil standard-output nil "-ic" "hash -d")) "\n" t))
Cukup gunakan
$foo
sebagai ganti~foo
di minibuffer. Emacs akan memperlakukanfoo
sebagai nama variabel lingkungan dan menggunakan nilainya.sumber