2012-03-24 18 views
1

、私はVimのスクリプトハックを使用しますが、特定の基本* IXツールを再利用しようとしないソリューションを求めています。 Vimの内部では、スクリプトのような内部のものを使ってカラムインクリメントを得るためのソリューションを求めています。Vim:Columnvise内部と外部のインクリメント?外のことで

1   1 
1   2 
1   3 
1 ---> 4 
1   5 
1   6 
.   . 
.   . 

Vimは列万力インクリメント、VisIncrを行うスクリプトを持っています。それはおそらく-車輪の再発明ビットを味わう、およそ50/50アップとダウンを集めています。このようなスクリプトを使わずにVimで列を増やす方法は?次に、もう1つの質問は、Vimを使用せずに/列外で列を増やす方法ですか?ほとんどの、エレガントな再利用可能な、好ましくは、小さな

はレースに勝利します!

+0

答えは、操作の範囲によって異なります。この列は唯一のコンテンツであるかどうかファイルで?それとも、段落か、任意の範囲の行ですか?また、これらの行には元々いくつかの数字(上記の例では '1'など)または追加のテキスト(またはその両方)が含まれていますか?番号を挿入するか既存のものを変更する必要がありますか? –

+0

回答が解決する必要があるタスクを正確に記述してください。どのような具体的な要件がありますか?リンクされたスクリプト(またはその機能の特定の部分、それを指定する)を最初から再実装することをお勧めしますか? –

+0

私が提案した関数は、参照スクリプトの動作(列方向のビジュアル選択の使用を含む)に従います。なぜならあなたはどんな振る舞いを正式に*定式化することを拒否しているからですか? –

答えて

3

私は簡単なマクロが

"a yyp^Ayy 

をするでしょうし、それを再生したり、それを再生するマップ、スクリプトの必要性が表示されません。もちろん

、私は完全に質問を誤解可能性は技術の

+0

@hhh - いいえ、2番目の部分だけがマクロ自体の一部です。最初の部分は、ちょうど私が "a"という名前のマクロでそれを記録したという事実によるものです。だから基本的にはラインをヤンクし、それを下に貼り付け、一つずつ増やし、もう一度ヤンクします。 – Rook

+0

少し改善しました。最初の行に "1"を入力します。 'qayyp^Aq'でマクロを記録します。それを5回再生する: '5 @ a'。 – Hong

3

最適な選択は非常変換の実際の状況 に依存...常にあります。 実装に影響を与える少なくとも2点のバリエーションがあります。

  1. 上で動作する行がファイル内の唯一のものであるかどうか?そうでない場合、 は、文脈によって規定される線の範囲である(すなわち、それは段落のように、ブランク 行により分離)、またはそれは任意であり、 ユーザによって指定されなければなりませんか?

  2. それらのラインが既に変更またはタクト内の行のテキストを残し、新しいものを挿入することが必要である しなければならない数字が含まれていますか?

たちは柔軟なソリューションを構築 にしようと下に、これらの質問に答えるための情報がないので。

一般的な解決策は、ユーザによって指定された範囲内の行 の始まりで動作置換です。ビジュアルモードでは、おそらくラインの任意の範囲を選択する最も簡単な方法 あるので、我々は 範囲の境界が視覚的に選択することによって定義されていることを、ここで想定しています。バッファ内のすべての行に番号を付ける必要がある場合は、次のよう

:'<,'>s/^\d\+/\=line(".")-line("''")+1/ 

、コマンドが を簡素化することができます。

いずれの場合においても
:%s/^\d\+/\=line('.')/ 

、数は単に(既に存在するものを変更することなく) 行の始まりに挿入する必要がある場合、一方が^\d\+から^に パターンを変更し、必要に応じて追加することができセパレータ:

:'<,'>s/^\d\+/\=(line(".")-line("''")+1).' '/ 

又は

:%s/^/\=line('.').' '/ 

それぞれ。

コマンドラインツールを使用したソリューションの場合は、Sedのようなストリーム や、AWKなどのテキスト抽出およびレポートツールを使用することを検討できます。

、セッドを使用して、ファイル内の各行に番号をAWKで同じことを行うためには、コマンド

$ sed = filename | sed 'N;s/\n/ /' 

を実行し、コマンドに

簡単modfiedすることができ
$ awk '{print NR " " $0}' filename 

を使用するには特定の条件を満たす行の特定の範囲に番号を付けることを制限してください。 たとえば、次のコマンドは、 行を2〜8行に番号付けします。 質問文の中でリンクされたスクリプトからのもののようなコマンドをどのように興味を持っ

$ awk '{print (2<=NR && NR<=8 ? ++n " " : "") $0}' filename 

1が 参考に、次のコマンドを使用することができ、実装されています。

vnoremap <leader>i :call EnumVisualBlock()<cr> 
function! EnumVisualBlock() range 
    if visualmode() != "\<c-v>" 
     return 
    endif 
    let [l, r] = [virtcol("'<"), virtcol("'>")] 
    let [l, r] = [min([l, r]), max([l, r])] 
    let start = matchstr(getline("'<"), '^\d\+', col("'<")-1) 
    let off = start - line("'<") 
    let w = max(map([start, line("'>") + off], 'len("".v:val)')) 
    exe "'<,'>" 's/\%'.l.'v.*\%<'.(r+1).'v./'. 
    \ '\=printf("%'.w.'d",line(".")+off).repeat(" ",r-l+1-w)' 
endfunction 
+0

Vimでカウンタベース置換を実装するより一般的な手法については、私の[answer](http://stackoverflow.com/a/8074421/254635)の「[Vimの使用法、見つかったパターンの数を格納していますか?](http://stackoverflow.com/q/8073780/254635) " –

+0

@hhh:質問文にリンクされているスクリプトを見てきました。しかし、そのコードはそれ自身で質問を述べません。あなたはそのスクリプトの代替実装を提案するよう求めていますか?理想的なソリューションが何をすべきか(または、そのスクリプトのどの機能が模倣すべきか)について詳しく説明してください:可能な解決策のすべての要件を質問に明確に記載する必要があります。 –

+0

@hhh:どういう意味ですか?なぜあなたは明確化の質問に答えることができないのですか?助けを得るには、達成したいことを説明してください。 (ところで、答えの更新を見て、おそらく、あなたが実装しようとしているものに近いです。) –

1

あなたは1 2 3 4 ...1 1 1 1 ...を変更したい場合。 (これらの数字は、別の行にする必要があります。)1 1 1 1 ...のいくつかは、同じ行にある場合

:let i=1 | g/1/s//\=i/g | let i+=1 

:let g:i = 0 

:func! Inc() 
: let g:i+=1 
: return g:i 
:endfun 

:%s/1/\=Inc()/g