CotEditor 用のスクリプトを JavaScript で書く

久しぶりに CotEditor を使ってみたらすこぶる良かった。そこで自在に CotEditor を操るべくスクリプトの書き方を調べた。

f:id:scientre:20190913215309p:plain

CotEditor ではスクリプトの実行方法が2つ用意されている。

JavaScript で選択範囲の内容を変更するスクリプトは次のように書ける。ここでは選択範囲を2回繰り返すようにしている。

#!/usr/bin/osascript -l JavaScript

const app = Application("CotEditor");
app.includeStandardAdditions = true;

// get active document
const doc = app.documents[0];

const selection = doc.selection;
selection.contents = proc(selection.contents());

function proc(input) {
	return input + input;
}

このファイルをスクリプトフォルダに拡張し .js で保存し、chmod コマンドなどで実行権限を与える。実行権限がないと動かないので注意。

どのような API が使えるかは一応 CotEditor のヘルプに用意されているものの、ドキュメント化されていないものもあるのでソースを参照するのがよい。

エクスプローラーから「3D オブジェクト」などのアイコンを隠す (Windows 10 バージョン 1903対応)

f:id:scientre:20190823102443p:plain

次の .reg ファイルを保存して開く。

元に戻すときは次の .reg ファイルで行う。

macOS に rbenv を使って Ruby をインストール

rbenv のインストール

Homebrew で rbenv および ruby-build をインストールする。

brew install rbenv ruby-build

お使いのシェルの初期化スクリプトに rbenv の初期化処理を登録する。

echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc

Ruby のインストール

irb で日本語入力や履歴を使うため readline を入れておく。

brew install readline
brew link readline --force
RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"

久しぶりに Ruby をインストールする場合は ruby-build を新しくしておく。

brew upgrade ruby-build

ドキュメントは web で参照するのでオプションで無効にしてインストールする。このオプションによってインストール時間を短縮できる。

CONFIGURE_OPTS="--disable-install-rdoc" rbenv install X.X.X

再読み込み

rbenv rehash

インストールされているバージョン一覧を確認

rbenv rehash

使用するバージョンを選択

rbenv global X.X.X

アンインストール

rbenv uninstall X.X.X

Windows 10 で hosts を編集するためのショートカットを作成する

Windows 10 をバージョン 1809 から 1903 に更新したらショートカットが消えたのでメモ。

1. 次の場所にショートカットを作成し、hosts という名前にする

%homepath%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

2. 作成した hosts.lnk のプロパティを開き、[ショートカット] タブの [リンク先] を次の値に設定する

%windir%\system32\notepad.exe "%windir%\system32\drivers\etc\hosts"

f:id:scientre:20190730173941p:plain

3. さらに [詳細設定] を開き [管理者として実行] にチェックを入れる

f:id:scientre:20190730173955p:plain

4. お好みでアイコンを設定して OK

右クリック禁止・選択禁止・コピー禁止を禁止する

ブラウザの開発者ツールを開き、コンソールに次のコードをコピーして enter。

((es, ms, c) => es.map(e => ms.map(m => e["on" + m] = c, e.style.userSelect = "auto")))([document.body, document.documentElement], ["contextmenu", "selectstart", "copy"], e => e.stopPropagation())

これでほとんどの contextmenu, selectstart, copy イベントを無効化しているコードを無効化できる。

ブックマークレット

ブックマークを作成し URL を次のように設定するとボタン一つで使用できる。

javascript:void ((es, ms, c) => es.map(e => ms.map(m => e["on" + m] = c, e.style.userSelect = "auto")))([document.body, document.documentElement], ["contextmenu", "selectstart", "copy"], e => e.stopPropagation())

解説

コードを読みやすく書き直すと次のようになる。

const elements = [
	document.body, // <body>
	document.documentElement, // <html>
];

const events = [
	"contextmenu",
	"selectstart",
	"copy",
];

const stopEvent = e => e.stopPropagation();

elements.forEach(elem => {
	events.forEach(eventType => {
		// 1.
		elem["on" + eventType] = stopEvent;
		// 2.
		elem.style.userSelect = "auto";
	});
});

1. body, html 要素について contextmenu, selectstart, copy イベントを新たに追加し、発生したイベントがページで設定されている他のイベントハンドラに伝播しないように (stopPropagation) する
2. body, html 要素について CSS の user-select プロパティの値を auto に強制的に設定する