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)

2015年5月3日日曜日

xterm 上の Emacs で C-;とかの本来使えないキーバインドを使えるようにする拡張を書いた

2015/12/20 urxvt にも対応しました

たぶん Emacs をターミナルで使う人が少数派の中さらに xterm 上の emacs を使う人用の拡張を書いた。この拡張を使うと Xterm 上の(ターミナル上の) Emacs で本来使えない C-;, C-.キーや C-M、C-S のプレフィックスキーを利用するできるようになる。

仕組み

Xterm の設定で特定のキーバインド(キーシーケンス?)が押された時に、任意のキーシーケンスを出力できるので Emacs 側で受け取ったキーシーケンスを C-M-a とかのキーバインドとして使っています。どのキーシーケンスがあいているかは ECMA-48 というのを参考にした。リンク先の 26 ページに CSI キーのなかで private 用に #x3c, #x3d, #x3e, #x3f が開いているようなので#x3f(=文字)を利用するようにした。

実際後ろの方がから試そうとしたら#x3f(?文字は)すでに xterm が使っているようでうまく行かなかった。この ECMA-48 自体なかなか古い資料(1998)なので、ひょっとしてなんかまずいことしてるんじゃないか若干不安がある。。。(お詳しい方いたらコメントいただけたらうれしいです。)

インストール方法

MELPA からインストールできます。el-get でインストールしたい人は以下のコードをでインストールできるようになるはず(試してない)

(add-to-list 'el-get-sources
 '(:name xterm-keybinder
       :type github
       :pkgname "yuutayamada/xterm-keybinder-el"))

設定 & 使い方

.emacs とかに下の設定を追加してください。

(require ’ cl-lib)
(add-hook
 'tty-setup-hook
 '(lambda ()
    (cl-case (assoc-default 'terminal-initted (terminal-parameters))
      (terminal-init-xterm
       (xterm-keybinder-setup)))))

xterm と emacs を起動するときに-xrm オプションで設定を読み込みます。

#!/bin/sh
# xtermopt に xterm-option へのパスを設定してください。
xtermopt=path/to/this-repository/xterm-option
eval "xterm -xrm `${xtermopt}` -e emacsclient -t -a ''"

起動した Emacs で適当にキーバインドを試してみてください。

debug(自分用のメモ)

下のコードを C-x C-e で評価したあと調べたいキーを押すと Emacs 側でどう受け取られるか調べられる。

(key-description (read-key-sequence-vector ""))

おわりに

GUI 版の Emacs とほぼ同じキーバインドが使えてまぁまぁ便利なので、よかったら使ってください。

2015年3月4日水曜日

Emacs evil の text object について調べた

今年から evil.el という Emacs 内で vim をエミュレートする拡張を使っているけれど、text object が便利そうだったので調べた。

Evil 単品で調べるとあんまり情報が入らないと思い、vim で text object で調べたら、以下のページ詳しく書いてあるようだった。

http://blog.carbonfive.com/2011/10/17/vim-text-objects-the-definitive-guide/

しかしながら、実際 dai(indent object?) なるコマンドを normal state で実行してもなんか動いてる感じがしなかった。

そこで Emacs 内での text-object のキーマップを調べてみた。(最初からこっちを調べればよかった) 以下のコードを scratch バッファとかで実行すると message バッファに出力がでる。

