2011-06-25 17 views
1

menu.vimにたくさんの関数を作成しました。vimのサブ関数

多くの関数で同じコードが使用されているので、 サブ関数を使用してファイルをクリーンアップすることにしました。

p.eが、これは多くの場合、私の関数で返すどのようなコードです:

let zoek = @/  
if a:type == "'<,'>"  
let r = substitute(zoek, '\\%V', '', 'g')  
elseif a:type == "%"  
let r = zoek  
endif  

let a = substitute(r, '\', '', 'g')  

if matchstr(d, '>') == '>' || matchstr(d, '<') == '<'  
let e = substitute(d, '\zs>\(\d\+\)%<\ze', '\1-', 'g')  
endif 

は、どのように私はそれからサブ関数を作成することができますか?どのように呼び出すことができますか?
Vimにサブ関数がありますか?

答えて

4

あなたが辞書にそれらを定義することによって、«ローカル»機能を持つことができます。MyFuncとし、sの後に破壊されています:次のコードで

function MyFunc() 
    let d={} 
    function d.function() 
     echo "Foo" 
    endfunction 
    call d.function() 
endfunction 

機能d.functionは唯一の内側にアクセスすることがMyFuncとは終了します。 d.functionは実際には42という名前のグローバル関数です(または別の番号でも問題ありません)。 を参照せずに呼び出すことはできませんfunction dict.key()を参照する唯一の方法は作成後にコピーすることができますが、function()を呼び出して参照を作成することはできません。MyFuncfunction("MyFunc"))。数値(この場合は42)は、関数を作成するたびにインクリメントされ、最大数と到達点が分からないことに注意してください。どこか(おそらくは、その容器の一部として)機能の参照を渡すデバッガまたは明示せずに到達することができない

  1. 辞書機能スクリプトローカル辞書内で定義:彼らは、2つの他の利点を持っているので、私は個人辞書機能を使用します。
  2. 辞書内に複数の関数が定義されている場合、それらを削除するために必要なものは、この辞書をアンレットすることです。プラグインの再読み込みに便利です。
+0

ありがとうございます。g:変数を使用してサブ関数から値をインポートし、関数の最後に値を取り消すこともできますか?g:変数を取り消すことはできませんか? – Reman

+0

@Remonn。両方の質問ではいですが、なぜインポートする必要があるだけの値を返すことができないのですか? //できない場合でも、グローバルスコープを汚染しないようにしてください。 's:variable'を使用してください。///別のヒントがあります:関数内には、すべての関数ローカル変数を含む 'l:'辞書があります。サブファンクションに渡して、そこにいくつかの方法で変更することができます。 – ZyX

+0

リストをサブ関数(実際の関数の外部にあります)へのl:リストとして渡す方法と関数内で再度インポートする方法の例を挙げることができますか?私は、多くの機能ではなく、gを使わないで "listlines"というリストを使用しています。 – Reman

2

Vimscriptには1種類の関数しかありませんが、あなたのmenu.vimですでに使用しているのかどうかはわかりません。ユーザー定義関数はこのように定義されています

function! MyNewFunction() 
     " your code here 
    endfunction 

その後、

call MyNewFunction() 

かの戻り値に等しい変数を設定を使用して(と他の関数の内部で)他の場所であなたのスクリプトでこの関数を呼び出すことができますあなたの関数を使用して

let my_variable = MyNewFunction() 

あなたがすでに関数を使用していると言うので、これは信じられないほど単純な概観です。変数の使用を含む多くの情報は、ここにあります:

help user-functions 

私はあなたの質問に答えていない場合は謝罪します。

関連する問題