2016-08-29 8 views
5

Angenommen, ich habe einen Text wie den folgenden.Ist es möglich, das n-te Vorkommen eines Musters mit n in vim zu markieren?

Der Mann geht, und der Mann isst.

Wie soll ich Substitution verwenden, um es in das folgende umzuwandeln?

Der Mann 1 geht, und der Mann 2 isst.

Ich weiß, ich :%s/\<man\>//gn kann die Anzahl der Vorkommen des Wortes zählen man und ich weiß /\%(\(pattern\).\{-}\)\{n - 1}\zs\1 die n-te Auftreten Muster finden. Aber wie markiere ich das n-te Vorkommen?

Jede Hilfe wird herzlichst geschätzt; Danke im Voraus.

Antwort

6

Sie müssen eine nicht-reine Funktion haben, die Vorkommen zählt und das Ergebnis dieser Funktion verwendet.

" untested 
let s:count = 0 
function! Count() 
    let s:count += 1 
    return s:count 
endfunction 

:%s/man\zs/\=' '.Count()/ 
+1

Nur eine kleine Zugabe. Wenn Sie das nicht zu Ihrem vim-Skript hinzufügen wollen, dann sollten Sie wahrscheinlich globale Variablen verwenden, zB 'let g: count = 0' oder zumindest vars:' let b: count = 0'. Über den Variablen-Namespace können Sie ': help internal-variables' einlesen. –

+0

Maya dies sollte wie folgt geändert werden:':% s/man \ zs \ ze/\ = '' .Count()/'. Danke, das ist eine große Hilfe für mich! – awllower

+1

@awllower. Eigentlich wollte ich '\ zs' verwenden, aber in der Eile habe ich den anderen benutzt. Vielen Dank! –

2

Sie können das mit einem Makro tun. Suchen Sie zuerst nach dem Muster, z. B. /man /e.

Lassen Sie uns eine Variable für die Zählung erstellen, wie :let cnt=1.

Jetzt löschen wir das a Register.

Starten Sie die Aufzeichnung, indem Sie qa drücken.

Drücken Sie n.

Drücken Sie i, dann Strg + R, geben Sie = ein. Typ cnt. Der Wert der Zählung wird dort eingefügt. Geben Sie dann :let cnt=cnt+1 ein.

Drücken Sie Escape.

Drücken Sie q, um das Register zu stoppen.

Geben Sie jetzt :%s/man //gn ein, um die Anzahl der Vorkommen zu erhalten.

Jetzt kennen Sie die Anzahl der Vorkommen, sagen Sie 10. Dann drücken Sie [email protected]. Allen Vorkommen wird eine Nummer angehängt, die bei jedem Auftreten inkrementiert wird.

+1

Danke für diese überraschend einfache Makro-Ansatz. – awllower

Verwandte Themen