guns / vim-clojure-static

Meikel Brandmeyer's excellent Clojure runtime files
Other
420 stars 50 forks source link

Names with ' in them are not colored correctly #48

Open oskarkv opened 10 years ago

oskarkv commented 10 years ago

Not sure if this is a vim-clojure-static or vim-clojure-highlight issue.

Names that contain ' become clojureSymbol instead of clojureFunc when using vim-clojure-highlight.

Also, another problem with ' is the following:

(defn some-func [args] body)

(defn some-other-func [args]
  (let [some-func' (fn ...)]
    ...))

In this case, the some-func part of the name some-func' becomes clojureFunc while the ' becomes clojureQuote, resulting in a name with two colors in it, which can be confusing. Normally, the name in the let should be a clojureSymbol, but it seems that because some-func is also a function this happens somehow.

guns commented 10 years ago

Hi oskarv!

In this case, the some-func part of the name some-func' becomes clojureFunc while the ' becomes clojureQuote, resulting in a name with two colors in it, which can be confusing. Normally, the name in the let should be a clojureSymbol, but it seems that because some-func is also a function this happens somehow.

Yes, this is a problem with the way vim-clojure-static handles single quotes. We use syntax keyword statements to match known symbols, but since we cannot include ' in the iskeywords setting¹, symbols with single quotes are broken in this way.

Now we could avoid this problem by using syntax match instead of syntax keyword, but there is a significant performance hit because while matching syntax keyword is a simple table lookup, matching a syntax match requires a full regexp match.

My benchmarks showed that the performance hit was ~8-10x when translating to simple regexps, while the hit was about ~2x when using frak optimized regexps.

2x is pretty good, but IMO, the Clojure syntax is already a little slow, so I decided against the switch.

Names that contain ' become clojureSymbol instead of clojureFunc when using vim-clojure-highlight.

Now this is a bug! I'll have a look at it today. Thanks!

¹ That would break quoting and the #' reader macro