Add support for vim decrypted view of cheatsheat files.

This commit is contained in:
blackguest 2013-10-29 16:13:42 -05:00
parent cf75fa9843
commit 622b6991ba
1 changed files with 46 additions and 15 deletions

61
cheat
View File

@ -3,7 +3,7 @@
cheat.py -- cheat allows you to create and view interactive cheatsheets on the cheat.py -- cheat allows you to create and view interactive cheatsheets on the
command-line. It was designed to help remind *nix system command-line. It was designed to help remind *nix system
administrators of options for commands that they use frequently, 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 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 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 os
import sys import sys
import magic
import argparse import argparse
import subprocess import subprocess
from textwrap import dedent from textwrap import dedent
DEFAULT_CHEAT_DIR = os.environ.get('DEFAULT_CHEAT_DIR') or \ DEFAULT_CHEAT_DIR = os.environ.get('DEFAULT_CHEAT_DIR') or \
os.path.join(os.path.expanduser('~'), '.cheat') os.path.join(os.path.expanduser('~'), '.cheat')
USE_PYGMENTS = False USE_PYGMENTS = False
# NOTE remove this check if it is confirmed to work on windows # NOTE remove this check if it is confirmed to work on windows
if os.name == 'posix' and 'CHEATCOLORS' in os.environ: if os.name == 'posix' and 'CHEATCOLORS' in os.environ:
@ -40,8 +41,9 @@ if os.name == 'posix' and 'CHEATCOLORS' in os.environ:
except ImportError: except ImportError:
pass pass
def pretty_print(filename): 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: try:
if os.path.splitext(filename)[1]: if os.path.splitext(filename)[1]:
lexer = get_lexer_for_filename(filename) lexer = get_lexer_for_filename(filename)
@ -58,8 +60,9 @@ def pretty_print(filename):
fmt = TerminalFormatter() fmt = TerminalFormatter()
highlight(code, lexer, fmt, sys.stdout) highlight(code, lexer, fmt, sys.stdout)
class CheatSheets(object): class CheatSheets(object):
dirs = None dirs = None
sheets = None sheets = None
@ -107,19 +110,20 @@ class CheatSheets(object):
# arguments have been given # arguments have been given
if 'EDITOR' not in os.environ: if 'EDITOR' not in os.environ:
print >> sys.stderr, ('In order to create/edit a cheatsheet you ' print >> sys.stderr, ('In order to create/edit a cheatsheet you '
'must set your EDITOR environment variable to your favorite ' 'must set your EDITOR environment variable '
'editor\'s path.') 'to your favorite editor\'s path.')
exit(1) exit(1)
elif os.environ['EDITOR'] == "": elif os.environ['EDITOR'] == "":
print >> sys.stderr, ('Your EDITOR environment variable is set ' print >> sys.stderr, ('Your EDITOR environment variable is set '
'to nothing, in order to create/edit a cheatsheet your must ' 'to nothing, in order to create/edit a '
'set it to a valid editor\'s path.') 'cheatsheet your must set it to a valid '
'editor\'s path.')
exit(1) exit(1)
else: else:
editor = os.environ['EDITOR'].split() editor = os.environ['EDITOR'].split()
# if the cheatsheet already exists, open it for editing # if the cheatsheet already exists, open it for editing
try: try:
if cheat in sheets.sheets: if cheat in self.sheets:
subprocess.call(editor + [os.path.join(self.sheets[cheat], cheat)]) subprocess.call(editor + [os.path.join(self.sheets[cheat], cheat)])
# otherwise, create it # otherwise, create it
@ -145,25 +149,50 @@ class CheatSheets(object):
return ('\n'.join(sorted(['%s [%s]' % (key.ljust(max_command), value) return ('\n'.join(sorted(['%s [%s]' % (key.ljust(max_command), value)
for key, value in self.sheets.items()]))) for key, value in self.sheets.items()])))
# Custom action for argparse # Custom action for argparse
class ListDirectories(argparse.Action): class ListDirectories(argparse.Action):
"""List cheat directories and exit""" """List cheat directories and exit"""
def __call__(self, parser, namespace, values, option_string=None): def __call__(self, parser, namespace, values, option_string=None):
print("\n".join(sheets.dirs)) print('\n'.join(sheets.dirs))
parser.exit() parser.exit()
class ListCheatsheets(argparse.Action): class ListCheatsheets(argparse.Action):
"""List cheatsheets and exit""" """List cheatsheets and exit"""
def __call__(self, parser, namespace, values, option_string=None): def __call__(self, parser, namespace, values, option_string=None):
print sheets.list() print sheets.list()
parser.exit() parser.exit()
class EditSheet(argparse.Action): class EditSheet(argparse.Action):
"""If the user wants to edit a cheatsheet""" """If the user wants to edit a cheatsheet"""
def __call__(self, parser, namespace, values, option_string=None): def __call__(self, parser, namespace, values, option_string=None):
sheets.edit(values[0]) sheets.edit(values[0])
parser.exit() 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(): def main():
global sheets global sheets
@ -177,13 +206,13 @@ def main():
epi = dedent(''' epi = dedent('''
Examples: Examples:
To look up 'tar': To look up 'tar':
cheat tar cheat tar
To create or edit the cheatsheet for 'foo': To create or edit the cheatsheet for 'foo':
cheat -e foo cheat -e foo
To list the directories on the CHEATPATH To list the directories on the CHEATPATH
cheat -d cheat -d
@ -215,7 +244,9 @@ def main():
parser.print_help() parser.print_help()
elif sheet in sheets.sheets: elif sheet in sheets.sheets:
filename = os.path.join(sheets.sheets[sheet], sheet) 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) pretty_print(filename)
else: else:
with open(filename) as istream: with open(filename) as istream: