wpid-screenshot_2015-03-01_140040.png

dired-subtreeもシマシマにしたい

diredのサブディレクトリがひどい

dired使いなら、 一度ならずもサブディレクトリの扱いに疑問を感じた方は多いのではないでしょうか。

GNU Emacsマニュアル: Subdirectories in Dired

dired-maybe-insert-subdir などデフォルトでサブディレクトリを操作する関数もありますが、何せ表示されるのは、バッファの下の方で非常に見にくいです。階層構造がわかりにくいのもつらいし、ほとんど使ったことはありませんでした。

dired-subtreeは便利だけど

dired-subtree はdired標準のサブディレクトリにあった不満を解消してくれる素敵拡張です。

Fuco1/dired-hacks

いろいろと紹介もされていますので、詳しくはそちらを参照のこと。

emacs dired-subtree.el : 【更新】 diredがディレクトリツリーエディタに進化!dired-detailsにも対応 | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット | るびきち「日刊Emacs」

Emacs – diredをより便利にするツール群 dired-hacks – Qiita

ところで、diredでは行の視認性を良くするために stripe-buffer を使わせてもらってます。 stripe-buffer については、以前紹介していますので、そちらを見てみてください。

DiredやOrg-modeのテーブルをシマシマにするstripe-bufferの紹介 – sheephead

この stripe-bufferdired-subtree を併用すると、なんだか悲しい感じになってしまいます。

screenshot_2015-03-01_13:44:03.png

stripe-buffer のシマシマが階層構造なぞお構いなしにシマシマにしてしまうので、階層がわかりにくくなってしまいます。

subtreeもシマシマにしてみる

せっかくなので、下の階層も階層構造に応じてシマシマにしたいですね。

というわけで、 stripe-buffer に少し手を加えてみました。

myuhe/stripe-buffer at subtree_support

作者にぷるりくも出しているので、もしかしたら、取りこんでもらえるかもしれません。

このブランチを使って、faceを良い塩梅にするとこんな感じになります。

screenshot_2015-03-01_14:00:40.png

faceの設定はこんな感じです。

