Windows 将光标更改为Vim中BufWritePost上的另一个窗口

Windows 将光标更改为Vim中BufWritePost上的另一个窗口,windows,vim,split,Windows,Vim,Split,我有一个函数,每当调用它时,它都会分割窗口并显示一些信息,将光标放在这个新窗口中 到目前为止还不错 但是我正在实现一个自动命令,它将触发相同的函数,而且一切都很好,除了光标不会像不使用自动命令时那样更改到打开的窗口 触发此操作的行如下所示: autocmd! BufWritePost *.py call MyFunction() 正如我所说,当您手动调用:call MyFunction()但不使用自动命令时,它工作得非常好 我认为Bram提到自动命令实际上并不意味着分割窗口,甚至不意味着移动

我有一个函数,每当调用它时,它都会分割窗口并显示一些信息,将光标放在这个新窗口中

到目前为止还不错

但是我正在实现一个自动命令,它将触发相同的函数,而且一切都很好,除了光标不会像不使用自动命令时那样更改到打开的窗口

触发此操作的行如下所示:

 autocmd! BufWritePost *.py call MyFunction()
正如我所说,当您手动调用
:call MyFunction()
但不使用自动命令时,它工作得非常好

我认为Bram提到自动命令实际上并不意味着分割窗口,甚至不意味着移动光标


有没有办法解决这个问题,或者我做错了什么?

按照ZyX在对原始问题的评论中所说的,这听起来似乎是可行的:

function MyFunction()
    [ have all commands you currently have]
    [ . . . ]

    " then as last line include call to feedkeys()
    " this will stuff keystrokes into key buffer
    " and get executed after MyFunction() ends
    " remember that location will always be in 
    " original window, i.e, window that vim
    " was in when autocommand was triggered
    " so if new window is below original
    " window you could use this:

    " feedkeys call below edited to reflect ZyX's
    " improvement of \<C-\>\<C-n> to guarantee
    " we're in Normal mode before using window
    " movement key combo

    call feedkeys("\<C-\>\<C-n>\<c-w>j", 'n')

endfunction
函数MyFunction()
[拥有您当前拥有的所有命令]
[ . . . ]
“然后作为最后一行,包括对feedkeys()的调用
“这将把击键塞进键缓冲区
“并在MyFunction()结束后执行
“请记住,位置将始终处于最佳状态
“原始窗口,即vim的窗口
“在触发自动命令时处于
“因此,如果新窗口低于原始窗口
“您可以使用以下窗口:
下面的feedkeys调用经过编辑以反映ZyX的
“改进以保证
“在使用Windows之前,我们处于正常模式
“移动键组合
调用feedkeys(“\\\j”,“n”)
端功能

您是否尝试过在函数中添加
或任何您想要的移动?是的,我尝试过,我也尝试过WindowNumber。”wincmd w'和
wincmd p
。无效。看起来光标通常在自动命令内更改,但在事件完成后其位置将恢复。也许你不应该在窗口离开时关闭带有信息的窗口?一个长键,但也许使用feedkeys()填充击键可以解决自动命令后返回原始窗口的问题?参见
:h feedkeys
@Herbert Sitz。这是可行的,尽管您必须使用
wincmd
命令复制所有feedkeys调用,因为feedkeys只有在自动命令完成后才开始工作。我想你应该把这个写下来作为答案。我想你错过了
feedkeys()调用中的
,“n”
。不要依赖未重新映射的用户
@ZyX——是的,您是对的,应该有
n
标志。编辑以添加该内容。@Alfredeza。我建议不要在feedkeys之前的部分中更改
Nwincmd w
,但是在
\j
之后,键入的键稍微少一些。@Herbert Sitz:顺便说一下
j
也可以<代码>
变量的定义只是为了避免快速键入错误:当您在设法将手指从控制中移除之前按j键时。但有一个警告:在BufWritePost事件之后,您可能最终不处于正常模式。当然,您可以在
\
之前编写
\
,但在这种情况下,猜测切换模式更糟糕(示例是使用映射到
:w
进行保存)。我现在无法提出任何解决此问题的建议。