トップ 最新 追記 RSS feed

継続にっき

2004|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|03|05|06|08|09|10|12|
2007|01|02|03|05|07|12|
2008|10|
2009|01|05|12|
2010|04|05|11|
2011|01|09|12|
2012|02|03|05|09|12|
2013|02|03|
2014|05|09|
2015|12|
2017|09|

2011-01-07 (Fri)

))) .emacsまとめ(2)

.emacsまとめ(1)の続きです。

環境について

今回は環境固有の話が出てくるので、話の前提としてまずはそこを整理。

  • VMホスト
    • OS: Windows 7 x64
    • 仮想化ソフト: VMware Workstaion 7
    • ゲスト接続方式: SSH(Putty)
  • VMゲスト
    • OS: Ubuntu 10.04 x64

ido

switch-bufferやfind-fileにはidoを使っています。

存在しないバッファ名を入力したら確認無しで新しいバッファを作成、 find-file時にF7でホームディレクトリに移動、同C-uで1つ上のディレクトリに移動(すでに入力があればそれをクリア)が出来るように設定します。

(if (not (require 'ido nil t))
    (iswitchb-mode 1)
  (ido-mode t)
  (setq ido-create-new-buffer 'always)
  (when (boundp 'confirm-nonexistent-file-or-buffer)
    (setq confirm-nonexistent-file-or-buffer nil))
  (defun ido-my-up-directory ()
    "Go up one directory level or clear text."
    (interactive)
    (if (= (length ido-text) 0)
        (ido-up-directory)
      (setq ido-exit 'refresh)
      (setq ido-text-init "")
      (setq ido-rotate-temp t)
      (exit-minibuffer)))
  (defun ido-home-directory ()
    "Change to home directory."
    (interactive)
    (ido-set-current-directory (getenv "HOME"))
    (setq ido-exit 'refresh)
    (setq ido-text-init ido-text)
    (setq ido-rotate-temp t)
    (exit-minibuffer))
  (add-hook 'ido-setup-hook
            (lambda ()
              (define-key ido-completion-map "\C-u" 'ido-my-up-directory)
              (define-key ido-completion-map [f7] 'ido-home-directory))))

ruby-mode

各種プログラミング系モードではタイプするそばからリアルタイムにインデントされていく挙動が好みなので、 「end」などを打った直後にインデントが行われるようにしています。

(defun ruby-electric-keyword-char (arg)
  (interactive "P")
  (self-insert-command (prefix-numeric-value arg))
  (when (save-excursion
          (backward-word 1)
          (jit-lock-fontify-now)
          (eq (get-text-property (point) 'face) 'font-lock-keyword-face))
    (ruby-indent-line t)))

(add-hook 'ruby-mode-hook
          (lambda ()
            (define-key ruby-mode-map "d" 'ruby-electric-keyword-char)
            (define-key ruby-mode-map "e" 'ruby-electric-keyword-char)
            (define-key ruby-mode-map "f" 'ruby-electric-keyword-char)
            (define-key ruby-mode-map "n" 'ruby-electric-keyword-char)))

VMwareホストとのkill-ringの同期

同期を実現するに辺り、ホストからゲストへテキストを渡すにはPutty上で「貼り付け」すればよいとして、問題はゲストからホストへの渡し方です。

方式としては

  1. ゲストとホストで同期用のプロセスを立ち上げておく
  2. puttyclipのようなものを使う
  3. 仮想化ソフトに実装されている同期機構を使う

あたりが考えられますが、ここでは3を採用することにします。*1

この場合使えそうなものとしてvmware-toolsとvmwがありますが、前者はコマンドライン向けのインターフェースが用意されておらず、 後者もx64非対応なので、というか残念なことに配布元の仮想な背中(WebArchive)がiswebサービス中止に伴い不通になっておりいつまでアクセスできるか分からないという問題があります。

このため、vmwをベースに自作したものを使います。

  • vmtoys
    • Ubuntu 10.04 x64で動作確認。たぶん他のx64 Linuxでも動くはず。
    • 依存ライブラリはC POSIXのみ。
    • 含まれるプログラムは以下。
      • vmcptxt: ゲストからホストへのクリップボード同期
      • vmclockd: ホストとの時刻同期用デーモン

vmcptxtをパスの通っているところに置いた後、以下を.emacs等に書けばOKです。

(setq vmcptxt-program-name "vmcptxt")
(when (locate-library vmcptxt-program-name nil exec-path)
  (defun send-to-vmcptxt (text &optional push)
    (let ((process-connection-type nil))
      (let ((proc (start-process "vmcptxt" "*Messages*" vmcptxt-program-name)))
        (process-send-string proc text)
        (process-send-eof proc))))
  (setq interprogram-cut-function 'send-to-vmcptxt))

VMware Workstaionを使っている場合、対象のVMゲストがアクティブなタブ上で開かれていないと同期が行われないので注意してください。

窓使いの憂鬱(YAMY)を使ったエスケープシーケンスの送信

Putty上でEmacsを使う場合、利用できるキーが制限されるためwindmove-default-keybindings(Shift+矢印キーによるバッファ移動)などが使えません。

これも回避する方式が複数考えられて、

  1. iceiv + puttyのプライベートキー定義のようにPutty自体に手を入れる
  2. 窓使いの憂鬱(Windows 7 x64上で使うのでYAMYで)を使って適切なエスケープシーケンスを送る

などがありますが、すでにCtrlとCapsLockのスワップのためにYAMYを使っていること、Puttyに限らず汎用的に使えることから .mayuに以下のような定義をしています。自分で使う分しか定義していないので、必要であればxterm.elを参照して定義を追加してください。

keymap CTRL_CAPS_SWAP_PUTTY
mod ctrl += E0英数
key *E0英数 = *LControl
mod ctrl -= LControl
key *LControl = *英数

mod shift += E0RShift
key *E0RShift = *LShift

key S-Up               = Esc LeftSquareBracket _1 Semicolon _2 S-a
key S-Down             = Esc LeftSquareBracket _1 Semicolon _2 S-b
key S-Right            = Esc LeftSquareBracket _1 Semicolon _2 S-c
key S-Left             = Esc LeftSquareBracket _1 Semicolon _2 S-d
key C-Up               = Esc LeftSquareBracket _1 Semicolon _5 S-a
key C-Down             = Esc LeftSquareBracket _1 Semicolon _5 S-b
key C-Right            = Esc LeftSquareBracket _1 Semicolon _5 S-c
key C-Left             = Esc LeftSquareBracket _1 Semicolon _5 S-d
key C-Tab              = Esc LeftSquareBracket _2 _7 Semicolon _5 Semicolon _9 S-CircumflexAccent
key C-Enter            = Esc LeftSquareBracket _2 _7 Semicolon _5 Semicolon _1 _3 S-CircumflexAccent
key C-Comma            = Esc LeftSquareBracket _2 _7 Semicolon _5 Semicolon _4 _4 S-CircumflexAccent
key C-FullStop         = Esc LeftSquareBracket _2 _7 Semicolon _5 Semicolon _4 _6 S-CircumflexAccent
key C-Solidus          = Esc LeftSquareBracket _2 _7 Semicolon _5 Semicolon _4 _7 S-CircumflexAccent
key C-HyphenMinus      = Esc LeftSquareBracket _2 _7 Semicolon _5 Semicolon _4 _5 S-CircumflexAccent
key C-Colon            = Esc LeftSquareBracket _2 _7 Semicolon _6 Semicolon _5 _8 S-CircumflexAccent
key C-Semicolon        = Esc LeftSquareBracket _2 _7 Semicolon _5 Semicolon _5 _9 S-CircumflexAccent
key C-S-ReverseSolidus = C-Solidus

*1 後述するvmclockdがあわせて欲しかったので。


2004|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|03|05|06|08|09|10|12|
2007|01|02|03|05|07|12|
2008|10|
2009|01|05|12|
2010|04|05|11|
2011|01|09|12|
2012|02|03|05|09|12|
2013|02|03|
2014|05|09|
2015|12|
2017|09|
トップ 最新 追記 RSS feed