diff --git a/cheat b/cheat index 6b296fb..db9557b 100755 --- a/cheat +++ b/cheat @@ -3,7 +3,7 @@ cheat.py -- cheat allows you to create and view interactive cheatsheets on the command-line. It was designed to help remind *nix system administrators of options for commands that they use frequently, - but not frequently enough to remember. + but not frequently enough to remember. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,13 +21,14 @@ cheat.py -- cheat allows you to create and view interactive cheatsheets on the import os import sys +import magic import argparse import subprocess from textwrap import dedent DEFAULT_CHEAT_DIR = os.environ.get('DEFAULT_CHEAT_DIR') or \ - os.path.join(os.path.expanduser('~'), '.cheat') -USE_PYGMENTS = False + os.path.join(os.path.expanduser('~'), '.cheat') +USE_PYGMENTS = False # NOTE remove this check if it is confirmed to work on windows if os.name == 'posix' and 'CHEATCOLORS' in os.environ: @@ -40,8 +41,9 @@ if os.name == 'posix' and 'CHEATCOLORS' in os.environ: except ImportError: pass + def pretty_print(filename): - "Applies syntax highlighting to a cheatsheet and writes it to stdout" + """Applies syntax highlighting to a cheatsheet and writes it to stdout""" try: if os.path.splitext(filename)[1]: lexer = get_lexer_for_filename(filename) @@ -58,8 +60,9 @@ def pretty_print(filename): fmt = TerminalFormatter() highlight(code, lexer, fmt, sys.stdout) + class CheatSheets(object): - + dirs = None sheets = None @@ -107,19 +110,20 @@ class CheatSheets(object): # arguments have been given if 'EDITOR' not in os.environ: print >> sys.stderr, ('In order to create/edit a cheatsheet you ' - 'must set your EDITOR environment variable to your favorite ' - 'editor\'s path.') + 'must set your EDITOR environment variable ' + 'to your favorite editor\'s path.') exit(1) elif os.environ['EDITOR'] == "": print >> sys.stderr, ('Your EDITOR environment variable is set ' - 'to nothing, in order to create/edit a cheatsheet your must ' - 'set it to a valid editor\'s path.') + 'to nothing, in order to create/edit a ' + 'cheatsheet your must set it to a valid ' + 'editor\'s path.') exit(1) else: editor = os.environ['EDITOR'].split() # if the cheatsheet already exists, open it for editing try: - if cheat in sheets.sheets: + if cheat in self.sheets: subprocess.call(editor + [os.path.join(self.sheets[cheat], cheat)]) # otherwise, create it @@ -145,25 +149,50 @@ class CheatSheets(object): return ('\n'.join(sorted(['%s [%s]' % (key.ljust(max_command), value) for key, value in self.sheets.items()]))) + # Custom action for argparse class ListDirectories(argparse.Action): """List cheat directories and exit""" def __call__(self, parser, namespace, values, option_string=None): - print("\n".join(sheets.dirs)) + print('\n'.join(sheets.dirs)) parser.exit() + class ListCheatsheets(argparse.Action): """List cheatsheets and exit""" def __call__(self, parser, namespace, values, option_string=None): print sheets.list() parser.exit() + class EditSheet(argparse.Action): """If the user wants to edit a cheatsheet""" def __call__(self, parser, namespace, values, option_string=None): sheets.edit(values[0]) parser.exit() + +def is_vim_crypted(filepath): + """Returns True if the canonical file path is a Vim Encrypted file.""" + canonical_path = os.path.realpath(filepath) + return 'vim encrypted' in magic.from_file(canonical_path).lower() + + +def vim_viewer(filepath): + """Use Vim to read an Vim Encrypted cheat file.""" + canonical_path = os.path.realpath(filepath) + env_cmd = '/usr/bin/env' + if not os.path.isfile(env_cmd): + sys.stderr.write('No environment command {0}\n'.format(env_cmd)) + exit(1) + try: + subprocess.call([env_cmd, 'vim', '-R', canonical_path, ]) + return True + except Exception as e: + sys.stderr.write('Unknown exception: {0}\n'.format(unicode(e))) + exit(1) + + def main(): global sheets @@ -177,13 +206,13 @@ def main(): epi = dedent(''' Examples: - + To look up 'tar': cheat tar - + To create or edit the cheatsheet for 'foo': cheat -e foo - + To list the directories on the CHEATPATH cheat -d @@ -215,7 +244,9 @@ def main(): parser.print_help() elif sheet in sheets.sheets: filename = os.path.join(sheets.sheets[sheet], sheet) - if USE_PYGMENTS: + if is_vim_crypted(filename): + vim_viewer(filename) + elif USE_PYGMENTS: pretty_print(filename) else: with open(filename) as istream: