最新情報

2014年11月1日Emacs
emacs github-browse-file.el : 【githubファン必見】今開いているgithubなソースコードをブラウザで閲覧する! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方
2014年10月31日メルマガ
org-modeを使ってコードやグラフが含まれるHTMLを作ろう!
2014年10月30日Emacs
【関数再定義革命】Emacs 24.4ではdefadviceは時代遅れ!nadvice.elによる洗練された新しいアドバイス定義方法!!
2014年10月29日Emacs
Emacs 24.4で整理された設定ファイルたち
2014年10月28日Emacs
【SKK校正】emacs DDSKKで議事録の校正スピードを3倍にする方法

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

emacs github-browse-file.el : 【githubファン必見】今開いているgithubなソースコードをブラウザで閲覧する! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方

パッケージ名 github-browse-file
概要(原文) View the file you’re editing on GitHub
リポジトリ MELPA
取得先 https://github.com/osener/github-browse-file
バージョン 20141031.930
関連記事 package:github-browse-file package:magit

github はソースコードの色付けがしてあったりして、
ソースコードを読むのにも便利ですね。

github-browse-file.el は、今開いているファイルの
github のページをブラウザで開きます。

もしあなたがgithubにホストされているソースコードを開いているならば、
M-x github-browse-file 一発でgithubに飛んでくれます。

以下の設定を加えれば、今見ている行に自動的に飛んでいきます。

git blame 相当の表示が見たければ M-x github-browse-file-blame
実行してください。

C-uを付けるとHEADを見に行きます。

magit にも対応しています。

M-x magit-status (メジャーモードが magit-status-mode)で
M-x github-browse-fileを実行したら
treeディレクトリを開いてくれます。

github-browse-file インストール

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

M-x package-refresh-contents
M-x package-install github-browse-file

設定 141101081020.github-browse-file.el(以下のコードと同一)

(setq github-browse-file-show-line-at-point t)

実行方法

$ wget http://rubikitch.com/f/141101081020.github-browse-file.el
$ emacs -Q -f package-initialize -l 141101081020.github-browse-file.el

タグ

2014/11/01 | コメント/トラックバック(0) |

カテゴリー:Emacs

org-modeを使ってコードやグラフが含まれるHTMLを作ろう!

Emacs 24.4 がリリースされ、org-modeもorg7から org8に変わりました

その際、いろいろなところが大きく変更されたのですが、
他フォーマットへの変換も操作性がガラッと変わってしまいました。

これまでメルマガではorg文書内のコードを再利用する方法を3つ紹介しましたが、
今回はHTML化したときに、どのようにな形でコードが埋め込まれるのかを
実例を用いて詳しく見ていきます。

埋め込まれ方は言語によって異なるし、ときに細かい指定が必要になってきます。

もちろん、org8のでの他フォーマットへ変換操作の変更点も紹介します。

今回のメルマガを理解すれば、コードやグラフが含まれるHTMLを簡単に作成できます。

タグ

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

カテゴリー:メルマガ

【関数再定義革命】Emacs 24.4ではdefadviceは時代遅れ!nadvice.elによる洗練された新しいアドバイス定義方法!!

Emacs Lispの関数で再定義なしに挙動を変更するには
古くから defadvice による アドバイス が使われていました。

Emacs 24.4では古くから使われている advice.el に代わって
nadvice.el がアドバイス定義をするようになりました。

旧来のアドバイスはあまりにも複雑すぎました。

しかも ad-do-it だの ad-return-value などという
変数というかシンボルマクロというか…謎の代物を使うマクロでした。

新しいアドバイスは関数で閉じているのでシンプルになりました。

行数を見ても明らかです。

  • advice.el 3276行
  • nadvice.el 509行

行数実に1/6!

それでは、新旧アドバイスの挙動を比較してみましょう。

アドバイスでの挙動を観察するには、
実行経路と関数の戻り値を調べます。

defadvice:startは、defadvice:1の返り値と実行経路を返します。

defadvice:resetは、アドバイスをすべて解除します。

旧来の方法 141030131228.defadvice.el(以下のコードと同一)

それでは旧来のdefadviceの挙動を確認しましょう。

