自动调整窗口大小

时间:2011-07-12 15:37:40

标签: vim macvim

我正在尝试在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'

功能工作并输出正确的结果。有什么建议吗?有最快的解决方案吗? 感谢

2 个答案:

答案 0 :(得分:3)

尝试:

execute ':resize ' . linesNumber

linesNumber是一个变量,在上面的行中替换它的值。 .是字符串连接运算符,添加字符串':resize'和linesNumber的值以生成要执行的完整命令。

在您的代码中,"linesNumber"是一个字符串文字,直接作为参数传递给resize命令。

答案 1 :(得分:2)

我前段时间写了一个函数,我认为你正在寻找的是什么:

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水平调整大小。

希望这有帮助。