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-word
akan berhenti di garis bawah dalam sebuah kata (misalnya foo_bar
) tetapi mark-word
tidak 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-mode
saya ingin forward-word
melewatkan garis bawah, dan ketika saya di dalam, lisp-mode
saya ingin forward-word
melewatkan kedua tanda hubung dan garis bawah, dll.
sumber
C-M-f
terikatforward-sexp
dan berperilaku tidak seperti apa yang Anda gambarkan. Anda benar bahwa yang saya inginkan adalah menavigasi dengan simbol, tetapi saya tidak melihat opsi itu.forward sexp
pada dasarnyaforward-symbol
sebagian besar waktu, dengan fleksibilitas tambahan juga pergi kawat gigi yang cocok. Anda harus memberikannya kesempatan.forward-sexp
adalah perkiraan dekatforward-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 kataremap
dan jalankanforward-sexp
beberapa kali. Ini memunculkan kesalahan saat mencapai penutupan]
. Tidak, terima kasih.superword-mode
mungkin orang Anda.C-M-f
danC-M-t
bertindak berdasarkan simbol (mereka bertindak pada sexps). Saya akan mengedit untuk memperbaiki kesan itu. Tetapi Anda tentu dapat mengikatforward-symbol
kunci apa saja yang Anda suka, jika Anda merasa sangat berguna. Tidak adatranspose-symbols
, tetapi Anda dapat menulis satu lagi, jika menurut Anda itu berguna.Lihatlah
superword-mode
dansubword-mode
. Superword memperlakukan garis bawah sebagai bagian dari kata dan bukan batas, sehinggafoo_bar
akan diperlakukan sebagai satu kata .Subword melakukan sebaliknya tetapi untuk camelCase, jadi
fooBar
diperlakukan sebagai dua kata, bukan satu.Sepertinya perilaku yang Anda inginkan adalah untuk
cc-mode
digunakansuperword-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 .
sumber
superword-mode
bermain dengan baikparedit
? Misalnya,paredit-forward-kill-word
tidak menghapus seluruh kata (berisi garis bawah) saatsuperword-mode
diaktifkan.paredit
menghargai itu, jadi saya pikir itu melakukan apa yang diminta.paredit-forward-kill-word
tidak membunuh kata yang sama dengan yang didefinisikan olehsuperword-mode
.paredit-forward-kill-word
dan sepertinya melakukan parsing sendiri. Jadi mungkin bisa menukar itu, tapi mungkin tidak.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.sumber