2012-02-11 16 views
4

私はこの素晴らしいjs2モードをforkと一緒に使用していますが、オートアートと一緒にEmacsでJavascriptをすばらしく編集できます。しかし、js2-modeは完全なパーサであるため、関数呼び出しのコンテキストではいつでも自動的にセミコロンを挿入することが可能でなければならないことが私には分かります。Emacs:自動的にjs2モードでセミコロンを挿入することは可能ですか?

あまりにも深く掘り下げる前に誰かがこれを調べているかどうか尋ねると思いました。ここで

+0

「関数呼び出しコンテキスト」とはどういう意味ですか?関数の内部?例えば、リターン\ n {...} 'の' return'の後ろにセミコロンを入れたいのかどうか、どうすれば分かりますか? –

+1

ここではすべてのコーナーケースをカバーする必要はありません。私が 'fooFunc(' ");を呼び出すと、自動的に挿入されますが、 'function('、 'only')を宣言すると挿入されます。 –

+0

私はこれを解決し、時間がたつとgithubプロジェクトとして投稿します。それはよく機能し、コーナーケースは耐えられません。 –

答えて

3

はこれを解決し、私のコードです:

le-js2-mode-setup-partial.el
(defvar js2-semicolon-contexts (list js2-NAME js2-LP js2-SCRIPT js2-CALL js2-BLOCK)) 
(defun autopair-js2-maybe-insert-semi-colon (action pair pos-before) 
    "handler for automatically inserting semi-colon at the end of function call. 
" 
    ;; (message "node before is %s" (js2-node-type (js2-node-at-point (- (point) 1)))) 
    ;; (message "action is %s" action) 
    ;; (message "pair is %c" pair) 
    ;; (message "context is %s" (buffer-substring-no-properties (point-at-bol) (point-at-eol))) 
    ;; (message "point is %s" (point)) 
    (cond ((and (eq action 'opening) 
       (eq pair ?\)) 
      (save-excursion 
       (goto-char pos-before) 
       (skip-chars-backward " \t") 
       ;; (message "node is %s." (js2-node-type (js2-node-at-point (point)))) 
       (memq (js2-node-type (js2-node-at-point (point))) js2-semicolon-contexts) 
       )) 
     (save-excursion 
      (let ((forward-sexp-function nil)) 
      (goto-char pos-before) 
      (forward-sexp)) 
      (if (looking-at-p "[^[:graph:]]*$") 
      (insert ";")))))) 

;;;###autoload 
(defun le::js2-mode-setup() 
    (setq autopair-handle-action-fns 
     (list #'autopair-default-handle-action 
       #'autopair-js2-maybe-insert-semi-colon)) 
    (rebox-mode 1) 
    (le::prog-modes-setup)) 
;;;###autoload(add-hook 'js2-mode-hook 'le::js2-mode-setup) 

あなたはまた、this GitHub Gistから、このコードを取得することができます。

+0

work.js2-NAMEは無効です。 –

関連する問題