Rapid Express

Rapid Express

中小企業を支援するLinuxベースのWebアプリケーション開発

Rapid Express RSS Feed
 
 
 
 

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))




Leave a Reply



Tags

Links




Meta


TMAX.MYOPENSRC.COM