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

e-m*_*ito 14 vim clipboard matlab

我使用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
Run Code Online (Sandbox Code Playgroud)

但我想使用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)

步骤1a: 以下命令将run('filename')命令放入剪贴板,按下CTRL-V时matlab将粘贴它

let @+="run(\'".expand("%:p")."')" 
Run Code Online (Sandbox Code Playgroud)

以下两个将与linux中间按钮粘贴(但这不是我想要的,因为我想在此步骤中避免使用鼠标)

let @*="run(\'".expand("%:p")."')" 

execute '!echo "' . "run(\'".expand("%:p")."\')" . '"| xclip'  
Run Code Online (Sandbox Code Playgroud)

步骤1b:为了将焦点放在matlab窗口,我使用以下命令:

wmctrl -a MATLAB &
Run Code Online (Sandbox Code Playgroud)

这很好用,但是如果你在标题中有matlab这个词的页面上(例如你正在阅读的那个......),它也会看到你的浏览器.(另请参阅更复杂的解决方案是否有linux命令来确定与给定进程ID关联的窗口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>
Run Code Online (Sandbox Code Playgroud)

不知何故,当与wmctrl结合使用时,CTRL-V在这种情况下不起作用(参见下面的编辑).对我来说,重点是避免使用鼠标进行此操作.

谢谢您的帮助.

编辑和工作选项 我的坏,我使用xclip我应该使用xclip -selection c.请参阅下面的回复..

如果有人找到更好的解决方案,我会很高兴,例如:直接在matlab命令窗口粘贴,确保你在命令窗口(Ctrl-0),或避免使用wmctrl捕获浏览器.

e-m*_*ito 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>
Run Code Online (Sandbox Code Playgroud)

要运行,请仅评估单元格:这是Ctrl + Enter行为.在与上面相同的行中:( 编辑:我现在扩展它,以便它将从第一个向上的%% 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>
Run Code Online (Sandbox Code Playgroud)

但我更喜欢下面的一个,虽然更复杂(并且当然可以仅限于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>
Run Code Online (Sandbox Code Playgroud)

运行当前行: 将当前行复制到剪贴板并转到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>
Run Code Online (Sandbox Code Playgroud)

运行选择:模拟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
Run Code Online (Sandbox Code Playgroud)

单元格标题中的粗体单元格标题 粗体字体

 highlight MATCELL cterm=bold term=bold gui=bold
 match MATCELL /%%.*$/
Run Code Online (Sandbox Code Playgroud)

将这些命令放在何处. 所有这些命令都在.vim/after/ftplugin/matlab.vim中

编辑 而不是使用:

 run('./".expand("%:f")."')"
Run Code Online (Sandbox Code Playgroud)

我现在用

run('".expand("%:p")."')"
Run Code Online (Sandbox Code Playgroud)

处理vim'pwd'与脚本目录不同的情况.我没有找到提取脚本名称的方法,所以我使用完整路径.有人可能会找到一个更好的解决方案.