C++ 11 मोड या emacs के लिए सेटिंग्स?




c++11 elisp (4)

मैं Emacs 23.3.1 (Ubuntu, Oneiric package) चला रहा हूँ और emacs नए C ++ 11 कीवर्ड्स, कॉन्स्टेक्सप्र, थ्रेड_लोक, आदि में से किसी को समझने के लिए प्रकट नहीं होता है। अब टेम्पलेट पैरामीटर, या नए 'एनम वर्ग' सिंटैक्स में अनुमति दी गई है। क्या कोई अद्यतन या वैकल्पिक मॉड्यूल कहीं है? या असफल, कुछ सेटिंग्स emacs अधिक C ++ 11 अनुकूल समय में अनुकूल बनाने के लिए?


इसके साथ एंड्रियास के फ़्लोटिंग पॉइंट रेगेक्सप को बदलने से फ़्लोट्स के हिलिंग में सुधार होगा।

integer/float/scientific literals
("\\<[-+]?[0-9]*\\.?[0-9]+\\([uUlL]+\\|[eE][-+]?[0-9]+\\)?[fFlL]?\\>" . font-lock-constant-face)

आशा है कि किसी की मदद करता है।


खैर, मैं 24.1 का उपयोग कर रहा हूं। कुछ C ++ 98 कीवर्ड गायब हैं, और सभी नए C ++ 11 कीवर्ड। यह संख्या स्थिरांक भी फ़ॉन्ट नहीं करता है। ऐसा लगता है मानो c ++ - मोड एक दशक से अपडेट नहीं किया गया है।

मैं लंबे समय से निम्नलिखित कोड का उपयोग कर रहा हूं, और हाल ही में C ++ 11 कीवर्ड जोड़े गए हैं। इसे अपने .emacs में डालने का प्रयास करें; इसमें कुछ छेद भरने चाहिए।

(require 'font-lock)

(defun --copy-face (new-face face)
  "Define NEW-FACE from existing FACE."
  (copy-face face new-face)
  (eval `(defvar ,new-face nil))
  (set new-face new-face))

(--copy-face 'font-lock-label-face  ; labels, case, public, private, proteced, namespace-tags
         'font-lock-keyword-face)
(--copy-face 'font-lock-doc-markup-face ; comment markups such as Javadoc-tags
         'font-lock-doc-face)
(--copy-face 'font-lock-doc-string-face ; comment markups
         'font-lock-comment-face)

(global-font-lock-mode t)
(setq font-lock-maximum-decoration t)


(add-hook 'c++-mode-hook
      '(lambda()
        (font-lock-add-keywords
         nil '(;; complete some fundamental keywords
           ("\\<\\(void\\|unsigned\\|signed\\|char\\|short\\|bool\\|int\\|long\\|float\\|double\\)\\>" . font-lock-keyword-face)
           ;; add the new C++11 keywords
           ("\\<\\(alignof\\|alignas\\|constexpr\\|decltype\\|noexcept\\|nullptr\\|static_assert\\|thread_local\\|override\\|final\\)\\>" . font-lock-keyword-face)
           ("\\<\\(char[0-9]+_t\\)\\>" . font-lock-keyword-face)
           ;; PREPROCESSOR_CONSTANT
           ("\\<[A-Z]+[A-Z_]+\\>" . font-lock-constant-face)
           ;; hexadecimal numbers
           ("\\<0[xX][0-9A-Fa-f]+\\>" . font-lock-constant-face)
           ;; integer/float/scientific numbers
           ("\\<[\\-+]*[0-9]*\\.?[0-9]+\\([ulUL]+\\|[eE][\\-+]?[0-9]+\\)?\\>" . font-lock-constant-face)
           ;; user-types (customize!)
           ("\\<[A-Za-z_]+[A-Za-z_0-9]*_\\(t\\|type\\|ptr\\)\\>" . font-lock-type-face)
           ("\\<\\(xstring\\|xchar\\)\\>" . font-lock-type-face)
           ))
        ) t)

उम्मीद है की यह मदद करेगा।


माइक वेलर के एक अनुरोध के अनुसार यहाँ C ++ 11 स्ट्रिंग्स शाब्दिक (incl। उपयोगकर्ता-निर्धारित शाब्दिक) के लिए एक अद्यतन संस्करण है।

(add-hook
 'c++-mode-hook
 '(lambda()
    ;; We could place some regexes into `c-mode-common-hook', but note that their evaluation order
    ;; matters.
    (font-lock-add-keywords
     nil '(;; complete some fundamental keywords
           ("\\<\\(void\\|unsigned\\|signed\\|char\\|short\\|bool\\|int\\|long\\|float\\|double\\)\\>" . font-lock-keyword-face)
           ;; namespace names and tags - these are rendered as constants by cc-mode
           ("\\<\\(\\w+::\\)" . font-lock-function-name-face)
           ;;  new C++11 keywords
           ("\\<\\(alignof\\|alignas\\|constexpr\\|decltype\\|noexcept\\|nullptr\\|static_assert\\|thread_local\\|override\\|final\\)\\>" . font-lock-keyword-face)
           ("\\<\\(char16_t\\|char32_t\\)\\>" . font-lock-keyword-face)
           ;; PREPROCESSOR_CONSTANT, PREPROCESSORCONSTANT
           ("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face)
           ("\\<[A-Z]\\{3,\\}\\>"  . font-lock-constant-face)
           ;; hexadecimal numbers
           ("\\<0[xX][0-9A-Fa-f]+\\>" . font-lock-constant-face)
           ;; integer/float/scientific numbers
           ("\\<[\\-+]*[0-9]*\\.?[0-9]+\\([ulUL]+\\|[eE][\\-+]?[0-9]+\\)?\\>" . font-lock-constant-face)
           ;; c++11 string literals
           ;;       L"wide string"
           ;;       L"wide string with UNICODE codepoint: \u2018"
           ;;       u8"UTF-8 string", u"UTF-16 string", U"UTF-32 string"
           ("\\<\\([LuU8]+\\)\".*?\"" 1 font-lock-keyword-face)
           ;;       R"(user-defined literal)"
           ;;       R"( a "quot'd" string )"
           ;;       R"delimiter(The String Data" )delimiter"
           ;;       R"delimiter((a-z))delimiter" is equivalent to "(a-z)"
           ("\\(\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\)" 1 font-lock-keyword-face t) ; start delimiter
           (   "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\(.*?\\))[^\\s-\\\\()]\\{0,16\\}\"" 1 font-lock-string-face t)  ; actual string
           (   "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?\\()[^\\s-\\\\()]\\{0,16\\}\"\\)" 1 font-lock-keyword-face t) ; end delimiter

           ;; user-defined types (rather project-specific)
           ("\\<[A-Za-z_]+[A-Za-z_0-9]*_\\(type\\|ptr\\)\\>" . font-lock-type-face)
           ("\\<\\(xstring\\|xchar\\)\\>" . font-lock-type-face)
           ))
    ) t)

