Wiederholen Sie eine Zuordnung n Mal, beginnend mit einer Zählung

7

Ich habe das folgende Mapping erstellt:

:map <F8> 3w

Als ich drückte 2<F8>, dachte ich, es würde sechs Wörter bewegen ( 2*3w), aber es bewegt 23 Wörter. (Dies wurde im Hilfebereich des vim-Editors erwähnt.)

Wie ordne ich es so zu, dass es für 6 statt 23 Züge funktioniert? Bitte lassen Sie mich auch wissen, ob diese Funktion absichtlich für Zuordnungen so funktioniert.

(In allen anderen Fällen ist es einfach wie 2 * 3 anstelle von 23, wie 2d3wist wie 6dw, sowie d6w)

SibiCoder
quelle

Antworten:

5

Eine andere Lösung besteht darin, die Variable v:countwie folgt zu verwenden :

nnoremap <F8> :<C-u>execute "normal! " . v:count1 * 3 . "w"<CR>

Siehe :h v:count: Die Variable enthält die Anzahl, die für den letzten Befehl im normalen Modus angegeben wurde, und kann daher verwendet werden, um eine Anzahl vor einer Zuordnung abzurufen.

Hier wird die Zuordnung verwendet, v:count1die gleich v:countNull ist, wenn keine Zählung erfolgt.

Das Mapping führt den normalen Befehl aus, normal! Xwbei dem das XDreifache der vor dem Mapping angegebenen Anzahl ersetzt wird.

Das <C-U>ist erforderlich, um den Zeilenbereich zu entfernen, der beim Tippen :nach einer Zählung berücksichtigt wird .


Natürlich ist das von Ihnen beobachtete Verhalten auch völlig normal: Durch Ihre Zuordnung wird Vim so verstanden, F8als 3wob Sie etwas vor Vim eingeben, da Sie nicht verstehen können, dass es eine Multiplikation durchführen soll. Denken Sie daran, dass ein Programm Ihre Absicht nicht verstehen kann, wenn Sie sie nicht beschreiben.

statox
quelle
8

Sie können das Ausdrucksregister dafür verwenden:

 :nnoremap <F8>  @='3w'<CR>

Dadurch wird das Ausdrucksregister verwendet, um eine wiederholbare Zuordnung zu erstellen, der Sie eine Nummer voranstellen können:

 2<F8> will move 6 words

Eine Zuordnung in vim ersetzt die Bedeutung einer Taste / Tastenfolge. Also wenn du es tust

:map <F8> 3w

und

2<F8>
23w

Vim konvertiert das <F8>in 3wund was Sie ausführen, ist 23w.

Auf der anderen Seite tun Sie am Ende Folgendes, wenn Sie das Ausdrucksregister verwenden:

 2<F8>
 2@='3w'<CR>

Was bedeutet, "2 mal den Inhalt des Ausdrucksregisters ausführen".

Ich vermute, wenn es absichtlich gemacht wurde, ist es angesichts der Bedeutung von Mapping die logische Art und Weise, wie es ausgeführt werden sollte.

nobe4
quelle
Bitte lassen Sie mich wissen, ob dies absichtlich gemacht wurde.
SibiCoder
Antwort aktualisiert.
nobe4
Das Normalmodus-Mapping funktioniert nicht sehr robust, da es mit einem Bereich arbeitet. Wenn Sie das Mapping in der letzten Zeile der Datei mit einer Zählung versehen, wird eine Fehlermeldung angezeigt : E16: Invalid range.
jdhao