Vim和matlab GUI - 使用Vim </f5>模拟matlab运行(<f5>)

时间:2012-04-20 16:55:53

标签: matlab vim clipboard

我正在使用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(在我的情况下已经打开了)。 这是我认为可以为我解决的解决方案:

  1. 在vim中使用键映射:
    • (a)放入剪贴板,例如:run('path-to-file')或cd('folder'); run('filename')
    • (b)调用一个shell命令,将焦点放在matlab GUI
  2. 此时,我应该在matlab命令窗口中,所以我只需按Ctrl-V就可以粘贴剪贴板的内容。 (我正在使用linux,但是使用windows keybindings的matlab)
  3. 第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捕获浏览器。

3 个答案:

答案 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可以在没有管理员权限的情况下安装,在企业计算机上很有用。

使用下面描述的设置:

  • 在gvim中,在正常模式下按 CTRL-L 将评估Matlab中的当前行(然后返回gvim)。
  • 在可视模式下,它将评估Matlab中的当前选择(并返回到Vim)。

可以通过 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捆绑在一起)确认它在您的计算机上被称为相同。