viper-modeの使い方
viper-modeは Emacs上で動作する viのエミュレータです。
viper-modeは Emacsに標準添付されているのでどの Emacsでもすぐに使えます。
特にこだわりがなければ 「Vimpulse」を使う方が幸せになれるかもしれません。
はじめての viper-mode
vi自体の簡単な操作方法等についてはこちらにあります → 「はじめてのvi」
viper-modeの起動
M-x (Alt+x か ESC x)から toggle-viper-modeか viper-modeで起動します。
M-xはタブキーで補完可能なので適当に補完しつつ入力して下さい。
M-x viper-mode
Emacsで viper-modeが使われたことがないときは設定レベル等を訊ねてきます。
レベルは 1 に近づくほど viに近くなり、 Emacsのコマンドやスクリプトが動作しなくなります。
レベルを 5 にしていると、挿入モードでほとんどの Emacsコマンドが使用可能なのと、 設定レベルは 3-5なら問題が起きにくいようなので個人的には 5 で使用しています。
Inhibit Viper startup message? (y or n) y ;; 次回からこのメッセージを表示しない
Please, specify your level now: 5
Do you wish to make this change permanent? (y or n) y ;; 設定を保存する
設定は ~/.viperへ保存されます。
レベルを変更したい場合は直接設定も可能です。
(setq viper-expert-level 5)
起動と終了のコマンド
以降は M-x toggle-viper-mode を実行する度に viper-modeと Emacsモードを切替可能です。
起動/終了
起動
終了
M-x toggle-viper-mode
M-x viper-mode
M-x viper-go-away
* viper-mode起動中は <C-z>でカレントバッファのみ vi-stateと emacs-stateを切替可能です。
デフォルトで viper-modeを起動したい場合は .emacsに追記します。
(setq viper-inhibit-startup-message t)
(setq viper-expert-level 5)
(setq viper-mode t)
(require 'viper)
これで Emacsを起動時から viキーバインドで使用可能です。
非常用としてはこれでも何とかなりますが、vimに慣れているとビジュアルモードが無いとか結構辛いものがあるので、できれば「Vimpulse」を使用した方がよいと思います。
というのもなんなので viper-modeのカスタマイズ方法や、出来るだけ vimに近づけるようにしたスクリプトを次節にまとめてみました。
カスタマイズ
あとは .emacsか後述する「my-viper.el」に好みの設定を追加するだけです。
viper-mode固有の設定例
;; viperのエミュレーションレベル
(setq viper-expert-level 5)
;; viper起動時にメッセージを出さない
(setq viper-inhibit-startup-message t)
;; 検索の際に大文字小文字を区別しない(smartcase)
(setq viper-case-fold-search t)
;; 検索はループする
(setq viper-search-wrap-around t)
;; オートインデントをデフォルトで有効
(setq-default viper-auto-indent t)
;; インデント幅
(setq viper-shift-width tab-width)
対応しているオプションなら、コマンドモードから vimのオプション指定も有効です。
:set shiftwidth=2
キーマップ
また jkでは物理行移動、C-n、C-pでは論理行移動するには以下のようにします。
Emacs23からは行移動のデフォルトが物理行移動に変更になっているので、バージョンや Emacsのオプションによって動作が変わらないようにしておく方が良いかもしれません。
;; 物理行移動を基本にする
(define-key viper-vi-global-user-map "j" 'next-line)
(define-key viper-vi-global-user-map "k" 'previous-line)
(define-key viper-vi-global-user-map [?\C-n] 'viper-next-line)
(define-key viper-vi-global-user-map [?\C-p] 'viper-previous-line)
;; h l は行頭/行末を超えられるようにする
(define-key viper-vi-global-user-map "h" 'backward-char)
(define-key viper-vi-global-user-map "l" 'forward-char)
;; delete backspaceは文字削除
(define-key viper-vi-global-user-map [delete] 'delete-char)
(define-key viper-vi-global-user-map [backspace] 'backward-delete-char-untabify)
M-x describe-key の後にキー入力すると、そのキーに割り当てられている機能が確認できるのでそれを参考にすると良いでしょう。
M-x describe-bindingsでは全てのキーマップを参照可能です。
viper-mode関係のコマンドは、以下のファイルの define-key設定部分が参考になるかもしれません。
- /lisp/emulation/viper-keym.el
挿入モード用のマップには viper-insert-global-user-mapを使用します。
特殊キーの表記
;; Spaceキーで画面スクロール
(define-key viper-vi-global-user-map [?\ ] 'viper-scroll-screen)
;; Shift+Spaceキーで画面逆スクロール
(define-key viper-vi-global-user-map [?\S-\ ] 'viper-scroll-screen-back)
;; Shift+Returnで改行挿入
(define-key viper-vi-global-user-map [S-return] "i\r\C-[")
;; Ctrl+Returnで改行挿入
(define-key viper-vi-global-user-map [C-return] "i\C-m\C-[")
;; Ctrl+Shift+Insertでタブ挿入
(define-key viper-vi-global-user-map [C-S-insert] "i\C-v\C-i\C-[")
;; f1でヘルプ
(define-key viper-vi-global-user-map [f1] 'help-for-help)
;; C-\でキャンセル
(define-key viper-vi-global-user-map [?\C-\\] 'keyboard-escape-quit)
M- 表記でMetaキーも使えます。
本来のMetaキーがあるキーボードは少ないので、 大抵 ESC か Altで代用されています。
viper-modeでは当然 ESCが潰されますし、基本的に Metaキーはあまりマップしない方が良いんじゃないかと思います。
他のプラグインとのコンフリクトと日本語
viper-modeは Emacs自体が本来持たないノーマルモードを実装しているので、他のプラグイン等で問題が起きる事があります。
日本語関係は以下を参照してみてください。
その他、個人的に重宝しているスクリプトも役に立つかもしれません。
また次節では vimを使っている人には色々と辛い viper-modeを vimっぽくするスクリプトをまとめてみました。
viper-modeを vimっぽく
素の viper-modeでは何かと辛いのでコマンドを追加した起動用スクリプト my-viper.el を作成しました。
viper-modeに以下のコマンドを追加して、出来るだけ vimに近づくようにしています。
* 「Vimpulse」が使用できる時には Vimpulseを起動するだけでコマンドの追加は行いません。
ダウンロード
my-viper.el
redo+.el (viper-modeでの多段undo、redoには redo.elか redo+.elが必要です)
http://www11.atwiki.jp/s-irie/pages/18.html
my-viper.elの使い方
my-viper.el(できればredo+.elも)を load-pathの通った場所にコピーします。
初回は M-x (Alt+x か ESC x)から load-libraryで起動します。
M-x load-library
Load library: my-viper
以降は [M-delete] (Alt+Delete)で viper-modeと Emacsモードを切替可能です。
M-x toggle-viper-mode のようにコマンドで切替もできます。
起動/終了
起動
終了
M-x toggle-viper-mode
M-x viper-mode
M-x viper-go-away
* viper-mode起動中は <C-z>でカレントバッファのみ vi-stateと emacs-stateを切替可能です。
デフォルトで viper-modeを起動したいなら .emacsに追記します。
.emacs
;; (setq viper-mode nil)
(require 'my-viper)
redo.el redo+.elは my-viper.elが自動的に呼び出します。