LoginSignup
56
52

More than 5 years have passed since last update.

zshのViモードをインターフェイスとして利用してみる

Last updated at Posted at 2013-12-21

ViとEmacs

zshでは、ViEmacsのキーバインドを利用できます。

私は普段、Emacsのキーバインドを使っています。

確かに、Viのノーマルモードは、非常に有効です。

その理由は、コーディングにおいては、繰り返し処理、一括処理をする場面が多く、複雑な処理をコマンド一発で実行することが多いからです。

しかし、僅か1行の短文などを編集する場合は、ノーマルモードの利点を上手く生かせないと考えています。

このような場合までノーマルモードに移行するのは、面倒です。

そんなこともあり、私は、基本 Emacs のキーバインドを使っています。

しかし、せっかく Vi のノーマルモードが用意されているのだから、よく使う外部ツールを操作するためのインターフェイスとして利用してみてはどうかと考えました。

ということで、今回は、zshのViモードを外部アプリのインターフェイスとして利用する方法を提案をしてみたいと思います。

Vi modeをプロンプトに表示する

まず、現在はノーマルモードかインサートモードかを判断できるようプロンプトに表示してみます。

~/.zshrc
function zle-line-init zle-keymap-select {
    VIM_NORMAL="%K{208}%F{black}⮀%k%f%K{208}%F{white} % NORMAL %k%f%K{black}%F{208}⮀%k%f"
    VIM_INSERT="%K{075}%F{black}⮀%k%f%K{075}%F{white} % INSERT %k%f%K{black}%F{075}⮀%k%f"
    RPS1="${${KEYMAP/vicmd/$VIM_NORMAL}/(main|viins)/$VIM_INSERT}"
    RPS2=$RPS1
    zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select

参考:
http://hamberg.no/erlend/posts/2010-10-17-show-current-vi-mode-in-zsh-prompt.html

これを設定ファイルに書くと、現在の Vi mode がプロンプトに表示されます。

ちなみに、カラーは、256色で指定しています。カラーを確認したい場合は、以下のコマンドを実行してください。

for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo

参考:
http://qiita.com/k_ui/items/b02b93e3af13023c0bfd

ノーマルモードに移行するキーを変更する

通常は、Escまたは、C-]かと思いますが、jjで移行できるようにしてみます。ちなみに、インサートモードに戻るには、iです。

これにより、ノーマルモードに移行しやすくなります。

~/.zshrc
bindkey -M viins 'jj' vi-cmd-mode

Chromeを操作するインターフェイスとして利用してみる

私は、ターミナルの次に、ブラウザをよく使いますので、vi-modeをChromeを操作するインターフェイスとして使ってみることにしました。

ノーマルモードのキーバインドを定義するには、bindkey -aを使います。

例えば、「bindkey -a 'a' vi-forward-word」みたいな感じです。

GitHubに上げましたので、試したい方は、ダウンロードしてください。

ただし、例のごとくApple scriptを利用していますので、利用者出来る人はかなり限定されています。iTerm2Chromeが必要です。

https://github.com/syui/airchrome.zsh

$ sudo port install gauche

$ git clone https://github.com/syui/airchrome.zsh

$ cd !$:t

$ echo "source $PWD/!$:t" >> ~/.zshrc

テーマ-themeallに変更し、-chrome onを使います。

キー 効果
j 下にスクロール
k 上にスクロール
h 戻る
l 進む
t タブを閉じる
f f{2文字}
b 続けてキー{Enter,Esc,Delete,Shift}を押す

j,kでスクロール。h,lで前と次へ。

ViChrome入れている人などは、fを押すと、f-modeが起動します。f-modeは、続けて二文字を入力することでコマンドが完了するように設定しました。

二文字判定の処理は、こちらの記事で紹介したスクリプトを利用しています。

$ sudo port install gauche

EnterEscなどの一部キーは、bに続いて押すことで、実行されます。例えば、b{Enter}などです。

ただし、パソコンによっては、キーコードが異なることが予想されるため、この部分は、個人環境によって書き直す必要があります。ここでは、Aの部分です。

chrome_button.sh
case "$button" in

    "A")
echo "
tell application \"Google Chrome\"
    activate
    tell application \"System Events\"
        delay 0.1
        keystroke return
        tell application \"iterm\"
            activate
        end tell
    end tell
end tell
" | osascript -
;;

それぞれのキーを判別するには、cscroll.zshに入っているスクリプトを使い以下のコマンドを実行しましょう。

$ gosh read-single-char.gosh |col -bx| tr -d ''

ちなみに、iTerm2のウィンドウの透過度を設定するには、以下の様なShell scriptを使います。引数で透過度を指定します。

iterm2_transparency.sh
#!/bin/sh
echo "
tell application \"iTerm\"
    activate
    tell current session of current terminal
      set transparency to $1
    end tell
end tell
" | osascript -
$ chmod +x iterm2_transparency.sh

$ ./iterm2_transparency.sh 0.3

あと、クリップボードにある文字列を送るキーや入力モードを追加すると、便利な気がしています。

追記

だいぶ変更されました。

http://qiita.com/syui/items/ff4205a00a6b46c8f21e

56
52
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
52