#! /usr/bin/env python | |
import sys,os,subprocess | |
class Bash2Py(object): __slots__ = ["val"] def __init__(self, value=''): self.val = value def setValue(self, value=None): self.val = value return value | |
def GetVariable(name, local=locals()): if name in local: return local[name] if name in globals(): return globals()[name] return None def Make(name, local=locals()): ret = GetVariable(name, local) if ret is None: ret = Bash2Py(0) globals()[name] = ret return ret | |
# Bashmarks is a simple set of bash functions that allows you to bookmark | |
# folders in the command-line. | |
# | |
# To install, put bashmarks.sh somewhere such as ~/bin, then source it | |
# in your .bashrc file (or other bash startup file): | |
# source ~/bin/bashmarks.sh | |
# | |
# To bookmark a folder, simply go to that folder, then bookmark it like so: | |
# bookmark foo | |
# | |
# The bookmark will be named "foo" | |
# | |
# When you want to get back to that folder use: | |
# go foo | |
# | |
# To see a list of bookmarks: | |
# bookmarksshow | |
# | |
# Tab completion works, to go to the shoobie bookmark: | |
# go sho[tab] | |
# | |
# Your bookmarks are stored in the ~/.bookmarks file | |
bookmarks_file=~/.bookmarks | |
# Bashmarks is a simple set of bash functions that allows you to bookmark | |
# folders in the command-line. | |
# | |
# To install, put bashmarks.sh somewhere such as ~/bin, then source it | |
# in your .bashrc file (or other bash startup file): | |
# source ~/bin/bashmarks.sh | |
# | |
# To bookmark a folder, simply go to that folder, then bookmark it like so: | |
# bookmark foo | |
# | |
# The bookmark will be named "foo" | |
# | |
# When you want to get back to that folder use: | |
# go foo | |
# | |
# To see a list of bookmarks: | |
# bookmarksshow | |
# | |
# Tab completion works, to go to the shoobie bookmark: | |
# go sho[tab] | |
# | |
# Your bookmarks are stored in the ~/.bookmarks file | |
bookmarks_file=Bash2Py(os.path.expanduser("~+"/+".+"b+"o+"o+"k+"m+"a+"r+"k+"s)) | |
# Create bookmarks_file it if it doesn't exist | |
if [[ ! -f $bookmarks_file ]]; then touch $bookmarks_file fi | |
# Create bookmarks_file it if it doesn't exist | |
if (not os.path.isfile(str(bookmarks_file.val)) ): subprocess.call(["touch",str(bookmarks_file.val)],shell=True) | |
bookmark (){ bookmark_name=$1 if [[ -z $bookmark_name ]]; then echo 'Invalid name, please provide a name for your bookmark. For example:' echo ' bookmark foo' else bookmark="`pwd`|$bookmark_name" # Store the bookmark as folder|name if [[ -z `grep "|$bookmark_name" $bookmarks_file` ]]; then echo $bookmark >> $bookmarks_file echo "Bookmark '$bookmark_name' saved" else echo "Bookmark '$bookmark_name' already exists. Replace it? (y or n)" while read replace do if [[ $replace = "y" ]]; then # Delete existing bookmark sed "/.*|$bookmark_name/d" $bookmarks_file > ~/.tmp && mv ~/.tmp $bookmarks_file # Save new bookmark echo $bookmark >> $bookmarks_file echo "Bookmark '$bookmark_name' saved" break elif [[ $replace = "n" ]]; then break else echo "Please type 'y' or 'n'" fi done fi fi } | |
def bookmark (_p1) : global bookmark_name global bookmark global bookmarks_file global replace Make("bookmark_name").setValue(_p1) if (str(bookmark_name.val) == '' ): print("Invalid name, please provide a name for your bookmark. For example:") print(" bookmark foo") else: Make("bookmark").setValue(os.popen("pwd").read().rstrip("\n")+"|"+str(bookmark_name.val)) # Store the bookmark as folder|name | |
if (os.popen("grep \"|"+str(bookmark_name.val)+"\" "+str(bookmarks_file.val)).read().rstrip("\n") == '' ): print(bookmark.val,stdout=file('$bookmarks_file','ab')) print("Bookmark '"+str(bookmark_name.val)+"' saved") else: print("Bookmark '"+str(bookmark_name.val)+"' already exists. Replace it? (y or n)") while (replace = Bash2Py(raw_input())): if (str(replace.val) == "y" ): # Delete existing bookmark | |
if subprocess.call("sed" + " " + "/.*|"+str(bookmark_name.val)+"/d" + " " + str(bookmarks_file.val),shell=True,stdout=file('~/.tmp','wb')) : subprocess.call(["mv",os.path.expanduser("~+"/+".+"t+"m+"p),str(bookmarks_file.val)],shell=True) # Save new bookmark | |
print(bookmark.val,stdout=file('$bookmarks_file','ab')) print("Bookmark '"+str(bookmark_name.val)+"' saved") break elif (str(replace.val) == "n" ): break else: print("Please type 'y' or 'n'") | |
# Delete the named bookmark from the list | |
bookmarkdelete (){ bookmark_name=$1 if [[ -z $bookmark_name ]]; then echo 'Invalid name, please provide the name of the bookmark to delete.' else bookmark=`grep "|$bookmark_name$" "$bookmarks_file"` if [[ -z $bookmark ]]; then echo 'Invalid name, please provide a valid bookmark name.' else cat $bookmarks_file | grep -v "|$bookmark_name$" $bookmarks_file > bookmarks_temp && mv bookmarks_temp $bookmarks_file echo "Bookmark '$bookmark_name' deleted" fi fi } | |
# Delete the named bookmark from the list | |
def bookmarkdelete (_p1) : global bookmark_name global bookmark global bookmarks_file Make("bookmark_name").setValue(_p1) if (str(bookmark_name.val) == '' ): print("Invalid name, please provide the name of the bookmark to delete.") else: Make("bookmark").setValue(os.popen("grep \"|"+str(bookmark_name.val)+"$\" \""+str(bookmarks_file.val)+"\"").read().rstrip("\n")) if (str(bookmark.val) == '' ): print("Invalid name, please provide a valid bookmark name.") else: if _rcr5, _rcw5 = os.pipe() if os.fork(): os.close(_rcw5) os.dup2(_rcr5, 0) subprocess.call("grep" + " " + "-v" + " " + "|"+str(bookmark_name.val)+"$" + " " + str(bookmarks_file.val),shell=True,stdout=file('bookmarks_temp','wb')) else: os.close(_rcr5) os.dup2(_rcw5, 1) subprocess.call(["cat",str(bookmarks_file.val)],shell=True) sys.exit(0) : subprocess.call(["mv","bookmarks_temp",str(bookmarks_file.val)],shell=True) print("Bookmark '"+str(bookmark_name.val)+"' deleted") | |
# Show a list of the bookmarks | |
bookmarksshow (){ cat $bookmarks_file | awk '{ printf "%-40s%-40s%s\n",$1,$2,$3}' FS=\| } | |
# Show a list of the bookmarks | |
def bookmarksshow () : global bookmarks_file _rcr1, _rcw1 = os.pipe() if os.fork(): os.close(_rcw1) os.dup2(_rcr1, 0) subprocess.call(["awk","{ printf \"%-40s%-40s%s\\n\",$1,$2,$3}","FS=\|"],shell=True) else: os.close(_rcr1) os.dup2(_rcw1, 1) subprocess.call(["cat",str(bookmarks_file.val)],shell=True) sys.exit(0) | |
go(){ bookmark_name=$1 bookmark=`grep "|$bookmark_name$" "$bookmarks_file"` if [[ -z $bookmark ]]; then echo 'Invalid name, please provide a valid bookmark name. For example:' echo ' go foo' echo echo 'To bookmark a folder, go to the folder then do this (naming the bookmark 'foo'):' echo ' bookmark foo' else dir=`echo "$bookmark" | cut -d\| -f1` cd "$dir" fi } | |
def go (_p1) : global bookmark_name global bookmark global bookmarks_file global dir Make("bookmark_name").setValue(_p1) bookmark=Bash2Py(os.popen("grep \"|"+str(bookmark_name.val)+"$\" \""+str(bookmarks_file.val)+"\"").read().rstrip("\n")) if (str(bookmark.val) == '' ): print("Invalid name, please provide a valid bookmark name. For example:") print(" go foo") print() print("To bookmark a folder, go to the folder then do this (naming the bookmark foo):") print(" bookmark foo") else: Make("dir").setValue(os.popen("echo \""+str(bookmark.val)+"\" | cut -d| -f1").read().rstrip("\n")) os.chdir(str(dir.val)) | |
_go_complete(){ # Get a list of bookmark names, then grep for what was entered to narrow the list cat $bookmarks_file | cut -d\| -f2 | grep "$2.*" } | |
def _go_complete (_p1,_p2) : global bookmarks_file # Get a list of bookmark names, then grep for what was entered to narrow the list | |
_rcr1, _rcw1 = os.pipe() if os.fork(): os.close(_rcw1) os.dup2(_rcr1, 0) _rcr2, _rcw2 = os.pipe() if os.fork(): os.close(_rcw2) os.dup2(_rcr2, 0) subprocess.call(["grep",str(_p2)+".*"],shell=True) else: os.close(_rcr2) os.dup2(_rcw2, 1) subprocess.call(["cut","-d\|","-f2"],shell=True) sys.exit(0) else: os.close(_rcr1) os.dup2(_rcw1, 1) subprocess.call(["cat",str(bookmarks_file.val)],shell=True) sys.exit(0) | |
complete -C _go_complete -o default go | |
_rc0 = subprocess.call(["complete","-C","_go_complete","-o","default","go"],shell=True) | |
ÿ |