編集する
「sub-replace-expression」を使用すると、1つの式でこれを行うことができます。それに関する情報については下を見てください。
/編集
ここでの問題は、2つの異なることを実行したいということです。
試合全体を操作する(つまり、で囲む[]
)
マッチ内の各アイテムを操作します(つまり、それらをで囲みます'',
)。
あなたはどちらかを簡単に行うことができます:
:s/\(.\+\n\)\+/[&]/
:%s/\(.\+\)\n/'\1', /
しかし、私が知る限り、1回の操作で両方を行う方法はありません。私は次のようなもので適切な出力を得ようとしました:
:s/\(\(.\+\)\n\)\+/[\2]/
しかし、もちろん、これの問題は\2
、2番目のメモリの括弧のセットの最後の一致のみに一致し、\(\)
その前には何も「覚えていない」ことです。つまり、最後の行だけで終わります。
:s///
事実の前後の改行を取り除くために、追加のコマンドでいくつかの前後処理を行うことをお勧めします。これが私が思いついたものです
function! FormatExpression()
.,/\n^$/s/\(.*\)\n/'\1', /
s/\(.*\), /[\1]/
endfunction
1行目(改行を削除)
.,/\n^$/
これは、検索と置換の範囲修飾子です。これがないと、コマンドはファイル全体を破壊します。現在、現在の行から.
次の空白行に移動し\n^$
ます。どのように分割しようとしていたのかはわかりませんが、停止するように指示する方法が必要です。
s/
検索と置換コマンドの始まり
\(.*\)\n
行全体に一致しますが、改行なしで一部のみを保存します。
'\1',
行を一重引用符で囲まれた一致に置き換え、カンマを追加します。
2行目(括弧で囲む)
\(.*\),
行全体と一致しますが、最後のコンマとスペースは一致しません
[\1]
ブラケットで囲み、余分な終了カンマとスペースも削除します。
これからも調べていきますが、今のところ、1つの表現では実現できないと思います。:(
編集:
これを1つの式で行う方法を見つけました!内部的にはこれは実際には2個の置換であるが、それはある技術的に一つの式。これが私が思いついたものです:
:s/\v((.+\n)*.+)\n/\= "['" . substitute(submatch(1), '\n', "', '", 'g') . "']" /
:s///
:置換する
\v((.+\n)*.+)\n
:基本的に、次の空白以外の行をすべてまとめ、最終行を除いてすべて保存します \n
\=
置換で式を使用できます(を参照:h sub-replace-expression
)
substitute(submatch(1)...)
:格納され\n
ているすべてを', '
"['" . ... . "']"
:プリペンド['
とアペンド']
これはカーソルの位置から始まり、空白行(^\n
)が見つかるまで続きます。最後の部分\n
を取得しないことが重要です。そのビットがないと、最後に不要な追加部分が残ってしまうからです',
。
これは、前の2つの式の答えよりも複雑だと考える人もいます。しかし、実際には1つの式で実行できるため、これを追加して追加すると思いました。:)
:'<,'>s/\v(.*)\n/'\1', / | s/\v(.*), /[\1]/
あなたは視覚的なマッピングにこれを変換することもできますxnoremap ,x :s/\v(.*)\n/'\1', / <Bar> s/\v(.*), /[\1]/<CR>
し、多分あれば、通常のマッピングに式は段落内にあります:nnoremap ,x :'{+1,'}-1s/\v(.*)\n/'\1', / <Bar> s/\v(.*), /[\1]/<CR>
ここでのマッピングはになります,x
。