From a Far East Island

2009-02-03

[][]ri-emacs.rbがRuby1.9で動作しないので作者にメールしてみた。

Ruby1.9正式版リリースおめでとうございます!!

というわけで、早速いろいろ試していると、emacs上でRIを表示するri-emacsが上手く動作しない様子。

調べてみると、lispからri-emacs.rbを実行している箇所でSyntax Errorが。

> /opt/local/lib/ruby1.9/site_ruby/ri-emacs.rb:97: syntax error, unexpected ':', expecting keyword_then or ',' or ';' or '\n'
>                               when ?.: nil
>                                       ^
> /opt/local/lib/ruby1.9/site_ruby/ri-emacs.rb:119: warning: else without rescue is useless
> /opt/local/lib/ruby1.9/site_ruby/ri-emacs.rb:236: syntax error, unexpected keyword_end, expecting $end

このエラー、Ruby1.8だと発生しない。

ri-emacs.rbの97行目、Case文のwhen で'then' ではなく':'を使用しているのが原因と判明。

(Ruby1.8までは':'と書けたのね、知らなかった。)

早速作者のKristof氏にメールした見たら、

> I'll change it soon.

との返事をもらいました。

すぐにでも使いたい人は、97, 98, 99 行目のwhenの':'を'then'に置き換えると実行できるようになるはずです。

Check it out!!

2008-12-29

[][]js2-modeでyasnippet

yasnippetスニペットフォルダにjs2-modeというフォルダを追加して、その下にスニペットを追加してみたんだが動かない。試しに手動で yas/minor-modeにしてみると、追加したスニペットの展開が行われるようになった。単純に js2-mode と yas/minor-mode の関連付けがうまく行っていない様子。

少し調べてみたら、解決策が見つかった。

Google Code Archive - Long-term storage for Google Code Project Hosting.より

Why YASnippet doesn't work in some modes?

Try: M-x yas/minor-mode-on.

- If it still doesn't work. Try to ask for help in the discussion group or report a bug.

- If it works. Add the mode-hook to yas/extra-mode-hooks.

