Режим C ++ 11 или настройки для Emacs? - PullRequest
38 голосов
/ 18 декабря 2011

Я использую Emacs 23.3.1 (Ubuntu, пакет Oneiric), и emacs, похоже, не понимает ни одного из новых ключевых слов C ++ 11, constexpr, thread_local и т. Д. Также он не понимает, что '> > 'теперь разрешено в параметрах шаблона или в новом синтаксисе' enum class '. Есть ли где-нибудь обновленный или альтернативный модуль? Или, в противном случае, некоторые настройки сделают emacs более дружественным к C ++ 11 в то же время?

Ответы [ 6 ]

27 голосов
/ 17 октября 2012

Ну, я использую 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)

Надеюсь, это поможет.

13 голосов
/ 13 июня 2013

Согласно запросу Майка Уэллера, здесь обновленная версия для строковых литералов 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 - включая разделители - замените три регулярных выражения одним.Вот так:

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

Веселись.

9 голосов
/ 26 мая 2016

Посмотрите на пакет: font-lock "Modern C ++" для Emacs . Это также доступно на Melpa .

Поддержка подсветки синтаксиса для "Modern C ++" - до C ++ 17 и Техническая спецификация. Этот пакет призван обеспечить простой выделение языка C ++ без зависимости.

Рекомендуется использовать в дополнение к основному режиму c ++ - mode. для дополнительной подсветки (пользовательские типы, функции и т. д.) и отступы.

Я поддерживаю этот второстепенный режим. Любые отзывы приветствуются.

5 голосов
/ 16 ноября 2013

Замена регулярного выражения Andreas с плавающей точкой этим улучшит подсветку float.

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

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 20 декабря 2011

Я проверил версию транка, cc-mode еще не был обновлен, и AFAIK альтернативы нет.Если вы действительно этого хотите, но не хотите пачкать руки, вы должны заплатить кому-то, чтобы он реализовал это для вас ...

0 голосов
/ 01 апреля 2017

Для меня две наиболее острые проблемы с блокировкой шрифтов современного кода 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 (например, через Customize).

Для второго помогает очистка c++-font-lock-extra-types (за исключением сохранения "auto").

...