koturnの日記

普通の人です.ブログ上のコードはコピペ自由です.

WindowsのコマンドプロンプトでVimを使う

私はWindowsユーザであり、WindowsでもVimを使う。
しかし、WindowsのコマンドプロンプトVimを使うのは、どうにも不便だと感じていた。
というのも、コマンドプロンプトのサイズの変更が面倒だからであろう。

しかし、
set lines
set columns
で値を指定すれば、コマンドプロンプトVim内部から、コマンドプロンプトのウィンドウサイズを変更することができる。
Vimを終了すると、元のサイズに戻る。

これを利用して、ウィンドウの最大化のトグルコマンドを定義してみる。
ついでに、GUI用のウィンドウの最大化のトグルコマンドも定義しておいた。
また、一般的なアプリケーションにおいて、F11やがウィンドウ最大化のトグルキーなので、キーバインドを当てておくことにしよう。

augroup MyAutoCmd
  autocmd!
augroup END

if has('win16') || has('win32') || has('win64')
  command! FullSize call s:full_size()

  if !has('gui_runnig')
    if has('vim_starting')
      let s:is_fullsize = 0
      let s:lines   = 0
      let s:columns = 0
      let s:x_pos   = ''
      let s:y_pos   = ''
    endif
    autocmd MyAutoCmd VimLeave *
          \   if s:is_fullsize
          \ |   exec 'winpos' . s:x_pos . s:y_pos
          \ | endif
    function! s:full_size()
      if s:is_fullsize
        exec 'winpos' . s:x_pos . s:y_pos
        let &lines   = s:lines
        let &columns = s:columns
        let s:is_fullsize = 0
      else
        let s:lines   = &lines
        let s:columns = &columns
        let s:wstrlst = split(s:get_winpos_strs(), ',')
        let s:x_pos   = s:wstrlst[0][2:]
        let s:y_pos   = s:wstrlst[1][2:]
        winpos -8 -8
        set lines=999 columns=999
        let s:is_fullsize = 1
      endif
    endfunction
    function! s:get_winpos_strs()
      let l:wstr = ''
      redir => l:wstr
      silent! winpos
      redir END
      let l:wstr = substitute(l:wstr, '[\r\n]', '', 'g')
      return l:wstr[17:]
    endfunction

  else
    if has('vim_starting')
      let s:is_fullsize = 0
    endif
    function! s:full_size()
      if s:is_fullsize
        simalt ~r | let s:is_fullsize = 0
      else
        simalt ~x | let s:is_fullsize = 1
      endif
    endfunction
  endif
  noremap  <silent> <F11>   :<C-u>FullSize<CR>
  noremap! <silent> <F11>   <Esc>:FullSize<CR>
  noremap  <silent> <M-F11> :<C-u>FullSize<CR>
  noremap! <silent> <M-F11> <Esc>:FullSize<CR>
endif

CUI用の設定としては、linesとcolumnsの値や、引数無しのwinposコマンドでウィンドウ位置を取得して、それを記憶している。(getwinposx()関数とgetwinposy()関数でウィンドウ位置は取得できないが、winposコマンドでは取得可能である)
GUI用の設定としては、元々備わっている最大化と元に戻すメニューコマンドを用いているだけである。

あまり多くの場合を想定して書いたわけではないので、うまく動作しないこともあるかもしれない。


まぁ、しかし、わざわざWindowsのコマンドプロンプト上でVimを動かすのは、たとえ最大化が楽だとしても、あまりオススメできるものではないが...。(画面描画が遅いので、やや不快感がある)
やはり、Windowsにおいては、gVimか、Cygwinのmintty上でVimを使うべきだろう。