2009-12-08 15 views
5

Sto usando la modalità standard (fornito) Emacs C++, ma ho un leggero prurito che sto cercando di ottenere graffiato. Come potrei fare per correttamente evidenziando i tipi all'interno di un sizeof e la getta in C++?Emacs C++ modalità: evidenziazione calchi e Sizeof

Ad esempio:

  1. Un Cast

    Type * pointer = reinterpret_cast <Type *> (original);

  2. Sizeof

    std::cout << sizeof (Type) << "\n";

+0

cosa intendi con "evidenziazione corretta"? Vuoi che il nome del tipo sia evidenziato allo stesso modo del nome del tip quando dichiari una variabile, o che ci sia qualche altro modo "corretto" che vorresti fosse evidenziato? – Andrew

+0

Voglio che il nome del tipo sia evidenziato come quando dichiari una variabile, sì. –

+0

Dato che, in 'sizeof (X)', dipende interamente dal contesto se X è un tipo o una variabile, quanto accurato vuoi che sia? –

risposta

4

Aggiungere queste espressioni per il vostro .emacs, o valutare con M-:.

Sizeof (che è il più semplice dei due casi)

La regex evidenzia una qualsiasi combinazione (indicato con l'espressione staffa [...]; per quanto riguarda la sintassi, vedere la nota di seguito) di alfanumerico, spazi bianchi e l'asterisco tra parentesi e preceduto da sizeof.

(font-lock-add-keywords 'c++-mode 
    '(("\\<sizeof[[:space:]]*(\\([[:alnum:][:space:]*]+\\))" 
    1 font-lock-type-face t))) 

Il numero 1 dice emacs solo evidenziare il primo subespressione (contrassegnato da \\(...\\)) utilizzando la faccia font-lock-type-face; t significa ignorare qualsiasi evidenziazione precedente.

È possibile visualizzare e modificare le facce disponibili con M-x customize group [RET] font-lock-faces [RET].

C++ stile getta

io non sono sicuro che typename si desidera essere messo in evidenza il – “ originale ” o quello di gettare nella. Il presente marchio evidenziatore entrambi:

(font-lock-add-keywords 'c++-mode 
    '(("\\<[[:alnum:]]+_cast[[:space:]]*<\\([[:alnum:][:space:]*]+\\)>[[:space:]]*(\\([[:alnum:][:space:]*]+\\))" 
    (1 font-lock-type-face t) 
    (2 font-lock-type-face t)))) 

Nuovamente, '1 and 2` selezionare le sottoespressioni corrispondenti.

Nota: Le espressioni regolari per i nomi di tipo non sono perfettamente conformi alla sintassi C++. Ad esempio, emacs metterà in evidenza le sciocchezze come sizeof(int * 32).

Inoltre, la mia soluzione non tiene in considerazione il problema Pavel menzionato nel commento alla tua domanda; che potresti anche usare sizeof sulle variabili, che avrebbero bisogno di evidenziazioni diverse. Non penso sia possibile, a meno di implementare un parser C completo nel codice di blocco font.