選択を外部コマンドの出力で置き換えます


10

ファイルに次のようにXXXX選択したプレースホルダーを含む行があると仮定vします。

XXXX Some other text

どうすれば変更できるだけXXXXのような、外部コマンドの出力でdate +%Y%m%d

私は限りを得ました

:'<,'>!date +\%Y\%m\%d 

しかし、それは行全体を置き換えました。


stackoverflowの上の関連質問:stackoverflow.com/q/8403599/...
Hotschke

回答:


15

CtrlR- を使用して、テキストを削除し、コマンドの出力を挿入できます=

CTRL-R {0-9a-z"%#*+:.-=}                                        i_CTRL-R
                Insert the contents of a register.  Between typing CTRL-R and
                the second character, '"' will be displayed to indicate that
                you are expected to enter the name of a register.
 …
                                                        i_CTRL-R_=
                        '='     the expression register: you are prompted to
                                enter an expression (see expression)

式については、system()関数を使用して外部コマンドを実行できます。

テキストを選択した後、を押しc、次に式として<c-r>=使用system('date +%Y%m%d')します。


1
置換されたテキストと残りの行の間に改行が追加されますね。
muk.li 2016

2
@ muk.liはの出力の一部ですdatesystem('printf %s foo')末尾の改行を出力しないのようなものを試すと、違いがあることがわかります。
muru

4
@ muk.liテキストの日付だけが必要なstrftime場合は、の代わりに使用できる関数がありますsystem('date …')。フォーマット文字列は同じです。
muru

2
選択したテキストを削除する必要はありません。"=system('date +%Y%m%d')p代わりにビジュアル選択で使用できます。
Hauleth 2016

5

カーソルをそのような行に置くと、次のことができます。

  • 0 カーソルを最初の列に置きます。
  • f Space カーソルを最初の空白に置きます。
  • i Enter Esc 行を分割します。
  • l カーソルを1行上に移動します。
  • :.!date +\%Y\%m\%d コマンドを実行します。
  • J 再びラインに参加します。

から:h :visual_example

現在、「:」コマンドは行全体でのみ機能します。行の一部を選択する場合、「:! date」のようなことを行うと行全体が置き換えられます。行の一部だけを置き換えたい場合は、そのマッピングを作成する必要があります。将来のリリースでは、「:」は部分的な行で機能する可能性があります。

詳細についても参照:h visual-operatorsしてください。

このコメントから:visまたはNrrwRgnプラグインを試すこともできます。どちらも問題なく処理できます。(ヒントを提供してくれた@ christian-brabandtに感謝します)。


2

そのような置換の一時的なマッピングを作成します。例えば:

:vnoremap qq c<C-R>=system('wc -c | perl -pe chomp', @")<CR><ESC>

次に、ビジュアルモードでテキストを選択して入力qqすると、コマンド出力に置き換えられます。この例でwc -cは、選択である@"パラメータを処理します。perl -pe chomp出力から末尾の改行を削除するために必要です。


1
このソリューションは、muruの回答のラッパーであり、1回限りの使用法のマッピングを作成することは、最も効率的な方法ではない可能性があることに注意してください。
statox

1

これを試して:

:let @a = system('date +\%Y\%m\%d')[:-2]
:'<,'>g/XXXX/s/XXXX/\=@a/g
  • 最初の行は、dateコマンドの出力をレジスタaに保存し、最後の改行を削除しています。
  • 2行目は、選択内容をグローバルに検査し、XXXXg/XXXX/)を含む行をマークします。
  • のすべてのインスタンスXXXXをレジスタa(s/XXXX/\=@a/g)のコンテンツに置き換えます

参照:h let-@:h :global同様の「サブリスト」セクション:h list-index


0

プラグイン:DrChipによるビジュアルブロックコマンド(vis)

vim8 packpathのインストールvis.vba.gzと依存関係cecutil.vba.gz

# shell brace expansion (bash >=3.0, zsh>=2.6)
$ mkdir -p ~/.vim/pack/manual/start/{vis,cecutil}
$ vim http://www.drchip.org/astronaut/vim/vbafiles/vis.vba.gz
:UseVimball ~/.vim/pack/manual/start/vis
:e http://www.drchip.org/astronaut/vim/vbafiles/cecutil.vba.gz
:UseVimball ~/.vim/pack/manual/start/cecutil

OPの例は

:'<,'>B !date +\%Y\%m\%d 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.