linux下用vim写matlab程序

使用matlab自带的编辑来写脚本感觉并不美妙,无法享受来自vim操作带来的便利,然而单纯使用vim来编辑,与matlab的交互性并不好,需要进行一定量的配置。所幸linux的工具众多,通过工具的的组合,也得与matlab的交互有了一定量的改善。

一、vim插件推荐

为了更好的完成matlab程序编辑工作,有一些插件是能是必须的。

1.1 ale或syntastic

ale/syntastic 是语法检查软件,能够调用语法检查工具进行对当前脚本进行检查。其中ale只支持vim 8.0以上的版本,而syntastic是支持vim7.4的版本的,需要跟据需要进行选择。

此处非常有必要了解一下matlab的语法检查工具mlint,该工具一般位于/bin/glnx64/mlint目录下,其中代表matlab的安装目录。由于该工具一般不在linux的PATH目录下,所以需要一般情况均需要手动做一个软链接从而实现全局通用:

$ ln -s /bin/glnx64/mlint /usr/bin/mlint

mlint本身没有什么帮助文档,其中帮助文档可参照matlab的doc(虽然其运行方式不一于,但是参数却是相同的),其中比较重要两个用法有:

$ mlint [filename.m]        #检查[filename.m]
$ mlint -id [filename.m]    #检查[filename.m],并给出错误码
$ mlint -config=[setting.txt] [filename.m] #按照[setting.txt]设置检查

其中[filename.m]代表被检查的文件名,而[setting.txt]则代表mlint的配置文件。其中-id的运行结果示例如下:

L 969 (C 58-64): INUSD: Input argument 'handles' might be unused. If this is OK, consider replacing it by ~.

其中INUSD就代表着本错误的错误码,如果不想显示/检查该错误,那么只需要在[setting.txt]中加上该语句,然后使用-config参数即可。

$ cat setting.txt
INUSD

虽然ale/syntastic默认均有matlab的语法检查,但是没有使用-config参数配置,这点对于matlab来说还是很重要的。因为某些matlab错误只是警告,我们大多数时候都很想将其忽略。而如果没有该配置,mlint将默认开启怕有警告,显然,这是比较碍眼的。

syntastic插件提供了的mlint的option项,所以只需要在~/.vimrc下面添加:

let g:syntastic_matlab_mlint_option='-config=[setting.txt] -id'

而ale由于发展时间较短,目前还没有给matlab提供option项,虽然作者已经有下一步计划了。目前就只能通过修改源码来解决问题,修改内容如下所示:

# 文件为ale_linters/matlab/mlint.vim
# 增加两行(行首-号代表删除,+号代表增加)
 let g:ale_matlab_mlint_executable =
 \   get(g:, 'ale_matlab_mlint_executable', 'mlint')
+let g:ale_matlab_mlint_options = get(g:, 'ale_matlab_mlint_options', '')
+let g:ale_matlab_mlint_use_global = get(g:, 'ale_matlab_mlint_use_global', 0)

# 将 return 访行换为下面几行
-    return l:executable . ' -id %t'
+    if ale#Var(a:buffer,'matlab_mlint_options') is# ''
+        return l:executable.' -id %t'
+    else
+        return l:executable.' '.ale#Var(a:buffer, 'matlab_mlint_options').' %t'
+    endif

然后就可以在~/.vimrc中添加如下一行:

let g:ale_matlab_mlint_option='-config=[setting.txt] -id'

ale 的下载地址
syntastic 的[下载地址]](https://github.com/vim-syntastic/syntastic)

1.2 matlab.vim

matlab.vim可以说是vim编辑matlab的核心插件了,提供的功能比较多,主要如下:

1. 关键词高亮(仅包含核心关键词)
2. 自动对齐(可以使用=自动对齐)
3. Tag支持(可以使用ctags生成tag,从而实现函数识别)
4. if/end等配置支持(可以使用%进行if和end之间调转)

注意,if/end配对支持需要matchit插件支持: 下载地址

matlab.vim由matlab论坛的人开发的,我现在已将其放到github上去了:下载地址

1.3 其它的插件

经过上面几个插件的安装之后,vim下matlab编辑也已经基本完善,但是如果缺少其它编程插件的帮助,也很难获得较好的编辑体验。下面主要列出几个对于相对较为通用的编程插件:

nerdcommenter 注释工具,可以方便的加行注释和取消注释
deoplete      相当不错的自动补全工具
ctrlp         文件搜索工具
auto-pairs    自动添加配对括号

vim 插件众多,其中有很多插件都能帮助matlab编译速度更快,显示更好,此处不一一列举,有兴趣慢慢探索。

二、终端下matlab操作

既然使用了vim作为matlab的编辑器,那么matlab必然是使用终端版本,其中最为重要的方法如何在终端下使用matlab,启动方法自然是采用无界面模式(注意:此处要将matlab放到PATH目录下)

# -nodesktop 为无桌面模式, -nosplash 为无启动界面
$ matlab -nodesktop -nosplash

而剩下的如何在命令行下方便的使用matlab呢,个人已经在[早期的文章]中有已经有较好的描述,包含了如何打开图形界面,如何进行方便的调式。

三、vim发送命令到matlab

为了方便使用,笔者写了个插件,名为:matlab-screenVIMer可以直接使用。下面内容仅为实现原理和方法

值得注意的是,vim 8以上的版本由于实现了多进程操作,使用终端命令的发送更为自然,故新建分支vim8,vim8分支将会持续更新,直至不再使用为止

由于matlab没有提供API可以直接将信息传递到指定的matlab下,使得vim难以实现通过一键在已知听matlab中运行命令。前一段时间无意中发现vscode里面有一个插件能够实现:在vim中选定代码,然后在当前matlab环境中下执行选定代码。虽然我不清楚这个插件是怎么实现的,但是我觉得这个功能相当实用,但是需要将来自的vim的消息传到matlab中并执行才可。

经过调研,两个终端本身并不能实现数据通信并执行,而经过screen这个工具则可以实现该功能。screen是由gnu开发的一个终端工具,可以实现终端的状态保存与背后运行。今天我们也可以试着使用screen将来一个终端的命令发送到别外一个终端并执行。

在系统安装screen之后,试开两个终端ter1和ter2,在ter1中执行:

$ screen -S test   # screen 新开了名叫test的session.

然后在ter2中即可进行操作:

$ screen -S test -X stuff 'ls\n'

再看ter1的显示情况,显然,ter1已经执行了ls并显示结果。

根据上述的原理,我们就可以至少可以实现下面三个较比较实用的功能:

1. 一键执行当前脚本
2. 一键执行当前选中文本
3. 一键查询当前光标下的函数

3.1 具体方案

首先matlab需要在screen下打开:

$ screen -S matlab          # 建立一个名叫matlab的session
$ matlab -nodesktop -nosplash # 在screen中启动matlab

然后在~/.vimrc中添加如下函数:

function! RunSelectInMatlab() range
    '<,'> write! matlab_tmp.m
    silent !echo delete\(\'matlab_tmp.m\'\)\; >> matlab_tmp.m && screen -S matlab -X stuff 'matlab_tmp^M'
    redraw!
endfunction
function! RunCurrentFileInMatlab()
    execute "silent !screen -S matlab -X stuff '".strpart(expand('%:t'),0,len(expand('%:t')-2)."^M'"
    redraw!
endfunction
function! GetMatlabDoc()
    execute "silent !screen -S matlab -X stuff 'doc ".expand("<cword>")."^M'"
    redraw!
endfunction

显然,这上面三个函数各自己实现了三个功能。这个时候需要将三个函数绑定三个快捷键上去:

autocmd FileType matlab vnoremap <F5> :call RunSelectInMatlab()<CR>
autocmd FileType matlab nnoremap <F5> :call RunCurrentFileInMatlab()<CR>
autocmd FileType matlab nnoremap <Leader>d :call GetMatlabDoc()<CR>

该键盘映射实现了三个功能:

1. 在V模式下(一般使用大写V键进行选行),使用<F5>执行所选行
    在matlab中可见matlab_tmp命令
2. 在N模式下,使用<F5>执行当前脚本
    在matlab中可见当前脚本执行
3. 在N模式下,使用<Leader>d查询当前光标下的函数
    在matlab中可见doc+函数名执行

3.2 更为方便的方案

为更好实现matlab与vim的集成,我建议使用tmux进行分屏。为了更快的在screen中打开matlab,可使用如下命令:

$ screen -S matlab -m sh -c "<PATH>/matlab -nodesktop -nosplash"

这样就实现了matlab与screen的同时启动与关闭。为了方便的使用,可以将其写入alias。

此条目发表在CODING, LINUX分类目录,贴了, , 标签。将固定链接加入收藏夹。

1 则回应给 linux下用vim写matlab程序

  1. 匿名说: 2018年5月21日 上午10:04
    Chromium 66 Chromium 66 Ubuntu Ubuntu

    这很快嘛!虽然我没看懂。

发表评论

电子邮件地址不会被公开。