2009-10-06 16 views
19

Ok, załóżmy, że mamy linię tekstu:Zachowanie; powtórzyć ostatnią komendę t przeszkadza mi. Czy możesz pomóc mi to ulepszyć?

[s]tackoverflow rocks

gdzie nawiasy pokazać położenie kursora, w trybie normalnym. Po naciśnięciu tr dostaniesz:

stackov[e]rflow rocks

Teraz część zabawy. Co się stanie, jeśli wciśniesz ;, aby powtórzyć polecenie? Nic! Vim znajduje następny "r" (natychmiast po prawej stronie kursora) i pozycjonuje się tuż obok (tam, gdzie już był).

wolałbym że ; przesunąć kursor do tej pozycji:

stackoverflow[ ]rocks

ten może zostać osiągnięty za pomocą l przenieść jeden znak w prawo przed naciśnięciem ;, ale dodatkowy krok jest irytujące. Jest podobny problem z T, ale nie z f i F. Czy jest jakiś sposób, aby ustawić ; zachowywać się tak, jak chcę z t i T?

Odpowiedz

9

Może to nie jest odpowiedź, której szukasz, ale nie mogłem się oprzeć napisaniu skryptu VIM do tego. I umieścić go w moim .vimrc i działa dla mnie:

map ; :call Semicolon()<CR> 
function Semicolon() 
    let s:pos1 = getpos(".") 
    normal! ; 
    let s:pos2 = getpos(".") 
    if s:pos1 == s:pos2 
     normal! 2; 
    endif 
endfunction 

Podstawowym założeniem jest to, że ; nie będzie przejść do następnego meczu, ale 2; będzie (jeśli istnieje dopasowanie). Skrypt obsługuje ; po jednym z tTfF. Najłatwiejszym sposobem implementacji polecenia , jest napisanie podobnej funkcji.

EDIT Zmieniono skrypt po Luca doskonałą propozycją

EDIT2

OK, te rzeczy są zawsze trudniejsze niż się początkowo wydaje.Obecne mapowanie ma następujące problemy:

  1. Załóżmy, że wykonałeś wyszukiwanie takie jak tr powyżej. Co teraz powinien zrobić d; lub c;? O ile mi chodzi, powinny one usunąć lub zmienić aż do pierwszego r, a nie drugiego. Można to rozwiązać, wykonując tylko mapowanie dla trybu normalnego i wizualnego, a nie tryb pracy operatora.
  2. Bieżące mapowanie nie działa w trybie wizualnym. tzn. po wpisaniu v;;;; po pierwszym ; edytor nie jest już w trybie wizualnym (z powodu :call). Można to rozwiązać, wywołując funkcję za pomocą @= zamiast :call.

Więc teraz ja skończyć z następujących w moim .vimrc (ja również jedną funkcję , i ;):

" Remap ; and , commands so they also work after t and T 
" Only do the remapping for normal and visual mode, not operator pending 
" Use @= instead of :call to prevent leaving visual mode 
nmap ; @=FixCommaAndSemicolon(";")<CR> 
nmap , @=FixCommaAndSemicolon(",")<CR> 
vmap ; @=FixCommaAndSemicolon(";")<CR> 
vmap , @=FixCommaAndSemicolon(",")<CR> 
function FixCommaAndSemicolon(command) 
    let s:pos1 = getpos(".") 
    execute "normal! " . a:command 
    let s:pos2 = getpos(".") 
    if s:pos1 == s:pos2 
     execute "normal! 2" . a:command 
    endif 
    return "" 
endfunction 
+2

Preferuj "normalny!"; Do normalności _;" –

+0

@ Luc - Dobra sugestia. Właściwie szukałem takiej opcji, ale tęskniłem. Będę edytować mój skrypt –

+0

To jest doskonałe dzięki! Z ciekawości, dlaczego uważasz, że nie jest to odpowiedź, której szukam? Czy korzystanie z takich skryptów jest wadą? –

2

2 komentarze 1: Czy umiesz mapować; do polecenia lt_, którego szukasz? 2: Dlaczego zamiast tego użyj 2tr lub/R, a następnie n?

+0

Nie jestem pewien, jak remap; ponieważ chcę tego do różnych rzeczy w zależności od tego, jakie polecenie t/T/f/Fx zostało ostatnio wydane. Poza tym generalnie nie lubię ntx, ponieważ nie lubię liczenia znaków, aby wiedzieć, czego użyć. Uważam, że po prostu wciskanie klawisza "powtórzyć", aż dojdę tam, gdzie idę, jest mniej zakłócające mój przepływ. To naprawdę drobny problem, a może powinienem po prostu/zamiast: P. –

+0

Zgadzam się, że to denerwujące - z pewnością istnieje wiele powodów, dla których warto użyć tTfF zamiast /. Nie wiem, dlaczego zachowuje się w ten sposób - domyślam się, że zaprojektowano go tak, aby czuć się dobrze, jeśli dużo się przemieszczasz, ponieważ wydałeś ostatnie polecenie tT, więc nie chcesz zakładać, że już zauważyłeś dopasuj bezpośrednio przed kursorem. – Cascabel

1

Wygląda na to, że problem dotyczy raczej zachowania t niż ;.

W przykładzie, powiedzmy, że zaczynają się od „E”:

stackov[e]rflow rocks 

Zgaduję, że (rozsądnie) oczekiwać tr do skoku naprzód do [ ]rocks raczej niż pobyt na miejscu.

Jeśli tak, to powinieneś opuścić ;, tak jak jest, a może zmienić remanent t na lt lub coś podobnego.

+0

Dobra uwaga. Z tego, co potrafię powiedzieć, ";" jest kimś zaimplementowanym oddzielnie od komend 'tTfF' - nawet jeśli zmienię' t' tak jak sugerujesz, to nie zmienia to zachowania ';'. –

28

Począwszy od wersji Vima 7.3.235 ten kłopot został zmieniony. Domyślnym ustawieniem jest zachowanie, którego się spodziewałeś: ; przesuwa kursor na prawo przed drugim "r".

To była zapowiedź patch:

patch 7.3.235
Problem: ";" utknie w poleceniu "t", nie jest użyteczne.
Rozwiązanie: Dodaj ";" flaga w "cpo". (Christian Brabandt)

Stare zachowanie zostało zdegradowane do opcji zgodności. Możesz go przywrócić z :set cpo+=;. Zobacz :h cpo-;.

+0

Dzięki za heads up, @glts! –

Powiązane problemy