vim-users.jp

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でも正常に動作するはずです。

参考


もどる
blog comments powered by Disqus