header

2015年12月30日水曜日

Nimlang の関数を Emacs から呼び出す(途中までしかできてない)

Syohex さんの Emacs に mruby を組み込んでみた 記事を参考に Emacs の dynamic module 機能(Emacs 25.1 から導入予定)で Nimlang の関数を Emacs から呼べるか試してみた。ここ においてありますが、結論からいうと Emacs から nim の関数呼び出しには成功したが、引数を読み込もうとすると これ に近いエラーがでてコンパイルに失敗する。というわけでタイトルの通り途中までしかできていません。

上記の Nim の github issues を見ると作者の方が問題のコードリライトしてるらしく待ってればそのうちなおるのではという感じなのでしばらく待ってみようと思います。

これだけだと、あれなのでこんな感じになったよという報告だけ(だれに?)

# `plugin_is_GPL_compatible' indicates that its code is
# released under the GPL or compatible license; Emacs will refuse to
# load modules that don't export such a symbol.
{.emit:"int plugin_is_GPL_compatible;".}
import strutils
import emacs_module as emacs
emacs.addFunc(Fmod_test_return_t, 0):
  env.intern(env, "t".cstring)
emacs.defuns("libsample", """
DEFUN ("mod-test-return-t", Fmod_test_return_t, 1, 1, NULL, NULL);
""")

emacs_module というのは emacs-module.h の nim 用の wrapper で nim の練習ついでに作ってみました。(env.intern しか動くの確認できてないんですが、、、) 上記の nim のコードは引数がなんであれ t を返すというものです。なんかこれだけエラー起きずにコンパイルできました。`env.intern`の部分から Fmod_test_return_t 関数の中身を記述しています。addFunc というのは nim の template で次のように展開されます。

proc Fmod_test_return_t*(env: ptr emacs_env, nargs: ptrdiff_t,
                         args: ptr array[0..0, emacs_value],
                         data: pointer): emacs_value {.exportc.} =
  env.intern(env, "t".cstring)

自分の理解が正しければ、Emacs の dynamic module で C の関数を読み出す場合は引数と戻り値はすべて同じようなので(型が決まってるので) template で省略するようにしてみました。

まぁ特にまとめはありませんが、時間をおいてまた挑戦してみようと思います。ありきたりな感想ですが Emacs の拡張が Emacs Lisp 以外できたのは、ちょっと感動しました。

2015年12月20日日曜日

xterm-keybinder が urxvt に対応しました。

ターミナル上の Emacs で C-;とかの普段使えないキーバインドを使えるようにする拡張 xterm-keybinder ですが urxvt にも対応したので、紹介します。といっても README と対して内容変わらないのですが、宣伝しないと誰も使ってくれないので、、、

How it works

単純にターミナルエミュレータのなんかのキーを押したら特定のキーシーケンスを出すという設定をして、Emacs 側でそれを解析するという処理をしているだけです。(ただ hyper と super キーを含めると結構数が多いのでパッケージ化したほうが、便利と思ったので公開しています。)

Install

MELPA から xterm-keybinder でインストールできます。もともとは xterm 用に作りましたが、urxvt の設定を追加した感じです。

以下は emacs 側の設定です。

(require 'cl-lib)
(add-hook
 'tty-setup-hook
 '(lambda ()
    (cl-case (assoc-default 'terminal-initted (terminal-parameters))
      (terminal-init-rxvt
       (when (getenv "COLORTERM" (selected-frame))
         (urxvt-keybinder-setup))))))

あとは

urxvtd -q -o -f

で urxvt をデーモン起動して

# xterm-keybinder.el と同じディレクトリに emacs-urxvt-client と
# いうのがついてきます。
emacs_urxvt_client=/path/to/emacs-urxvt-client \
${emacs-urxvt-client} -e emacscliet -t &

のようなシェルスクリプトを書いて適当に起動してください。

emacs-urxvt-client の部分は単純なシェルスクリプトなので、そこに書いてある urxvt の設定を読み込めさえすれば自分が書いたのは使う必要はありません。自分で書きたい人は`urxvt-keybinder-insert`関数を使うとそれ用の設定が挿入されるので使ってみてください。

何が便利か

Emacs は拡張できるのが売りなのに結構空いてるキーバインドがないんですよね、そんななか、ターミナル上の Emacs はさらに使えるキーバインドが制限されるので空いてるキーバインドが足りないという方には便利だと思います。

2015年12月9日水曜日

Emacs の visual-fill-column.el が便利だった

Emacs の org-mode を使うときの便利拡張を見つけてしまったので紹介する。たぶん markdown 書くときも便利だと思う。

何をする拡張か?

buffer 上で長文を適当なところで折り返してくれる拡張です。今は obsolete 扱いだけど、longlines-mode と同じようなことをしてくれる。大雑把な説明だと、auto-fill-mode が、buffer 上で常時発動している感じ。自分は org-mode でブログを書いているけれど、見やすくするのに改行を入れると Blogger の方でスペースに変換されて見づらくなるので toggle-truncate-lines で我慢しながら使っていたがこの拡張のおかげで 70 文字(fill-column 変数で折り返しする文字数を指定できる)でばっちり折り返ししてくれるので非常に助かっている。

設定

インストールは MELPA 経由でできるみたいなので特にそれについては書かないけど、日本語と一緒に使うのにちょっと不満点があったので自分の設定を紹介する。
;; 折り返えしする文字数を指定
;; (デフォルトは 70 というかデフォルトのままでもいいと思う)
(setq fill-column 80)
(defun my-visual-fill-mode (&optional arg)
  "Show filled sentences by visual line mode.
If ARG is non-nil, turn on visual mode stuff."
  (interactive)
  (let ((toggle (or arg (if visual-line-mode 0 1))))
    (visual-line-mode toggle)
    (when visual-line-mode (setq word-wrap nil))
    (visual-fill-column-mode toggle)))
(global-set-key (kbd "おこのみのキーバインドで") 'my-visual-fill-mode)
上の設定の word-wrap の部分が苦労したポイント、自分は pangu-spacing-mode を使っているけれどスペースが入ったタイミングで勝手に折り返されることがあったのでこの設定をいれた。英語しか書かない人は逆にないほうがいい感じに fill してくれる。(英単語が途切れないように) というわけで状況にあわせて適当に設定してみてください。

おわり

sentence-end 変数をいじったりとか syntax-table で"、。"を punctuation に設定してみましたが結局ダメで、今回の設定に落ち着きました。もし英単語をいい感じに折り返してくれて、なおかつ日本語もいい感じに折り返す設定をご存知の方いたらぜひぜひ教えてください!

Terminal 上の Emacs で文字色を見やすく方法(黒背景で半透明)

ターミナル上の Emacs を黒背景で半透明にして使っているのですが、結構最近まで強引に見づらい色をカラーテーマで設定しなおしていたので記事にしてみようと思った。

何が問題か

ターミナル上の Emacs で透過した黒っぽい背景にしていると、たまに見えづらい文字がある。Tmux で色が 256 カラーになっていない場合もあるかもしれないけれど、Emacs が白背景用のデフォルト文字色を見せている場合もある。(Emacs 側で色があっていない場合、コメント文字の色がくらい赤色になり非常にみずらくなる。)

解決法

以下のコードを.emacs とかに貼っつける

(add-hook 'tty-setup-hook
          '(lambda ()
             (set-terminal-parameter nil 'background-mode 'dark)))

tty-setup-hook はターミナルの設定の読み込み終了時に呼ばれるフックで、background-mode->'dark の部分は Emacs に背景が黒ということを設定している。(デフォルトは'light)

Popular Posts

Blogger templates

Blogger news