Emacsの最近のブログ記事

最近Androidの開発をしていまして、例にもれずEclipseが体に合わないため(というかEmacsが好きなため?)、Emacsで開発をしています。

しかし、いままでJavaで本格的に開発したことなかったのでEmacsにおけるJavaの開発環境がまったく整備されていないので、EmacsでもうちょっとJavaの開発がしやすくする便利なモードないのかなと調べてみました。

いろいろ調べてみたら、JDEE − Java Development Environment for Emacsってのがあったのですがなんかごてごてしていて、そんなモリモリの機能いらないんだよなぁと思っていたら「ajc-java-complete」っていうのをみつけました。

ajc-java-completeは名前の通りauto-completeやyasnippetと連携して補完することをメインにしたものになっていて、今も開発が継続しているようでなかなかよさげ。ということでさっそくインストールしてみました。

  • auto-complete のインストール

    http://cx4a.org/software/auto-complete/ からダウンロードしてきて、この辺を参考にインストール。

    .emacsに以下のような設定をしておくとよいでしょう。
    (require 'auto-complete)
    (global-auto-complete-mode t)
    (define-key ac-complete-mode-map "\C-n" 'ac-next)
    (define-key ac-complete-mode-map "\C-p" 'ac-previous)

  • yasnippet のインストール

    http://code.google.com/p/yasnippet/ からダウンロードしてきて、この辺を参考にインストール。

    .emacsに以下のような設定をしておくとよいでしょう($PATH_TO_SNIPPETはsnippetをインストールしたディレクトリね)。
    (require 'yasnippet-bundle)
    (yas/initialize)
    (yas/load-directory "$PATH_TO_SNIPPET/snippets")

  • ajc-java-complete のインストール

    https://github.com/jixiuf/ajc-java-completeからcloneしてきて、この辺を参考にajc-java-complete自体をインストール。

    なお、ajc-java-completeは、auto-completeに付属するpopup.elにパッチをあてないといけないらしく、ajc-java-completeのパッケージに付随するpopup.elを、すでにインストールしたauto-completeのpopup.elと入れ替える必要があります。

    あと、Javaのクラスを補完させるためにタグファイルを生成する必要があります。そのためのJavaのプログラムが添付されているので、それを以下のようにjavacでコンパイルしてから実行する必要があります。
    % javac Tags.java
    % env CLASSPATH=$PATH_TO_ANDROID_HOME/platforms/android-11/android.jar:/System/Library/Frameworks/JavaVM.framework/Classes/classes.jar:. java Tags

    この例ではAndroid開発もしたいのでAndroidのSDKのパッケージも含めています。
    (なお、classes.jarのパスはMac OS X用なので適宜自分の環境に合わせて変えてください)

    んで、最後に.emacsに以下のように書きます。
    (require 'ajc-java-complete-config)
    (add-hook 'java-mode-hook 'ajc-java-complete-mode)

以上でインストールが完了しました。

あとはEmacsを起動してFoo.javaとかやってみると補完がきくようになります。

補完以外の機能で言うと、「C-c i」でインポートしていないものを自動でインポートして(ファイルの上部に「import com.example.foo;」って挿入して)くれたり、クラス名のところにカーソルをもってきて「C-c m」とやるとそのクラスをインポートしてくれたりするものがあります。(ただし、なぜかextendsの後に書いたクラスはインポートしてくれず...)

ちなみに、さきほど補完用にタグファイルを生成したのですが、あれがけっこうな容量になっていて、それを起動時に読み込むため、初回のみですがちょっと時間がかかるようです。これ直したいとajc-java-completeをいまいじってるところです。なにかいい案があったらまたお知らせします。(っていうかpull requestしたい)

それともう1つ、自分はMac OS XのEmacsでインポート機能を使うとダイアログがウィンドウで出てうざい(のとEmacs自体が固まったりする)ので以下のパッチをあててます。
--- old/ajc-java-complete.el	2011-07-08 00:00:28.000000000 +0900
+++ new/ajc-java-complete.el	2011-07-08 00:00:12.000000000 +0900
@@ -938,7 +938,8 @@
 before that it will use y-or-n-p ask user to confirm "
   (let ((import-class-buffer "*ajc-import-java-class*")
         (import-class-window) (user-confirmed-class-items-list)
-        (java-buffer (current-buffer))(java-window))
+        (java-buffer (current-buffer))(java-window)
+        (last-nonmenu-event t))
     (setq case-fold-search nil)
     (if (and import-class-items-list (> (length import-class-items-list) 0))
         (progn
emacsでTAGSを使ってるんですが、環境によっては参照先のファイルがfoo.el.gzってなってたりするとfind-tagしたときに見られないようです。

そんなときは、.emacsに下記のようにしてあらかじめjka-comprという圧縮ファイルを操作するライブラリをロードしておくと見られるようになります。
(load "jka-compr")
ちなみにemacsは、このようにloadをしなくてもgzip圧縮されたファイルを開くときは勝手にjka-comprを使ってるようです。

Yaml-mode 0.0.7 is now released.
This release include following bugfix:
* Fixed bug for 5th level's indentation becomes TAB character.
  See YAML spec 1.2 section 5.5. White Space Characters (ochko)
For additional information, please visit issues on github:
http://github.com/yoshiki/yaml-mode/issues/closed#issue/1
追記: githubにリポジトリを作りました。

#soozy@freenodeでidコールされてて、なにかと思ったらText::MicroTemplateのEmacsのメジャーモードがあったらいいねーみたいな話しだったのでてきとうにでっちあげてみた。

そしたらすぐにimakado先生が問題あるところを修正をしてくれました。

imakado++

まだT::MTのパッケージには入れてないですがgithubのリポジトリの権限はもらったので問題なさそうだったら入れさせて頂こうかと思います。

名前はIRCですでに呼ばれてたtmt-modeにしてみた。

emacs lispを書いててふと思ったんだけど、Perl moduleのmake testみたいなことをやる機構ってあるのかな。

絶対あると思うから
あとで探してみよう。

MacでEmacsを使うときは、Carbon Emacsを使ったりTerminal.appで使ったりしてるんですが、Carbon EmacsではCmd-vでPage Upできるのに、Terminal.appのEmacsだとそれができなかったのです。

これを直すには2つやらなきゃならないことがあって今回それをやったのでメモっておく。

1つは、KeyRemap4MacBookでTerminal.appのときだけ左Commandを左Optionにする(詳しくはこちら)。もう1つは、Terminal.appの設定で「メタキーとして option キーを使用」にチェックを入れる。

この2つを設定すると、やっとTerminal.appのEmacsでCmd-vでPage Upすることができるようになります。

教訓:
設定をよくみろ。

ということでtypesterさん、ご協力ありがとうございました。

#左のCommandキーが使えなくなったので、しばらくは間違えてコピペ
#しちゃいそうだけどそれは徐々に慣れるだろう…。

emacserの間で密かなブームとなっているyasnippet.elをインストールしてみました。
実はsnippet的なものを使うのは初めてだったので、ちょっと細かく覚える意味も含めてインストール方法から書いてみます。

インストール方法は簡単で、2つ方法があります。横着は人は上記ページの「yasnippet-bundle-0.3.1.el.tgz」をダウンロードしてきて、解凍してできたyasnippet-bundle.elを適当なディレクトリ(例えば$HOME/.emacs.d/plugins/とか)に置いて、以下のように設定します。
(add-to-list 'load-path "~/.emacs.d/plugins")
(require 'yasnippet-bundle)
このyasnippet-bundleってやつは、各種言語用(など)のsnippetの設定もlispの中に同梱しているようです。まさに横着用。でも自分で書き変えたりできない(まぁ、できるけど)。

そこで、もう1つの方法があります。先程のページからyasnippet-0.3.1.tar.bz2ってのをダウンロードしてくるとyasnippet.elとsnippetsというディレクトリが解凍されます。このsnipettsというディレクトリに、yasnippet-bundle.elで同梱されていたsnippetの設定が入っています。

でインストールですが、この場合もさきほどと同じようにyasnippet.elを$HOME/.emacs.d/plugins/に、snippetsディレクトリを例えば$HOME/.emacs.d/に置いておき、
(add-to-list 'load-path "~/.emacs.d/plugins")
(require 'yasnippet)
(yas/initialize)
(yas/load-directory "~/.emacs.d/snippets")
こんな感じで設定してやると、yasnippetが動くようになります。

とりあえずemacsを立ち上げて、おもむろにhoge.plを新規作成します。
そして「if」と書いた直後にTABキーを押してみましょう。
if () {
    
}
こんな感じに補完ができたら成功!ちょっと感動します。それ以外にもいろいろとできるようですが、どんな文字列で補完が効くかは、snippetsディレクトリの中のファイルを探してみてください。該当するメジャーモードの名前のディレクトリにあるファイル名が補完を発動する名前になってます。上記でifが補完されたのは、snippets/text-mode/perl-mode/if があるからですね。それ以外にもxifとかもありますね。これは、
expression if condition
って補完されますね。なるほど、なるほど。で、「expression」の「e」にカーソルがあるので、そこでなにかを書き初めると「expression」が消えてくれます。で書き終ったあとにTABキーを押すと、カーソルが「condition」の「c」に移動してくれます。ここでまたifの条件を書こうとすると「condition」が消えてくれます。なるほどぉ。こういうことか。

でも1ついやんなところがあって、1つのsnippetを発動させるとそのsnippetのすべての入力欄をTABキーで移動して書き終わらないと次のsnippetが発動しないような挙動になってるようです。また、そのsnippetをすべて書き終わる前にその部分を消去してしまうと、それ以降のsnippetが発動しないっぽい。でもなにかの弾みで発動したり…。どんな条件でリセットされてるのかよくわかりませんでした。

ということで、慣れればすごい使い易いんだろうなーと思いつつしばらく使い続けてみたいと思います。

なお、Codereposでもsnippetの共有が始まってますので興味のある方はそちらもご覧になってみてください。

関連記事:
http://d.hatena.ne.jp/rubikitch/20080316/1205609867
http://d.hatena.ne.jp/a666666/20080318/1205804830
http://d.hatena.ne.jp/antipop/20080314/1205517419

最近MacBook Airを購入しました。

もともとマカーだったので懐しくもあるんですが、Tigerの初期ぐらいまでしか使ってなかったので、だいぶ浦島太郎状態なわけです。でもそれがまたよかったりもするんですが。

で、今回の話は以前したBloggerpostをmacにいれる手順です。

まずは、MacPorts。MacにはMacPortsっていうパッケージシステムがあって、昔自分が使ってたときはfinkってのを使ってたんですが、最近はMacPortsが流行りだと同僚に言われそれをインストールしました。
そのあとに、おやくそくのRubyからemacsをごにょごにょできるel4rをインストール。
次に、MacPortsでqdbmをインストール。で、BloggerpostではqdbmのRubyバインディングであるdepotを入れるのですが、普通にMacPortsで入れるとRubyが入ってしまうので、qdbmのライブラリだけ使ってdepotを入れなければなりませんでした。

普通にldconfigみたいなのがあれば/opt/local/lib(MacPortsでは/opt以下にいろいろなものをインストールしてメインシステムへの汚染を避けている)を読み込ませればいいんですが、それがないのでどうしたものかと調べていたら、

% setenv LIBRARY_PATH /opt/local/lib

とやってから、./configure && make && make install したらmakeできました。

あとは以前紹介した設定をすれば問題なくemacsからブログへ投稿ができるようになります。
この記事もBloggerPostを使ってポストしている次第です。

ところで最近のMacはPerlとかRubyとか標準で入ってるけどMacPortsでも入れられます。
どっちを使ったらいいのか迷うところなんだけど、どっちがいいんですかね?

BloggerPostでXML-RPCでPostするときに出るエラーを修正したpatchを置いておきます。

対象はREL-0.1.7のタグのものです。

diff -ur lib.old/bloggerpost/service.rb lib/bloggerpost/service.rb
--- lib.old/bloggerpost/service.rb	2008-02-22 12:55:26.000000000 +0900
+++ lib/bloggerpost/service.rb	2008-02-22 22:18:11.000000000 +0900
@@ -1,3 +1,5 @@
+require "xmlrpc/client"
+
 module BloggerPost
   class Service
     def initialize(config)
@@ -132,12 +134,13 @@
         entry.updated = DateTime.now
         entry.date = entry.updated unless entry.date
         return
-      elsif method == 'new' || entry.blog.service.atom_at_put
+      elsif (method == 'new' || entry.blog.service.atom_at_put) && response_body !~ /^\n*$/
         published, updated, url, edit_id = parse_atom(response_body)
       else
         published = entry.date.to_s
         url = entry.url
         edit_id = entry.edit_id
+        updated = DateTime.now.strftime('%Y-%m-%d %H:%M:%S')
       end
       entry.update_url(url)
       entry.edit_id = edit_id if edit_id
@@ -258,6 +261,7 @@
   end
 
   class XMLRPCAPI
+    include BloggerPost::Common
     def initialize(config)
       @config = config
     end
@@ -340,7 +344,7 @@
       if @config.use_proxy
         proxy_host, proxy_port, proxy_user, proxy_passwd = get_proxy_info(config, use_ssl)
       end
-      XMLRPC::Client.new(url.host, url.path, url.port, proxy_host, proxy_port, proxy_user, proxy_passwd, use_ssl)
+      XMLRPC::Client.new(url.host, url.path, url.port, proxy_host, proxy_port, proxy_user, proxy_passwd, use_ssl, 360)
     end
   end
 end

先程のエントリのBloggerPostを使ってみてるんだけど、どうもAtompub使った時の挙動が微妙。

あとエラったときなにがエラったのかがわかりづらいのでデバッグしづらい。いや、これはel4r側のあれか。いくつか不具合っぽいのは直したんだけど、きりがないのでまた時間ができたらやる。

とりあえずMTは書けてるっぽい。

検索

広告

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.12