Emacs-Lispの勉強用に購入しました。外部プロセスを起動する方法をペラっとめくって、ちょっと書いてみたら、革命的に便利になってしまった…ちょっと前にisbn13からisbn10(つまりasin)を求めるスクリプトを書きましたが、それをEmacs上で実行できるようにしてみました。

これで本を片手に、日記を書くのが便利になった。

.emacsとかに表記するの

(defun lookup-asin (isbn13)
(interactive "sISBN13: \n")
(call-process "isbn" nil t t isbn13))

isbn13の値をミニバッファーで尋ね、isbn10をカレントバッファーに返す。M-x lookup-asinしてみよう。

Perlスクリプト

#!/usr/bin/perl
use strict;
use warnings;
# ==================
# === 変数の宣言 ===
# ==================
# isbn10を格納するための配列
my @isbn10;
my $isbn13;
# ====================
# === 起動時の処理 ===
# ====================
# スクリプトに引数が設定されてなければ終了
exit if (@ARGV == );
# スクリプトの引数を代入する
my $chk = &chk_arg($ARGV[]);
# 引数のチェック
exit if ($chk == -1);
$isbn13 = $ARGV[];
# ================
# === 処理開始 ===
# ================
# 数字を一つずつ配列に格納
my @temp = split(//, $isbn13);
# check digit以外の部分が完成
for (my $i = 3; $i < 12; $i++) {
push(@isbn10, $temp[$i])
}
# check digitの計算
my $c_digit = &calc_c_digit(@isbn10);
# check digitを配列に格納
push(@isbn10, $c_digit);
# isbn10を表示
print(@isbn10, "\n");
# ================
# === 処理終了 ===
# ================
exit;
# ==================================
# ========== サブルーチン ==========
# ==================================
# ================================
# === チェックディジットの計算 ===
# ================================
# 戻り値: チェックディジット
sub calc_c_digit {
# check digitを計算するためのisbn
my @tmp_isbn9 = @_;
# 計算用
my $temp;
for (my $i = ; $i < @tmp_isbn9; $i++) {
$temp += $tmp_isbn9[$i] * (10 - $i);
}
$temp = int($temp % 11);
$temp = 11 - $temp;
if ($temp == 10) {
return ("X");
} else {
return $temp;
}
}
# ================================
# === スクリプトの引数チェック ===
# ================================
#  0 : 正常な引数
# -1 : 異常な引数
sub chk_arg {
my @tmp = @_;
foreach my $i (@tmp) {
return (-1) if ($i =~ /[a-zA-Z]/);
}
return();
}

このスクリプトをisbnとして保存し、パスの通ったところに保存する。

まとめ

外部プロセスを起動させられるようになると、Emacsの拡張性がさらに広がるなぁ。

やさしいEmacs‐Lisp講座

やさしいEmacs‐Lisp講座