【问题标题】:How to implement MATLAB-like cell mode in Vim如何在 Vim 中实现类似 MATLAB 的单元格模式
【发布时间】:2011-07-02 20:57:48
【问题描述】:

在 MATLAB 中,我们可以将以下内容写入编辑器

%% -- a example cell --

plot(rand(3));

%% -- another cell
A=rand(2^10);
t=linspace(-pi,pi,2^10);
compass(fft(A*sin(t))

我们只需按 Ctrl+Enter 即可运行鼠标指针单击的单元格。

现在我知道在 Vim 中,我可以做到

:'<,>'w !matlab 运行可视选择的代码块。

但是如何在 Vim/gVim 中实现类似 MATLAB 的单元格模式?

例如一些python代码

import os
import subprocess
import random

## 1st cell
ps =["python", "-h"]
out = subprocess.Popen(ps).communicate()[0]
print out

## 2nd cell

# import random -sould not be needed if we concatenate the import section and the cell
print random.randint(1,100)

谁能提供一些想法?

【问题讨论】:

  • slime-vim 值得一看。它使用screen 会话将部分代码“发送”到开放的解释器。
  • 这是在vim外部显示代码输出的好建议,谢谢

标签: vim matlab cell mode


【解决方案1】:

不确定您要问什么,但如果您想要在用鼠标双击块时处理单元块,那么您可以映射鼠标双击(<2-LeftMouse> 映射)调用函数:

nnoremap <buffer> <2-LeftMouse> :call ProcessMouseDoubleClick()<CR>

ProcessMouseDoubleClick() 将是一个函数,它 (1) 直观地选择“单元格”区域和 (2) 发出 '&lt;,&gt;'w !matlab 以让 matlab 运行选定的代码。

当调用 ProcessMouseDoubleClick 时,Vim 光标将位于您在文档中单击的任何位置。除此之外,没有什么特定于鼠标的。因此,您还可以将任何键映射到相同的功能,例如,“评估单元格”的助记命令:

map <buffer> <Leader>ec :call ProcessMouseDoubleClick()<CR>

因此,根本没有任何理由让函数名称引用鼠标,您可能希望将其称为 EvaluateMatlabCell()

【讨论】:

  • 感谢解答,但是视觉上选择“单元格”区域只能选择连续块。如果我想同时选择导入部分和第二个单元格,我该怎么做?
  • @jerry: 啊,如果这是你必须将逻辑构建到函数中的问题。如果您确保导入语句在缓冲区内的单个块中,您可以(1)找到导入语句并拉动注册,(2)移回单元格,将导入块粘贴到单元格顶部,(3)选择单元格并在 matlab 中处理,以及 (4) 删除您复制到单元格中的导入语句。可能有更简单的方法可以做到这一点,但我不太确定你的主要症结是什么。
  • 嗨,herbert,我现在有一些事情要做,:?##?;/##/w !python 这个命令将搜索到 ## 然后再搜索到另一个 ##,然后将它传递给 w !python,它可以工作:)
  • jerry -- 是的,这是选择单元格名称的好方法,但如果您也需要这些命令,它也不会获得导入命令。但是,您不需要每次都进行导入,如果您在整个过程中使用相同的 Python 会话,那么在编辑会话开始时只发出一次它们是可行的。现在您只需将复合命令映射到一个键(映射到 在 gvim 中有效,但在许多终端中无效),您就可以开始了。
  • herbert——你知道如何连接两个范围吗?例如第 1,10 和 30,40 行,我认为 w !python 是从缓冲区到 python,但是如果我们不能使用多个范围,那么我们需要将 2 个范围连接到一个新缓冲区,然后将该缓冲区写入 python。
【解决方案2】:

这是我的 matlab 选项,但它可以很容易地适应 python。它从 vim 切换到 Matlab 窗口,然后您使用鼠标或键盘快捷键粘贴。 我在那里详细描述过:Vim and matlab GUI - Emulate matlab Run (<F5>) with Vim

以下内容,确保您在运行单元之前位于正确的目录中,并在评估单元后返回 Vim(如果您在 matlab 中正确配置了外部编辑器。我使用:gvim --servername MAT --远程标签静音)。

function! MatRunCellAdvanced()
   execute "!echo \"cd(\'".expand("%:p:h")."\')\">/tmp/buff"  
   :?%%?;/%%/w>> /tmp/buff
   execute "!echo \"edit ".expand("%:f")."\">>/tmp/buff"
   !cat /tmp/buff|xclip -selection c
   !cat /tmp/buff|xclip
   !wmctrl -a MATLAB 
endfunction
map ,n :call MatRunCellAdvanced()  <cr><cr>

【讨论】:

  • 感谢您的回答,这很有趣,但是您为什么不直接执行类似 ?%%?;/%%/w !matlab 的操作?
  • 我使用它来避免打开新的 matlab 实例并从 matlab 的 GUI 中受益。如果我的代码中有错误,matlab 将在命令窗口中显示一个链接,单击该链接将在 gvim 中在正确的行打开正确的文件。没有 GUI,这是不可能的。我认为这个选项值得点击!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多