Ketika saya menelusuri Emacs help for functions via C-h f
, saya sering ingin mengintip implementasi Elisp / C. Saya ingin memasukkan view-mode
secara otomatis ketika saya mengakses kode sumber dengan cara ini untuk menghindari modifikasi yang tidak perlu. Apakah ada kaitan atau fungsi yang bisa saya sarankan untuk menyelesaikan ini?
10
emacs-lisp-mode
dan saya hanya melakukanC-x C-q
jika saya ingin mengedit kode sumber.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)
Jawaban:
Pembaruan (setelah tidur malam): Jawaban ini memiliki kelemahan besar: ini memungkinkan
view-mode
ketika menavigasi ke fungsi apa pun , bukan hanya sumber Emacs. Ini bisa diperbaiki, tetapi Anda lebih baik menggunakan jawaban oleh @phils .Dengan melakukan
C-h f describe-function RET
dan kemudian membaca kode sumberdescribe-function
saya menemukan bahwa itu menciptakan "tombol" dari jenis khusus untuk link ke definisi fungsi:help-function-def
.Berjalan
zrgrep
dengan string ini ("help-function-def
") mengarahkan saya kehelp-mode.el.gz
.Setelah semua penggalian ini, kita dapat mengganti jenis tombol ini dengan milik kita sendiri (perhatikan komentar dalam kode):
Sejauh yang saya tahu tidak ada fungsi untuk menambahkan saran: Emacs menggunakan di
lambda
sini. Di sisi lain (seperti yang ditunjukkan oleh @rationalrevolt ) seseorang dapat menggantihelp-function
properti darihelp-function-def
jenis tombol:sumber
button-type-get
danbutton-type-put
mengganti lambda dengan milik saya sendiri yang meneruskan ke lambda yang ada.Anda dapat menggunakan variabel direktori-lokal untuk membuat file sumber Emacs hanya-baca secara default. (Lihat juga C-hig
(emacs) Directory Variables
RET).Buat file yang disebut
.dir-locals.el
di root pohon direktori yang ingin Anda lindungi, dengan konten berikut:Sunting: Michał Politowski menunjukkan dalam komentar bahwa mengaktifkan
view-mode
dengan cara ini bermasalah, karena ketika Anda mengabaikan buffer dengan qitu juga menonaktifkan mode, yang berarti bahwa lain kali Anda mengunjungi bufferview-mode
itu tidak akan diaktifkan.Sunting 2: Constantine telah memberikan solusi untuk masalah itu di komentar di bawah:
Ini berguna menambahkan tes untuk memastikan bahwa buffer sudah mengunjungi file, tetapi perubahan kuncinya adalah penggunaan
view-mode-enter
alih-alihview-mode
, karena yang pertama mengambilEXIT-ACTION
argumen yang menentukan apa yang harus dilakukan ketika qdiketik. Dalam hal ini tindakan keluar adalah untuk membunuh buffer, memastikan bahwa waktu berikutnya file dikunjungi lagi akan berakhirview-mode
.Sunting 3: Mengikuti jalur itu, kita juga dapat melihat bahwa yang ditentukan
EXIT-ACTION
akhirnya diteruskan keview-mode-exit
fungsi, dan docstringnya memberi kita solusi alternatif:Maka kita dapat menggunakan yang berikut ini:
Saya menggunakan pendekatan alternatif yang dapat Anda tentukan seluruhnya dalam file init Anda (sebagai lawan membuat
.dir-locals.el
file), dan saya hanya membuat file read-only daripada menggunakanview-mode
. Konfigurasi saya terlihat seperti ini:Jelas Anda dapat melakukan hal yang sama untuk direktori elpa Anda, dan direktori lain yang berisi kode sumber pihak ketiga.
sumber
.dir-locals.el
diri saya sendiri ...)find-file-hook
danread-only-dirs
daftar, tapi saya suka pendekatan ini.((nil . ((eval . (view-mode 1)))))
apa yang paling sederhana untuk membuatView-quit
kill buffer diakses melalui bantuan? Jika tidak setelah keluar dari tampilan sumber dengan menekanq
, buffer tetap berada di belakang dan ketika nanti mengakses sumber dari file yang sama dari bantuan lagi mode tampilan tidak dimulai.view-mode
.((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
(perhatikan(view-mode-enter ...)
bukan(view-mode 1)
). Dengan cara ini menekanq
membunuh buffer danview-mode
ini memungkinkan kali saya kunjungi file yang sama.Saya pikir yang Anda butuhkan hanyalah menambahkan sebuah kait :
sumber
view-mode
ketika menavigasi ke fungsi apa pun menggunakanC-h f
, bukan hanya sumber Emacs.find-THING
perintah interaktif yang menggunakan kait ini, dan tombol bantuan memintasnya.Ini tidak membahas kasus spesifik Anda, tetapi kasus yang lebih umum beralih ke
view-mode
setiap kali Anda mengunjungi file sumber dari buffer bantuan. Saya menawarkannya sebagai alternatif untuk jawaban @ Constantine, karena itu tidak dapat dibaca sebagai komentar.Sepertinya saya mendapat ini dari EmacsWiki .
sumber
Berikut adalah solusi yang berfungsi untuk dokumentasi internal dan contoh yang menunjukkan cara memperluasnya ke ELPA. Ini bekerja dengan mencocokkan jalur ke file saat ini terhadap beberapa regex dan menerapkan
read-only-mode
jika ada yang cocok.Perhatikan bahwa buffer tersebut hanya dapat dibaca jika Anda mengunjunginya
dired
juga, tidak hanya melalui bantuan.Saya menambahkan hook yang berjalan setelah memasukkan
emacs-lisp-mode
yang memeriksa apakah path ke file cocok/\.el\.gz$/
, dan menerapkan mode read-only jika ya.Berikut adalah contoh yang memeriksa ELPA juga, menggunakan heuristik bahwa setiap jalur yang mengandung
.emacs.d/elpa
sebenarnya adalah kode ELPA.sumber