StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

CotEditor(テキストエディタ)上の選択範囲をタグで囲むショートカットをPythonで書く

Macでテキストエディタを使うならCotEditorがいいと昔から思っているのですが、CotEditorには、ショートカットの処理とか、あるいは編集中のテキスト上にファイルをドラッグ&ドロップしたときに自動的にテキストを入力するような処理を、自分で追加していける機能があります。
今回、選択範囲をで囲むショートカットをPythonで書いて、追加してみました。
単にHTMLのタグを入れたいだけなら、ふつうに入力支援機能のあるエディタを使えばいいですが、スクリプトを自分で書けるといろいろ柔軟なショートカットを設定できますね。
やりたいことはすごい簡単なのに、ネットでパッとわかる資料がなかったのでメモしておきます。

CotEditorのスクリプト機能

ちなみに、ショートカットでカーソルの位置に文字列を挿入するだけの処理なら、CotEditorの「環境設定」→「キーバインド」→「スニペット」で設定できるのですが、「文字列をタグで挟む」といった複雑なことはできないようです。
スクリプトの機能だと、bashやPythonやJavaScriptなどで書いたスクリプトを組み込むことができ、ショートカットキーによってそのスクリプトを起動するような設定もできて便利です。


具体的なやり方は、CotEditorのメニューの「ヘルプ」→「CotEditorスクリプトガイド」からマニュアルをみることができます。主に、

  • スクリプトメニューをカスタマイズする
  • UNIXスクリプトとの連携
  • CotEditorスクリプトのファイル名規則


といったページを見ておけばだいたいのことはわかると思います。
以下、実際にやってみます。

スクリプトを書く

まずスクリプトを書きますが、上記のマニュアルに書いてあるように、スクリプトの冒頭には、

  • python(インタープリタ)の置き場所
  • このスクリプトにやらせたい仕事は何なのか


をコメントで宣言してあげる必要があります。
たとえば今回書いたのは以下のようなスクリプトなんですが、

#!/usr/bin/env python
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%

import sys
selected_text = sys.stdin.read()
output_text = '<B>' + selected_text  + '</B>'
sys.stdout.write(output_text )


1行目は、Pythonインタープリタの置き場所の指定です。もちろんここは「#!/usr/bin/python」とかでも動くのですが、envにしておくと、インタープリタの置き場所が違った場合(バージョン管理ツールを使っている場合など)でも適宜発見して起動してくれます(下記の記事のとおり)。
「#!/usr/bin/python」と「#!/usr/bin/env python」の違い - 座敷牢日誌


2行目は、CotEditor上で選択箇所の文字列をとってきますよ、という意味。「Selection」のところは、他にもいろいろな引数があって、マニュアルに載っています。


3行目は、選択箇所の文字列を置換しますよ、という意味。同じく、「ReplaceSelection」のところは、他にもいろいろな引数があります。


Pythonのコード自体は、標準入力経由で文字列を受け取って、適当に処理をして、標準出力でCotEditorに引き渡すという内容です。
Print関数でも引き渡せるのですが、末尾に改行が無駄に追加されてしまうので、標準出力のstdoutを使いました。
↓の記事に書いてあるように、print関数でもend引数を設定すれば末尾に改行のない状態で出力できるはずなのですが、やってみたところ、CotEditorから呼び出したときによくわからないエラーが出たので、とりあえず標準出力の関数を使っておきました。
Python Tips: 改行をうまく扱いたい - Life with Python

スクリプトを保存し、実行権限を与える

上述の内容のスクリプトを、今回は、


bolding.^~b.py


というファイル名にして、スクリプト置き場である、


~/Library/Application Scripts/com.coteditor.CotEditor


という場所に保存しました。


なお、ファイル名の「.^~b」の部分は、「control + option + B」というキー操作を意味しています。ルールはマニュアルの「CotEditorスクリプトのファイル名規則」をみればわかりますが、ファイル名内の記法によって、どのキーにスクリプトの処理を割り当てるかを指定するわけです。


そして、スクリプトを保存しただけではCotEditorからの実行権限がないので、ターミナルから、chmodで755などの権限設定を行う必要があります。

スクリプトを使ってみる

ここまでの作業を行うと、下記の画像のように、メニューのスクリプト一覧に今回つくったスクリプトが表示されます。


f:id:midnightseminar:20190815151100p:plain


ファイル名称を先程のようなルールに従って作っていなければ、ショートカットキーは割り当てられません。
その場合は、この一覧から選択することによって、スクリプトを実行することになります。


実際に文字列を選択して「control + option + B」下記のように、無事、テキストをタグで囲むことができました。


f:id:midnightseminar:20190815151224p:plain
f:id:midnightseminar:20190815151240p:plain