(defun defadvice:start ()
  (let (lst)
    `(:return ,(defadvice:1 256)
      :route ,(nreverse lst))))
(defun defadvice:reset ()
  "`defadvice:1'にかけられたadviceを全部削除する"
  (ad-disable-regexp "defadvice-test-")
  (ad-update 'defadvice:1))

;;; 元の挙動
(defun defadvice:1 (x) (push `(original ,x) lst) 'original)
(defadvice:reset)
(defadvice:start)
;; => (:return original :route
;;             ((original 256)))

;;; beforeアドバイス
(defadvice defadvice:1 (before defadvice-test-before activate)
  (push `(before ,x) lst)
  'before)
(defadvice:start)
;; => (:return original :route
;;             ((before 256)
;;              (original 256)))

;;; afterアドバイス
(defadvice defadvice:1 (after defadvice-test-after activate)
  (push `(after ,x) lst)
  'after)
(defadvice:start)
;; => (:return original :route
;;             ((before 256)
;;              (original 256)
;;              (after 256)))

;;; aroundアドバイス
(defadvice defadvice:1 (around defadvice-test-around activate)
  (push `(around-1 ,x) lst)
  ad-do-it
  (push `(around-2 ,x) lst)
  (setq ad-return-value 'around))
(defadvice:start)
;; => (:return around :route
;;             ((before 256)
;;              (around-1 256)
;;              (original 256)
;;              (around-2 256)
;;              (after 256)))

新しい方法 141030111602.advice-add.el(以下のコードと同一)

新しい方法では、 advice-addadvice-remove を使います。

(advice-add '関数名 場所 'アドバイス関数名)

新しい方法でアドバイスを定義するには、アドバイス関数を定義し、
advice-addを呼び出します。

場所は主にこの3つです。

  • :before
  • :after
  • :around
(advice-remove '関数名 'アドバイス関数名)

アドバイスを解除するには、advice-removeでアドバイス関数を指定するだけです。

場所指定も ad-update も不要になったのは嬉しいですね。

aroundアドバイスの定義は見違えるようにすっきりしました。

ad-do-itの代わりに元の関数が変数になったことで、
apply を使えばいいことになります。

また、ad-return-valueを設定せずとも
そのままアドバイス関数の返り値が
関数の返り値になりました。

(defun advice:start ()
  (let (lst)
    `(:return ,(advice:1 256)
      :route ,(nreverse lst))))
(defun advice:reset ()
  (dolist (where '(before after around override filter-return
                          filter-args true false))
    (advice-remove 'advice:1 (intern (format "advice:%s" where)))))

;;; 元の挙動
(defun advice:1 (x) (push `(original ,x) lst) 'original)
(advice:reset)
(advice:start)
;; => (:return original :route
;;             ((original 256)))

;;; beforeアドバイス
(defun advice:before (x) (push `(before ,x) lst) 'before)
(advice-add 'advice:1 :before 'advice:before)
(advice:start)
;; => (:return original :route
;;             ((before 256)
;;              (original 256)))

;;; afterアドバイス
(defun advice:after (x) (push `(after ,x) lst) 'after)
(advice-add 'advice:1 :after 'advice:after)
(advice:start)
;; => (:return original :route
;;             ((before 256)
;;              (original 256)
;;              (after 256)))

;;; aroundアドバイス
(defun advice:around (orig-func &rest args)
  (push `(around-1 ,args) lst)
  (apply orig-func args)
  (push `(around-2 ,args) lst)
  'around)
(advice-add 'advice:1 :around 'advice:around)
(advice:start)
;; => (:return around :route
;;             ((around-1
;;               (256))
;;              (before 256)
;;              (original 256)
;;              (after 256)
;;              (around-2
;;               (256))))

結果を比較してわかるように、aroundの実行順序が変わりました。

defadviceでは内側にくっついていますが、
advice-addでは外側にくっついていることがわかります。

他のアドバイス 141030132213.advice-add.2.el(以下のコードと同一)

新しいアドバイスでは、それ以外のアドバイスも定義できます。

とはいっても、どれもaroundアドバイスで定義できるのですが、
新しい語彙が増えることで、表現力が向上しました。

  • :override 純粋に関数再定義
  • :filter-return 返り値を加工
  • :filter-args 引数を加工
  • :before-while アドバイス関数の返り値が真のときに本体を実行
  • :before-until アドバイス関数の返り値がnilのときに本体を実行
  • :after-while 本体の戻り値が真のときにアドバイス関数を実行?
  • :after-until 本体の戻り値が偽のときにアドバイス関数を実行?

:filter-argsの返り値は新しい引数リストを返す必要があります。

;;; overrideアドバイス
(defun advice:override (x)
  (push `(override ,x) lst)
  'override)
(advice:reset)
(advice-add 'advice:1 :override 'advice:override)
(advice:start)
;; => (:return override :route
;;             ((override 256)))

;;; filter-returnアドバイス
(defun advice:filter-return (x)
  (intern (format "%s:filter-return" x)))
(advice:reset)
(advice-add 'advice:1 :filter-return 'advice:filter-return)
(advice:start)
;; => (:return original:filter-return :route
;;             ((original 256)))

;;; filter-argsアドバイス
(defun advice:filter-args (args)
  (list (* 2 (car args))))
(advice:reset)
(advice-add 'advice:1 :filter-args 'advice:filter-args)
(advice:start)
;; => (:return original :route
;;             ((original 512)))

;;; before-while/before-until/after-while/after-untilアドバイス
(defun advice:true (x) (push `(true ,x) lst) t)
(defun advice:false (x) (push `(false ,x) lst) nil)
(advice:reset)
(advice-add 'advice:1 :before-while 'advice:true)
(advice:start)
;; => (:return original :route
;;             ((true 256)
;;              (original 256)))
(advice:reset)
(advice-add 'advice:1 :before-while 'advice:false)
(advice:start)
;; => (:return nil :route
;;             ((false 256)))
(advice:reset)
(advice:reset)
(advice-add 'advice:1 :before-until 'advice:true)
(advice:start)
;; => (:return t :route
;;             ((true 256)))
(advice:reset)
(advice-add 'advice:1 :before-until 'advice:false)
(advice:start)
;; => (:return original :route
;;             ((false 256)
;;              (original 256)))
(advice:reset)
(advice-add 'advice:1 :after-while 'advice:true)
(advice:start)
;; => (:return t :route
;;             ((original 256)
;;              (true 256)))
(advice:reset)
(advice-add 'advice:1 :after-while 'advice:false)
(advice:start)
;; => (:return nil :route
;;             ((original 256)
;;              (false 256)))
(advice:reset)
(advice-add 'advice:1 :after-until 'advice:true)
(advice:start)
;; => (:return original :route
;;             ((original 256)))
(advice:reset)
(advice-add 'advice:1 :after-until 'advice:false)
(advice:start)
;; => (:return original :route
;;             ((original 256)))

タグ

Emacs 24.4で整理された設定ファイルたち

元々Emacsはホームディレクトリに設定ファイルをばら撒いていました。

しかし、Emacsローカルな設定にも関わらず
ホームディレクトリにばら撒かれるのは
整理できていなくて見すぼらしいです。

Emacs 24.4では以下のファイルが対象となります。NEWSより。

旧ファイル 新ファイル
~/.timelog ~/.emacs.d/timelog
~/.vip ~/.emacs.d/vip
~/.viper ~/.emacs.d/viper
~/.ido.last ~/.emacs.d/ido.last
~/.kkcrc ~/.emacs.d/kkcrc
~/.quickurls ~/.emacs.d/quickurls
~/.idlwave/ ~/.emacs.d/idlwave/
~/.bdfcache.el ~/.emacs.d/bdfcache.el
~/.emacs-places ~/.emacs.d/places
~/.shadows ~/.emacs.d/shadows
~/.shadow_todo ~/.emacs.d/shadow_todo
~/.strokes ~/.emacs.d/strokes
~/.notes ~/.emacs.d/notes
~/.type-break ~/.emacs.d/type-break
~/.todo-do ~/.emacs.d/todo-do
~/.todo-done ~/.emacs.d/todo-done
~/.todo-top ~/.emacs.d/todo-top

なお、todo-*についてはotodo-mode.elが扱いますが、
すでにobsoleteとなっています。

すべてのリスト

以前から.emacs.d/に配置されるようになっているパッケージもあるので、
それらをすべて機械的にリストしてみました。

設定ファイルは locate-user-emacs-file で見ています。

第1引数に.emacs.d/以下の新しいファイル名、
第2引数は古いファイル名(存在する場合)です。

たとえば

(locate-user-emacs-file "places" ".emacs-places")

は ~/.emacs.d/places があるならばそのファイルを、
なければ ~/.emacs-places を見ます。

server.el.gz:(locate-user-emacs-file "server/")
saveplace.el.gz:(locate-user-emacs-file "places" ".emacs-places")
emulation/viper.el.gz:(locate-user-emacs-file "viper" ".viper")
shadowfile.el.gz:(locate-user-emacs-file "shadows" ".shadows"))))
shadowfile.el.gz:(locate-user-emacs-file "shadow_todo" ".shadow_todo"))))
net/quickurl.el.gz:(locate-user-emacs-file "quickurls" ".quickurls")
emulation/vip.el.gz:(locate-user-emacs-file "vip" ".vip")
net/newst-backend.el.gz:(locate-user-emacs-file "newsticker/" ".newsticker/")
net/tramp-cache.el.gz:80: (expand-file-name (tramp-compat-funcall 'locate-user-emacs-file "tramp")))
savehist.el.gz:(locate-user-emacs-file "history" ".emacs-history")
completion.el.gz:(locate-user-emacs-file "completions" ".completions")
strokes.el.gz:(locate-user-emacs-file "strokes" ".strokes")
play/gamegrid.el.gz:(locate-user-emacs-file "games/")
calendar/timeclock.el.gz:(locate-user-emacs-file "timelog" ".timelog")
calendar/todo-mode.el.gz:(locate-user-emacs-file "todo/")
calendar/todo-mode.el.gz:(locate-user-emacs-file "todo-do" ".todo-do"))))
calendar/todo-mode.el.gz:(locate-user-emacs-file "todo-do" ".todo-do")))
calendar/todo-mode.el.gz:(locate-user-emacs-file "todo-done" ".todo-done")))
emacs-lisp/package.el.gz:(locate-user-emacs-file "elpa")
eshell/eshell.el.gz:(locate-user-emacs-file "eshell/" ".eshell/")
term/x-win.el.gz:(locate-user-emacs-file basename
term/x-win.el.gz:125- (concat ".emacs-" basename))))
image-dired.el.gz:(locate-user-emacs-file "image-dired/")
obsolete/otodo-mode.el.gz:(locate-user-emacs-file "todo-do" ".todo-do")
obsolete/otodo-mode.el.gz:(locate-user-emacs-file "todo-done" ".todo-done")
obsolete/otodo-mode.el.gz:(locate-user-emacs-file "todo-top" ".todo-top")
cedet/semantic/db-file.el.gz:(locate-user-emacs-file "semanticdb" ".semanticdb")
cedet/srecode/map.el.gz:(locate-user-emacs-file "srecode-map.el" ".srecode/srecode-map")
cedet/ede/base.el.gz:(locate-user-emacs-file "ede-projects.el" ".projects.ede")
ido.el.gz:(locate-user-emacs-file "ido.last" ".ido.last")
progmodes/octave.el.gz:(locate-user-emacs-file (format "init_%s.m" n) (format ".emacs-%s" n)))
progmodes/idlwave.el.gz:(locate-user-emacs-file "idlwave" ".idlwave")
filesets.el.gz:(locate-user-emacs-file "filesets-cache.el")
calc/calc.el.gz:(locate-user-emacs-file "calc.el" ".calc.el")
abbrev.el.gz:(locate-user-emacs-file "abbrev_defs" ".abbrev_defs")
url/url.el.gz:(locate-user-emacs-file "url/" ".url/")
startup.el.gz:(locate-user-emacs-file "elpa"))
type-break.el.gz:(locate-user-emacs-file "type-break" ".type-break")
bookmark.el.gz:(locate-user-emacs-file "bookmarks" ".emacs.bmk"))
international/kkc.el.gz:(locate-user-emacs-file "kkcrc" ".kkcrc")
textmodes/remember.el.gz:(locate-user-emacs-file "notes" ".notes")
recentf.el.gz:(locate-user-emacs-file "recentf" ".recentf")
tutorial.el.gz:(locate-user-emacs-file "tutorial/"))
thumbs.el.gz:(locate-user-emacs-file "thumbs")
ps-bdf.el.gz:(locate-user-emacs-file "bdfcache.el" ".bdfcache.el")

