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

20140818171856.png
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

20140818172252.png
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)'

本サイト内の関連パッケージ


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。