雑文発散

追記
過去の日記

2014-08-08 [長年日記]

[Emacs] Emacs 24.4 の新機能・package 関連

Emacs 24 から標準添付されるようになった package.el に関しても、Emacs 24.4 で追加されている機能がある。

つい最近「アップルが突然Mac OS Xの署名技術を変更し、大量のアプリが影響を受ける可能性」なんて記事も出てたけど、package.el の世界にも「署名」の概念を取り入れて、よりセキュアな環境へ持っていくようだ。

Emacs 24.4 では package-check-signature というオプションが用意されており、これを non-nil にすると、インストール時に署名の有無を確認するようになる。24.4 でのデフォルトでは nil のようだけど、いずれは non-nil をデフォルトとしていくのではなかろうか。

実際に試してみる。*scratch* バッファで、下記を実行。

(setq package-check-signature t)

さらに M-x list-packages でパッケージのリストを表示させ、試しに(なんでも良いんだけど)csv-mode をインストールしてみる。パッケージ名を選択して、i キーでインストール対象としてマーク、x キーdで実際にインストール処理が走るのだが、、、

unsigned package

Unsigned package: 'csv-mode' と言われてインストールができない。

恐らく今はまだ署名されたパッケージ数はもの凄く少ないだろうから、これを non-nil にする必要はないだろうけど、今後のスタンダードになりそうなので知っておいたほうが良さそう。

また、MELPA などを使っていると、最近はかなりパッケージの数が増えてきていて、お目当てのパッケージに辿り着くのもひと苦労する(ってほどのことは無いけども、ここではそうしておく)。

そんな時のために、新たにキーワードでフィルタする機能( package-menu-filer )が導入された。

M-x list-packages で一覧表示を出した後に f キーでフィルタをかけられる。例えば、キーワード csv でフィルタしてみるとこうなった。

filter

あれ?さっきの csv-mode はどこいった?という感じなんだけど、このフィルタで検索されるのは Description の部分のようで、csv-mode の Description には csv というキーワードが入っていないので除外される結果になったらしい。

今のところは欲しいものが見つからない可能性はあるものの、この機能が一般的になれば各パッケージの作成者が Description を工夫しだすだろうし、こちらも将来性のある拡張ではなかろうか。

どんどん使いやすくなって良いねぇ。


2014-08-07 [長年日記]

[Emacs] Emacs 24.4 の新機能・内蔵ブラウザ eww.el を調べてみた

Emacs 24.4 から、Emacs Lisp のみで書かれたブラウザ eww が組み込まれた。

eww ってのは、「Emacs Web Wowser」という意味らしい。「Wowser」ってのは聞き慣れないな、と調べてみたら「人をあっと言わせるもの」という俗語らしい。

まぁ、確かに Emacs Lisp のみでブラウザを実現するとか、そういうイメージあるわな。

過去には w3 という先駆者もあったそうだけど、オレは未使用なのでよく知らない。emacs-w3m は、Wanderlust と一緒に使っていたけど、これは外部の w3m コマンドを使っていたので「Emacs Lisp のみ」って条件とはちょっとズレちゃう。

「Emacs Lisp のみ」ってのが本当に素晴らしいのかどうかはアレとして、作った人は「尊敬すべき変態」なのは確かだと思う。

さて、そんな eww な訳だが早速、M-x eww で起動してみる。Enter URL or Keywords: と聞いてくるので、この日記のタイトルを入れてみた。

起動画面

そして、enter を入力すると、検索結果が表示された。画像も Emacs のフレーム内にインライン表示される。

検索結果

デフォルトでは、DuckDuckGo が検索エンジンとなっている。DuckDuckGo ってのは不勉強で知らなかったんだけど「プライバシー(英語版)の保護とユーザーの情報を記録しないことを検索エンジンとしてのスタンスとしている」(Wikipedia より)ってところだそうだ。

で、検索結果が出たので、Web 内をウロウロしたいのだけど、カーソルの移動は C-nC-pC-fC-b などのエディタ操作と同じいつものキーバインドになっている。使うとダサイと言われてしまうカーソルキーでの移動も可能(オレはカーソルキーも使うけど)。

リンク部分のテキストへカーソルを移動して、C-m (enter) でリンク先へ移動する。

再度検索するには、検索窓の部分へカーソル移動して、テキストを入力して enterSubmit ボタンへカーソル移動して enter でもいけるようだ。つまり、フォーム要素にも対応している。

