2

ファイルパスから情報を抽出し、それを置換文字列の一部として使用したいと思い、頭を悩ませ、何度も試してみましたが、次の作品しか見つかりませんでした

let spd = split(expand('%:p'),"/")
%s/to_be_replaced/\=spd[-2]/g

2 つのコマンドを 1 つにマージしたい

%s/to_be_replaced/\=split(expand('%:p',"/"))[-2]/g

しかし、うまくいきません。タブモードで複数のファイルを扱っているので、2コマンド方式は実はかなり不便です。さらに、要件を満たしていないため、

%s/to_be_replaced/some_string\=spd[-2]more_string/g

も間違っています。それで、解決策またはそれを行うためのより迅速な方法があるかどうか疑問に思っていますか?

4

2 に答える 2

3

Try other delimit (such as @)

%s@to_be_replaced@\=split(expand('%:p'),'/')[-2]@g

If you want to embed expr insider string:

%s@to_be_replaced@\=printf('some_string%smore_string', spd[-2])@g
于 2013-10-15T03:14:57.203 に答える
0

複数のバッファーに対してこれを呼び出さない限り ( :bufdoet al.)、式はバッファーに対して一定です。したがって、次の方法でコマンドラインに文字通り挿入できます<C-r>=

:%s/to_be_replaced/<C-r>=split(expand('%:p'),"/")[-2]<CR>/g

問題の説明

元の試みが機能しない理由は、次の場所で説明されてい:help sub-replace-expressionます。

注意: 分離文字は式に現れてはなりません! 「@」や「:」などの文字の使用を検討してください。

kev が指摘したように、他の半角文字は使用できますが、英数字、'\'、'"'、または '|' は使用できません。

于 2013-10-15T08:11:19.820 に答える