Skip to content
2011/04/16 / highmt

emacs で javascript を整形する

環境:
GNU Emacs 23.2.1 (i386-mingw-nt6.1.7601)

emacs上での javascript 編集環境といえば js2-mode なわけですが、
整形コマンドが見当たりません。

というわけで以下で。
といっても
javaプロパティファイルを変換するconf-javaprop-mode拡張
とおなじことをやるだけです。
なので、タイトルに偽りがあって emacs から 単に整形コマンドを呼ぶだけです。
おなじことやるんならマクロかけという話もあるんですが手抜きです。情けない。

  1. jsbeautifierを入手。
    https://github.com/einars/js-beautify
  2. jsbeautifier.pyを呼ぶスクリプトをつくる。
    自分のemacsは、
    (setq shell-file-name “sh”) な環境なので、
    な環境なので、

    #!/bin/sh
    python c:/js-beautify/jsbeautifier.py "$@"
    

    とか。

  3. js-beautify を emacs から呼び出す本体をつくる。
    ;;; js-beautify.el
    
    (defcustom js-beautify-jsbeautifier-path "jsbeautifier"
      "js-beautify jsbeautifier command path."
      :type 'string
      :group 'js-beautify)
    
    (defcustom js-beautify-jsbeautifier-option "-i"
      "js-beautify jsbeautifier command option."
      :type 'string
      :group 'js-beautify)
    
    (defvar js-beautify-mode-map
      (let ((m (make-sparse-keymap)))
        (define-key m "\C-cc" 'js-beautify-convert-buffer)
        (define-key m "\C-cr" 'js-beautify-convert-region)
        m))
    
    
    (defun js-beautify-convert-region-to-1 (rev start end buff)
      (let ((command (concat js-beautify-jsbeautifier-path " " js-beautify-jsbeautifier-option)))
        (save-excursion
          (shell-command-on-region start end command buff nil "*js-beautify-error*" t))))
    
    (defun js-beautify-convert-region-to (rev start end buff)
      (let ((coding-system-for-read 'japanese-shift-jis-dos)
            (coding-system-for-write 'japanese-shift-jis-unix))
        (js-beautify-convert-region-to-1 rev start end buff)))
    
    (defun js-beautify-convert-region-to-buffer (rev start end)
      (interactive "P\nr")
      (js-beautify-convert-region-to rev start end (get-buffer-create "*js-beautify*")))
    (defun js-beautify-convert-buffer-to-buffer (rev)
      (interactive "P")
      (js-beautify-convert-region-to-buffer rev (point-min) (point-max)))
    
    (defun js-beautify-convert-region (rev start end)
      (interactive "P\nr")
      (js-beautify-convert-region-to rev start end t))
    (defun js-beautify-convert-buffer (rev)
      (interactive "P")
      (js-beautify-convert-region rev (point-min) (point-max)))
    
    (add-hook 'js2-mode-hook
              (lambda ()
                (let ((m (copy-keymap js-beautify-mode-map)))
                  (set-keymap-parent m js2-mode-map)
                  (use-local-map m))))
    
    (provide 'js-beautify)
    

    一応revが指定できるみたいに書いてありますが rev はなんの役割も果たしてません。
    前回のjprop.elをそのまま使って手抜きしてるだけです。
    自分の環境は (setq default-process-coding-system ‘(utf-8-dos . japanese-shift-jis-unix ))
    というちょっと変則的な環境なのでエンコーディングを明示してたりします。
    あと、js2-modeを前提としてたりします。

とここまで書いて、こんなおおげさなことをしなくても
M-| で ふつうに shell-command-on-region で jsbeautifier を呼べばいいんだよなー
と思ったのは内緒です。windows はパスとかいろいろ面倒なんです。

広告
%d人のブロガーが「いいね」をつけました。