最新情報

2014年10月22日Emacs
Emacs 24.4で快適になった編集コマンドたち!新機能、改善点
2014年10月21日Emacs
Emacs 24.4リリース!ファーストインプレッション
2014年10月20日Emacs
emacs relative-line-numbers.el : 画面左に相対行番号をつけよう! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット
2014年10月19日Emacs
emacs dired-k.el : dired/direxでサイズ・最終更新時刻・git statusで色をつける | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット
2014年10月18日Emacs
emacs direx.el : diredとspeedbarを組み合わせた全く新しいファイラ | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

Emacs 24.4で快適になった編集コマンドたち!新機能、改善点

昨日に引き続き、Emacs 24.4の新機能のレビューです。

今日は編集コマンドの変更点についてです。

ハマりどころや目立った機能については昨日の記事 を見てください。

ついでに view-mode をカイゼンする拙作 viewer.el
Emacs 24.4に対応させておきました。MELPAからどうぞ。

概要

  • C-x C-i (indent-rigidly) がsmartrep風味に
  • バッファ名がわかりやすくなった!
  • 矩形regionが標準で使える!
  • uniqコマンドみたいに重複行を削除する
  • 進化したM-SPC
  • どのレジスタに何が入ってるかを示してくれる!
  • 最新情報をどうやって見るかって?

C-x C-i (indent-rigidly) がsmartrep風味に

C-uをつけないときのC-x C-i (indent-rigidly)の挙動が変わりました。

以前は1桁インデントしていたのですが、
Emacs 24.4では←、→、Shift+←、Shift+→で
インデントを制御できるようになりました。

←と→は1桁ずつ、Shift月ではtab stop単位となります。

smartrep的な挙動になったということです。

バッファ名がわかりやすくなった!

uniquify.elがデフォルトで有効になりました。
以前は別なディレクトリで同じファイル名を開くと
basename<2> というバッファ名になりましたが、
Emacs 24.4では basename<dirA>、basename<dirB> というふうになります。

以前は知らなければ便利さを亨受できなかったけれど、
デフォルトで有効になるのは嬉しいですね。

矩形regionが標準で使える!

C-x SPC (regctangle-mark-mode)が新しく加わりました。

regionを設定して、C-x SPCを押したら矩形を選択できます。

その後C-wやC-yで矩形をコピペできます。

これまでは cua-selection-mode を使う必要がありましたが、
これからは cua.el に頼ることはなくなります。

これで一気に使いやすくなりましたね!!

cua.elは他の設定とバッティングするのでおすすめできません。

uniqコマンドみたいに重複行を削除する

M-x delete-duplicate-lines が新設されました。

これはリージョン内の重複する行を削除します。

Unixコマンドのuniqとは違い、sortされている必要はありません。

====
hoge
boke
hoge
fuga
====
↓ M-x delete-duplicate-lines
====
hoge
boke
fuga
====

進化したM-SPC

M-x cycle-spacingM-SPC (just-one-space) を賢くしたものです。

繰り返し実行することで

  • 1スペース
  • スペース削除
  • 元のスペース

を切り替えてくれます。

よって快適にするためにはjust-one-spaceを置き換えるといいです。

