sshfsで編集しているリモートファイルをemacsのflymakeにかける

flymakeはemacsでコードを書いているときにミスを教えてくれる,emacsの素晴しい機能です.emacsでミスを教えてくれるflymakeをC++のために使うための設定 - suztomoの日記

sshfsは,リモートにあるファイルをあたかもローカルにあるかのように編集できるようにする仕組みです.sshfsを使うときflymakeを使おうとするとあちらとこちらでマシンの環境が違ったりしてエラーが出ることがあります.例えば手元がMacでリモートがLinuxのとき,linux/user.hのヘッダファイルが手元のMacにないので正しいのにエラーが表示されることがあります.

そこで,「ローカルでコンパイルした結果がいけないんだから,リモートでコンパイルすればいいんじゃね」と昨晩ある方法を考えついたのでやってみました.

例えば,リモートの~/projectというディレクトリをsshfsでローカルにマウントし,その中のファイルをemacsで編集しているときを考えてみます.flymakeがソースコードのチェックに使うproject/Makefileのsyntax-checkの部分に,通常は

check-syntax:
        $(CC) -o /dev/null $(CFLAGS) $(INCLUDEDIR) -S ${CHK_SOURCES}

とあるのを

check-syntax:
	ssh suztomo@machine1 "cd ~/project; CHK_SOURCES=${CHK_SOURCES} make check-remote-syntax"

check-remote-syntax:
	$(CC) -o /dev/null $(CFLAGS) -S ${CHK_SOURCES}

とすれば,flymakeがチェックを走らせる際にsshでリモートにログインして特定のファイルをコンパイルし,その結果をflymakeの結果に使うことができます.もちろんパスワードがかかっていない鍵認証などが必要です.

ローカルへ保存するときより反応が遅くなりますが,Emacsで書いて,ターミナルに移ってコンパイルして...ということがなくなるので快適になるはずです.

昨晩思いついて今日やってみて,とりあえず動いたのでまとめてみました.