2011-07-12 27 views
0

vimに単純な関数を書こうとしていますが、バッファに少数の行がある場合、特殊なキーを押した後にバッファ全体が収まるようにしています。ここで私は自動ウィンドウのサイズ変更

" get total lines of the current buffer 
function! <SID>TotalLines() 
    let n = 0 
    for line in getline(1,'$') 
     let n+=1 
    endfor 
    return n 
endfunction 

" resize the window 
function! <SID>ResizeCurrentWindow() 
    if has("gui_running") 
     let linesNumber = <SID>TotalLines() 
     if linesNumber < (&lines/2) 
      execute ':resize linesNumber' 
     endif 
    endif 
endfunction 
nnoremap <silent> <leader>rs :call <SID>ResizeCurrentWindow()<CR> 

どう思うかだけでなく、実際にResizeCurrentWindow()関数は動作しません:私は、1行の高さの窓を得ます。しかし、私が書く場合は

execute 'echo linesNumber' 

関数が働き、正しい結果を出力します。なにか提案を?最速のソリューションはありますか? おかげ

答えて

3

試してみてください。

execute ':resize ' . linesNumber 

linesNumberが可変であり、上記の行で、その値に代入されます。 .は文字列連結演算子で、文字列 ':resize'とlinesNumberの値を加算して、実行する完全なコマンドを生成します。

コードで"linesNumber"は、resizeコマンドの引数として直接渡される文字列リテラルです。

2

私は思うバックは、あなたが探しているものをしながら、私は、関数aを書いた:

fu! AutoResizeWindow(vert) "{{{ 
    if a:vert 
     let longest = max(map(range(1, line('$')), "virtcol([v:val, '$'])")) 
     exec "vertical resize " . (longest+4) 
    else 
     exec 'resize ' . line('$') 
     1 
    endif 
endfu "}}} 

私はそれを呼び出すために、これらのマッピングを使用します。

:nmap <silent> <leader>wr :call AutoResizeWindow(1)<cr> 
:nmap <silent> <leader>wR :call AutoResizeWindow(0)<cr> 

私にとってそれはです:,wrサイズ変更垂直方向には,wRがサイズ変更されます。

これが役に立ちます。

+0

ありがとうございます!私はライン( '$')ショートカットについて知らない –

関連する問題