(require 'cl-lib)
(cl-loop with inner = (cdr evil-inner-text-objects-map)
with outer = (cdr evil-outer-text-objects-map)
for (char . func) in (append inner outer)
do (message (format "%c : %s" char func)))

出力結果

o : evil-inner-symbol
t : evil-inner-tag
` : evil-inner-back-quote
" : evil-inner-double-quote
' : evil-inner-single-quote
> : evil-inner-angle
< : evil-inner-angle
} : evil-inner-curly
{ : evil-inner-curly
B : evil-inner-curly
] : evil-inner-bracket
[ : evil-inner-bracket
) : evil-inner-paren
( : evil-inner-paren
b : evil-inner-paren
p : evil-inner-paragraph
s : evil-inner-sentence
W : evil-inner-WORD
w : evil-inner-word

inner の部分が a になっただけでキーバインドも同じなので
Outer text object は省略しました。



出力結果をみるとどうやら、vim と evil の text-object は完全互換というわけではないみたい。(evil-version は evil-git-1def26d で確認しました。)

気になって確認したところ

evil-inner-back-quote ってひょっとして`symbol'のような emacs-lisp 内のドキュメントを扱うのかと思ったけど、ほんとに backquote 同士で囲われてる文字列に対応していた。むしろそういう lisp 内のシンボルの扱いは evil-inner-symbol がうまいこと扱うことができるみたい。(`symbol'のような文字列の中のテキストと lisp コード内の foo-bar のようなシンボルも扱えた)

あっあと、括弧のテキストオブジェクトを扱うときに"(", ")"を押すのがちょっとキーボードから遠いし英語キーボードと日本語キーボードで配置が違うのでキーマップ変えようかなぁと思ってたけど、"b"でも扱えるようで特に設定しないでもいい感じに使えそう。

おわり

まだ指がもつれる感じだけど、テキストオブジェクトの考えかたが非常に面白いと思った。特に terminal で Emacs を使うのであれば C-M-キーの代わりに便利に使えそう。

2015年3月3日火曜日

Emacs から firefox36 で browse-url-firefox が失敗する問題の対処法

いつのまにか、Emacs で browse-url で Firefox が違う URL(ただの google.com のページ)を開くようになっていたので調べたら、Firefox36 で–remote オプションが削除されていた。おそらく Emacs 側ですぐに対処されると思うけれど一応、対応策を書いておく。

ぐぐったら以下のページがみつかりどうやら、url-remote 変数を nil にすればうまいこといくらしい。http://askubuntu.com/questions/590265/clicking-link-in-emacs-no-longer-opens-page-in-browser

というわけで以下のようにした。

