2012-07-19 8 views
6

Ich möchte ein vim-Makro definieren, das für Benutzereingaben zu bestimmten Zeiten bricht, ist das möglich?Können Sie interaktive Makros oder Aufzeichnungen in vim machen?

EDIT: Es stellt sich heraus, dass ich ment Aufnahmen (q), keine Makros

Es ist möglich, den Eingabebefehl in einer Aufnahme zu verwenden, aber es ist mehr Mühe, als es wert ist.

I kartiert erster Einsatzeingang Flucht zu einem Schlüssel

:map <F2> a<C-R>=input('input: ')<CR> 

dann habe ich diese Aufzeichnung in dem Q-Register

name: 

und es in ein neues Tab eingefügt

iname: ^[ 

Und nach der letzten Flucht drückte ich <C-V><F2> die Linie:

iname ^[^[OQ 

Das ich zurück in den q-Puffer zog dann das Makro verwendet, lassen Sie mich die Eingabefunktion verwenden. Es funktioniert, aber furchtbar.

Antwort

3

Ja. Siehe die Funktion input({prompt}, [, {text} [, {completion}] ]). Es gibt sogar inputdialog({prompt} [, {text} [, {cancelreturn}]]), für ein Dialogfenster.

+0

Vim ist einfach genial! Gibt es irgendeine Frage wie "kann ich xxx in vim" mit einem Nein als Antwort? :) – moritz

+0

input() scheint nicht verfügbar in Makros (nicht einmal durch 'Ctrl-R = Eingabe ('prompt:')'), aber wenn Sie mit normalen Zuordnungen oder Funktionen okay sind, wird es die Arbeit gut machen . – mogelbrod

+0

@VictorHallberg: Hmm. Einfach (neu) versucht. Funktioniert für mich (Vim 7.3.547). Nur für den Fall, was meinst du mit _macro_? Nicht was '' help macro' erklärt? – fork0

1

Leider scheint es nicht möglich zu sein. Sie können input() innerhalb eines Makros auslösen, aber es scheint nicht möglich zu sein, danach weiterzumachen, da jede zusätzliche Eingabe in die Eingabeaufforderung eingefügt wird.

Die Zeile in ein benanntes Register ("qY) kopieren und ausführen (@q), um es auszuprobieren.
Hinweis: Ersetzen Sie ^R und ^M durch Strg-V Strg-R/M (siehe :help i_CTRL-V).

  • oBEFORE ^R=input('prompt> ')- arbeitet
  • oBEFORE ^R=input('prompt> ')^Mitest- Werke, sondern itest in den Prompt
  • oBEFORE ^R=input('prompt> ')<CR>testEinsätze - nicht
+0

Mir ist das Gleiche aufgefallen. Es wäre schön, wenn diese Funktion implementiert wäre. – everett1992

+0

@ everett1992: Es ist in Form von 'Inputsave()' und 'inputrestore()'; Schau dir meine Antwort an. –

2

Wenn Sie input() innerhalb einer Abbildung oder Makro verwenden, die restlichen Zeichen werden als Eingabe genommen, was nicht was ist Sie wollen. Vim bietet die Funktionen und inputrestore() an, um das Lesen aus dem Mapping-Zeichenstrom vorübergehend zu unterbrechen.

Basierend auf Mogelbrods Antwort funktioniert das nicht; die itest wird in als Eingang lesen:

oBEFORE ^R=input('prompt> ')^Mitest 

Aber das tut:

function! Input() 
    call inputsave() 
    let text = input('prompt> ') 
    call inputrestore() 
    return text 
endfunction 
oBEFORE ^R=Input()^Mitest 

Leider, denn <C-R> einen Ausdruck kommt, können wir die Befehle nicht inline setzen, haben aber eine separate Input() Funktion zu definieren.

Verwandte Themen