4

基本的に、私は次のコーヒースクリプトコードを思い通りにシンタックスハイライトしようとしています。Coffeescript関数の構文の説明はここにあります。

nameHere = (tstamp, moo, boo) ->
    ...

tstamp、moo、およびbooの名前は、ラムダ関数のパラメーターであるため、ピンク色にする必要があります(コンマや角かっこではなく、他には何もありません)。

highOrderFun ((x) -> x * x) someList

ここで、パラメータである最初のxです。パラメータにはデフォルトの引数を設定できます。

class Foo
    meth: (msg = "Hello", bar = "foo") ->
        ....

デフォルトの引数は、それ自体が変数にすることができます。

defColor = "red"
print = (msg, color = defColor) ->
    ...

したがってmsgcolor上記は強調表示する必要がありますが、強調表示しないでdefColorください。さらにトリッキーなケースは、それ自体が関数であるデフォルトの引数を持つ関数です。emacsのフォントロックを正しく強調表示するのは難しいと思いますが、とにかくそれを含めています:

funTakingFuns = (f1 = ((a, b) -> a*b), f2 = ((c, d) -> c/d)) ->
    ...

ハイライトをコンテキストに依存させたいので、これをemacsで実現するのはかなり複雑に見えます。フォントロックに関するドキュメントを読みましたが、理解できませんでした。

font-lock-defaults誰かが私が望むように構文を強調するために何を設定するかを教えてくれたらありがたいです。

より多くのcoffeescript構文例を表示する更新。

4

2 に答える 2

8

font-lock-keywordsMATCHERフィールドで関数値を許可します。

ここでMATCHER、検索する正規表現、または検索を行うために呼び出す関数名のいずれかを指定できます(1つの引数で呼び出され、検索の制限。成功した場合は、非nil、移動ポイントを返し、match-data適切に設定する必要がありますre-search-forward。 )。

したがって、バッファ内の次の関数の引数を検索する関数を作成する必要があります。

このようなもの:

    (defun coffee-match-next-argument (limit)
      (let ((start (point)))
        ;; Look for the arrow.
        (when (re-search-forward ") *->" limit t)
          ;; Save the position of the closing paren.
          (let ((stop (point)))
            (goto-char (match-beginning 0))
            ;; Go to the opening paren.
            (goto-char (nth 1 (syntax-ppss)))
            ;; If we're before our initial position, go forward.
            ;; We don't want to find the same symbols again.
            (when (> start (point))
              (goto-char start))
            ;; Look for the next symbol until the arrow.
            (or (re-search-forward "\\((\\|,\\) *\\(\\(\\sw\\|_\\)+\\)" stop 'mv)
                (coffee-match-next-argument limit))))))

そして、既存のもので使用するためのセットアップcoffee-mode

(font-lock-add-keywords
 'coffee-mode
 '((coffee-match-next-argument 2 font-lock-variable-name-face)))

もちろん、これも使用できますfont-lock-defaults

これはおそらくピンク以外の色を使用しますが、それは簡単に変更できます。

于 2013-02-03T18:09:20.907 に答える
2

これは一種のハックであり、最適とはほど遠いですが(私はコーヒースクリプトにまったく精通していないため)、おそらく少し調整すれば、これを実行できます。

すべての材料がそこにあります。

コマンド/関数のトリガーは、を使用するという前提に基づいていますcoffee-mode。そうしない場合、これは大きな問題ではありません。これらのものを別の方法でフックする必要があります。

次の行を入力してください.emacs

(eval-after-load 'coffee '(load "/PATH/custom-coffee-font-lock.el"))

以下のテキストをファイルとして保存するだけで、次のようになります。

(1)トリガー時のフォントロックcoffee-mode

>(2) 「->」の一部として「」を入力した場合のフォントロックの現在の行

(3)実行してバッファをフォントロックできるようにするM-x coffee-init-font-lock

;;;; custom-coffee-font-lock

;; Firstly, create a new font for this. 

(make-face 'font-lock-coffeescript-face)
(set-face-foreground 'font-lock-coffeescript-face "pink")


;; Next, one function that should be ran after a file is identified as 
;; a coffeescript file. It will do the font-locking you want on 
;; the whole buffer. It is also possible to run it manually. 


(defun coffee-init-font-lock ()
  (interactive)
  (save-excursion 
    (goto-char 1)
    (while (search-forward-regexp "=.+->" nil t)
      (search-backward-regexp "(")
      (forward-char 1)
      (add-text-properties 
       (point) (- (search-forward-regexp "," nil nil) 1) 
       '(font-lock-face font-lock-coffeescript-face))
      (add-text-properties 
       (point)  (- (search-forward-regexp "," nil nil) 1) 
       '(font-lock-face font-lock-coffeescript-face))
      (add-text-properties 
       (point)  (- (search-forward-regexp ")" nil nil) 1) 
       '(font-lock-face font-lock-coffeescript-face))
      (move-end-of-line 1)))
  )

  ;; This actually runs that function.
  (coffee-init-font-lock)


;; This advice will be ran everytime you write something. It will check 
;; whether "->" is before it, so when you type the final ">", it will
;; do the font locking for the current line (it also checks for your mode).

(defadvice self-insert-command (after coffee-font-lock activate)
  (when (and (looking-back "->") (eq major-mode 'coffee-mode))
    (save-excursion 
        (search-backward-regexp "(")
        (forward-char 1)
        (add-text-properties 
         (point)  (- (search-forward-regexp "," nil nil) 1) 
         '(font-lock-face font-lock-coffeescript-face))
        (add-text-properties 
         (point)  (- (search-forward-regexp "," nil nil) 1) 
         '(font-lock-face font-lock-coffeescript-face))
        (add-text-properties 
         (point)  (- (search-forward-regexp ")" nil nil) 1) 
         '(font-lock-face font-lock-coffeescript-face))))
  )

(provide 'custom-coffee-font-lock)
;;; custom-coffee-font-lock.el

ご要望がございましたら、お知らせください。私が言ったように、私はCoffeeScriptを使用しないので、これはあなたの方法で巨大なエラーを投げるかもしれません。少なくとも、それはいくつかの基本的なアイデアに役立つはずです。

結果:

ここに画像の説明を入力してください

于 2013-02-03T16:20:00.450 に答える