我正在使用linux和gvim / vim作为matlab的外部编辑器。
使用matlab编辑器,您可以按F5运行文件。我试图用gvim-gtk(官方debian软件包)重现这个。
我知道可以在“bash模式”中将文件名或选择指向matlab,如下所示:
execute '!echo "' ."run(\'".expand("%:p")."\')" . '"| matlab -nojvm'
execute '!matlab -nodisplay < '.expand("%:p")
noremap <C-CR> :?%%?;/%%/w !matlab -nojvm
但我想使用Matlab gui(在我的情况下已经打开了)。 这是我认为可以为我解决的解决方案:
第1a步: 以下将把run('filename')命令放到剪贴板上,按下CTRL-V时matlab将粘贴它
let @+="run(\'".expand("%:p")."')"
以下两个将使用linux中间按钮粘贴(但这不是我想要的,因为我想在此步骤中避免使用鼠标)
let @*="run(\'".expand("%:p")."')"
execute '!echo "' . "run(\'".expand("%:p")."\')" . '"| xclip'
步骤1b:要将焦点放在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>
不知何故,当与wmctrl结合使用时,CTRL-V在这种情况下不起作用(参见下面的编辑)。对我来说,重点是避免使用鼠标进行此操作。
感谢您的帮助。
编辑和工作选项 我的不好,我正在使用xclip我应该使用xclip -selection c。请参阅下面的回复..
如果有人找到更好的解决方案,我会很高兴,例如:直接粘贴在matlab命令窗口中,确保你在命令窗口(Ctrl-0),或者避免使用wmctrl捕获浏览器。
答案 0 :(得分:15)
修改强> 请参阅由其制作的插件:https://github.com/elmanuelito/vim-matlab-behave
很抱歉回复我自己的问题。这是我的坏,我使用xclip我应该使用xclip -selection c。 我在下面列出了适用于我的不同代码:它会重现F5和评估单元格行为,但您必须按Ctrl-V或使用鼠标粘贴到Matlab命令窗口中。如果您不在命令窗口中,请使用matlab快捷键Ctrl-0跳转到它。该脚本自动从vim转到matlab(除非你有另一个名为“matlab”的窗口)。之后我添加了标记以回到之前的光标位置。
运行整个脚本matlab:这是“Run / F5”行为(转到正确的目录并执行整个脚本):
function! MatRun()
normal mm " mark current cursor in mark m"
let @+="cd('".expand("%:p:h")."\'); run('./".expand("%:f"). "')"
call system('xclip -selection c ', @+)
call system('xclip ', @+)
normal `m "go back to cursor location"
!wmctrl -a MATLAB
endfunction
map ,m :call MatRun() <cr><cr>
要运行,请仅评估单元格:这是Ctrl + Enter行为。在与上面相同的行中:(编辑:我现在扩展它以便从第一个向上的%% OR文件的开头(\%^)直到第一个向下的%% OR文件末尾(\ ^ $)结束编辑)
function! MatRunCell()
normal mm "remember cursor"
:?%%\|\%^?;/%%\|\%$/w !xclip -selection c "pipe the cell to xclip"
normal `m "go back to cursor location"
!wmctrl -a MATLAB "go to matlab window"
endfunction
map ,k :call MatRunCell() <cr><cr>
但是我更喜欢下面的一个,虽然更复杂(并且当然可以仅限于vim)。 以下内容确保您在正确的目录中运行单元格,并在评估单元格后返回Vim(如果您已在matlab中正确配置外部编辑器。我使用:gvim --servername MAT --remote-tab -无声)。
function! MatRunCellAdvanced()
execute "!echo \"cd(\'".expand("%:p:h")."\')\">/tmp/buff"
normal mm
:?%%\|\%^?;/%%\|\%$/w>> /tmp/buff
execute "!echo \"edit ".expand("%:f")."\">>/tmp/buff"
!cat /tmp/buff|xclip -selection c
!cat /tmp/buff|xclip
normal `m
!wmctrl -a MATLAB
endfunction
map ,n :call MatRunCellAdvanced() <cr><cr>
运行当前行 将当前行复制到剪贴板并转到matlab窗口。 (再次将Control + V粘贴到matlab中,如果它是你在matlab中使用的快捷方式)
function! MatRunLine()
" write current line and pipe to xclip "
:.w !xclip -selection c
!wmctrl -a MATLAB
endfunction
map ,l :call MatRunLine() <cr><cr>
运行选择:模拟F9行为。
function! MatRunSelect()
normal mm
!rm -f /tmp/buff
:redir > /tmp/buff
:echo @*
:redir END
execute "!echo \" \">>/tmp/buff"
execute "!echo \"edit ".expand("%:p")."\">>/tmp/buff"
!cat /tmp/buff|xclip -selection c
normal `m
!wmctrl -a MATLAB
endfunction
大胆的小区标题 单元格标题中的粗体字
highlight MATCELL cterm=bold term=bold gui=bold
match MATCELL /%%.*$/
放置这些命令的位置 所有这些命令都在.vim / after / ftplugin / matlab.vim
中修改强> 而不是使用:
run('./".expand("%:f")."')"
我现在用
run('".expand("%:p")."')"
处理vim'pwd'与脚本目录不同的情况。我没有找到提取脚本名称的方法,所以我使用完整路径。有人可能会找到一个更好的解决方案。
答案 1 :(得分:1)
对于那些只想从vim运行matlab脚本并且不需要其他花哨的GUI东西的人,你可以尝试使用matlab的命令行shell。
:! matlab -nosplash -nodesktop -r %:r
将启动一个新的matlab shell并将当前文件作为脚本(或没有参数的函数)运行,类似于matlab GUI中的F5。您需要输入'exit'以退出matlab shell并在之后返回vim。当然,只有当您要运行的文件位于matlab路径或终端的工作目录中时,此功能才有效。
这可能有点不方便,并且由于新的matlab实例一直在启动,因此运行脚本可能需要一段时间。您可以尝试使用-nojvm
来避免由java引起的开销,但我认为最好的解决方案是保持matlab shell打开。
您可以使用名为Conque-Shell的Vim插件执行此操作
安装完成后,您可以使用:ConqueTerm matlab -nodesktop
启动matlab shell,您将获得一个可以像matlab控制台一样使用的缓冲区。
执行代码部分可以正常使用yank和paste。或者您可以创建为您执行此操作的vim函数。由于我不是很擅长这个,所以我只能在这里提供这个丑陋的映射:
:nmap <f5> :let @"=expand('%:r')<cr>:buffer matlab\ -nodesktop<tab><cr>""p<cr>
答案 2 :(得分:0)
我在Windows上使用 Autohotkey 执行此操作(我也用它来交换 Esc 和 Caps Lock 键)。 Autohotkey可以在没有管理员权限的情况下安装,在企业计算机上很有用。
使用下面描述的设置:
可以通过 CTRL-E 的略微不同的映射来实现单元模式(见下文)。 (Autohotkey脚本将在Matlab中执行,无论是通过gvim中的 CTRL-E 映射放入剪贴板。)然后,您可以并排或在不同的屏幕上设置Matlab和gvim,它是一个很棒的工作方式。
在我的Autohotkey文件中,我使用此映射:
^l::
; execute line or current selection in Matlab
IfWinActive, ahk_class Vim
{
; CTRL-E is mapped to a Vim shortcut to yank the text you want
Send, ^e
WinActivate, ahk_class SunAwtFrame
Send, ^0^v{Enter}
WinActivate, ahk_class ahk_class Vim
} else if WinActive, ahk_class SunAwtFrame
{
Send, ^0^v{Enter}
}
Return
然后,在vim中我使用以下快捷方式:
:nnoremap ^E Y
:vnoremap ^R y
注意:^ E是按 CTRL-V CTRL-E 或 CTRL在vim中输入的文字 CTRL-E -Q CTRL-E 。
注2:SunAwtFrame
是Windows在我的机器上调用Matlab窗口的内容。您可以使用Windowspy(与Autohotkey捆绑在一起)确认它在您的计算机上被称为相同。