Vimのコマンド定義で引数を使う方法

Brogramming with Tom
TerminalからChromeを任意キーで操作する方法を紹介します。

photo credit: ryanoshea via photopin cc


Vim Advent Calendar 2012 の244日目の記事です。


TerminalからChromeを任意キーで操作する方法



前回の続きのようなものです。前回は、基本的なコマンド定義を説明しました。今回は、TerminalからChromeを任意キーで操作する方法をテーマにして、Vimのコマンド定義に引数を使う方法を紹介したいと思います。


なお、任意のキーでChromeを操作する方法は、AppleScriptを使用しますので、Macユーザー限定です。しかし、Vimでユーザコマンドを定義する説明は、簡単なものなので、一読すればすぐに分かると思います。


AppleScript



TerminalからChromeを任意キーで操作する方法をAppleScriptで書くと、以下の様な感じでしょうか。

#!/bin/zsh

echo -n "chrome_key.sh" | pbcopy

echo "
tell application \"Google Chrome\"
    activate
    tell application \"System Events\"
        delay 0.1
        keystroke \"$1\"
        tell application \"iTerm\"
        activate
            tell application \"System Events\"
            delay 0.1
            keystroke \"v\" using {command down}
            end tell
        end tell
    end tell
end tell

" | osascript -



続けて任意のキーを指定できるように、3行目と15行目を書いています。これらは、特定の文字列(コマンド名)をコピーし、ターミナルアプリにそれを貼り付けるというものです。


これで、コマンドが実行されるたびに、コマンドが補完されるので、後は引数を入力し、Enterを押すだけになります。





Vim:ユーザコマンドを定義する



まず、上記のAppleScriptの3行目を echo -n ":ChromeKey " | pbcopyに書き換えます。


そして、 ~/.vimrcの設定ファイルに以下を追記します。

command! -nargs=1 -bar ChromeKey silent !chrome_key.sh <args>

ここで、-nargsは、引数の数。 <args>は、引数自体を表現します。


後は、以下のようにしてVimを起動してください。アクティブな Chromeのタブに任意のキーを送ります。任意のキーは、一応、 fキーを指定しています。

$ vim +":ChromeKey f"


ユーザコマンドを定義する


もう少し詳しい解説



AppleScriptを使って任意のキーをアプリに送る方法




アプリケーション名「TextEdit」を指定して、a、左矢印、b、左矢印…と押していくサンプル。




tell application "TextEdit"
    activate
    tell application "System Events"
        tell application process "TextEdit"
            delay 0.5
            keystroke "a"
            keystroke (ASCII character 28) -- 左
            delay 0.5
            keystroke "b"
            keystroke (ASCII character 28)
            delay 0.5
            keystroke "c"
            keystroke (ASCII character 28)
            delay 0.5
            keystroke "d"
            keystroke (ASCII character 28)
        end tell
    end tell
end tell



AppleScriptを使ってiTerm2にペーストする



tell application "iTerm"
  activate
  tell application "System Events"
  delay 0.1 --ショートカットを連携させる時に、ひと呼吸が必要な場合もある
  keystroke "v" using {command down} --command-V (ペースト)
  end tell
end tell


$ echo test | pbcopy && osascript iterm_paste.scpt


AppleScriptで引数を渡す方法



AppleScriptでは、以下のように引数を渡すことができます。


on run argv
    return item 1 of argv
end run



$ osascript sample.scpt hello,world



ただし、最も簡単な方法はシェルスクリプトで書くことです。


#!/bin/sh
  
echo "
tell application \"Google Chrome\"
  activate
  tell application \"System Events\"
    delay 0.5
    keystroke \"$1\"
  end tell
end tell
" | osascript -


上記は、Chromeに任意のキーを送るシェルスクリプトです。


$ ./chrome_key1.sh f


cscroll.vim



以前、サンプルのために作った cscroll.vim ですが、一応、Chromeを任意のキー操作できるようにしておきました。

NeoBundle "syui/cscroll.vim"


明日は、 @LeafCage さんです。