EmacsのVZ化計画 Ver.0.12
Lips文献をネットで探してたら、vzelというものがあることに気づきました。まあ、そりゃそうでしょうね。VZの全盛期から15年は経ってるんですから。
これからvzelを調べてみよう……(泣)
この数日間はナンダッタノカ
でも、自分でEmacsのオリジナル仕様を調べたので、リージョンやらナローイングの概念が理解できたのは良かった。
せっかく機能を追加したので貼っておきます。
VZの特徴的な ^L 機能だけど、取り合えず複写目的での取得に限定され、検索には使用できません。
Emacsではカット&ペーストのテキストスタック、文字削除系のアンドゥバッファ、検索文字列バッファの区別がつかないので、私のVZもどきはすべてをyankバッファを使いまわしてるので、微妙に違和感があります。
vzelはちゃんと区別してるんだろうか……
Ver.0.12の変更点
- C-l (^L) による文字列の取得、C-k C-a (^KA) への選択文字列の複写
- C-q C-p (^QP) をマーク位置のヒストリジャンプにした
;Emacsオリジナルキーのバックアップ (setq Meta-Original (make-sparse-keymap)) (global-set-key "\C-o" Meta-Original) (define-key Meta-Original "\C-b" 'backward-char) (define-key Meta-Original "\C-c" 'mode-specific-map) (define-key Meta-Original "\C-d" 'delete-char) (define-key Meta-Original "\C-e" 'end-line) (define-key Meta-Original "\C-f" 'forward-char) (define-key Meta-Original "\C-g" 'keyboard-quit) (define-key Meta-Original "\C-h" help-map) (define-key Meta-Original "\C-k" 'kill-line) (define-key Meta-Original "\C-p" 'previous-line) (define-key Meta-Original "\C-q" 'quoted-insert) (define-key Meta-Original "\C-r" 'search-backward) (define-key Meta-Original "\C-s" 'search-forward) (define-key Meta-Original "\C-t" 'transpose-chars) (define-key Meta-Original "\C-u" 'universal-argument) (define-key Meta-Original "\C-v" 'scroll-up) (define-key Meta-Original "\C-x" ctl-x-map) (define-key Meta-Original "\C-y" 'yank) (define-key Meta-Original "\C-z" 'suspend-emacs) ;ファイルメニュー (setq MSWin-Alt-File (make-sparse-keymap)) (global-set-key "\M-f" MSWin-Alt-File) (define-key MSWin-Alt-File "o" 'find-file) (define-key MSWin-Alt-File "s" 'save-buffer) (define-key MSWin-Alt-File "i" 'insert-file) (define-key MSWin-Alt-File "a" 'write-file) (define-key MSWin-Alt-File "x" 'save-buffers-kill-emacs) (define-key MSWin-Alt-File "c" 'kill-buffer) (define-key MSWin-Alt-File "u" 'revert-buffer) (define-key MSWin-Alt-File "e" 'suspend-emacs) ; VZキー定義 ; C-[ を定義すると制御キーが使用不能 ; C-@ を検索モード中断にする試みはNG ; C-_ はC-\ と区別できない (global-set-key "\C-a" 'backward-word) (global-set-key "\C-b" 'set-mark-command) (global-set-key "\C-c" 'scroll-up) (global-set-key "\C-d" 'forward-char) (global-set-key "\C-e" 'previous-line) (global-set-key "\C-f" 'vz-forward-word) (global-set-key "\C-g" 'delete-char) (global-set-key "\C-h" 'delete-backward-char) (global-set-key "\C-i" 'tab-to-tab-stop) (global-set-key "\C-j" 'vz-yank) (global-set-key "\C-l" 'vz-get-word) (global-set-key "\C-m" 'newline-and-indent) (global-set-key "\C-n" 'vz-insert-line) (global-set-key "\C-p" 'quoted-insert) (global-set-key "\C-r" 'scroll-down) (global-set-key "\C-s" 'backward-char) (global-set-key "\C-t" 'vz-kill-word) (global-set-key "\C-u" 'advertised-undo) (global-set-key "\C-v" 'overwrite-mode) (global-set-key "\C-w" 'vz-roll-down) (global-set-key "\C-x" 'next-line) (global-set-key "\C-y" 'vz-kill-line) (global-set-key "\C-z" 'vz-roll-up) (global-set-key "\C-\\" 'vz-kbd-macro) (global-set-key "\C-@" 'keyboard-quit) (setq VZ-Ctrl-Q (make-sparse-keymap)) (global-set-key "\C-q" VZ-Ctrl-Q) (define-key VZ-Ctrl-Q "\C-a" 'replace-string) (define-key VZ-Ctrl-Q "a" 'replace-regexp) (define-key VZ-Ctrl-Q "\C-b" 'exchange-point-and-mark) (define-key VZ-Ctrl-Q "\C-c" 'end-of-buffer) (define-key VZ-Ctrl-Q "\C-d" 'end-of-line) (define-key VZ-Ctrl-Q "\C-e" 'vz-beginning-of-window) (define-key VZ-Ctrl-Q "\C-f" 'isearch-forward) (define-key VZ-Ctrl-Q "\C-j" 'goto-line) (define-key VZ-Ctrl-Q "\C-k" 'vz-jump-brace) (define-key VZ-Ctrl-Q "\C-l" 'advertised-undo) (define-key VZ-Ctrl-Q "\C-m" 'set-mark-command) (define-key VZ-Ctrl-Q "\C-h" 'vz-backward-kill-word) (define-key VZ-Ctrl-Q "\C-p" 'vz-pop-mark) (define-key VZ-Ctrl-Q "\C-r" 'beginning-of-buffer) (define-key VZ-Ctrl-Q "\C-s" 'beginning-of-line) (define-key VZ-Ctrl-Q "\C-t" 'backward-kill-sentence) (define-key VZ-Ctrl-Q "\C-u" 'upcase-regio) (define-key VZ-Ctrl-Q "\C-x" 'vz-end-of-window) (define-key VZ-Ctrl-Q "\C-y" 'kill-line) (define-key VZ-Ctrl-Q "\C-[" 'end-of-line) (define-key VZ-Ctrl-Q "\C-]" 'beginning-of-line) (setq VZ-Ctrl-K (make-sparse-keymap)) (global-set-key "\C-k" VZ-Ctrl-K) (define-key VZ-Ctrl-K "\C-a" 'vz-yank-pop) (define-key VZ-Ctrl-K "\C-b" 'vz-narrow-to-region) (define-key VZ-Ctrl-K "\C-c" 'yank) (define-key VZ-Ctrl-K "\C-d" 'duplicate-line) (define-key VZ-Ctrl-K "\C-k" 'copy-region-as-kill) (define-key VZ-Ctrl-K "\C-s" 'vz-split-window) (define-key VZ-Ctrl-K "s" 'delete-window) (define-key VZ-Ctrl-K "\C-t" 'switch-to-buffer) (define-key VZ-Ctrl-K "\C-w" 'other-window) (define-key VZ-Ctrl-K "w" 'vz-switch-window) (define-key VZ-Ctrl-K "\C-y" 'kill-region) (define-key VZ-Ctrl-K "\C-\\" 'start-kbd-macro) ; VZキーのためのマクロ (defun vz-roll-up () "ロールアップ" (interactive) (scroll-up 2) ;(next-line 2) ; カーソルを移動(VZ本来) ) (defun vz-roll-down () "ロールダウン" (interactive) (scroll-down 2) ;(previous-line 2) ; カーソルを移動(VZ本来) ) (defun vz-insert-line() "行の挿入" (interactive) (beginning-of-line) (open-line 1)) (defun vz-forward-word() "次の語へ" (interactive) (if (or (= (following-char) 9) (= (following-char) 32)) (forward-word 1) (forward-word 2)) (backward-word 1)) (defun vz-kill-word() "一語削除" (interactive) (if (or (= (following-char) 9) (= (following-char) 32)) (while (or (= (following-char) 9) (= (following-char) 32)) (delete-char 1)) (if (< (following-char) 32) (progn (delete-char 1) (delete-horizontal-space)) (kill-word 1)))) (defun vz-backward-kill-word() "一語前削除" (interactive) (if (or (= (preceding-char) 9) (= (preceding-char) 32)) (while (or (= (preceding-char) 9) (= (preceding-char) 32)) (delete-backward-char 1)) (backward-kill-word 1))) (defun vz-yank() "テキストスタックのポップ" (interactive) (yank) (rotate-yank-pointer 1)) (defun vz-get-word () "文字列の取得" (interactive) (let (c) (save-excursion (setq c (point)) (if (string= last-command "vz-get-word") (forward-char (length (current-kill 0)))) (forward-word 1) (copy-region-as-kill c (point)) (message "%s" (current-kill 0))))) (defun vz-yank-pop () "文字列の選択複写" (interactive) (if (or (string= last-command "yank") (string= last-command "yank-pop")) (yank-pop 1) (yank))) (defun vz-kill-line() "1行削除" (interactive) (setq kill-whole-line t) (beginning-of-line) (kill-line) (setq kill-whole-line nil)) (defun duplicate-line (n) "行の二重化" (interactive "p") (setq n (if n (max n 1) 1)) (let (beg end) (save-excursion (beginning-of-line) (setq beg (point)) (end-of-line) (setq end (point)) (while (> n 0) (setq n (1- n)) (insert "\n") (insert (buffer-substring beg end)))))) (defun vz-jump-brace() "対応括弧へジャンプ" (interactive) (let (c p) (setq c (following-char)) (setq p (preceding-char)) (if (or (eq c 40) (eq c 123) (eq c 91)) (forward-sexp 1) (if (or (eq p 41) (eq p 125) (eq p 93)) (backward-sexp 1) (up-list -1))))) (defun vz-kbd-macro() "マクロの記録終了と再生" (interactive) (if defining-kbd-macro (end-kbd-macro) (call-last-kbd-macro))) (defun vz-beginning-of-window() "画面の上端へ" (interactive) (let (c) (setq c (current-column)) (goto-char (window-start)) (move-to-column c))) (defun vz-end-of-window() "画面の下端へ" (interactive) (let (c) (setq c (current-column)) (goto-char (- (window-end) 1)) (move-to-column c))) (defun vz-split-window () "画面の分割" (interactive) (if (> (window-width) (* (window-height) 2)) (split-window-horizontally) (split-window-vertically))) (defun vz-switch-window () "画面の入れ替え" (interactive) (let (ww bb ss w0 b0 s0) (setq ww (get-largest-window)) (setq bb (window-buffer ww)) (setq ss (window-start ww)) (setq w0 (selected-window)) (setq b0 (window-buffer)) (setq s0 (window-start w0)) (set-window-buffer w0 bb) (set-window-start w0 ss) (select-window ww) (switch-to-buffer b0) (set-window-start ww s0) )) (defun vz-narrow-to-region () "ナローイング" (interactive) (if (= (point-max) (1+ (buffer-size))) (progn (if (< (point) (mark-marker)) (narrow-to-region (point) (mark-marker)) (narrow-to-region (mark-marker) (point))) (beginning-of-buffer)) (widen))) (defun vz-pop-mark () "マークのヒストリジャンプ" (interactive) (if (string= last-command "vz-pop-mark") (pop-mark)) (exchange-point-and-mark))
