我可以从另一个外壳更改vim实例中的变量(不通过tmux发送密钥)吗?

我问是因为我想使用latexmk的compiling_cmd,success_cmd和failure_cmd选项来显示编译状态。状态线。也许我可以让vim查找某些文件的存在或不存在(使用文件作为布尔变量)?但这似乎有点肮脏。希望有更好的方法。

#1 楼

如果使用参数--servername VIM启动第一个Vim会话:

$ vim --servername VIM


,则可以使用参数--remote-send从任何其他shell发送任何命令。

例如,如果使用状态行显示某些变量g:myvar的值,并且vimrc中包含以下行:

let g:myvar = "foo"
set stl+=%{g:myvar}


然后可以从另一个外壳程序更改其值(:let g:myvar = "bar"):

$ vim --remote-send ':let g:myvar = "bar"<cr>'


状态行应反映该值的更改。


正如您的最后一条评论所说,如果您的Vim实例不在正常模式下,则先前的命令将无法正常工作。可能更简单,但是有2种可能的解决方案:

1)将密钥<esc>添加为普通模式
2)使用参数--remote-expr而不是--remote-send来计算表达式并编写一个小的辅助函数,其代码会将新值分配给您的变量

第一个解决方案:

$ vim --remote-send '<esc>:let g:myvar = "bar"<cr>'


第二个解决方案:

在vimrc中定义以下功能:

function! Myfunc(value)
    let g:myvar = a:value
endfunction


然后在您的shell中:

$ vim --remote-expr 'Myfunc("bar")'


评论


谢谢!我看到没有编译此功能,所以我将重新编译。希望在Neovim中也一样。

–牙
16 Mar 24 '16 at 13:49

@Lawrence我可能是错的,但我认为neovim并未实现+ clientserver功能(github.com/tpope/vim-dispatch/issues/163#issuecomment-175383047)。如果是这样,也许这个插件会为您提供帮助:github.com/mhinz/neovim-remote

–user9433424
16 Mar 24 '16 at 14:09

看来,这与使用tmux发送密钥具有相同的效果,并且取决于了解vim服务器处于哪种模式(本示例假定为正常模式)。理想情况下,我希望能够直接设置一个变量。

–牙
16 Mar 24 '16 at 14:44