Hatena::ブログ(Diary)

わからん

2009.12.20

[] インデントの深さを基準に折り畳み表示するマイナーモード cn-outline.el をつくりました

現在のカーソル位置のカラム値を基準に折り畳み表示する cn-outline.el というマイナーモードを作りました。既存のアウトライン表示用のマイナーモードには org-mode, out-line-mode, hide-show がありますが、それらと比較したメリットは以下になります。

  • 手軽
  • 特別な記法がない

デメリットは以下になります。

  • 機能が少ない

cn-outline.el は emacs の標準関数 set-selective-display を扱いやすくする ということに焦点を絞り作った簡易アウトライナーです。 set-selective-display は引数の値を基準に表示を折り畳む関数です。じつは呼び出しキーも割り当てられています。例えば、カラム値3 より大きい値から始まる行を折り畳みたい場合は、 "C-u 3 C-x $" とタイプします。試してみると、とても打ちにくいはずです。鬼軍曹すぎます。身につけようとしばらく使っていると、C-u の後の数字を決めるのに、現在のポイント位置のカラム値をモードラインから調べることになると思います。cn-outline.el では、折り畳みたいカラム位置で C-c C-c 9 と入力すれば、アウトライン表示に切り替わります。解除するには、C-c C-c 0 です。出来ることはそれだけですが、コマンド実行後、特定の(=折り畳まれた)状態を保持し続けるので、マイナーモードにしてみました。以下は実際の動作例です。


▼ こんなファイルを編集しているとします。カーソル位置に注目して下さい

f:id:kitokitoki:20091220004612p:image


▼ C-c C-c 9 とタイプすると、折り畳まれました

f:id:kitokitoki:20091220004611p:image


▼ カーソルをもっと左側へ移動させました

f:id:kitokitoki:20091220004610p:image


▼ C-c C-c 9 とタイプ。移動後のカーソル位置で折り畳まれました

f:id:kitokitoki:20091220004608p:image


▼ C-c C-c 0 とタイプすることで、アウトライン表示が解除されます

f:id:kitokitoki:20091220004607p:image


ソースコードは GitHub で管理しています。

コードをロードパスの通ったところに置き、dot.emacs で次のように設定します。

(require 'cn-outline)
 ;; どのファイルでもデフォルトで on にする場合
(setq-default cn-outline-mode t)

特定のメジャーモードでだけ on にしたい場合は、次のようになります。

(require 'cn-outline)
;; yaml-mode で on にする場合
(add-hook 'yaml-mode-hook
          '(lambda ()
             (cn-outline-mode t)))

パフォーマンスに大きな影響を与える拡張はないですし、デフォルトで on でいいと思っています。ちなみに、以下の設定も追加すれば、C-c C-c C-c で cn-outline-mode 自体の on/off を切り替えられます。

(global-set-key (kbd "C-c C-c C-c") 'cn-outline-mode)

cn-outline の解説は以上です。この記事は Emacs Advent Calendar の5日目です。前日は iws さんでした。明日は id:rubikitch さんです。


 追記(2010/3/22)

C-c C-c はメール送信など,キーバインドがかぶることが多いので,C-c C-9, C-c C-0 に割り当てを変更しました。

peccupeccu 2009/12/23 23:30 まさにhttp://watcher.moe-nifty.com/memo/docs/twitterAPI.txtを読むためのものですね!
早速使っていこうと思います

kitokitokikitokitoki 2009/12/23 23:39 peccuさん、こんにちは。リンク先のテキストはもってこいの例ですねw
それと、Emacs Advent Calendar という楽しい企画をありがとうございました。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

Google