(with-eval-after-load 'dired-subtree
  (set-face-attribute 'dired-subtree-depth-1-face nil :background "#B4C342")
  (set-face-attribute 'dired-subtree-depth-2-face nil :background "#F2804F")
  (set-face-attribute 'dired-subtree-depth-3-face nil :background "#9EA0E5")
  (set-face-attribute 'dired-subtree-depth-4-face nil :background "#DEB542")
  (set-face-attribute 'dired-subtree-depth-5-face nil :background "#657b83")
  (set-face-attribute 'dired-subtree-depth-6-face nil :background "#657b83"))

(with-eval-after-load 'stripe-buffer 
  (set-face-attribute 'stripe-dired-subtree-depth-1-face nil :background "#cbd57c")
  (set-face-attribute 'stripe-dired-subtree-depth-2-face nil :background "#f7b396")
  (set-face-attribute 'stripe-dired-subtree-depth-3-face nil :background "#dadbf5")
  (set-face-attribute 'stripe-dired-subtree-depth-4-face nil :background "#e9cf83")
  (set-face-attribute 'stripe-dired-subtree-depth-5-face nil :background "#657b83")
  (set-face-attribute 'stripe-dired-subtree-depth-6-face nil :background "#657b83"))

stripe-bufferdired-subtree を併用している人しかおいしくないニッチなハックでしたが、悩めるdirederのdiredバッファがカラフルなシマシマになれば幸いです。

emacs_icon_512x512

Emacs Lisp 開発者にドキュメントの書き方を丁寧に教えてくれる checkdoc-minor-mode を有効にした

Emacsでの説明文字列

Emacsでの関数や変数には説明文字列をつけることができます。Emacs Lispで何がしかの拡張を書く時はこの説明文字列をつけることが推奨されています。

さて、この説明文字列ですが、いろいろとルールがあります。

GNU Emacs Lispリファレンスマニュアル: Documentation Tips

このルールにしたがって、説明文字列が書けているかをチェックしているか、確認するためのマイナーモードが checkdoc-minor-mode です。

checkdoc-minor-mode のキーバインド

checkdoc-minor-mode を有効にすると次のようなキーバインドが有効となります。

C-M-x checkdoc-eval-defun
C-c ? SPC checkdoc-rogue-spaces
C-c ? B checkdoc-ispell-current-buffer
C-c ? C checkdoc-ispell-comments
C-c ? D checkdoc-ispell
C-c ? M checkdoc-ispell-message-text
C-c ? S checkdoc-ispell-start
C-c ? X checkdoc-ispell-defun
C-c ? ` checkdoc-continue
C-c ? b checkdoc-current-buffer
C-c ? c checkdoc-comments
C-c ? d checkdoc
C-c ? e checkdoc-eval-current-buffer
C-c ? m checkdoc-message-text
C-c ? s checkdoc-start
C-c ? x checkdoc-defun
C-c ? ~ dcheckdoc-ispell-continue

と、いろいろありますが 主に使うのが checkdoc で、これは対話的におかしいところにジャンプして修正案まで提示してくれます。aspellが使える環境であれば、 checkdoc-ispell を使うことで、スペルチェックまでしてくれます。

checkdoc-eval-current-bufferは 修正すべき箇所を別バッファにリストアップしてくれます。おかしいところがどれくらいあるか知りたい時には便利かもしれません。

面白いところでは、 C-M-xcheckdoc-eval-defun に上書きされているところでしょうか。 従来の eval-defuncheckdoc の機能を付加してくれています。

英語で書くことが前提なので、なかなか書かずに放置することが多い説明文字列ですが、多くの人に使ってもらおうと思えば、やっぱり書いておいた方がいいなぁとあらためて思いました。

emacs_icon_512x512

アーカイブを透過的に操作できるAVFSが素敵だったし、dired-avfs.elを使えば展開とかしなくて良くなると思った

AVFSって知ってますか。僕は今日知りました。以下のリンク先の説明が詳しいので、諸々割愛しますが、

Linux/AVFS – まんどいてっくうぃき

要は、tarやzipなどを仮想のファイルシステムとすることで透過的に操作できるようになるみたいです。もうこの時点でかなり便利そうです。

このAVFSを知ったのはdired-hackの中に、dired-avfs.elなるものを見つけたのがきっかけです。diredにはそもそもアーカイブ向け auto-compression-modetar-mode がありますが、いつものdiredとは雰囲気が違うのでまごつきますし、なにせ圧縮、展開時にブロックするのがいただけません。

avfsを使えばアーカイブであることを意識せずにdiredで操作できます。

使いかたはとても簡単で、dired-hackをインストールして (require 'dired-avfs) を設定ファイルに書いときます。 後は、diredを開き中身を見たいアーカイブの上で M-x dired-avfs-open とすれば、中身をいつものdiredで見ることができます。

これだけでも十分便利ですが、いちいち M-x dired-avfs-open とするのは少し面倒です。

というわけで、空気を読んでアーカイブを開いてくれるコマンドを作ってみました。

(require 'cl-lib)
(defun dired-find-dwim-alternate-file ()
  "In Dired, visit this file or directory instead of the Dired buffer. 
If this file archive, it open via avfs"
  (interactive)
  (if (cl-loop for ext in dired-avfs-archives
               thereis (string-match-p (concat "." ext "$") (dired-get-filename)))
      (dired-avfs-open)
    (dired-find-alternate-file)))

したらば、RETキーにバインド。

(define-key dired-mode-map (kbd "RET") 'dired-find-dwim-alternate-file)

これで、アーカイブの存在を忘れてしまいそうなくらい、自然に開くことができると思います。

アーカイブを開く機会が多い方はとても便利な拡張だと思います。

emacs_icon_512x512

Org-modeとToodledoを連携させるorg-toodledo.elを非同期実行に対応させました

ToodledoとOrg-modeを連携させることができるorg-toodledo.el、大変便利で愛用させてもらってます。

Emacsで書いたorg文書とToodledoを同期するorg-toodledo – 勉強日記
WeBlowg Side:org-modeとToodledoを連携してどこでもタスク管理

元々は、Org-mode界隈では有名なSacha chua さんが作っていたものをChristopher さんがforkしたものがMELPAにも登録されていました。

が、どうやらChristopherさんもメンテをしなくなってしまったようで、不具合が残ったままになっていました。

というわけで、そちらをまたforkしまして、org-toodledoをメンテしていくことにしました。MELPAにはすでに私のリポジトリに切りかえてもらいましたので、package.el等をお使いの方は、更新してもらえればいいと思います。

myuhe/org-toodledo

主な変更点は以下の4点です。

xml解析をxml-parse-regionからlibxml-parse-xml-regionに切りかえました

Emacs24.1からサポートされたlibxml2によりxml解析の関数として libxml-parse-xml-region が追加されています。この関数は処理が高速なのがウリでして、Emacs24.4から同梱されるようになったWebブラウザ eww でもその多大な恩恵を受けいます。

というわけで、org-toodledoでもその恩恵があるかもと切りかえてみることにしました。

Toodledoとの通信バックエンドをrequest.elに切りかえました

本家では、=url-http= パッケージをバックエンドに使う http-post-simple.elを使っています。

EmacsWiki: http-post-simple.el

このライブラリは、確かにシンプルで環境にも依存せず良いライブラリではあるのですが、今時使うならやっぱり request.elかなと思いましてこっちに切りかえました。

Request.el – Easy HTTP request for Emacs Lisp — Request.el 0.2.0 documentation

環境によってCurlなどに自動で切りかえてくれる便利なライブラリです。また、後述するdeferred.elとの親和性も高いため、こちらを使うことにしました。

Travis CI導入

それなりに大きなプログラムなので、Travis CIを導入してみました。とは言うもののあまりテスト書けてません。。。 まあ、おいおい。

ToodledoとOrg-modeの同期が非同期に実行できるようになりました

これがもっとも大きな変更点です。

本家では、通信周りが同期的に動作するようになっていて、同期するたびにガッツリブロックするその仕様に度々イライラしておりました。

今回の変更では、deferred.elを使ってToodledoとの通信からxmlの処理諸々が非同期に行なえるようになっています。また、deferrd.elの機能を使ってサーバとの通信を並列化したりしているので、高速化も期待できます。

deferred.el リリース – 技術日記@kiwanami
emacs-deferred/README.ja.markdown at master · kiwanami/emacs-deferred

ただ、いろいろと動作が不安定なところもあるため、非同期関連の変更については、asyncブランチで作業を行なっています。

myuhe/org-toodledo at async

dogfood eaterの皆様におかれましては、是非お召しあがりください。

今回の変更で気になっていた点は、ほぼ修正できたように思います。今後は、テストの追加やリファクタリングなどこまごまとした所に手を加えていこうかと思っています。

苦情、ご相談はGitHubのIssueにお願いします。不具合などはついでにテスト書いてプルリクもらえれば、大変ありがたいです。

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も改良されるかもしれません。