--- title: 『やさしいEmacs‐Lisp講座』を購入 author: kazu634 date: 2008-12-07 url: /2008/12/07/_1168/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4427;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Emacs - Lisp ---
Emacs-Lispの勉強用に購入しました。外部プロセスを起動する方法をペラっとめくって、ちょっと書いてみたら、革命的に便利になってしまった…ちょっと前にisbn13からisbn10(つまりasin)を求めるスクリプトを書きましたが、それをEmacs上で実行できるようにしてみました。
これで本を片手に、日記を書くのが便利になった。
(defun lookup-asin (isbn13) (interactive "sISBN13: \n") (call-process "isbn" nil t t isbn13))
isbn13の値をミニバッファーで尋ね、isbn10をカレントバッファーに返す。M-x lookup-asinしてみよう。
#!/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の拡張性がさらに広がるなぁ。