その他の「ブラウザっぽい挙動」に関してのキーバインドは次のようになっている。

機能 キーバインド コマンド名
戻る l eww-back-url
進む r eww-forward-url
再読み込み g eww-reload
ソースを見る v eww-view-source
ブックマークに追加 b eww-add-bookmark
ブックマークを表示 B eww-list-bookmarks
履歴 H eww-list-histories
リンク先をダウンロード d eww-download
現在の URL をコピー w eww-copy-page-url
現在の URL を別ブラウザで開く & eww-browse-with-external-browser
ファイルを開く N/A eww-open-file
Cookie の一覧 C url-cookie-list
eww を終了 q quit-window

「Cookie の一覧」は、eww が実装したものではなく、Emacs 24.4 で追加された新機能( url-cookie-list )を使っているのが面白いところ。標準添付される Emacs Lisp に合わせて、本体に機能が追加された形に見える(真実がどうなのかは知らない)。

簡単な操作はこんな感じでだいたい使えそうなので、後は検索エンジンをカスタマイズしてみよう。「自由な」 DuckDuckGo もステキだけど、ここはみんな大好き Google に変えてみよう。

カスタマイズ用の変数が用意されているので、次のようにするだけで検索エンジンを Google にできる。

(setq eww-search-prefix "https://www.google.co.jp/search?q=")

そして、Google で「雑文発散」を検索してみた結果はこうなった。

検索エンジンをGoogleへ変更

左側の「Search Options」が幅を効かせているように見えるけど、これは 80 x 25 文字のフレームでキャプチャを撮ったからってのもある。もっと大きなフレームの Emacs ならここまで目立たないので大丈夫。

さて、では、この eww を常用するかと言うと、通常のブラウズはやっぱり専用のブラウザを使うかなぁ。

でも、例えば Markdown を編集していて、ちょっと HTML レンダリングの結果を見たい、なんてシチュエーションで「まともにレンダリングできる Emacs 内ブラウザ」があれば、それで見るものアリかなぁとは思いつつ、CSS が適用された状態では見られないので、果たしてどこまで…みたいな気持ちはある。

あとはあれかなー、各プログラミング言語の編集モードで「オンラインマニュアルを参照する」というコマンドが実装されている場合があるけど、それは Emacs 内で見れた方が幸せかなぁ。だとすると、存在理由が格段に上がる気もする。


2014-08-06 [長年日記]

[Emacs] Emacs で分割表示中のウインドウのバッファを入れ替える swap-buffers を作ってみた

以前も書いたけど、最近は Emacs をフルスクリーンにして左右に分割し、左側に実行用のコード、右側にユニットテストのコードを並べて TDD を行ったりしている。

ただ、いったん分割を解除して、再分割をしたときに、左側にユニットテスト、右側に実行コードが表示されちゃう場合がある。意識して分割・バッファ読み込みをすれば、そんなことはないんだろうけど、手が覚えている手順で再分割・再読み込みをすると、逆になっちゃうときがあるんだよね、これが。

そういうときは、両方のウインドウでバッファ切り替えをするんだけど、これがちょっと面倒くさく感じてきた。ということで、分割したウインドウのバッファを入れ替えるコマンド swap-buffers を作ってみた。

いろいろ怪しげな部分はあるんだけど、左右分割のバッファを入れ替えることはできている。

まず、左のウインドウに a.txt 、右のウインドウに b.txt を表示している状態のフレームがあるとする。

実行前

この時、M-x swap-buffers を実行する。オレは M-xhelm-M-x に入れ替えてるので、そういう表示になっているけど、そこら辺は気にしないで良いよ。

実行

そして、実行すると、次のように左に b.txt 右に a.txt となり、期待通りに入れ替わっている。

実行後

キーバインドを C-x \ に定義しているので、もちろんそのキー入力でも実行できる。

さっき「怪しげ」と書いたのは、いくつかの理由がある。

  • ネームスペースを考えてないコマンド名
  • 3分割の時は期待通りに動かない
  • 「あっちのウインドウ」を取得するのって (get-lru-window) でいいの?という不安

ネームスペースと言っても prefix を付けるだけなので、 my- とか付けちゃえば良いわけだけど、my- はイマイチだなぁと思いつつ、他に良いものが思いつかずにいまのところナシにしちゃっている。

