web-dev-qa-db-ja.com

C ++ 11モードまたはemacsの設定?

Emacs 23.3.1(Ubuntu、Oneiricパッケージ)を実行していますが、emacsは新しいC++ 11キーワード、constexpr、thread_localなどを理解していないようです。また、「>>」がテンプレートパラメータ、または新しい「enumclass」構文で許可されるようになりました。どこかに更新または代替モジュールがありますか?またはそれが失敗した場合、その間にemacsをよりC++ 11に適したものにするためのいくつかの設定はありますか?

38
Joseph Garvin

トランクのバージョンを確認しました、cc-modeはまだ更新されておらず、AFAIKに代わるものはありません。あなたが本当にそれを望んでいるが、あなたの手を汚したくないのであれば、あなたはあなたのためにそれを実装するために誰かにお金を払うべきです...

4
Ismael Luceno

ええと、私は24.1を使用しています。一部のC++ 98キーワードが欠落しており、すべての新しいC++ 11キーワードが欠落しています。数値定数もフォント化しません。 c ++-modeが10年間更新されていないようです。

私は長い間次のコードを使用していて、最近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)

お役に立てれば。

27

Mike Wellerのリクエストによると、C++ 11文字列リテラル(ユーザー定義リテラルを含む)の更新バージョンがここにあります。

(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(区切り文字を含む)としてフォント化する場合は、3つの正規表現を1つだけに置き換えます。このように:

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

楽しんで。

13

パッケージを見てください: "Modern C++" font-lock for EmacsMelpa でもご利用いただけます。

「ModernC++」の構文強調表示のサポート-C++ 17および技術仕様まで。このパッケージは、依存関係のないC++言語の簡単なハイライトを提供することを目的としています。

追加の強調表示(ユーザー定義の型、関数など)とインデントのために、c ++モードのメジャーモードと一緒に使用することをお勧めします。

私はこのマイナーモードのメンテナーです。フィードバックをいただければ幸いです。

10
Lud

Andreasの浮動小数点正規表現をこれに置き換えると、浮動小数点のハイライトが改善されます。

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

それが誰かを助けることを願っています。

5
Fatlimey

私にとって、最新のC++コードのフォントロックに関する2つの最も差し迫った問題点は

  1. autoが(タイプではなく)キーワードとして強調表示されているため、次の識別子は通常、変数宣言として強調表示されません。
  2. その強調表示は、コードが提示されると単純に狂ってしまい(たとえば、 rtags 'src/ClangIndexer.cppを試してください)、たとえば、関数定義などのトップレベルの構造を強調表示できません。

少し実験した後、私は自分にとってうまく機能し、両方の点に対処するソリューションに到達しました。

最初のものは、LISP/progmodes/cc-langs.elを変更することによって達成されます(自分のload-pathにコピーしてから変更することもできます)からremove"auto" from

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

およびaddそれをc++-font-lock-extra-typesに追加します(たとえば、Customizeを介して)。

2つ目は、c++-font-lock-extra-typesを空にする("auto"を保持することを除く)と役立ちます。

0
helixhorned