wpid-IMGP7088.jpg

棚を自作した

棚を作ってみました。

wpid-IMGP7088.jpg

材料はIKEAで買った突っ張り棒と

STOLMEN 支柱 – IKEA

そのアダプター。

STOLMEN エンドフィッティング – IKEA
STOLMEN フック – IKEA

それと、余っていた板切れなど。作業時間は30分ほど。

突っ張り棒の下部にはフックをとりつけてカバンなんかをかけるようにしてます。

wpid-IMGP7090mod.jpg

 

借家住まいは、穴など開けられないので、こういう突っ張り棒は何かと便利です。

org-notify.elでスケジュールとかTODOのリマインダを通知

公私ともども、TODOやスケジュールはorg-modeを中心に管理しています。

管理していると言っても、常にorg-modeのバッファを見ているわけではなく、そもそもずっとEmacsを触っているわけではありません。

Emacsは常に起動しているものの、ブラウザを見ている時もありますし、ExcelやWordと戯れている時もあります。となれば、org-modeの中でTODO、スケジュールを管理してくれる秘書さんが必要です。

それが今回紹介するorg-notify.elです。

deadlineが近いアイテムをお知らせ

org-notify.elは、org-modeにバンドルされている拡張で、contribディレクトリに配置されています。package.elでインストールしたい場合は、org-modeの公式アーカイブを package-archives に追加して、=org-plus-contrib= をインストールしてください。

Org Emacs lisp Package Archive

org-notify では、deadlineが近づいてきたアイテムに対するリマインダをplistで定義します。以下に簡単な例を示します。

(org-notify-add 'appt
                '(:time "15m" :period "2m" :duration 100
                        :actions -notify)
                '(:time "3d" :actions -email))

ここでは、二つのリマインダが定義されています。それぞれのプロパティで、:timeはdeadlineまでの時間、:periodは次のリマインダを表示させるまでの期間、:duration はリマインダを表示させておく時間を示しています。

:action はリマインダの種類を示しています。 -notifyではnotifications.elを使ったデスクトップ通知の形でリマインダが表示されます。 -emailでは user-mail-address で設定されたメールアドレスにメールが送信されます。

:actionはデフォルトで6つ定義されています。詳しくは、org-notify-api.org を確認してください。

リマインダの定義がすめば、 (org-notify-start) を実行することで、リマインダのタイマが起動します。

独自のアクションを定義する

アクションは独自に定義することもできます。例として、前回紹介したgntp.elを使ったアクションを定義してみます。

(defun org-notify-action-growl (plist)
  "Pop up desktop notification via gntp."
  (gntp-notify 'org-notify (encode-coding-string (plist-get plist :heading) 'utf-8)
               (encode-coding-string  (org-notify-body-text plist) 'utf-8) "localhost"))

ここでsuffixがアクション名として認識されます。後は、追加するだけです。

(org-notify-add 'default '(:time    "60m"
                           :actions -growl
                           :period  "60m"))

というわけで、org-notify.elの紹介でした。独自のアクションを定義できるというのが、面白い所だと思います。 IFTTT なんかと連携させてみるのも面白いかもしれません。

emacs_2014-05-19_21:50:49

Growlにgntp経由で通知させるgntp.elの紹介

Emacsでは、ユーザーへ何がしかの情報をお知らせする領域として伝統的にエコーエリアが使われます。例えばコマンドを途中まで入力してしばらく待っているとエコーエリアに入力されたキーが出てきます。 他にも多くのアプリケーションがエコーエリアを使っています。

過去のPCのようにディスプレイの解像度が低ければ、エコーエリアでも十分機能していましたが、現代の広大なディスプレイにおいてエコーエリアはあまりにも小さくなりすぎました。

emacs_2014-05-19_21:50:49

そして、エコーエリアは忙しすぎます。アプリケーションからはどんどん情報が送られてくる傍ら、ミニバッファとしてのお勤めも果さなければいけません。

多忙なエコーエリアですが、送られてくる情報は全て上書きされるようになっており、見ようと思ったら、すでに上書きされて*message*バッファ送りされてたりすることもしばしばです。

こういった話はEmacsコミュニティの中でも問題視されているのか、Emacs24からはDbus経由でのデスクトップ通知ライブラリであるnotifications.elが同梱されるようになりました。

notifications.el – Life is very short

ただ、Dbus自体がプラットフォームに依存するので、あまりパッとしない感じです。

もうだいぶブームが過ぎた感がありますが、やはりデスクトップ通知というと、Growlではないでしょーか。

Growl

Macでは、通知センターができたりして影が薄くなってしまっているようですが、LinuxにもWindowsにもあるのでプラットフォームを選びません。

mattn/growl-for-linux @ GitHub
Growl for Windows

それとGrowlの良い点としてgntpなるプロトコルをサポートしているというのがあります、gntpを使えばプラットフォームの差異をアプリケーション側で吸収できます。

というわけで、今回はそのgntpをEmacsから話せるようにするgntp.elの紹介です。

インストール

MElPAにレシピがあるので、M-x list-packageでどうぞ。

wget派のあなたは、GitHubのサイトからファイルを直接落としてください。

tekai/gntp.el

使い方

まず、通知するアプリケーションをGrowl側に登録しておく必要があるので、 gntp-register-alist に名称やアイコンの情報などを設定しておきます。

(setq gntp-register-alist
      '((org-notify
         :display "Org-mode notification"
         :enabled t
         :icon "http://raw.githubusercontent.com/myuhe/org-gcal.el/master/emacs.png")
        (alert
         :display "org-gcal"
         :enabled t
         :icon "http://raw.github.com/myuhe/org-gcal.el/master/org.png")))

