2009-04-01 3 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 

업데이트 될 것입니다 : 골프 규칙은 정답을 선택 적용됩니다.

업데이트 : 파이썬 팬은 아래의 Mr. Duffy의 답변을 확인해야합니다.

+0

"골프"? –

+2

최저 문자 수 ... 가장 낮은 점수가 승리합니다. – ojblass

+0

솔루션이 선택한 텍스트 만 바꾸면 더 좋았을 것입니다 ...하지만, 현재 해결책은 저에게 충분합니다. :) –

답변

12

는 빔 언어의 명령입니다. 따라서 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 파일이 넣어 또는 [._]의 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

입력 영역은 같은 길이의 두 줄 이상일 수 있습니다. – ojblass

0

Charles Duffy's codeizip_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 
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 

다음은

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

나는 그것을 할 수있는 정력 플러그인을 개발했습니다, 그 한 줄 버전입니다. 당신은 그것을 here 찾을 수 있습니다. :Transpose을 실행하여 전체 파일을 조 변경하십시오.

관련 문제