Vim,如何滚动到命名缓冲区的底部

时间:2010-06-05 23:18:41

标签: vim scripting

我有一个vim脚本,使用以下命令将输出拆分为新窗口:

below split +view foo

我一直试图从任意缓冲区中找到一种方法滚动到 foo 的底部,或者设置一个默认显示缓冲区底线的设置。

我在vim脚本的python块中做了大部分内容。所以我有类似的东西:

python << endpython
import vim
import time
import thread
import sys

def myfunction(string,sleeptime,*args):
    outpWindow = vim.current.window
    while 1:
        outpWindow.buffer.append("BAR")
        #vim.command("SCROLL TO BOTTOM OF foo")
        time.sleep(sleeptime) #sleep for a specified amount of time.

vim.command('below split +view foo')
thread.start_new_thread(myfunction,("Thread No:1",2))
endpython

需要为 vim.command(“滚动到foo的底部”)行找到要投入的内容

2 个答案:

答案 0 :(得分:4)

我通常会记录新的缓冲区编号(let b_tgt = bufnr('%')),更准确地说是它的窗口编号。然后,在try-finally块中我记录当前窗口编号(let w_orig = bufwinnr('%')),跳转到需要执行某些操作的窗口(:exe w_tgt.' wincmd w'),执行操作(:normal! G在您的情况下),并跳回(在:finally子句中)到当前窗口(在操作的开头 - &gt; :exe w_orig.' wincmd w')。

现在,如果其他缓冲区可能已被打开或关闭,我们需要每次查找目标窗口,因为它的编号可能已更改。这是通过bufwinnr(b_tgt)完成的。

答案 1 :(得分:0)

仅作记录,我想设置另一个窗口的光标而不切换到该窗口。幸运的是,在Neovim中,有一个相当全面的API,这些函数从nvim_...开始。我在vimscript中以这种方式或多或少地解决了这个问题:

let l:bufname = "foo"
let l:lnum = getbufinfo(l:bufname)[0]['linecount']
let l:win_id = bufwinid(l:bufname)
call nvim_win_set_cursor(l:win_id, [l:lnum, 0])

当然,如果要在当前窗口上执行操作,可以只使用所有vim版本中可用的setpos()函数。