mirror of
https://github.com/Erreur32/cheat.git
synced 2024-12-22 21:52:12 +01:00
cd1b43118d
* 'master' of https://github.com/bradtse/cheat: Added in a create option also Added in an edit option that allows a user to edit the cheatsheet from their default editor. Also made some visual changes to the output of the cheatsheet.
154 lines
5.1 KiB
Python
Executable file
154 lines
5.1 KiB
Python
Executable file
#!/usr/bin/env python
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
|
|
DEFAULT_CHEAT_DIR = 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:
|
|
try:
|
|
from pygments import highlight
|
|
from pygments.util import ClassNotFound
|
|
from pygments.lexers import get_lexer_for_filename, TextLexer
|
|
from pygments.formatters import TerminalFormatter
|
|
USE_PYGMENTS = True
|
|
except ImportError:
|
|
pass
|
|
|
|
def cheat_directories():
|
|
"Assembles a list of directories containing cheatsheets."
|
|
default_directories = [DEFAULT_CHEAT_DIR]
|
|
try:
|
|
import cheatsheets
|
|
default_directories.append(cheatsheets.cheat_dir)
|
|
except ImportError:
|
|
pass
|
|
|
|
default = [default_dir for default_dir in default_directories
|
|
if os.path.isdir(default_dir)]
|
|
|
|
if 'CHEATPATH' in os.environ and os.environ['CHEATPATH']:
|
|
return [path for path in os.environ['CHEATPATH'].split(os.pathsep)
|
|
if os.path.isdir(path)] + default
|
|
else:
|
|
return default
|
|
|
|
|
|
def cheat_files(cheat_directories):
|
|
"Assembles a dictionary of cheatsheets found in the above directories."
|
|
cheats = {}
|
|
for cheat_dir in reversed(cheat_directories):
|
|
cheats.update(dict([(cheat, cheat_dir)
|
|
for cheat in os.listdir(cheat_dir)
|
|
if not cheat.startswith('.')
|
|
and not cheat.startswith('__')]))
|
|
return cheats
|
|
|
|
def edit_cheatsheet(cheat, cheatsheets):
|
|
"Edit a pre-existing cheatsheet."
|
|
if cheat not in cheatsheets:
|
|
print 'No cheatsheet found for "%s"' % cheat
|
|
ans = raw_input('Create cheatsheet for "%s" (Y/N)? ' % cheat)
|
|
if ans.lower() in ['y', 'yes']:
|
|
create_cheatsheet(cheat, cheatsheets)
|
|
else:
|
|
exit()
|
|
|
|
subprocess.call([os.environ['EDITOR'],
|
|
os.path.join(cheatsheets[cheat], cheat)])
|
|
exit()
|
|
|
|
def create_cheatsheet(cheat, cheatsheets):
|
|
"Create a new cheatsheet."
|
|
if cheat in cheatsheets:
|
|
print 'Cheatsheet "%s" already exists' % cheat
|
|
exit()
|
|
|
|
import cheatsheets as cs
|
|
subprocess.call([os.environ['EDITOR'],
|
|
os.path.join(cs.cheat_dir, cheat)])
|
|
exit()
|
|
|
|
def main():
|
|
# assemble a keyphrase out of all params passed to the script
|
|
keyphrase = ' '.join(sys.argv[1:])
|
|
cheat_dirs = cheat_directories()
|
|
|
|
# verify that we have at least one cheat directory
|
|
if not cheat_dirs:
|
|
error_msg = 'The {default} dir does not exist or the CHEATPATH var is not set.'
|
|
print >> sys.stderr, error_msg.format(default=DEFAULT_CHEAT_DIR)
|
|
exit()
|
|
|
|
# list the files in the ~/.cheat directory
|
|
cheatsheets = cheat_files(cheat_dirs)
|
|
|
|
# print help if requested
|
|
if keyphrase.lower() in ['', 'cheat', 'help', '-h', '-help', '--help']:
|
|
print ("Usage: cheat [keyphrase]\n")
|
|
print ("Available keyphrases:")
|
|
max_command = max([len(x) for x in cheatsheets.keys()]) + 3
|
|
print ('\n'.join(sorted(['%s [%s]' % (key.ljust(max_command), value)
|
|
for key, value in cheatsheets.items()])))
|
|
exit()
|
|
|
|
# create/edit option
|
|
option = sys.argv[1].lower()
|
|
if option in ['-e', '--edit', '-c', '--create']:
|
|
# make sure EDITOR environment variable is set and that at least 3 arguments
|
|
# are given
|
|
if 'EDITOR' not in os.environ:
|
|
print('In order to use "create" or "edit" you must set your '
|
|
'EDITOR environment variable to your favorite editor\'s path')
|
|
exit()
|
|
elif len(sys.argv) < 3:
|
|
print 'Must provide a cheatsheet to edit/create'
|
|
exit()
|
|
|
|
# if the user wants to edit a cheatsheet
|
|
if option in ['-e', '--edit']:
|
|
edit_cheatsheet(' '.join(sys.argv[2:]), cheatsheets)
|
|
|
|
# if the user wants to create a cheatsheet
|
|
elif option in ['-c', '--create']:
|
|
create_cheatsheet(' '.join(sys.argv[2:]), cheatsheets)
|
|
|
|
# print the cheatsheet if it exists
|
|
if keyphrase in cheatsheets:
|
|
print ''.join('*' for x in range(80)) + "\n"
|
|
filename = os.path.join(cheatsheets[keyphrase], keyphrase)
|
|
if USE_PYGMENTS:
|
|
pretty_print(filename)
|
|
else:
|
|
with open(filename) as istream:
|
|
for l in istream:
|
|
sys.stdout.write(l)
|
|
print "\n" + ''.join('*' for x in range(80))
|
|
|
|
# if it does not, say so
|
|
else:
|
|
print ('No cheatsheet found for %s.' % keyphrase)
|
|
|
|
|
|
def pretty_print(filename):
|
|
try:
|
|
if os.path.splitext(filename)[1]:
|
|
lexer = get_lexer_for_filename(filename)
|
|
else:
|
|
# shell is a sensible default when there is no extension
|
|
lexer = get_lexer_for_filename(filename + '.sh')
|
|
|
|
except ClassNotFound:
|
|
lexer = TextLexer()
|
|
|
|
with open(filename) as istream:
|
|
code = istream.read()
|
|
|
|
fmt = TerminalFormatter()
|
|
highlight(code, lexer, fmt, sys.stdout)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|