3分割以上の場合、どことどこを入れ替えるべき?という定義の問題もあって、どうしようかなぁというところ。まぁ、左右入れ替えがオレのニーズなので、それが実現できれば OK なので、しばらくはこのままなのかも。。。

(get-lru-window) が正しいのかどうかは、、、もうちょっと Emacs Lisp のリファレンスをしっかり読まないと良く分からない。

あと、なんか、こういったニーズは、割とみんな持ってるんじゃない?と思っていて、既にこれを解決するソリューションがありそうな気がしている。更には Emacs のデフォルトで存在していてもおかしくないと思っている。

しかし、もうちょっとスマートに Emacs Lisp を書けるようになりたいなぁ。まだまだマニュアルとにらめっこしないと分からない部分が多い。


2014-08-05 [長年日記]

[Emacs] Emacs 24.4 の新機能・重複行を削除する delete-duplicate-lines

昨日と同じくテキスト編集系の新機能の中から、今日は新しいコマンド delete-duplicate-lines を調べる。

まぁ、これはヒトコト「重複行を削除する」で言い表せるようだ。例えば次のようなテキストがあったとする。aaa が2行あり、重複している。

aaa
aaa
bbb
ccc

これを範囲選択し、M-x delete-duplicate-lines を実行すると、次のようになる。

aaa
bbb
ccc

重複していた aaa がひとつに集約されている。要するに uniq コマンドと同じような動作を Emacs 内で行なってしまおうというものらしい。

ただ、それだけだと面白くなかったのか、このコマンドは「ソート結果じゃなくても uniq できる」のがウリのひとつのようだ。

つまり、このように重複した行が連続していなくとも、うまく見つけて、削除してくれる。

aaa
bbb
ccc
aaa

上記の状態で、M-x delete-duplicate-lines を実行するとこうなる。

aaa
bbb
ccc

期待通り。

まぁ、もっと大量のテキストがある場合は、sort TEXT | uniq を使って重複行を削除したほうが良いのではないかと思うけど、ちょっとしたテキストを操作する場合にはこっちを使うのも良いかもなぁという感じ。

普段多用はしないと思うけど、存在は覚えておこうっと。


2014-08-04 [長年日記]

[Emacs] Emacs 24.4 の新機能・矩形選択をする rectangle-mark-mode

Emacs はエディタにもなるので、その編集機能についての新機能もたくさん NEWS ファイルには書かれていた。その中で今日は rectangle-mark-mode を調べてみる。

rectangle-mark-mode は矩形の領域がマーク(選択)できるモードで、C-x SPC にキーバインドされている。

例えば、次のような状態のテキストがあるとする。Markdown でリストを書いてたけど、BBB、CCC、DDD のインデントを間違えたので、一段上げたいと思っている。

初期状態

このようなときに、今までの Emacs でも delete-rectangle を使えば、矩形領域を一発で削除できた。

手順としてはこんな感じ。

  • 上記のカーソル位置で C-SPC (set-mark-command) を実行して位置をマーク
  • DDD の直前の * のところまでカーソルを移動させて、C-x r d (delete-rectangle) を実行

C-SPC で領域選択したときのキャプチャが下の画像。水色で表示しているのが選択された領域。

set-mark-command

このとき C-x r d (delete-rectangle) ではなく、間違えて delete キー (delete-backward-char) を叩いてしまうと、次のような状態になり、期待と違ってしまう。

delete-backward-char

Emacs 24.4 で追加された C-x SPC (rectangle-mark-mode) を使うと、これが次のような手順になる。

  • 先ほどのカーソル位置で C-x SPC (rectangle-mark-mode) を実行して位置をマーク
  • DDD の直前の * のところまでカーソルを移動させて、delete (delete-backward-char) を叩く

C-x SPC で領域選択したときのキャプチャが以下の画像。C-SPC で領域選択したときとの違いが分かる。

rectangle-mark-mode

実行結果はどちらも同じなので、好きな方を使えば良いのだけど、新しい rectangle-mark-mode を使ったほうが、キー操作はシンプルになる気がするねぇ。

とは言っても、並べて比較してみると、打鍵数は1個しか減ってなかったのであった(笑)

1 2 3 4 5
従来 C-SPC カーソル移動 C-x r d
新規 C-x SPC カーソル移動 delete

まぁ、でも、選択領域が目で見て分かりやすくなっている点は C-x SPC の利点だと思うので、積極的に使っていく方がこれからの Emacs ライフには良いのかも知れない。