私は.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
\x0a
execute
! printf '=%.0s' {1..10}
%
答え2
代わりに地図を検討してください。現在行を強調表示する地図があります。
map <Leader>= "ayy"ap:s/./=/g<CR>:nohlsearch<CR>
私の地図リーダーは、=
通常モードで現在の行に下線を引くためのものです==。
答え3
何をしたいのか明確ではないので:
現在の行を
=
列80に埋めます。map _= :execute 'normal A' . repeat("=", (80-col("$")+1))<cr>
現在の行に下線を引きます。
map _= :co.<cr>Vr=
区切り記号を追加(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()
内蔵。