2014-09-04 23 views
5

mieć taką linię:Vim odpowiednik "tr" polecenia

xxAyayyBwedCdweDmdwCkDwedBAwe 
;;;; cleaner example 
__A__B__C__D__C_D_BA_ 

chcesz wymienić np ABCD do PQRT dostać

__P__Q__R__T__R_T_QP_ 

np quivalent następnego bash lub Perl tr

tr '[ABCD]' '[PQRT]' <<<"$string" 

Jak to zrobić w "vim"? (VIM - Vi IMproved 7.4 (2013 10 sierpnia skompilowany 9 maja 2014 12:12:40))

+6

Czy to oszustwo? '%! tr 'ABCD' 'PQRT'' – Kent

+0

@Kent heh ... wywołanie powłoki? działa, ale ma sporadyczne problemy z ucieczką metaznaków, szczególnie gdy chce 'tr'' [] 'na'() 'i takie ... – kobame

+1

wywołanie'! tr' jest tylko na krótkie cmd. 'tr()' jest lepsze, szczególnie gdy '(zewnętrzny) tr' nie jest dostępny. jednak z '! tr','() lub [] 'nie będzie problemem. to nie jest wyrażenie regularne. – Kent

Odpowiedz

9

Można użyć funkcji tr() połączeniu z :global

:g/./call setline(line('.'), tr(getline('.'), 'ABCD', 'PQRS')) 

Jest łatwy do przystosowania go do Komenda :%Tr#ABCD#PQRS.

:command! -nargs=1 -range=1 Translate <line1>,<line2>call s:Translate(<f-args>) 

function! s:Translate(repl_arg) range abort 
    let sep = a:repl_arg[0] 
    let fields = split(a:repl_arg, sep) 
    " build the action to execute 
    let cmd = a:firstline . ',' . a:lastline . 'g'.sep.'.'.sep 
     \. 'call setline(".", tr(getline("."), '.string(fields[0]).','.string(fields[1]).'))' 
    " echom cmd 
    " and run it 
    exe cmd 
endfunction 
+0

Świetnie! Dla mnie wystarczy pierwsza linia. :) Wielkie dzięki. – kobame

+1

Nice. Nie potrzebujesz ': g /./' BTW, ponieważ ': call' może zająć sam zakres :. –

+0

Oh. Nie wiedziałem o tym. Dzięki. –

Powiązane problemy