ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

Rubyも、Pythonも使えるOS X用テキスト処理インターフェースPopClipが熱い

      2015/12/16

強力なテキスト処理インターフェースPopClip

OS XでiOSライクなコピペメニューを再現するPopClip。

PopClipApp
カテゴリ: Utilities
販売元: Nicholas Moore(サイズ: 1.7 MB)
全てのバージョンの評価: (211 件の評価)

iOSライクというのは、テキストを選択すると自動的にメニューがポップアップしてくるという、使いやすいのか使いにくいのか判断に困るアレですね。

元祖iOSのコピペメニュー

IMG 0593

PopClipを使うと、OS XでもiOS 6までのものにそっくりのコピペメニューが!

OS X+PopClipのコピペメニュー

Skitched 20140219 004150

正直コピペはどうでもよくて、PopClipには、機能をどんどん追加できるという重要なフィーチャーがあります。ポップアップしてくるメニューの項目を増やせるのです。

こんなエントリも書きました。

これがとても気に入ったので紹介したいと思います。

Skitched 20140219 004354

一つの機能単位をアクションといいます。アクションを追加するのが機能拡張。本家は用語を使い分けていますが、本エントリではそれを同一視し、アクションで用語統一します。開発元が提供するアクションのほか、公開されているアクション開発情報を元に、有志が開発したアクションを開発元がとりまとめ、配布しています。

公式サイトで配布されているアクションには、開発元だけができる署名が添付されていて、公式認定のアクションと、署名のない非公式のアクションには、やや扱いに差がつけられています。といっても、インストール時に警告ダイアログが出るか出ないかの違いでしかありませんが。

いろいろなアクションを追加すると、もはやコピペメニューの範疇を超えて、総合テキスト処理メニューとでもいうべきものに変ぼうします。そして、これがPopClipの真骨頂です。

自分でアクションを作ると楽しい

配布されているものを使うだけでも面白く、便利なのですが、自分で俺得なアクションを作るとより楽しい。

PopClipの見た目、動作はシンプルですが、その見た目に反して、機能拡張に関係した部分は、もの凄くきめ細やかな配慮にあふれた作りになってます。GitHubにアクションの自作に導くことを目的にした仔細な説明があります。

ざっくりとした図にするとこんな感じ。

popclip 14 02 18 15 32

ほぼ自由に選べるバックエンドに選択したテキストを渡し、いろいろな副作用を起こせるというのがPopClipの正体とでもいうべきもの。こいつは痛快です。

別に選択テキストを使わなくても、カーソル位置にテキストを戻さなくてもOK。PopClipと直接関係ないスクリプトの実行も可能です。(続きは[Read More]から)

既存のアクションを改造するとアクションを自作するのが簡単

前出のアクション開発情報を見ると、仕様がそこそこ大きいのでたじろいでしまうかもしれません。

作るのが面倒臭そうですが、既存のアクションを改造すると簡単です。

既存のアクションの中身を確認すると、必要最低限の設定項目は、それほど多くないことが分かります。

公式のアクション集ページからダウンロードできる「URL Encode」。これは、選択テキストをURL Encodeするもの。

これをいじくって、自分のものにしてみます。選択テキストを加工して選択テキストを置き換えるアクションを作りたい。「URL Encode」は、それに近い動作をするということで土台に選びました。

ダウンロードした「URLEncode.popclipextz」。これをPopClipがインストールされている環境でダブルクリックする。

Skitched 20140219 014908

すると、「URLEncode.popclipextz」が元あった場所から忽然と消え、PopClipへのインストールが完了します。

Skitched 20140219 015233

「URLEncode.popclipextz」はどこへ行ったかというと、「/Users/ユーザー名/Library/Application Support/PopClip/Extensions」に移動しています。

拡張子が「popclipextz」から「popclipext」に変わっています。「popclipextz」の実体はzipファイル。それがインストール過程で解凍され「popclipext」になるのです。


中身を覗く

「popclipext」の実体はフォルダで、右クリック、Ctrl+クリックで表示できるメニュー項目「パッケージの内容を表示」から中身が見られます。

Skitched 20140219 023055

中には五つのファイルが入っていました。

Skitched 20140219 023215

  • _Signature.plist
    • 公式サイトで配布されているアクションにある署名ファイル。ユーザーが勝手に作る野良アクションには不要。ただし、正しい署名ファイルがないと、インストール時にPopClipが警告を表示する
  • Config.plist
    • アクションの動作を決定づける各種属性を記述するPlist形式の設定ファイル。設定項目についてはGitHubに説明あり
  • Percent.png
    • アイコン画像。透明png。メニューでは白で描画される部分を黒く塗りつぶします
  • README.md
    • markdown形式のREADME
  • urlencode.sh
    • 処理をするスクリプト本体。シェルスクリプト。この使用がConfig.plist中で宣言されています

urlencode.shの調査

urlencode.shはシェルスクリプト。シェバング行で、インタプリタとしてbashが指定されています。

選択テキストは環境変数POPCLIP_TEXTに入っているようで、それをperlで加工して標準出力に出しています。

標準出力に出たものが、カーソル位置に挿入されるという仕組みであることが分かります。

#!/bin/bash

echo -n "$POPCLIP_TEXT" | perl -pe's/([^-_.~A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg'

スクリプト内で参照できる環境変数はPOPCLIP_TEXTだけではありません。「Script Fields」の項を見るとそのほかのものが載っています。

POPCLIP_MODIFIER_FLAGSなんかは熱いですね。メニューを選択するときに押していた修飾キーが分かるので、数種類の動作を使い分けたい場合に便利です。

Config.plistの調査

今度は、アクションの動作を決定づけるConfig.plistを調べてみます。

plistファイルの閲覧、編集には、Xcodeが便利です。

XcodeApp
カテゴリ: Developer Tools
販売元: iTunes K.K.(サイズ: 1993.1 MB)
全てのバージョンの評価: (210 件の評価)

Root以下にActionsとCreditsのArrayがある。

Skitched 20140219 031637

Actions下のArrayに記述のある項目は以下。

キー 値
After スクリプトを実行した後の処理方法
Image File PopClip上に表示されるアイコンファイル名
Script Interpreter スクリプトを実行するインタプリタ
Shell Script File スクリプトのファイル名
Title タイトル

Credits以下は自明だと思うので割愛。

Creditsの下の四つの項目について。

キー 値
Extension Description アクションの自己説明
Extension Identifier アクションの識別子。ほかとかぶらないものである必要があるので、逆ドメイン名が推奨
Extension Name アクションの名前
Required Apps アプリのBundle IdentifierをStringのArrayで記述。特に制約をかけない場合は701のままでいい模様

ほぼ見ただけで自明のことしか書いてありません。簡単です!

指針: シェルスクリプトは面倒なのでRubyを使いたい

僕はRubyをよく使うので、bashの代わりにRubyを使うように変更したい。

たのしいRuby 第4版
たのしいRuby 第4版

posted with amazlet at 14.02.18
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 39,106

そして、Rubyを使って選択テキストを「」で囲む単純なアクションを作ろうと思います。

アクションの名前は、そうですね、Kakkoにしましょうか。

手始めに、URLEncode.popclipextフォルダをデスクトップにコピーしてきて、フォルダ名をKakko.popclipextに変えました。

Skitched 20140219 034814

例によって「パッケージの内容を表示」で中身をいじります。

_Signature.plistは不要なので削除。

Config.plistはこうなりました。

Skitched 20140219 035248

kakko.rbはこうなりました。エンコーディングはutf-8。

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
$KCODE = 'u'

clip = ENV['POPCLIP_TEXT']
print "「#{clip}」"

Config.plistの記述に合わせて、Kakko.pngを用意します。背景が透明のPNGです。元のPercent.pngを改変しました。

Skitched 20140219 040533

README.mdは適当に。Kakko.popclipextの中身はこんな感じになりました。

Skitched 20140219 040836

これで完成です。

Pythonでやりたい場合

Pythonでやりたい場合は、Config.plistのScript Interpreterを/usr/bin/pythonに、Shell Script Fileをhoge.pyなど、作るスクリプトファイル名に。

あとは、hoge.pyを書くだけです。

選択テキストの参照はos.environ[‘POPCLIP_TEXT’]ですね。

#!/usr/bin/python
# -*- coding:utf-8 -*-

import os
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

clip = os.environ['POPCLIP_TEXT']
print "「" + clip + "」"

自作アクションのインストール

完成したKakko.popclipext。これをダブルクリックするとインストールできるはずです。

Skitched 20140219 034814

ダブルクリックすると、公式サイトで配布されていたURLEncode.popclipextzとは異なり、問い合わせが入りました。_Signature.plistがないためです。自分で作ったものですし、不正な処理はしていないので「”Kakko”をインストール」を選択。

Skitched 20140219 041001

Kakkoがインストールされました。

Skitched 20140219 041043

動作テスト

さて、期待通り選択テキストを「」で囲むことができるかテストします。ちゃんとKakkoが表示されています。これを選ぶと……。

Skitched 20140219 042153

「」で囲まれました!正常に動いています!

Skitched 20140219 042247

アクションは比較的簡単に自作できるのでやってみよう

ここまでで見てきた通り、既存のアクションの中から、自分が作りたいものに近いものを改造して作ると、アクションはかなり簡単に作れることが分かるかと思います。

ぜひ俺得なアクションを作ってみてください。一度作ってから再度ドキュメントを読むと、バージョンアップの構想が浮かんでくるのではないかと思います。

PopClipApp
カテゴリ: Utilities
販売元: Nicholas Moore(サイズ: 1.7 MB)
全てのバージョンの評価: (211 件の評価)

選択テキストをMarsEditに送る俺得アクション

MarsEditで開いているエディタのカーソル位置に、選択テキストを送信するアクション、SendToMarsEditを作ってみました。

これは、AppleScriptを実行するアクションです。中身を見てみてください。

AppleScriptは、text形式で保存したものを使います。そのほかの形式は使えません。

MarsEdit – the blog editor for WordPress, Tumblr, Blogger and more.App
カテゴリ: Social Networking
販売元: Red Sweater Software(サイズ: 7.5 MB)
全てのバージョンの評価: (9 件の評価)

テキストを選択した後、メニューからSendToMarsEditを実行すると……。

Skitched 20140218 062854

MarsEditで開いている一番上にあるエディタのカーソル位置に選択テキストが送られます。

Skitched 20140218 063006

動画を撮ってみました。

 - Mac, MarsEdit, OS X, Python, Ruby