Saya ingin menavigasi di antara baris file berdasarkan indentasi. File terstruktur berdasarkan indentasi: baris yang lebih indentasi daripada baris sebelumnya adalah anak dari baris sebelumnya, baris yang memiliki lekukan yang sama dengan baris sebelumnya adalah saudara kandungnya. Saya kebanyakan mencari tiga perintah:
- Pindah ke saudara berikutnya, yaitu baris berikutnya dengan lekukan yang sama, melompati garis yang lebih menjorok, tetapi tidak melewati garis yang kurang menjorok.
- Pindah ke saudara sebelumnya, yaitu hal yang sama di arah lain.
- Pindah ke induk, yaitu ke baris sebelumnya dengan sedikit lekukan.
Posisi kolom titik tidak boleh berubah.
Ini adalah analog untuk data terstruktur indentasi forward-sexp
, backward-sexp
dan backward-up-list
untuk data terstruktur jenis kelamin. Lekukan sesuai dengan struktur program dalam bahasa seperti Haskell dan Python; fungsi-fungsi ini dapat sangat berguna dalam konteks ini, tetapi saya tidak mencari apa pun untuk mode khusus (kasus penggunaan utama saya adalah data terstruktur dengan maksud di dalam format file lain).
Tingkat indentasi warna dapat membantu menavigasi secara manual dengan Up/ Downtetapi saya menginginkan sesuatu yang otomatis.
Pertanyaan pengguna super ini serupa tetapi dengan persyaratan yang lebih lemah dan saat ini tidak memiliki jawaban yang memenuhi persyaratan saya.
sumber
set-selective-display
Anda dekat dengan yang Anda butuhkan?indent-tools
dalam melpa ( indent-tools ), yang mungkin berfungsi untuk tujuan ini. Komit pertama adalah pada 2016-Mei-16, sekitar 3 bulan setelah pertanyaan ini diajukan.Jawaban:
Meneliti empat jawaban yang tersedia saat ini ( dua di Super User dan dua di pertanyaan ini), saya melihat masalah berikut:
outline.el
, pada dasarnya juga akan berjalan baris demi baris (menggunakanoutline-next-visible-heading
) dalam kasus kami, karena (hampir) semua baris akan cocok dengan regexp garis besar dan dihitung sebagai "heading".Jadi, mengumpulkan beberapa ide dari masing-masing, saya memiliki yang berikut: maju selangkah demi selangkah, melompati garis-garis kosong dan lebih indentasi. Jika Anda berada pada indentasi yang sama maka itu adalah saudara kandung berikutnya. Ide dasarnya terlihat seperti ini:
Secara umum sesuai (maju / mundur / naik / turun), apa yang saya gunakan tampak seperti berikut ini saat ini:
Masih ada beberapa fungsi yang diinginkan, dan melihat
outline.el
dan mengimplementasikan kembali beberapa yang dapat membantu, tapi saya senang dengan ini untuk saat ini, untuk tujuan saya.sumber
(current-line)
ada sesuatu darimisc-fns.el
yang entah bagaimana saya miliki di instalasi Aquamacs saya sebagai bagian dari beberapaoneonone.el
perpustakaan.Fitur ini ada di Emacs. Mode Outline menggambarkan dokumen sebagai berisi garis judul dengan level, dan memiliki fasilitas untuk berpindah antar level. Kita dapat mendefinisikan setiap baris sebagai baris judul dengan level yang mencerminkan lekukannya: atur
outline-regexp
ke lekukan tersebut. Lebih tepatnya, lekukan ditambah karakter non-spasi pertama (dan awal file adalah tingkat paling atas):\`\|\s-+\S-
.Di Emacs 22.1–24.3 Anda dapat menyederhanakan ini untuk:
Kemudian Anda dapat menggunakan perintah gerakan garis besar :
C-C @ C-f
(outline-forward-same-level
) untuk pindah ke saudara kandung berikutnya;C-C @ C-b
(outline-backward-same-level
) untuk pindah ke saudara sebelumnya;C-C @ C-u
(outline-up-heading
) untuk pindah ke induk.Satu tab dan satu spasi menghitung jumlah indentasi yang sama. Jika Anda memiliki campuran tab dan spasi, atur dengan
tab-width
tepat dan panggiluntabify
.Jika mode utama saat ini memiliki pengaturan garis besar, mereka mungkin bertentangan. Dalam hal ini, Anda dapat menggunakan salah satu dari banyak solusi mode utama , yang paling sederhana adalah membuat buffer tidak langsung dan mengaturnya ke Mode Mode Garis Besar. Di Outline Major Mode, pintasan keyboard default lebih mudah untuk diketik:,
C-c C-f
dll.sumber
M-x make-local-variable RET outline-regexp RET
tidak menerima variabel itu, dan hanya mengatakan `[Tidak cocok]`. Saya belum melihat ke dalamnya lebih hati-hati.outline-regexp
tidak lagi merupakan defcustom dan tidak dapat diatur secara interaktif dengan mudah.Tiga perintah berikut, minimal diuji, harus memungkinkan untuk navigasi dasar dengan jalur indentasi. Permintaan maaf untuk pengulangan kode.
sumber
(current-column)
tetapi itu menyebabkan kursor tidak bergerak), tetapi tidak benar-benar memenuhi spesifikasi saya: bergerak pada tingkat indentasi bergerak melewati kurang- garis indentasi.ind-forward-sibling
hanya mencari baris berikutnya dengan lekukan yang sama, sehingga melompati baris dengan lekukan yang lebih sedikit (berjalan maju bahkan ketika tidak ada saudara kandung maju).