Skip to content

Vi (Vim) 編集モード

B̅ edited this page Dec 28, 2019 · 14 revisions
💬 日本語English

1. vi/Vim編集モードを有効にする

次の方法の内一つを用いてvi/Vim編集モードを有効にして下さい。

inputrc設定

~/.inputrc

$if Bash

  set editing-mode vi

$endif

~/.bashrc内でset -o viを用いる

他の方法として,set -o vi~/.bashrc内で記述するというのもあります。

if [[ $- == *i* ]]; then # 対話セッション内か判定
  set -o vi
fi

~/.bashrc内でbindを用いる

又は,次の設定によってもvi/Vimモードを有効にできます。

if [[ $- == *i* ]]; then # 対話セッション内か判定
  bind 'set editing-mode vi'
fi

~/.bashrc内でble.sh設定を用いる

ble.shを読み込んだ後であれば,次の設定によってもまたvi/Vimモードを有効にできます。 この設定は,これ以前の設定を全て上書きします。 つまりset -o emacsといった設定等々は全て上書きされます。

if [[ $- == *i* ]]; then # 対話セッション内か判定

  # ... ble.shを読み込んだ後で ...

  bleopt default_keymap=vi
fi

2. ESCに対する待ち時間の設定

ESCに対する総待ち時間は,端末からBashへ向かう処理中全ての待ち時間を合計したものです。 各待ち時間の設定を次に示します。

sttyにおける待ち時間

疑似端末の入力処理における待ち時間はsttyを用いて制御します。 普通,既定の待ち時間は0です。 次の指令によって待ち時間を変更できます。 指定は0.1秒単位です。

# ~/.bashrc内
stty time 0

Bash-4.3における待ち時間

Bash-4.3以降においては,readline変数keyseq-timeoutによってReadlineの待ち時間を設定できます。 readline変数はファイル~/.inputrcにおいて指定できます。 指定はミリ秒単位です。

# ~/.inputrc内
$if Bash
  set keyseq-timeout 1
$endif

~/.inputrc内で指定する代わりに,~/.bashrc内でも次の指令を用いてreadline変数の値を変更できます。

# ~/.bashrc内
bind 'set keyseq-timeout 1'

GNU Screenにおける待ち時間

端末多重化装置 (terminal multiplexer) を用いている場合,その端末多重化装置にも待ち時間が設定されています。 GNU Screen用の待ち時間は,~/.screenrcにおいて次のように設定できます。 指定はミリ秒単位です。 加えて,エスケープ文字で始まるキー束縛をbindkey -tによって定義しないでください,というのも-tオプションはエスケープ文字の待ち時間を無効にしてしまうからです。

# ~/.screenrc内
maptimeout 1

Tmuxの待ち時間

Tmux向けの待ち時間は~/.tmux.confにおいて設定できます。 指定はミリ秒単位です。

# ~/.tmux.conf内
set -sg escape-time 1

3. 設定可能事項

ノーマルモードに対するモード名表示

Vi/Vimモードにおいては,-- INSERT --(挿入モードに対して)~(ノーマルモードに対して)といったモード名が表示されます。 keymap_vi_nmap_nameオプションによって,ノーマルモードに対するモード名を変更できます。

bleopt keymap_vi_nmap_name:=$'\e[1m-- NORMAL --\e[m'

ノーマルモードにおいてモード名を表示したくない場合,前の代わりに次のように設定して下さい。

bleopt keymap_vi_nmap_name:=

各モードに対するカーソル形状

各モードに移行した際に送られる制御シーケンスをterm_vi_?mapbleopt変数で指定できます。 例えば,DECSCUSRに幾らか対応している端末を使用している場合,次のように設定することでモード毎にカーソル形状が切り替わるようにできます。

bleopt keymap_vi_nmap_cursor:=2
bleopt keymap_vi_imap_cursor:=5
bleopt keymap_vi_omap_cursor:=4
bleopt keymap_vi_xmap_cursor:=2
bleopt keymap_vi_cmap_cursor:=0

端末がSs要素に実際は対応している場合(terminfoには表示されません),次のようにしてble.shの端末情報を直接に書き換えられます。

_ble_term_Ss=$'\e[@1 q'

【挿入モード】SP: 多機能空白 / 空白を挿入する

SPへは既定でmagic-spaceが割り当てられており,空白を挿入する前に履歴展開が実行されます。 履歴展開なしに単に空白を挿入したい場合は,次の設定を追加してください。

ble-bind -m vi_imap -f 'SP' 'self-insert'

【挿入モード】C-k: 前方行削除 / ダイグラフ

C-kは既定でkill-forward-lineに割り当てられています。 <C-k>{文字1}{文字2}のようにダイグラフを入力したい場合は,次の設定を追加してください。

ble-bind -m vi_imap -f 'C-k' 'vi_imap/insert-digraph'

【挿入モード】C-o: 単コマンドモード / 実行・後次

C-oは既定でvi_imap/single-command-modeに割り当てられています。 C-oを押下することで現在の指令行を実行し,次の履歴項目を読み込みたい場合,次の設定を追加してください。

ble-bind -m vi_imap -f 'C-o' 'accept-and-next'

あるいは,C-oの替わりにC-@accept-and-nextに束縛するほうがいいかも知れません。

ble-bind -m vi_imap -f 'C-@' 'accept-and-next'

surround.vim

ble.shの機能は一部github.com:tpope/vim-surroundに由来しています。 surround.vim由来の機能を用いるにはble.shを読み込んだ後に次行を追加します。

source "$_ble_base/lib/vim-surround.sh"

現在,ys, yss, yS, ySS, cs, ds, vS, vgSにのみ対応しています。

vim-surround.sh実装では, bleopt変数と共に用いることで,yscsの束縛に対する括弧の種類を変更できます。 設定例を次に示します。

bleopt vim_surround_45:=$'$( \r )' # ysiw-に対して
bleopt vim_surround_61:=$'$(( \r ))' # ysiw=に対して
bleopt vim_surround_q:=\' # ysiwqに対して
bleopt vim_surround_Q:=\" # ysiwQに対して

vim_surround_〈数字〉形式のble設定変数によって,〔ysiw等に続く〕十進記数された〈数字〉番号のUnicode文字として束縛できます。 vim_surround_〈英字〉形式のble設定変数によって,〔ysiw等に続く〕〈英字〉文字として束縛できます。 値にCR(Bashスクリプト中では$'\r')が含まれる場合,当値は最初に出現するCRを境に二分割され, それぞれが左右の囲み文字に用いられます。

Clone this wiki locally