Python + CotEditorでテキスト処理 1
そもそもなぜPythonを触ろうかと思ったかというと、普段使っているCotEditorがスクリプト機能を持っているからです。
やっぱり、手になじんだで処理の自動化が進められたら嬉しいですよね。というわけで、一つの目標地点が、CotEditorでの処理をPythonで自動化することなので、いきなりそこにトライしてみましょう。
ちゃんと、サンプルが示されているので、その通り進めれば大丈夫なはずです。
まず、上のコードをそのままコピペして、エディタに貼り付けます。
ファイルの名前はなんでもいいので、拡張子を.pyに。でもって、そのファイルを、「ライブラリ」にある「Application Scripts/com.coteditor.CotEditor」というフォルダにコピーします。このフォルダは、CotEditorのメニュー「スクリプト」→「スクリプトフォルダを開く」からたどり着けます。
これでメニューの「スクリプト」を覗いてみると、きちんと「test」が追加されています。
で、このスクリプトは、「最前面書類の選択範囲内のすべての行の行頭に“>”を追加します。」らしいので、何かテキストを選択した状態で、このスクリプトを実行してみます。
すると以下のようなエラーが。
どうやら、このファイルに「実行権」というのを与えなければならないようです。
で、調べてみるとターミナルでそれを付与できるようです。
ただ、なんとなくメンドーそうなのでもうちょっと調べてみると、CotEditorならファイルの保存時に実行権を付与できるとのこと。
ちなみに CotEditor は、ファイルを保存するタイミングで実行権を付与できて便利だ。
なるほど、と思いファイルを新規作成して、同じコードをコピペして、「保存」を押してみると、たしかに「実行権を付与」の文字が。
これにチェックを入れてファイルを保存し、あとは先ほどと同じ手順で、スクリプトフォルダに保存して、スクリプトを実行してみると、
選択した三行の行頭に「>」が自動的に追加されることが確認できました。まずは、第一段OKです。あとは、このコードをアレンジしていけば、自分が望むことがいろいろできるでしょう。
そこに進む前に、まず今回のコードを確認しておきます。
#!/usr/bin/env python
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
import sys
for line in sys.stdin:
print(">" + line.rstrip())
一行目は、pythonの指定でしょう。二行目と三行目はCotEditorのヘルプにあった文章なので今回はスルーします。
四行目の「import sys」は、sysという「ライブラリ」を取り込むための命令で、おそらく次の行に出てくる「sys.stdin」を実行するために必要なのでしょう。
で、その「sys.stdin」がなんなのかをググってみると、標準入力らしいです。
で、その「標準入力」というのは、先ほどのCotEditorのヘルプにも登場していました。
「CotEdiotrからのテキストは標準入力に渡されます」とあるので、この場合は、テキストエディタ上で選択してあるテキストがその標準入力というものに入っているのでしょう。
ふ〜ん。
まあ、こういうのはあんまり考え込んでも仕方がありません。「そういうもんだ」と思って話を進めます。
for line in sys.stdin:
print(">" + line.rstrip())
「for」は繰り返しのための命令で、先ほどのsys.stdin(標準入力)から、項目を一個一個取り出し、それを「line」という箱に入れていけ、となっています。
その箱についての具体的な処理は、インデント付きの次の行で示されていて、次の三つの要素で成立しています。
print():カッコの中身をプリントせよ
">":「>」という文字列
line.rstrip():「line」の箱に入っている文字列の末尾部分を除去せよ
で、その結果が先ほどの画面なわけです。
なんとなく、三つ目の文の役割がちょっとわかりませんね。そういうときは、そこを取り除いて実行してみるのが吉です。
ほいっ。
あらら、改行が一つずつ増えちゃいましたね。つまりこの改行を取り除くのが、line.rstrip()の役割ということですね。
原理的に考えてみると、もともとのテキストの最後に「改行」が入っており、さらにそれを一行ごとに「プリントせよ」と命令していて、その命令にも改行があるのでしょう。だから改行が重なってしまう。それを取り除くための処置なのだと推測されます。
なるほど。これでだいたいの仕組みは理解できました。次回はこれを少しアレンジしてみます。
(つづく)