Perlakukan simbol sebagai kata dalam mode prog

12

Ada sejumlah perintah di Emacs yang berlaku untuk "kata-kata." Contohnya termasuk forward-word, kill-word, upcase-word, mark-word, transpose-words, dll Definisi "kata" tampaknya bervariasi sedikit antara perintah. Misalnya, forward-wordakan berhenti di garis bawah dalam sebuah kata (misalnya foo_bar) tetapi mark-wordtidak berhenti di garis bawah.

Apakah mungkin untuk mengubah definisi "kata" ketika saya dalam mode prog sehingga Emacs akan menggunakan batas kata yang sesuai untuk sintaks bahasa saat ini?

Ketika saya di dalam, c-modesaya ingin forward-wordmelewatkan garis bawah, dan ketika saya di dalam, lisp-modesaya ingin forward-wordmelewatkan kedua tanda hubung dan garis bawah, dll.

nispio
sumber

Jawaban:

4

Emacs seharusnya sudah menggunakan " batas kata yang sesuai untuk sintaksis bahasa saat ini ". Jika tidak, ajukan bug untuk mode utama untuk bahasa itu.

Tapi mungkin Anda tidak benar-benar bermaksud kata - kata . Mungkin maksud Anda simbol sintaks, bukan sintaksis kata. Emacs membedakan keduanya.

Untuk sintaks simbol, gunakan perintah simbol, bukan perintah kata:, forward-symboldll. Dari deskripsi Anda, inilah yang benar-benar Anda inginkan.

Jika Anda merasa benar-benar ingin menggunakan fungsi kata pada simbol, Anda dapat mengubah kategori sintaks dari karakter tertentu menjadi sintaksis kata-kata alih-alih sintaksis konstituen-simbol. Tetapi umumnya ini bukan yang ingin Anda lakukan dan Anda tidak perlu melakukannya.

Lihat manual Elisp untuk info tentang sintaks karakter. Dan lihat manual Emacs dan manual Elisp untuk perintah dan fungsi lain yang beroperasi pada simbol (bukan simbol Lisp, tetapi teks dengan sintaks simbol, dalam bahasa apa pun).

Dan perlu diingat bahwa operasi pada sexps sering berguna juga untuk bertindak pada simbol: C-M-f( forward-sexp), C-M-t( transpose-sexps), dll.

Drew
sumber
C-M-fterikat forward-sexpdan berperilaku tidak seperti apa yang Anda gambarkan. Anda benar bahwa yang saya inginkan adalah menavigasi dengan simbol, tetapi saya tidak melihat opsi itu.
nispio
@nispio forward sexppada dasarnya forward-symbolsebagian besar waktu, dengan fleksibilitas tambahan juga pergi kawat gigi yang cocok. Anda harus memberikannya kesempatan.
Malabarba
@ Malabarba Saya sangat tidak setuju itu forward-sexpadalah perkiraan dekat forward-symbol. Sebagai permulaan, ini dapat membingungkan Anda melompati seluruh fungsi, membuat Anda mendapat ratusan baris dari tempat Anda memulai. Ini juga melompati daftar argumen, dll. Dan coba ini: diberi kode lisp berikut (global-set-key [remap list-buffers] 'ibuffer)tempatkan kursor Anda di tengah kata remapdan jalankan forward-sexpbeberapa kali. Ini memunculkan kesalahan saat mencapai penutupan ]. Tidak, terima kasih.
nispio
@nispio Saya selalu menggunakan kombinasi sexp dan navigasi kata. Dengan begitu saya bisa menghindari salah satu dari masalah ini, sambil memiliki fleksibilitas dari keduanya. Tapi itu semua masalah preferensi. ;-) Jika Anda tahu Anda tidak akan pernah melewatkan navigasi kata, superword-modemungkin orang Anda.
Malabarba
Maaf, saya seharusnya tidak menyarankan itu C-M-fdan C-M-tbertindak berdasarkan simbol (mereka bertindak pada sexps). Saya akan mengedit untuk memperbaiki kesan itu. Tetapi Anda tentu dapat mengikat forward-symbolkunci apa saja yang Anda suka, jika Anda merasa sangat berguna. Tidak ada transpose-symbols, tetapi Anda dapat menulis satu lagi, jika menurut Anda itu berguna.
Drew
11

Lihatlah superword-modedan subword-mode. Superword memperlakukan garis bawah sebagai bagian dari kata dan bukan batas, sehingga foo_bar akan diperlakukan sebagai satu kata .
Subword melakukan sebaliknya tetapi untuk camelCase, jadi fooBardiperlakukan sebagai dua kata, bukan satu.

Sepertinya perilaku yang Anda inginkan adalah untuk cc-modedigunakan superword-mode.

(add-hook 'c-mode-common-hook 'superword-mode)

Saya akan merekomendasikan membaca sumber untuk subword-mode, karena bahkan jika kedua mode tidak melakukan apa yang Anda inginkan, mereka harus menunjukkan kepada Anda bagaimana mengubah perilaku deteksi kata.

Diskusi yang lebih panjang tentang emacsredux , dan ergomacs .

dgtized
sumber
Apakah mungkin superword-modebermain dengan baik paredit? Misalnya, paredit-forward-kill-wordtidak menghapus seluruh kata (berisi garis bawah) saat superword-modediaktifkan.
Renan Ranelli
Itu mengubah definisi kata, dan pareditmenghargai itu, jadi saya pikir itu melakukan apa yang diminta.
dgtized
Masalahnya adalah bahwa paredit tidak menghargai itu. paredit-forward-kill-wordtidak membunuh kata yang sama dengan yang didefinisikan oleh superword-mode.
Renan Ranelli
Oh saya salah baca. Hmm. Hanya melihat paredit-forward-kill-worddan sepertinya melakukan parsing sendiri. Jadi mungkin bisa menukar itu, tapi mungkin tidak.
dgtized
3

Jika saya mengerti pertanyaan Anda, Anda bisa memodifikasi tabel sintaksis bahasa, misalnya Untuk c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos kemudian mencari sintaks-tabel akan membantu Anda juga.

Nsukami _
sumber