2016-07-25 6 views
0

Ich habe den folgenden Quellcode:Umschalten auf vim wie Editor interactivelly einen Python-String ändern

import sys, os 
import curses 
import textwrap 

if __name__ == "__main__": 
    curses.setupterm() 
    sys.stdout.write(curses.tigetstr('civis')) 
    os.system("clear") 
    str = "abcdefghijklmnopqrstuvwxyz" * 10 # only example 
    for line in textwrap.wrap(str, 60): 
    os.system("clear") 
    print "\n" * 10 
    print line.center(150) 
    sys.stdin.read(1) # read one character or #TODO 
    #TODO 
    # x = getc() # getc() gets one character from keyboard (already done) 
    # if x == "e": # edit 
    # updatedString = runVim(line) 
    # str.replace(line, updatedString) 

    sys.stdout.write(curses.tigetstr('cnorm')) 

Das Programm bewegt sich durch die Zeichenfolge von 60 Zeichen. Ich hätte gerne Bearbeitungsmöglichkeit (in der Position #TODO) im Fall Ich möchte die gerade angezeigte Zeichenfolge ändern.

Ist es möglich, einen kleinen vim Puffer zu öffnen, wenn ich eine Taste drücke? Ich würde eine Bearbeitung vornehmen und wenn ich :w drücke, würde es die Zeichenfolge aktualisieren. Ich möchte, dass der Editor vim die Position der Zeichenfolge im Terminal nicht ändert (ich möchte es zentriert).

+0

Es ist möglich! Es ist möglich, einen Puffer zu öffnen, zu bearbeiten und zu speichern. Es wird etwas schwierig sein, den Inhalt des neuen Puffers zu aktualisieren. Geht es Ihnen mit einer anderen Lösung gut? Zum Beispiel, nach dem Öffnen eines neuen Puffers, können Sie nach dem Bearbeiten das gesamte Ding kopieren, indem Sie 'ggvG' drücken und dann mit' y' kopieren und anstelle dessen einfügen, indem Sie p drücken – SibiCoder

+0

@SibiCoder Jede Lösung ist einen Versuch wert . – xralf

Antwort

0

Idee:

uns \o und \w für unsere Zwecke Lassen Sie wählen. Halten Sie den Cursor auf "ZU TUN" oder ein anderes Wort, das Sie mögen, und drücken Sie \o. Dann öffnet es neue Registerkarte. Sie können alles in einen neuen Puffer schreiben und dann \w drücken. Es wird das Ganze kopieren und den Puffer schließen und dann an der Cursorposition im aktuellen Puffer einfügen.

Mapping

:nmap \o cw<ESC>:tabnew<CR> 
    :nmap \w ggvG"wy:tabclose<CR>"wp 
+0

OK, ich habe es versucht. Aber das ist etwas anderes, als ich in der Frage gefragt habe. Danke trotzdem. – xralf

0

Nicht genau: Sie können es auf diese Weise nicht tun. Programme können im Allgemeinen nicht lesen, was Sie auf dem Bildschirm gedruckt haben.

Sie könnte machen ein Programm, das Text auf dem Bildschirm anzeigt und (wissen, was es geschrieben hat) diese Informationen an einen Editor übergeben. Zum Beispiel zeigt lynx (eine Anwendung, die Curses verwendet) eine formatierte HTML-Seite auf dem Bildschirm an und stellt eine Funktion bereit, die den Inhalt eines Formulartextfelds an einen Editor weiterleitet, die aktualisierte Datei aus dem Editor liest und die Information erneut in der bilden.

1
def runVim(ln): 
    with tempfile.NamedTemporaryFile(suffix=".txt") as tmp: 
    tmp.write(ln) 
    tmp.flush() 
    call(['vim', '+1', '-c set filetype=txt', tmp.name]) # for centering +1 can be changed 
    with open(tmp.name, 'r') as f: 
     lines = f.read() 
    return lines 


... 
x = getch() 
    if x == "e": 
    updatedString = runVim(line) 
    str = str.replace(line, updatedString) 
print str 
...