« [N810]NOKIA N810のキーボードカスタマイズ | Main | [Mac OS X]単3電池1本で動くGPSロガー HOLUX m-241をMac OS Xで使う »

2008.01.24

[N810]NOKIA N810上のEmacsでクリップボードを扱う

NOKIA N810でEmacsを使うようになってまず不便に思うのは、現状のmaemo-cjkを入れた環境ではキーボードのスペシャルキーのロックが利かないこともそうですが、クリップボードとの連携ができないことです。

Linux Zaurusではyaktyさんのqcfと、namさんのqcf-copy / qcf-pasteを使っており、qcfの代わりになるコマンドを探せばよさそうです。

ZaurusではQteのクリップボード(QClipboard)でしたが、N810のOS2008の場合はGTKベースですので、GTKのクリップボードと標準入出力のブリッジを探すことになります。

しかし、これというものを見つけることができなかったので、自分で作ることにします。

Ruby-Maemoを調べた時にRuby/GTK2が含まれているのを知ったので、それでやってみました。

clip.rb

GTKのクリップボードと標準入出力のブリッジの役を果たすRubyスクリプトです。

Thomas Leeさんのブログを参考にコピペしました(それは参考とは言わない)。

#!/usr/bin/env ruby

require 'kconv'
require 'gtk2'
require 'optparse'

def get_clip()
  puts Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD).wait_for_text.toutf8
end

def set_clip()
  buf = ""
  while gets()
    buf += $_
  end
  Gtk.init
  clip = Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD)
  clip.set_text(buf.toutf8)
  clip.store
end

opts = OptionParser.new

opts.on("-g"){
  get_clip()
}

opts.on("-s"){
  set_clip()
}

opts.parse!(ARGV)

クリップボード中のテキストをRubyで処理して書き戻す、などといった使い方もできますね。

clip-copy / clip-paste

Elispの方です。namさんのものを改造しました。

;#####################
;# for clip.rb
;#####################
(global-set-key "\C-cc" 'clip-copy)
(global-set-key "\C-cv" 'clip-paste)

(defun clip-copy ()
  ;; Copy region on current buffer to clipboard on maemo.
  (interactive)
  (let ((coding-system-for-write 'utf-8))
    (message "... copy to clipboard")
    (call-process-region (region-beginning) (region-end) "clip.rb" nil nil nil "-s")
    (message "")))

(defun clip-paste ()
  ;; Paste maemo clipboard to current buffer.
  (interactive)
  (message "... paste from clipboard")
  (let ((s (point))(e))
    (let ((coding-system-for-read 'utf-8))
      (call-process "clip.rb" nil t nil "-g"))
    (setq e (point))
      (if (equal e s)
          (ding)
        )
    (message "")))

インストール

clip.rbを実行権を付けてパスの通った場所にコピーします。 僕は、clip.rbをexec-pathを通した/home/user/binに置いてます。

clip.rbの実行にはRubyとRuby/GTK2が必要ですので、以下からRuby-Maemoをインストールします。

http://maemo.org/downloads/product/OS2007/ruby-maemo/

Ruby/GTK2はRuby-Maemoに含まれています。 Ruby-Maemoとは、そういう実体があるわけでなく、複数のextensionから成る複合パッケージです。

続いて、clip-copy, clip-pasteを.emacs.elなどにコピペ。 eval-bufferするか、Emacsを再起動します。

使い方

Ctl+c cでリージョンをクリップボードに転送

Ctl+c vでカレントポイントにクリップボードからペースト

インプレと展望

Linux ZaurusでできていたことがN810でもできるようになりました。

ただ、clip.rbの実行に当たってRuby/GTK2のロードに時間がかかるので、ちょっと長めに待たされます。

Thomas LeeさんのブログにはC版のソースも載っているので、いずれ作ってみようかと思っていますが、保証の限りではありません。

#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <string.h>

int main (int argc, char **argv) {
    const char *message = "Hello, World";

    /* initialize GTK */
    gtk_init (&argc, &argv);

    /* set the clipboard text */
    gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), message, strlen(message));

    /* store the clipboard text */
    gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));

    return 0;
}

browse-urlの設定が残されてますが、コマンドラインからブラウザにURLを表示させる方法が分からない……。

ご存知の方がいらしたら教えてください。

|

« [N810]NOKIA N810のキーボードカスタマイズ | Main | [Mac OS X]単3電池1本で動くGPSロガー HOLUX m-241をMac OS Xで使う »