はじめに
何かと便利なクリップボード、コピペでソースコード取ってくるのはもちろん、Clipyなどのツールを使えばスニペットまで設定できてしまいます。リッチテキストも便利ですよね。太字やリスト形式をそのままコピーできて、Slackなどのメッセージをコピペするときに重宝します。
今回はそのクリップボードをPythonからいじる方法についてまとめてみました。
セットアップ
MacのOS機能にアクセスするためにPyObjCをインストールします。
pip install pyobjc
関数の定義
import AppKit
import Foundation
def copy(plain, html):
data = {
'public.utf8-plain-text': plain,
'public.html': html
}
pb = AppKit.NSPasteboard.generalPasteboard()
# クリップボードの内容をクリアする
pb.clearContents()
pb.declareTypes_owner_(data.keys(), None)
for fmt, value in data.items():
# 内容をエンコードする
new_data = Foundation.NSString.stringWithString_(
value
).nsstring(
).dataUsingEncoding_(
Foundation.NSUTF8StringEncoding
)
# クリップボードへ値をセットする
pb.setData_forType_(new_data, fmt)
実行例
太字の設定
copy('hoge', '<b>hoge</b>')
プレーンテキスト(Visual Studio Code)でもリッチテキスト(Slack)でも貼り付けられていることがわかります。ただ、少し違いが分かりづらいですね なので、次はもう少し分かりやすい例を出してみます。
リストの設定
copy('a. hoge\nb. fuga\nc. moge', '<ol><li>hoge</li><li>fuga</li><li>moge</li></ol>')
この通り!プレーンテキストではa,b,cで指定し、リッチテキストでは<ol>
とだけ指定していたので、数字で連番が振られています。
もちろんこのリストは入れ子にしても正しく展開されます。
copy('dummy', '<ol><li>hoge<ol><li>ほげ</li><li>ふが</li></ol></li><li>fuga</li><li>moge</li></ol>')
ちゃんと「ほげ」と「ふが」のアイテムが2階層目に入っていることがわかります。
この他にも斜体の<i>
タグや、取り消し線の<strike>
タグ、リンクの<a>
タグなどにも対応しているので良かったら試してみてください。
余談(この記事を書くに至った経緯)
僕は毎日Slackで日報を書くのですが、最初は自分宛のDMに日報のフォーマットを作っておいてコピペして使いまわしていました。しかし日付の部分を今日に変更することがだんだん面倒になってきました。定型文に日付を挿入しつつ箇条書きの部分まで自動的に作ってくれるととても効率的に入力できます。
便利なPythonのことだし、クリップボード操作用のモジュールもすぐに見つかるだろうと思ったのですが、なかなか見つかりません。やっとのことでrichxeroxというモジュールを見つけたものの、なんと開発がストップしていて、bitbucketへのリンクも切れてしまっているではありませんか。
そこで、richxeroxのソースコードを読み解いて、まとめたものがこちらの記事になります。
richxeroxのソースコードを自分で読んでみたいよという方はこちらからダウンロードしてみてください。