Saya memodifikasi beberapa kode elisp dari linum.el:
(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
(let* ((w (length (number-to-string
(+ (count-lines (point-min) (point-max)) 1))))
(linum-format (concat " %" (number-to-string w) "d ")))
ad-do-it))
Saya bisa memperbaiki bug di mana lekukan itu off-per-satu dengan memodifikasi (count-lines (point-min) (point-max))
untuk (+ (count-lines (point-min) (point-max)) 1)
. Itu mudah.
Tapi sekarang saya ingin memodifikasinya sehingga lebar minimum adalah 2 dengan menambahkan if-conditional di mana (concat " %" (number-to-string w) "2d ")
jika jumlah barisnya <10.
Ini seharusnya mudah! Tambahkan satu syarat dan salin / tempelkan concat. Sepotong kue, kan? Maksud saya, saya tahu apa yang seharusnya saya lakukan tetapi saya jarang menyentuh elisp dan saya selalu gentar ketika saya harus memodifikasi apa pun dengan banyak tanda kurung.
Gaya "benar", dari apa yang saya mengerti, adalah untuk menyusun kode berdasarkan indentasi dan membungkus tanda kurung di akhir baris daripada pada sendiri. Berasal dari bahasa gaya 'C' lainnya, saya berjuang dengan baik membaca dan menulis kode dengan cara ini. Jadi pertanyaan saya adalah: apa yang saya lakukan salah? Bagaimana saya bisa mengedit elisp dan menavigasi kode sehingga saya tidak harus duduk di sana dan menghitung setiap tanda kurung?
Ketika saya bekerja dengan sesuatu di elisp yang menjadi terlalu dalam, saya harus menutup pintu, menarik tirai, dan mulai memposisikan tanda kurung K&R sehingga saya tidak hanya bisa membaca tetapi memodifikasi benda sialan itu tanpa panik.
Jelas saya melakukan ini semua salah. Bagaimana saya bisa menyentuh elisp seperti ini tanpa rasa takut?
Harap dicatat bahwa pertanyaan saya adalah bagaimana menavigasi dan mengedit elisp bukan sebagai pertanyaan tentang gaya. Saya menggunakan yang berikut ini sebagai panduan gaya: https://github.com/bbatsov/emacs-lisp-style-guide
Pembaruan:
Cara memformat elisp dengan benar sebelum mempermalukan diri Anda di emacs.stackexchange:
Tandai elisp Anda dan lakukan M-x indent-region
.
Solusi Masalah:
Bagi mereka yang ingin tahu bagaimana melakukan pembenaran yang tepat untuk linum dengan lebar minimum dua, berikut adalah solusinya:
(defadvice linum-update-window (around linum-dynamic activate)
(let* ((w (length (number-to-string
(+ (count-lines (point-min) (point-max)) 1))))
(linum-format (if (> w 1)
(concat " %" (number-to-string w) "d ")
" %2d ")))
ad-do-it))
%2d
karena sekali lebarnya bergeser ke 3 atau lebih karakter maka itu bergerak dari membawa kanan-dibenarkan ke kiri-dibenarkan.
highlight-parentheses
,; rainbow-delimiters
; dll. Ini adalah versi sederhana saya sendiri highlight-parentheses
yang memungkinkan pengguliran tanpa menghapus tanda kurung yang terakhir diwarnai: stackoverflow.com/a/23998965/2112489 Di masa depan, ini adalah satu pertanyaan per pelanggan / utas.