Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 识别窗口_Function_Vim_Window - Fatal编程技术网

Function 识别窗口

Function 识别窗口,function,vim,window,Function,Vim,Window,我有一个函数,可以打开一个包含脚本结果的新窗口 function! MyFunc() bo new se buftype=nofile silent! exec "r! sh MyScript.sh " endfunction 我想确定这个特定的窗口,这样我就可以多次调用我的函数,每次都使用同一个窗口,而不是打开一个新窗口 差不多 if exists(myWindow) use myWindow else bo new endif 好的,我想这可能有

我有一个函数,可以打开一个包含脚本结果的新窗口

function! MyFunc()
    bo new
    se buftype=nofile
    silent! exec "r! sh MyScript.sh "
endfunction
我想确定这个特定的窗口,这样我就可以多次调用我的函数,每次都使用同一个窗口,而不是打开一个新窗口

差不多

if exists(myWindow) 
    use myWindow
else
    bo new
endif

好的,我想这可能有用。。。但是小心点,因为我不是Vim专家

首次创建窗口时,可以将其保存在全局文件中:

bo new
set buftype=nofile
let g:my_run_buffer = bufnr("%")
然后,您可以检查该缓冲区是否存在:

if bufexists(g:my_run_buffer)
    " Go to buffer
    set swb=usetab
    exec "sbuf " . g:my_run_buffer
else
    ... create it ...
endif

设置“swb=usetab”意味着当
sbuf
切换到缓冲区时,它将转到当前打开的任何窗口/选项卡(如果打开)。我不喜欢这样设置全局swb,只为一个sbuf呼叫。有谁知道更好的方法吗?

对于整个编辑过程,窗口必须是唯一的?或者,对于一个缓冲区或标签页?基本上我只想看到一个窗口。每次调用函数时,它都应该使用相同的窗口并重写内容。或者干脆销毁这个窗口并创建一个新的。那么@Owen提出的方法(使用一个全局变量来存储自定义窗口的当前状态)就是正确的。顺便说一下,您可能需要查看自定义缓冲区,而不是窗口。窗口只是缓冲区的显示框,因此不能将窗口锁定到特定缓冲区。您应该做的是用相同的自定义缓冲区(包含最近的脚本输出)重新打开窗口。此外,考虑使用预览窗口,这是为这类任务设计的。但是,如果您希望能够使用其他预览功能(ptag等),这是不可取的。这很接近,但我确实需要标识一个窗口而不是一个缓冲区。@rvabdn:但该窗口中有一个缓冲区,不是吗?@rvabdn:您可以用winnr()标识窗口编号,然后,当您要转到它时,使用winbufnr()找到可见的缓冲区,然后:sbuf到该缓冲区。但我认为这和直接去缓冲区号码是一样的,不是吗?是的,你说的对,我有点困惑,但这实际上很好。谢谢