diff --git a/README.md b/README.md index 6d78cc5..917fb23 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,5 @@ This project is currently a work-in-progress. Only the fish shell is supported a - Installation & Generalization - Command Memory/Env Support - Double wh does an la, not ls - - Clipboard functionality + - directory history for ls'ing back + - improve Git detection diff --git a/do_what.py b/do_what.py index 5816198..a0df692 100644 --- a/do_what.py +++ b/do_what.py @@ -3,6 +3,7 @@ import os import subprocess import configparser import magic +import json mime = magic.Magic(mime=True) @@ -60,7 +61,12 @@ def file_len(fname): with open(fname) as f: for i, l in enumerate(f): pass - return i + 1 + try: + i + except NameError: + return 0 + else: + return i + 1 # bootstrap the config ENV_HOME=os.environ['HOME'] @@ -68,7 +74,7 @@ subprocess.call(['mkdir', '-p', ENV_HOME+'/.config/do_what']) if ( os.path.isfile(ENV_HOME+'/.config/do_what/what.config') ): config = configparser.ConfigParser() config.read(ENV_HOME+'/.config/do_what/what.config') - # TODO add else default configs & config flush + # TODO add else default configs if ( 'DEFAULT' in config ): if ( 'print_file' in config['DEFAULT'] ): print_file = config['DEFAULT']['print_file'] @@ -112,6 +118,97 @@ for arg in sys.argv: break argiter += 1 +# absolutize the path for python +if ( (active and len(sys.argv) >= 3) or (not active and len(sys.argv) >= 2) ): + filearg = sys.argv[1] + path = sys.argv[1] + if ( path[0] != "/" and path[0] != "~" and path[0] != "." ): + path = os.getcwd()+"/"+path + elif ( path[0] == "." and len(path) > 1 and ( path[:2] == "./" ) ): + path = os.getcwd()+path[1:] + elif ( path[0] == "." and len(path) > 1 and ( path[:2] == ".." ) ): + path = os.getcwd()+"/"+path + elif ( path[0] == "." and len(path) == 1 ): + path = os.getcwd() + +# CLIpboard (ha.) +if ( active and len(sys.argv) > argiter+1 and sys.argv[argiter+1] == 'c' ): + subprocess.call(['rm', '-rf', ENV_HOME+'/.config/do_what/clipboard']) + subprocess.call(['touch', ENV_HOME+'/.config/do_what/clipboard']) + if ( filearg == '-' ): + path = os.getcwd() + if ( os.path.isdir(path) or os.path.isfile(path) ): + with open(ENV_HOME+"/.config/do_what/clipboard", "w") as cb: + cbdata = { 'action': 'copy', 'path': path } + json.dump(cbdata, cb) + print("echo Copied: "+path) + exit() + else: + print("echo Unknown file/directory.") + exit() +elif ( active and len(sys.argv) > argiter+1 and sys.argv[argiter+1] == 'x' ): + subprocess.call(['rm', '-rf', ENV_HOME+'/.config/do_what/clipboard']) + subprocess.call(['touch', ENV_HOME+'/.config/do_what/clipboard']) + if ( filearg == '-' ): + path = os.getcwd() + if ( os.path.isdir(path) or os.path.isfile(path) ): + with open(ENV_HOME+"/.config/do_what/clipboard", "w") as cb: + cbdata = { 'action': 'cut', 'path': path } + json.dump(cbdata, cb) + print("echo Cut: "+path) + exit() + else: + print("echo Unknown file/directory.") + exit() + +elif ( active and len(sys.argv) > argiter+1 and sys.argv[argiter+1] == 'p' ): + if ( os.path.isfile(ENV_HOME+"/.config/do_what/clipboard") ): + with open(ENV_HOME+"/.config/do_what/clipboard", "r") as cb: + try: + cbdata = json.load(cb) + except json.decoder.JSONDecodeError: + print("echo Invalid clipboard file.") + exit() + + print("echo \""+str(cbdata)+"\"") + + if ( cbdata['action'] == 'copy' ): + file_op = 'cp' + elif ( cbdata['action'] == 'cut' ): + file_op = 'mv' + + if ( os.path.isdir( cbdata['path'] ) and filearg == '-' ): + print("echo Pasted directory: "+cbdata['path']) + print(file_op+" -r "+cbdata['path']+" .") + elif ( os.path.isdir( cbdata['path'] ) and os.path.isdir( path ) ): + print("echo Pasted directory "+cbdata['path']+" in "+path) + print(file_op+" -r "+cbdata['path']+" "+path) + elif ( os.path.isdir( cbdata['path'] ) and os.path.isfile( path ) ): + print("echo Cannot paste directory into regular file.") + print("echo \"("+cbdata['path']+" -> "+path+")\"") + elif ( os.path.isfile( cbdata['path'] ) and filearg == '-' ): + print("echo Pasted file: "+cbdata['path']) + print(file_op+" "+cbdata['path']+" .") + elif ( os.path.isfile( cbdata['path'] ) and os.path.isdir( path ) ): + print("echo Pasted file "+cbdata['path']+" in directory "+path) + print(file_op+" "+cbdata['path']+" "+path) + elif ( os.path.isfile( cbdata['path'] ) and os.path.isfile( path ) ): + print("echo Pasted file "+cbdata['path']+" over existing file "+path) + print(file_op+" "+cbdata['path']+" "+path) + elif ( os.path.isfile( cbdata['path'] ) and filearg != '-' ): + print("echo Pasted file "+cbdata['path']+" as new file "+path) + print(file_op+" "+cbdata['path']+" "+path) + elif ( os.path.isdir( cbdata['path'] ) and filearg != '-' ): + print("echo Pasted directory "+cbdata['path']+" as new directory "+path) + print(file_op+" "+cbdata['path']+" "+path) + else: + print("echo Invalid clipboard. Use \\\'c\\\' directive to copy a file or directory.") + else: + print("echo Empty clipboard. Use \\\'c\\\' directive to copy a file or directory.") + + exit() + +# File Operations if ( (not active and len(sys.argv) == 1) or (active and len(sys.argv) == 2) ): # list the contents of the current directory if ( not active ): @@ -123,12 +220,6 @@ if ( (not active and len(sys.argv) == 1) or (active and len(sys.argv) == 2) ): elif ( active ): print(print_dir) elif ( (not active and len(sys.argv) == 2) or (active and len(sys.argv) == 3) ): - # absolutize the path for Python - filearg = sys.argv[1] - path = sys.argv[1] - if ( path[0] != "/" and path[0] != "~" and path[0] != "." ): - path = os.getcwd()+"/"+path - # if directory, list its contents if ( os.path.isdir(path) and not active ): if ( os.path.isdir(path+"/.git") ):