.emacsまとめ(1)の続きです。
今回は環境固有の話が出てくるので、話の前提としてまずはそこを整理。
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))))
各種プログラミング系モードではタイプするそばからリアルタイムにインデントされていく挙動が好みなので、 「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)))
同期を実現するに辺り、ホストからゲストへテキストを渡すにはPutty上で「貼り付け」すればよいとして、問題はゲストからホストへの渡し方です。
方式としては
あたりが考えられますが、ここでは3を採用することにします。*1
この場合使えそうなものとしてvmware-toolsとvmwがありますが、前者はコマンドライン向けのインターフェースが用意されておらず、 後者もx64非対応なので、というか残念なことに配布元の仮想な背中(WebArchive)がiswebサービス中止に伴い不通になっておりいつまでアクセスできるか分からないという問題があります。
このため、vmwをベースに自作したものを使います。
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ゲストがアクティブなタブ上で開かれていないと同期が行われないので注意してください。
Putty上でEmacsを使う場合、利用できるキーが制限されるためwindmove-default-keybindings(Shift+矢印キーによるバッファ移動)などが使えません。
これも回避する方式が複数考えられて、
などがありますが、すでに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があわせて欲しかったので。