YASnippet is enabled when yas/minor-mode is turned on. after-change-major-mode-hook is used to turn on yas/minor-mode in every mode. However, some modes (which doesn't follow the convention, like ruby-mode) just don't call this hook. So we need to explicitly hook into them:


(add-to-list 'yas/extra-mode-hooks

'ruby-mode-hook)


Note you should put this code after (require 'yasnippet) but before (yas/initialize).

You can report the modes that don't work to the discussion group. I'll include them in yas/extra-mode-hooks in later version when I see your report.

なので、.emacs の(require 'yasnippet)の後、(yas/initialize)の前へ以下の行を追加する事で、関連付けが行われるようになった。

;; js2-mode へのyas/minor-mode の関連づけ
(add-to-list 'yas/extra-mode-hooks
             'js2-mode-hook)

2008-12-09

[]exuberant ctagsをインストールした。

ctags日本語対応版から日本語版ソースコードを入手。

以下を参考にインストールした。

Because: MacOS Xでexuberant ctags(VimのTagExplorer用)

$ ./configure
$ make
$ su
Password:
# make install

とすると、/usr/local/binにctagsができる。

使い方は、EmacsでJavaScriptソースを快適に読むために:js2-modeとエグズーベラントCtags - 檜山正幸のキマイラ飼育記を参照。

[][] inferior JavaScript mode を発見した。

Rubyのirbと同じ使い勝手でRhinoをあれこれ試せないかとネットを探しまわっていた所、emacs inferior mode for JavaScriptBryan Kyle’s Blogで発見した。

これまさに、期待していた通りの動作をしてくれる。それもそのはず、ruby の inferior ruby mode をそのままハックしたlispモジュールなのだ。

これを動作させるためには、事前にjs2-modeのインストールが必要。

js2-modeに関しては、今日たまたま上のエントリーで参照したEmacsでJavaScriptソースを快適に読むために:js2-modeとエグズーベラントCtags - 檜山正幸のキマイラ飼育記が詳しい。

inferior JavaScript mode のインストール方法は、Bryan Kyle氏のブログのページ一番下 "download inf-js.el" から github へ飛んで、inf-js.el をload-pathの通った場所へダウンロード。

そして、以下を.emacsファイルに記述する。

(autoload 'run-js "inf-js" nil t)
(autoload 'inf-js-keys "inf-js" nil)
(add-hook 'js2-mode-hook
          '(lambda ()
             (inf-js-keys)))

これで、M-x run-js で inferior JavaScript mode を実行する事が出来るようになる。

ブログには、Rhino だけでなく、他のJavaScript処理系でも使えると書いてある。js-program-nameの値を書きかえると良いらしい。

ついでに、昔取った杵柄ではないが、ruby-modeが使いにくいので改造(その2) - From a Far East Island で inferior ruby mode の使い勝手を、自分の手に会うように機能追加するlispを書いた事が有る。これをそのまま inferior JavaScript mode でも使えるようにlispを書き変えてみた。

 ;; inferior javascript mode customize
(defun js-send-exp ()
  "Send a line to the inferior javascript process.
Cursol must be at the end of the line of the oneliner"
  (interactive)
  (let ((beginning
	 (save-excursion
	   (js2-beginning-of-defun)
	   (point))))
    (js-send-region beginning (point)))
  (scroll-down-ijs))

(defun scroll-down-ijs ()
  (interactive)
  (setq curbuf (current-buffer))
  (if (get-buffer js-buffer)
      (pop-to-buffer js-buffer)
      (error "No current process buffer. See variable js-buffer."))
  (end-of-buffer)
  (pop-to-buffer curbuf))

(add-hook 'js2-mode-hook
	  '(lambda ()
	     (define-key js2-mode-map "\C-x\C-e" 'js-send-exp)))

要点は以下の3つ。

  • lisp inetractino mode のように、C-x C-e で、ワンライナーも関数定義もどちらも評価できる
  • 評価後、inferior JavaScript buffer を一番下までスクロールダウンして、評価結果が画面内に残るようにした後、もとの編集中のjavascript buffer にフォーカスを戻す
  • inferior JavaScript buffer が表示されていない状態でもJavaScript の評価を行うと同時に、inferior JavaScript buffer を表示し、評価結果を見れるようにする。

関数を評価したいときは、関数定義の最後の '}' の後で、ワンライナーを評価したいときは、行末の';' の後で、C-x C-e とすると評価できる。

ワンライナーの先頭と、関数定義の開始位置の特定には、js2-mode の関数 js2-beginning-of-defun を使用しているので、JavaScript の buffer の任意の場所で、

M-x   js2-beginning-of-defun

とする事で、評価範囲を調べる事が出来る。評価範囲は、js2-beginning-of-defun で移動した場所から、カーソル位置まで評価するようにしてある。(ので、関数の途中でC-x C-e とすると、inferior JavaScript buffer が '}' 待ちの状態になってしまう。)

2007-12-02

[] emacsでspread sheet

Table mode思った以上に便利だ。

http://www.hit.ac.jp/~wachi/misc/tablemode.html

マカーでexcel持ってないから助かる。

2007-11-13

[]el関係のメモ

rails.el をインストールした。後で使い方チェック。

http://d.hatena.ne.jp/higepon/20061222/1166774270

Anything.elがアツいらしい。後でチェック

http://d.hatena.ne.jp/rubikitch/20070725#1186048100

Gaucheでテスト支援。higepon氏曰く、やばいらしい。後でチェック

http://d.hatena.ne.jp/higepon/20071108/1194495171

.emacsがすごいらしい。後でチェック

http://d.hatena.ne.jp/khiker/20061223/1166866865

まさに、興奮覚めやらぬとはこの事か。