与外界交谈


12

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

我问是因为我想使用latexmk的compiling_cmd,success_cmd和failure_cmd选项在状态行上显示编译状态。

也许我可以让vim查找某些文件的存在或不存在(使用文件作为布尔变量)?但这似乎有点肮脏。希望有更好的方法。

Answers:


19

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

$ vim --servername VIM

然后您可以从其他任何shell发出带有参数的命令--remote-send

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

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

然后,您可以:let g:myvar = "bar"从另一个shell 更改其值():

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

状态行应反映值的变化。


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

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中是一样的。
Toothrot

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

看来,这与使用tmux发送密钥具有相同的效果,并且取决于了解vim服务器处于哪种模式(本示例假定为正常模式)。理想情况下,我希望能够直接设置一个变量。
Toothrot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.