LoginSignup
4
5

More than 5 years have passed since last update.

Edit with Emacs(Chrome版It's All Text!的な)を使ってtextareaをVimで編集する

Last updated at Posted at 2016-05-02

Edit with EmacsというChrome拡張とローカルに立てたサーバを使って、textareaをエディタで編集できるようにする。

MacとVimを使った設定方法を書いていくが、Windowsと他のエディタでもできるはず。

まずEdit with Emacs - Chrome ウェブストアにある拡張をインストールする。
次に、pythonで書かれたedit-serverをgit cloneする

しかし、これだと日本語を適切に扱ってくれないので、修正した

を使うか、

のように修正する。

edit-serverはデフォルトでエディタはgvim -fを使い、ポート番号は9292を使う。このままでいいなら

$ /path/to/edit-server

で起動する。ここでedit-serverはディレクトリではなくリポジトリに入っているファイル。起動時に

WARNING: env_importer not loaded - filters disabled

がでるが、これは気にしなくていい。

起動したら、textareaの右下にあるeditボタンを押せば、gvimが立ち上がり編集可能となり、保存すると内容がtextareaに反映される。fileencodingがutf-8でないと気はutf-8に変更しよう。

set fileencoding=utf-8

gvim以外を使いたい場合は環境変数EDIT_SERVER_EDITORを変更する。PATHに入っているか、絶対PATHで設定する必要あり。

--portでポート番号を変更することもできる。ポート番号を変更する場合はEdit with EmacsのオプションのConfigurationのポート番号も合わせて変更する。

エディタをemacsclient、ポート番号9293を使う例。

$ EDIT_SERVER_EDITOR='emacsclient' /path/to/edit-server --port 9293

ここでemacsを例にあげたが、emacsの場合はelispで設定できるのでedit-serverは必要ない(EmacsWiki: Edit with Emacs)。

また、エディタの立ち上げ方法はEdit with Emacsのオプションで幾つか設定できる。

PC起動時に有効にする

毎回コマンドラインからedit-serverを立ち上げるのは面倒なので、LaunchAgentsを設定をする。

~/Library/LaunchAgents/edit-server.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
   <dict>
        <key>Label</key>
        <string>edit-server</string>
        <key>ProgramArguments</key>
        <array>
            <string>sh</string>
            <string>-c</string>
            <string>
                export EDIT_SERVER_EDITOR="/Applications/MacVim.app/Contents/MacOS/gvim -f";
                python
                $HOME/src/github.com/tmsanrinsha/edit-server/edit-server
            </string>
        </array>
        <key>OnDemand</key>
        <false/>
        <!-- <key>StandardOutPath</key> -->
        <!-- <string>/Users/tmsanrinsha/logs/edit&#45;server.log</string> -->
        <!-- <key>StandardErrorPath</key> -->
        <!-- <string>/Users/tmsanrinsha/logs/edit&#45;server&#45;err.log</string> -->
    </dict>
</plist>

環境変数を設定するためにsh -cで囲んでいる。以下のコマンドを実行しているのと同じ。

$ sh -c "export EDIT_SERVER_EDITOR=\"/Applications/MacVim.app/Contents/MacOS/gvim -f\"; python $HOME/src/github.com/tmsanrinsha/edit-server/edit-server"

gvimがPATHに入ってないようなので、絶対パスで指定している。$HOMEは使えるようだ。
StandardOutPath, StandardErrorPathはデバッグ用。うまくいかない時はここのコメントを外す。ファイルパスの部分は自分の環境に合わせる。ここでは$HOMEなどの環境変数は使えない。

$ launchctl load ~/Library/LaunchAgents/edit-server.plist

で設定を読み込む。editボタンでgvimが立ち上がるかを確かめる。成功している場合は次回からはPC起動時にedit-serverが立ち上がる。

立ち上がらない場合はedit-serverのプロセスの確認や、ログの確認などを行う。

プロセスがない場合は起動時に失敗している可能性がある。sh -c ...のコマンドを直接実行して失敗しないか、xmlの書き方が間違ってないかを確かめる。xmlのチェックは

$ plutil -lint  ~/Library/LaunchAgents/edit-server.plist

でできる。xmlの変更を行った場合はunloadしてからloadする。

$ launchctl unload ~/Library/LaunchAgents/edit-server.plist
$ launchctl load ~/Library/LaunchAgents/edit-server.plist

補足

pythonのエンコード

元々のコードだと

UnicodeDecodeError: 'ascii' codec can't decode

がでた。

self.wfile.write(contents.encode('utf-8'))

という箇所で失敗している。

.encode('utf-8')はunicode文字列をutf-8でエンコードしたstr文字列に変換するメソッドだが、contentsがstr文字列なため(これはtype(contents)で確認した)pythonが良きに計らって、unicode文字列型に変換しようとし、デフォルトのasciiでデコードしようとして失敗しているようである。contentsは元々utf-8でエンコードされたstr文字列なのでこの変換はいらず、

self.wfile.write(contents)

でうまくいく。

以下を参考にした。

.pyc

修正する仮定で.pycというキャッシュファイルができて、うまく反映できなかった。.pycファイルを作成させない方法メモ - かせきのうさぎさんによると-Bオプションを使うと、.pycを作らなくなるので、つけて修正していた。

$ python -B /path/to/edit-server

[python] 細かすぎて伝わりにくい、Pythonの本当の落とし穴10選 | 私の小岩ホッチキスによるとタイムスタンプが.pyのタイムスタンプが更新されていたら、再度.pycを作り直すらしいが……。

LaunchAgentsでの環境変数の設定

LaunchAgentsの環境変数の設定はHowTo: Set an Environment Variable in Mac OS X - launchd.plist - Dowd and Associatesに書いてある方法で設定が可能で、$ launchctl loadした後はうまくいったが、PCを再起動するとうまくいかなくなった。plistの読み込み順に問題があるのかも。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5