Prog modlarında sembolleri kelime olarak kabul etme


12

Emacs'ta "kelimeler" için geçerli olan birkaç komut vardır. Örnekler arasında forward-word, kill-word, upcase-word, mark-word, transpose-words, vs. "sözcüğü" tanımı komutları arasında biraz farklı gibi görünmektedir. Örneğin, forward-wordbir sözcük içindeki alt çizgide durur (örn. foo_bar) mark-word, Alt çizgide durmaz.

Prog modundayken Emacs'ın geçerli dilin sözdizimi için uygun sözcük sınırlarını kullanması için "word" tanımını değiştirmek mümkün müdür?

Ben olduğumda c-modeistediğim forward-wordçizgi üzerinde atlamak için ve ben olduğumda lisp-modeI istemek forward-wordvs. hem kısa çizgi ve alt çizgi üzerinde atlamak için

Yanıtlar:


4

Emacs zaten " geçerli dilin sözdizimi için uygun sözcük sınırlarını " kullanmalıdır. Eğer değilse, o dil için ana mod için bir hata dosyası.

Ama belki de gerçekten kelimeler demek istemiyorsun . Belki de kelime sözdizimini değil, sembol sözdizimini kastediyorsunuz . Emacs ikisini birbirinden ayırır.

Sembol sözdizimi için, kelime komutlarını değil, sembol komutlarını kullanın: forward-symbolvb . Açıklamanızdan, gerçekten istediğiniz budur.

Bir sembol üzerinde gerçekten bir sözcük işlevi kullanmak istediğinizi düşünüyorsanız , belirli karakterlerin sözdizimi kategorisini , sembol oluşturucu sözdizimi yerine sözcük oluşturucu sözdizimine sahip olacak şekilde değiştirebilirsiniz . Ama genellikle bu yapmak istediğiniz şey değildir ve bunu yapmanıza gerek yoktur.

Karakter söz dizimi hakkında bilgi için Elisp kılavuzuna bakın. Ayrıca semboller üzerinde çalışan komutlar ve diğer işlevler için Emacs kılavuzuna ve Elisp kılavuzuna bakın (Lisp sembolleri değil, sembol diline sahip metin, hangi dilde).

Ve sexps üzerindeki işlemlerin genellikle semboller için de yararlı olduğunu unutmayın: C-M-f( forward-sexp), C-M-t( transpose-sexps), vb.


C-M-fforward-sexptanımladığınız gibi hiçbir şeye bağlı değildir. İstediğim şeyin sembollerle gezinmek olduğu konusunda haklısın, ama bu seçeneği göremiyorum.
nispio

@nispio forward sexp, forward-symbolçoğu zaman eşleşen parantezlerin üzerinden geçmenin çok yönlülüğü ile çoğu zaman. Bir şans vermelisin.
Malabarba

@Malabarba şiddetle katılmıyorum forward-sexpbir yakın bir tahmindir forward-symbol. Yeni başlayanlar için, kafa karıştırıcı bir şekilde tüm işlevlerin üzerine atlayabilir ve başladığınız yerden yüzlerce satır açabilirsiniz. Ayrıca, argüman listeleri, vb. Üzerinde atlar. Ve bunu deneyin: aşağıdaki lisp kodu verildiğinde (global-set-key [remap list-buffers] 'ibuffer)imlecinizi kelimenin ortasına getirin remapve forward-sexpbirkaç kez çalıştırın . Bu bir hata tutarsa o kapanmasını ulaştığında ]. Hayır teşekkürler.
nispio

@nispio Her zaman sexp ve kelime gezinme kombinasyonunu kullanırım. Bu şekilde, her ikisinin çok yönlülüğüne sahipken, bu sorunlardan herhangi birini önleyebilirim. Ama hepsi bir tercih meselesi. ;-) Eğer kelime navigasyonunu asla kaçırmayacağınızı biliyorsanız, superword-modesizin adamınız olabilir.
Malabarba

Üzgünüm, ileri sürmüşlerdir olmamalı C-M-fve C-M-t(onlar sexps hareket) semboller üzerinde hareket ederler. Bu izlenimi düzeltmek için düzenleyeceğim. Ancak forward-symbol, özellikle yararlı bulursanız, istediğiniz herhangi bir tuşa kesinlikle bağlanabilirsiniz . Hayır transpose-symbols, ama yararlı olduğunu düşünüyorsanız, tekrar yazabilirsiniz.
Drew

11

Bir göz atın superword-modeve subword-mode. Superword, alt çizgileri bir sınır yerine bir sözcüğün parçası olarak ele alır, bu nedenle foo_bar tek bir sözcük olarak ele alınır .
Alt fooBarkelime bunun tersini yapar, ancak camelCase için bir yerine iki sözcük olarak ele alınır.

İstediğiniz davranışı için gibi geliyor cc-modekullanımına superword-mode.

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

subword-modeBu iki mod tam olarak istediğinizi yapmıyor olsa bile, kelime algılama davranışını nasıl değiştireceğinizi göstermeleri gerektiği için kaynağı okumanızı tavsiye ederim .

Emacsredux ve ergomaclar hakkında daha uzun tartışma .


superword-modeOyunu güzelleştirmek mümkün mü paredit? Örneğin , etkinleştirildiğinde paredit-forward-kill-wordtüm sözcüğü (alt çizgi içeren) silmez superword-mode.
Renan Ranelli

Bir kelimenin tanımını değiştiriyor ve buna pareditsaygı duyuyor, bu yüzden benden istenen şeyi yapıyor.
dgtized

Mesele şu ki paredit buna saygı duymuyor . paredit-forward-kill-wordile aynı kelimeyi öldürmez superword-mode.
Renan Ranelli

Ah yanlış okudum. Hmm. Sadece bir göz attı paredit-forward-kill-wordve kendi ayrıştırma yapıyor gibi görünüyor. Bunu değiştirebiliriz, ama muhtemelen değil.
dgtized

3

Sorunuzu anladıysam, dil sözdizimi tablosunu değiştirebilirsiniz, örneğin c ++ için:

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

M-x apropos sözdizimi tablosuna bakmak da size yardımcı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.