2010-11-23 4 views
4

Zum Beispiel habe ich den folgenden Ausdruck Mapping: Wegwerfen Zählung in <expr> Mappings

 
    function! DelNthSpace() 
     let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1) 
     return virtcol([line('.'), col+1])."|s \e" 
    endfunction 
    nnoremap s DelNthSpace() 
Sie sehen, v:count1 ist hier bereits behandelt. Aber wenn ich versuche, den zweiten Platz durch eine solche Funktion zu ersetzen, die sich zum Beispiel in der virtuellen Spalte 35 befindet (dies wird geschehen, wenn Sie den Cursor auf die return-Anweisung setzen), versucht dieser, zur Spalte 235 zu gehen und sie zu ersetzen von 2s zu 2{DelNthSpace()} -> 235|s ^[ umgewandelt werden. Jetzt werde ich nackten nutzlos | am Anfang der Return-Anweisung vor, die unnötige Zählung verbraucht, aber ich mag diese Lösung nicht, wie es zwei Bewegungen statt einer verwendet.

UPDATE: Ich sollte mehr Kontext zur Verfügung gestellt haben:

function! ToNthSpace() 
    let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1) 
    return virtcol([line('.'), col+1])."|" 
endfunction 
noremap <expr> s ToNthSpace() 

eine Reihe von Funktionen gibt, die diese verwenden, imitiert einen Befehl ersetzen, sondern transliteriert ihr Argument (so, während r$ii Aufruf ersetzen Zeichen mit $ und Einfügen i, \tr$ii ersetzt Zeichen mit , das gleiche Verhältnis zwischen t und \tt und einige andere), andere sind Bewegungen. Da diese Funktionen Bewegungen definieren, kann ich :<C-u> nicht verwenden, es wird den visuellen Modus verlassen (oder ich muss einen Hack hinzufügen, der anzeigt, welche Modusfunktion aufgerufen wurde). Ich kenne diesen Hack nicht und kann keine verschiedenen Zuordnungen für normale und visuelle Modi definieren.

+0

Ich bin upvoting, weil der Titel fragt, was ich selbst brauche, aber es ist schwer, durch den Text zu kommen, nicht klar für mich, wenn die Angabe aller Details einer ganz besonderen Anwendung notwendig ist. – Alexey

+0

Ich habe eine verwandte Frage: Wenn Sie eine Zählung in Vim im Visual-Modus eingegeben haben, aber dann entschieden, dass die Zählung falsch oder unnötig war, wie können Sie die Zählung abbrechen, ohne Visual-Modus zu verlassen? – Alexey

+0

@Alexey Es scheint, dass Sie Ihre eigene Frage beantwortet haben: '@ _' funktioniert dafür. Keine Möglichkeit, dies im Operator-anhängigen Modus zu tun, von dem ich weiß (und ich wusste eigentlich nicht von '@ _'). – ZyX

Antwort

2

Es gibt keinen Weg, um vim die Zählung für das <expr> Mapping zu ignorieren, aber Sie einfach Ihr Mapping ändern können, um Ihre Funktion Arbeit zu machen:

nnoremap s :<C-U>exe 'normal!' DelNthSpace()<CR> 

:help v:count für Informationen sehen über CTRL+U mit der Zählung löschen .

+0

Nein, kann ich nicht. 1. 'DelNthSpace' ist eigentlich eine Funktion, die' getchar() 'verwendet und versehentlich Teile des nächsten Befehls fängt,' normal! 'wird sie verwerfen. 2. Ich benutze selbstgeschriebenes Plugin für die Definition von Mappings, es erlaubt nichts außer Expressions-Mappings und ich werde das nicht umschreiben. Aber du hast mich irgendwie auf eine Lösung hingewiesen (funktioniert nicht als Bewegung im visuellen Modus, also wurde sie weggeworfen) (return '": \ normal! ".vcol." | \ N ".": \ rufe feedkeys auf (".substitute (string (nextcmd), '\ n', '' '." \ ".' '', 'g').") \ n "'. Warten, vielleicht findet jemand eine bessere Lösung. – ZyX

+2

Ich habe ein paar Wege gefunden, wie Vim im Normal-Modus [count] ignorieren kann: drücke '' oder '@ _'. Der zweite (' @ _') funktioniert auch im Visual-Modus eine Möglichkeit, [count] im Modus "Operator anstehend" zu ignorieren. – Alexey