2016年7月29日金曜日

Tips

 時々、Emacsを検索語にくわえて適当にググってあちらこちらのサイトを見ていると、目からウロコが落ちる。もうちょっと使い易くならないかな、と薄々思っているようなことのTipsにあったりして。
 最近だとediffがそうだし、古くはtruncate-linesとか。
 今回はこれ。dired

;; diredを2つのウィンドウで開いている時に、デフォルトの移動orコピー先をもう一方のdiredで開いているディレクトリにする
(setq dired-dwim-target t)
;; ディレクトリを再帰的にコピーする
(setq dired-recursive-copies 'always)
;; diredバッファでC-sした時にファイル名だけにマッチするように
(setq dired-isearch-filenames t)

 早速、init.elにコピーだ。再帰コピーの指定はコメントアウトしたけれど。

2016年7月28日木曜日

winner-mode

 左にhowmの一覧を表示して、右側でその中身をいじっていて——ふとほかのものを見ると、右側のバッファが切り替わってしまう。まぁ、通常の動作なのだが、元のバッファを表示しなおすのにいつもこまってしまう。
 ファイル名が年月日+時刻だからどれもそっくりなのだ。helmのswitch bufferも形無しだ。どうしたらいいんだろう、といつも思っていたら解決する手段がすでにあることを知った。
 winner-modeである。
 しかも標準だ。
 Windowの構成をundoしてくれる。「global minor mode」なんて存在、はじめて知った。デフォルトのキーバインドはC-c <left>とC-c <right>。
 Emacsに矢印キーは不要だぜ、と思っていたのだけど、最近はOrg-modeでも使用することもあってすっかりお世話になっている。

2016年7月27日水曜日

scroll-all-mode

 できるということは知っていたのだけれど、どうすれば、いいか、わからなかった。昔、Infoでちらりと見ただけなのだ——夢だったのかもしれない。どういうわけか、最新のInfoにその記述をで見つけ切れないのだ。
 左右に二分割したバッファを同期してスクロールする方法があったはずなんだがなぁ。どうやるんだっけなぁ。helmでscrollで検索したらあっさりそれらしいものを見つけた。これか?

scroll-lock-mode

 外れだった。正解は「scroll-all-mode」。

2016年7月26日火曜日

poor-grep

 Emacs for Windowsではgrepが使えないので、とりあえずpoor-grepをでっち上げた。

(defun poor-grep (string regexp)
  "貧乏人のgrep"
  (interactive "s検索文字列: \nsファイルregexp: ")
  (let ((file-list (file-expand-wildcards regexp))
 (display-buffer-function nil)) ; popwinを無効化
    (eshell-poor-mans-grep (cons string file-list))))

2016年7月25日月曜日

同一フレーム内にediffのコントロールバッファを表示

 たぶんあるんじゃね、と思って探していたのだけど、見つけられなかった。何度もググってもだめで、speedbarのようにできないのかな、とあきらめていたところ——偶然、判明した。->「来年も使いたいelispランキング2013
 同一フレーム内にediffのコントロールバッファをだす方法である。
 ediffは超絶便利なのだけれど、コントロールバッファが別フレームにでるのがデフォルトなのだ。フルスクリーンで使っているとこまってしかたがなかった。しかもdiff対象のバッファが上下二分割されてしまうし。これは左右分割にしたい。howmのときのように
 とういうわけで上記、サイトより設定をinitにコピー。

;; コントロール用のバッファを同一フレーム内に表示
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
;; diffのバッファを上下ではなく左右に並べる
(setq ediff-split-window-function 'split-window-horizontally)

2016年7月24日日曜日

WindowsのEmacsからエクセルのファイルはエクセルで開くようにしたいんだよ

 たとえば、Macだと下記のようなコードをinit.elに放りこんでおくと、dired-modeでWで、指定したファイルをopenコマンドで呼び出してくれる。これはファインダーでダブルクリックしたときと同じ動きをしてくれるもので——pdfファイルだったらpdfビュアーで開いてくれる。これでエクセルのようなEmacsで開いてもしかたがないようなファイルを対応したアプリケーションで開くことができるようになる。

(require 'deferred)

;; diredで外部プロセス起動
(add-hook 'dired-mode-hook
   (lambda ()
     (define-key dired-mode-map
       "W" 'dired-open)))

(defun dired-open ()
  (interactive)
    (deferred:process "open" (dired-get-filename)))

 元々、このコードはMeadowがらみで知った1。Meadowにはfiberという、Macのopenコマンドに相当するものが同梱されていたのだ。そのMeadowも今はメンテされていない。
 Windowsで動くEmacsはいくつか、あるのだけれど、さすがにfiberはなくてかわりにstartコマンドがある。でもこいつを呼び出すにはどうしたらいいのかなぁ、なんかstartコマンドが見つからないんですけど、と思っていたら内部コマンドだということを知った。そうか。2
 ところがEmacsのパス構文がちがうため、フルパスでstartコマンドを渡すとうまく動作しない。前記のサイト2でもディレクトリの部分をのぞいたファイル名だけにしていた。MeadowはWindowsのパス構文の変換ができた。もしかしたらEmacsに取り込まれているんじゃないか、とelispを漁って、見つけた。

 w32-convert-standard-filename

 で、前記サイトのコードを元にこうした。

(defun my-x-open (file)
  "open file."
  (interactive "FOpen File: ")
  (message "Opening %s..." file)
  (call-process "cmd.exe" nil 0 nil "/c" "start" "" (w32-convert-standard-filename file))
  (message "Opening %s...done" file))

 これを使ってbookmarkの一覧バッファや、orgのハイパーリンクから外部コマンドで立ち上げることができるようになる。良きことかな。

追記:2016年7月31日(日)
cmd.exeをcall-processなどしなくてw32-shell-executeで呼び出せることが判明……。

Footnotes:

1

もちろんもうすこしちがうコードだった。当時はdeferredとか、なかったし。

2

サイトはググっても見つからなくなってしまった……。

2016年7月23日土曜日

Emacs for Windows

 事情があってWindows上でEmacsを使うことになった。
 かつてはMeadowというすぐれものがあったのだけれど、Emacs本体に取り込まれてしまったのか、現在はメンテされていない。四月ぐらいにはWindows上でgnupackのEmacsを使っていてまぁ、それでいいか、と思ってさっそくインストールした。これだと、CygnusというWindows上で動くUnix環境もついてくる。なのでいろんなコマンドが使えて便利だ——grepとか、findとか。
 ところがCygnus上で動作しているためか、動きはもっさりしているし、やたらとvforkエラーがでる1。四月のころはそんなにエラーにならなかったような記憶があるのだけれど(それでもエラーはでた)。32bit環境で動作しているせいかもしれない。なんとなく、Windows3.0のころのMS-DOSを思い出した。
 それくらいエラーが頻発する。

 こりゃ、たまらんというわけでNTEmacs64を入れることにした。
 IMEパッチはいらないので(どうせSKKを使う)、emacs-24.5.zipだ。
 動作はgnupackより機敏。vforkエラーもいまのところでていない。ただ問題はUnixコマンドが全然、使えないことで、たとえば、圧縮されたファイルを開けない。おかげで同梱されているelispが圧縮されていて往生した。外部コマンドに依存している機能は基本的にはだめだろうが、まぁ、vforkエラーの不快さよりはましだ。
 一番、使いそうなgrepはeshellのpoor grep2, 3で代用できるだろうし。

Footnotes:

1

diredだけでvforkエラーになる。くり返せば、いずれいくのだが、はっきりいってうざい。

2

ただし、popwinを使っていると画面がむちゃくちゃになるのでオフにしていた方がいいかも。

3

実はpoor grepだと文字コードが混在してもgrepが効くので(たぶん)逆にCygnusのgrepよりもよかったりする。遅いけどね。

2016年7月20日水曜日

バッチ処理

 たとえば、Emacsだと、batchモードというものがあって画面を表示できないような状況でも処理を実行できる。つまりログインしてなくてもcronの時間起動で動かすことができるというわけ。ところがほかの画面を持つアプリケーションだとそうはいかない。
 画面表示でエラーになってしまう。
 これがちょいとばかり問題で、というのも時間起動で勝手に動かしておきたいのに、わざわざログインして手作業で動かさなくていけない——そのまま、放ったらかしにしておけば、いいのだが、不用心だし、猫がキーボードの上にのったりしたらおかしくなってしまう。でも画面を表示しなければ、だめなわけだからどうしようもないよなぁ、と思っていたら——。
 Xvfbというものの存在を知った。
 仮想的にXサーバを立ち上げてくれるソフトで極端な話、ノンディスプレイのハード構成でも画面を表示するアプリケーションを動かすことができる。つまりアプリの画面が仮想的なXサーバに表示されるわけだ。見えないけど。でもアプリは動く。もし表示されている内容を確認したいのなら画面ダンプをとれば、いい。

import  -display :1 -window root test.jpg

 あとは時間がきたらCtrl+qのキーボードイベントをその画面にたいして発行して終了させれば、いい——それにはxautomationが使える。1

xte -x :1 "keydown Control_L"
xte -x :1 "key q"

 これでもしかしたらFireFox2を動かして特定のhtmlをPDF出力なんてできるんじゃないか、自動で。

Footnotes:

1

:1はXvfbで立ち上げたディスプレイID

2

FreeBSDのFireFoxではPDF出力ができる

2016年7月16日土曜日

remount

 また、やってしまった。
 ひさしぶりにThinkPadのFreeBSDの/etc/fstabをいじって——bootできなくしてしまった。shellに落ちる。ところが、/etc/fstabを元にもどそうと思ってもディスクがread-onlyでmountされているので、/etc/fstabを修正することができない。
 頭を抱えこむ。
 今までにも何度も似たようなことをやっていて、そのたびに、ディスクを筐体の中から取り出してほかのマシンにつないで事なきを得ていたのだが——。また、同じことをやらなければ、ならないのか、とちょっと自分に嫌になってしまった。しかもすぐにUFSでマウントできるようなマシンがない……。
 まいったな。
 ふと気づく。もしかしたら何か手があるんじゃないか。
 グーグル先生におうかがいをたててread-onlyのディスクをremountして書きこみ可能にできるらしいことを知る。

mount -o remount ,rw /

 ところがこれでうまくいかなかった。optionにremountなんてない、といわれる。たしかにグーグル先生が教えてくれたのはLinux環境のものだった。同じだろうと思ったのだが、たしかに「man mount」で調べてみても「remount」なんてoptionはない。
 ——FreeBSDではできないのか……。
 半分、絶望して検索ワードにFreeBSDを追加してようやく正解が判明。

mount -o rw /

 だった。

2016年7月1日金曜日

地下沢中也「預言者ピッピ」

 地下沢中也「預言者ピッピ」(1)
 地下沢中也「預言者ピッピ」(2)

 購入しようと思ってAmazonへ行ってみると、Kindle版しかなかった。1
 しかたなく、Kindle版を買ったのだけれど、あまりにもおもしろくて夜中にあわてて2巻も買ってしまった。そうでなかったら何日間か、やきもきしていただろう。ところが——。
 ところがである。
 3巻はまだ、でてない。
 なのでさらにやきもきしている。ああ、どうなるんだろう、この話……。

Footnotes:

1

今は紙の本も入荷しているようだ。