emacs και C++ syntax highlighting

Giorgos Keramidas keramida at ceid.upatras.gr
Fri Sep 29 20:56:53 EEST 2006


On 2006-09-28 21:29, Ioannis Papadopoulos <giannis.papadopoulos at gmail.com> wrote:
>Giorgos Keramidas wrote:
>> On 2006-09-28 14:44, Giannis Papadopoulos <giannis.papadopoulos at gmail.com> wrote:
>>> Καλησπέρα,
>>> Έχει κανείς υπόψην του - ή έχει φτιάξει - κανένα configuration
>>> file για emacs που να κάνει καλό syntax highlighting για C++;
>>>
>>> Έχω δοκιμάσει κανά δυο, αλλά ή κάνουν ότι να'ναι (πχ δεν κανουν
>>> highlight opening και closing braces/παρενθέσεις κλπ) ή δεν
>>> κάνουν σωστό highlighting.
>> 
>> Τι κακό έχει το font-lock-mode?
>> 
>> Το screenshot εδώ δείχνει το default (σχεδόν) font-lock highlighting που κάνει
>> το GNU Emacs 22.Χ σε C++ προγράμματα, όταν τρέχει κάτω από X11:
>> 
>> http://people.freebsd.org/~keramida/emacs/screenshot/emacs-cpp-highlight.png
>> 
>> Τι δε σ' αρέσει και πώς θα ήθελες να είναι;
> 
> Για παράδειγμα το begin() θα μπορούσε να έχει το χρώμα της δήλωσης της
> συνάρτησης.

Ακριβώς επειδή αυτό είναι "προσωπική προτίμηση", υπάρχει generic τρόπος
να ορίσεις τι θα έχει χρώμα, πότε και γιατί.  Ας πούμε, το όνομα της
συνάρτησης delete_and_clear() έχει μπλε χρωματάκι εκεί επειδή το `font
face' με όνομα `font-lock-function-name-face' έχει τέτοια
χαρακτηριστικά.

Υπάρχει τρόπος να ορίσεις δικά σου `font faces' και να ρυθμίσεις το C++
mode να τα χρησιμοποιεί με βάση ότι συντακτικό κανόνα θέλεις.

Για παράδειγμα, το παρακάτω, δημιουργεί ένα νέο `font face' με όνομα
`font-lock-function-call-face' και ορίζει ότι θα έχει τα ίδια attributes
με το υπάρχον `font-lock-function-name-face':

    (make-face "font-lock-function-call-face" nil)
    (let ((fg (face-attribute 'font-lock-function-name-face
                 :foreground nil 'default)))
      (set-face-attribute 'font-lock-function-call-face nil
         :inherit 'font-lock-function-name-face))

Για να ορίσεις ότι το `font-lock-mode' θα χρησιμοποιεί αυτό το font face
όταν βρίσκει function-call, μπορείς ύστερα να χρησιμοποιήσεις την
`font-lock-add-keywords' για να ορίσεις ότι σε C και C++ modes, το Emacs θα
χρησιμοποιεί το `font-lock-function-call-face' για να `χρωματίζει' τις
κλήσεις συναρτήσεων.

    (defun gker-c++-mode-hook ()
      (font-lock-add-keywords nil
        '(("\\<\\([^\\s()]+\\)(" 1 'font-lock-function-call-face t))))
    (add-hook 'c++-mode-hook 'gker-c++-mode-hook)

Το regexp matching εδώ είναι ψιλο-gay, αλλά είναι απλά ένα παράδειγμα
από το πώς μπορείς να κάνεις match & highlight regexps με custom font
faces σε GNU Emacs.  Για syntax-based matching θα χρειαστεί λίγο πιο

> Όταν γράφεις using namespace std; και όταν καλείς κάτι σαν
> std::accumulate το std έχει διαφορετικά χρώματα - θα με βόλευε οτιδήποτε
> είναι πριν το :: να έχει πάντα τα ίδια χρώματα, μόνον η συνάρτηση να
> έχει διαφορετικά.

Δεν είμαι σίγουρος ότι κατάλαβα τι θέλεις να πεις εδώ :(

> Επιπλέον σε μένα από default έχει άθλια χρώματα, οπότε μια και δεν μπορώ
> να τα αλλάξω ένα-ένα, είναι πιο εύκολο να κατεβάσω κάποιο έτοιμο
> configuration file που τα αλλάζει όλα μαζί.
> 
> Γενικά, τα kate/gedit/jedit κάνουν πολύ πιο συνεπές syntax highlighting
> και αν μπορούσα να είχα κάτι αντίστοιχο θα ήμουν αρκετά ευτυχής.

Το font-lock-mode του GNU Emacs μπορεί να δουλέψει είτε με
'ψευδοσυντακτική' ανάλυση του buffer, είτε με regexp matching.  Αν προτιμάς
το highlighting του kate/gedit/jedit και μπορείς να βρεις πώς κάνουν
highlight αυτά τα προγράμματα (π.χ. τι χρώματα χρησιμοποιούν και πώς, πότε,
κλπ.) σίγουρα μπορεί να υλοποιηθεί το ίδιο πράγμα και σε GNU Emacs :)




More information about the Linux-greek-users mailing list