Asial Blog

Recruit! Asialで一緒に働きませんか?

emacsを少し便利に使う設定

カテゴリ :
バックエンド(インフラ)
タグ :
Tech
Emacs
今回は、自分が.emacsに追加してちょっと便利になったスクリプトを公開したいと思います。

自分はアシアルで唯一emacsを使っていますが、なぜか社内では「エディタと言ったらvimの事だよね?えまくす()」という風潮になっており、不人気どころか存在が無いエディタですが、vimと同じく"慣れれば"便利なエディタです。
もし、vimの方が一方的に優れていたらemacsや他のエディタは消滅しているはずなので、どちら使うかは個人の趣味です。

話がそれました。つまりは好き嫌いせずに一度使ってみてください。

さて、では早速本題の方へ行きましょう。

1・tramp


リモートサーバののファイルを編集することが出来ます。
ローカルの環境から直接編集することが出来るので、いちいち.emacsをコピーや、環境の違いに悩まされません。
C-xC-fでファイルを開く時に、下記のように入れてやれば使うことが出来ます。
  1. /ssh:10.0.0.1:
  2. /ssh:www@10.0.0.1: ;もちろん、ユーザ名を入れることも出来ます
あとはリモートサーバでemacsを開いたように使えます。
さらに、shell-commandもリモートに送ってくれる優れもの。
例えば、M-!で、php -l をしたらリモートのphpを実行してくれます。

さて、次に踏み台サーバを経由しないとアクセス出来ないサーバのファイルを編集する場合には、.emacsに下記のように追記すれば踏み台サーバも問題なく使えます。
  1. (add-to-list 'tramp-default-proxies-alist
  2.              '("192.168.1.1" nil "/ssh:10.0.0.1:"))
上記は192.168.1.1サーバに入るには、10.0.0.1に入ってから接続しろという設定。
で、下記のように普通に接続すればOKです。
  1. /ssh:192.168.1.1:
trampはsshがつながる範囲ならどこでも接続出来ます。便利ですね。

実は、ログイン後にsudoやsuすることも出来ます。
192.168.1.1にてrootユーザにsudoする場合には下記のように追記します。
  1. (add-to-list 'tramp-default-proxies-alist
  2.              '("192.168.1.1" "\\`root\\'" "/ssh:192.168.1.1:"))
192.168.1.1のrootになるには、192.168.1.1に入れという命令です。

  1. /sudo:192.168.1.1:
上記のように、/sudo:を指定してやれば接続後sudoしてくれます。

※なお、上記の設定は~/.ssh/configを設定してssh側で解決しても似たようなこと出来ます。


2・after-save-hook


ファイルをセーブした時にプログラムを実行出来るので、セーブと同時に実行できたら便利な機能を書いておくといいと思います。
先程のtrampと組み合わせると便利に使えます。

■ 構文チェック
下記のようにすれば保存した時にphpの構文チェックをして、エラー行を出してくれます。
要は、shell-commandでphp -lを実行しているだけですが。
  1. (add-hook 'after-save-hook
  2.   '(lambda ()
  3.              (when (buffer-file-name) ;; 念のためファイル名があるかチェック
  4.        (and (string-match ".php" (buffer-file-name)) ;; ファイル名がphpで終わっていたら
  5.        ;; php -l を実行してエラー行のみ取り出す
  6.     (shell-command (concat "php -l `basename '" (buffer-file-name) "'` 2>&1 | grep 'on line ' | grep -v ' in Unknown on line '")))
  7.                )))

構文チェックだけなら、もっと便利なflymakeもありますが、今回は割愛でします。

■ nginx再起動
開発環境で頻繁にnginxの設定を変更するとします。
毎回編集後に再起動するのが面倒なので、/etc/nginx/nginx.confを変更したあと即再起動させる場合。
  1. (and (string-match "/etc/nginx/nginx.conf" (buffer-file-name))
  2.   (shell-command "/etc/init.d/nginx restart"))
これだとどのサーバでも再起動させてしまうので、
  1. (string-match "host:/etc/nginx/nginx.conf" (buffer-file-name))
上記ののようにホスト名書いておくと安心かもしれません。

3・change-major-mode-hook


メジャーモードが変更された時に呼ばれます。

bgex-patch( http://umiushi.org/~wac/bgex/ )と組み合わせて、特定のサーバに接続したときはこの壁紙を表示とか書いておくと壁紙で違いがわかるため、間違いが少なくなるかもしれません。

  1. (add-hook 'change-major-mode-hook
  2.   '(lambda ()
  3.  (when (buffer-file-name)
  4.    (setq imagepath nil)
  5.    (when (string-match ":192.168.1.1:" (buffer-file-name))
  6.  (setq imagepath "~/.termwallpaper/2284956.jpg"))
  7.    (when imagepath
  8.  (condition-case err
  9.  (when (bgex-set-image (buffer-name) 'bgex-identifier-type-buffer-name imagepath))
  10.    (error (message "my error"))))
  11. )))

その他、便利なhook設定はたくさんありますので、ぐぐってみてください。

3・その他


細々便利だと思った設定の紹介です。

metaタグの内容で文字コードを自動判別しないように設定
htmlを開いた時にmetaタグの中身などをみて自動で文字コードを判別してくれる機能がありますが、
古いwebシステムを変更する場合、metaタグと実際の文字コードが違うことがよくあるので、全部無視します。
  1. (setq auto-coding-functions nil)

/android/を含むディレクトリの場合は、F5を押すと自動でantを実行してくれるプログラム。
  1. (defun andrcompile ()
  2.   (interactive)
  3.   (or (and (buffer-file-name)
  4.    (string-match "\\(^.*/android/.*?/\\)" (buffer-file-name))
  5.    (setq compile-command (concat "cd " (match-string 0 (buffer-file-name)) ";"
  6.  "ant -emacs clean s-deploy;"
  7.  ))
  8.    (compile compile-command)
  9.    )
  10.   (message "Faild"))
  11.   )
  12. (global-set-key (kbd "") 'andrcompile)

4・まとめ


要は、elispさえ使えれば便利なhookやコマンドを作成出来るという紹介でした。
少しコードを書くだけで面倒な処理を解決できるのでぜひカスタマイズしてみてください。
せっかく目の前に高性能なコンピュータがあるのに、それを使わないのは損以外の何者でも無いので。

おまけ
vim使っている人ならvimscriptとかpythonでもカスタマイズ出来ます。
あと、自分はemacsファンではありますが、vimアンチでは無いので。