現在のバッファのgrepに基づく条件付きvimscript


7

編集したファイル内のテキストの存在に応じて、関数内のコードを条件付きで実行する方法を探しています。私はそれを行う方法を見つけましたが、それは機能しますが、あまり「きれい」に感じません。

ここに私が持っているものがあります:

function! foo()
    (...)
    let v:errmsg = 'ok'
    execute "silent! normal! :/" . l:pattern . "\r"
    if v:errmsg == 'ok'
        (... do stuff ...)
    else
        (... do other stuff ...)
    endif
 endfunction

問題は、v:errmsgを不格好に使用しなくても、同じ結果がなんとかして得られるかどうかです。

私が頭に浮かぶのは、

function! foo()
   (...)
   if GrepInCurrentBuffer(l:pattern)
      (... do stuff ...)
   (...etc...)

6
使用search()-参照:h search()
VanLaser 2015年

1
@VanLaser:これは完璧に機能し、まさに私が探していたものです。どうもありがとう!
Dalker、2015年

2
どういたしまして!一般的には、利用できるものを発見するために、このから始める::h function-list
VanLaser

回答:


6

あなたが探している機能はsearch()です。この関数はカーソル位置から検索を開始し、一致が見つかるとその行番号が返されます。一致するものが見つからない場合、0が返されます。'ignorecase''smartcase'、および'magic'オプションは、検索パターンで使用されています。検索をどこから開始するかを選択する場合は、cursor()またはsetpos()関数を使用してカーソル位置を設定し、関数を使用してカーソル位置getcurpos()を保存できます。

これが動作中の例です:

function! SearchInRange(pattern, start_line, end_line)
    " Save cursor position.
    let save_cursor = getcurpos()

    " Set cursor position to beginning of file.
    call cursor(a:start_line, 0)

    " Search for the string 'hello' with a flag c.  The c flag means that a
    " match at the cursor position will be accepted.
    let search_result = search(pattern, "c", a:end_line)

    " Set the cursor back at the saved position.  The setpos function was
    " used here because the return value of getcurpos can be used directly
    " with it, unlike the cursor function.
    call setpos('.', save_cursor)

    " If the search function didn't find the pattern, it will have
    " returned 0, thus it wasn't found.  Any other number means that an instance
    " has been found.
    return search_result ? 1 : 0
endfunction

この回答で言及されている事項の詳細については、次のヘルプトピックを参照してください。

  • :help search()
  • :help 'ignorecase'
  • :help 'smartcase'
  • :help 'magic'
  • :help cursor()
  • :help setpos()
  • :help getcurpos()

1
どのようにちょうど約:echo search('pattern', 'nw') ? 1 : 0代わりに?:)
VanLaser 2015年

helloの発生がカーソルの前にある場合、それは検出されないためです。
EvergreenTree

ただし、「w」フラグは、ファイルの終わりを検索対象にします。したがって、すべての発生が検出されます。
VanLaser 2015年

1
それはとても良い解決策です!範囲内を検索するためのカーソル位置の設定をデモしようとしていましたが、最適な例を選択しなかったと思います。例を更新しました。
EvergreenTree

1
正規表現検索をサポートしていますか?
Sergio Abreu 2017

3

将来この質問を見る人への参照のために、質問の疑似コードと同じパターンに従う実際の解決策を次に示します。それは、元の質問とEvergreenTreeの回答の両方に対するVanLaserのコメントに完全に基づいています。

function! foo()
    (... do stuff that defines l:pattern ...)
    if search(l:pattern,'nw')
        (... do stuff ...)
    else
        (... do other stuff ...)
    endif
endfunction

この質問の元となった実際の関数の特定のケースでは、ソリューションは実際には「nw」フラグを必要としませんでした。ただし、これらのフラグは、vimのヘルプでの説明に基づいて、ソリューションをより安全にする必要があります。

'n'     do Not move the cursor
'w'     wrap around the end of the file

:help searchVim 7.4以降)


バッファに何かが存在するかどうかを簡単に確認するには、これが最善の方法です。
EvergreenTree
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.