2009-04-01 11 views
12

私はAWKを使うことができますが、私はWindowsの箱に入っています。私はAWKを持っていないかもしれない他の人のための機能を作っています。私はCプログラムを書くことができることも知っていますが、私が作っている小さなVimユーティリティのために何かを維持しコンパイルする必要はありません。Vimでファイルを転記することはできますか?

元のファイルは

THE DAY WAS LONG 
THE WAY WAS FAST 

かもしれないし、それが

TT 
HH 
EE 

DW 
AA 
YY 

WW 
AA 
SS 

LF 
OA 
NS 
GT 

UPDATEなる:ゴルフ規則は、正しい答えを選択するに適用されます。

更新:Pythonのファンは以下のDuffyの答えをチェックしてください。

+0

Pardon - "golf"? –

+2

最低の文字数...最低のスコアが勝利します。 – ojblass

+0

解決策が選択されたテキストのみを転置した場合、それはさらに良いでしょう...しかし、大丈夫、現在の解決策は私のために十分です。 :) –

答えて

12

はVimの言語でコマンドです。だから、+ PythonのサポートでVimをコンパイルする必要はありません。

function! s:transpose() 
    let maxcol = 0 
    let lines = getline(1, line('$')) 

    for line in lines 
     let len = len(line) 
     if len > maxcol 
      let maxcol = len 
     endif 
    endfor 

    let newlines = [] 
    for col in range(0, maxcol - 1) 
     let newline = '' 
     for line in lines 
      let line_with_extra_spaces = printf('%-'.maxcol.'s', line) 
      let newline .= line_with_extra_spaces[col] 
     endfor 
     call add(newlines, newline) 
    endfor 

    1,$"_d 
    call setline(1, newlines) 
endfunction 

command! TransposeBuffer call s:transpose() 

これをvim/pluginディレクトリ内に新しく作成した.vimファイルに入れてください。これをあなたの[._] vimrcに入れてください。
スクリプトはあなたのためにそれをしない場合は、レジスタへのアクションを記録でき

+0

純粋なvimはあなたに頷きを与えます。どうもありがとうございます! – ojblass

+0

私の意見では、不必要に言葉のような解決策です。ところで、技術的に言えば、 '1、$" _ d'はあなたが望むことをしないので、あなたの解決策は機能しません。私は 'sil%d_'としてその行を書いています。 –

+0

@ibなぜあなたはそれを言うのですか? –

10

多くのスクリプト言語のためのVimのサポート - 例としてthe Python interfaceを参照してください。

vim.current.bufferを適切に変更すると設定されています。

もう少し具体的に:ここで

function! Rotate() 
python <<EOF 
import vim, itertools 
max_len = max((len(n) for n in vim.current.buffer)) 

vim.current.buffer[:] = [ 
    ''.join(n) for n in itertools.izip(
     *(n + ' ' * (max_len - len(n)) 
      for n in vim.current.buffer))] 
EOF 
endfunction 
+1

++ oooh - vimがvimscript以上をサポートしていることに気付かなかった!またperl、tcl、ruby - 素晴らしい! – guns

+1

これらのスクリプトはサポートされていますが、デフォルトではサポートされていません。ビルド中にそれらをオンにする必要があります。 –

+0

右。ちょうどすべてのディストリビューションにvim-fullまたはvim-enhancedバージョンがあり、Windows gvimに対してここに投稿した内容をテストしました –

5

現在のバッファに移調する:TransposeBufferを実行し(キャリッジリターンは読みやすくするために追加されます):

qa 
1G0 
xGo<Esc>p 
1G0j 
xGp 
q 

これは与えます上記の例に対して実行できるマクロ、または同じ長さの2行の文字列です。あなたは、操作の時間

[email protected] 

かなり基本的なソリューションの正しい数を反復することができますので、あなただけの文字列の長さを知っておく必要がありますが、それは動作します。

+1

入力ドメインは同じ長さの2行以上になる可能性があります。 – ojblass

0

Charles Duffy's code代わりizipizip_longestを使用し/改善された短縮することができた:

function! Rotate() 
    :py import vim, itertools 
    :py vim.current.buffer[:] = [''.join(c) for c in itertools.izip_longest(*vim.current.buffer, fillvalue=" ")] 
endfunction 
1

次関数カレントバッファの 内容を「転置」に編集操作を必要行います。以下は

fu!T() 
let[m,n,@s]=[0,line('$'),"lDG:pu\r``[email protected]"] 
g/^/let m=max([m,col('$')]) 
exe'%norm!'.m."A \e".m.'|D' 
[email protected] 
exe'%norm!'.n.'gJ' 
endf 

私はそれを行うにはvimのプラグインを開発してきました

let[m,n,@s]=[0,line('$'),"lDG:pu\r``[email protected]"]|exe'g/^/let m=max([m,col("$")])'|exe'%norm!'.m."A \e".m.'|D'|exe'[email protected]'|exe'%norm!'.n.'gJ' 
+0

@ojblass :このスクリプトは、これまでに投稿されたものの中で最も短いVimのみのソリューション(回答を選択する決定的なルールとして宣言した「ゴルフ」の意味)ではありませんか? –

0

、その1ラインバージョンです。あなたはそれを見つけることができますhere:Transposeを実行して、ファイル全体を転置します。

関連する問題