MacVimでKeyRemap4MacBook使って日本語入力を制御する話
入力キーを変更する方法
入力キーの設定をいじる場合、
- そのアプリ内の設定で変更する
- OS標準の設定で変更する
という2種類が基本なわけですが、
- キー入力を制御するアプリをかまして入力そのものを変化させる
という方法もあります。最後の手段は、本当に最終手段なためあまり好きではないのですが、アプリ内で設定が存在していなかったり、OS標準の設定で変更できない場合のような、にっちもさっちもいかなくなったときに便利なことがあります。MacVimでことえりの制御が難しそうだったのと、OS標準の設定は、アプリとして継承していないと。MacのOS標準の変更する場合はこちら。OS標準の方の変更は、StandardKeyBinding.dictを編集するのが面倒になってきたので、~/Library/KeyBindings/DefaultsKeyBinding.dictを作って、必要なものだけ追加するようにしました。
KeyRemap4MacBook
KeyRemap4MacBookは、入力されたキーを受け取って、それを解釈後、定義にあるキー入力に変更してくれるというもの。Aとタイプしたら、Bを押したように変更してくれるし、B, Cと複数のキーを入力したかのようにもしてくれる。また、特定のアプリ(only)によっては、Dと入力したように振り分けたり、特定のアプリ以外(not)など、割と融通がきいてくれる。他にも、キーを押し続けた際のタメと入力間隔も制御できたり、入力デバイスごとに制御できたりと、独裁者のごとく振る舞うことができます。
MacVim諸々の設定
KeyRemap4MacBookをインストールしたら、右上に四角いマークが表示されます。その「Open KeyRemap4MacBook Preferences...」を選択後、Misc & Uninstallタブに、Custum Setting --> Open private.xml があるので、そこに独自設定を入力すればいいです。private.xmlの書き方は、英語のマニュアルが分かりやすいし、Githubでも作者の方がコードを公開してるので、そこらへんを調べたらよいかと思います。
とりあえず、MacVimで日本語入力(Hiragana入力)になっているとき、escキー or Ctrl-[ をタイプしたら、ノーマルモードかつ英数入力(Romaji入力)になる設定(太字箇所)を作ってみました。
<?xml version="1.0"?>
<root>
<item>
<name>Change the Input Method Mod Shift-Ctrl-J, Shift-Ctrl-;</name>
<identifier>option.IME</identifier>
<autogen>--KeyToKey-- KeyCode::J, ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L, KeyCode::JIS_KANA</autogen>
<autogen>--KeyToKey-- KeyCode::SEMICOLON, ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L, KeyCode::JIS_EISUU</autogen>
</item>
<item>
<name>MacVim Setting</name>
<identifier>option.MacVim_Setting</identifier>
<only>VI, TERMINAL</only>
<autogen>
--KeyToKey--
KeyCode::ESCAPE, KeyCode::JIS_EISUU, KeyCode::ESCAPE
</autogen>
<autogen>
--KeyToKey--
KeyCode::BRACKET_LEFT, ModifierFlag::CONTROL_L, KeyCode::JIS_EISUU, KeyCode::ESCAPE
</autogen>
</item>
<item>
<name>Vim Keybinding on Mac OS X Mountain Lion</name>
<identifier>option.Exchange_Ctrl-[_to_ESC</identifier>
<autogen>--KeyToKey-- KeyCode::BRACKET_LEFT, ModifierFlag::CONTROL_L, KeyCode::ESCAPE</autogen>
</item>
<item>
<name>DefaultKeyBindings Emacs on Mac OS X Mountain Lion</name>
<not>VI, TERMINAL</not>
<identifier>option.DefaultKeyBindings</identifier>
<autogen>--KeyToKey-- KeyCode::B, ModifierFlag::CONTROL_L, KeyCode::CURSOR_LEFT</autogen>
<autogen>--KeyToKey-- KeyCode::N, ModifierFlag::CONTROL_L, KeyCode::CURSOR_DOWN</autogen>
<autogen>--KeyToKey-- KeyCode::P, ModifierFlag::CONTROL_L, KeyCode::CURSOR_UP</autogen>
<autogen>--KeyToKey-- KeyCode::F, ModifierFlag::CONTROL_L, KeyCode::CURSOR_RIGHT</autogen>
<autogen>--KeyToKey-- KeyCode::M, ModifierFlag::CONTROL_L, KeyCode::RETURN</autogen>
<autogen>--KeyToKey-- KeyCode::H, ModifierFlag::CONTROL_L, KeyCode::DELETE</autogen>
</item>
</root>
とりあえず、太字にした箇所が、MacVimで日本語入力がオンになっていた場合。そこだけ抜き出して上書き保存してChange KeyタブのReroadXMLボタンをクリックして読み込むと「MacVim Setting」なる何も考えてなさそうメニューが出てくるのでそこにチェック入れたら即反映されます。ほかのは、OS標準だと Ctrl-[ に :cancelOperation を設定しても、アプリ全てに反映されるというわけではないため escキーに強制的に変換してしまおう、というのとFinderとかでも、Ctrl-n, p, f, bが最低限使えるにようにしたかったのでそういう設定を追加しただけです。KeyRemap4MacBookにもオプションがあるので、そちらを使用する場合は、削除してください。本当は、hjklで移動したいのですが、他のキー押しながら移動することに抵抗があったため、Mac標準でいいや…になりました。ここら辺、このアプリのこの場所では、〜したいみたいなことができないため、不便ですね。
注意事項
アプリで設定できることは極力アプリで設定した方がいいです。また、<only>, <not>がありますが、そのキー入力を完全に変えてしまうものなので、KeyRemap4MacBookでの設定は必要最低限にすべきです。アプリで、〜 is not working! な状態になった場合は、ここの設定が影響している可能性をまず疑いましょう。
htmlファイル、MacVimときどきSafari
htmlファイルをMacVimで編集しながらSafariで確認しつつ作業をすすめるには、どうしたらいいんだろうと思ったので少し調べてみた。
nnoremap <leader>] :!open -a Safari %<CR><CR> 追記(2012/12/14) これは間違い!
これでファイル(%)編集中に、ノーマルモードで \] とタイプするとSafariで表示されるようになります。\] にしたのは、キーが近かったというだけなので、たいした意味はないです。一番後ろの<CR>は、<CR>が1つだとPress ENTER or Type command to continue が表示されるから。Safariの箇所を、firefoxとかchromeとかにすればいいです。
以上、解散!
余談: tyruさんのopen-browser.vimを入れているので、
let g:openbrowser_open_commands=["open -a Safari"] 追記(2012/12/14) これも間違い!
とした後に、:OpenBrowser % とかでどうにかなるかと思ったのだけど、テスト段階のuriで .htmlをMacVimに関連付けていたらMacVimで開いてしまったりuriの処理が面倒そうなため諦めました。
mattnさんのzencoding-vimが大活躍。
■追記 2012/12/14
tyruさんからコメントをいただき、twitterでも教えていただきました。
まず、open-browserで自分自身を開く場合は、:OpenBrowser %で開けます。ただし、通常は何も設定していないとg:openbrowser_open_vim_commandにvsplitが設定されていてVimで開いてしまうため、
let g:openbrowser_open_filepath_in_vim = 0
を設定して、vimで開かないようにする必要があります。次に、.htmlをMacVimに関連付けて設定すると、openだけではMacVimで開いてしまう(何もアクションが起きない)ため、
let g:openbrowser_open_rules = {'open' : 'open -a Safari {shellescape(uri)}&'}
を設定しました。g:openbrowser_open_rulesで、open -a Safariとするとのが、正しいやり方のようです。ここらへんの使い方がよく分からなったので参考にどうそ。というわけで、tyruさんにほとんど教えてもらったものを総合すると、
let g:openbrowser_open_filepath_in_vim = 0
let g:openbrowser_open_rules = {'open' : 'open -a Safari {shellescape(uri)}&'} nnoremap[ :silent OpenBrowser %
このようになります。
tyruさんありがとうございました!
Mac Tips その9 〜Safari6 アドレスバー表示辞めました〜
■結論
色々試した結果、Safariはアドレスバーを含むツールバーの非表示
- View > Hide Toolbar (Option+Cmd+T)
- View > Hide Bookmarksbar (Shift+Cmd+B)
- View > Hide Tab bar (Shift+Cmd+T)
に至ったのですが、なぜそこに至ったかを書いてみたいと思います。
■発生した問題点
- Empty Pageで検索するとアドレスバーにカーソルのフォーカスが残る
これに尽きます。なぜこれが問題かというと、Mac Tips その6で取り上げたブラウザでの検索方法の設定で楽になってもまだ若干面倒くさいからです。
たとえば、「遅れてきた人によるメモ」をカーソルで選択して Shift+Cmd+.(ドット) で検索すると、Empty Pageに検索語句が渡されて検索されるらしく、そうなるとなぜかアドレスバーにカーソルのフォーカスが残ります。たとえば「1画面移動するSpaceバーがすぐ押せない!」ってことになりとても不便です。
※Shift+Cmd+.はMac Tips その6で設定したショートカットキー
私の場合、vimlike-onsafariを入れてjkjkしてるため、もっと切実だったりします。
■押してだめなら引いてみろ
最初は押して解決しようというわけで、アドレスバーにカーソルがあった場合、どうやってウインドウにカーソルを持っていくかを考えていたのですが、Tabキーでの移動だとウインドウ内にテキストボックスがあったらそこにカーソルが移ってしまってSpace押しても1画面移動とか、画面のリンク先になってない箇所をクリックしてアドレスバーのフォーカスを解除とか、筋の悪そうなものしかなかった。
押してだめだったので、気分転換でView(表示)欄をいじっていてアドレスバーを消すに至りました。
■ こんなんで大丈夫なの?
アドレスバーもツールバーもブックマークバーもタブバーも表示されていないSafariです。検索したいときやアドレスを入力したいときは、Cmd+Lでアドレスバーが表示されます。
しかし、ユーザーが Cmd+L をしない限りアドレスバーは表示されないため、
Shift+Cmd+. で検索してもアドレスバーにフォーカスがあたることはありません。
これで、Spaceでもjkjkでもすぐにできます。
やったね。
■余談: 非表示という考え方
最近は、携帯電話やiPadのような比較的画面が小さなものが普及して「本当に必要な表示情報とは何か?」が共通認識になり始めているかと思います。実際、私にとっては、アドレスバーを含むツールバーやブックマークバーは、志向の範囲外では非表示であっても構わないという結論に至ったわけです。表示したければ、Cmd+L, Option+Cmd+Tで表示できるし。常に表示するものこそ、真っ先にコストとして考えないといけないものだと思います。
Safariに関して分散してしまってるから1つにまとめてみようかな。
Mac Tips その8 〜Safari6 Extensions〜
■Safari6yよりSafari5の方が…
Mac Tips その6は、Safari5.1でMountain LionからはSafari6がインストールされるようになっています。基本的には拡張機能のSafari Extensionsは引き継いで使用できるのですが、Safari6では、Safari Omnibarが使えなくなりました。
需要はあると思ったので動向を見守っていたのですが進展もなく、いい加減、この不便な現状をどうにかしたいと思ったので、とりあえずSafari Extentionsから探してみることに…
■KeySearch
すんなり見つかりました代替手段。このKeySearchをインストールすると虫眼鏡ボタンが表示されます。クリックすると検索バーが出現しますが、検索にこれは使いません。
右のギア --> Setting で表示されるウインドウの[Enable KeySearch via address bar]にチェックがついていると、アドレスバーに「キーワード 検索語」とすれば検索されます。
KeySearchサイトトップのスクリーンショットには存在していないので、追加された機能だと思います。
右のギア --> Edit Keywords で、keywordが設定できます。ここで設定をします。検索タームが「@@@」であること以外は、Safari Omnibarでの設定と変わりありません。
Keywordsウインドウ左下のギアから、Import Keywordsを選択すると、コピペで導入できるらしいです。Import keywords fromでは、一番下のKeySearchを選択して下のものをペーストすると、Importできるらしい。
たとえば、上のKeywordの設定だとSafariのアドレスバーに「a common lisp」と入力すると、amazon.co.jpで「common lisp」を検索してくれます。Cmd+lを使ってアドレスバーに移動して検索。便利だね。
ただし、Safari Omnibarでは、アドレスバーに「a 」と入力したら「|Amazon.co.jp|」のように変換されるけど、SearchKeyでは現在のところそういうことは起こらず。ちょっとさびしいね。
[
{
"keyword": "default",
"name": "default",
"url": "http://search.yahoo.co.jp/search?p=@@@&ei=UTF-8",
"enabled": true,
"shortcut": ""
},
{
"keyword": "r",
"name": "reddit",
"url": "http://www.reddit.com/search?q=@@@",
"enabled": true,
"shortcut": ""
},
{
"keyword": "wiki",
"name": "Wikipedia",
"url": "http://en.wikipedia.org/w/index.php?search=@@@",
"enabled": true,
"shortcut": ""
},
{
"enabled": true,
"keyword": "ac",
"name": "Amazon.com",
"url": "http://www.amazon.com/s/field-keywords=@@@",
"shortcut": ""
},
{
"enabled": true,
"keyword": "t",
"name": "Twitter Realtime",
"url": "http://realtime.search.yahoo.co.jp/search?&p=@@@&ei=UTF-8",
"shortcut": ""
},
{
"enabled": true,
"keyword": "a",
"name": "Amazon.co.jp",
"url": "http://www.amazon.co.jp/s/field-keywords=@@@",
"shortcut": ""
},
{
"enabled": true,
"keyword": "h",
"name": "HyperSpec",
"url": "http://www.lispworks.com/cgi-bin/search.cgi?q=@@@&cmd=Search%21&t=-D--HB-",
"shortcut": ""
}
]
■余談
Keywordsウインドウ左下のギアで、「Import Keywords」でも「Export Keywords」でもない箇所をクリックしてしまうと真っ白なウインドウが表示されてしまうバグに遭遇。そんなときは、Cmd+,で環境設定表示してExtensionsタブのKeySearchにある「Enable KeySearch」のチェックを一度外してつけ直すと元に戻ります。
Mac Tips その7 〜多重ウインドウめぐり〜
どうもMacだとブラウザでは、新規に開くときタブよりも新規ウインドウの方が好きです。そうなるとウインドウの移動ショートカットを考えないといけなくなるので、今更ながら重い腰をあげて調べてみました。
環境設定 > Keyboard Shortcutsタブ > Keyboard &Text Input項目 > Move focus to next window
これが該当項目らしい。
*初期設定だとCmd+F1が設定されています。
ファンクションキーって使えないよねー というわけで、Ctrl+Tにしちゃいました。
これは、別にSafariに限ったことではなくFinderとか知らない間に多重ウインドウになってしまっているものでも使用可能。理由は特にないです。単にタブっぽい気分になりたかっただけです。
[余談]ちなみにCtrl+Tは、Macでは文字入力の際、カーソル左1つ隣と2つ隣の文字を入れ替えます。おそらく、単語入力で「as」を「sa」とうってしまった後にでも使ったりするのでしょう。日本語では出番なさそうですね。
Safari6バグ in Mountain Lion
Safari6で使いにくくなりました。
そして、Downloadの表示増殖するバグが発生します…
タブを使用せずに別ウインドウでダウンロードをすると、
前のウインドウで増殖バグが発生。
Version 6.0 (8536.25)
■追記 2012.09.02
どうやら直ったらしい
Mac Tips その6 〜Safari Extensions他〜
こんにちは
このはてなブログというサービスはMacのSafariではまともに書けない悲しい仕様だったため未だに怖くて、この文章はFirefoxを使っているのですがSafariを使う方が何かと便利なのでいつもはSafariを使用しています。使っていると不満も出てきます。たとえば、「えっ、この広告でてくるのウザすぎ!」や「最近ネットのトラフィックとか心配だわー」みたいなお茶の間なものから、「Vimとブラウザ」みたいな哲学的なものまで。私はまだVimでTwitterする程度しか訓練されていない軟弱者のためSafariを使うわけです。こういう疑問が出てきたときは先人の教えに従うのがベターでしょう。
■ショートカットで調べもの
辞書だったら、カーソルあわせてCmd-Ctrl-Dなわけですが、調べたい単語をSafariで検索するとき、どうしていますか?
私は色反転させてショートカットキーを使ってます。環境設定[キーボード]の[キーボードショートカット]の[サービス]にある[検索]に、その問題のショートカットキーがある。「Search with Yahoo!」とあるのはYahoo!をデフォルトにしてるから(GoogleだったらGoogleと表示される)。おそらく、デフォルトでは「Shift-Cmd-L」になっているはず。で、何が問題かというとSafari 5から追加された機能のリーディングリストにそのショートカットキーが奪われてしまって機能しなくなってるわけです。というわけで「Shift-Cmd-.(ドット)」にしました。これだと右手だけで気軽に検索できます。
Safari以外を色反転しても使えることが多いので、この機能が使えるからSafariを使っていると言ってもいいかもしれません。
■vimlike-onsafari
SafariをVimっぽく使うためのExtention。なので、矢印移動のhjklが使える。リンク先にキーバインドが書かれているので詳細はそちらで。[normal]モード(通常)でfか/を押すと、リンクがある箇所の左上に文字が表示されます。「D」と表示されている場所だったら、dとタイプしたらフォーカスがあたるので、returnを押すとリンク先に移動する。ちなみにリンク先にはないのだけど、Cmd-Returnだと新しい窓で表示される("F"の後にReturnでも別窓になるらしい)。文字を表示したけど画面をC-dで下に半分スクロールしたい場合とかは、fや/で表示したリンク先の文字はSpaceで非表示になります。他には、ggで一番上に移動するのとGで一番下に移動するのを覚えておけば大丈夫だとおもいます。
このブログでfでリンク先を表示してdで選択した際のキャプチャ
[追記] このExtensionは、Flash内での文字入力や普通のテキスト入力でも機能がOFFにならないことがあります。入力時にタイプした文字を拾ってしまうのですが、そういうときのための[useonline]モードがあるみたいです。これは、Shift-Escとタイプすると[normal]モードから移行します。Vimでいうところの[insert]モードでしょうか。
[さらに追記] "r"で更新、"d"でブラウザを閉じる、これに独自定義(KeyBindingsEditor使用のCtrl-mにinsertNewline: 改行のこと)が便利です。Safariでは、タブがFlashとかのプラグインの読み込みのためには表示しないといけないらしく(経験的勘)不便なので、使っていません。ここらへんどうにかなってたらうれしいんだけどな。タブ移動でJKJKできるから。
AdBlockは表示されるページから不必要なものを非表示にするExtension。別に広告を非表示にするだけではなく、このサイトのこのカラム邪魔じゃん…っていうときとかにも使える。条件にマッチした要らない子を非表示にしてしまうすぐれもの。ただし、前処理をするため、やり過ぎると表示が遅くなってしまうため注意が必要。OptionsでFilter ListにあるJapanese filtersを選択していれば、
これが、
こうなる。
ほかには、「Facebookとか何それ?」なので、
[Block on ad on this page]を選択して該当するところをクリックしたら、
つまみが出てくるので、広げて表示に問題がなければ[Looks good]します。
このブログで例を作ろうと思ったのだけど全然面白くなかったので、普段見ないサイトで作成。
■Do Not Track Plus
Do Not Track Plusでは、「トラッキングって怖いわよねー、でも実際のところどうなってるの?」が視覚的に分かるようになります。ためしに、自分のブログを見ると
こんな感じにブロックしたものと数が表示されます。
別のサイトを見ると、
まあ、しがらみのように色んなものがでてくるわけです。これ自体は、ブロックすることは可能であっても非表示することはできないのでAdBlockとの合わせ技が必要になります。
■Awesome Screenshot
Awesome Screenshotは、このTipsを書こうと思い立って、ブラウザのスクリーンショットを撮るのが意外と面倒そうだったので探したExtension。使い方は、簡単なので紹介のみ。ちなみに、vimlike-onsafariで使用した画像はこのExtensionで加工したものです。
2013.10.13追記
画像をマウスオーバーすると「See Similar」と出てきていい加減鬱陶しくなったので調べてみたら、Awesome Screenshotに「Enable similar product search powered by Superfish」というチェックボックスがあった。このチェックを外せば出てこなくなるはず。そろそろ、さよならした方がいいのかな。
おまけ
■Safari Omnibar (Safari6には非対応!)
Safari Omnibar Safari 5.2以降は検索欄がなくなるらしいと聞いて。アドレスボックスの表示される履歴が荒れるのを嫌って検索ボックス派でしたが、設定で"alc test"でalcで検索できるとか"a Common Lisp"でamazon.co.jpで検索とか便利すぎたので、最近導入しました。
- Yahoo! Japan y http://search.yahoo.co.jp/search?p={searchTerm}&ei=UTF-8
- Amazon.co.jp a http://www.amazon.co.jp/s/field-keywords={searchTerms}
- Amazon.com ac http://www.amazon.com/s/field-keywords={searchTerms}
- Twitter Realtime t http://realtime.search.yahoo.co.jp/search?&p={searchTerms}&ei=UTF-8
- alc alc http://eow.alc.co.jp/search?q={searchTerms}
- HyperSpec h http://www.lispworks.com/cgi-bin/search.cgi?q={searchTerms}&cmd=Search%21&t=-D--HB-
とりあえず、まだまだ周回遅れな感じがするけど仕方ない。