2016-07-25 36 views
0

我有以下的源代碼:切換到像編輯VIM interactivelly改變Python字符串

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')) 

該程序通過串由60個字符移動。 我想編輯的可能性(#TODO地方) 我想改變剛剛顯示的字符串。

當按下某個鍵時,是否可以打開一個小的vim緩衝區?我會做一個編輯,當我按:w它會更新字符串。我希望vim編輯器不要更改終端中字符串的位置(我希望它居中)。

+0

這是可能的!可以打開緩衝區,編輯並保存。更新新緩衝區的內容會有點困難。你可以用不同的解決方案嗎?例如,在打開一個新的緩衝區之後,一旦你編輯了它,你可以通過按ggvG來複制整個文件,然後通過y拷貝並粘貼到位,按p – SibiCoder

+0

@SibiCoder每個解決方案都值得嘗試。 – xralf

回答

0

理念:

讓我們選擇我們的目的\o\w。 將光標置於「TO DO」或任何其他您喜歡的詞上並按\o。 然後,它打開新標籤。您可以在新緩衝區中寫入任何內容,然後按\w。它會複製整個事物並關閉緩衝區,然後粘貼到當前緩衝區中的光標位置。

映射

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

好吧,我試了一下。但是這是不同的,然後我在問這個問題。不管怎麼說,還是要謝謝你。 – xralf

0

不完全是:你不能這樣做的。程序通常無法讀取您打印到屏幕上的內容。

可能製作一個程序,它在屏幕上顯示文本和(知道它寫了什麼)將該信息傳遞給編輯器。例如,lynx(使用curses的應用程序)在屏幕上顯示格式化的HTML頁面,並提供將表單文本字段的內容傳遞給編輯器的功能,從編輯器讀取更新的文件並重新顯示形成。

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 
...