C Şablonlar ve Emacs: Özelleştirme Girinti
Emacs içinde bildiğim kadarıyla, kapanış girinti düzeyi '' şablon listesi karakteri C.^. özelleştirme yolu yok Şu anda emacs girinti planımı yapar:
template <
typename T1,
typename T2,
typename T3
>
class X;
Benim istediğim bunun gibi bir şey:
template <
typename T1,
typename T2,
typename T3
>
class X;
Girinti değişken şablon argüman olarak devam sıfır ayarı '>' doğru, ama şablon argüman listesini gerçek vücut unindenting pahasına karakter. girinti olacak
Emacs gelen herhangi bir öneri orada gurular?
DÜZENLEME:
Bu aşağıdaki biraz hack ile çalışıyor:
(defun indent-templates (elem)
(c-langelem-col elem t)
(let ((current-line
(buffer-substring-no-properties
(point-at-bol) (point-at-eol))))
(if (string-match-p "^\\s-*>" current-line)
0
' )))
Ve sonra benim özel tema girinti-şablonlar için şablon argüman devamı ayarı, ala:
(c-add-style "my-style"
'("stroustrup"
;; ... Other stuff ...
(template-args-cont . indent-templates))))
Ama hala çok can sıkıcı olabiliyor. Çoğu zaman işe yarıyor, ama bazen emacs bir şablon listesinden bir arglist sanıyor at kafası karışıyor, sonra neşe gelişir.
CEVAP
Bulduğum en iyi çözüm özel (nispeten) basit girinti işlevi bir yazı.
Kod
(defun c -template-args-cont (langelem)
"Control indentation of template parameters handling the special case of '>'.
Possible Values:
0 : The first non-ws character is '>'. Line it up under 'template'.
nil : Otherwise, return nil and run next lineup function."
(save-excursion
(beginning-of-line)
(if (re-search-forward "^[\t ]*>" (line-end-position) t)
0)))
(add-hook 'c -mode-hook
(lambda ()
(c-set-offset 'template-args-cont
'(c -template-args-cont c-lineup-template-args ))))
Bu şablonlar çeşitli düzeylerde iç içe geçmiş bile rastladığım bu durumda tüm işler.
Nasıl Çalışır
Eğer girinti işlevlerin listesi sağlanırsa kodu girintileme, Emacs sırayla deneyecek ve eğer bir anda yürütülmekte nil
, dönerse bir sonraki çağırmak olacaktır. Yaptığım şey yeni bir girinti bir işlevi satırda boşluk olmayan ilk karakter olup olmadığını tespit eden listenin başına ' ^ eklenir . 've eğer varsa, 0 konumuna girinti açma şablonu ile start alacak olan () ayarlayın. Bu da aşağıdaki gibidir: template-şablon parametreleri olması durumunda kapsar
template <
template <
typename T,
typename U,
typename... Args
> class... CS
>
'>sonra ne önemi yok çünkü '. Yani girinti işlevler listesini nasıl çalıştığını sonuç olarak, eğer '>' ilk karakter değil, işlevi nil
döner ve her zamanki girinti işlevi çağrılmış olur.
Python için toplu girinti Emacs...
Metin Modunda Emacs 4 Boşluk Girinti a...
Emacs benim için yeniden girinti HTML ...
Nasıl emacs javascript modunda girinti...
Neden Python pep-8 güçlü bir girinti s...