小编e-m*_*ito的帖子

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

我使用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捕获浏览器.

vim clipboard matlab

14
推荐指数
1
解决办法
6811
查看次数

Fortran相当于matlab find - 应用于切片矩阵而没有内存重复

我在matlab中使用命令发现了很多,我想知道如何在fortran中巧妙地翻译它来提取一个数组的片段.在matlab中,您可以使用逻辑或索引进行切片,但在fortran中,您需要索引进行切片.我知道内在的子程序包等,但从未使用它们.此外,由于我正在处理大型矩阵,我想避免重复内存.我希望在子程序中操作切片矩阵.我已经在某处读过那些没有重复的数组.我不知道如何在matlab中完成切片.我也很困惑,因为在matlab中,一些分配对你来说是透明的.

我想知道如何重现下面的例子,并确保我没有复制内存中的东西,这样做实际上很优雅.否则,我会忘记切片并只发送整个矩阵(因为它是通过引用)并循环通过索引数组我...

Matlab示例1:简单地再现查找

  v=[1 2 3 4];
  I=find(v==3);
Run Code Online (Sandbox Code Playgroud)

Matlab示例2:

m=rand(4,4);
bools=logical([ 1 0 0 1]);
I=find(bools==1); 
% which I could also do like: 
I=1:size(m,1); 
I=I(bools);

  for i=1:length(I)
      % here dealing with m(I(i)),:)  and do some computation
      % etc.
Run Code Online (Sandbox Code Playgroud)

示例3:只需在m(I,:)上调用子例程,但直接使用布尔值进行切片

   foo( m(bools, :) , arg2, arg3 )
Run Code Online (Sandbox Code Playgroud)

提前谢谢你的帮助!

arrays matlab fortran

5
推荐指数
2
解决办法
1万
查看次数

在Vim中同时写入两个寄存器

我在用着:

set clipboard=unnamed  
Run Code Online (Sandbox Code Playgroud)

这样剪切和复制的选择就会进入寄存器*,它可以方便地链接到x剪贴板(我使用的是 Linux)。

我也想将它放在寄存器中,+以便在其他应用程序中获得鼠标中键粘贴并Ctrl-V给出相同的结果。xclip我想这可能与和之间的差异有关xclip -selection c

目前我的解决方法是:

noremap Y "+y  
Run Code Online (Sandbox Code Playgroud)

这样我就可以Yy复制当前行来+注册,然后在某些应用程序中使用 Ctlr-V。但随后我必须提前考虑是否使用鼠标或 Ctrl-V。

当我拉动或用鼠标选择一些文本时,有没有办法让+和寄存器具有相同的值?*

linux vim copy-paste vim-registers

5
推荐指数
1
解决办法
402
查看次数

标签 统计

matlab ×2

vim ×2

arrays ×1

clipboard ×1

copy-paste ×1

fortran ×1

linux ×1

vim-registers ×1