Viewing file: editor.py (2.49 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/env 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)
|