後は、 M-x gntp-register とすれば、登録されます。

通知は、 gntp-notify で実行されます

(gntp-notify 'alert "Emacs message"
              "HELLO WORLD"
              "localhost")

gntp-notify の引数は 順に

  • gntp-register-alist で登録した名称のシンボル
  • タイトルを表す文字列
  • 内容を表す文字列
  • 接続先を示す文字列(ローカルマシンなら “localhost”)

のようになっています。

wpid-IMGP9526.jpg

雪のくじゅうを登った

三が日の最終日にくじゅうに登ってきました。

実は昨年も雪のくじゅうに登りまして、好例行事になりつつあります。

牧の戸登山口を九時にスタート。

IMGP9503.jpg

まずは、星生山に登頂。 ー IMGP9517.jpg

そのあとは、尾根伝いに久住山にむかいます。

IMGP9526.jpg

IMGP9527.jpg

最後の力をふりしぼり、久住山と中岳の二座を制覇。

IMGP9541.jpg

IMGP9534.jpg

この時期の登山者は

「こんな寒いときに、わざわざもっと寒いところに行くなんて奇特な人だ」

と思われがちですが、その経験はなかなか他の何かに代替できない貴重な経験だと思っています。色も音もない世界を一歩一歩踏みしめながら歩いていくと、頭がだんだんリセットされていくような不思議な感覚を味わうことができます。

なので、周りにそういった方がいても、暖かく見守ってあげてください。

ファイルを開いたら、org2blogのマイナーモードを起動する

この日記はorg2blogを使って書いています。

punchagan/org2blog

何しろ、org-modeのフォーマットで書けますし、コードとかもhtmlizeによってハイライトしてくれて、とても便利です。

普段の使い方としては、一つの記事に一つのorgファイルが対応するようにしていて、時間が空いた時などにツラツラと書くようにしてます。Orgファイルを開くだけで良いので、サーバに待たされることもありません。書きあがるまでOrgファイルとして管理しておき、書きあがり次第、記事をアップ。ブログが普及する前の前世代的な運用ですが、こっちの方がサーバやネットワークの反応にイライラすることもなく性に合っている気がします。

ただ、ちょっと不満だったのがorg2blogがorg-mode上のマイナーモードとして動作することです。書きかけのOrgファイルを開いて記事を完成させ、さあアップロード!という段になり、org2blog/wp-modeが有効になっておらず、腰折られたことが度々ありました。

org2blog用に作ったorgファイルは自動的にorg2blog/wp-modeを有効にしておきたいものです。

独自の拡張子をつけて、auto-mode-alistでマイナーモードを起動

すでに、同じようなことを考えている方がいました。

org2blog(Emacsのブログエディタ) | 日暮途遠(Linux)

こちらの方はorg2blog用に拡張子を設定して auto-mode-alistorg2blog/wp-mode を有効にしています。

org2blog用のorgファイルが一目でわかるし、良い方法ですね。

Local Variables の eval 行でマイナーモードを起動

もう一つの方法は、Local Variables でファイルローカルな変数を定義するというものです。 Emacsでは、ファイルごとにローカルな変数を持つことができます。詳しくはinfoをどうぞ。

(Info-goto-node "(emacs) Specifying File Variables")

org2blogでは、Orgファイルのテンプレートを定義する変数 org2blog/wp-buffer-template があるので、そのeval行でマイナーモードを起動させます。

