2011-02-01 9 views
31

vimscriptで次の関数を実行するにはどうすればよいですか?変数に代入を使用する

fun! Foo() 
    let l:bar = "Hello there, world!" 
    # Perform a substitution on l:bar, changing "world" to "kitten" 
endfun 

つまり、現在のバッファではなく変数に対してどのように置換を実行するのですか。

私は、バッファに置換するために、私は

silent :%s/world/kitten/g 

を書くことができることを知っているが、変数に代入するために同等のコマンドは何ですか?

+0

Re:ロールバック:タグは、タイトルではなくプログラミング言語のマーキング用です。 –

答えて

39

:help substitute:help substitute()とする。

代替コマンドの対応部分です(:help :substituteを参照)。あなたの例では

substitute({expr}, {pat}, {sub}, {flags})  *substitute()* 

    The result is a String, which is a copy of {expr}, in which 
    the first match of {pat} is replaced with {sub}. This works 
    like the ":substitute" command (without any flags). But the 
    matching with {pat} is always done like the 'magic' option is 
    set and 'cpoptions' is empty (to make scripts portable). 
    'ignorecase' is still relevant. 'smartcase' is not used. 
    See |string-match| for how {pat} is used. 
    And a "~" in {sub} is not replaced with the previous {sub}. 
    Note that some codes in {sub} have a special meaning 
    |sub-replace-special|. For example, to replace something with 
    "\n" (two characters), use "\\\\n" or '\\n'. 
    When {pat} does not match in {expr}, {expr} is returned 
    unmodified. 
    When {flags} is "g", all matches of {pat} in {expr} are 
    replaced. Otherwise {flags} should be "". 
    Example: > 
     :let &path = substitute(&path, ",\\=[^,]*$", "", "") 
    This removes the last component of the 'path' option. 
     :echo substitute("testing", ".*", "\\U\\0", "") 
    results in "TESTING". 

私は私が私のプラグインvim-encodeを作成するときに魔法を避けるために、Vimのマニュアルを検索することの疲れ
let l:bar = substitute(l:bar, "world", "kitten", "")

+0

私はバッファで私の例で 'substitute'を使用しています。バッファーではなく変数に適用する方法がわかりません。 –

+0

@Sebasitan P.:2つの代替コマンドがあります。最初にチェックすると、代替機能の構文を取得します(コマンドではありません)。 –

+0

':h substitute'はヘルプページと同じです。 :h:代理人 'だから、その違いを見るのはむしろ難しいです。 –

0

働くべきだと思い、ここで見つけるプレーンテキストのための純粋なvimscriptの実装があります

使い方置き換える&:s:strreplace("abc","a","b")戻り"bbc"s:strreplace("abc",["a","b"],["b","a"])リターンを"bac"

func! s:strfind(s,find,start) 
      if type(a:find)==1 
        let l:i = a:start 
        while l:i<len(a:s) 
          if strpart(a:s,l:i,len(a:find))==a:find 
            return l:i 
          endif 
          let l:i+=1 
        endwhile 
        return -1 
      elseif type(a:find)==3 
        " a:find is a list 
        let l:i = a:start 
        while l:i<len(a:s) 
          let l:j=0 
          while l:j<len(a:find) 
            if strpart(a:s,l:i,len(a:find[l:j]))==a:find[l:j] 
              return [l:i,l:j] 
            endif 
            let l:j+=1 
          endwhile 
          let l:i+=1 
        endwhile 
        return [-1,-1] 
      endif 
    endfunc 

    func! s:strreplace(s,find,replace) 
      if len(a:find)==0 
        return a:s 
      endif 
      if type(a:find)==1 && type(a:replace)==1 
        let l:ret = a:s 
        let l:i = s:strfind(l:ret,a:find,0) 
        while l:i!=-1 
          let l:ret = strpart(l:ret,0,l:i).a:replace.strpart(l:ret,l:i+len(a:find)) 
          let l:i = s:strfind(l:ret,a:find,l:i+len(a:replace)) 
        endwhile 
        return l:ret 
      elseif type(a:find)==3 && type(a:replace)==3 && len(a:find)==len(a:replace) 
        let l:ret = a:s 
        let [l:i,l:j] = s:strfind(l:ret,a:find,0) 
        while l:i!=-1 
          let l:ret = strpart(l:ret,0,l:i).a:replace[l:j].strpart(l:ret,l:i+len(a:find[l:j])) 
          let [l:i,l:j] = s:strfind(l:ret,a:find,l:i+len(a:replace[l:j])) 
        endwhile 
        return l:ret 
      endif 

    endfunc 
関連する問題