Apa cara terbaik untuk mencapai sesuatu seperti melipat kode, atau jenis bersepeda yang digunakan mode org. Apa solusi terbaik di elisp untuk menciptakan jenis perilaku ini?
EDIT: Maaf saya tidak jelas. Saya ingin memprogram sesuatu secara elisp yang melakukan hal-hal yang sangat mirip dengan pelipatan kode, atau sebenarnya paling mirip dengan mode-org dengan hierarki yang dapat diperluas. Saya bertanya-tanya cara terbaik untuk mencapai pengaruh ini. Saya rasa saya pernah mendengar emacs overlay adalah solusi yang baik, tetapi saya tidak tahu.
Untuk melipat saya hanya menggunakan builtin set-selective-display
EDIT NOMOR 2:
Terima kasih atas jawabannya tetapi saya pikir saya mengajukan pertanyaan yang salah, jadi izinkan saya mencoba lebih jelas tentang apa yang saya coba lakukan. Saya ingin membuat yang berikut ini
Ketika Anda meletakkan poin Anda pada suatu fungsi dan memanggil fungsi elisp ini, itu akan menempatkan definisi fungsi dari mana pun itu (saya berpikir untuk hanya menggunakan find-tag untuk ini) dan membuka lipatannya di buffer saat ini. Idenya adalah jika Anda harus melompat ke buffer yang berbeda untuk membaca definisi fungsi, saya merasa ini adalah konteks yang beralih ke file lain. Jadi saya ingin berperilaku seperti kode lipat hanya itu menarik kode eksternal dari buffer. Hal ini menimbulkan beberapa masalah karena tidak dapat menempelkan kode ke buffer atau jika seseorang menyimpannya akan menyimpan kode yang ditarik. Jadi saya bertanya-tanya apakah ada cara untuk membuat area di dalam buffer yang juga bukan bagian dari buffer. Saya pikir itu masuk akal.
sumber
EDIT NB 2
dan membuat pertanyaan baru untuk itu.Jawaban:
Melipat biasanya tidak diperlukan dengan emacs, karena memiliki alat yang secara eksplisit mengimplementasikan tindakan yang dilakukan orang secara manual saat melipat kode.
Kebanyakan orang sukses baik dengan pencarian tambahan sederhana. Lihat "foo" disebutkan di suatu tempat? Ketik C-s
foo
, temukan definisinya, tekan enter, baca, lalu tekan C-x C-xuntuk kembali ke tempat Anda sebelumnya. Sederhana dan sangat berguna.Kebanyakan mode mendukung imenu . M-x
imenu
akan membiarkan Anda melompat ke definisi fungsi (dll.) dengan nama. Anda juga dapat mengikatnya ke klik mouse untuk mendapatkan menu fungsi (atau menambahkannya ke bilah menu; lihat halaman Info untuk detail selengkapnya). Ini menyediakan data untuk mode-fungsi mana, yang akan memungkinkan Anda melihat fungsi mana yang saat ini Anda berada di dalam modeline. (Namun, mengapa fungsi Anda selama ini?)Ada juga speedbar , yang menampilkan informasi imenu (dan hal lain) secara grafis.
Jika Anda ingin mendapatkan gambaran umum tentang file Anda, coba M-x
occur
". Diberikan regex, ini akan membuat buffer baru dengan setiap kecocokan di buffer saat ini. Anda dapat mencari" (defun "untuk mendapatkan gambaran umum tentang fungsi file saat ini mengimplementasikan. Mengklik pada hasil akan memindahkan Anda ke posisi itu dalam file.Jadi, pikirkan tentang apa yang sebenarnya ingin Anda capai, dan Emacs mungkin mengimplementasikannya. Jangan berkelahi dengan alat yang tidak sempurna yang membuat Anda terus melipat dan membuka barang.
sumber
sembunyikan-tampilkan mode (
hs-minor-mode
) dengan keybinding defaultC-c @ C-M-h
untuk memicu pelipatan (hs-hide-all
)sumber
zR
,zM
,zo
,zc
.Cara lain untuk menguliti kucing:
M-1 Cx $ dan keajaiban terjadi!
Seperti biasa, ini ajaib: Cx $ akan mengembalikan kode Anda.
dari blog sihir emacs minor
Hanya untuk kelengkapan: M-3 Cx $ akan menampilkan kode bersarang yang lebih dalam dan seterusnya.
FWIW Saya membuat pembantu kecil hari ini berdasarkan smth. ditemukan di sini sehingga F5 mengaktifkan pelipatan kode berdasarkan posisi kursor saat ini:
sumber
Saya menggunakan mode minor outline untuk melipat kode python saya. Alih-alih perlu menempatkan {{{and}}} seperti dalam mode lipat, mode ini menggunakan tempat blok ditentukan.
http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode
Saya cukup yakin bahwa itu datang dengan emacs. Saya kemudian menambahkan ini ke .emacs saya
sumber
outline-mode
mendukung python out-of-the-box di emacs 24 - tidak perluoutline-level
fungsi khusus . Ini semua yang perlu saya tambahkan keuser.el
:(add-hook 'python-mode-hook 'outline-minor-mode)
outline-minor-mode-prefix
- keybindings default buruk - saya gunakan(setq outline-minor-mode-prefix (kbd "C-;"))
Anda juga bisa mendapatkan kode lipat dengan menggunakan CEDET dengan kode berikut di file init:
Setelah evaluasi kode ini, segitiga kecil akan muncul di area pinggiran, sehingga Anda dapat melipat & membuka kode dengan menggunakannya. Metode ini lebih tepat, karena menggunakan informasi sintaksis, yang diekstrak dari kode sumber
sumber
hs-minor-mode bekerja dengan baik.
Ia bekerja lebih indah saat dipasangkan dengan fold-dwim (lakukan apa yang saya maksud). Lalu ada lipat-dwim-org, yang menyediakan mode-org seperti pengikatan kunci untuk pelipatan kode! Keduanya dapat diinstal melalui selai jeruk (dan menurut saya elpa).
sumber
Ternyata tidak ada solusi yang tepat, tapi menurut saya yang terbaik adalah ini:
http://www.emacswiki.org/emacs/FoldingMode
sumber
vimish-fold
juga merupakan solusi yang bagus dan mudah.https://github.com/mrkkrp/vimish-fold .
Dari beranda:
Menggunakan sangat baik
use-package
saya menginstal dan mengaktifkannya menggunakan potongan ini di konfigurasi saya:sumber
Saya heran tidak ada yang menyebutkan penyempitan-pelebaran. Ini sangat luar biasa, dibundel dengan emacs juga. Cukup pilih kode yang ingin Anda fokuskan dan tekan
C-x n n
, untuk kembali ke mode tampilan penuh, lakukan sajaC-x n w
. Saya selalu lebih suka menggunakan fungsionalitas emacs bawaan daripada mengacaukan ruang pengguna saya dengan paket lain. Jika emacs dapat melakukannya dengan fungsionalitas built-in maka saya akan lebih memilihnya daripada beberapa paket pihak ketiga, tapi itu hanya saya, tidak berarti atau menyiratkan hal lain selain itu saya suka hal-hal sederhana daripada konfigurasi panjang yang rumit.sumber
emacs hadir dengan hs-minor-mode yang memfasilitasi pelipatan kode antara ekspresi seimbang http://www.emacswiki.org/emacs/HideShow
sumber
Saya percaya bahwa perbandingan "proyek" Anda dengan melipat tidak cukup baik, karena melipat adalah tentang mengubah tampilan sambil menjaga konten penyangga tetap utuh (teks). Proyek Anda akan melibatkan menampilkan teks tambahan sambil menjaga konten buffer tetap utuh, AFAIU. Begitu. itu tidak dapat diimplementasikan sebagai komposisi penyisipan dan pelipatan teks (kemudian, konten buffer akan diubah).
Tapi mungkin, itu memang mungkin dengan mekanisme yang sama seperti melipat dilakukan dengan - "overlay" ... Pertimbangkan properti overlay "before-string" dan "after-string" ; mungkin, Anda bisa meletakkan definisi fungsi Anda ke dalam string yang termasuk dalam hamparan kosong pada intinya. Lihat fungsi outline-flag-region untuk melihat bagaimana overlay digunakan dalam mode outline.
sumber
Jika Anda menggunakan
hs-minor-mode
, mungkin ada baiknya juga menyetel pintasan yang lebih nyaman, misalnya:sumber
Dengan inspirasi dari jawaban einSelbst :
Voila,
C-x $
tiba-tiba menjadi berguna bahkan tanpa bisnisC-u
atau apapunM-4
.sumber
Jika Anda melakukan beberapa JavaScript dan menggunakan
js2-mode.el
, Anda dapat:C-c C-f
: beralih sembunyikan / tampilkan semuaC-c C-e
: sembunyikan elemenC-c C-s
: elemen acarasumber