header

2016年7月6日水曜日

Nimlang の関数を Emacs から呼び出す②

結構時間があいてしまってあれなのですが、以前 Nimlang の関数を Emacs から呼び出す(途中までしかできてない) という記事を書いてそのまま放置だったけれど、Nim のバージョンが上がってから試したらすんなり動いたというのと、el-get に登録したので紹介します。(Nim の lambda_lifting に関するバグがなおったあと良くなったとおもいますが、詳しいバージョンや Issue 番号など忘れてしまいました)

おさらい

Emacs25 から追加される dynamic module という機能で C の関数を呼び出すという機能を利用して、C にコンパイル可能な Nim で Emacs 用の拡張を作るという試みです。

その他日本語記事:

確認している Emacs と Nim

以下のバージョンで確認しています。

  • emacs-version(master branch): 25.1.50.1
  • Nim version(devel branch): 0.14.02

インストール

el-get に登録したので`el-get-list-package` とかでインストールできます。dynamic module を利用した拡張は(MELPA などで簡単にインストールして使える形で提供しているのは)まだないので、他の Dynamic Module の拡張のやり方を真似しようかな思っているので MELPA にはまだ登録していません。なので、位置づけとしては、Nim で Emacs の拡張を書くお遊びパッケージという感じです。

使い方

インストールが終わったら、

(el-get 'sync 'nim-emacs-module)

でロードパスの登録と autoload を使えるようにして、M-x `nim-emacs-module-init`で~/.emacs.d/に nim-emacs-module ディレクトリを作ります。(確認してないけど、別に手動でも OK です)

あとは作りたいパッケージ名の名前でファイルを作ります。例えば sample-xxx 関数を持つなら、sample.nim というファイル名になります。ここでつけるファイル名が Nim では(Nim でいう)モジュール名になり、なおかつ Emacs 用の関数の prefix 名となります。(便宜上そうなるように設計してるだけで Emacs 側にそれを強制するルールはありませんが)

あとは開いたファイルで, M-x nim-emacs-module-insert-template で必要な設定がファイルに挿入されます。

現在の nim-emacs-module では以下のようなコードが挿入されます。 (挿入されるものは将来的に変更されるかもしれないので、こんなニュアンスなんだという理解のほうがいいかもです。)

# `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 emacs_module # Primitive wrapper for emacs_module.h
import emextra      # Helper library
init(emacs)
# Example(Create a file named `mod_test.nim`):
emacs.defun(return_t, 1):
  env.intern(env, \"t\".cstring)
# Provide functions registered by above from here.
emacs.provide()
# How to test the example's code:
#
#   $ emacs -Q -L .
#
# and then in *scratch* buffer, evaluate those lines:
#
#   The file name ‘ mod-test ‘ is added as prefix name of each functions and
#   its package name.
#   (require 'mod-test)
#   (mod-test-return-t)

Nim では#がコメントなので実質数行のコードですが、なんとなく Emacs で拡張作ってる方には Nim を知らなくてもわかるのではと思います。

この例では、ファイル名が mod-test.nim で関数名が return_t、引数の数が1つの Emacs の関数`mod-test-return-t`が作られます。

コンパイルの方法は nim-mode で C-c C-c でコンパイルできるようにしていますが、M-x nim-emacs-module-compile でもコンパイルできるはずです。

コンパイル後は上記コメントのように mod-test パッケージを require して、関数を試すという感じです。

今後

Emacs の dynamic module 機能がまだ始まったばかりなので今後どうなるかわかりませんが、多言語で複数パッケージを管理するスキームができたら真似してみたいなぁとおもいます。あと C、Nim とも初心者なので、まだ Nim<->Emacs Module 間でのメモリの扱いがどうなるのかわからなくてプリミティブなテストしか作ってないので時間があればもうちょっとなんとかしたいなぁという感じです。(Pull Requests 大歓迎です)

2016年1月18日月曜日

Nimlang 用の Emacs おすすめ設定

Nimlang 公式?の emacs メジャーモードは nim-mode でコード補完や eldoc サポートはこのリポジトリに入っているのですが、それ以外にあったほうがよいものとか

※注意 nim-mode はすでにインストール済みを前提に書いています。

なにはなくとも nimsuggest

nimsuggest は nim 用の IDE(or text editor)支援ツールでこれがないとコード補完と eldoc の機能が使えないので、Emacs で nim を書くにはほぼ必須ツールです。

リンク先にインストール方法は書いているとおもいますが、nim 本体と同じディレクトリに git clone して nimsuggest のディレクトリで

nim e ./compile_without_nimble.nims

をすればよかったと思います。ちなみに.nims ファイルは nimscript の略です。ghq を使っている場合は、同.nims ファイルの–path:../nim を Nim にしないとダメでした

無事ビルドしたら以下を emacs に設定することで eldoc と company-mode が使えるようになります。

(setq nim-nimsuggest-path "nimsuggest のバイナリへのパス")
(add-to-list 'company-backends 'company-nim)

flycheck (MELPA からインストール可能)

https://github.com/ALSchwalm/flycheck-nim

特にそのままでも使えますが、前述の nimscript の機能が新しいので syntax チェック機能がまだ未対応のようので nims や nimble ファイルを書くのであれば今のところ下の設定で flycheck は無視したほうがいいかもしれません。(おそらく syntax チェックは公式がそのうち対応するので)

(defun my-turn-on-flycheck-nim ()
  (when (and buffer-file-name
             (not (member
                   (file-name-extension buffer-file-name)
                   '("nims" "nimble"))))
    (flycheck-mode t)))
(add-to-list 'nim-mode-map 'my-turn-on-flycheck-nim)

indent-guide (MELPA からインストール可能)

インデント構造を見やすくする拡張です。リンク先に screenshot があるのでそれを見たほうがわかりやすいです。 https://github.com/zk-phi/indent-guide

quickrun (MELPA からインストール可能)

自分が紹介しなくてもみなさん知っているかもしれないですが、ワンコマンドで現在ファイルを実行する拡張です。多(プログラミング)言語に対応していますが nim も入っています。 https://github.com/syohex/emacs-quickrun

おわり

自分が使っているのはだいたいこんな感じです。他に便利拡張が教えてください。

2016年1月13日水曜日

Emacs から ibus をトグルする拡張作った

Evil 使ってる時に Normal モードに入った時に日本語をオフしたかったので作った。普通に shell command で`ibus engine`呼び出してるだけだけど、あまり良さそうな情報がなかったので自分で書いた。ここから ダウンロードできます。

設定

(require 'ibus-toggle)
(define-key global-map (kbd "C-o") 'tibus-toggle)

tibus-toggle でトグルできます。

Evil から使うなら、自分はこうしてます。指定するキーボードは`ibus read-config` コマンドでみれます。

(add-hook 'evil-normal-state-entry-hook
          '(lambda () (tibus-set-engine "'xkb:us::eng'")))

1/18/2016 追記 カーソル手前の文字が日本語だったら mozc にする設定を思いつきました。便利かどうか謎ですがよかったら使ってみてください。

(require 'rx)
(add-hook 'evil-emacs-state-entry-hook
          '(lambda ()
             (let ((c (char-before (max (point) (point-min)))))
               (when (and c (string-match (rx (category japanese))
                                          (char-to-string c)))
                 (tibus-set-engine "'mozc-jp'")))))

感想

ホントは mozc から変更したかった。けどそういうオプションなさそうだったので妥協して ibus で操作することにした。mozc 便利だけどかゆいところに手が届かない感じだ。

Popular Posts

Blogger templates

Blogger news