2011-12-18 4 views
38

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

+0

Обратите внимание, что 'thread_local' еще не поддерживается G ++: http://gcc.gnu.org/projects/cxx0x.html Расширение gcc' __thread' похоже, но не вызывает конструкторы или деструкторы IIRC. – bdonlan

+0

У меня была та же проблема с vim, у которой есть некоторые файлы синтаксиса, которые я настроил. Должно быть то же самое для emacs, я думаю :) – Geoffroy

ответ

4

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

+2

сделать проект kickstarter: p –

27

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

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

+5

Это фантастика! Спасибо тебе за это. С этого момента я буду использовать это. Думали ли вы о возврате этого проекта в проект? –

+0

Возможно ... однако, кто поддерживает cc-режим? Первый автор - RMS (1985), последний Алан Маккензи (2003). Я отправил письмо на gnu.org; посмотрим, что они скажут. –

+1

@AndreasSpindler: Последнее редактирование было, безусловно, не в 2003 году - последняя версия для источника была 2 недели назад Аланом Маккензи, см. [Журнал изменений] (http://cc-mode.hg.sourceforge.net/hgweb/ CC-режим/см-режим/журнал). –

12

По просьбе Майка Уэллера здесь представлена ​​обновленная версия для литералов 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) 

Удачи.

+0

Мне это нравится.Однако он не выделяет многострочные строковые литералы правильно. ! [См. Это] (http://i39.tinypic.com/2z6v5o6.jpg). –

+0

Хорошо, это потому, что '.' не соответствует новой строке. Исправлено его, заменив все '. *' На '[[: ascii:] [: nonascii:]] *' –

+0

Тем не менее, я не понимаю, почему он выделяет некоторые символы строковых кавычек с красным. [См. Это] (http://i41.tinypic.com/16ld3iw.jpg). –

5

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

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

Надеюсь, что кто-то поможет.

7

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

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

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

Я являюсь сторонником этого второстепенного режима. Любые отзывы приветствуются.

0

Для меня две самых острых болевых точек с шрифтом блокировкой современных C++ код был

  1. того факт, что auto выделен в качестве ключевого слова (а не тип), и, таким образом, следующий идентификатор будет обычно не higlight как объявление переменной, и
  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").

Смежные вопросы