14

Awk を使用できることはわかっていますが、私は Windows ボックスを使用しており、Awk を持っていない可能性のある他のユーザー向けの関数を作成しています。私は C プログラムを書くことができることも知っていますが、私が作成している小さな Vim ユーティリティのためにコンパイルとメンテナンスを必要としないものを持ちたくありません。

元のファイルは次のようになります。

THE DAY WAS LONG 
THE WAY WAS FAST

転置後、次のようになります。

TT
HH
EE

DW
AA
YY

WW
AA
SS

LF
OA
NS
GT

アップデート

4

6 に答える 6

12

これは Vim 言語のコマンドです。したがって、Vim を +python サポート付きでコンパイルする必要はありません。

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 dir 内の新しく作成された .vim ファイルに入れるか、[._]vimrc に入れます。現在のバッファを転置するために
実行する:TransposeBuffer

于 2009-04-01T09:42:24.583 に答える
10

組み込みの多数のスクリプト言語に対する Vim のサポート --例としてPython インターフェイスを参照してください。

適切に変更するだけ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
于 2009-04-01T05:13:33.073 に答える
5

スクリプトがそれを行わない場合は、アクションをレジスターに記録できます (読みやすくするためにキャリッジ リターンが追加されています)。

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

これにより、上記の例、または同じ長さの 2 行の文字列に対して実行できるマクロが得られます。文字列の長さを知るだけでよいので、操作を正しい回数繰り返すことができます

16@a

かなり基本的な解決策ですが、うまくいきます。

于 2009-04-01T10:01:20.153 に答える
1

次の関数は、行数に関係なく、現在のバッファの内容を「転置」するために必要な編集操作を実行します。

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

「ゴルフ」のために、ここにその 1 行バージョンを示します。

let[m,n,@s]=[0,line('$'),"lDG:pu\r``j@s"]|exe'g/^/let m=max([m,col("$")])'|exe'%norm!'.m."A \e".m.'|D'|exe'sil1norm!@s'|exe'%norm!'.n.'gJ'
于 2011-09-06T13:23:13.030 に答える
0

Charles Duffyのコードizip_longestは、次の代わりに使用して短縮/改善できますizip

function! Rotate()
    :py import vim, itertools
    :py vim.current.buffer[:] = [''.join(c) for c in itertools.izip_longest(*vim.current.buffer, fillvalue=" ")]
endfunction
于 2011-09-06T09:58:16.900 に答える
0

それを行うためのvimプラグインを開発しました。ここで見つけることができます。:Transposeファイル全体を転置するために実行します。

于 2012-05-06T12:18:38.533 に答える