Hack #184: MacVimでCommand-line windowを使いこなす
Posted at 2010/11/22ツイート
Hack #161: Command-line windowを使いこなす
という記事を参考に、:
キーにq:
相当の機能を割り当てた人が相当数いると思います。
しかし、この設定はMacVim上でうまく動作しません。
MacVimはGUIで動作するVimとして最も評判が悪いものですが、しかしながらMac OS X上で最も高速で動作するVimであり、泣く泣く使用し続ける方も多くいらっしゃることだと思います。(*1)
具体的にはMacVimでq:
してCommand-line windowを開いた状態で、何か一行だけの結果を出力するコマンドを実行するとします。
echo 1
ターミナルのVim、あるいはGVimでは画面下部に1と出力されたままになるのですが、MacVimのみ、何も表示されません。
echo &filetype
などが完全に使えなくなってしまいます。
解決
Command-line windowでの<Cr>キーの挙動を上書きし、(1) 一旦入力コマンドを別のところに保存し、(2) Command-line windowを閉じ、(3) 通常の:
を打鍵、(4) 先ほど入力したコマンドを展開、(5) 実行、という手順をとることにします。
前提として、Hack #161の設定 が既になされているものとします。その上で、以下のコードを~/.vimrc
に記述します。
autocmd CmdwinEnter * nnoremap <buffer><expr> <Cr> CmdwinRun()
autocmd CmdwinEnter * inoremap <buffer><expr> <Cr> CmdwinRun()
function! CmdwinRun()
let a = getline(line('.'))
return "\<Esc>\<C-c>\<C-c>:" . a . "\<Cr>"
endfunction
なお、他にもいろいろあって、最終的に著者の~/.vimrc
のCommand-line window関係の設定は以下のようになっています。
" No Command-line window by Shougo /vim-users-jp/2010/07/14/Hack-161.html {{{
nnoremap <sid>(command-line-enter) q:
xnoremap <sid>(command-line-enter) q:
nnoremap <sid>(command-line-norange) q:<C-u>
nmap : <sid>(command-line-enter)
xmap : <sid>(command-line-enter)
" I added
nnoremap q: q:<Esc>
autocmd MyAutoCmd CmdwinEnter * call s:init_cmdwin()
" MacVim is shit
autocmd CmdwinEnter * nnoremap <buffer><expr> <Cr> CmdwinRun()
autocmd CmdwinEnter * inoremap <buffer><expr> <Cr> CmdwinRun()
function! CmdwinRun()
let a = getline(line('.'))
return "\<Esc>\<C-c>\<C-c>:" . a . "\<Cr>"
endfunction
function! s:init_cmdwin()
nnoremap <buffer> q :<C-u>quit<CR>
nnoremap <buffer> <TAB> :<C-u>quit<CR>
inoremap <buffer><expr><CR> pumvisible() ? "\<C-y>\<CR>" : "\<CR>"
inoremap <buffer><expr><C-h> pumvisible() ? "\<C-y>\<C-h>" : "\<C-h>"
"inoremap <buffer><expr><BS> pumvisible() ? "\<C-y>\<C-h>" : "\<C-h>"
"I added
inoremap <buffer><expr><BS> col('.') == 1 ? "\<ESC>:quit\<CR>" : pumvisible() ? "\<C-y>\<C-h>" : "\<C-h>"
inoremap <buffer><expr>: col('.') == 1 ? "VimProcBang " : ":"
inoremap <buffer><expr> \ smartchr#one_of('~/', '\')
" Completion.
inoremap <buffer><expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
" HootSuite
inoreabbrev <buffer> c: ./core/mvc/controllers/mobile/
inoreabbrev <buffer> v: ./core/mvc/views/mobile/
startinsert!
endfunction
" }}}
MacVim固有のバグ回避コードが入っていますが、MacVim以外のVimでも正常に動作するはずです。
参考
- (*1) http://h.hatena.ne.jp/ujihisa/9234098453983077319 MacVimの恐るべき数々の罠については、後日おいおい語っていくことにしましょう。
もどる
blog comments powered by Disqus