(require 'browse-url)
(defadvice browse-url-firefox (around my-ff-fix-remote-option activate)
"Apply firefox version 36 which was removed --remote option."
;; assign nil to use-remote of `browse-url-firefox'
(let ((system-type 'windows-nt))
ad-do-it))
(advice-add 'browse-url-mozilla :override 'browse-url-firefox)

なんか mew でリンク開くと失敗して調べたら browse-url-mozilla で開いてるっぽかったので browse-url-firefox で開くようにしておいた。(同じ引数をとっているので問題ないっぽいし、実際動いた。)

system-type を変更するのは正直きもいが、まぁ一時的だし browse-url-firefox の中だけなので我慢する。。。どうしても嫌な人は、リンク先にあるとおり url-remote の代入部分に nil をいれればいいと思います。(自分は開発版の Emacs なのでこっちのほうがアップデートするとき都合がよかった。)

2015年2月2日月曜日

Emacsでkey-translation-mapを設定した

EmacsでC-x 8でなんかプレフィックスキーがあるのは知ってたが、このkey-translation-mapで数学に関係した文字(だけだはないけど)を入力できるらしい。どこで設定してるのかちょっと探したので、一応記事にしておく。

設定した理由

最近、ターミナル上のEmacsでC-mキーとEnterキーを別々に登録できた。(Linux版窓使いの憂鬱(mayu)とEmacsのevent-apply-modifierを利用した。)ただ、なぜだか謎のタイミングで登録したキーが消えて、代わりに"µ"の文字が入力されてしまった。ここで自分が設定したC-mの代わりのキーがA-mなのだが、key-translation-mapとつながっていておそらく autoload のタイミングで自分が設定したキーを上書きしていた。(っぽい)なので、もしA-XXX keyにキーバインドを登録してそれがいつの間にか消えていたら、このkey-translation-mapを疑ったほうがいいかもしれない。(あんま使う機会ないかもしれないけど)

iso-transl.elファイルで定義されている

Emacsのソースでgit.savannah.gnu.org/emacs/lisp/international/iso-transl.elのなかにあった。探すのうまい人はすぐみつかるんだろうけど、"µ"でgrepしても変な辞書にヒットしたり最初ちょっと???ってなった。

設定

読み込まれるタイミングがよくわからなかったので、with-eval-after-loadでinit_iso-trasl.elに保存した以下のファイルを読み込むようにした。

;; init_iso-transl.el
(require 'iso-transl)
;; unbind A-m key because I'm using this key at global map.
;; (and there are four keybinds of µ)
(define-key key-translation-map (kbd "A-m") nil)

C-x 8は結構長くて押したくないキーなのでminor-mode化した。まぁお好みで、、

(easy-mmode-define-minor-mode
Y/iso-transl-minor-mode "Yuta's iso transl key minor-mode"
:init-value nil :lighter nil :keymap iso-transl-ctl-x-8-map)

(defun Y/iso-transl-toggle-minor-mode ()
"Toggle `iso-transl-ctl-x-8-map' keybinds."
(interactive)
(if Y/iso-transl-minor-mode
(Y/iso-transl-minor-mode 0)
(Y/iso-transl-minor-mode t)))

;; 適当なキーに登録してください
(define-key global-map (kbd "C-0") 'Y/iso-transl-toggle-minor-mode)

おわり

一見このキーマップが便利そうな感じで紹介しているけど、数学の記号が入力したい場合は、 helm-ucs でもっとたくさん候補から選べるのでそこまで便利じゃないかもしれない。

2015年1月28日水曜日

ubuntu14.10 awesome wm環境でプリンタ設定にはまった

Ubuntu14.10を導入してからプリンタの設定をしてなかったので設定した。

自分の環境を書くとUbuntu14.10でwindow managerはawesomeを利用している。だからなんだといわれそうだけど、awesomeだとprinterの設定する項目がGUIでみつからなかったので自分のために記事にしておく。

ドライバーのインストール

自分が使いたいプリンタ用のドライバをインストールする。CanonのMG6120が使いたかったので、 このページこのページ を参考にppaを追加した。

sudo add-apt-repository ppa:michael-gruz/canon-trunk
sudo apt-get update



64ビット環境なので以下をインストールした(自分が必要なドライバを選ぶ)MG6120は6100系のドライバで動いたのは前の環境で知っていたので以下のようにインストールした。

sudo apt-get install cnijfilter-common-64 cnijfilter-mg6100series-64





プリンタの設定

ブラウザでlocalhost:631にアクセスする方法もあるけど、僕はsystem-config-printerコマンドで設定した。locahost:631で設定する場合はadd printerとかで先に管理者用のパスワードを入力しないとfind network printerでプリンタがみつけられなくてはまった。

sudo system-config-printer




なに用のプリンタか

プリンタにいくつか種類があるがnmapコマンドで調べると、ippとかlpdとか推測できる。自分の場合は、515があったのでlpdでprinterを登録したら、印刷できるようになった。

nmap PRINTER_IP_ADDRESS
# result example
# Not shown: 997 closed ports
# PORT STATE SERVICE
# 80/tcp open http
# 139/tcp open netbios-ssn
# 515/tcp open printer
# Nmap done: 1 IP address (1 host up) scanned in 3.93 seconds

エラーメッセージ

上に書いたやりかたに行き着くまでエラーをみながらググっていたが、エラーは以下のようなコマンドでチェックできる。

sudo tail -n 100 /var/log/cups/error_log



2015年1月8日木曜日

Emacs org-modeのちょっと便利な関数

Emacs advent calender用に書いたのですが、エントリーするの遅れて更新してなかった記事です。さてorg−modeですがこのブログを書くのに利用したり何かメモするのに使ったりしてます。で、たくさんありすぎて困るorg-modeの機能ですが僕はよく使う機能はカーソルの位置によっていくつかの機能を切り分けて実行する関数を書いてひとつのキーで利用しています。今回はその便利関数の紹介です。

機能

今回紹介する関数の機能の要約は

  • カーソルがソースブロックテーブル上では、別バッファを開く
  • org-src-edit-bufferでは(上の別バッファのこと)そのバッファを閉じる
  • org-table上では折りたたまれてる内容を展開する
  • *(アスタリスク)のヘッダー行の場合,TODO,DONEなどのラベル選択を出す
  • チェックボックス(-[])ではXと無入力のトグル動作
  • link部分ではlinkの参照
  • 何もマッチしないときは、org-drawerでタンス作成

ちょっと機能がてんこもりで形容するのが難しいので、名前はorg-dwimとしました。(ちなみに DWIM はDo What I Meanの略らしい)

以下がコードです。適当にあなたの.emacsとかに貼りつけてください。(gist版もあるよ)

(defun org-dwim ()
"My convinience function for `org-mode'."
(interactive)
(cond
((org-in-block-p '("src"))
(org-edit-special))
((org-src-edit-buffer-p)
(org-edit-src-exit))
((org-table-p)
(org-table-edit-field 4))
((org-on-heading-p)
(org-todo))
((org-at-item-checkbox-p)
(org-toggle-checkbox))
((and org-return-follows-link
(let ((tprop (get-text-property (point) 'face)))
(or (eq tprop 'org-link)
(and (listp tprop) (memq 'org-link tprop)))))
(org-open-at-point))
(t (org-insert-drawer))))

各機能の説明とこの関数の説明とかをします。

link

下のような形式でURLとそのエイリアスを書くと、そのエイリアスで表示してくれる機能がorg-modeにはありますが、カーソルがそのリンク上にあるとorg-dwimで開くことができます。

ただ、デフォルトでRETキーでリンクに飛べる。のでこの機能はカレーに入っている福神漬のようにあまり意味はありません。(じゃあいれんなよ)

[[URL][ALIAS]]




table

パイプで区切ることでorg-mode上でExcelのセルとカラムのようなことができるますが、使ってると文字がながくなってきて省略したいときがあります。

で、省略したいときは下の<N>のような書き方でNに数字を入れるとその数以上は折りたたんでくれる。

| <3> |  <4> |   <5> |
| 1=> | 12=> | 12345 |



それでorg-dwim関数はカーソルがその場所にあればこの折りたたまれた状態から展開してくれます。(僕のような、キーバインド覚えられない人はここから折りただんだテーブルを展開できなくて詰む)

src block

org-mode上で特定のプログラミング言語を埋めこむことができます。埋めこみ方は下のようにbegin_srcとend_srcで囲みます。(小文字でも大丈夫です)

#+BEGIN_SRC emacs-lisp
(message "hoge")
#+END_SRC



正式名称謎ですが、このbegin_srcとend_srcの間をソースブロックって便宜上よびますね。でこのソースブロックの中で、org-dwimを呼び出すと別バッファが開いてそこでそのプログラミング言語のメジャーモードで編集できます。編集が終わったら、またorg-dwim関数を呼べばもとのorg-modeのファイルへ戻れます。

注意点として、flycheckなどのシンタックスチェッカーがあると問題がある場合もあります。その場合は`(org-src-edit-buffer-p)`関数で場合わけする必要があります。

checkbox

org-modeには以下のような感じで書くチェックボックス機能があります。

- [ ] Todo
- [X] Done


しかしながら、C-c C-x C-bというcheck boxをon, offするキーバインドが覚えられなかったので、今回のorg-dwimに追加しました。

Drawers

org-mode manualみてたらこんな機能があった。

Names of drawers.  Drawers are not opened by cycling on the headline above.
Drawers only open with a TAB on the drawer line itself.



Drawerってタンスって意味らしい、説明のとおりシフト+tabで折り畳み展開を繰り返してもタンスの中身までは展開されない。どれくらい有用かよくわかっていないけどデフォルトの関数がなかったので追加してみた。

書き方

:RESULTS:
たんす
:END:





おわり

あまりorg-mode使いこなせてるわけではありませんが、デフォルトのキーバインド覚えるよりはいくぶんましかと思います。よかったら使ってみてください。

Popular Posts

Blogger templates

Blogger news