2013-06-27 17 views
6

Chciałbym użyć vim search-and-replace, aby zastąpić wszystkie "z" i na odwrót.Czy istnieje sposób, aby osiągnąć to w jednym kroku? Myślę o czymś takim:Warunkowe zastąpienie w vim

:s/\("\|'\)/\1=="?':"/ 

Gdzie oczywiście \1=="?':" -part jest coś, co działa w vim

Dzięki z góry

Odpowiedz

14

To sprawa dla :help sub-replace-special:

:s/["']/\=submatch(0) == '"' ? "'" : '"'/g 

Dopasowuje dowolny z tych dwóch cytatów (w prostszy sposób z [...]), a następnie używa operatora potrójny włączyć każdy cytat w swoje przeciwieństwo. (W przypadku bardziej złożonych przypadków można użyć wyszukiwania w słowniku).

+0

Niezły! Dziękuję Ci bardzo! – Vince

+0

Czy dopasowane wzorce '\ 1',' \ 2', ... mogą być używane w wyrażeniach zastępujących?Próbowałem, ale odwrotne ukośniki są wstawiane dosłownie. –

+1

@EnricoMariaDeAngelis: Tak, przez 'submatch (1)' itp .; literał '\ 1' nie działa tutaj. –

0

Prawdopodobnie najbardziej leniwym/najprostszy sposób:.!

:%s/'/__/g | %s/"/'/g | %s/__/"/g 

Trzy podstawowe kroki połączone w jedną linię:

  1. przekształcenia ' do __ (lub coś losowego)
  2. przekształcenia " do '
  3. konwertować __ do "

następnie połączyć je z symbol |.

Jestem pewien, że niektórzy czarodzieje vim będą mieli lepsze rozwiązanie, ale to zadziałało.

+0

myślałem o tym, a ja z pewnością mógłby to zrobić, ale vim jest potężny, a ja jestem tylko ciekaw, czy istnieje jeden krok rozwiązanie za ten problem ;-) – Vince

+0

Vim jest potężny. Jestem pewien, że ludziom będzie jeszcze łatwiej. – jahroy

3

Innym podejściem (bardziej odpowiednim do skryptowania) jest użycie wbudowanej funkcji tr(). Aby zastosować go w buforze, getline()/setline() jest stosowany:

:call setline('.', tr(getline('.'), "'\"", "\"'")) 
2

Można to zrobić łatwo za pomocą wtyczki abolish.vim.

Abolish.vim ma polecenie :Subvert, które daje inne podejście do wyszukiwania i zastępowania w swoim własnym małym DSL.

:%S/{\",'}/{',\"}/g 

Wtyczka ta otrzymała specjalne wyróżnienie posiadania trzyczęściowy screencast na Vimcasts.org dedykowany do niego: one, two, three.

+0

Co jest z ucieczką '\" ', to jest wysoce nieintuicyjne ?! (Otrzymuję' E64' kiedy to usuwam. –

3

moc narzędzi UNIX;)

:%!tr "'\"" "\"'"