Sto eseguendo Emacs 23.3.1 (pacchetto Ubuntu, Oneiric) ed emacs non sembra comprendere nessuna delle nuove parole chiave C++ 11, constexpr, thread_local, ecc. Inoltre non capisce che '>> 'è ora consentito nei parametri del modello o nella nuova sintassi' enum class '. C'è un modulo aggiornato o alternativo da qualche parte? O in mancanza di ciò, alcune impostazioni per rendere emacs più C++ 11 amichevole nel frattempo?Modalità C++ 11 o impostazioni per emacs?
risposta
Ho controllato la versione trunk, cc-mode
non è stata ancora aggiornata, e AFAIK non c'è alternativa. Se lo vuoi davvero, ma non vuoi sporcarti le mani, dovresti pagare qualcuno per implementarlo per te ...
fare un progetto kickstarter: p –
Bene, sto usando 24.1. Mancano alcune parole chiave in C++ 98 e tutte le nuove parole chiave C++ 11. Non crea nemmeno costanti di numeri. Sembra che C++ - modo non sia stato aggiornato per un decennio.
Sto usando il seguente codice da molto tempo e recentemente ho aggiunto parole chiave C++ 11. Prova a inserirlo nel tuo .emacs; dovrebbe riempire dei buchi
(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)
Spero che questo aiuti.
Questo è fantastico! Grazie per questo. Lo userò d'ora in poi. Hai pensato di contribuire di nuovo al progetto? –
Forse ... comunque, chi mantiene la cc-mode? Il primo autore è RMS (1985), l'ultimo Alan Mackenzie (2003). Ho inviato una mail a gnu.org; vediamo cosa dicono. –
@AndreasSpindler: L'ultima modifica non è stata sicuramente nel 2003 - l'ultimo controllo alla fonte era di 2 settimane fa di Alan Mackenzie, vedi [il log delle modifiche] (http://cc-mode.hg.sourceforge.net/hgweb/ cc-mode/cc-mode/log). –
In base a una richiesta di Mike Weller, ecco una versione aggiornata dei letterali di stringhe C++ 11 (inclusi letterali definiti dall'utente).
(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)
Nella suddetta attuazione di stringhe letterali definiti dall'utente, i tag delimitatori vengono contrassegnati separatamente come font-lock-keyword-face
; un'altra opzione sarebbe font-lock-constant-face
. Questa implementazione non è efficiente come potrebbe essere; ma funziona e non rallenta Emacs. Si noti che le espressioni regolari per i valori letterali delle stringhe definite dall'utente non sono state "rubate" da qualche parte; quindi spero che funzionino. Qualsiasi commento è benvenuto.
Se si desidera filtrare l'intera stringa letterale come font-lock-string-face
- compresi i delimitatori - sostituire le tre espressioni regolari di una sola. Come questo:
.
.
("\\<\\([uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?)[^\\s-\\\\()]\\{0,16\\}\"\\)\\>" 1 font-lock-string-face t)
Buon divertimento.
Mi piace questo.Tuttavia, non evidenzia correttamente i valori letterali di stringa su più righe. ! [Vedi questo] (http://i39.tinypic.com/2z6v5o6.jpg). –
Ok, è perché '.' non corrisponde a newline. Risolto il problema sostituendo tutto '. *' Con '[[: ascii:] [: nonascii:]] *' –
Tuttavia, non capisco perché evidenzia alcuni simboli di quotatura delle stringhe con il rosso. [Vedi questo] (http://i41.tinypic.com/16ld3iw.jpg). –
Sostituire il punto in virgola mobile di Andreas con questo si migliorerà l'oscuramento dei galleggianti.
integer/float/scientific literals
("\\<[-+]?[0-9]*\\.?[0-9]+\\([uUlL]+\\|[eE][-+]?[0-9]+\\)?[fFlL]?\\>" . font-lock-constant-face)
La speranza che aiuta qualcuno.
Dai un'occhiata al pacchetto: "Modern C++" font-lock for Emacs. È anche disponibile su Melpa.
Supporto di evidenziazione della sintassi per "Modern C++" - fino a C++ 17 e Specifiche tecniche. Questo pacchetto mira a fornire una semplice evidenziazione della lingua C++ senza dipendenza.
Si consiglia di utilizzarlo in aggiunta alla modalità principale C++ - modalità per l'evidenziazione extra (tipi definiti dall'utente, funzioni, ecc.) E il rientro .
Sono il manutentore di questa modalità secondaria. Qualsiasi feedback è apprezzato.
Per me, i due punti di dolore più pressanti con font-bloccaggio della moderna codice C++ sono stati
- il fatto che
auto
è evidenziato come parola chiave (e non un tipo) e quindi la seguente identificatore sarebbe normalmente non higlight come dichiarazione di variabile e - che l'evidenziazione semplicemente impazzisce quando viene presentato con un certo codice (ad esempio, prova rtags '
src/ClangIndexer.cpp
) e quindi ad esempio non riesce a evidenziare costrutti di primo livello come le definizioni di funzione.
Dopo un po 'di sperimentazione, sono arrivato a una soluzione che funziona bene per me e affronta entrambi i punti.
La prima si ottiene modificando lisp/progmodes/cc-langs.el
(copia al proprio load-path
e quindi modificando funziona anche) per rimuovere"auto"
da
(c-lang-defconst c-modifier-kwds
"Keywords that can prefix normal declarations of identifiers
e inserirlo a c++-font-lock-extra-types
(ad esempio tramite Personalizzazione).
Per il secondo, lo svuotamento di c++-font-lock-extra-types
(eccetto per il mantenimento di "auto"
) aiuta.
- 1. Modalità Emacs per R?
- 2. Modalità flymake racket per emacs
- 3. Modalità git consigliata per Emacs
- 4. Preferenze modalità emacs python
- 5. Ottenere GCC in modalità C++ 11 per lavorare su FreeBSD
- 6. Emacs C++ modalità: evidenziazione calchi e Sizeof
- 7. Emacs commento-regione in modalità C
- 8. Indentazione Emac di funzioni lambda C++ 11 (modalità cc)
- 9. Modalità Emacs per flex e bisonte o rimozione del rientro automatico per queste modalità?
- 10. Modalità Emacs per un linguaggio simile a C
- 11. Impostazioni solo per GUI/Terminal emacs
- 12. Emacs Modalità JS per stile npm
- 13. modalità palangari in Emacs
- 14. Modalità Erlang emacs - impostazione fuori
- 15. Controllo autotools per C++ 11
- 16. Come posso spostare le impostazioni della modalità php da .emacs a .dir-locals.el?
- 17. Modalità ESS Emacs - Tab per regione commento
- 18. Esiste una modalità BNF per Emacs?
- 19. Modalità Emacs C: come si sintonizzano i numeri esadecimali evidenziati?
- 20. Esiste un'estensione o una modalità in Emacs simile a surround.vim?
- 21. Comportamento del preprocessore strano g ++ in modalità C++ 11
- 22. date in modalità org in altre modalità Emacs
- 23. Modalità JavaScript preferita per emacs? È js2-mode di Yegge?
- 24. Ocaml - Modalità di Touare Emacs
- 25. Emacs 24: Stile modalità riga
- 26. Emacs Unbind una modalità di KeyBinding
- 27. Che cos'è un modo semplice per combinare due modalità principali di Emacs o per modificare una modalità esistente?
- 28. Disabilitare la modalità malvagia per Nav in Emacs? O qualche buffer di sola lettura?
- 29. Modalità Tramp in emacs usando ssh config
- 30. Come posso velocizzare la modalità Documento Emacs?
Nota che 'thread_local' non è ancora supportato da G ++: http://gcc.gnu.org/projects/cxx0x.html L'estensione gcc' __thread' è simile ma non richiama costruttori o distruttori IIRC. – bdonlan
Ho avuto lo stesso problema con vim, che ha alcuni file di sintassi sintonizzati. Deve essere lo stesso per Emacs, penso :) – Geoffroy