(setq org2blog/wp-buffer-template
      "#+DATE: %s
#+OPTIONS: toc:nil num:nil todo:nil pri:nil tags:nil ^:nil TeX:nil
#+CATEGORY: %s
#+TAGS:
#+DESCRIPTION:
#+TITLE: %s
\n
\n
# Local Variables:
# eval: (org2blog/wp-mode)
# End:\n")

Local Variablesは他にもいろいろと応用がききます。yasnippetのスニペットとして登録しておくといろいろと便利かもしれません。

Emacsのimage-modeでimagemagickの力が封印されている件

言わずもがな、Emacsでは画像が表示できるわけでして、これ とか あれ と比較した場合、大きなアドバンテージの一つではないかと思います。

そして、画像を表示するためのメジャーモードがimage-modeなのですが、調べてみると、実はいろいろと謎が隠されていました。

image-transform-fit-to-*という何ら仕事をしないコマンド

image-modeでは image-transform-fit-to-heightimage-transform-fit-to-width というインタラクティブなコマンドが定義されています。名前からして、いかにもフレームサイズとかに合わせて、画像をリサイズしてくれそうです。おお、便利そう。

ところが、これらコマンドを実行しても何の変化も表われません。はて?と思い M-xdescribe-function で関数を調べてみると次のようなことが書いてありました。

Fit the current image to the height of the current window. This command has no effect unless Emacs is compiled with ImageMagick support.

なるほど、コンパイル時にImageMagickを組みこんでコンパイルしておく必要があるわけです。

Emacsでは、Emacs24.1からコンパイル時に –without-imagemagick をつけない限り、ImageMagickの機能をC source codeレベルで使役できるようになっています。

これら関数では、そのImageMagickの機能を使うようです。ただ、Linuxではコンパイル時に何の指定もしていなければ、ImageMagickつきでビルドしてくれるはずで、わざわざそのような手間をしてビルドした覚えもありません。うーん、さらに謎が深まります。

GNU Emacs Lisp Reference Manual を読む

こういう時は初心に戻りリファレンスを読むのが一番です。

(Info-goto-node "(elisp) ImageMagick Images")

そして、答は冒頭に書いてありました。

The image type symbol for images loaded via ImageMagick is `imagemagick’, regardless of the actual underlying image format.

つまり、imageオブジェクト相当のものを作る時に、=type=プロパティに明示的に imagemagick を与えておかないと、組み込みImageMagickの恩恵を受けられないわけです。

一方、image-modeでは type プロパティに imagemagick を与えていません。このため、 image-mode では image-transform-fit-to-heightimage-transform-fit-to-width が有効に機能していないのです。

Workaround

ちょっと乱暴な方法ですが、画像タイプを返す image-type が常に imagemagick を返すように上書きしてしまいます。

(defun image-type (file-or-data nil data-p)
       'imagemagick)

これで、 image-transform-fit-to-heightimage-transform-fit-to-width が有効に機能するようになります。

また、 typeimagemagick にすることで様々な恩恵が得られます。Emacs上で画像を扱う場合、 create-imag 等で画像オブジェクト相当のものを作るわけですが、この時に width , height , angle プロパティを適用することができ、画像を事前にリサイズしたり、回転させたりすることができるようになります。

通常、同様のことをする場合、imagemagickのconvert等の外部プログラムを呼びだす必要があったわけですがその手間が省け、とてもすっきりした記述で書けるようになります。

なぜ、ImageMagickの機能は封印されているのか

このように便利なプロパティが準備されているのに、なぜ利用されていないのでしょうか。バンドルされているアプリがそのような便利な機能を知らないはずがありません。

その理由を示唆する内容が、MLに書かれていました。

Re: imagemagic in image-mode and image-dired-thumbnail-mode?

ここを読んでみる限り、Joakimさんがいろいろと拡張してたけど忙しくなってきたので、放置しているというのが理由のようです。

うーん、そんな理由で放置するくらいなら、revertするなりブランチ切るなりして安定板には含めないでほしい。。。

ちなみに、このJoakimさん、あの有名なemacs-xwidgetの作者であり、ちょっと変わったEmacs拡張を作られてることでも有名で、度々EmacsのMLにも顔を出されます。もしかしたら、いつの日かimage-modeも改良されるかもしれません。

Helmであまり知られてなさそうなのをいくつか

絞りこみインターフェイスとして、不動の地位を築いた感じのHelmですが、今でも日々更新がされていて、全容を把握することは簡単にはいかなくなりました。

そこで、あまり知られてなさそうなHelmの機能をいくつか紹介してみようかと思います。

便利そうなショートカット

helmを起動しているときに helm-map で定義されるキーマップが適用されますが、なかには便利なものがいくつかあります。

例えば、 M-n は カレントバッファのpointのシンボルをミニバッファに貼りつけます。 C-c C-k は選択している候補の文字列をキルリングに入れます。

C-c TAB は選択している候補の文字列をカレントバッファに貼りつけます。他にもsourceごとに便利なショートカットがあります。調べる時はHelmを起動してから C-c ? とすると良いです。

helm-buffers-list

helm-buffers-list はバッファ選択のHelmインターフェイスです。

絞りこみの文字列の先頭に@をつけることでバッファ内の文字列でしぼりこみをすることができます。

絞りこみの文字列の先頭に/をつければ、ディレクトリ名で絞りこみをすることができます。

helm-adaptative-mode

helm-adaptative-mode を有効にすることで、候補の順序を使用頻度に応じて変えることができます。デフォルトでは、 helm-bookmarkshelm-firefox-bookmarks 等が対応していますが。 (filtered-candidate-transformer . helm-adaptive-sort)をhelm sourceに加えておくことで helm-adaptative-modeによる順序の変更を有効にすることができます。

diggin’ helm

helmについてまとまったドキュメントとしてhelm Wiki がありますが、本体の更新に追随できていないところもあります。

一番確実な方法は、ヒアドキュメントを読むことです。helmではかなり詳しく書かれているので、多くの情報が得られるはずです。

楽な方法としては、helmを起動してC-c ?でヘルプをのぞくというのもあります。これだけでも知らなかったことがいろいろと出てくるのではないかと思います。

DDSKKの最近の動向

長年愛用させていただいてますDDSKKですが、ここ最近でいろいろと変化がありましたので、ご紹介します。

MELPAに登録されました

パッケージのリポジトリサイトとして、すっかり定着した感のあるMELPAですが、DDSKKもついにMELPAに登録されました。

MELPA

package.el側の制限もあり、ドキュメントがインストールできなかったり、skk-setup.elがインストールされなかったりとAutotoolsによるインストールと比べると貧弱なところもありますが、ライトに使う程度であれば十分使えると思います。

CVSからGitHubに移行しました

CVS から Git へ移行しました

DDSKKはこれまでCVSで管理されてきたわけですが、開発用のリポジトリがGitHubにできました。MELPAではこちらからダウンロードするようになっています。

skk-dev/ddskk

これに合わせて、skk-dev organizationができました。現在のメンテナである Kitamotoさんのはからいで私もメンバーに加えていただきました。

というわけで、意見、ご要望あれば、こっちに投げてみるといいかもしれません。また、今のところ開発メンバは随時募集していますので、興味のある方は是非ご参加ください!!

メンテナのKitamotoさんには、 移行作業などなどお世話になりっぱなしでした。本当にありがとうございます!!

Emacs24.4でλを愛でる。

先日リリースされたEmacs24.4, 巷ではビルトインブラウザewwが話題を呼んでいるようですが、実はlisperにはおなじみの機能がひっそりと取りこまれています。

ぷりちーらむだ

lisperにはおなじみのlambdaですが、いかんせん長い。この問題は、世のLisperを悩ませる問題の一つであるようで、例えばclojureにおいてlambdaは fn となっていて、後発Lispならではの工夫が見られます。

せめて見た目だけでも短かくしたい!! という願望が生みだしたのがいわゆる「ぷりちーらむだ」。ざーっと調べるだけでもいろいろと記事が見つかります。

Emacs で lambda をかわいくする — ありえるえりあ

pretty-lambda – Life is very short

pretty-symbols.elでlambdaをλと表示してみよう。その他のキーワードにも対応! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット | るびきち「日刊Emacs」

この「ぷりちーらむだ」がEmacs24.4では標準機能として取りこまれています。

prettify-symbols-mode

まずはLisp-modeで、やおら M-x prettify-symbols-mode とし、lambdaとタイプしてみましょう。 かわいいλが出てくるはずです。

こうなったら、EmacsLispでも使いたくなってきます。

次のようにして、prettify-symbols-alistにalistを追加すれば、emacs-lisp-modeでもかわいいλが出てくるはずです。

(add-hook 'emacs-lisp-mode-hook
          (lambda ()
            (push '("lambda"  . ?λ) prettify-symbols-alist)))

なぜ今更とりこまれたのかなどいろいろありますが, お手軽にλを愛でることができるというのは素敵ですね。

multiple-cursorsに追加されたマイナーモード、mc-hide-unmatched-lines-modeが素敵だった

multiple-cursors 、便利ですね。まとめて修正したり、置換したり、といろいろとはかどります。

そんな multiple-cursors ですが、ちょっとしたマイナーモードが追加されていたのに最近気付きました。

Added mc-hide-unmatched-lines mode · 653d523 · magnars/multiple-cursors.el

このマイナーモード、multiple-cursorsのカーソルがない部分を隠し、どこにカーソルがあるのかわかりやすくしてくれます。例えば multiple-cursors-core.el のコードで mc--this-command にカーソルをつけたものですが、mc-hide-unmatched-lines-mode を有効にすることでカーソルがある部分周辺のみを見るこができます。

screenshot_2014-11-09_21:10:58

occurやgrepなどで検索して置換、編集などよくあるパターンですが、このマイナーモードができたことで multiple-cursorsでそういったありがちな作業がシームレスにできるようになったような気がします。

ところで、実はこの機能、元ネタはieditだったりします。

victorhge/iedit

そもそも機能としてはたいして変わらないので、ieditでも良かったんではないかという気がしなくもありません。