ncursesを使う

Common Lispにはcl-ncursesというncursesライブラリあり。

まずはインストール。

 (require 'asdf-install)
 (asdf-install:install 'cl-ncureses)

簡単なサンプルを作ってみる。

sample1.lisp

(asdf:oos 'asdf:load-op :cl-ncurses)

(defun print-msg (y x msg)
  (cl-ncurses:move y x)
  (cl-ncurses:printw msg)
  (cl-ncurses:refresh))

(defun sample1()
  (format t "*ncurses sampel1~%")
  (cl-ncurses:initscr)

  (print-msg 5 15 "Hello, world!")
  (sleep 2)

  (cl-ncurses:endwin)
  (format t "*end~%"))

(sample1)

実行してみる。

$ sbcl
* (load "sample1.lisp")

動いた!

日本語は表示できるかな?
「Hello, world!」 → 「こんにちは、世界!」
に変更して、UTF-8で保存。
実行すると、文字化けする。
こりゃいかん。

Google先生に聞いてみると、ncursesで日本語を使用するには libncurseswを使えば良いようだ。

cl-ncursesのどこかでlibncursesを参照しているんだろうな。
これをlibncurseswにすれば日本語を表示できるかも。

cl-ncursesをlibncursesでgrepしてみると、
package.lispでヒット。

(defparameter *ncurses-path*
  #-win32
  (find-foreign-library
   "libncurses" ; ←ここをlibncurseswに変更する。
   *ncurses-search-paths*
   :drive-letters '("C" "D" "E")
   :types '("so" "dylib" "a" "dll"))
  #+win32
  (find-foreign-library
   "pdcurses"
   *ncurses-search-paths*
   :drive-letters '("C" "D" "E")
   :types '("dll"))
  )

上記のlibncursesをlibncurseswに変更する。
早速実行だ。

うまく表示できた。

cl-ncursesのREADMEを読むと、uffiという仕組みを使って
ライブラリを実装しているということだ。

なかなか面白いので、いろいろ試してみよう。