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