उपयोक्ता परिभाषित स्ट्रिंग शाब्दिकों के उपरोक्त कार्यान्वयन में, सीमांकक टैग को font-lock-keyword-face रूप में अलग से चिह्नित किया गया है; एक अन्य विकल्प font-lock-constant-face । यह कार्यान्वयन उतना कुशल नहीं है जितना कि यह हो सकता है; लेकिन यह काम करता है और Emacs को धीमा नहीं करता है। ध्यान दें कि उपयोगकर्ता-परिभाषित स्ट्रिंग्स शाब्दिकों के लिए रेगेक्स कहीं से "चोरी" नहीं हुआ है; इसलिए मुझे उम्मीद है कि वे काम करेंगे। किसी भी टिप्पणी का स्वागत है।

यदि आप संपूर्ण शाब्दिक स्ट्रिंग को font-lock-string-face रूप में परिभाषित करना पसंद करते हैं - जिसमें सीमांकक शामिल हैं - तो केवल एक द्वारा तीन रीजैक्स को बदलें। इस तरह:

    .
    .
("\\<\\([uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?)[^\\s-\\\\()]\\{0,16\\}\"\\)\\>" 1 font-lock-string-face t)

मज़े करो।


मेरे लिए, आधुनिक C ++ कोड के फॉन्ट-लॉकिंग के साथ दो सबसे अधिक दबाव वाले दर्द बिंदु हैं

  1. यह तथ्य कि auto को एक कीवर्ड (और एक प्रकार नहीं) के रूप में हाइलाइट किया गया है और इस प्रकार निम्नलिखित पहचानकर्ता आम तौर पर एक चर घोषणा के रूप में हाइलाइट नहीं होगा, और
  2. कुछ कोड के साथ प्रस्तुत किए जाने पर हाइलाइटिंग केवल पागल हो जाता है (उदाहरण के लिए, rtags src/ClangIndexer.cpp ) और फिर उदाहरण के लिए फ़ंक्शन परिभाषा जैसे शीर्ष-स्तरीय निर्माणों को उजागर करने में विफल रहता है।

थोड़े से प्रयोग के बाद, मैं एक ऐसे समाधान पर पहुंचा जो मेरे लिए अच्छा है और दोनों बिंदुओं को संबोधित करता है।

पहले एक को lisp/progmodes/cc-langs.el (किसी के load-path कॉपी करना और फिर काम करना भी संशोधित करना) से "auto" को हटाने के द्वारा प्राप्त किया जाता है।

(c-lang-defconst c-modifier-kwds
  "Keywords that can prefix normal declarations of identifiers

और इसे c++-font-lock-extra-types (जैसे कस्टमाइज़ के माध्यम से) में जोड़ें।

दूसरे के लिए, खाली करना c++-font-lock-extra-types ( "auto" को छोड़कर) मदद करता है।





syntax-highlighting