Blog

Published on

RSS

CotEditorでPython PEP8チェック

CotEditor
CotEditor

最近Pythonを書く人になったので、色々CotEditorのPython周りを整えています1。ということで表題の通り、CotEditorで開いてるファイルをPythonの推奨コーディングスタイルであるPEP8のチェックにかけるCotEditorスクリプトを書きました。

あ、ちょっと、「CotEditorユーザだけどPythonなら関係ないや」なんて帰らないで! このポストの後半で、このスクリプトのソースを使ってCotEditorスクリプトを書くTipsをついでに共有したいと思ってます。

Check PEP8

PEP8の結果が表示されたCotEditor Script Error Window
CotEditorのスクリプトエラーウィンドウに結果を出力

ともあれ先にこのスクリプト自体の説明。

実行するとCotEditorのスクリプトエラーウィンドウに、ファイル名とともにCotEditorの最前面のウィンドウのPEP8テスト結果を出力します。メニューバーから実行できてわざわざターミナルに行かなくてもいいから便利。

当サイトのCotEditor用マクロ配布ページからダウンロードできます。インストール方法もこの配布ページを見て下さい。

パスの設定

このスクリプト、たぶん環境によって違うのでPEP8へのパスを合わせる必要があります。スクリプトの頭のところに PEP8 っていう変数があるので、そこにPEP8へのパスを入れて下さい。単に 'pep8' でもいいかもしれません。わからない人はTerminalで which pep8 って入れればわかります。そもそもpep8が入っていない人はそれを(というかpytestを)インストールするところから始めて下さい。Mac OS Xには標準では入っていません。でもPython書くなら入れといた方がいいと思います。

  1. reSTのシンタックス定義とかiniのシンタックス定義とか。

CotEditorスクリプトのTips

後半は最初に書いた通りCotEditorスクリプトを書く上でのTips。

普段私が書くCotEditorスクリプトはAppleScriptが多いですが、今回はPythonで書きました。ほかのスクリプトで使っても便利な手法だと思うので、CotEditorスクリプトを書こうと思ってる人への知識共有として今回のスクリプトのポイントを2つほど。

そんな長いスクリプトじゃないのでひとまず全部載せてみます。どうせgistにあるからgistからそのままembed→と思ったんだけどなぜか貼れなかった。

#!/usr/bin/env python

"""PEP8 check script for CotEditor

Check Python source code of the current document on CotEditor with pep8.
This is a CotEditor script.
"""

__version__ = '1.0.1'
__date__ = '2013-02-07'
__author__ = '1024jp <http://wolfrosch.com/>'
__license__ = ’Creative Commons Attribution-NonCommercial 3.0 Unported License’

import os
import sys
from subprocess import Popen, PIPE

# setting -----------------------------------------------------------

# path to pep8
PEP8 = '/usr/local/bin/pep8'


# main --------------------------------------------------------------

# osascript to get filepath of CotEditor document
get_filepath_osa = """
tell application "CotEditor"
    return path of front document as Unicode text
end tell
"""


def run_osascript(script):
    """Run osascript."""
    p = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE)
    stdout, stderr = p.communicate(script)

    return stdout.rstrip()


def main():
    # get filepath of the front document
    filepath = run_osascript(get_filepath_osa)

    # check pep8
    results = Popen([PEP8, filepath], stdout=PIPE).stdout

    # write results to CotEditor's script errors window
    sys.stderr.write('pep8-> ' + os.path.basename(filepath) + '\n')
    for line in results:
        sys.stderr.write(line.split(':', 1)[-1])


main()
Check PEP8.py

AppleScriptを埋め込む

CotEditorのスクリプトはAppleScript以外にもシェル, Perl, PHP, RubyそしてPythonなどさまざまな言語で書けますが、AppleScriptとそれ以外ではできることが大きく違います。大まかに言うと、AppleScriptだとCotEditorの様々な情報にアクセスできるのにたいして、それ以外の言語の場合はCotEditorの最前面ドキュメント上のテキストデータしか受け取ることができません。

なのでAppleScirptの方ができることの幅は広いのですが、AppleScriptはちょっと癖があると思うし、たぶん使用人口もそれ以外に提供されてる言語よりは少ない。そこで今回は基本的には自分の好きな言語でCotEditorスクリプトを書いて、使いたいとこだけAppleScriptでおいしいとこ取りしようという作戦。

要はAppleScriptをosascriptとしてコマンドラインで実行してその戻り値をPythonで頂いてその後の処理をしています。今回の場合はCotEditorの最前面のドキュメントのファイルパスを頂く、というのをAppleScriptでやってます。ヒアドキュメント的なもの(正確には違うけど)でAppleScriptの関数をまるごと書いてます。今回はPythonで書いたのでPythonでの書き方ですが、まぁ他の言語でもそれぞれできることでしょう。興味があったら調べて下さい。とくにファイルパスを拾えるとその後の処理の幅が広がると思います。

ちなみに本スクリプト中でget_filepath_osaの中に入ってるのは、CotEditorのウィンドウがあったら最前面のパスを拾って返す、という関数です。もしよろしければどうぞ。

CotEditorのエラーウィンドウに出力する

PEP8の結果が表示されたCotEditor Script Error Window
CotEditorのスクリプトエラーウィンドウ

CotEditorはスクリプトエラーウィンドウというモノを持っています。名前のとおり、スクリプトのエラーを出したりするウィンドウなのですが、今回はここにPEP8の結果を出しました。CotEditorスクリプトとして実行されたスクリプトとから標準エラー出力にテキストデータを投げれば、自動的にCotEditorのスクリプトエラーウィンドウに行きます。Pythonなら sys.stderr.write() で。結果とCotEditorドキュメントを見比べやすいし、スクリプトのちょとした結果を返すのに便利なウィンドウです。ちょっと字が小さいけど(変えられないのかなぁ、これ...)

ちなみにAppleScriptからCotEditorのスクリプトエラーウィンドウに投げるのはうまくいかなかったのでもしやり方知ってる方がしたら教えて下さい。

CotEditorスクリプトのマニュアル

あともう1つさらに基本的な知識として、CotEditorスクリプトのマニュアルはCotEditorに付属しています。CotEditorメニューバーのスクリプトマークから「スクリプトフォルダを開く」を選択すれば、そのフォルダの中にマニュアルが見つかると思います。スクリプトフォルダについて、AppleScriptについて、その他のスクリプトについて (AboutShellScript) とそれぞれあります。

CotEditorスクリプトは普段使ってる言語で簡単に書けるので自作すると便利だよ。

Comment

leave your comment