관리-도구
편집 파일: editor.py
#!/usr/libexec/platform-python """Tools for invoking editors programmatically.""" from __future__ import print_function import locale import os.path import subprocess import tempfile from distutils.spawn import find_executable __all__ = [ 'edit', 'get_editor', 'EditorError', ] __version__ = '0.4' class EditorError(RuntimeError): pass def get_default_editors(): # TODO: Make platform-specific return [ 'vim', 'emacs', 'nano', ] def get_editor_args(editor): if editor in ['vim', 'gvim']: return '-f -o' elif editor == 'emacs': return '-nw' elif editor == 'gedit': return '-w --new-window' elif editor == 'nano': return '-R' else: return '' def get_platform_editor_var(): # TODO: Make platform specific return "$EDITOR" def get_editor(): # Get the editor from the environment. Prefer VISUAL to EDITOR editor = os.environ.get('VISUAL') or os.environ.get('EDITOR') if editor: return editor # None found in the environment. Fallback to platform-specific defaults. for ed in get_default_editors(): path = find_executable(ed) if path is not None: return path raise EditorError("Unable to find a viable editor on this system." "Please consider setting your %s variable" % get_platform_editor_var()) def edit(filename=None, contents=None): editor = get_editor() args = get_editor_args(os.path.basename(editor)) args = [editor] + args.split(' ') if filename is None: tmp = tempfile.NamedTemporaryFile() filename = tmp.name if contents is not None: with open(filename, mode='wb') as f: f.write(contents) args += [filename] proc = subprocess.Popen(args, close_fds=True) proc.communicate() with open(filename, mode='rb') as f: return f.read() def _get_editor(ns): print(get_editor()) def _edit(ns): contents = ns.contents if contents is not None: contents = contents.encode(locale.getpreferredencoding()) print(edit(filename=ns.path, contents=contents)) if __name__ == '__main__': import argparse ap = argparse.ArgumentParser() sp = ap.add_subparsers() cmd = sp.add_parser('get-editor') cmd.set_defaults(cmd=_get_editor) cmd = sp.add_parser('edit') cmd.set_defaults(cmd=_edit) cmd.add_argument('path', type=str, nargs='?') cmd.add_argument('--contents', type=str) ns = ap.parse_args() ns.cmd(ns)