2015-05-19 29 views
1

我想要實現的是在我的vimrc中創建一個簡單的函數,該函數應該在基於作爲第一行提供的函數定義的matlab文件中添加幫助commnent-block。我曾經發現過類似的功能,但我無法再找到它,而其他顯示出來的解決方案使用外部語言如python和perl。我想學習如何編寫自己的函數,同時保持vimrc清潔。Vim腳本和Matlab頭文件模板

功能應該簡單地更換一些佔位符我保存在一個模板,看起來像這些:

function [a,b] = func(c,d) 
% a 
% INPUTS: 
% <+INPUTS+> 
% OUTPUTS: 
% <+OUTPUTS+> 

的基本思路是來圖,MH到MatlabHeader用來解析第一線功能,搜索可能的輸入和輸出變量,將它們保存在兩個單獨的列表中並替換正確的佔位符。

我被困在理解如何添加創建一個預格式化的字符串,應該取代< ++>東西。

這裏是我的代碼:

function! MatlabHeader() 

    let lista = split(getline(".")) 
    let outputList = matchstr(lista[1],'\(\w,\?\)\+') 
    let outputs = split(outputList,",") 
    let length = len(lista) 
    let inputList = matchstr(lista[length-1],'(\(\w,\?\)\+)') 
    let inputList = substitute(inputList,"(","","") 
    let inputList = substitute(inputList,")","","") 
    let inputs = split(inputList,",") 

    :%s/<+INPUTS+>/\=inputs/g 
    :%s/<+OUTPUTS+>/\=outputs/g 

endfunction 

現在,這「工作」相當精細的一部分的事實,在每個列表中的第二個輸入/輸出的元素會被放置在新行而每一次嘗試的開始添加一個製表符或空格被完全忽略。

非常感謝您的幫助。

回答

1

由於您已將split()的原始參數導入到列表中,您需要再次使用join()。否則,Vim將把每個元素作爲一個單獨的行,並且明白地插入它。

:%s/<+INPUTS+>/\=join(inputs, "\n% ")/g 

它看起來像您可以使用該片段插件的一個好處。嘗試自己實施解決方案以發現問題空間並學習是很好的做法,但不太可能匹配維護良好的插件的功能。

片段類似於內置的:abbreviate類固醇,通常帶有參數插入,鏡像和多重停止。第一個非常着名的Vim插件之一是snipMate(受TextMate編輯的啓發);不幸的是,它不再被維護;儘管有a fork。一個現代的替代品(需要Python)是UltiSnips。還有更多,請參閱this list on the Vim Tips Wiki

+0

嗨Ingo非常感謝你的回答,確實有效。我會按照您的建議查看片段!我不能投你的答案,我太新手了;( –