SORU
20 EKİM 2011, PERŞEMBE


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
11 Temmuz 2013, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Attempts at least

    Attempts at

    1 Ocak 2007
  • Shanice Caruthers

    Shanice Caru

    27 EKİM 2011
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009