Atom Editor に xyzzy の filter-buffer 機能をつける

2018年1月10日追記:パッケージ化しました

Windows 用のテキストエディタ xyzzy にはバッファの内容を標準入力としてコマンドに渡し、その出力をバッファに書き込む filter-buffer というコマンドがある。

同じような機能を Atom でも探してみたが、どうやらまだ存在しないようだ。

そこで filter-text パッケージを作成した。

コマンド Settings View: Install Packages And Themes などでパッケージのインストール画面を開き、「Search packages」に「filter-text」と入力して Enter を押すと検索結果に表示されるはずだ。

Atom Editor で init.js を保存したら自動的に再読み込みする

テキストエディタ Atom では Emacs における init.el のように、~/.atom/init.js (init.coffee) にスクリプトを記述することによって自前のコマンドを定義できる。しかしながら Emcas のように load-file のようなコマンドが用意されていないため、書いたスクリプトを試すにはエディタの再起動が必要となる。

過去の方法

ここにファイルの保存を監視し require のキャッシュを消去する方法で実現する方法が紹介されている。

ところが2017年12月現在のバージョン 1.23.1 (x64) ではこの方法は使えなかった。 require のキャッシュを消去できないのである。2015年10月の情報だからだいぶシステムが変更されているのだろう。

別の方法

キャッシュを消去できないのであれば別のファイルを作ればいい。そう思い付き、次のような init.js を書いた。

var scriptId = 0;
var fnCache = {};

function reloadInitScript() {
	let srcFile = require.resolve("./siteinit"),
	destFile = srcFile.replace(/[.]js$/, "-cache/" + (scriptId + 1) + ".js");

	try {
		var fs = require("fs");
		let rs = fs.createReadStream(srcFile),
		ws = fs.createWriteStream(destFile);
		ws.on("close", () => {
			scriptId++;
			require("./siteinit-cache/" + scriptId).init();
		})
		rs.pipe(ws);
	} catch (error) {
		atom.notifications.addFatalError("Error on copying file to " + destFile);
	}
}

function defun(target, name, fn) {
	var fnKey = target + "\\" + name;
	if (!fnCache[fnKey]) {
		atom.commands.add(target, reffun(name, fnKey));
	}
	fnCache[fnKey] = fn;
}

function reffun(name, fnKey) {
	var cmd = {};
	cmd[name] = function() {
		fnCache[fnKey]();
	};
	return cmd;
}

Object.defineProperty(global, "user", {
	value: {
		defun: defun
	}
});

reloadInitScript();

atom.workspace.observeTextEditors(function(editor) {
	editor.onDidSave(function() {
		if (/[/\\][.]atom[/\\].+[.]js$/.test(editor.getPath())) {
			reloadInitScript();
		}
	});
});

このスクリプトの要点は次のようなところだ。

  • ユーザが編集するファイルは ~/.atom/siteinit.js とする
  • siteinit.js では user.defun() という函数でコマンドを定義する
  • fnCache というハッシュに函数の実体を保持しておき、 atom.commands.add() するのは実行時に fnCache に登録された関数を呼び出す函数
  • ファイルの保存を監視し、 ~/.atom/ 内の .js ファイルが更新されたら reloadInitScript() を呼び出す
  • reloadInitScript() が呼ばれるたびに scriptId を 1 ずつ増やしていき、 ~/.atom/siteinit-cache/(scriptId).js という連番のファイルを作る
  • ~/.atom/siteinit-cache/(scriptId).js を require し、その中の init() を呼び出す

そして siteinit.js は次のように使用する。

function init() {
	console.log("siteinit.js loaded.");

	user.defun("atom-text-editor", "user:insert-horizontal-bar", function() {
		let editor = atom.workspace.getActiveTextEditor();
		if (!editor) {
			return;
		}
		editor.insertText("----------------------------------------------------------------");
	});
}

exports.init = init;

init.js および siteinit.js を作成したら動作確認を行おう。

  1. Atom を再起動してから Ctrl+Shift+I でコンソールを開く
  2. siteinit.js の "siteinit.js loaded." というメッセージを書き換え、保存する

ここでコンソールに書き換えたメッセージが表示されれば設定は完了。快適な Atom ライフが待っている。

pg_dump を使って特定のテーブルのみをバックアップする

PostgreSQL で特定のテーブルをダンプするには次のコマンドを使用する。

pg_dump -U 接続ユーザ名 -t テーブル名 データベース名 > 出力.sql

テーブルの所有権に関する情報をダンプしない

pg_dump -U 接続ユーザ名 -t テーブル名 -O データベース名 > 出力.sql

データのみをダンプする

pg_dump -U 接続ユーザ名 -t テーブル名 -a データベース名 > 出力.sql

INSERT コマンドを出力する。PostgreSQL 以外のデータベースシステムにデータを移行する際に有用

pg_dump -U 接続ユーザ名 -t テーブル名 --column-inserts データベース名 > 出力.sql

金沢ふらっとバス 乗り換えガイド

金沢ふらっとバスは、路線バスの通れないような狭い道をゆく地域の循環バス。此花・菊川・材木・長町の4ルートがある。運賃は100円と低価格。

運賃

1回につき 大人 100円 / 小人(小学生)50円 を乗車時に支払う。

此花・菊川・材木ルートでは北陸鉄道の IC カード「ICa(アイカ)」が使える。長町ルートは西日本ジェイアールバスによる運行のため ICa は使用できない。

また、バスの車内で11枚綴りの回数券を1,000円で購入できる。

乗り換え

時刻は始発地点を除いて前後することが多いので注意。

ルート 乗り換え駅 乗り換え時間
此花材木 7 近江町市場 → 25 袋町 2 分
此花材木 7 近江町市場 → 1 武蔵ヶ辻・近江町市場 7 分
材木此花 24 老舗交流館 → 8 町民文化館 2 分
此花長町 6 武蔵ヶ辻 → 9 武蔵西 6 分
長町此花 9 武蔵西 → 6 武蔵ヶ辻 9 分
材木菊川 7 香林坊・仙石通り → 1 香林坊 4 分
菊川材木 1 香林坊7 香林坊・仙石通り 11 分
菊川材木 22 21世紀美術館8 市役所・21世紀美術館 18 分
菊川長町 2 片町 → 25 片町 19 分
長町菊川 25 片町 → 2 片町 11 分


Firefox のスクリーンショット機能を無効にする

Firefox 55 では試験的機能としてページのスクリーンショットを撮影する機能が導入された。ページ上で右クリックすると「スクリーンショットを撮る」というメニューが追加されている。

Make screenshots of webpages, and save them locally or upload them to the cloud. This feature will undergo A/B testing and will not be visible for some users.

https://www.mozilla.org/en-US/firefox/55.0/releasenotes/

f:id:scientre:20170921114252p:plain

私には必要ない機能なので、メニュー項目を占拠しているこの機能を無効にした。手順は次の通り

  1. アドレスバーに「about:config」と入力し Enter
  2. 次のような警告が出る場合は「危険性を承知の上で使用する」を選ぶ
    f:id:scientre:20170921114245p:plain:w500
  3. 設定名が「extensions.screenshots.disabled」のものを検索し、値を true に設定する
    f:id:scientre:20170921114249p:plain

以上の手順でコンテキストメニューから「スクリーンショットを撮る」を取り除くことができる。