web-dev-qa-db-ja.com

vim:サブマクロでエラーが発生した後、マクロを続行しますか?

私はvimを使用していくつかのソースコードを美化する過程にあります。 {1}

個々のステップを実行するvimマクロをいくつか作成しました。末尾のwhilespaceの削除、{の後の空の行の削除、{の前の空の行の削除などです。

ここで、個々のマクロをすべて順番に実行するマクロを作成します。ただし、最初の再帰マクロが終了すると(一致するものが見つからないため->一致エラー)、私の「ラッパー」マクロも終了します。

サブマクロがエラーを生成した後、vimマクロを続行させる方法はありますか?

{1}は自動リフォーマッターについて知っています。私は現在の問題でそれらを使用するかもしれません。例のために、ソースの再フォーマットについて言及しただけです。 このソースビューティファイアまたはそれについての回答を投稿しないでください。問題は、コードの再フォーマット自体ではなく、vimマクロについてです。

例:

  • マクロ1-末尾の空白のトリミング-qw/\s\+$d$@wq
  • マクロ2-}の前の空の行を削除する-qe/\n\n *}dd@eq
  • ラッパーマクロ-再タブ付け、マクロ1、マクロ2-qr:retab@w@eq

ラッパーを実行すると--@r-再タブリングされ、末尾の空白がなくなるまでマクロ1を実行してから、終了します(withoutマクロの実行2)。

説明:

私が探しているのは、サブマクロを呼び出す方法です。そのサブマクロが終了しても、呼び出し元のマクロが続行されますか?

15
DevSolar

:tryを使用して、サブマクロのエラーを「吸収」することをお勧めします。

これはばかげた例です:

:let @a='f|dt|@a'
:let @q=':try|exe "norm! @a"|endtry^Mj0@q'
@q

ラッパーマクロは次のようになります。

let @r=':retab^M:try|exe "norm! @w"|endtry|try|exe "norm! @e"|endtry^M'
12
Peter Rincker

失敗したコマンドがそのパターンを見つけられない置換である場合、例えば、

:%s/foo/bar/

fooがバッファに存在しない場合は、eフラグを追加して、そのエラーを無視できます。例:

:%s/foo/bar/e

見る

:help :s_flags

:silent!を前に付けることで、いくつかの:exコマンドからのエラーを無視するようにVimに指示できます。見る

:help :silent

質問に例を追加して編集する

マクロ1とマクロ2はどちらも再帰的であり、どちらも再帰を終了するための明示的なメカニズムを備えていません。私の推測では、無制限の再帰に対するVimの内部テストの1つがトリガーされており、エラーが発生しています。マクロ1がそのようなエラーを生成している場合、そのエラーは@wの直後にラッパーマクロの実行を終了します。

私の提案は、マクロを:exコマンドとして書き直し、実行される行の範囲を制限することによって、マクロが実行される回数を制限することです。例えば:

qw:%s/\s\+$//^Mq
qe:%s/\n\n *}/\r}/^Mq

ここで、^Mは、EnterキーまたはReturnキーを入力することを意味します。私はあなたのラッパーマクロでそれらを一緒にテストしていませんが、私が犯したかもしれない間違いを修正することができると思います。

26
garyjohn

私のために働いたのは、@ PeterRinckerと@garyjohnの回答の組み合わせでした。別に、私は奇妙な問題を抱え続けました。

nnoremap <leader>rt :silent! %s/\s\+$//e<CR>
let @r='\rt'
let @t=':try|silent! exe "norm! @r"|endtry|w^M'

私は思います silent! の中に <leader>rt、およびendtrywの間のパイプ文字がキーでした-endtryが失敗した後に単に改行があります。 trysは、入力しただけで機能しましたが、マクロとして実行すると、検索テキストに関するエラーが見つかりませんでした。

2
Matt

多くのファイル間で繰り返しタスクを実行する必要がある場合、私は日常的にマクロをオンザフライで作成します。私の場合、VIMにNERDtree( http://www.vim.org/scripts/script.php?script_id=1658 )がインストールされており、vsplitウィンドウが作成されます。左側には、現在のディレクトリにあるすべてのファイルのリストがあります。一例では、ファイル内で文字列MY_TESTの最初のインスタンスを見つけ、その行からCUSTOM_PREFIX-というラベルの付いたプレフィックスを削除し、ファイルを保存してから、に移動する必要があります。次。

これが、現在のディレクトリにある約2000個のファイルに対してこのマクロを機能させる方法です。これを行うためにbashスクリプトを書くこともできますが、私の場合、VIMの方が高速です。 +は、同時に押されているキーを示します

# Start recording a macro sequence to register 'A'

qa

# Search silently for the string "MY_TEST"; DO NOT report an error
# if the string could not be found.
:silent! /MY_TEST


# Replace, on just the current line, the string "CUSTOM_PREFIX-", with
# nothing (ie: delete it), and suppress any warning messages if the
# string could not be found on the current line.
:s/CUSTOM_PREFIX-//e


# Now issue some UI commands. CTRL-W then and arrow key lets you hope
# between tabs/splits/windows within vim.

CTRL+W、 

# Scroll down to the next file in the list in NERDtree



# Open the next file

ENTER

# End the macro

q

# Run the macro a thousand times in VIM

1000、@a

お役に立てれば!

1
Cloud