(global-set-key (kbd "M-SPC") 'cycle-spacing)

どのレジスタに何が入ってるかを示してくれる!

Emacs 24.4では レジスタ も便利になりました。

C-x r s (copy-to-register) などnoレジスタに保存するコマンドha
どのレジスタに格納するかを選択する必要があります。

そのとき「このレジスタ使用済みだっけ…」って思うんですね。

そのためにわざわざ現在のコマンドをキャンセルして
M-x list-registers で見て再び元のコマンドを実行…

なんてやってたら日が暮れてしまいます。

そこで!
レジスタ入力待ちのときに、しばらくすると
レジスタの一覧が表示されます。

これにより、間違ってレジスタを上書きすることがかなくなります。

すごい嬉しい配慮ですね!

最新情報をどうやって見るかって?

どうやって最新機能を見られるかというと、*<f1> n* を使うんですよ。

とくに *C-u <f1> n*で24.4を選択すると、Emacs 24.4の新機能のみ表示してくれます。

今日は「Editing Changes in Emacs 24.4」について触れました。

タグ

Emacs 24.4リリース!ファーストインプレッション

今日、1年半ぶりにEmacsの新バージョン(24.4)がリリースされたので、
さっそくインストールしてみました。

注意すべき点は大きくわけて4つです。

  • パッケージエラーの回避方法
  • Emacs組み込みWebブラウザEWW!
  • ついにバイトコンパイル問題に決着!
  • org-mode がorg7→org8へ変更

<2014-10-22 Wed> 編集コマンドの変更点について書きました。

ビルド

僕のところのconfigureビルドオプションはこんな感じです。環境はGNU/Linuxです。

$ wget -O-  http://ftp.gnu.org/gnu/emacs/emacs-24.4.tar.xz | tar xJvf -
$ cd emacs-24.4
$ ./configure --disable-largefile --with-x-toolkit=motif --without-toolkit-scroll-bars \
  --without-xaw3d --without-xim --without-compress-info --without-sound --without-pop \
  --without-sync-input --without-xpm --without-tiff --without-rsvg --without-gconf \
  --without-gsettings --without-selinux --without-gpm --without-makeinfo --with-x && make \
  && sudo make install

コンピュータの性能は一級品ではあるが、
とにかく無駄を徹底的に省くスタイルです。

packageが使えない!?→解決

まず、起動していきなりエラーが起きました。

どうやら (package-initialize) で

Debugger entered--Lisp error: (void-function package-desc-vers)
  package-desc-vers([(1 3) nil "Interface to ack-like source code search tools"
   tar ((:keywords "tools" "processes" "convenience")
        (:url . "https://github.com/leoliu/ack-el"))])

NEWSによると原因はこれですね。

The format of `archive-contents’ files, generated by package
repositories, has changed to allow a new (fifth) element in the data
vectors, containing an associative list with extra properties.
(For example, `describe-package’ uses the `:url’ extra property to
display a “Homepage” header.)

package.elで使っているデータ構造が変更されたので、
melpaのパッケージがエラーを起こしているようです。

package-desc-vers
いう関数が削除されたので
package–ac-desc-version
という関数を使えということです。

こういう非互換な変更はちゃんとNEWSに書いてほしいものです(苦笑)

正直ものすごい迷惑…

これを24.3/24.4で実行したところ

(package-initialize)
(print (list :package-desc-vers (fboundp 'package-desc-vers)
             :package--ac-desc-version (fboundp 'package--ac-desc-version)))
$ emacs-24.3 -script package.check.el
(:package-desc-vers t :package--ac-desc-version nil)

$ emacs-24.4 -script package.check.el
(:package-desc-vers nil :package--ac-desc-version t)

このように関数名が変わってしまいました。

対処するには以下の設定を加えます。

(fset 'package-desc-vers 'package--ac-desc-version)

quelpa-self-upgradeでエラー

package.elの自然な拡張形quelpa を使っている人は注意です。
quelpa-self-upgrade でエラーになってしまいます。

これもおそらくpackage.elのデータ構造変更が原因と思われます。

quelpa-self-upgradeはquelpa.elを自動更新するだけなので、
その行はコメントアウト(とりあえず行頭に ;; を置く)してください。

それまではバッチモードで更新すればよいです。

$ emacs -Q -batch -f package-initialize -f quelpa-self-upgrade

EWW: Emacs組み込みWebブラウザ

ついにEmacs標準にWebブラウザ(テキストブラウザ)までついてきました!!!!

一言で言うと、 emacs-w3m が標準で使えるようなものです。

インライン画像も表示できますし、
libxml2を使っているので速度も申し分ありません。

Windowsでemacs-w3mの設定に悪戦苦闘している人には嬉しい話ですね。

20141021135204.png
Fig1: M-x eww http://www.gnu.org/software/emacs/

org-modeがorg8へ変更

org-mode がorg 7.9.3からorg 8.2.10に変更されました。

大幅に変更が加えられているので、
org-mode ジャンキーは戸惑うことでしょう。

org7→org8の相異点(Worg)
7.9.3、7.9.4、8.0.3の相異点(ReleaseNote)
8.1と8.2の相異点(ReleaseNote) を見てください。

とくに org-export での操作性が大幅に変わった上、
example, srcブロックの可読性がひどいことに なりました。

load-prefer-newer: バイトコンパイル忘れでハマることはもうない

load-prefer-newer 変数は、 バイトコンパイル問題 を解決してくれます。

従来のEmacsではバイトコンパイルされていないファイル(.el)の方が新しい場合、
古いバイトコンパイル済みのファイル(.elc)がろロードされましたが、

(setq load-prefer-newer t)

を設定することで、新しい方を読み込んでくれます。

今更な感じはしますが、嬉しいことです。

eshell $ cd /tmp
eshell $ echo '(setq x "old")' > test.el
eshell $ byte-compile-file test.el
eshell $ echo '(setq x "new")' > test.el
eshell $ emacs -Q -batch -eval '(progn (setq load-prefer-newer nil) (load "/tmp/test")(print x))'
Loading /tmp/test (compiled; note, source file is newer)...

"old"
eshell $ emacs -Q -batch -eval '(progn (setq load-prefer-newer t) (load "/tmp/test")(print x))'
Loading /tmp/test.el (source)...

"new"

view-modeの操作性がよくなった!

view-mode で何も設定しなくてもSPCでスクロール、
S-SPCで逆スクロールしてくれます。

デフォルトでページャらしくなりました。

僕はとっくの昔にキーを設定していますが、
デフォルトで使いやすくなるのはいいですね!

C-x 2: split-window→split-window-below

split-window (C-x 2) はコマンドではなくなったので、
もしキーに割り当てているのならば
split-window-below に置き換えてください。

比較関数が複数個の引数を取るようになった

比較演算子(=, <, >, <=< , >=)が
複数の引数を取るようになりました。

なぜ今まで2つしか取らなかったのかが意味不明です。

(< 1 2 3) ; => t

with-eval-after-load: eval-after-loadのマクロ版

with-eval-after-loadeval-after-load のマクロ版です。

eval-after-loadはquoteとprognが必要で
すげーダサかったけど、with-eval-after-loadを使えば
すっきり書けます。

(eval-after-load 'foo
  '(progn
      (setq x 1)
      (setq y 2)))


(with-eval-after-load 'foo
  (setq x 1)
  (setq y 2))

総評

とりあえず、package.el関連のエラーに悩まされると思いますが、
今のところ他に目立つエラーは出ていません。

ただ、Emacs初級者はリリース直後のバージョンには手を出さない方がいいです。

なぜなら、Emacs本体に非互換な変更が含まれるので、
使っているパッケージがエラーになることがあるからです。

パッケージの作者の対応待ちがあるので、
あせらず数週間くらい待ってれば安定してきます。

もちろん自力で問題解決できる人ならばすぐにアップグレードしてもいいです。

他にもここでは述べていない細かい変更点があるので、
追々紹介していきたいと思っています。

タグ

emacs relative-line-numbers.el : 画面左に相対行番号をつけよう! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 relative-line-numbers
概要(原文) Display relative line numbers on the margin
リポジトリ MELPA
取得先 https://github.com/Fanael/relative-line-numbers
バージョン 20141018.1252
関連記事 package:relative-line-numbers

relative-line-numbers.el は、画面左端のスペースに
相対行番号をつけるものです。

具体的なメリットはちょっと思い付かないのですが、
今までとは違った世界が見られます。

relative-line-numbers インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install relative-line-numbers

設定 141020140339.relative-line-numbers.el(以下のコードと同一)

(global-relative-line-numbers-mode)

実行方法

$ wget http://rubikitch.com/f/141020140339.relative-line-numbers.el
$ emacs -Q -f package-initialize -l 141020140339.relative-line-numbers.el

20141020140507.png
Fig1: 相対行番号!

タグ

2014/10/20 | コメント/トラックバック(0) |

カテゴリー:Emacs

emacs dired-k.el : dired/direxでサイズ・最終更新時刻・git statusで色をつける | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 dired-k
概要(原文) highlight dired buffer by file size, modified time, git status
リポジトリ MELPA
取得先 https://github.com/syohex/emacs-dired-k
バージョン 20141013.651
関連記事 package:dired-k package:magit package:direx package:dired

dired-k.el は、dired表示をカラフルにしてくれます。

  • ファイルサイズ
  • 最終更新時刻
  • gitの状態(コミットされた・変更済み・管理されていない)

でそれぞれ色をつけてくれます。

diredのgは本来再描画ですが、dired-kに割り当てれば
再描画+色付けをしてくれるので便利です。

また、昨日紹介したdirex.el にも対応しています。

dired-k インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install dired-k

設定 141019102632.dired-k.1.el(以下のコードと同一)

(require 'dired)
(define-key dired-mode-map (kbd "g") 'dired-k)
(add-hook 'dired-initial-position-hook 'dired-k)

;;; direxを使う場合 / gitの状態のみ色付け
(require 'direx-k)
(global-set-key (kbd "C-\\") 'direx-project:jump-to-project-root-other-window)
(define-key direx:direx-mode-map (kbd "K") 'direx-k)

実行方法

$ wget http://rubikitch.com/f/141019102632.dired-k.1.el
$ emacs -Q -f package-initialize -l 141019102632.dired-k.1.el

20141019102747.png
Fig1: gを押してdired-kを表示させたところ

20141019102813.png
Fig2: そのときのgit status

20141019103356.png
Fig1: direxでもgitの状態で色付け

タグ

2014/10/19 | コメント/トラックバック(0) |

カテゴリー:Emacs

emacs direx.el : diredとspeedbarを組み合わせた全く新しいファイラ | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 direx
概要(原文) Simple Directory Explorer
リポジトリ MELPA
取得先 https://github.com/m2ym/direx-el
バージョン 20140323.908
関連記事 package:direx package:dired package:speedbar

direx.el は一言で言えば Yet another dired です。

つまり、Emacs Lispで実装されたもうひとつのファイラです。

最大の特徴は、深いディレクトリ構造をディレクトリツリーとして
すべて見せてくれることです。

speedbar 的なディレクトリツリーが特徴です。

「diredとspeedbarを組み合わせた」とタイトルに書きましたが、
実はどちらにも依存していません。

また、コアはわずか1000行ととてもコンパクトです。

diredと比べれば1/8に過ぎません。

使い方はdiredに似ているのですぐに慣れます。

  • C: コピー
  • R: リネーム・移動
  • D: 削除
  • ^: 親ディレクトリ
  • RET: ファイル・ディレクトリを開く

などはそのまま使えます。

なによりディレクトリでRETを押すと
その場でサブディレクトリが展開されるし、
Eを押すと再帰的にディレクトリツリーを開いてくれます。

direxとdiredのエントリーポイントはこのように対応しています。

M-x dired-jumpM-x direx:jump-to-directory
M-x diredM-x direx:find-directory

たくさんのサブディレクトリが含まれるディレクトリを見るとき、
direxはとても役立ちます。

direx インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install direx

設定 141018090645.direx.el(以下のコードと同一)

(global-set-key (kbd "C-x C-j") 'direx:jump-to-directory)

実行方法

$ wget http://rubikitch.com/f/141018090645.direx.el
$ emacs -Q -f package-initialize -l 141018090645.direx.el

20141018090753.png
Fig1: direxでディレクトリツリーを見よう

タグ

2014/10/18 | コメント/トラックバック(0) |

カテゴリー:Emacs

毎日20分程度でEmacsブログを更新し続けている舞台裏を暴露…

ついにメルマガ『Emacsの鬼るびきちのココだけの話』も
151号に到達しました。

初代ポケモンの数ですね(笑)

今回は、毎日更新しているこのブログの舞台裏を暴露します。

ここ数年は年に数回しか更新できなかったブログが、
rubikitch.comになってから突如毎日欠かさず更新し続けている…
その秘密とは…?

舞台裏にはこんな仕掛けがあるということを
メルマガを読んでくださってるあなたにこっそりと伝授します。

ブログの更新時間は15〜40分くらいです。

初見のEmacs Lispでも簡単なものならば
20分もあればレビュー記事が書けてしまいます。

そのためには円滑にテストを行い、
文章を書くための仕組みが不可欠です。

使っているツールは
org-mode でブログを更新する org2blog
というパッケージです。

しかし、それだけでは足りません。

org-modeにとある仕掛けを施して
思考の流れのままスムーズに
ブログ記事を書き上げています。

それでは土曜日のメルマガを楽しみにしててください。

ちなみにこの記事は7分で書き上げました(笑)

タグ

2014/10/17 | コメント/トラックバック(0) |

カテゴリー:メルマガ

Emacs org-eshell: org-modeでeshellへのリンクを張る

org-modeは標準添付ですが、デフォルトでは
読み込まれていない機能がたくさんあります。

eshell へのリンクを張る org-eshell.el もそのひとつです。

requireするだけで「eshell: 」スキームのリンクが有効になります。

使い方はeshellでも他と同じようにC-c lでリンクを保存し、
orgバッファに貼り付けるだけです。

[[eshell:*eshell*:cd%20/r/sync/memo/][cd /r/sync/memo/]]

このリンクを開けば*eshell*バッファにて

cd /r/sync/memo/

を実行します。

「shell: 」スキームでシェルコマンドを実行できますが、
その親戚のような感じです。

前者は*Org Shell Output*というバッファに結果がポップアップしますが、
後者は*eshell*バッファに切り替えて実行します。

[shell:ls]
[[eshell:ls]]

小ネタまでに。

設定 141016130143.org-eshell.el(以下のコードと同一)

(require 'org-eshell)
(global-set-key (kbd "C-c l") 'org-store-link)

実行方法

$ wget http://rubikitch.com/f/141016130143.org-eshell.el
$ emacs -Q -f package-initialize -l 141016130143.org-eshell.el

タグ

2014/10/16 | コメント/トラックバック(0) |

カテゴリー:Emacs org-mode

emacs anything-kyr.el : 空気を読んで必要なコマンドを提示してくれる古えの最終兵器…anything.elの秘蔵っ子 | Emacs Lisp Elisp パッケージ インストール 設定 使い方

パッケージ名 anything-kyr
概要(原文) Show context-aware commands
リポジトリ まだパッケージに登録されていない
関連記事 package:anything-kyr package:anything package:helm package:trace package:org package:yaoddmuse

昨晩から今朝まで 一連のつぶやき に登場してた anything-kyr.el というのは、
条件が整ったときに、実行されるであろうコマンド・URL
(正確には org-mode のリンク)を提示してくれるコマンドです。

条件とは、以下のものです。

  • メジャーモード anything-kyr-commands-by-major-mode
  • 任意のS式 anything-kyr-commands-by-condition
  • ファイル名の正規表現 anything-kyr-commands-by-file-name

anything.el はもはや helm に取って代わられてしまいましたが、
anything-kyr.elは僕の方ではいまだに大活躍しています。

このEmacs Lispは特に宣伝することもなく
こっそりとEmacsWikiに上げていたので、
知っている人はほとんどいないかと思います。

実に5年ぶりに更新しましたのでこのようにブログを書いています。

KYRとは「空気読める」の略で、 M-x anything-kyr を実行すると、
現在の状況で必要とされるコマンドを提示します。

情報源の変数 anything-c-source-kyr も定義されているので、
自分のanythingコマンドに組み込むこともできます。

anything.elを使うには本来anything-config.elも必要となりますが、
anything-kyr.elのみを使うのであれば不要です。

今更anything関連をMELPAに上げるのはアレなので、
auto-installベースでインストールするようにしています。

anything-kyr インストール

これはまだパッケージ化されていないので、手動でインストール する必要があります。

M-x auto-install-batch anything-kyr
でインストールできるようにしました。

設定 141015113526.anything-kyr.el(以下のコードと同一)

;; KYR = "Kuuki wo YomeRu" in Japanese (can read the atmosphere)
(require 'anything-kyr)
(setq mode-line-buffer-identification
      (append '(" "
                (:eval (and (featurep 'anything-kyr)
                            (anything-kyr-should-notify-p))))
              mode-line-buffer-identification))
(put 'mode-line-buffer-identification 'risky-local-variable t)

(setq ;; メジャーモードでの設定
      anything-kyr-commands-by-major-mode
      ;; org-modeのときにorg-clock-in, org-clock-outを提示
      '((org-mode
         org-clock-in org-clock-out))
      ;; 条件での設定
      anything-kyr-commands-by-condition
      '(
        ;; M-x trace-functionした関数があるときに
        ;; untrace-allとuntrace-functionを提示する
        ((and (featurep 'trace)
              (loop for (funcname) in ad-advised-functions
                    thereis (trace-is-traced (intern funcname))))
         untrace-all untrace-function)
        )

      ;; ファイル名での設定
      anything-kyr-commands-by-file-name
      '(
        ;; yaoddmuseディレクトリのときに提示
        ("/.emacs.d/yaoddmuse/"
         yaoddmuse-browse-current-page
         "http://www.emacswiki.org/")
        ))

実行方法

$ wget http://rubikitch.com/f/141015113526.anything-kyr.el
$ emacs -Q -f package-initialize -l 141015113526.anything-kyr.el

その後
M-x trace-function RET find-file RET
でトレースを有効にするとバッファ名の前に◎がつき、
M-x anything-kyrでuntrace-allとuntrace-functionが提示されます。

M-x untrace-allを実行すると◎が消えます。

御自分にあうように条件を書き換えてください。

20141015114924.png
Fig1: 条件が整ったときに◎がつき、コマンドが提示される

一連のつぶやき

  • 2014/10/15 07:12:47 rubikitch > 入力補完はあれば助かる程度のもので、補完設定を書くのに四苦八苦するようでは本末転倒や。それよりも類似のコードを検索したりとか、テンプレートやドキュメントをひっぱってくる方が大切よね。 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/15 07:11:01 rubikitch > 空気読んでコマンドを提示するanything-kyr.el…まあ昔の自分が欲しかったから作ったし今もそれに助けられているのであるが、果たして需要はあるのだろうか。あるのならば再設計したい。 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/15 07:06:00 rubikitch > anything-kyr(condition-command)が発動する条件がたくさん出てきたら、それはもはやAIになるのか?どうあれ、次に実行すべきコマンドをお知らせしてくれるシステムはあるとすごい助かる。 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/15 07:03:29 rubikitch > anything-kyr.elを再設計するとなったら、名前も変えるべきよね。condition-command.elあたりだろうか。モードラインでお知らせし、helm/anything/menuのインターフェースで適切なコマンド・orgリンクを提示するやつ。 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/15 01:41:18 rubikitch > anything-kyrの条件強化+ドキュメント参照コマンド量産計画。ドキュメント参照コマンドはorgのリンクを呼び出す org-open-link-from-string経由がよさげ。
    たとえばRubyでNokogiriでxpathを記述するときにxpathの参考資料出すとか。 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/14 21:32:50 rubikitch > anything-kyrをhelmに移植するとしたら、helm-M-xと合わせるのがちょうどいい落とし所だろう。となると helm-M-x-transformer を書き換えてkyrに対応させればいけそうだ。時間がないので興味ある誰かさんに任せよう。 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/14 21:25:22 rubikitch > 他にもtrace-functionのアドバイスがかけられている関数があるならば、untrace-allやuntrace-functionを提示するとかね。
    TWにブログURL出すのも…
    条件をすらすら書けるelisp力があればいくらでも強化できるのがanything-kyr.el by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/14 21:21:48 rubikitch > ここ数日company.elと格闘していたのだが、時間効率考えたらanything-kyr.elの条件設定+条件限定コマンドを定義してる方がいいことに気付いた。例えばorg-babelのパラメータの使い方ならば、begin_src行という条件設定に対し、infoを開くコマンド定義 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/14 21:17:45 rubikitch > てゆーかanythingは情報源を組み合わせて統合させるのが主眼だったのにhelmになったら単一情報源によるコマンドがやたらめったら定義されている…情報源を組み合わせてオレオレhelmを構築すべきでしょ。集中と分散で歴史は繰り返すのだろうか。#Emacs by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/14 21:14:15 rubikitch > smart-mode-lineでの設定例:

(setq sml/pos-id-separator ‘(” ” (:eval (when (and (featurep ‘anything-kyr) (anything-kyr-should-notify-p)) “◎”)))) by るびきち@日刊Emacs from twmode [Emacs on Debian]

  • 2014/10/14 21:13:00 rubikitch > anything-kyr.el…使っている人は多分いないと思うけど、条件が整ったときにコマンドをanythingで提示してくれるやつ。
    せっかく作ったコマンドを忘れないようにするために昔作ったけどいまだ現役。
    元々ある機能しか使ってないから置換するだけでhelmでも動くかと。 by るびきち@日刊Emacs from twmode [Emacs on Debian]
  • 2014/10/14 21:08:45 rubikitch > もう忘れられてると思うが5年半ぶりに更新!anything-kyr-should-notify-p でコマンドを提示してくれるか否かを判定。モードラインに表示するといい #Emacs (install-elisp-from-emacswiki “anything-kyr.el”) by るびきち@日刊Emacs from twmode [Emacs on Debian]

タグ

2014/10/15 | コメント/トラックバック(0) |

カテゴリー:Emacs org-mode

emacs company.el : Emacs版IntelliSenseの先駆者が息を吹き返している件!Simple is best! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 company
概要(原文) Modular text completion framework
リポジトリ MELPA
取得先 https://github.com/company-mode/company-mode
バージョン 20141012.1355
関連記事 package:company package:yasnippet package:auto-complete

company.el は一言で言うとEmacs版 IntelliSense (インテリセンス) です。

キーをタイプした時点で自動的に補完候補が出てきて、
ミスタイプを減らして入力効率を上げる優れた 補完機能 です。

同種のものに日本では auto-complete.el が有名ですが、
company.elの方が先に登場しています。

2年前に Dmitry Gutov 氏が原作者 Nikolaj Schumacher 氏から
メンテナを引き継ぎだ後、とても活発に開発されています。

MELPAのRSSを見ていてもかなり更新が目立っているので取り上げました。

auto-completeと性能的にはほぼ互角という印象ですが、
ソースコードが短く、独自の補完関数が関数1つで書ける手軽さが
company.elの魅力です。

デフォルトでは自動的に補完候補がポップアップしますが、

(setq company-idle-delay nil)

を指定すると手動補完になり、 M-x company-complete で補完します。

どのように補完するかは
(auto-completeでいうsource、companyではbackend)
company-backends 変数で指定します。

個人的にはあまりにも頻繁に自動補完がポップアップするのは煩わしいので、
自動補完は限られた場面のみで、手動補完をメインに使っていきたいです。

自動補完はついつい忘れがちなもの…
たとえば ドメイン特化言語 の語彙だったり、
yasnippet の略語に使いたいところです。

デフォルトではファイル名も自動補完されるので、
ファイル数が多いディレクトリで固まることもあります。

どうあれ、奥が深いパッケージなので
時間かけて落とし所を見つけていきたいです。

company インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install company

実行方法

$ wget http://rubikitch.com/f/141014122338.company.el
$ emacs -Q -f package-initialize -l 141014122338.company.el

20141014123207.png
Fig1: EmacsでIntelliSenseを実現!

バックエンドを定義する

company.elに書かれているサンプルのバックエンド(やや改変)を解説します。

このバックエンドはfooの後に

  • foobar
  • foobaz
  • foobarbaz

を補完します。

(defun company-my-backend (command &optional arg &rest ignored)
  (interactive (list 'interactive))
  (pcase command
    (`interactive (company-begin-backend 'company-my-backend))
    (`prefix (when (looking-back "foo\\>")
              (match-string 0)))
    (`candidates (list "foobar" "foobaz" "foobarbaz"))
    (`meta (format "This value is named %s" arg))))

バックエンドを実行するとき、最初に引数prefixが渡され、
そのバックエンドが有効かどうかを見極めます。

ここではカーソル直前がfooのとき(whenとlooking-back)に有効で、
prefixが渡されたときの返り値fooを返します。

そして、有効なときに引数candidatesが渡され、補完候補を返します。

metaは、それぞれの候補の説明をエコーエリアに表示します。

さらに、このバックエンド自体がコマンドになっていて、
コマンドとして実行した場合は引数interactiveを渡すようにしています。

このコマンドをテンプレートとして使えば
手軽に独自のバックエンドを作れます。

たった1つの関数で閉じている設計が素敵ですね!

タグ

2014/10/14 | コメント/トラックバック(0) |

カテゴリー:Emacs

org-mode、お前の実力はそんなもんか!?

僕はいつも通り最新 org-mode で文章を書いていたのだが、
衝撃的な事実がわかったのでブログすることにします。

orgフォーマット軽量マークアップ言語 の一種で、
org-modeはorg文書を読み書きするためのメジャーモードです。

そして、軽量マークアップ言語とは読み書きしやすい形式で
文書構造を表現するものです。

つまり、 可読性が命 なんです。

今回の発見はorgフォーマットの可読性に激震が走るものです。

さりげなく以下の文書を書いて、HTMLに変換したところ…

* example

#+begin_example
, * 2
, ** 3
これを埋め込みます。
#+end_example

#+begin_example
* 2
** 3
これを埋め込みます。
#+end_example

↓org8(最新版)で変換したら
http://rubikitch.com/f/141013074111-org8.html

20141013074958.png
Fig1: org8ではめちゃくちゃ!

なんとめちゃくちゃに変換されたのでしょうか!!!!

ちなみにEmacs24.3標準添付のorg-7.9.3fでは
意図通りに変換してくれます。

http://rubikitch.com/f/141013074111-org7.html

20141013075004.png
Fig2: org7では正しい

「#+BEGIN_SRC〜#+END_SRC」、「#+BEGIN_EXAMPLE〜#+END_EXAMPLE」は
本来ならば囲まれた部分をそのまま出力する指令です。

つまり、記述する側に立ってみれば
これらのブロックはまさに 結界に守られた聖域 であり、
ENDが来るまでブロックの内容には手が加えられないはずでした。

「#+END_SRC」なんて、org-modeそのものの解説でもなければ
ブロック内部に現れるなんてことはありません。

そのため聖域の中では何でも自由に書ける安心がありました。

しかし、この挙動の変化により結界が破られ
安心してブロックの内容を書けなくなりました。

これは仕様変更なんだろうかと思い
orgmode.orgのRelease Note を見てみましたが
該当する記述は見当たりませんでした。

Emacs 24.3同梱のorgは7.9.3fであり、
8.0.3で大きく変更されたことから8.0.3で試したところ
上記のような現象が起きました。

Git最新版にしても解決していません。

人ん家に土足で踏み入っていいのか?

正直、この変更に対して僕はどん引きした上に 怒り心頭 です。

例えてみれば、性格も仕事も素晴しい日本人の友人がいるとして、
彼が土足で(日本)人の家に上がったようなものです。

本来、軽量マークアップ言語で書かれた文書は
将来のバージョンにわたっても
修正なしで正しく変換されるべきものですが、
この変更により文書の変更が強要されます。

しかも、行頭の「*」はorg以外の文書ならば
いつ出てきてもおかしくありません。

それなのになぜ醜悪この上ない「,」をつける必要があるのでしょうか。

SRC・EXAMPLEブロックは上述の通り聖域であり、
このようなエスケープは聖域を侵す行為
土足で人ん家に侵入する行為に他なりません。

安心してブロックを記述できなくなり、
可読性にも大きく傷がつきました。

対処法

対処法はINCLUDEを使うことです。

#+INCLUDE example.txt example

このように書けば、example.txtの行頭に「*」が来ても正しく変換されます。

なお、ブロック内エスケープされるのは行頭に
「*」「#+」「,*」「,#+」が来る場合です。

以下の関数参照してください。

  • org-escape-code-in-region
  • org-escape-code-in-string

タグ

2014/10/13 | コメント/トラックバック(0) |

カテゴリー:Emacs org-mode

このページの先頭へ