12 件 見つかりました。
カレー作りにかまけて久しく放置していたこのシリーズ [2010-01-22-1],その間に私のメイン環境も Windows XP から 7 に変わっていたりして既報分も最早アレなのだけど,まあその辺は追々書いていくことにして,今日はテキストエディタ Emacs (の Windows 版である Meadow) の話.
私自身は,ある程度以上の長さのテキスト書き (メール含む) はほぼ常に Emacs を使っているわけですが,それを見た人から「Emacs ってそんなにいいですか?」と聞かれたり,ごく稀に「Emacs 使ってみようと思うんですけど…」とか相談されたりします.えーと,あのー,まあ,なんだ, お勧めはしません.特に必要がない限り,今さら Emacs なんて使い始める必要はないんじゃないですかね? 私はもう他のエディタを体が受け付けないので使い続けますが.
さて微妙な雰囲気になったところで,インストールのメモ.Windows 7 で Meadow 3.01 の Netinstall 版を使う.
パッケージの選択はいつも悩むところ,というか,インストールする度に前回は何を入れたか忘れていてアレなのだが,現時点では (meadow/packages/setup/installed.db によれば) 以下のものがインストールされている.あまり深く考えずにインストールしているようだ.正直 tdiary-mode とか何のために入れてるのかわからんし.JDEE 関連は,入れたらパッケージ読み込みが途中でおかしくなったので外した.まあ使わないし.フォント関係は特に何も入れていない.
apel apel-10.7-1.tar.bz2 0 css-mode css-mode-1.0-1.tar.bz2 0 flim flim-1.14.9-1.tar.bz2 0 gnuserv gnuserv-0411-1999-5.tar.bz2 0 html-helper-mode html-helper-mode-3.8-4.tar.bz2 0 imagemagick imagemagick-6.2.8-0-Q16-1.tar.bz2 0 info-ja-eintr info-ja-eintr-2.04-3.tar.bz2 0 info-ja-elisp info-ja-elisp-2.9-4.tar.bz2 0 info-ja-emacs info-ja-emacs-21.3.50-2.tar.bz2 0 ispell ispell-3.3.02-1.tar.bz2 0 japanese-holidays japanese-holidays-1.1-1.tar.bz2 0 javascript-mode javascript-mode-2.0b8-2.tar.bz2 0 Meadow Meadow-3.02-r4261-3.tar.bz2 0 mew mew-5.1-1.tar.bz2 0 migemo migemo-1.8-1.tar.bz2 0 misc misc-0.7-1.tar.bz2 0 mule-ucs mule-ucs-0.85-20050113-2.tar.bz2 0 pukiwiki-mode pukiwiki-mode-2.30-1.tar.bz2 0 ruby-mode ruby-mode-23606-1.tar.bz2 0 semi semi-1.14.6-4.tar.bz2 0 tdiary-mode tdiary-mode-20050831-1.tar.bz2 0 yaml-mode yaml-mode-0.3-1.tar.bz2 0
コントロールパネル-システム で設定している環境変数は
TZ JST-9 GNUCLIENT -F GNUCLIENTW -F HOME C:\cygwin\home\swk
TZ がないと,とりあえず目に見えるところでは,Mew で送ったメールのタイムゾーンがおかしくなるようだ.
GNUCLIENT(W) の -F は,gnuclient(w) コマンドでファイルを開いたときに Emacs のウィンドウを前面に出すオプション,のはずだが,どうも効いてないような.
各種設定は .emacs ファイルに書くわけだが,UNIX 中心で Emacs を使っていた頃から .emacs は肥大化しまくっていて,何が必要で何が不要なのかさっぱりわからない状況になっていた.これを機にざっくり整理してみた.
.emacs.meadow [この記事の公開時の版] [最新版] (これを .emacs の中から load している)
以下大雑把にメモ.見出しは .emacs.meadow 内のコメントに対応している. (見出しからのリンクは,この記事の公開時のファイルの該当箇所を指している)
UTF-8 なファイルが扱えないと仕事にならない昨今,mule-ucs はどうしても必要.コメントに書いてある通り, set-language-environment する前に jisx0213 を読み込まないといけないという罠がある.
文字化けして見えるかもしれない行は
(setq mw32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
と書いてある.基本的には Meadow に標準でついてくる設定ファイルの通りだけど,
(add-hook 'mw32-ime-on-hook '(lambda () (set-cursor-color "green"))) (add-hook 'mw32-ime-off-hook '(lambda () (set-cursor-color "black")))
として IME の状態によってカーソルの色を変えている.それから,y/n とか yes/no と聞かれたときに IME がオンになっているとイラッとするので,
(wrap-function-to-control-ime 'y-or-n-p nil nil) (wrap-function-to-control-ime 'yes-or-no-p nil nil)
を入れている.その直後で IME の オン/オフ を C-o にバインドしているが,これは canna を使っていた頃の名残り.あ,というか FreeBSD では今も canna 使っているので名残りというのはおかしいのだが.
その後はしばらく標準の設定項目が続く.よく理解していないものも多い.
Windows の文化では驚くべきことかも知れないが,Meadow は標準のままで自前でテキストファイルを印刷することができない(はず).なので,他のテキストエディタ (notepad とか) にファイルを渡して印刷させたりということがよく行われるが,残念な感じが漂い過ぎなので何とかしたい.
一方で,Meadow は Emacs であって UNIX 文化で育ってきたソフトウェアなので,PostScript として出力して印刷するのはお手の物,というかそうするのが正しいと考えて作られているフシがある.おとなしくそれに従うのがよかろう.PostScript プリンタ以外に出力するためには gs (GhostScript) を使えばよい.というわけで gsview32 に渡すように設定している.印刷するときはコメントにあるように
M-x ps-print-buffer M-x ps-print-buffer-with-faces M-x ps-print-region M-x ps-print-region-with-faces
のいずれかを実行する.-with-faces があると色つきになる.
行番号の有無とかヘッダの有無とか,いろいろ切り替えられるようにしようかと思ったこともあるけど,現状でそれほど困らないのでずっと後回しにしたままである.
メールの読み書きにはずっと Mew を使っています.Mew の設定は基本的に.mew.el という別ファイルに分かれていて,その設定についてはまた改めて書こうと思うが,とりあえずここで印刷用の設定だけをしている.要はヘッダをつけて ps-print-buffer-with-faces を呼んでいるだけ.
なぜこれが .mew.el じゃなくて .emacs に入っているのかというと,たぶんこれが Meadow/Windows 依存なので .mew.el からは分離したいと,この設定を書いた当時の私が考えたからだと思う.実は .emacs も Meadow 依存のファイルとそれ以外の共通設定ファイルに分かれていたのだが,だんだん面倒くさくなってまとめてしまって今に至る.
Maxima,ときどき使います.標準の端末ではどうにも使いにくいし wxWidget のインタフェースも好きじゃないので,結局 Emacs で使うことに. imaxima は表示も見やすくてよい.
なぜこんな中途半端なところから「基本設定」が始まるのかというと,昔はここから (Windows に依存しない) 共通設定ファイルが始まってたからですな.今はもうグダグダになってますが.
比較的最近 (といってもここ数年) になって使い始めたものとしては:
(show-paren-mode nil)
括弧の対応を表示.これってどうして nil なんだっけ,と思って今調べたら,デフォルトでオフなのを toggle してオンにすることになるらしい. nil の代わりに正の数にすれば,もとの状態に関わらずオンにするようだ.そのうち直す.
(define-key minibuffer-local-completion-map "\C-w" 'backward-kill-word)
ミニバッファで C-w を打つとカーソル前の文字をワード単位で消してくれる.C-x C-f したときに長いディレクトリ名を編集する場合などに便利.
(require 'uniquify) (setq uniquify-buffer-name-style 'post-forward-angle-brackets)
同名のファイルを複数開いたときに「Makefile<1>」「Makefile<2>」とか表示されて,どっちがどっちだかわからなくなるのを緩和する.<> の中に1階層上のディレクトリ名が表示されるので,(ディレクトリの掘り方にもよるが) だいぶわかりやすくなる.
英辞郎をインストールして sdic で使ってます.辞書ファイルの変換の話とかはまたそのうち気が向いたら.
で,sdic-eiwa-dictionary-list とか sdic-waei-dictionary-list を設定するところでディレクトリ名を何度も繰り返し書いているのがダサい,というかパス名が Windows 依存なので嫌なのだが,これを避けようと思うと意外と面倒くさい.のでダサいまま放置.
特筆事項なし.あまり Emacs 内でシェルを起動することはないので,まあ念のため書いてあるだけ.実際このまま M-x shell で起動するとプロンプトのエスケープシーケンスが化けまくってひどいことになるのだが,気にしてない.
C/C++ での開発は最近はもっぱら Visual Studio を使っているので,Emacs の出番はないかと思いきや,しっかり Visual Studio から外部エディタとして登録して使っています.
「標準のエディタにも Emacs-like なキーバインド用意されてますよ?」 うん,知ってますけど,その like というやつが曲者で,ほとんど同じという認識で使っていたら微妙なところで挙動が違ったりして却ってストレスがたまります.(xyzzy もそれが理由で使うのやめた)
「でも,IntelliSense とか超便利ですよ?」 うん,それもわかりますが,それでも Emacs じゃなきゃ体が動かないのでどうしようもないのです.年を取るというのはそういうことだ.
まあそれでも etags とかを駆使すればそれなりにシンボル名補完とか定義検索とかはできるので,そういう設定が書いてある.
(global-set-key "\C-c\C-i" 'complete-symbol) (global-set-key "\C-cc" 'compile) (setq compile-command "make ")
…のはいいのだが,じゃあこの make ってのは何なのか? というと,ソースコードと一緒に怪しい Makefile を用意して,make を実行することで Visual Studio のウィンドウでビルドが実行されて,さらにその出力メッセージが Emacs のバッファに出力されるみたいな頭のおかしい 小細工を (たまに) しているので,そのための設定です.そんなものに需要はないと思うので詳しくは書きませんが,万一興味がある人がいれば,まあそのうち.
(そこまでするなら nmake 使えよ,って話なのですが,そうしてしまうと研究室のメンバと本格的に話が通じなくなるので)
sig.el なるファイルを load していて,何だそれ? って話なのですが,15 年くらい前に自分で書いた,メールのシグネチャを対話的に切り替えて挿入するコードです.人様にお見せできるコードではありません….似たような機能のパッケージはいろいろとあると思うので,スルーしてください.
スケジュール管理は,ここ10年くらいずっと MHC を使っています.というか,その前は紙の手帳だったので,ソフトウェアとしては MHC しか使ったことがない.細かい設定は別ファイル .mhc.el に分かれていて,これも詳しくはまたそのうち.
comment-region が C-c > に,uncomment-region が C-c < にバインドされているのは,YaTeX を使ってた頃の名残り.
M-& で「Tue Feb 14, 2012」みたいな文字列を,C-u M-& で「2012-02-14」みたいな文字列を挿入.地味に多用している.
上にも書いた通り,以前は YaTeX を愛用していましたが,最近はもう syntax hilight さえしてくれれば後は何でもよくなったというか,あまりお節介を焼いてくれないものの方が好みになりました.latex-mode も verbatim とか super/subscript でフォントを変えられるのは嫌いなので,その手の機能は切っている.
(add-hook 'latex-mode-hook '(lambda () (setq tex-verbatim-face nil) (defun tex-font-lock-suscript () nil)))
オフィスの机の上の計算機環境は,頑なに UNIX を使っていた学生時代から始まり,デュアルブートやら仮想マシンやら何やらを駆使して Windows / UNIX を両使いする生活を経て,2年ほど前からついに Windows の動くノート PC 1台のみで済ますようになった (もちろんサーバ類や実験関係は除く).
UNIX で育った人間にとっては素の Windows ほど使えないものはないので,いろいろと手を入れる必要があって大変なのだけど,やってみるとまあ何とかなるものだ.移行の結果わかったことは,私にとって重要だったのは UNIX 環境の UI であって,カーネルではなかったらしいということだ.
というわけで,次にセットアップするとき用のメモも兼ねて,各種ソフトウェアの環境設定などについて,気が向いた範囲で気が向いた順に,覚書きを残しておくことにする.かなり偏った環境なので,他の誰かにとって役に立つかどうかは定かではない.つうか,次にノートPCを変えるときはさすがに Windows XP じゃないような気もするので,自分の役に立つかどうかすら定かではない.
この記事は目次の役目をします.気が向くたびに別記事として書いて,リンクを張っていきます.
マシン / OS:
(追記: 2011年秋以降は,Let'snote CF-S10,Windows 7 に移行済み.しばらく双方に関する記述が入り乱れます.そのうち統一予定)
chalow にはカテゴリ機能がある.というか複数つけられるのでタグと呼んだ方がいいのかもしれないけどそれはともかくとして.
で,私は不精なのでほとんど misc とか tech とかになっててあまり活用していないのだけど,後から複数の記事にまとめてカテゴリをつけたくなることがある.たとえば自分が錯視にこんなに興味があるとは思ってもみなかったのだが,気づくと何だかシリーズみたいなことになっていて,カテゴリをつけたくなったりした.
というわけで可能な限り最小労力で,複数記事に「後づけカテゴリ」をつけられるようにしてみた.しばらく動かしてみたけど特に問題なさげなので,晒しておきます.
まずこんなファイルを用意:
%illusion% [2006-10-21-2] 同じ色に見えない錯視[misc] [2006-07-19-1] 回る人影 - 錯視[misc] [2006-07-12-1] ジャストロー錯視[misc] %mhc% [2006-10-15-1] mhc-cvs[badinerie][tech] [2006-09-09-1] MHC の小ネタ[tech] [2005-07-18-4] MHC の conflict 検出機能[tech]
カテゴリ名を % と % で囲んだ行に続いて,角括弧で囲まれた記事 ID [YYYY-MM-DD-I] が先頭にあるような行を並べる.行の後ろの方は何か書いてあっても書いてなくても構わない.実はこれ,clsearch.cgi で mode=2 のときの表示をコピーペーストしたものになっている.
このファイル (仮に postcat.dat とする) を,chalow が %all_entries を作った後,%category_count を作る前の辺りで読み込んでおく:
} store_entry(\%all_entries, \@entlines) if (@entlines > 0); close F; } ## ここにつっこむ use postcat; if (-e "./postcat.dat") { &postcat::read_postcat(\%all_entries, "./postcat.dat"); } ## ここまで #debug_print(\%all_entries); foreach my $ymd (keys %all_entries) { my $ent = $all_entries{$ymd}; for (my $i = $ent->{curid}; $i >= 1; $i--) { if (defined $ent->{$i}->{cat}) {
postcat.pm はこんな感じで:
package postcat; use strict; sub read_postcat { my ($aep, $file) = @_; my $cur_cat = ''; open(POSTCAT, $file) or die; while (<POSTCAT>) { if (/^\s*%([^%]+)%/) { $cur_cat = $1; } elsif (/^\s*\[(\d{4}-\d{2}-\d{2})-(\d+)\]/) { &append_cat($aep, $1, $2, $cur_cat); } } close(POSTCAT); } sub append_cat { my ($aep, $ymd, $i, $cat) = @_; return unless $cat; my @orig_cat = @{$aep->{$ymd}{$i}{cat}}; foreach my $c (@orig_cat) { return if $c eq $cat; } push(@{$aep->{$ymd}{$i}{cat}}, $cat); } 1;
本当はもとの ChangeLog メモとかに反映できる方が便利なのかも知れないけど,それはそれでやろうと思えばすぐできそうなので,必要になったらでよいかなと.
mhc-cvs を使うようにした [2006-10-15-1] のに引き続いて,日々のメモというか要するにこのページの抽出元になっているログを書く際にも emacs を X で飛ばさなくてもよいようにしたい,というわけで tramp を使いはじめてみた.
結論から書くと,遅すぎてちょっと常用は無理かなという印象.
対象ファイルは 2006.txt みたいな名前で 1 年分が 1 個のファイルになっていて,サイズは 700 KB くらい.いろいろ試した結果,転送方法は (setq tramp-default-method "rsync") にするのが一番速いのだけど,それでも save するのに 3 〜 5 秒程度かかる.普段からわりとこまめに C-x C-s 叩く方なのと,そうでなくても auto-save の度に数秒止まってしまうわけで,その度に思考が中断されてとても嫌な感じ.
正確には,save 中は完全に止まっているのではなくて,その間にタイプした内容はちゃんと入力されていて,save 完了後に表示されます.しかし (特に日本語変換を含むような場合は) 視覚フィードバックがないとやっぱりタイプしにくい.save はバックグラウンドで非同期に実行するような仕組みにはできないものなのかなあとか思った.
何かいい方法はないものだろうか.
今までは自宅の emacs の窓を職場の PC の X サーバで開いて,作業メモの読み書きなりスケジュールの読み書き (mhc) をしていたりしていたのだけど,自宅の回線は普通の ADSL なのでちょっと無理を感じていた.
というわけで自宅 PC が逝ったのを機に (あまり関係ないけど,単にきっかけということで),まずは mhc の方は mhc-cvs を使ってみることにする.
自宅に repository を掘る.
% mkdir /home/swk/mhc-cvsroot % cvs -d /home/swk/mhc-cvsroot init % cd ~/Mail/schedule % cvs -d /home/swk/mhc-cvsroot import -m 'Initial import' -I '.*' -I trash schedule name start % cd .. % mv -i schedule schedule.bak20061015/
で,.emacs に
(setq mhc-file-method 'mhc-cvs) (setq mhc-cvs-repository-path "/home/swk/mhc-cvsroot")
な風に書く.リモート側の PC は,
(setq mhc-file-method 'mhc-cvs) (setq mhc-cvs-repository-path ":ext:swk@host.example.com:/home/swk/mhc-cvsroot")
とする.もちろん CVS_RSH は ssh で,ssh-agent を使っている.
実は ssh のポートが標準の 22 ではないのだが,そこでちょっとはまった.安直に CVS_RSH を "ssh -p 12345" とかにしてみたら cvs が
cannot exec ssh -p 12345: No such file or directory
とかいう素敵なエラーを吐いて失敗.結局
#!/bin/sh ssh -p 12345 "$@"
なシェルスクリプトを作るという微妙な方法で回避した.
mhc-cvs 自体は,ひとまず快適に動いているっぽい.スケジュールを書き込むと即時 commit されるようだ.それはよいのだが update がどういうタイミングで行われているのかよくわからない….しばらく使ってみます.
スケジュール管理は相変わらず MHC でやってます.
いったん Mew のバッファに移ってから C-c.. するのが煩わしく感じて来たので,.emacs で
(global-set-key "\C-c.." 'mhc-goto-this-month)
してみた.微妙に便利になった気がする.
という流れで [2005-07-18-3],あまり関係ないけどついでにコメント.
MHC の conflict の表示機能は便利だけど,それは conflict に気づかないのを防げるという点が便利なのであって,いざ conflict が起きたときにどっちを優先するかは見れば分かるんじゃないかなと思ってます.見て分からない場合もあるかも知れないけど,そういうのは自動判別もできないんじゃなかろうかというか.自動化しなくちゃならないほど複雑な何かがあるんだろうか.
という私はそもそも終了時刻を記入しないことが多いので conflict 機能自体あまり使いこなしてないのですが.まあ今のところせいぜい日に数件なので,まだ大丈夫かなと.
はてなでもミーティングの終了時刻とかは誰も書いてないとか.まあ人や場所によっていろいろなスタイルがあるってことだな.
(追記) 回答がありました.よくわからんけどそういうもんなのか.
えーと,現時点での結論ですが,うーん,まあ少なくとも使いやすいとは言えませんな.
まず個人的な事情として,スケジュールは閲覧しかしません.スケジュールの入力は MHC でしかしないので(というかできないというか).なので,以下の評価は閲覧のみに関するものであって,編集などの使い勝手はまた別な話なので注意.
スケジュールの閲覧は大きく分けて 4 種類のモードがある.
この 3 つに加えて,
がある.
なので,ある程度の期間をまとめて俯瞰するには 1 か 4 しかない.
月全体モードは基本的に役に立たない.携帯の画面で月単位にカレンダー表示しても,個々の用件の内容を表示できるスペースは当然ない.その日に用件があるかないかだけはマークの有無で判別できるのだけど,そんなもん,予定が全く入ってない日なんてほぼないので,情報量は限りなくゼロだ.
入ってる予定の件数とかで色の濃さとかが変わったりすると,少しはましになるかもなあとか思ってみたり.しかし 1 件の重みはまちまちだからそう簡単じゃないよなあ.
これに比べると待受画面のスケジュール表示機能はそれなりに便利だ.直近 9 件の用件が 1 件 1 行で表示されるので今日明日程度に限ればそれなりに一覧性がある.待受画面に常に表示されているというのもイケている.問題は,9 件じゃさすがに少なすぎることと,現在じゃなく未来のある時点のを見たいという要求を満たせないこと.是非スクロールして先まで見れる機能が欲しかった.それがダメでもせめて文字を小さくして表示量を増やせるようにして欲しかった.
というわけで,待受画面に表示されない未来の期間を俯瞰するには,2 の一日単位モードで表示しながら左右キーで日をカタカタ切替えて眺めているのが現状です.うーむ.微妙.
PDA (PokectPC) を使ってた頃は tAgenda なるものを使っていて,これは割と重宝してました.
1 行 1 件でスクロール対応.シンプルだけど,携帯端末みたいなものではこの表示方法が一番現実的なのかなあとか思う.
まあこういう議論を突き詰めて行くと,結局紙が一番! とかになっちゃいがちなんだけどね….
f901is のスケジューラに Outlook から転送すると,繰り返しスケジュールの終了指定が消えてしまって困っていたのだが [2005-07-10-1],なんとか対策を講じてみた.
当初は,
mhc2ol をいじって単発スケジュールに展開するのが一番楽なのかな.めんどくさそう.ていうか ruby わからん.
とか考えていたのだが,やはり ruby 分からなさすぎなので,以下のように計画変更.
1. スケジュールデータベースをまるごとコピーして (rsync)
2. このコピーされたデータベースをいじって繰り返しスケジュールを複数の単発スケジュールに展開し
3. それを mhc2ol に食わせる
これなら ruby 知らなくてよし.
実は東京からの帰りの新幹線の中で書き上げられるだろうとたかをくくっていたのだが,意外と手間取った.むう.
というわけで展開スクリプト mhc-unroll.pl はこんな感じ. (なんか forbidden になるので suffix を .txt にしてます)
% mhc-unroll.pl -s /home/hoge/Mail/schedule/ -d /home/hoge/Mail/schedule_unroll/
とかして,schedule/ から schedule_unroll/ に展開される.一応 .ol_sync は保存するようにしてあるけど,これでいいのかはよく分からない.
とりあえず自分が必要な機能しか作ってないのでかなり不完全.具体的には,
あたりがちょっと問題ありそう.まあ必要になったら直そうかなと.
展開のロジックは,MHC 本体がスケジュールを表示する際とは違ったやり方になっている.MHC では,1 ヵ月とかの一定の短い期間の展開ができればよいので,期間内の日を 1 日ずつ iteration しながら,各スケジュールの日付条件を評価していく.この方式は汎用性は極めて高いが,展開する期間が長い場合には無駄が多そうな気がしたので,各スケジュールについて期間内の月を 1 月ずつ iteration しながら,該当する日付をリストアップしていくことにした.実際にどっちが速いのかは比べてないので分からない.
実行時間は,MHC 母艦である UNIX 機 (suite) だと数秒 (もちろんデータ量によるけど).ところが,mhc2ol を動かす Windows 機 (caprice) 上の Cygwin だと 60 秒くらいかかる (rsync も含む).ぐはー.UNIX 機のディスクを SMB/CIFS 経由でアクセスするのが死ぬほど遅いらしい.ちなみに NAS (etude) にデータを置いて試しても似たようなものだったので, SMB/CIFS サーバ側のせいではなさそう.
で,どうも SMB/CIFS 経由の write が特に遅いようだったので,UNIX 機を展開元,Windows 機を展開先として mhc-unroll を走らせることにしたら, 60 秒が 15 秒に縮んだ.ついでにこのおかげで mhc2ol 自体の実行時間も,今まで 40 秒くらいかかってたのが 20 秒くらいに縮んだ (mhc2ol も Cygwin 上で実行している).
んー,Cygwin に頼り過ぎるのも考えものなのかな.
さてこれのテスト中に「mhc2ol はデフォルトでは,現在の 3 ヶ月前から 3 ヶ月後までの範囲のデータしか outlook に export しない」という事実を初めて知った.というかそれを知らずに,自分のコードのバグだと思って無駄に悩んだ.
mhc2ol の引数に 20050101-20051231 などと指定すると,その範囲が export されるようになる.絶対日時じゃ不便でしかたないので,こんな感じにするのがよい.
% mhc2ol -r /home/hoge/schedule_unrolled/ -i -H -m `date +%Y%m%d --date "3 months ago"`-`date +%Y%m%d --date "2 year"`'
ここの真似です.べーんり.
ついでにメモ.FreeBSD の /bin/date には --date オプションはなくて,代わりに -v を使う.
% date -v-3m +%Y%m%d % date -v+2y +%Y%m%d
なお,恐ろしいことに +%Y%m%d とかの指定の後ろに -v が (というか他のオプションも全部) 来てはいけないという仕様になっているので注意.要するに +%Y%m%d 部はオプションじゃないってことなんだな.誰だこんな仕様にしたやつは.