objc-font-lock

Homepage: https://github.com/Lindydancer/objc-font-lock

Author: Anders Lindgren

Updated:

Summary

Highlight Objective-C method calls

Commentary

This package highlights Objective-C method calls.

Background:

Objective-C use a syntax for method calls it has inherited from
Smalltalk. Unfortunately, this syntax is frustratingly hard to read
-- when browsing through code, method calls tend to "disappear" as
they are different from normal C function calls.

By highlighting method calls, it is possible to read the same piece
of code faster and more accurate.

By default, the open and close bracket is highlighted using a
bright *warning face*, the entire method call is highligthed using
the standard *highlight face*, and each Objective-C function name
component is highlighted using the *font-lock function name* face.

For a more sober appearance, you can configure the package to, for
example, only highlight the function name components.

The following screenshot demonstrates the highlighting effect of
this package:

![See doc/demo.png for screenshot](doc/demo.png)

Installation:

Place this package in a directory in the load-path. To activate it,
use *customize* or place the following lines in a suitable init
file:

   (require 'objc-font-lock-mode)
   (objc-font-lock-global-mode 1)

Customization:

Method calls are highlighted as follows:

                            Controlling variable:           Default:
    [expr func: expr]
    ^               ^-- objc-font-lock-bracket-face       Warning face
          ^^^^--------- objc-font-lock-function-name-face Function name face
    ^^^^^^^^^^^^^^^^^-- objc-font-lock-background-face    Highlight

To change the face used, change the face variable. By setting it to
"nil", the corresponding part of the method call will not be
highlighted. For example:

    ;; Don't highlight brackets.
    (setq objc-font-lock-bracket-face nil)
    ;; Use `secondary-selection' (a builtin face) as background.
    (setq objc-font-lock-background-face 'secondary-selection)

Under the hood:

This package parse the content of brace pairs to decide if they
form an Objective-C method call, and what the parts are. It is
neither aware of the context in which the brackets appear, nor what
included symbols corresponds to. Despite these limitations, this
package highlight most typical constructs used in real-world
Objective-C.

Implementation:

An Objective-C method call is on one the following forms:

    [expression func]
    [expression func: expression func: expression....]

This package use font-lock rules with a function performing the
matcher (rather than an regexp). The matcher will find a bracket
pair (skipping those that are used for plain C arrays or are
located in a string or comment). Anchored sub-rules will match and
highlight individual parts. The function names an brackets are
highlighted using one rule placed before the standard Font Lock
rules. The background is highlighted using another placed last.

To recognize an expression, the Emacs built-in expression parser,
`forward-sexp', is used for plain trivial expressions (like
identifiers and numbers) and expressions inside parentheses. On top
of this, this package checks for complex expressions by looking for
casts and infix operators.

The pre- and postincrement and -decrement operators don't fall into
the above pattern. However, any code containing them should be
fontified exactly like they would, if they weren't there. Hence,
they are treated as "whitespace".

Without knowing if an identifier denotes a type or not, a construct
like `[(alpha)beta]' is ambiguous. It can either be interpreted as
a method call, where the object `alpha' is sent the message `beta'.
However, it can also be seen as an array subscript, where the
expression `beta' is cast to the type `alpha'. This package treats
any construct that looks like a cast as though it is a cast.

Dependencies