我可以在Vim中转置文件吗?

ojb*_*ass 13 python vim text-parsing text-files

我知道我可以使用AWK,但我在Windows机器上.我正在为可能没有AWK的其他人提供功能.我也知道我可以写一个C程序,但我不想为我正在制作的一个小Vim实用程序创建维护和编译.

原始文件可能是

THE DAY WAS LONG 
THE WAY WAS FAST
Run Code Online (Sandbox Code Playgroud)

它会成为

TT
HH
EE

DW
AA
YY

WW
AA
SS

LF
OA
NS
GT
Run Code Online (Sandbox Code Playgroud)

更新:高尔夫规则适用于选择正确的答案.

更新:Python粉丝应该看看Duffy先生的答案如下.

Myk*_*yev 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()
Run Code Online (Sandbox Code Playgroud)

把它放在vim/plugin dir中新创建的.vim文件中,或者把它放到你的[._] vimrc中.
执行:TransposeBuffer转置当前缓冲区


Cha*_*ffy 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
Run Code Online (Sandbox Code Playgroud)


sea*_*ges 5

如果脚本不为您执行此操作,则可以将操作记录到寄存器(为了便于阅读,添加了回车符):

qa
1G0
xGo<Esc>p
1G0j
xGp
q
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个可以针对上面的示例运行的宏,或者任何相同长度的2行字符串.您只需要知道字符串的长度,这样就可以在正确的时间内迭代操作

16@a
Run Code Online (Sandbox Code Playgroud)

一个相当基本的解决方案,但它有效.