vimが%をファイル名に置き換えることを防ぐ

vimが%をファイル名に置き換えることを防ぐ

私は.vimrcで遊んでいますが、次のアイデアがありました。次の機能があります。

function Fill_line ()
       execute "! printf '=%.0s' {1..10}"
endfunction

私の結果は次のとおりです

Hello =test.cpp.0s

私はそれになりたいです:

==========

私もこれを試しました:

function Fill_line ()
       execute "! printf '=\%.0s' {1..10}"
endfunction

%私の質問は、文字をファイル名に置き換えないように文字をエスケープする方法です。これは、他の複雑な機能を単純化した例であることに注意してください。

答え1

2つのバックスラッシュを使用するか、単一引用符を使用する必要があります。

execute "! printf '=\\%.0s' {1..10}"

execute '! printf "=\%.0s" {1..10}'

二重引用符で囲まれた文字列()を解析するとき、vimが知っているエスケープ文字(または)を"..."開始しないすべてのバックスラッシュを削除するため、コマンドに渡された文字列は最終的になり、次のようになるため、これが必要です。現在のファイル名に置き換えられます。\n\x0aexecute! printf '=%.0s' {1..10}%

答え2

代わりに地図を検討してください。現在行を強調表示する地図があります。

map <Leader>= "ayy"ap:s/./=/g<CR>:nohlsearch<CR>

私の地図リーダーは、=通常モードで現在の行に下線を引くためのものです==

答え3

何をしたいのか明確ではないので:

  1. 現在の行を=列80に埋めます。

    map _= :execute 'normal A' . repeat("=", (80-col("$")+1))<cr>
    
  2. 現在の行に下線を引きます。

    map _= :co.<cr>Vr=
    
  3. 区切り記号を追加(80文字)

    map _= :call append(line('.'), repeat("=", 80))<cr>
    

答え4

他の人がすでに正しい答えを持っているので、%Vimが現在のファイル名に置き換えられないようにエスケープする必要があります。:help cmdline-special)、二重引用符で囲まれた文字列内では、バックスラッシュを2倍にする必要があります。

しかし、Vimは以下を提供します。:help shellescape()あなたのためにタスクを実行する機能(そして考慮みんな特殊文字! ):

execute "! printf " . shellescape("=%.0s",1) . " {1..10}"

ここであなたが必要です各パラメータを個別にエスケープします。;printfこれはベアメタルには必要ではなく、{1..10}拡張のためにシェルから引用しないでください。

printf特に費用を支払う必要はありません。 Vimはprintf()内蔵。

関連情報