Hatena::ブログ(Diary)

三等兵

2016-04-12

さよなら、Emacs

f:id:sandai:20160411220633p:image:w360


ついにこの時を迎えてしまった。

不満はない。しかし、居心地のよいHelm.elとお別れをしなければならないのかと思うと小指の古傷がうずいて仕方がない。私を引き止めようとしているのだろうか、まるで考えなおせといわんばかりに。

だが、私の小指はもう…...。

…...いや。

ああ、少し昔話をしよう。

私はその昔、Emacsを最高に使いこなせるようにと小指の修行をしていた。もうずいぶん昔の話だ。

2,3年ぐらい前だ。

なぜそのような修行をしていたのかというと最高の小指を用意するためである。もちろん、最高のEmacsに応えるために。

iPadやiPhoneは小指だけで操作し、かの松尾象山も躊躇したという片手小指逆立ち、小指ピンポンダッシュ、アマゾンの奥地にて小指を餌に見立てたピラニア小指一本釣りなど、様々な修行をしてきた。

なかでも特に困難を極め、私の小指もこれまでかと覚悟した修行がひとつあって、それが24時間耐久熱湯風呂だ。


全身が熱かった。

このように、一歩間違えば二度とEmacsを操作することができなくなってしまうような、そんな過酷な修行を私の小指は行ってきた。

なぜなら、私は最高のEmacsを、最高の小指によって、最高にEmacsを使いこなしたかったからだ。

そうして数々の修羅場をくぐり抜けてきた小指から繰り出されるC-x C-fは、この世の誰よりも美しく芸術的で、なにより速い。その速度は光を超えている。

動いているのは主に中指と人差し指だが。ともかく。

もはや私の小指は物理法則を超えて時間という概念にとらわれなくなったのだ。

私がキーボードで1文字をタイプするときにかかる時間はおよそ0.1秒ぐらいだが、C-x C-fだけはそれをはるかに超越し、光の速度を超えてタイプした瞬間に時(とき)が止まる。


ふぁさああって。

この通り、私は時間の向こう側に広がる宇宙を小指によって感じられるまでに至ったのだ。その瞬間に、本当の意味での自由を得られる。私は小指によって獲得したのだ。

世界を。宇宙を。自由を。


イッツ、フリーダム。

諸君、これがEmacsだ。そして、これがEmacs使いだ。

私だけではなく、この世に生きる全てのEmacs使いは誰しもその小指に宇宙を宿している。我々Emacs業界ではそれを「コスモ」と言いEmacsを使う上でかかせないパワーだ。

もしきみの同僚がEmacsを使っているのであれば目を凝らして彼、又は彼女の小指の「向こう側」をみてみるといい。

どうだ、みえるだろう。

いや、きみは、みえなければならない。真っ当であるならば。

きみが真っ当な人間であるならば、その彼、又は彼女がC-x C-fをタイプした瞬間、小指の向こう側に広がるそのコスモを感じ取ることができるはずだ。


ふぁさあああ。


それこそEmacs使いだけがなし得ることができるこの世の理からの解放、宇宙への回帰。そしてペガサス流星拳(小指のみ)。

我々Emacs使いは、Emacsとその小指に宿るコスモによって本当の意味でこの世界からの自由を獲得したのだ。


しかし。

私は、Emacsとさよならをしなければならない。今日、この鍛えぬいた傷だらけの小指と共に。小指を酷使をしすぎたせいか、いつからか小指のコスモが反応しなくなってしまったのだ。

以前にはできていた重力波も観測することはできなくなった。

ああ、今まで黙っていて申し訳ない。実は、小指から重力波を観測できていたのだ。人類史上初の快挙であると自負しているが「ちょっと偉大な一歩過ぎでは?」と思っていたから黙ってた。

だが、いまなら話しても大丈夫だろう。もはや、私の小指は…..。


ピクピク。

ふふ、ほら、この通りだ。ピクピクしかしない。しかし、重力波を観測するためにはクイクイなんだ。

でも......ああ、くそ、クイクイが、クイクイができやしない。アイムソーリーアインシュタイン。

もはや、こうなってしまってはもう……。

私に。

