Emacsの最近のブログ記事

追記: 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は書けてるっぽい。

以前mapaeを使って書いた記事があったのですが、使い勝手などもろもろが自分のスタイルに合わず、結局使わなくなってしまってました。

で、しばらく熱が冷めていたのですが、やっぱりemacsでブログ投稿したいなーと思い別のソフトを探していたら、先日BloggerPostという別のemacsフロントエンドをみつけたので、早速インストールして使ってみたらいいかんじなのでご紹介。

このBloggerPostは、el4rというRubyでelispを書いてしまおうというソフトを使ったソフト(?)で、AtompubとXML-RPCに対応しています。

で、まず最初に言っておきたいのが、自分も勘違いしていたのはBloggerPostを導入する以前に書いた記事も読み込んで編集とかできるのかなーと思ってたのですが、それは現状できないようです。なので、このBloggperPost経由で書いた記事のみをローカルのディスクに保存して、それであれば編集などもできるという代物です。(最初これがわからず、なんで今まで書いた記事が読み込めねーんだよと小一時間悩みました)

ということで、インストール時のハマりポイントとかをいくつか書いておきます。

  1. ハマりポイントその1:関連するQDBMのrubyバインディングを忘れずにインストールしよう

    BloggerPostはQDBMでデータを保存しておくらしいのですが、そのrubyバインディングはQDBMを普通にインストールしても入りません。QDBMのソースのrubyディレクトリの中で./configure && make && make install をしましょう。

  2. ハマりポイントその2:rdtoolをインストールしよう

    自分の環境ではどうしても投稿ができなくて悩んでデバッグログ(M-x el4r-show-logで見られる)を見ていたらrd2コマンドがないよーって言ってたので気付きました。このrd2はrdtoolに含まれるコマンドのようです。


  3. ハマりポイントその3:設定ファイル

    BloggerPostのページだとあまり詳しくは書いてないところもあったりするので、試行錯誤で自分は以下のようにconfig.ymlを書いています。

    「account:」と「blog: -> list:」の両方に「name:」ってのがあってこんがらがりそうなのですが、「account: -> name:」は「blog: -> list: -> account:」に指定するためのもので、「blog: -> list: -> name:」は「blog: -> default:」などで指定するために使うもののようです。あと、mtなどのXML-RPCの場合は「apiurl:」と「blogid:」が必要で、livedoor BlogのようなAtompubの場合は「posturl:」があればよいようです。このAtompubの「posturl:」はlivedoor Blogであれば、以下のような「http://cms.blog.livedoor.com/atom/blog_id=YOUR_BLOG_ID」でいいのですが、それ以外のサービスとかだと、自分でマニュアルを見るかエンドポイントを叩いて確認しなきゃならないかもしれません。

    defaultstyle: bhtml
    account:
      - name: mt_account
        user: your_username
        passwd: your_password
      - name: livedoor_account
        user: your_livedoor_id
        passwd: your_livedoor_password
    blog:
      default: mt
      list:
        - name: mt
          title: "Your blog title"
          url: http://blog.example.com/
          service: mt
          account: mt_account
          apiurl: http://blog.example.com/mt-xmlrpc.cgi
          blogid: 1
        - name: livedoor
          title: "Your livedoor blog title"
          url: http://blog.livedoor.jp/your_livedoor_id/
          service: livedoor
          account: livedoor_account
          posturl: http://cms.blog.livedoor.com/atom/blog_id=YOUR_BLOG_ID
    

という感じのことを乗り越えて、このエントリをポストしてます。上記以外のインストールについてはそれぞれのページの方法でいけると思います。

まだ、使い始めたばっかりなので使い倒してないのですが、使用感としてはおおむねよさげです。ちなみに機能としては普通にポストする以外にもflickrやAmazonと連携することもできるっぽいです。

あと最後に、el4rのエラーってmini bufferにちょろっと「Error raised in Ruby」とか出るだけなので最初どうやってデバッグするねんと悩んだのですが、途中にも書きましたが「M-x el4r-show-log」とすればバックトレースが見られるようですので、printデバッグもできます。

yaml-mode 0.0.3をリリースしました。

変更点としては、Changesにあるようにコメントの中に「'」「"」「:」などがあった場合にfont-lockが変になって色が崩れるバグの修正がメインです。また、その他にも細かいいくつかの修正をしています。

ダウンロードは下記からどうぞ。
http://yaml-mode.clouder.jp/

入門GNU Emacs
入門GNU Emacs
posted with amazlet on 07.01.27
デボラ キャメロン エリック レイモンド ビル ローゼンブラッド Debra Cameron Eric Raymond Bill Rosenblatt 福崎 俊博
オライリー・ジャパン
売り上げランキング: 179527


GNU Emacs拡張ガイド―Emacs Lispプログラミング

ボブ グリックステイン Bob Glickstein 榎並 嗣智
オライリー・ジャパン
売り上げランキング: 381645
kill-summary.el という emacs のモジュールがあるんですが、それをひさびさに入れてみた。

そしたら、動かなかったので調べたら emacs22 では truncate-string ってファンクションがなくなっている。もっと調べたら、emacs22 では truncate-string-to-width という関数になっているっぽい(?)

そこで kill-summary.el の truncate-string の部分を truncate-string-to-width に変えたら動くようになった。ただ、まだあまり使い込んでないので他の部分でエラることはあるかも。patch は以下。
--- kill-summary.el.old       2006-09-01 15:09:50.482637000 +0900
+++ kill-summary.el   2006-09-01 15:06:10.152637000 +0900
@@ -231,7 +231,7 @@
           ()
         (setq kill-summary-list (append kill-summary-list (list n)))
         (insert (format "%2d:%s %s\n" n lines
-                        (truncate-string
+                        (truncate-string-to-width
                          (mapconcat (lambda (y) y) strtmp
                                     kill-summary-newline-notation) w)))
         (setq prev str)

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja