mirror of
https://github.com/wting/autojump
synced 2024-10-27 20:34:07 +00:00
Fish shell allows users to put function files in a directory which are loaded as command line commands during login See https://fishshell.com/docs/current/tutorial.html#tut_autoload for more - Add an option to install autojump.fish to a user's fish function directory (typically ~/.config/fish/functions) - During system install, copy the autojump.fish function file to /usr/share/fish/vendor_functions.d, the system fish function directory - On a non-system install, print instructions to add the autojump's fish function directory to the user's fish function path
226 lines
8.0 KiB
Python
Executable File
226 lines
8.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import platform
|
|
import shutil
|
|
import sys
|
|
|
|
sys.path.append('bin')
|
|
from autojump_argparse import ArgumentParser # noqa
|
|
|
|
SUPPORTED_SHELLS = ('bash', 'zsh', 'fish', 'tcsh')
|
|
|
|
|
|
def cp(src, dest, dryrun=False):
|
|
print('copying file: %s -> %s' % (src, dest))
|
|
if not dryrun:
|
|
shutil.copy(src, dest)
|
|
|
|
|
|
def get_shell():
|
|
return os.path.basename(os.getenv('SHELL', ''))
|
|
|
|
|
|
def mkdir(path, dryrun=False):
|
|
print('creating directory:', path)
|
|
if not dryrun and not os.path.exists(path):
|
|
os.makedirs(path)
|
|
|
|
|
|
def modify_autojump_sh(etc_dir, share_dir, dryrun=False):
|
|
"""Append custom installation path to autojump.sh"""
|
|
custom_install = '\
|
|
\n# check custom install \
|
|
\nif [ -s %s/autojump.${shell} ]; then \
|
|
\n source %s/autojump.${shell} \
|
|
\nfi\n' % (share_dir, share_dir)
|
|
|
|
with open(os.path.join(etc_dir, 'autojump.sh'), 'a') as f:
|
|
f.write(custom_install)
|
|
|
|
|
|
def modify_autojump_lua(clink_dir, bin_dir, dryrun=False):
|
|
"""Prepend custom AUTOJUMP_BIN_DIR definition to autojump.lua"""
|
|
custom_install = "local AUTOJUMP_BIN_DIR = \"%s\"\n" % bin_dir.replace(
|
|
'\\',
|
|
'\\\\')
|
|
clink_file = os.path.join(clink_dir, 'autojump.lua')
|
|
with open(clink_file, 'r') as f:
|
|
original = f.read()
|
|
with open(clink_file, 'w') as f:
|
|
f.write(custom_install + original)
|
|
|
|
|
|
def parse_arguments(): # noqa
|
|
if platform.system() == 'Windows':
|
|
default_user_destdir = os.path.join(
|
|
os.getenv('LOCALAPPDATA', ''),
|
|
'autojump')
|
|
else:
|
|
default_user_destdir = os.path.join(
|
|
os.path.expanduser('~'),
|
|
'.autojump')
|
|
default_user_prefix = ''
|
|
default_user_zshshare = 'functions'
|
|
default_user_fishfunc = 'fish_functions'
|
|
default_system_destdir = '/'
|
|
default_system_prefix = '/usr/local'
|
|
default_system_zshshare = '/usr/share/zsh/site-functions'
|
|
default_system_fishfunc = '/usr/share/fish/vendor_functions.d'
|
|
default_clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
|
|
|
|
parser = ArgumentParser(
|
|
description='Installs autojump globally for root users, otherwise \
|
|
installs in current user\'s home directory.')
|
|
parser.add_argument(
|
|
'-n', '--dryrun', action='store_true', default=False,
|
|
help='simulate installation')
|
|
parser.add_argument(
|
|
'-f', '--force', action='store_true', default=False,
|
|
help='skip root user, shell type, Python version checks')
|
|
parser.add_argument(
|
|
'-d', '--destdir', metavar='DIR', default=default_user_destdir,
|
|
help='set destination to DIR')
|
|
parser.add_argument(
|
|
'-p', '--prefix', metavar='DIR', default=default_user_prefix,
|
|
help='set prefix to DIR')
|
|
parser.add_argument(
|
|
'-z', '--zshshare', metavar='DIR', default=default_user_zshshare,
|
|
help='set zsh share destination to DIR')
|
|
parser.add_argument(
|
|
'-i', '--fishfunc', metavar='DIR', default=default_user_fishfunc,
|
|
help='set fish function destination to DIR')
|
|
parser.add_argument(
|
|
'-c', '--clinkdir', metavar='DIR', default=default_clink_dir,
|
|
help='set clink directory location to DIR (Windows only)')
|
|
parser.add_argument(
|
|
'-s', '--system', action='store_true', default=False,
|
|
help='install system wide for all users')
|
|
|
|
args = parser.parse_args()
|
|
|
|
if not args.force:
|
|
if sys.version_info[0] == 2 and sys.version_info[1] < 6:
|
|
print('Python v2.6+ or v3.0+ required.', file=sys.stderr)
|
|
sys.exit(1)
|
|
if args.system:
|
|
if platform.system() == 'Windows':
|
|
print('System-wide installation is not supported on Windows.',
|
|
file=sys.stderr)
|
|
sys.exit(1)
|
|
elif os.geteuid() != 0:
|
|
print('Please rerun as root for system-wide installation.',
|
|
file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
if platform.system() != 'Windows' \
|
|
and get_shell() not in SUPPORTED_SHELLS:
|
|
print('Unsupported shell: %s' % os.getenv('SHELL'),
|
|
file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
if args.destdir != default_user_destdir \
|
|
or args.prefix != default_user_prefix \
|
|
or args.zshshare != default_user_zshshare \
|
|
or args.fishfunc != default_user_fishfunc:
|
|
args.custom_install = True
|
|
else:
|
|
args.custom_install = False
|
|
|
|
if args.system:
|
|
if args.custom_install:
|
|
print('Custom paths incompatible with --system option.',
|
|
file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
args.destdir = default_system_destdir
|
|
args.prefix = default_system_prefix
|
|
args.zshshare = default_system_zshshare
|
|
args.fishfunc = default_system_fishfunc
|
|
|
|
return args
|
|
|
|
|
|
def show_post_installation_message(args, etc_dir, share_dir, bin_dir, fishfunc_dir):
|
|
if platform.system() == 'Windows':
|
|
print('\nPlease manually add %s to your user path' % bin_dir)
|
|
else:
|
|
if get_shell() == 'fish' and not args.system:
|
|
source_msg = 'set fish_function_path %s $fish_function_path' % fishfunc_dir
|
|
rcfile = '~/.config/fish/config.fish'
|
|
else:
|
|
aj_shell = '%s/autojump.sh' % etc_dir
|
|
source_msg = '[[ -s %s ]] && source %s' % (aj_shell, aj_shell)
|
|
|
|
if platform.system() == 'Darwin' and get_shell() == 'bash':
|
|
rcfile = '~/.profile'
|
|
else:
|
|
rcfile = '~/.%src' % get_shell()
|
|
|
|
print('\nPlease manually add the following line(s) to %s:' % rcfile)
|
|
print('\n\t' + source_msg)
|
|
if get_shell() == 'zsh':
|
|
print('\n\tautoload -U compinit && compinit -u')
|
|
|
|
print('\nPlease restart terminal(s) before running autojump.\n')
|
|
|
|
|
|
def main(args):
|
|
if args.dryrun:
|
|
print('Installing autojump to %s (DRYRUN)...' % args.destdir)
|
|
else:
|
|
print('Installing autojump to %s ...' % args.destdir)
|
|
|
|
bin_dir = os.path.join(args.destdir, args.prefix, 'bin')
|
|
etc_dir = os.path.join(args.destdir, 'etc', 'profile.d')
|
|
doc_dir = os.path.join(args.destdir, args.prefix, 'share', 'man', 'man1')
|
|
share_dir = os.path.join(args.destdir, args.prefix, 'share', 'autojump')
|
|
zshshare_dir = os.path.join(args.destdir, args.zshshare)
|
|
fishfunc_dir = os.path.join(args.destdir, args.fishfunc)
|
|
|
|
mkdir(bin_dir, args.dryrun)
|
|
mkdir(doc_dir, args.dryrun)
|
|
mkdir(etc_dir, args.dryrun)
|
|
mkdir(share_dir, args.dryrun)
|
|
|
|
cp('./bin/autojump', bin_dir, args.dryrun)
|
|
cp('./bin/autojump_argparse.py', bin_dir, args.dryrun)
|
|
cp('./bin/autojump_data.py', bin_dir, args.dryrun)
|
|
cp('./bin/autojump_match.py', bin_dir, args.dryrun)
|
|
cp('./bin/autojump_utils.py', bin_dir, args.dryrun)
|
|
cp('./bin/icon.png', share_dir, args.dryrun)
|
|
cp('./docs/autojump.1', doc_dir, args.dryrun)
|
|
|
|
if platform.system() == 'Windows':
|
|
cp('./bin/autojump.lua', args.clinkdir, args.dryrun)
|
|
cp('./bin/autojump.bat', bin_dir, args.dryrun)
|
|
cp('./bin/j.bat', bin_dir, args.dryrun)
|
|
cp('./bin/jc.bat', bin_dir, args.dryrun)
|
|
cp('./bin/jo.bat', bin_dir, args.dryrun)
|
|
cp('./bin/jco.bat', bin_dir, args.dryrun)
|
|
|
|
if args.custom_install:
|
|
modify_autojump_lua(args.clinkdir, bin_dir, args.dryrun)
|
|
else:
|
|
mkdir(etc_dir, args.dryrun)
|
|
mkdir(share_dir, args.dryrun)
|
|
mkdir(zshshare_dir, args.dryrun)
|
|
mkdir(fishfunc_dir, args.dryrun)
|
|
|
|
cp('./bin/autojump.sh', etc_dir, args.dryrun)
|
|
cp('./bin/autojump.bash', share_dir, args.dryrun)
|
|
cp('./bin/autojump.fish', fishfunc_dir+'/j.fish', args.dryrun)
|
|
cp('./bin/autojump.zsh', share_dir, args.dryrun)
|
|
cp('./bin/_j', zshshare_dir, args.dryrun)
|
|
|
|
if args.custom_install:
|
|
modify_autojump_sh(etc_dir, share_dir, args.dryrun)
|
|
|
|
show_post_installation_message(args, etc_dir, share_dir, bin_dir, fishfunc_dir)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(parse_arguments()))
|