私に、Emacsを使う資格は、ない。

残念だがここまでだ。仕方がない。小指に宿る宇宙を失ってしまったEmacs使いなど、ただの小指同然だ。


さよなら、私の宇宙。

さよなら、Emacs。

さよなら、そして、こんにちは。


Vim。

ビム。

ヴィム。


さて、これからはVimを使っていこうと思います。Sublime TextやAtomは合いませんでした。今の時代にそもそもテキストエディタってどうなのかと疑問に思うわけでもありますが、とりあえずVimを使っていこうと考えています。

というわけで、これからVimとなかよ…...


っと、いや、ぬぅ!?

ま、まて!なんだ、このVIm圧は!

くぅ、なんと、まさか信じられん!私の小指が…..震えている、だと……っ!?


ブルブルブル。


そしてこの心臓にまで届く暗黒の波動…..ッ!

何者も逆らうことを許されない圧倒的なパワァー……!


まさか、これは!

いや!

お ま え は……っ!!!


あ ん こ っ く び む あ う ぇ !!!!

f:id:sandai:20160411220634p:image:w360

Dark Vim Master/暗黒美夢王(Uncock Vim Awe)

(???? ~ 2016 Vim生まれVim育ち存命中)


特徴 :

フーッハッハッハッハッハ


twitter:

https://twitter.com/shougomatsu


なぜ、このタイミングで私の前に…...!

いや、そうか。そういうことか。Vimに入門したいならまずは私を倒せと。そういっているのだな。

なるほど、通りでVim使いは誰も彼もが上質な闇のオーラをまとっていると関心していたのだが、そういうことか。この圧倒的な闇の力を持つあんこっくびむあうぇーを倒して入門しているからだったのか!なんと、おおぉ…..。


おお、なんということだ!

あんこっくびむあうぇーとは、Vim使いとは、なんと恐ろしい奴らなのだ!

さすが青春という人生の宝物を犠牲にしてVimの設定やプラギーンに費やしてきただけのことはある。通りで心に深い闇があるわけだ。

心の深淵に闇を宿す者、それがVim使いということか。

くそ、Vimの前にこのような大きな闇が存在していたとは。

こうなっては、この壁を乗り越えてVimに入門するためには。


Emacsで修行するしかない!

Vim使いが「心の深淵に闇を宿す者」なら、Emacs使いは「小指に聖なる宇宙を宿す者」である!設定は後付けだが!

ともかく私はその聖なる宇宙によって、Vimに入門するために、Vimの闇に打ち勝たなくてならない。


そういうことであれば、いまここに宣言する!

私は必ずEmacsを使いこなすための小指を取り戻し!

この小指から放たれるであろうペガサス流星拳によって闇を打ち砕くことを約束しよう!

そして、Vimに入門するという、その悲願を叶えるのだ!


さあ、では、こんにちは、Emacs!


Emacsを使いながらVimを使いながらザ・ワールドしながら私は元気です

ファンキーパーリーテキストエディターズのみなさん元気ですか。

私はEmacsをいじりしながらターミナルでVimを開きながら銀河に思いを馳せてときどき時間が止まったりしていやあまいったなあははあははうりいいいなんて日々を過ごしていました。

つい最近になって重力波の観測もできるようになったので、いよいよ私の小指も「…...至ったか」と感慨深いものがありましたが、まさかの負傷。深爪。まさかの。人類史の歴史を変える偉大な一歩が。深爪で。おやおや。

みなさんも少し気を抜くと時が止まったり重力波を観測したりといった現象に度々見舞われることがあるかとは思われますが、お互い気をつけて生きたいものですね。

それでは、さような…...って、おやおや!こ、これは!


仕事ですぐ役立つ Vim&Emacsエキスパート活用術 (SoftwareDesign別冊)
4774180076
出版社: 技術評論社(2016-04-09)


こんなところにEmacsもVimも扱う人にはもってこいの技術本があるのでは!?なぜここにあるのでは!?買ったらいいのでは!?

と思ったけどamazonには電子書籍版がありません。技評の電子書籍サイトにありました。


kindle版をまだ用意していないとは。これが......これが技評の選択、か。

どうしよう。

2012-06-13