これを機にホームディレクトリの掃除をしてみてはいかがでしょうか?

タグ

【SKK校正】emacs DDSKKで議事録の校正スピードを3倍にする方法

会議セミナー議事録 をPCを使って録るときには、
リアルタイム性が求められます。

とにかくスピード命で漢字変換など二の次です。

おまけにミスタイプも多いのでひどいものです。

そのため、議事録を録り終わった後は校正作業を必要とします。

Emacsの SKK (DDSKK) で校正するとき、
見出し語のひらがなに対して / を押すと
▽が出てきて範囲を指定すると漢字変換できます。

わたしは
↓「わ」の前で/
▽わたしは
↓「し」の後でスペース
私は

長い議事録において毎回同じ見出し語を変換するのはとても面倒ですね。

そこで、見出し語を/とスペースで変換した後に、
カーソル以後にも同じ見出し語が登場したときに
query-replace するようなコードを書きました。

もちろん毎回有効にすると煩わしいので M-x skk-auto-replace-mode
という マイナーモード としてon/off切り替えられるようにしています。

置換開始位置に戻るには C-u C-SPC と押します。

正直、なんでこれを早く作らなかったのかと後悔しています(笑)

設定 mylisp-skk-replace.el(以下のコードと同一)

(require 'skk)

(define-minor-mode skk-auto-replace-mode
  "同じ見出し語をquery-replaceする。議事録・セミナーメモ校正のためのモード。"
  nil " SKK置換")
(defvar skk-my-kakutei-key nil "")
(defadvice skk-start-henkan (before auto-replace activate)
  (and (eq skk-henkan-mode 'on)
       (setq skk-my-kakutei-key (buffer-substring skk-henkan-start-point (point)))))
;; (progn (ad-disable-advice 'skk-start-henkan 'before 'auto-replace) (ad-update 'skk-start-henkan))
(defadvice skk-kakutei (after auto-replace activate)
  (skk-replace-after-kakutei))
;; (progn (ad-disable-advice 'skk-kakutei 'after 'auto-replace) (ad-update 'skk-kakutei))


(defun skk-replace-after-kakutei ()
  (interactive)
  (when (and skk-auto-replace-mode
             skk-my-kakutei-key)
    (unwind-protect
        (perform-replace
         skk-my-kakutei-key (buffer-substring skk-henkan-start-point (point))
         t nil nil)
     (setq skk-my-kakutei-key nil))))

(provide 'mylisp-skk-replace)

使用例

効果がはっきりわかるように
わざとくどい例文を用意しました(笑)

わたしはがっこうへいきました。
がっこうはたのしいところです。
なにがたのしいかというと、
わたしのともだちがいっぱいいることです。


私は学校へ行きました。
学校は楽しいところです。
なにが楽しいかというと、
私のともだちがいっぱいいることです。

タグ

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

カテゴリー:Emacs SKK

emacs noflet.el : 関数内でローカル関数を定義する最強の方法 | MELPA Emacs Lisp Elisp パッケージ インストール 使い方

パッケージ名 noflet
概要(原文) locally override functions
リポジトリ MELPA
取得先 https://github.com/nicferrier/emacs-noflet
バージョン 20140822.537
関連記事 package:noflet package:dflet

nofletflet の強力版で、ローカル関数を定義するマクロです。

Emacs Lispにおけるローカル関数といえば、
cl-fletcl-labelscl-letfdflet (要 el-x パッケージ)
を使う方法があります。

しかし、ローカル関数で元の関数を再定義する場合、
退避する必要があるのでコードがぐちゃぐちゃになってしまいます。

その問題を解決するのが noflet マクロです。

noflet内での関数定義においては
変数 this-fn が元の関数定義を保持しているので、

(funcall this-fn 引数...)

という形で元の関数にアクセスできます。

関数ローカルな アドバイス みたいなものともいえます。

というわけで、関数が呼び出している関数の挙動が
気に入らない場合はローカルで上書きしちゃってください。

なお、インデントを正しくしてくれるコードもあるのですが、
僕の環境(Emacs 24.4)では正しくインデントしてくれませんでした。

noflet インストール

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

M-x package-refresh-contents
M-x package-install noflet

使用例

dfletやcl-letfといった旧来の書き方と比較してみてください。

いかにすんなりと記述できるかがわかります。

(require 'noflet)
;;; 元の関数呼び出し
(defun hoge (x) (+ x 100))
(defun fuga (x) (+ (hoge x) 1000))
(hoge 9)                              ; => 109
(fuga 9)                              ; => 1109
;;; hogeを元の関数の結果に1足したものに置き換える
(noflet ((hoge (x) (1+ (funcall this-fn x))))
  (fuga 9))               ; => 1110
;;; hogeを引数そのものを返すように置き換える
(noflet ((hoge (x) x))
  (fuga 9))                      ; => 1009
;;; dflet(元のflet)で元の名前で呼ぶと
;;; 再帰呼び出しになって無限ループになるので退避する必要ある
(let ((orig-hoge (symbol-function 'hoge)))
  (dflet ((hoge (x) (1+ (funcall orig-hoge x))))
    (fuga 9)))                           ; => 1110
;;; cl-letfでも書けるが面倒
(cl-letf ((orig-hoge (symbol-function 'hoge))
          ((symbol-function 'hoge)
           (lambda (x) (1+ (funcall orig-hoge x)))))
  (fuga 9))                             ; => 1110

;;; 参考:cl-fletではhogeで元の関数を呼んでしまう
(cl-flet ((hoge (x) (1+ (hoge x))))
  (fuga 9))                    ; => 1109
;;; nolexfletはcl-fletの別名だがインデントを調節してくれる
(nolexflet ((hoge (x) (1+ (hoge x))))
  (fuga 9))                    ; => 1109

タグ

emacs relative-line-numbers.el : カーソル前後の行を一瞬で処理する3つの方法! | 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 package:ace-jump-mode

先日紹介 した relative-line-numbers.el ですが、
便利な使い方を教えていただいたので記事にします。

これは相対行番号、つまり現在行からの距離を
左端に表示するelispです。

これが何に役立つかというと、 数引数 付きのC-p/C-n/C-kです。

この行数指定するときに相対行番号が書いてあると
ひと目でわかって、すぐにターゲット行がわかります!

C-pとC-nに数引数C-uをつければ、その行数だけ
前後の行に移動します。

たとえば4行前に行くときはC-u 4 C-pと操作します。

ここまでは知っている人が多いと思いますが、実は
「C-数字」や「M-数字」でも数引数がつけられます。

C-u 4 C-pの場合C-4 C-pで同じ効果です。

Ctrlを離さずに済むので楽ですね。

逆にC-4 C-nで4行後に移動します。

C-N C-kは現在行からN行kill(kill-ring に入れる)します。

たとえばC-2 C-kで現在行と次の行をkillします。

こういう操作を行うのにrelative-line-numbers.elは役に立ちます。

個人的には M-x ace-jump-line-modeisearch を使うことが多いので、
あまり使っていない使い方でした。

標準状態のEmacsだと使えなさそうなコマンドも、
パッケージ追加により生き返るのはおもしろいですね!

@junkwさん、@imunolionさん、ありがとうございます。

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/26 | コメント/トラックバック(0) |

カテゴリー:Emacs

emacs zlc.el : 【Emacs 24.4対応】ミニバッファでzshの補完を実現する | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方

パッケージ名 zlc
概要(原文) Provides zsh like completion system to Emacs
リポジトリ MELPA
サイト http://d.hatena.ne.jp/mooz/20101003/p1
取得先 https://github.com/mooz/emacs-zlc
バージョン 20130427.43
関連記事 package:zlc package:helm package:anything

zsh の補完って気がきいていて便利ですよね!

TABを押したら補完候補が下に出てくるのは他のシェルと同じですが、
再度押したら候補をメニュー選択できて、RETを押したらそれが確定されます。

これをEmacsの*Completions*バッファで行おうというのが zlc.el です。

zlc.elがEmacs 24.4に対応できてされてMELPAに登ってきたので紹介します。

僕は anything / helm を使っていていますが、
M-x anything-find-files / M-x helm-find-files の挙動は嫌いです。

だって重いですから…

なのでC-x C-fは標準の挙動で使っています。

自分で最近作成したファイルならばたいてい recentf で拾えますし、
開いたことがないファイルはzshの補完で拾えるくらいが丁度いいと感じています。

Emacsもzsh大好きな人ならば絶対おすすめです!

作者の紹介ページ では画像もデモンストレーション動画もあります。

zlc インストール

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

M-x package-refresh-contents
M-x package-install zlc

設定 141025072030.zlc.el(以下のコードと同一)

(zlc-mode 1)
(let ((map minibuffer-local-map))
  (define-key map (kbd "<down>")  'zlc-select-next-vertical)
  (define-key map (kbd "<up>")    'zlc-select-previous-vertical)
  (define-key map (kbd "<right>") 'zlc-select-next)
  (define-key map (kbd "<left>")  'zlc-select-previous)
  (define-key map (kbd "M-<tab>") 'zlc-select-previous)
  (define-key map (kbd "M-TAB") 'zlc-select-previous))

実行方法

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

タグ

Emacs org-modeでソースコードを再利用する3つの方法とは?

org-mode は文章の中にソースコードを埋め込むことができます。

その機能のことを org-babel といいますが、
org-babelの中で埋め込むソースコードを管理する方法は
大きく分けて3つあります。

そのうち2つの方法はソースコードを別のファイルに書いて、
文書の中にファイル名指定で埋め込む方法です。

これらの方法ならば、ソースコード単体でテストや実行ができるので楽です。

間違ってもソースコードを文書にコピペしてはいけませんよ!

そうするとソースコードを変更したときに
文書に変更が反映されませんから…

DRY原則 はソースコードのみならず、文書にも適用すべき事柄です。

今回のメルマガはorg文書に埋め込んだソースコードを
文書内の別な部分で再利用する方法を紹介します。

具体例として、 org-mode + gnuplot で色々なグラフを描く文書を作成します。

もちろんグラフの画像はEmacsでインライン画像として表示できます。

orgフォーマットはEmacsユーザにとっては最も可用性が高い と考えています。

この方法を応用すれば、ソースコード・画像が含まれる
文書やサイトを作ることがとても簡単になります。

Emacsの可能性を感じてください。

タグ

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

カテゴリー:メルマガ

Emacs 24.4でパワーアップした標準パッケージたち

昨日は標準の編集コマンドたちが便利になったことを紹介 しましたが、
今日は標準のパッケージの成長ぶりを紹介します。

まあ昨日の続きということで。

概要

  • cua-modeの矩形編集が独立して使える!
  • diredでファイル名のみ表示できるようになった!
  • M-:でeldocが使える!
  • icomplete-modeがido/iswitchbっぽくなった!
  • iswitchbがobsoleteに…
  • シンボルisearch
  • 後方置換

cua-modeの矩形編集が独立して使える!

昨日C-x SPC (rectangle-mark-mode)
というコマンドが加わったことを紹介しましたが、
cua.el の方も負けていません。

M-x cua-rectangle-mark-mode が使えるようになりました。

cua-mode の矩形編集はもともと強力ですが、
以前は M-x cua-selection-mode からしか使えませんでしたし、
これでもcua-modeの(Emacs的に)変則的な影響が出ました。

M-x cua-rectangle-mark-modeを使えばcua-modeのクセもなくなります。

独立して使えるようになったのは大きいですね。

cua-modeに嫌悪感を持つ人でも、役立ちます。

C-x SPCも同じような機能ですが、こちらに置き換えてもいいです。

(global-set-key (kbd "C-x SPC") 'cua-rectangle-mark-mode)

他のパッケージとバッティングしやすいので僕はアンチCUAです。

diredでファイル名のみ表示できるようになった!

M-x dired-hide-details-modedired-details.el と同様に
diredでファイル名のみ表示するマイナーモードです。
これがあれば dired-details.el はもう必要ないでしょう。

dired-details.elと合わせるにはこう設定します。

(require 'dired)
(define-key dired-mode-map (kbd "(") 'dired-hide-details-mode)
(define-key dired-mode-map (kbd ")") 'dired-hide-details-mode)

M-:でeldocが使える!

(add-hook 'eval-expression-minibuffer-setup-hook 'eldoc-mode)

を設定すれば M-: でも eldoc が使えます。

eldoc-eval.el が提供していた機能が標準機能になりました。

icomplete-modeがido/iswitchbっぽくなった!

M-x icomplete-mode を使えば、 ido.el / iswitchb.el のようになります。

M-xやC-x C-fやC-x bで候補がミニバッファにずらずら出てきます。

ido/iswitchbとは異なり、C-s/C-rではなくC-,とC-.で選択します。

iswitchbがobsoleteに…

iswitchbがobsoleteになってしまいました…

ido/icompleteに完全に置き換わったということです。

かつてお世話になったパッケージがobsoleteになるのは悲しいものです。

シンボルisearch

M-s . (isearch-forward-symbol-at-point)
現在のシンボルを isearch します。

現在のシンボルを検索するパッケージはいろいろとありますが、
標準機能になったのは嬉しいですね。

後方置換

M-% (query-replace)C-M-% (query-replace-regexp)
による置換は普通はカーソル後が対象でした。

Emacs 24.4において M– を前置すると、カーソル前が置換対象になります。

地味な豆知識でした。

タグ

このページの先頭へ