- deferred 20170531.2135(in MELPA)
- Simple asynchronous functions for emacs lisp
概要
deferred.elはEmacs Lispで疑似マルチスレッド
プログラミングができるようにするライブラリです。
非同期処理をしたいと思ったら、
とりあえず手を出してみるべきです。
具体的な使い方について知りたいならば、
「使用例1」のコードを実際に実行してください。
サンプルの内容がバッファに挿入されるので、
式ごとにC-x C-eを押して確認してください。
なお、使用例3のように内部でdeferredを使っている関数がある場合は、
ファイルローカルな lexical-binding の設定を加え、
letを レキシカルスコープ にしておいてください。
関数marquee-stringがそれに該当し、
strとdelayはレキシカルスコープでないと動作しません。
ただし、レキシカルスコープがサポートされているのはEmacs24からなので、
Emacs23以前を使っている方は lexical-let を使ってください。
インストール
パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。
(package-initialize) (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") ("melpa" . "http://melpa.org/packages/") ("org" . "http://orgmode.org/elpa/")))
初めてdeferredを使う方は
以下のコマンドを実行します。
M-x package-install deferred
アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。
M-x package-install package-utils (初めてアップグレードする場合のみ) M-x package-utils-upgrade-by-name deferred
使用例1(サイトの内容をバッファに挿入) 140818171638.el(以下のコードと同一)
(require 'deferred)
(require 'url)
(deferred:$
;; URLの内容を取得し
(deferred:url-retrieve "https://raw.githubusercontent.com/kiwanami/emacs-deferred/master/deferred-samples.el")
(deferred:nextc it
(lambda (buf)
;; bufはURLの内容(HTML)が入っている
;; HTMLをカレントバッファに挿入!
(insert (with-current-buffer buf (buffer-string)))
;; ダウンロードに使ったバッファはいらないので削除
(kill-buffer buf))))
実行方法
$ wget http://rubikitch.com/f/140818171638.el $ emacs -Q -f package-initialize -l 140818171638.el
Fig1: URLの内容を非同期でカレントバッファに挿入
使用例2(画像を縮小してカレントバッファに挿入) 140818172125.el(以下のコードと同一)
(require 'deferred) (deferred:$ (deferred:process "wget" "-O" "a.jpg" "http://www.gnu.org/software/emacs/tour/images/splash.png") (deferred:nextc it (lambda (x) (deferred:process "convert" "a.jpg" "-resize" "100x100" "jpg:b.jpg"))) (deferred:nextc it (lambda (x) (insert-image (create-image (expand-file-name "b.jpg") 'jpeg nil)))))
実行方法
$ wget http://rubikitch.com/f/140818172125.el $ emacs -Q -f package-initialize -l 140818172125.el
Fig2: 画像を縮小して挿入
使用例3(文字列をスライドさせる) mylisp-marquee.el(以下のコードと同一)
;;; -*- lexical-binding: t -*- (require 'deferred) (defvar marquee-deferred-chain nil) (defvar marquee-count 0) (defun marquee-string (str delay) (setq marquee-count 0) (setq marquee-deferred-chain (deferred:loop 29999 (lambda (i) (deferred:$ (deferred:next (lambda () (message "%s" (truncate-string-to-width (substring (concat str " " str " " str) (mod i (length str))) (- (frame-width) 1) 0)))) (deferred:wait (* 1000 delay))))))) ;; (marquee-string "foobarbaz" 0.2) ;; (marquee-cancel) (defun marquee-cancel () (interactive) (when marquee-deferred-chain (deferred:cancel marquee-deferred-chain)) (setq marquee-deferred-chain nil)) (provide 'mylisp-marquee)
実行方法
$ wget http://rubikitch.com/f/mylisp-marquee.el $ emacs -Q -f package-initialize -l mylisp-marquee.el -eval '(marquee-string "foobarbaz" 0.2)'
本サイト内の関連パッケージ
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。