AppleScriptをEmacsで編集するときの注意点とapples-mode導入手引き

EmacsでAppleScriptを書くときの設定。


とりあえずメジャーモードを導入

Major mode for AppleScript - Clipboard

ひと通り機能が揃っている。

  • キーワードの色付け
  • インデント
  • AppleScript の実行と結果の表示
  • エラー箇所のハイライト
  • 機能の殆どはメニューからアクセス可能
http://d.hatena.ne.jp/tequilasunset/20110116/p1

さらに、デコンパイルもできるのでコンパイル済みのファイルも編集可能。すばらしい。希少種のEmacs使いAppleScripter歓喜。


利用するのであれば.emacs(dot.emacs.d/init.el)に次のコードを記述。

(autoload 'apples-mode "apples-mode" "Happy AppleScripting!" t)
(autoload 'apples-open-scratch "apples-mode" "Open scratch buffer for AppleScript." t)
(add-to-list 'auto-mode-alist '("\\.\\(applescri\\|sc\\)pt\\'" . apples-mode))

これでapplescriptのファイルを開けば色付けされており実行も可能となる。しかし、「applescriptテキストエディタで編集したファイル」は普通には開けない。


applescriptテキストエディタで作成されたapplescriptファイルを開く場合

applescriptテキストエディタで編集されたapplescriptファイルをEmacsで開くとutf-8などで開くと文字化けするかもしれない。

どうもapplescriptはshift-jisみたい。なんでじゃ。AppleScriptエディタから文字コードいじれない。Emacsをshift-jis以外で利用しているのであれば文字化けすることになるからshift-jisで開き直す。

applescriptファイルのバッファ上でC-x RET r sjisとタイプ。指定した文字コードで再読み込みすることができる。sjisのとこはshift-jisとかjapanese-shift-jis-unixなどそれっぽいことを書く。

これで再読み込みされて日本語の文字化けが治ったはず。おそらくバックスラッシュの部分は正しく変換できずに\200みたいになってるはずだからこれは手作業で直すしかない。

そうしてこのファイルをたとえばutf-8に変換して保存するには、C-x RET f utf-8として保存することで変換できる。このとき\200などの文字があればたぶん変換できないので手動で直すかなんかする。


scptファイルを開く時と保存の時に自動で(デ)コンパイルする

個人的にはapplescriptをテキスト形式で保存するといったことはほとんどなくコンパイルしてscptで保存している。

しかし、コンパイルされたscptファイルのデータはバイトコードなのでEmacsでそのままで開くとわやくそ。これはapples-modeのM-x apples-decompileを使うかC-c t dでデコンパイルすることができる。

とはいえいちいち叩くのが面倒なので、ファイルを開くときに自動で行うように設定して、ついでに保存するときにコンパイルするような設定にしておこう。また、これはscptファイルのみに対して行うようにする。

開くときの設定。

;; scptファイルを開くと自動でデコンパイル
(add-hook 'find-file-hook
          '(lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-decompile (buffer-file-name)))))

scpt拡張子のついたファイルを開くとミニバッファにどのように開くかメッセージが表示されるので、普通に開くときはoキーをタイプする。

個人的にはこのoをタイプするのも面倒だから、

;; デコンパイル終了後の確認を無効
(setq apples-decompile-query '?o)

とした。次は保存の設定。

;; scptファイルを保存すると自動でコンパイルした内容を保存
(add-hook 'before-save-hook
          '(lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-compile (buffer-file-name)))))

C-x C-sなどで保存するときに、scptファイルの場合コンパイルして保存するようにしている。コンパイルせずに保存するこれはまた面倒なことになる。

というわけで、もろもろ含めて.emacsの設定は以下の通りにした。

(autoload 'apples-mode "apples-mode" "Happy AppleScripting!" t)
(autoload 'apples-open-scratch "apples-mode" "Open scratch buffer for AppleScript." t)
(add-to-list 'auto-mode-alist '("\\.\\(applescri\\|sc\\)pt\\'" . apples-mode))

;; デコンパイル終了後の確認を無効
(setq apples-decompile-query '?o)

;; scptファイルを開くと自動でデコンパイル
(add-hook 'find-file-hook
          (lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-decompile (buffer-file-name)))))

;; scptファイルを保存すると自動でコンパイルした内容を保存
(add-hook 'before-save-hook
          (lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-compile (buffer-file-name)))))

最低限覚えておくと良いコマンド

  • apples-open-scratch
    • scratchバッファのapplescript版
    • C-c t r
  • apples-decompile
    • デコンパイル
    • C-c t d
  • apples-compile
    • コンパイル
    • C-c t k
  • apples-run-region/buffer
  • スクリプト実行
    • C-c t r
  • AppleScriptエディタにスクリプト写して起動
    • C-c t s

ほとんどメニューから利用できる。キーバインドはいじった方が良いかもしれない。めんどくさい。


おまけでapples-modeのauto-complete用の辞書

ついでに作ったんでauto-completeを利用しているのであれば辞書もどうぞ。

これでひと通り機能は揃ったはず。

細かい部分で動作がおかしいところがあるから修正しつつ使ってみようと思ったけど細かい確認になるとAppleScriptエディタの方が便利だしあまり困ってないしずっとAppleScriptと付き合っていける自信がないしたぶんするつもりもないので放置する。ひどい。

とはいえ、面白い言語です。気軽に書く程度なら簡単んだし文法が英語だから英語できる人ならすんなり入れると思う。でもハッシュみたいなのないから扱いにくい。言語としてはシェルスクリプトっぽいのを目指したのかな。

2012-03-23

もっと早く欲しかった。Emacsの鉄板入門書は『Emacs実践入門』で間違いない

f:id:sandai:20120322220840j:image
(友情出演:買ってきたうまいキャベツ)


id:tomoyaさんこと大竹智也さんご本人から『macs実践入門ー思考を直感的にコード化し、開発を加速する』を献本していただきました。ありがとうございます。書評が遅れてすみません。ちょっと血便でわさわさしてました。


いまなら確実にEmacsは入門しやすい

確かEmacsに出会ったのは2年前。おそらく当時の私であればEmacsを誰かに使ってみたらと安易にすすめることはなかったでしょう。

酷使した両手からしたたる血によってキーボードは真っ赤にそまり、Emacs Lispの括弧プレッシャーで括弧恐怖症となってしばらくかぎ括弧しか使えなかったあの頃。ロックマンに出てくるE缶のEの文字を見るたびにビビってティウンティウンだったあの日々・・・。

そんなトラウマを経験した私がすすめするわけがないでしょう。そしてこんなことがあったなんていう事実もないでしょう。

もちろん全て嘘なのですが、とはいえ、これは他人にすすめてええもんじゃねえだろと思っていました。だってできないんだもん。難しいもん。わけが分らないんじゃもん。

しかし、いまなら、興味があるなら使ってみたらとすすめることができます。

え?なぜかって?それはきまってるよ!現在にあって過去にないものがあるじゃないか!そう、『Emacs実践入門ー思考を直感的にコード化し、開発を加速する』があるじゃないか!!



という茶番はともかく。


ありそうでなかった初学者のための体系的なEmacs入門書

Emacs関係の書籍は入門書的な位置付けの書籍が少ないです。2年前にAmazonでEmacsと検索しうなだれていた私が言うのですからきっと少ないのです。

オライリーから入門と題して出版されていますが、オライリーの入門書は入門どころのさわぎではありません。じゃあ他には・・・と探すと、だいたい古くて昔のしかない。あとはid:rubikitchさんのEmacs本が2冊(no title)ほどあったりしますが入門向けではありません。

このように、ありがちな初学者のための入門書がEmacsにはしばらく存在しなかったのです。だから以前あのような記事を自分で書いたりしました。ストレスたまってたのでおかしなことなってますが。

でも私はキーバインドの基本的な操作から概念的な内容をカバーしつつ、拡張を駆使した最新のEmacs環境が手に入れられる、そんな情報がまとまったEmacs本が一冊手元に欲しかった。あればいいのになとずっと思っていた。そしたらおかしなことにならなかった。

そして、ここに至ってようやく手にすることができました。今は、私の隣でぐっすり眠ってるぜ。キャベツ食ったからな。


本書が果たす入門書としての役割

本書の強みはEmacsの管理、操作、概念、拡張機能などといった、Emacsを入門する上で必要な情報が初学者でも分かりやすいように日本語でまとまっていることだと思います。

体系化されたそれは、Emacsのヘルプとウェブを彷徨う手間や時間を短縮し、正しい知識を身につけながら効率的に学ぶことができるでしょう。最初から最後まで読み進めれば最先端とはいきませんが、実用に近い開発環境が得られるようになっていると思います。


しかしながら、本当に初めてEmacsに触れる方は途中で脱落してしまうかもしれません。

でも、それはそれで問題はありません。たぶんキーバインドや拡張あたりでうんざりすると思いますが、だいたいの人はその道を通っているはずです。みんなうんざりしたことあるはずなんです。

私もうんざりしていました。他にもよくわからない専門用語にうんざりしていたし、ミニバッファとかいう一番下の用途が分からないやつにもうんざりしていたし、scratchの英語メッセージにもうんざりしていました。今でもdefadviceにうんざりしています。ああ、どうしようもなくうんざりしかしていない。


いえ、だから、逆に言えばそこで脱落したりうんざりしたり悩んだりするのは正解で、もっといえばこれを乗り越えるのが大正解です。

キーバインドが覚えきれなければ無理して覚える必要はありません。拡張の機能が分からなければ放置してください。もし用語さえも分からなかったらそれも放置です。

ずいぶんいい加減なことを言っているように思えるかもしれませんが、これぐらい余裕を持った方がすんなり乗り越えていけると思います。

本書の強みは先程も述べたように入門に必要な情報が初学者でも分かるよう日本語でまとまっていることです。これの意味することは、つまり、全ての知識を本書に頼ってしまえば良いというわけです。

全てを覚えて何事も自分で完結させるのはもっと後にしましょう。最初の1週間や2週間、まだ足りなかったら1ヶ月は本書に全て頼ってください。きっと時間が立つごとに本を開く回数が減っていくはずです。

こういった姿勢はゆるいといえばゆるいのですが、脱落してあきらめるよりマシではないかなと思います。

対象となる読者

Emacsの情報を日々追っていてがっつり拡張している人は物足りないと感じるでしょう。そして本書もそういった人はターゲットにしていないはずです。

となると、以下のような人が当てはまるのではないでしょうか。

  • Emacsに興味があるけれどなんか難しそうだから手を出していない人
  • Emacsを使っているけれど使いこなせているのか自信がない人
  • うんざりしてEmacsとさよならしちゃったけどやっぱり気になる人

などなど。

また、本書の冒頭でもまつもとひろゆき氏が「本書に寄せて」でこのようにおっしゃっています。

本書はEmacsのインストールから便利な拡張機能の紹介まで、Emacsの初歩から中級レベルまでの知識が紹介されています。本書がより多くの人々にEmacsの可能性を提示する入口となりますように。

少なくとも中級レベルまではあるとのことなので、初学者から中級に手が届きそうな人までといったところでしょうか。私もここに含まれますので、だから、もっと早く欲しかったのです。


今までのEmacsの入門は苦行だった

Emacsは入門が最大の壁と言えます。必要な情報が多い上に操作が複雑だからです。

しかし、「難しい」かというと少し違って「どうしたらいいのかが分からない」のです。どのように操作を覚えて知識を養っていけば良いのか道筋が見えません。この道は正しいのか、遭難していないのか、ビクビクしながら山登りをしているような感覚です。

ウェブを検索すると、あるのはキーバインドの表が載っているページと、おまじないとしかおもえないような内容の.emacs閲覧会と、Page not found · GitHub Pagesとかなんかいつの間にか死んでたページしかない。

まあ死んでてもいいけど、いや、良くないけどちょっとまってくれ、とりあえず最初は何を定石として学習したらいいのか教えてくれと、そんな思いです。

もちろんいくつか入門的な記事はあります。

本書の著者もこのように記事を書いていらっしゃいます。

しかし、知識がない者からすればドットファイルってなに?からスタートです。設定ファイルを自分で書かなければいけないことに驚きで、あたふたいろいろ調べてそのうちめんどくせって脱落してしまうでしょう。

こんなのUnixの世界でバリバリ生きている人にはぬるく感じるかもしれません。

でもそういった人間だってEmacsを使ってみたい。きっかけがEmacsであっても良いはずです。

だったら入門が苦行になっていてはいけません。入口はもっとハピハピハッピー*1であるべきです。

おれが苦労したことはお前も苦労しろだなんていう現実的な社会のルールはこの世界にはいりません。これから学ぶ人はもっと確実で簡単に入門して欲しい。入口はもっと楽に通りすぎるところで、そこから先の部分で悩むエネルギーを費やすべきなのです。

だからもし、これからEmacsを使ってみようかなと興味を持っている人や、なんとなくEmacsを使っているけれどもっとEmacsを使いこなせるようになりたいと思っている人がいたら。私は、私と同じようにEmacsがインストールされたPCの隣に本書を添えることをお薦めします。

Emacs実践入門 ~思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)
4774150029

サポート

サポートページ:Emacs実践入門―思考を直感的にコード化し,開発を加速する:|技術評論社


余談

ヘルプが好き

Emacsのヘルプの扱い方を覚えるとEmacsに対する苦手意識がなくなりました。それにヘルプの見方を覚えるとLispが読みやすいです。本書のp54で紹介されているのでこれだけはぜひ覚えてください。

さらにAnythingという拡張にもっと便利にヘルプが扱えるコマンドがいくつかあるので、慣れたらそっちに移行すると良いと思います。

覚えない

キーバインドは覚えようとしないことです。一度には無理です。天才と自他ともに認めるできすぎ君ならともかく、できすぎない君は覚えられないです。めんどうですがキーバインドを忘れたらその度にEmacsのヘルプや書籍で確認しましょう。たぶん3,4回目ぐらいで覚えてるはずです。

小指について

私はネタで言っているだけなんですが痛くはなりません。でも以前にLenovoのキーボードで腱鞘炎ぽいことになったことはあります。小指関係ない。

Lispについて

EmacsにはEmacs LispというLisp処理系がありまして、これでEmacsを拡張していきます。そして拡張するには当然Emacs Lispを読んだり書いたりしなければなりませんが、読むだけなら読みやすいです。だいたい雰囲気で読めます。括弧はハイライトさせて端っこで踊ってるだけなんで気になりません。

なので、拡張を少しいじったり、ちょろっと設定を変更する程度なら誰でもできるようになるはずです。Emacs Lispをもっと本格的に学びたいのであればウェブの情報よりるびきちさんのEmacs Lispテクニックバイブルが良いかもしれません。でも最初はヘルプで事足ると思います。

エディタ戦争とか宗教論争とか

時々話題にあがりますが軽い揶揄だと思います。多くの人は「そんなことよりおれの嫁を探してくれ」といった程度です。そんな不毛な争いはこりごりで関わりたくないし、それよりもおれの嫁を寄こせというわけですがごめんなさい適当なこといいました。

でもおそらくみんな嫁は探してます。

○○さんが使ってたからとか、単純に使いやすいと聞いたからとか、上司に強制させられたからとか、嫁ができそうだからとかそういう理由でエディタは選べば良いと思います。

なので、Emacs気に入らなかったらぴぇーつってVのあれをぴゅーと使えばいいです。

だがしかし、Emacsはモテるらしい

よめさがしにEmacsはつかえるぞやろうどもうおおおよめはいねぇがあ。


感謝

以前にVimっぽい本をくれといったらEmacs本を手に入れました。ツンデレ戦法が良かったのかもしれません。

少し言い訳をすると技評さんに対してなんかくれとふざけていったのであってご本人様ではないのですが、いずれにしても乞食的な悪態であるのにも関わらず、id:tomoyaさんのご好意によって自筆のお手紙と共に献本を頂戴しました。ありがとうございました。

普段は自分で買ったチロルチョコさえも小さい子どもに絶対に譲らず、0歳時の子供に対して高橋名人並の連射をもってほっぺをぷるんぷるんし、その子の使用済み紙おむつ片手にあひゃひゃひゃと腐ったみかんの大人共に制裁(うんこ)を下す悪童な私ではありますが、ここに態度を改めることに致します。

というわけで、感謝の気持ちと誠意を込めて書評?といえるか分かりませんがレビューさせていただきました。




じゃあ、さあ、Vimっぽいのくれ。

おわりw

2012-03-10

Emacsを最大化、又はフルスクリーンにしてやろうか!という拡張の話

またまた以前の記事で書かなかった残骸。MacとWindowsでざっと流すのみ。

Mac

最大化

手っ取り早いのはset-frame-sizeに直接値を入れる。frame-height/widthで値とって入れれば良い。

;;macbook airで11インチの場合
(set-frame-size (selected-frame) 95 47)
フルスクリーン

Homebrewだとcocoaオプションで入れればコマンドでns-toggle-fullscreenがあるからそれでフルにできる。バイナリやソースからとかMacPortsはどうなってのかわからないけど、なかったらソースからビルドして自分でパッチあてれば良い。

私は試しにソースからパッチあてたりしたけどそもそもns-toggle-fullscreenで良いと思って捨てた。IMEパッチも今のところ支障がないので気にならない。Emacs24はどういった状況かは分からない。


windowsの場合

windowsはフルスクリーンの方法が確認できなかった。とりあえず最大化は以下の方法で行える。

w32-send-sys-commandというコマンドは、何これ。システムコールでいいのか。システムコマンドっていうのか。ともかく以下のようなcodeが使える。


拡張

MacとWindows向けの最大化の拡張がある。

maxframe.elを入れてそこにあるコードを使えば、WindowsとMacでも自動で使い分けて最大化してくれる。

ウィンドウの大きさを制御するとこだけざっと読んだ

Windowsはw32-send〜で行っているっぽい。

Macはどのようにやっているのか想像できていなかったけれど、displayのピクセルの値をどうにかこうにかしてるみたい。というわけでいろいろ簡略化すると、たとえばheightは以下の式で導いている。

(/ (- (display-pixel-height) 45) (frame-char-height)) ;; =>48

なるほど。ディスプレイのピクセルの高さからメニューバーやタイトルバーの高さを引いて、文字の高さというか行の高さかな?それで割るらしい。手動でめいいっぱい広げて(frame-height)とするとこちらでは47だから1だけ違うけどどうでもいい誤差か。あるいはミニバッファが一行あるからそれのやつ?だろうか。

45という数値はメニューバーやタイトルバーの高さ。コメントには数値が以下のように書いてあった。

;; The default accounts for a Mac OS X display with a menubar

;; height of 22 pixels, a titlebar of 23 pixels, and no dock.

どうやって調べたんだろう?とりあえず案外と最大化は簡単にできる。

2012-03-09

Emacsで扱うログやキャッシュを~/.emacs.dディレクトリ内で管理する

ややこしかったので以前の記事には書かなかったこと。ログやキャッシュと表現していいものか分からないが他に適当な言い方が思いつかなかったのでそのように表現する。

たとえば、recentf-modeやsavehist-modeを有効にすると.recentfやhistoryといったファイルがホームディレクトリや~/.emacs.dに生成されるが、そういったファイルを全て~/.emacs.d/以下で管理することにした。

現在管理しているログやキャッシュといった類のものは以下の通り。

  • auto-complete
  • eshell
  • migemo
  • recentf
  • savehist

実はほとんど意味がない。一箇所にまとめられてなんとなくすっきりする以外にメリットがない。それはシムシティでいうところの商業区とか居住区とかすごく気にするような性格を持つ人間以外にメリットがない。それでもやるのだ。やってしまったのだ。後から気づいただけなのだ。そのときちょっと落ち込んだ。

とりあえず、これらのログやキャッシュの保存する場所を変更するために以下のコードを.emacsに記述している。

;; auto-complete
(setq ac-comphist-file "~/.emacs.d/cache/auto-complete/ac-comphist.dat")

;; eshell
(setq eshell-directory-name "~/.emacs.d/cache/eshell/")

;; migemo
(setq migemo-pattern-alist-file "~/.emacs.d/cache/migemo/migemo-pattern")
(setq migemo-frequent-pattern-alist-file "~/.emacs.d/cache/migemo/migemo-frequent")

;; recentf
(custom-set-variables
 '(recentf-save-file
   (format "~/.emacs.d/cache/recentf/%s"
           (replace-regexp-in-string "\\." "_" system-configuration))))

;; savehist
(setq savehist-file "~/.emacs.d/cache/savehist/history")

;; savehistのファイルに保存する履歴からfile-name-historyをのぞく
(setq savehist-ignored-variables '(file-name-history))

;; file-name-historyを外部に保存
(add-hook 'savehist-save-hook
          '(lambda ()
            (my-list-variables-save
             'file-name-history
             (format  "%s%s" savehist-file
                      (replace-regexp-in-string "\\." "_" system-configuration)))))

;; OS別に保存しているfile-name-historyを読み込む
(add-hook 'savehist-mode-hook
          '(lambda ()
            (let ((path
                   (format "%s%s" savehist-file
                           (replace-regexp-in-string "\\." "_" system-configuration))))
              (when (file-exists-p path)
                (require 'path nil t)))))

casheというディレクトリを作りさらに種類別にディレクトリで分けている。同じ名前のファイルが他のパッケージなどで生成されると面倒だと思ったので。無いとは思うけれど。あと不可視ファイルにはしていない。だって意味がない。あともう少しいじっているが後述する。


recentfについて

recentfはsystem-configurationで名前を使い分けている。recentfはホームディレクトリに保存されるファイルだから、もし~/.emacs.d/cashe/recentfにそのまま保存するだけだと使っているPCなど違えば開いたファイルの履歴が共有できないし上書で消えてしまう。

というわけで名前を変えて保存することでMacとWindowsの2つのファイルを利用するように設定。その分け方としてsystemなんちゃらということにしたけれど、もっとユニークにしたくてユーザ名など付け加えることも考えたが放置した。そのときまた考える。


savehistについて

デフォルトだとhistoryファイルが~/.emacs.d以下に生成される。コマンドやサーチした語句も保存され使い回せるからだろう。しかしfile-name-historyは共有できていない。そこでそれをsystem-configurationの名前で使い分けることにした。

file-name-historyのリストを外部に保存する関数を用意。savehistの関数をリストのデータ保存用に書きなおしている。

;; リストの内容を外部に保存
(defun my-list-variables-save (symbol path)
  (with-temp-buffer
    (insert
     (format ";; -*- mode: emacs-lisp; coding: %s -*-\n" savehist-coding-system)
     "\n")
    (let ((print-length nil)
          (print-string-length nil)
          (print-level nil)
          (print-readably t)
          (print-quoted t))
      (when savehist-save-minibuffer-history
        (let ((value (symbol-value symbol)))
          (when value
            (insert (format "(setq %s '(" symbol))
            (setq excess-space (point))
            (dolist (elt value)
              (let ((start (point)))
                (insert " ")
                (condition-case nil
                    (progn
                      (prin1 elt (current-buffer))
                      (save-excursion
                        (goto-char start)
                        (read (current-buffer))))
                  (error
                   (goto-char start)
                   (insert "\n")
                   (while (not (eobp))
                     (insert ";;; ")
                     (forward-line 1))
                   (insert "\n")))
                (goto-char (point-max))))
            (save-excursion
              (goto-char excess-space)
              (if (eq (following-char) ?\s)
                  (delete-region (point) (1+ (point)))))
            (insert "))\n"))))
      (let ((file-precious-flag t)
            (coding-system-for-write savehist-coding-system))
        (write-region (point-min) (point-max) path nil
                      (unless (called-interactively-p 'interactive) 'quiet))))))

もちろんこのようなことをやっても気分的によくなるだけでほとんど意味がないし、file-name-historyを使い分ける必要もあるかといえば、他で補完できたような気がしなくもない。たとえばrecentfのデータを使い回すようにしても良いかもしれない。後で思いついた。そのときちょっと傷ついた。

eshellについてはまあよしとして、migemoやauto-conpleteのファイルはそもそも何のファイルか分かってない。とりあえずぶっこんでおいただけである。とりあえずcasheという名前はやめたいのだけれど他に思いつかない。しょうもない。