2009-11-05 16 views
12

Jak mogę odwrócić słowo w Vimie? Korzystnie z regex lub poleceń normalnym trybie, ale inne metody są zbyt mile widziane:Odwróć słowo w Vim

słowo => drow

Dzięki za pomoc! PS: Jestem w systemie Windows XP

Python jest obsługiwany w moim vimie, ale nie w Perlu.

+0

Widzę tę funkcję bardzo często. Dokładnie: dlaczego tego potrzebujesz? ;) – wishi

+2

Witam @ Wishi_! Moja dziewczyna może bardzo szybko odwrócić słowa i chcę to sprawdzić :-) – Jogusa

Odpowiedz

2

jeśli wersja Vima wspiera go można zrobić vw\is lub viw\is (umieścić kursor na pierwszej literze słowa przed wpisaniem polecenia) ... ale miałem dużo problemów z kompatybilnością z tym. Nie wiem, co musi zostać skompilowane lub włączone, ale działa to tylko czasami.

EDIT:

\is jest:

:<C-U>let [email protected]<CR> 
\ :let [email protected]"<CR> 
\ gv"ay :let @a=substitute(@a, '.\(.*\)\@=', '\[email protected][strlen(submatch(1))]', 'g')<CR> 
\ gvc<C-R>a<Esc> :let @a=old_reg_a<CR> 
\ :let @"=old_reg<CR> 

nie pamiętał, skąd ono pochodzi, ale wyszukiwarka google przyszedł ten artykuł na vim.wikia.com. Co pokazuje to samo, więc myślę, że to wszystko.

+0

Hmm, to nie działa dla mnie, jeśli wpiszesz "map", co masz \ mapowałeś? – Benj

4

Zakładając masz perla wsparcia wbudowany w vim, można to zrobić:

command! ReverseWord call ReverseWord() 
function! ReverseWord() 
perl << EOF 
    $curword = VIM::Eval('expand("<cword>")'); 
    $reversed = reverse($curword); 
    VIM::Msg("$curword => $reversed"); 
    VIM::DoCommand("norm lbcw$reversed"); 
EOF 
endfun 

i potencjalnie wiązać że na naciśnięcie klawisza tak:

nmap ,r :ReverseWord<CR> 
+0

Hmm, właśnie uświadomiłem sobie, że to nie działa, jeśli jesteś na pierwszej literze słowa, musisz być na liście jeszcze dwa. – Benj

+0

OK, naprawiłem to i zredagowałem moją odpowiedź, w zasadzie potrzebowałem normę lbcw nie tylko bcw – Benj

+0

To nie wydaje się działać dla mnie, może perl nie jest obsługiwany. Ale python jest obsługiwany! Dzięki za twój wysiłek. – Jogusa

1

Jeśli masz trochę czasu na twoich rękach możesz się tam przebić przez iteracyjną transpozycję znaków (xp) ...

3

Nie mam Pythona obsługiwanego w moim VIM, ale wygląda na to, że byłoby to całkiem proste w Pythonie. This article wydaje się dobrym wyjaśnieniem, jak używać Pythona w vim i zgaduję, że zrobisz coś takiego:

:python 'word'[::-1] 

W artykule wskazano, że wynik pojawi się na pasku stanu, który byłby zakaz -optymalny, jeśli próbujesz zastąpić ciąg znaków w dokumencie, ale jeśli chcesz tylko sprawdzić, czy twoja dziewczyna prawidłowo odwraca struny w głowie, powinno to być w porządku.

6

Oto kolejny (pythonic) rozwiązanie oparte na, jak to działa:

:echo join(reverse(split('hello', '.\zs')), '') 
olleh 

Jeśli chcesz zastąpić wszystkie słowa w buforze,

:%s/\(\<.\{-}\>\)/\=join(reverse(split(submatch(1), '.\zs')), '')/g 

Działa tworząc najpierw listę znaki w słowie, które są odwrócone i połączone, aby utworzyć słowo. Polecenie zastępcze znajduje każde słowo, a następnie przekazuje je do wyrażeń i używa wyniku jako zamiennika.

1

Cóż, można użyć samego Pythona do odwrócenia linii za pomocą polecenia filtru.Powiedz, że napisałeś:

Python 

Możesz go cofnąć, wystawiając.

:1 ! python -c "print raw_input()[::-1]" 

a tekst zostanie zastąpiony stać:

nohtyP 

„1” na polecenie mówi vi wysłać wiersz 1 do rachunku Pythona, które realizujemy: „print raw_input() [:: - 1] ". Więc jeśli chcesz, aby inna linia była odwrócona, wyślesz ten numer linii jako argument. Instrukcja Pythona odwraca linię danych wejściowych.

0

Jeśli masz zainstalowane rev (np. Przez MSys lub Cygwin), to naprawdę nie jest to takie trudne.

Wybierz, co chcesz, aby odwrócić i filtr (%! <cmd>) to:

:%! rev 

Te rury Twój wybór do swojej skorupy podczas przejazdu to polecenie.