【发布时间】:2012-04-20 16:55:53
【问题描述】:
我使用 Linux 和 gVim/Vim 作为 Matlab 的外部编辑器。
在 Matlab 编辑器中,您可以通过按 F5 来运行文件。我正在尝试在 Vim 中重现这个(从 gvim-gtk Debian 软件包安装)。
我知道可以像这样以“shell 模式”将名称或当前文件或选定文本发送到 Matlab:
execute '!echo "' ."run(\'".expand("%:p")."\')" . '"| matlab -nojvm'
execute '!matlab -nodisplay < '.expand("%:p")
noremap <C-CR> :?%%?;/%%/w !matlab -nojvm
但我想使用 Matlab GUI(在我的情况下它已经打开)。
这是我认为可以为我解决的解决方案:
-
在 vim 中使用一个键映射:
- (a) 在剪贴板中添加类似:
run('path-to-file')或cd('folder');run('filename')。 - (b) 调用一个 shell 命令,将焦点放在 Matlab GUI 上
- (a) 在剪贴板中添加类似:
-
此时,我应该在Matlab命令窗口,所以我只要按Ctrl-V,剪贴板的内容应该被粘贴了。 (即使我在 Linux 上,我也使用带有 Windows 键绑定的 Matlab。)
步骤 1(a):
下面将run('filename')命令放到剪贴板,Matlab会在Ctrl-V按下时粘贴:
let @+="run(\'".expand("%:p")."')"
以下两个命令适用于 Linux 中键粘贴,但这不是我想要的,因为我想在这一步中避免使用鼠标:
let @*="run(\'".expand("%:p")."')"
execute '!echo "' . "run(\'".expand("%:p")."\')" . '"| xclip'
步骤 1(b): 要将焦点放在 Matlab 窗口上,我使用以下命令:
wmctrl -a MATLAB &
这很好用,但它也可能会打开一个浏览器窗口,如果它碰巧打开了一个标题中带有单词 Matlab 的页面(就像你现在正在阅读的那个)。
另请参阅更复杂的解决方案:Is there a linux command to determine the window IDs associated with a given process ID?。
我的(现在是旧的)选项,但 Ctrl-V 不起作用!只有鼠标粘贴可以:
function! MatRun()
let @+="run(\'".expand("%:p")."')"
let @*="run(\'".expand("%:p")."\')"
:call system('xclip', @+)
!wmctrl -a MAT
endfunction
map <F5> :call MatRun() <cr><cr>
不知何故,Ctrl-V 在与wmctrl 结合使用时在这种情况下不起作用(请参阅下面的编辑)。我的重点是避免使用鼠标进行此操作。
感谢您的帮助。
更新:一个可行的选择
我的错,我在应该使用 xclip -selection c 的地方使用 xclip。请参阅下面的回复。
如果有人找到更好的解决方案,我会很高兴,例如:直接在 Matlab 命令窗口中粘贴,确保您在命令窗口中 (Ctrl-0),或避免使用wmctrl 捕获浏览器窗口。
【问题讨论】:
-
读得很好,不知道 xclip。
-
mathworks.co.uk/help/techdoc/apiref/engopen.html - 您可以使用这种技术启动一个服务器进程,该进程将从 vim 接收到的命令通过管道传输到 matlab(或者手动打开管道,直接进入,无需中间 C 程序)
-
@Tom :看起来不错,我猜它不适用于 GUI/桌面,对吧?使用 engdemo.c,并将其限制为对 engOpen 的简单调用,这行得通吗?你能举个例子吗?谢谢