2009-10-06 3 views
19

Okay, nehmen wir an eine Textzeile haben:Das Verhalten von; das letzte t-Kommando zu wiederholen stört mich. Kannst du mir helfen, es besser zu machen?

[s]tackoverflow rocks

wo die Klammern die Position des Cursors zeigen, im normalen Modus. Nach tr drücken, erhalten Sie:

stackov[e]rflow rocks

Nun zum spaßigen Teil. Was passiert, wenn Sie ; drücken, um den Befehl zu wiederholen? Nichts! Vim findet das nächste 'r' (unmittelbar rechts vom Cursor) und positioniert sich direkt links davon (wo es bereits war).

Ich würde es vorziehen, dass ; Voraus der Cursor auf diese Position:

stackoverflow[ ]rocks

Dies wird durch l mit erreicht werden kann, um ein Zeichen nach rechts zu bewegen, bevor ; drücken, aber der zusätzliche Schritt ist irritierend. Es gibt ein ähnliches Problem mit T, aber nicht mit f und F. Gibt es eine Möglichkeit, ; so zu verhalten, wie ich es möchte mit t und T?

Antwort

9

Vielleicht ist es nicht die Antwort, die Sie suchen, aber ich konnte nicht widerstehen, ein VIM-Skript dafür zu schreiben. Ich habe es in meinem .vimrc und es funktioniert für mich:

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

Die Grundidee ist, dass ; nicht an das nächste Spiel bewegen, aber 2; wird (wenn es eine Übereinstimmung). Das Skript unterstützt ; nach einer der tTfF. Die einfachste Möglichkeit, den Befehl , zu implementieren, besteht darin, eine ähnliche Funktion dafür zu schreiben.

EDIT das Skript nach Lucs ausgezeichneter Vorschlag Changed

EDIT2

OK, sind diese Dinge immer schwieriger, als ich denke, ursprünglich.Die aktuelle Zuordnung weist die folgenden Probleme auf:

  1. Angenommen, Sie haben eine Suche wie tr oben durchgeführt. Was nun sollte d; oder c; tun? Soweit es mich betrifft, sollten sie bis zur ersten r nicht die zweite löschen oder ändern. Dies kann dadurch gelöst werden, dass nur das Mapping für den normalen und den visuellen Modus durchgeführt wird, nicht für den Modus "Operator anstehend".
  2. Das aktuelle Mapping funktioniert im visuellen Modus nicht. h., wenn Sie v;;;; nach dem ersten ; eingeben, befindet sich der Editor nicht mehr im visuellen Modus (wegen :call). Dies kann durch Aufrufen der Funktion mit @= anstelle von :call gelöst werden.

So jetzt habe ich mit den folgenden in meinem .vimrc am Ende (Ich habe auch eine Funktion für , und ;):

" 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

Bevorzugen "normal!;" zu "normalem _;" –

+0

@Luc - Guter Vorschlag. Ich habe nach einer solchen Option gesucht, aber verpasst. Ich werde mein Skript bearbeiten –

+0

Das ist perfekt, danke! Aus Neugier, warum hast du gedacht, es wäre nicht die Antwort, nach der ich suche? Gibt es einen Nachteil, Skripte wie diese zu verwenden? –

2

2 Kommentare eins: Können Sie zuordnen; nach dem lt_ Befehl, den du suchst? 2.: Warum nicht 2tr oder/r verwenden, gefolgt von n stattdessen?

+0

Ich bin mir nicht sicher, wie neu zu ordnen; weil ich es zu verschiedenen Dingen abhängig davon, was t/T/f/Fx Befehl zuletzt ausgegeben wurde. Außerdem mag ich im Allgemeinen nicht ntx, weil ich Zeichen nicht gern zähle, um zu wissen, was n zu verwenden ist. Ich finde, dass das Drücken einer "Wiederholungs" -Taste, bis ich dahin komme, wo ich hingehe, weniger störend für meinen Fluss ist. Das ist wirklich ein ziemlich kleines Problem, und vielleicht sollte ich nur/stattdessen: P. –

+0

Ich stimme zu, dass es nervig ist - es gibt definitiv viele Gründe, tTfF anstelle von/zu verwenden. Ich bin mir nicht sicher, warum es sich so verhält - meine beste Vermutung ist, dass es sich richtig anfühlt, wenn man sich seit dem letzten tT-Befehl viel bewegt hat, damit man nicht davon ausgehen kann, dass man das schon bemerkt hat match direkt vor dem Cursor. – Cascabel

1

Es klingt wie Ihr Problem ist mehr mit dem Verhalten von t anstatt ;.

In Ihrem Beispiel können sagen, Sie ‚e‘ beginnen:

stackov[e]rflow rocks 

Ich vermute, Sie würden (vernünftigerweise) erwarten tr uns auf [ ]rocks zu springen, anstatt an Ort und Stelle zu bleiben.

Wenn ja, sollten Sie ; unverändert lassen und vielleicht t zu lt oder etwas neu zuordnen.

+0

Guter Punkt. Von dem, was ich sagen kann, ist ';' jemand, der getrennt von den 'tTfF'-Befehlen implementiert wird - selbst wenn ich 't' neu anlege, wie Sie vorschlagen, ändert sich das Verhalten von'; 'nicht. –

28

Ab Vim Version 7.3.235 diese Verärgerung geändert wurde. Jetzt ist das Standardverhalten das Verhalten, das Sie in erster Linie erwartet hatten: ; lässt den Cursor direkt vor dem zweiten "r" springen.

Dies war der Patch-Ankündigung:

-Patch 7.3.235
Problem: ";" bleibt auf einem "t" -Befehl stecken, es ist nicht sinnvoll.
Lösung: Fügen Sie das ';' Flagge in 'cpo'. (Christian Brabandt)

Das alte Verhalten wurde zu einer Kompatibilitätsoption degradiert. Sie können es mit zurückbringen. Siehe :h cpo-;.

+0

Danke für die Köpfe, @glts! –

Verwandte Themen