ユーザーへのインターフェースとしてvimのような構成可能なテキストエディターを使用するraw_input()の代わりを実装しようとしています。
理想的なワークフローは次のようになります。
- Pythonスクリプトが実行されており、my_raw_input()が呼び出されます。
- Vim(またはemacs、gedit、またはその他のテキストエディタ)が空白のドキュメントで開きます
- ドキュメントにテキストを入力し、保存して終了します
- pythonスクリプトは、ファイルの内容をmy_raw_input()の戻り値として、実行を再開します。
gitに精通している場合、これはgit commit
、エディターがcore.editorを介して構成されているを使用するときの経験です。のような他のユーティリティcrontab -e
もこれを行います。
最終的には、このmy_raw_input()関数で、ユーザーが編集できるデフォルトの入力コンテンツを含むオプションの文字列も取得する必要があります。
これまでの研究
- os.execは、現在のプロセスをeditorコマンドに置き換えますが、戻りません。つまり、vimが起動するとPythonスクリプトが終了します。
- popenは子プロセスをインタラクティブに開始せず、ユーザーインターフェイスは表示されません。
- vimには
-
stdinから読み取るコマンドラインパラメータがありますが、。を使用してstdoutに書き込むものはありません:w
。 - gitのコードを見てみましたが、まったくフォローできません。
これは可能ですか?
編集
これまでのところ良い答え。同じことをしているmecurialコードも見つけました。また、 crontabコードを見て動作する例を思いつきましたが、一部の応答と比較すると、不必要に複雑に見えます。
#!/usr/bin/python
import os
import tempfile
def raw_input_editor(default=None, editor=None):
''' like the built-in raw_input(), except that it uses a visual
text editor for ease of editing. Unline raw_input() it can also
take a default value. '''
editor = editor or get_editor()
with tempfile.NamedTemporaryFile(mode='r+') as tmpfile:
if default:
tmpfile.write(default)
tmpfile.flush()
child_pid = os.fork()
is_child = child_pid == 0
if is_child:
os.execvp(editor, [editor, tmpfile.name])
else:
os.waitpid(child_pid, 0)
tmpfile.seek(0)
return tmpfile.read().strip()
def get_editor():
return (os.environ.get('VISUAL')
or os.environ.get('EDITOR')
or 'vi')
if __name__ == "__main__":
print raw_input_editor('this is a test')