mirror of
https://github.com/wting/autojump
synced 2024-10-27 20:34:07 +00:00
Compare commits
36 Commits
release-v2
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
ff75f542ae | ||
|
96ae111824 | ||
|
06e082c918 | ||
|
af23852374 | ||
|
8fffbad95a | ||
|
daa496bc39 | ||
|
cf358d8fd3 | ||
|
bc4ea61546 | ||
|
8eace445a7 | ||
|
26c81fc39f | ||
|
900ce8e092 | ||
|
89eb573306 | ||
|
0cbfd764f5 | ||
|
a876bc1f39 | ||
|
fc43204ca1 | ||
|
965296f6b2 | ||
|
5ab005ea86 | ||
|
7494d142d5 | ||
|
4f84e755f5 | ||
|
b4e8474769 | ||
|
5e6bb82835 | ||
|
6a529f4f92 | ||
|
b06d686bfe | ||
|
a0719f488e | ||
|
0e4d15ace6 | ||
|
e7aebe69bf | ||
|
9ff654d41d | ||
|
46329ac744 | ||
|
37b336bf98 | ||
|
e8f3cbd874 | ||
|
d5a4fd270d | ||
|
f59e398c48 | ||
|
13a63fbf3a | ||
|
0bf1ad5ba9 | ||
|
3f0eae1be7 | ||
|
b0bc534838 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,5 +5,6 @@ __pycache__
|
|||||||
*~
|
*~
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
*.patch
|
*.patch
|
||||||
|
.pytest_cache
|
||||||
.tox
|
.tox
|
||||||
tags
|
tags
|
||||||
|
@ -1,30 +1,51 @@
|
|||||||
- repo: git@github.com:pre-commit/pre-commit-hooks.git
|
repos:
|
||||||
sha: 35548254adb636ce52b5574eb1904b8c795b673e
|
- repo: git@github.com:pre-commit/pre-commit-hooks.git
|
||||||
hooks:
|
rev: v1.4.0
|
||||||
- id: autopep8-wrapper
|
hooks:
|
||||||
args:
|
- id: autopep8-wrapper
|
||||||
- --in-place
|
language_version: python2
|
||||||
- --aggressive
|
args:
|
||||||
- --aggressive
|
- --in-place
|
||||||
- --max-line-length=131
|
- --aggressive
|
||||||
- id: check-added-large-files
|
- --aggressive
|
||||||
- id: check-ast
|
- --ignore=E731
|
||||||
- id: check-case-conflict
|
- --max-line-length=131
|
||||||
- id: check-docstring-first
|
- id: check-added-large-files
|
||||||
- id: debug-statements
|
language_version: python2
|
||||||
- id: double-quote-string-fixer
|
- id: check-ast
|
||||||
- id: end-of-file-fixer
|
language_version: python2
|
||||||
- id: fix-encoding-pragma
|
- id: check-case-conflict
|
||||||
- id: flake8
|
language_version: python2
|
||||||
args:
|
- id: check-docstring-first
|
||||||
- --max-complexity=10
|
language_version: python2
|
||||||
- --max-line-length=131
|
- id: debug-statements
|
||||||
- --ignore=E126,E128,E731
|
language_version: python2
|
||||||
- --exclude=bin/autojump_argparse.py
|
- id: double-quote-string-fixer
|
||||||
- id: requirements-txt-fixer
|
language_version: python2
|
||||||
- id: trailing-whitespace
|
- id: end-of-file-fixer
|
||||||
- repo: git@github.com:asottile/reorder_python_imports.git
|
language_version: python2
|
||||||
sha: 017e2f64306853ec7f000db52b8280da27eb3b96
|
exclude_types: [batch, lua]
|
||||||
hooks:
|
- id: fix-encoding-pragma
|
||||||
- id: reorder-python-imports
|
language_version: python2
|
||||||
language_version: python2.7
|
- id: flake8
|
||||||
|
language_version: python2
|
||||||
|
args:
|
||||||
|
- --max-complexity=10
|
||||||
|
- --max-line-length=131
|
||||||
|
- --ignore=E402,E731
|
||||||
|
- --exclude=bin/autojump_argparse.py
|
||||||
|
- id: name-tests-test
|
||||||
|
language_version: python2
|
||||||
|
- id: requirements-txt-fixer
|
||||||
|
language_version: python2
|
||||||
|
- id: trailing-whitespace
|
||||||
|
language_version: python2
|
||||||
|
- repo: git@github.com:asottile/reorder_python_imports.git
|
||||||
|
rev: v1.1.1
|
||||||
|
hooks:
|
||||||
|
- id: reorder-python-imports
|
||||||
|
language_version: python2
|
||||||
|
- repo: git@github.com:asottile/add-trailing-comma
|
||||||
|
rev: v0.7.0
|
||||||
|
hooks:
|
||||||
|
- id: add-trailing-comma
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
## Summary of release changes, see commit history for more details:
|
## Summary of release changes, see commit history for more details:
|
||||||
## https://github.com/joelthelion/autojump/commits/master/
|
## https://github.com/wting/autojump/commits/master/
|
||||||
|
|
||||||
### Release v22.4.0:
|
### Release v22.4.0:
|
||||||
- minor zsh performance improvement
|
- minor zsh performance improvement
|
||||||
|
19
Makefile
19
Makefile
@ -1,21 +1,31 @@
|
|||||||
VERSION = $(shell grep -oE "[0-9]+\.[0-9]+\.[0-9]+" bin/autojump)
|
VERSION = $(shell grep -oE "[0-9]+\.[0-9]+\.[0-9]+" bin/autojump)
|
||||||
TAGNAME = release-v$(VERSION)
|
TAGNAME = release-v$(VERSION)
|
||||||
|
|
||||||
.PHONY: clean docs install uninstall pre-commit lint tar test
|
.PHONY: install
|
||||||
|
|
||||||
install:
|
install:
|
||||||
./install.py
|
./install.py
|
||||||
|
|
||||||
|
.PHONY: uninstall
|
||||||
uninstall:
|
uninstall:
|
||||||
./uninstall.py
|
./uninstall.py
|
||||||
|
|
||||||
|
.PHONY: docs
|
||||||
docs:
|
docs:
|
||||||
|
@echo "% autojump(1) ${TAGNAME}" >docs/manpage_header.md
|
||||||
|
@echo "%" >>docs/manpage_header.md
|
||||||
|
@echo "% $(shell \date +%Y-%m-%d)" >>docs/manpage_header.md
|
||||||
pandoc -s -w man docs/manpage_header.md docs/header.md docs/body.md -o docs/autojump.1
|
pandoc -s -w man docs/manpage_header.md docs/header.md docs/body.md -o docs/autojump.1
|
||||||
pandoc -s -w markdown docs/header.md docs/install.md docs/body.md -o README.md
|
pandoc -s -w markdown docs/header.md docs/install.md docs/body.md -o README.md
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
lint: pre-commit
|
||||||
|
@tox -e pre-commit -- run --all-files
|
||||||
|
|
||||||
|
.PHONY: pre-commit
|
||||||
pre-commit:
|
pre-commit:
|
||||||
@tox -e pre-commit -- install -f --install-hooks
|
@tox -e pre-commit -- install -f --install-hooks
|
||||||
|
|
||||||
|
.PHONY: release
|
||||||
release: docs
|
release: docs
|
||||||
# Check for tag existence
|
# Check for tag existence
|
||||||
# git describe release-$(VERSION) 2>&1 >/dev/null || exit 1
|
# git describe release-$(VERSION) 2>&1 >/dev/null || exit 1
|
||||||
@ -33,20 +43,25 @@ release: docs
|
|||||||
git archive --format=tar --prefix autojump_v$(VERSION)/ $(TAGNAME) | gzip > autojump_v$(VERSION).tar.gz
|
git archive --format=tar --prefix autojump_v$(VERSION)/ $(TAGNAME) | gzip > autojump_v$(VERSION).tar.gz
|
||||||
sha1sum autojump_v$(VERSION).tar.gz
|
sha1sum autojump_v$(VERSION).tar.gz
|
||||||
|
|
||||||
|
.PHONY: tar
|
||||||
tar:
|
tar:
|
||||||
# Create tagged archive
|
# Create tagged archive
|
||||||
git archive --format=tar --prefix autojump_v$(VERSION)/ $(TAGNAME) | gzip > autojump_v$(VERSION).tar.gz
|
git archive --format=tar --prefix autojump_v$(VERSION)/ $(TAGNAME) | gzip > autojump_v$(VERSION).tar.gz
|
||||||
sha1sum autojump_v$(VERSION).tar.gz
|
sha1sum autojump_v$(VERSION).tar.gz
|
||||||
|
|
||||||
|
.PHONY: test
|
||||||
test: pre-commit
|
test: pre-commit
|
||||||
@tox
|
@tox
|
||||||
|
|
||||||
|
.PHONY: test-xfail
|
||||||
test-xfail: pre-commit
|
test-xfail: pre-commit
|
||||||
@tox -- --runxfail
|
@tox -- --runxfail
|
||||||
|
|
||||||
|
.PHONY: test-fast
|
||||||
test-fast: pre-commit
|
test-fast: pre-commit
|
||||||
@tox -e py27
|
@tox -e py27
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
@find . -type f -iname '*.py[co]' -delete
|
@find . -type f -iname '*.py[co]' -delete
|
||||||
@find . -type d -iname '__pycache__' -delete
|
@find . -type d -iname '__pycache__' -delete
|
||||||
|
71
README.md
71
README.md
@ -63,29 +63,61 @@ INSTALLATION
|
|||||||
|
|
||||||
### REQUIREMENTS
|
### REQUIREMENTS
|
||||||
|
|
||||||
- Python v2.6+ except v3.2
|
- Python v2.6+ or Python v3.3+
|
||||||
- Supported shells:
|
- Supported shells
|
||||||
- bash v4.0+
|
- bash - first class support
|
||||||
- zsh
|
- zsh - first class support
|
||||||
- fish
|
- fish - community supported
|
||||||
- tcsh (experimental)
|
- tcsh - community supported
|
||||||
- clink (Windows, experimental)
|
- clink - community supported
|
||||||
|
- Supported platforms
|
||||||
|
- Linux - first class support
|
||||||
|
- OS X - first class support
|
||||||
|
- Windows - community supported
|
||||||
|
- BSD - community supported
|
||||||
|
- Supported installation methods
|
||||||
|
- source code - first class support
|
||||||
|
- Debian and derivatives - first class support
|
||||||
|
- ArchLinux / Gentoo / openSUSE / RedHat and derivatives -
|
||||||
|
community supported
|
||||||
|
- Homebrew / MacPorts - community supported
|
||||||
|
|
||||||
|
Due to limited time and resources, only "first class support" items will
|
||||||
|
be maintained by the primary committers. All "community supported" items
|
||||||
|
will be updated based on pull requests submitted by the general public.
|
||||||
|
|
||||||
|
Please continue opening issues and providing feedback for community
|
||||||
|
supported items since consolidating information helps other users
|
||||||
|
troubleshoot and submit enhancements and fixes.
|
||||||
|
|
||||||
|
### MANUAL
|
||||||
|
|
||||||
|
Grab a copy of autojump:
|
||||||
|
|
||||||
|
git clone git://github.com/wting/autojump.git
|
||||||
|
|
||||||
|
Run the installation script and follow on screen instructions.
|
||||||
|
|
||||||
|
cd autojump
|
||||||
|
./install.py or ./uninstall.py
|
||||||
|
|
||||||
### AUTOMATIC
|
### AUTOMATIC
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
autojump is included in the following distro repositories, please use
|
autojump is included in the following distro repositories, please use
|
||||||
relevant package management utilities to install (e.g. yum, apt-get,
|
relevant package management utilities to install (e.g. apt-get, yum,
|
||||||
etc):
|
pacman, etc):
|
||||||
|
|
||||||
- Debian testing/unstable, Ubuntu, Linux Mint
|
- Debian, Ubuntu, Linux Mint
|
||||||
|
|
||||||
All Debian-derived distros require manual activation for policy
|
All Debian-derived distros require manual activation for policy
|
||||||
reasons, please see `/usr/share/doc/autojump/README.Debian`.
|
reasons, please see `/usr/share/doc/autojump/README.Debian`.
|
||||||
|
|
||||||
- RedHat, Fedora, CentOS (install `autojump-zsh` for zsh,
|
- RedHat, Fedora, CentOS
|
||||||
`autojump-fish` for fish, etc.)
|
|
||||||
|
Install `autojump-zsh` for zsh, `autojump-fish` for fish, etc.
|
||||||
|
|
||||||
- ArchLinux
|
- ArchLinux
|
||||||
- Gentoo
|
- Gentoo
|
||||||
- Frugalware
|
- Frugalware
|
||||||
@ -97,7 +129,7 @@ Homebrew is the recommended installation method for Mac OS X:
|
|||||||
|
|
||||||
brew install autojump
|
brew install autojump
|
||||||
|
|
||||||
MacPorts also available:
|
MacPorts is also available:
|
||||||
|
|
||||||
port install autojump
|
port install autojump
|
||||||
|
|
||||||
@ -107,17 +139,6 @@ Windows
|
|||||||
Windows support is enabled by [clink](https://mridgers.github.io/clink/)
|
Windows support is enabled by [clink](https://mridgers.github.io/clink/)
|
||||||
which should be installed prior to installing autojump.
|
which should be installed prior to installing autojump.
|
||||||
|
|
||||||
### MANUAL
|
|
||||||
|
|
||||||
Grab a copy of autojump:
|
|
||||||
|
|
||||||
git clone git://github.com/joelthelion/autojump.git
|
|
||||||
|
|
||||||
Run the installation script and follow on screen instructions.
|
|
||||||
|
|
||||||
cd autojump
|
|
||||||
./install.py or ./uninstall.py
|
|
||||||
|
|
||||||
KNOWN ISSUES
|
KNOWN ISSUES
|
||||||
------------
|
------------
|
||||||
|
|
||||||
@ -137,7 +158,7 @@ REPORTING BUGS
|
|||||||
|
|
||||||
For any questions or issues please visit:
|
For any questions or issues please visit:
|
||||||
|
|
||||||
https://github.com/joelthelion/autojump/issues
|
https://github.com/wting/autojump/issues
|
||||||
|
|
||||||
AUTHORS
|
AUTHORS
|
||||||
-------
|
-------
|
||||||
|
132
bin/autojump
132
bin/autojump
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
Copyright © 2008-2012 Joel Schaerer
|
Copyright © 2008-2012 Joel Schaerer
|
||||||
@ -20,12 +20,12 @@
|
|||||||
"""
|
"""
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
from math import sqrt
|
from math import sqrt
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
if sys.version_info[0] == 3:
|
if sys.version_info[0] == 3:
|
||||||
ifilter = filter
|
ifilter = filter
|
||||||
@ -65,7 +65,7 @@ from autojump_utils import sanitize
|
|||||||
from autojump_utils import take
|
from autojump_utils import take
|
||||||
from autojump_utils import unico
|
from autojump_utils import unico
|
||||||
|
|
||||||
VERSION = '22.5.0'
|
VERSION = '22.5.3'
|
||||||
FUZZY_MATCH_THRESHOLD = 0.6
|
FUZZY_MATCH_THRESHOLD = 0.6
|
||||||
TAB_ENTRIES_COUNT = 9
|
TAB_ENTRIES_COUNT = 9
|
||||||
TAB_SEPARATOR = '__'
|
TAB_SEPARATOR = '__'
|
||||||
@ -75,14 +75,9 @@ def set_defaults():
|
|||||||
config = {}
|
config = {}
|
||||||
|
|
||||||
if is_osx():
|
if is_osx():
|
||||||
data_home = os.path.join(
|
data_home = os.path.join(os.path.expanduser('~'), 'Library')
|
||||||
os.path.expanduser('~'),
|
|
||||||
'Library',
|
|
||||||
'autojump')
|
|
||||||
elif is_windows():
|
elif is_windows():
|
||||||
data_home = os.path.join(
|
data_home = os.getenv('APPDATA')
|
||||||
os.getenv('APPDATA'),
|
|
||||||
'autojump')
|
|
||||||
else:
|
else:
|
||||||
data_home = os.getenv(
|
data_home = os.getenv(
|
||||||
'XDG_DATA_HOME',
|
'XDG_DATA_HOME',
|
||||||
@ -90,10 +85,10 @@ def set_defaults():
|
|||||||
os.path.expanduser('~'),
|
os.path.expanduser('~'),
|
||||||
'.local',
|
'.local',
|
||||||
'share',
|
'share',
|
||||||
'autojump'))
|
),
|
||||||
|
)
|
||||||
config['data_path'] = os.path.join(data_home, 'autojump.txt')
|
config['data_path'] = os.path.join(data_home, 'autojump', 'autojump.txt')
|
||||||
config['backup_path'] = os.path.join(data_home, 'autojump.txt.bak')
|
config['backup_path'] = os.path.join(data_home, 'autojump', 'autojump.txt.bak')
|
||||||
|
|
||||||
return config
|
return config
|
||||||
|
|
||||||
@ -101,33 +96,42 @@ def set_defaults():
|
|||||||
def parse_arguments():
|
def parse_arguments():
|
||||||
parser = ArgumentParser(
|
parser = ArgumentParser(
|
||||||
description='Automatically jump to directory passed as an argument.',
|
description='Automatically jump to directory passed as an argument.',
|
||||||
epilog="Please see autojump(1) man pages for full documentation.")
|
epilog='Please see autojump(1) man pages for full documentation.',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'directory', metavar='DIRECTORY', nargs='*', default='',
|
'directory', metavar='DIRECTORY', nargs='*', default='',
|
||||||
help='directory to jump to')
|
help='directory to jump to',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-a', '--add', metavar='DIRECTORY',
|
'-a', '--add', metavar='DIRECTORY',
|
||||||
help='add path')
|
help='add path',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-i', '--increase', metavar='WEIGHT', nargs='?', type=int,
|
'-i', '--increase', metavar='WEIGHT', nargs='?', type=int,
|
||||||
const=10, default=False,
|
const=10, default=False,
|
||||||
help='increase current directory weight')
|
help='increase current directory weight',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-d', '--decrease', metavar='WEIGHT', nargs='?', type=int,
|
'-d', '--decrease', metavar='WEIGHT', nargs='?', type=int,
|
||||||
const=15, default=False,
|
const=15, default=False,
|
||||||
help='decrease current directory weight')
|
help='decrease current directory weight',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--complete', action="store_true", default=False,
|
'--complete', action='store_true', default=False,
|
||||||
help='used for tab completion')
|
help='used for tab completion',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--purge', action="store_true", default=False,
|
'--purge', action='store_true', default=False,
|
||||||
help='remove non-existent paths from database')
|
help='remove non-existent paths from database',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-s', '--stat', action="store_true", default=False,
|
'-s', '--stat', action='store_true', default=False,
|
||||||
help='show database entries and their key weights')
|
help='show database entries and their key weights',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-v', '--version', action="version", version="%(prog)s v" +
|
'-v', '--version', action='version', version='%(prog)s v' +
|
||||||
VERSION, help='show version information')
|
VERSION, help='show version information',
|
||||||
|
)
|
||||||
|
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
@ -167,7 +171,7 @@ def detect_smartcase(needles):
|
|||||||
def find_matches(entries, needles, check_entries=True):
|
def find_matches(entries, needles, check_entries=True):
|
||||||
"""Return an iterator to matching entries."""
|
"""Return an iterator to matching entries."""
|
||||||
# TODO(wting|2014-02-24): replace assertion with unit test
|
# TODO(wting|2014-02-24): replace assertion with unit test
|
||||||
assert isinstance(needles, list), "Needles must be a list."
|
assert isinstance(needles, list), 'Needles must be a list.'
|
||||||
ignore_case = detect_smartcase(needles)
|
ignore_case = detect_smartcase(needles)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -187,14 +191,17 @@ def find_matches(entries, needles, check_entries=True):
|
|||||||
data = sorted(
|
data = sorted(
|
||||||
entries,
|
entries,
|
||||||
key=attrgetter('weight', 'path'),
|
key=attrgetter('weight', 'path'),
|
||||||
reverse=True)
|
reverse=True,
|
||||||
|
)
|
||||||
|
|
||||||
return ifilter(
|
return ifilter(
|
||||||
lambda entry: not is_cwd(entry) and path_exists(entry),
|
lambda entry: not is_cwd(entry) and path_exists(entry),
|
||||||
chain(
|
chain(
|
||||||
match_consecutive(needles, data, ignore_case),
|
match_consecutive(needles, data, ignore_case),
|
||||||
match_fuzzy(needles, data, ignore_case),
|
match_fuzzy(needles, data, ignore_case),
|
||||||
match_anywhere(needles, data, ignore_case)))
|
match_anywhere(needles, data, ignore_case),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def handle_tab_completion(needle, entries):
|
def handle_tab_completion(needle, entries):
|
||||||
@ -206,24 +213,33 @@ def handle_tab_completion(needle, entries):
|
|||||||
get_ith_path = lambda i, iterable: last(take(i, iterable)).path
|
get_ith_path = lambda i, iterable: last(take(i, iterable)).path
|
||||||
print_local(get_ith_path(
|
print_local(get_ith_path(
|
||||||
tab_index,
|
tab_index,
|
||||||
find_matches(entries, [tab_needle], check_entries=False)))
|
find_matches(entries, [tab_needle], check_entries=False),
|
||||||
|
))
|
||||||
elif tab_needle:
|
elif tab_needle:
|
||||||
# found partial tab completion entry
|
# found partial tab completion entry
|
||||||
print_tab_menu(
|
print_tab_menu(
|
||||||
tab_needle,
|
tab_needle,
|
||||||
take(TAB_ENTRIES_COUNT, find_matches(
|
take(
|
||||||
entries,
|
TAB_ENTRIES_COUNT, find_matches(
|
||||||
[tab_needle],
|
entries,
|
||||||
check_entries=False)),
|
[tab_needle],
|
||||||
TAB_SEPARATOR)
|
check_entries=False,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TAB_SEPARATOR,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
print_tab_menu(
|
print_tab_menu(
|
||||||
needle,
|
needle,
|
||||||
take(TAB_ENTRIES_COUNT, find_matches(
|
take(
|
||||||
entries,
|
TAB_ENTRIES_COUNT, find_matches(
|
||||||
[needle],
|
entries,
|
||||||
check_entries=False)),
|
[needle],
|
||||||
TAB_SEPARATOR)
|
check_entries=False,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TAB_SEPARATOR,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def purge_missing_paths(entries):
|
def purge_missing_paths(entries):
|
||||||
@ -236,25 +252,26 @@ def print_stats(data, data_path):
|
|||||||
for path, weight in sorted(data.items(), key=itemgetter(1)):
|
for path, weight in sorted(data.items(), key=itemgetter(1)):
|
||||||
print_entry(Entry(path, weight))
|
print_entry(Entry(path, weight))
|
||||||
|
|
||||||
print("________________________________________\n")
|
print('________________________________________\n')
|
||||||
print("%d:\t total weight" % sum(data.values()))
|
print('%d:\t total weight' % sum(data.values()))
|
||||||
print("%d:\t number of entries" % len(data))
|
print('%d:\t number of entries' % len(data))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
print_local(
|
print_local(
|
||||||
"%.2f:\t current directory weight" % data.get(os.getcwdu(), 0))
|
'%.2f:\t current directory weight' % data.get(os.getcwdu(), 0),
|
||||||
|
)
|
||||||
except OSError:
|
except OSError:
|
||||||
# current directory no longer exists
|
# current directory no longer exists
|
||||||
pass
|
pass
|
||||||
|
|
||||||
print("\ndata:\t %s" % data_path)
|
print('\ndata:\t %s' % data_path)
|
||||||
|
|
||||||
|
|
||||||
def main(args): # noqa
|
def main(args): # noqa
|
||||||
if not is_autojump_sourced() and not is_windows():
|
if not is_autojump_sourced() and not is_windows():
|
||||||
print("Please source the correct autojump file in your shell's")
|
print("Please source the correct autojump file in your shell's")
|
||||||
print("startup file. For more information, please reinstall autojump")
|
print('startup file. For more information, please reinstall autojump')
|
||||||
print("and read the post installation instructions.")
|
print('and read the post installation instructions.')
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
config = set_defaults()
|
config = set_defaults()
|
||||||
@ -265,7 +282,8 @@ def main(args): # noqa
|
|||||||
elif args.complete:
|
elif args.complete:
|
||||||
handle_tab_completion(
|
handle_tab_completion(
|
||||||
needle=first(chain(sanitize(args.directory), [''])),
|
needle=first(chain(sanitize(args.directory), [''])),
|
||||||
entries=entriefy(load(config)))
|
entries=entriefy(load(config)),
|
||||||
|
)
|
||||||
elif args.decrease:
|
elif args.decrease:
|
||||||
data, entry = decrease_path(load(config), get_pwd(), args.decrease)
|
data, entry = decrease_path(load(config), get_pwd(), args.decrease)
|
||||||
save(config, data)
|
save(config, data)
|
||||||
@ -278,7 +296,7 @@ def main(args): # noqa
|
|||||||
old_data = load(config)
|
old_data = load(config)
|
||||||
new_data = dictify(purge_missing_paths(entriefy(old_data)))
|
new_data = dictify(purge_missing_paths(entriefy(old_data)))
|
||||||
save(config, new_data)
|
save(config, new_data)
|
||||||
print("Purged %d entries." % (len(old_data) - len(new_data)))
|
print('Purged %d entries.' % (len(old_data) - len(new_data)))
|
||||||
elif args.stat:
|
elif args.stat:
|
||||||
print_stats(load(config), config['data_path'])
|
print_stats(load(config), config['data_path'])
|
||||||
elif not args.directory:
|
elif not args.directory:
|
||||||
@ -287,7 +305,8 @@ def main(args): # noqa
|
|||||||
print_local(first(chain(
|
print_local(first(chain(
|
||||||
imap(attrgetter('path'), find_matches(entries, [''])),
|
imap(attrgetter('path'), find_matches(entries, [''])),
|
||||||
# always return a path to calling shell functions
|
# always return a path to calling shell functions
|
||||||
['.'])))
|
['.'],
|
||||||
|
)))
|
||||||
else:
|
else:
|
||||||
entries = entriefy(load(config))
|
entries = entriefy(load(config))
|
||||||
needles = sanitize(args.directory)
|
needles = sanitize(args.directory)
|
||||||
@ -306,15 +325,18 @@ def main(args): # noqa
|
|||||||
print_local(
|
print_local(
|
||||||
get_ith_path(
|
get_ith_path(
|
||||||
tab_index,
|
tab_index,
|
||||||
find_matches(entries, [tab_needle])))
|
find_matches(entries, [tab_needle]),
|
||||||
|
),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
print_local(first(chain(
|
print_local(first(chain(
|
||||||
imap(attrgetter('path'), find_matches(entries, needles)),
|
imap(attrgetter('path'), find_matches(entries, needles)),
|
||||||
# always return a path to calling shell functions
|
# always return a path to calling shell functions
|
||||||
['.'])))
|
['.'],
|
||||||
|
)))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == '__main__':
|
||||||
sys.exit(main(parse_arguments()))
|
sys.exit(main(parse_arguments()))
|
||||||
|
@ -175,11 +175,13 @@ class HelpFormatter(object):
|
|||||||
provided by the class are considered an implementation detail.
|
provided by the class are considered an implementation detail.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
prog,
|
self,
|
||||||
indent_increment=2,
|
prog,
|
||||||
max_help_position=24,
|
indent_increment=2,
|
||||||
width=None):
|
max_help_position=24,
|
||||||
|
width=None,
|
||||||
|
):
|
||||||
|
|
||||||
# default setting for width
|
# default setting for width
|
||||||
if width is None:
|
if width is None:
|
||||||
@ -286,8 +288,10 @@ class HelpFormatter(object):
|
|||||||
# update the maximum item length
|
# update the maximum item length
|
||||||
invocation_length = max([len(s) for s in invocations])
|
invocation_length = max([len(s) for s in invocations])
|
||||||
action_length = invocation_length + self._current_indent
|
action_length = invocation_length + self._current_indent
|
||||||
self._action_max_length = max(self._action_max_length,
|
self._action_max_length = max(
|
||||||
action_length)
|
self._action_max_length,
|
||||||
|
action_length,
|
||||||
|
)
|
||||||
|
|
||||||
# add the item to the list
|
# add the item to the list
|
||||||
self._add_item(self._format_action, [action])
|
self._add_item(self._format_action, [action])
|
||||||
@ -307,9 +311,11 @@ class HelpFormatter(object):
|
|||||||
return help
|
return help
|
||||||
|
|
||||||
def _join_parts(self, part_strings):
|
def _join_parts(self, part_strings):
|
||||||
return ''.join([part
|
return ''.join([
|
||||||
for part in part_strings
|
part
|
||||||
if part and part is not SUPPRESS])
|
for part in part_strings
|
||||||
|
if part and part is not SUPPRESS
|
||||||
|
])
|
||||||
|
|
||||||
def _format_usage(self, usage, actions, groups, prefix):
|
def _format_usage(self, usage, actions, groups, prefix):
|
||||||
if prefix is None:
|
if prefix is None:
|
||||||
@ -508,8 +514,10 @@ class HelpFormatter(object):
|
|||||||
|
|
||||||
def _format_action(self, action):
|
def _format_action(self, action):
|
||||||
# determine the required width and the entry label
|
# determine the required width and the entry label
|
||||||
help_position = min(self._action_max_length + 2,
|
help_position = min(
|
||||||
self._max_help_position)
|
self._action_max_length + 2,
|
||||||
|
self._max_help_position,
|
||||||
|
)
|
||||||
help_width = self._width - help_position
|
help_width = self._width - help_position
|
||||||
action_width = help_position - self._current_indent - 2
|
action_width = help_position - self._current_indent - 2
|
||||||
action_header = self._format_action_invocation(action)
|
action_header = self._format_action_invocation(action)
|
||||||
@ -641,8 +649,10 @@ class HelpFormatter(object):
|
|||||||
|
|
||||||
def _fill_text(self, text, width, indent):
|
def _fill_text(self, text, width, indent):
|
||||||
text = self._whitespace_matcher.sub(' ', text).strip()
|
text = self._whitespace_matcher.sub(' ', text).strip()
|
||||||
return _textwrap.fill(text, width, initial_indent=indent,
|
return _textwrap.fill(
|
||||||
subsequent_indent=indent)
|
text, width, initial_indent=indent,
|
||||||
|
subsequent_indent=indent,
|
||||||
|
)
|
||||||
|
|
||||||
def _get_help_string(self, action):
|
def _get_help_string(self, action):
|
||||||
return action.help
|
return action.help
|
||||||
@ -724,8 +734,10 @@ class ArgumentError(Exception):
|
|||||||
format = '%(message)s'
|
format = '%(message)s'
|
||||||
else:
|
else:
|
||||||
format = 'argument %(argument_name)s: %(message)s'
|
format = 'argument %(argument_name)s: %(message)s'
|
||||||
return format % dict(message=self.message,
|
return format % dict(
|
||||||
argument_name=self.argument_name)
|
message=self.message,
|
||||||
|
argument_name=self.argument_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ArgumentTypeError(Exception):
|
class ArgumentTypeError(Exception):
|
||||||
@ -790,17 +802,19 @@ class Action(_AttributeHolder):
|
|||||||
help string. If None, the 'dest' value will be used as the name.
|
help string. If None, the 'dest' value will be used as the name.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
nargs=None,
|
dest,
|
||||||
const=None,
|
nargs=None,
|
||||||
default=None,
|
const=None,
|
||||||
type=None,
|
default=None,
|
||||||
choices=None,
|
type=None,
|
||||||
required=False,
|
choices=None,
|
||||||
help=None,
|
required=False,
|
||||||
metavar=None):
|
help=None,
|
||||||
|
metavar=None,
|
||||||
|
):
|
||||||
self.option_strings = option_strings
|
self.option_strings = option_strings
|
||||||
self.dest = dest
|
self.dest = dest
|
||||||
self.nargs = nargs
|
self.nargs = nargs
|
||||||
@ -832,21 +846,25 @@ class Action(_AttributeHolder):
|
|||||||
|
|
||||||
class _StoreAction(Action):
|
class _StoreAction(Action):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
nargs=None,
|
dest,
|
||||||
const=None,
|
nargs=None,
|
||||||
default=None,
|
const=None,
|
||||||
type=None,
|
default=None,
|
||||||
choices=None,
|
type=None,
|
||||||
required=False,
|
choices=None,
|
||||||
help=None,
|
required=False,
|
||||||
metavar=None):
|
help=None,
|
||||||
|
metavar=None,
|
||||||
|
):
|
||||||
if nargs == 0:
|
if nargs == 0:
|
||||||
raise ValueError('nargs for store actions must be > 0; if you '
|
raise ValueError(
|
||||||
'have nothing to store, actions such as store '
|
'nargs for store actions must be > 0; if you '
|
||||||
'true or store const may be more appropriate')
|
'have nothing to store, actions such as store '
|
||||||
|
'true or store const may be more appropriate',
|
||||||
|
)
|
||||||
if const is not None and nargs != OPTIONAL:
|
if const is not None and nargs != OPTIONAL:
|
||||||
raise ValueError('nargs must be %r to supply const' % OPTIONAL)
|
raise ValueError('nargs must be %r to supply const' % OPTIONAL)
|
||||||
super(_StoreAction, self).__init__(
|
super(_StoreAction, self).__init__(
|
||||||
@ -859,7 +877,8 @@ class _StoreAction(Action):
|
|||||||
choices=choices,
|
choices=choices,
|
||||||
required=required,
|
required=required,
|
||||||
help=help,
|
help=help,
|
||||||
metavar=metavar)
|
metavar=metavar,
|
||||||
|
)
|
||||||
|
|
||||||
def __call__(self, parser, namespace, values, option_string=None):
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
setattr(namespace, self.dest, values)
|
setattr(namespace, self.dest, values)
|
||||||
@ -867,14 +886,16 @@ class _StoreAction(Action):
|
|||||||
|
|
||||||
class _StoreConstAction(Action):
|
class _StoreConstAction(Action):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
const,
|
dest,
|
||||||
default=None,
|
const,
|
||||||
required=False,
|
default=None,
|
||||||
help=None,
|
required=False,
|
||||||
metavar=None):
|
help=None,
|
||||||
|
metavar=None,
|
||||||
|
):
|
||||||
super(_StoreConstAction, self).__init__(
|
super(_StoreConstAction, self).__init__(
|
||||||
option_strings=option_strings,
|
option_strings=option_strings,
|
||||||
dest=dest,
|
dest=dest,
|
||||||
@ -882,7 +903,8 @@ class _StoreConstAction(Action):
|
|||||||
const=const,
|
const=const,
|
||||||
default=default,
|
default=default,
|
||||||
required=required,
|
required=required,
|
||||||
help=help)
|
help=help,
|
||||||
|
)
|
||||||
|
|
||||||
def __call__(self, parser, namespace, values, option_string=None):
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
setattr(namespace, self.dest, self.const)
|
setattr(namespace, self.dest, self.const)
|
||||||
@ -890,55 +912,65 @@ class _StoreConstAction(Action):
|
|||||||
|
|
||||||
class _StoreTrueAction(_StoreConstAction):
|
class _StoreTrueAction(_StoreConstAction):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
default=False,
|
dest,
|
||||||
required=False,
|
default=False,
|
||||||
help=None):
|
required=False,
|
||||||
|
help=None,
|
||||||
|
):
|
||||||
super(_StoreTrueAction, self).__init__(
|
super(_StoreTrueAction, self).__init__(
|
||||||
option_strings=option_strings,
|
option_strings=option_strings,
|
||||||
dest=dest,
|
dest=dest,
|
||||||
const=True,
|
const=True,
|
||||||
default=default,
|
default=default,
|
||||||
required=required,
|
required=required,
|
||||||
help=help)
|
help=help,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class _StoreFalseAction(_StoreConstAction):
|
class _StoreFalseAction(_StoreConstAction):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
default=True,
|
dest,
|
||||||
required=False,
|
default=True,
|
||||||
help=None):
|
required=False,
|
||||||
|
help=None,
|
||||||
|
):
|
||||||
super(_StoreFalseAction, self).__init__(
|
super(_StoreFalseAction, self).__init__(
|
||||||
option_strings=option_strings,
|
option_strings=option_strings,
|
||||||
dest=dest,
|
dest=dest,
|
||||||
const=False,
|
const=False,
|
||||||
default=default,
|
default=default,
|
||||||
required=required,
|
required=required,
|
||||||
help=help)
|
help=help,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class _AppendAction(Action):
|
class _AppendAction(Action):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
nargs=None,
|
dest,
|
||||||
const=None,
|
nargs=None,
|
||||||
default=None,
|
const=None,
|
||||||
type=None,
|
default=None,
|
||||||
choices=None,
|
type=None,
|
||||||
required=False,
|
choices=None,
|
||||||
help=None,
|
required=False,
|
||||||
metavar=None):
|
help=None,
|
||||||
|
metavar=None,
|
||||||
|
):
|
||||||
if nargs == 0:
|
if nargs == 0:
|
||||||
raise ValueError('nargs for append actions must be > 0; if arg '
|
raise ValueError(
|
||||||
'strings are not supplying the value to append, '
|
'nargs for append actions must be > 0; if arg '
|
||||||
'the append const action may be more appropriate')
|
'strings are not supplying the value to append, '
|
||||||
|
'the append const action may be more appropriate',
|
||||||
|
)
|
||||||
if const is not None and nargs != OPTIONAL:
|
if const is not None and nargs != OPTIONAL:
|
||||||
raise ValueError('nargs must be %r to supply const' % OPTIONAL)
|
raise ValueError('nargs must be %r to supply const' % OPTIONAL)
|
||||||
super(_AppendAction, self).__init__(
|
super(_AppendAction, self).__init__(
|
||||||
@ -951,7 +983,8 @@ class _AppendAction(Action):
|
|||||||
choices=choices,
|
choices=choices,
|
||||||
required=required,
|
required=required,
|
||||||
help=help,
|
help=help,
|
||||||
metavar=metavar)
|
metavar=metavar,
|
||||||
|
)
|
||||||
|
|
||||||
def __call__(self, parser, namespace, values, option_string=None):
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
items = _copy.copy(_ensure_value(namespace, self.dest, []))
|
items = _copy.copy(_ensure_value(namespace, self.dest, []))
|
||||||
@ -961,14 +994,16 @@ class _AppendAction(Action):
|
|||||||
|
|
||||||
class _AppendConstAction(Action):
|
class _AppendConstAction(Action):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
const,
|
dest,
|
||||||
default=None,
|
const,
|
||||||
required=False,
|
default=None,
|
||||||
help=None,
|
required=False,
|
||||||
metavar=None):
|
help=None,
|
||||||
|
metavar=None,
|
||||||
|
):
|
||||||
super(_AppendConstAction, self).__init__(
|
super(_AppendConstAction, self).__init__(
|
||||||
option_strings=option_strings,
|
option_strings=option_strings,
|
||||||
dest=dest,
|
dest=dest,
|
||||||
@ -977,7 +1012,8 @@ class _AppendConstAction(Action):
|
|||||||
default=default,
|
default=default,
|
||||||
required=required,
|
required=required,
|
||||||
help=help,
|
help=help,
|
||||||
metavar=metavar)
|
metavar=metavar,
|
||||||
|
)
|
||||||
|
|
||||||
def __call__(self, parser, namespace, values, option_string=None):
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
items = _copy.copy(_ensure_value(namespace, self.dest, []))
|
items = _copy.copy(_ensure_value(namespace, self.dest, []))
|
||||||
@ -987,19 +1023,22 @@ class _AppendConstAction(Action):
|
|||||||
|
|
||||||
class _CountAction(Action):
|
class _CountAction(Action):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest,
|
option_strings,
|
||||||
default=None,
|
dest,
|
||||||
required=False,
|
default=None,
|
||||||
help=None):
|
required=False,
|
||||||
|
help=None,
|
||||||
|
):
|
||||||
super(_CountAction, self).__init__(
|
super(_CountAction, self).__init__(
|
||||||
option_strings=option_strings,
|
option_strings=option_strings,
|
||||||
dest=dest,
|
dest=dest,
|
||||||
nargs=0,
|
nargs=0,
|
||||||
default=default,
|
default=default,
|
||||||
required=required,
|
required=required,
|
||||||
help=help)
|
help=help,
|
||||||
|
)
|
||||||
|
|
||||||
def __call__(self, parser, namespace, values, option_string=None):
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
new_count = _ensure_value(namespace, self.dest, 0) + 1
|
new_count = _ensure_value(namespace, self.dest, 0) + 1
|
||||||
@ -1008,17 +1047,20 @@ class _CountAction(Action):
|
|||||||
|
|
||||||
class _HelpAction(Action):
|
class _HelpAction(Action):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
dest=SUPPRESS,
|
option_strings,
|
||||||
default=SUPPRESS,
|
dest=SUPPRESS,
|
||||||
help=None):
|
default=SUPPRESS,
|
||||||
|
help=None,
|
||||||
|
):
|
||||||
super(_HelpAction, self).__init__(
|
super(_HelpAction, self).__init__(
|
||||||
option_strings=option_strings,
|
option_strings=option_strings,
|
||||||
dest=dest,
|
dest=dest,
|
||||||
default=default,
|
default=default,
|
||||||
nargs=0,
|
nargs=0,
|
||||||
help=help)
|
help=help,
|
||||||
|
)
|
||||||
|
|
||||||
def __call__(self, parser, namespace, values, option_string=None):
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
parser.print_help()
|
parser.print_help()
|
||||||
@ -1027,18 +1069,21 @@ class _HelpAction(Action):
|
|||||||
|
|
||||||
class _VersionAction(Action):
|
class _VersionAction(Action):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
version=None,
|
option_strings,
|
||||||
dest=SUPPRESS,
|
version=None,
|
||||||
default=SUPPRESS,
|
dest=SUPPRESS,
|
||||||
help="show program's version number and exit"):
|
default=SUPPRESS,
|
||||||
|
help="show program's version number and exit",
|
||||||
|
):
|
||||||
super(_VersionAction, self).__init__(
|
super(_VersionAction, self).__init__(
|
||||||
option_strings=option_strings,
|
option_strings=option_strings,
|
||||||
dest=dest,
|
dest=dest,
|
||||||
default=default,
|
default=default,
|
||||||
nargs=0,
|
nargs=0,
|
||||||
help=help)
|
help=help,
|
||||||
|
)
|
||||||
self.version = version
|
self.version = version
|
||||||
|
|
||||||
def __call__(self, parser, namespace, values, option_string=None):
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
@ -1058,13 +1103,15 @@ class _SubParsersAction(Action):
|
|||||||
sup = super(_SubParsersAction._ChoicesPseudoAction, self)
|
sup = super(_SubParsersAction._ChoicesPseudoAction, self)
|
||||||
sup.__init__(option_strings=[], dest=name, help=help)
|
sup.__init__(option_strings=[], dest=name, help=help)
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
option_strings,
|
self,
|
||||||
prog,
|
option_strings,
|
||||||
parser_class,
|
prog,
|
||||||
dest=SUPPRESS,
|
parser_class,
|
||||||
help=None,
|
dest=SUPPRESS,
|
||||||
metavar=None):
|
help=None,
|
||||||
|
metavar=None,
|
||||||
|
):
|
||||||
|
|
||||||
self._prog_prefix = prog
|
self._prog_prefix = prog
|
||||||
self._parser_class = parser_class
|
self._parser_class = parser_class
|
||||||
@ -1077,7 +1124,8 @@ class _SubParsersAction(Action):
|
|||||||
nargs=PARSER,
|
nargs=PARSER,
|
||||||
choices=self._name_parser_map,
|
choices=self._name_parser_map,
|
||||||
help=help,
|
help=help,
|
||||||
metavar=metavar)
|
metavar=metavar,
|
||||||
|
)
|
||||||
|
|
||||||
def add_parser(self, name, **kwargs):
|
def add_parser(self, name, **kwargs):
|
||||||
# set prog from the existing prefix
|
# set prog from the existing prefix
|
||||||
@ -1118,7 +1166,8 @@ class _SubParsersAction(Action):
|
|||||||
# store any unrecognized options on the object, so that the top
|
# store any unrecognized options on the object, so that the top
|
||||||
# level parser can decide what to do with them
|
# level parser can decide what to do with them
|
||||||
namespace, arg_strings = parser.parse_known_args(
|
namespace, arg_strings = parser.parse_known_args(
|
||||||
arg_strings, namespace)
|
arg_strings, namespace,
|
||||||
|
)
|
||||||
if arg_strings:
|
if arg_strings:
|
||||||
vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
|
vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
|
||||||
getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
|
getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
|
||||||
@ -1199,11 +1248,13 @@ class Namespace(_AttributeHolder):
|
|||||||
|
|
||||||
class _ActionsContainer(object):
|
class _ActionsContainer(object):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
description,
|
self,
|
||||||
prefix_chars,
|
description,
|
||||||
argument_default,
|
prefix_chars,
|
||||||
conflict_handler):
|
argument_default,
|
||||||
|
conflict_handler,
|
||||||
|
):
|
||||||
super(_ActionsContainer, self).__init__()
|
super(_ActionsContainer, self).__init__()
|
||||||
|
|
||||||
self.description = description
|
self.description = description
|
||||||
@ -1372,7 +1423,8 @@ class _ActionsContainer(object):
|
|||||||
title_group_map[group.title] = self.add_argument_group(
|
title_group_map[group.title] = self.add_argument_group(
|
||||||
title=group.title,
|
title=group.title,
|
||||||
description=group.description,
|
description=group.description,
|
||||||
conflict_handler=group.conflict_handler)
|
conflict_handler=group.conflict_handler,
|
||||||
|
)
|
||||||
|
|
||||||
# map the actions to their new group
|
# map the actions to their new group
|
||||||
for action in group._group_actions:
|
for action in group._group_actions:
|
||||||
@ -1383,7 +1435,8 @@ class _ActionsContainer(object):
|
|||||||
# description= then this code will need to be expanded as above
|
# description= then this code will need to be expanded as above
|
||||||
for group in container._mutually_exclusive_groups:
|
for group in container._mutually_exclusive_groups:
|
||||||
mutex_group = self.add_mutually_exclusive_group(
|
mutex_group = self.add_mutually_exclusive_group(
|
||||||
required=group.required)
|
required=group.required,
|
||||||
|
)
|
||||||
|
|
||||||
# map the actions to their new mutex group
|
# map the actions to their new mutex group
|
||||||
for action in group._group_actions:
|
for action in group._group_actions:
|
||||||
@ -1416,8 +1469,10 @@ class _ActionsContainer(object):
|
|||||||
for option_string in args:
|
for option_string in args:
|
||||||
# error on strings that don't start with an appropriate prefix
|
# error on strings that don't start with an appropriate prefix
|
||||||
if not option_string[0] in self.prefix_chars:
|
if not option_string[0] in self.prefix_chars:
|
||||||
msg = _('invalid option string %r: '
|
msg = _(
|
||||||
'must start with a character %r')
|
'invalid option string %r: '
|
||||||
|
'must start with a character %r',
|
||||||
|
)
|
||||||
tup = option_string, self.prefix_chars
|
tup = option_string, self.prefix_chars
|
||||||
raise ValueError(msg % tup)
|
raise ValueError(msg % tup)
|
||||||
|
|
||||||
@ -1473,9 +1528,11 @@ class _ActionsContainer(object):
|
|||||||
|
|
||||||
def _handle_conflict_error(self, action, conflicting_actions):
|
def _handle_conflict_error(self, action, conflicting_actions):
|
||||||
message = _('conflicting option string(s): %s')
|
message = _('conflicting option string(s): %s')
|
||||||
conflict_string = ', '.join([option_string
|
conflict_string = ', '.join([
|
||||||
for option_string, action
|
option_string
|
||||||
in conflicting_actions])
|
for option_string, action
|
||||||
|
in conflicting_actions
|
||||||
|
])
|
||||||
raise ArgumentError(action, message % conflict_string)
|
raise ArgumentError(action, message % conflict_string)
|
||||||
|
|
||||||
def _handle_conflict_resolve(self, action, conflicting_actions):
|
def _handle_conflict_resolve(self, action, conflicting_actions):
|
||||||
@ -1565,19 +1622,21 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
- add_help -- Add a -h/-help option
|
- add_help -- Add a -h/-help option
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(
|
||||||
prog=None,
|
self,
|
||||||
usage=None,
|
prog=None,
|
||||||
description=None,
|
usage=None,
|
||||||
epilog=None,
|
description=None,
|
||||||
version=None,
|
epilog=None,
|
||||||
parents=[],
|
version=None,
|
||||||
formatter_class=HelpFormatter,
|
parents=[],
|
||||||
prefix_chars='-',
|
formatter_class=HelpFormatter,
|
||||||
fromfile_prefix_chars=None,
|
prefix_chars='-',
|
||||||
argument_default=None,
|
fromfile_prefix_chars=None,
|
||||||
conflict_handler='error',
|
argument_default=None,
|
||||||
add_help=True):
|
conflict_handler='error',
|
||||||
|
add_help=True,
|
||||||
|
):
|
||||||
|
|
||||||
if version is not None:
|
if version is not None:
|
||||||
import warnings
|
import warnings
|
||||||
@ -1585,13 +1644,16 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
"""The "version" argument to ArgumentParser is deprecated. """
|
"""The "version" argument to ArgumentParser is deprecated. """
|
||||||
"""Please use """
|
"""Please use """
|
||||||
""""add_argument(..., action='version', version="N", ...)" """
|
""""add_argument(..., action='version', version="N", ...)" """
|
||||||
"""instead""", DeprecationWarning)
|
"""instead""", DeprecationWarning,
|
||||||
|
)
|
||||||
|
|
||||||
superinit = super(ArgumentParser, self).__init__
|
superinit = super(ArgumentParser, self).__init__
|
||||||
superinit(description=description,
|
superinit(
|
||||||
prefix_chars=prefix_chars,
|
description=description,
|
||||||
argument_default=argument_default,
|
prefix_chars=prefix_chars,
|
||||||
conflict_handler=conflict_handler)
|
argument_default=argument_default,
|
||||||
|
conflict_handler=conflict_handler,
|
||||||
|
)
|
||||||
|
|
||||||
# default setting for prog
|
# default setting for prog
|
||||||
if prog is None:
|
if prog is None:
|
||||||
@ -1625,13 +1687,15 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
self.add_argument(
|
self.add_argument(
|
||||||
default_prefix + 'h', default_prefix * 2 + 'help',
|
default_prefix + 'h', default_prefix * 2 + 'help',
|
||||||
action='help', default=SUPPRESS,
|
action='help', default=SUPPRESS,
|
||||||
help=_('show this help message and exit'))
|
help=_('show this help message and exit'),
|
||||||
|
)
|
||||||
if self.version:
|
if self.version:
|
||||||
self.add_argument(
|
self.add_argument(
|
||||||
default_prefix + 'v', default_prefix * 2 + 'version',
|
default_prefix + 'v', default_prefix * 2 + 'version',
|
||||||
action='version', default=SUPPRESS,
|
action='version', default=SUPPRESS,
|
||||||
version=self.version,
|
version=self.version,
|
||||||
help=_("show program's version number and exit"))
|
help=_("show program's version number and exit"),
|
||||||
|
)
|
||||||
|
|
||||||
# add parent arguments and defaults
|
# add parent arguments and defaults
|
||||||
for parent in parents:
|
for parent in parents:
|
||||||
@ -1700,14 +1764,18 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
return action
|
return action
|
||||||
|
|
||||||
def _get_optional_actions(self):
|
def _get_optional_actions(self):
|
||||||
return [action
|
return [
|
||||||
for action in self._actions
|
action
|
||||||
if action.option_strings]
|
for action in self._actions
|
||||||
|
if action.option_strings
|
||||||
|
]
|
||||||
|
|
||||||
def _get_positional_actions(self):
|
def _get_positional_actions(self):
|
||||||
return [action
|
return [
|
||||||
for action in self._actions
|
action
|
||||||
if not action.option_strings]
|
for action in self._actions
|
||||||
|
if not action.option_strings
|
||||||
|
]
|
||||||
|
|
||||||
# =====================================
|
# =====================================
|
||||||
# Command line argument parsing methods
|
# Command line argument parsing methods
|
||||||
@ -1931,7 +1999,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
next_option_string_index = min([
|
next_option_string_index = min([
|
||||||
index
|
index
|
||||||
for index in option_string_indices
|
for index in option_string_indices
|
||||||
if index >= start_index])
|
if index >= start_index
|
||||||
|
])
|
||||||
if start_index != next_option_string_index:
|
if start_index != next_option_string_index:
|
||||||
positionals_end_index = consume_positionals(start_index)
|
positionals_end_index = consume_positionals(start_index)
|
||||||
|
|
||||||
@ -1980,9 +2049,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
|
|
||||||
# if no actions were used, report the error
|
# if no actions were used, report the error
|
||||||
else:
|
else:
|
||||||
names = [_get_action_name(action)
|
names = [
|
||||||
for action in group._group_actions
|
_get_action_name(action)
|
||||||
if action.help is not SUPPRESS]
|
for action in group._group_actions
|
||||||
|
if action.help is not SUPPRESS
|
||||||
|
]
|
||||||
msg = _('one of the arguments %s is required')
|
msg = _('one of the arguments %s is required')
|
||||||
self.error(msg % ' '.join(names))
|
self.error(msg % ' '.join(names))
|
||||||
|
|
||||||
@ -2046,8 +2117,10 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
result = []
|
result = []
|
||||||
for i in range(len(actions), 0, -1):
|
for i in range(len(actions), 0, -1):
|
||||||
actions_slice = actions[:i]
|
actions_slice = actions[:i]
|
||||||
pattern = ''.join([self._get_nargs_pattern(action)
|
pattern = ''.join([
|
||||||
for action in actions_slice])
|
self._get_nargs_pattern(action)
|
||||||
|
for action in actions_slice
|
||||||
|
])
|
||||||
match = _re.match(pattern, arg_strings_pattern)
|
match = _re.match(pattern, arg_strings_pattern)
|
||||||
if match is not None:
|
if match is not None:
|
||||||
result.extend([len(string) for string in match.groups()])
|
result.extend([len(string) for string in match.groups()])
|
||||||
@ -2088,7 +2161,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
# if multiple actions match, the option string was ambiguous
|
# if multiple actions match, the option string was ambiguous
|
||||||
if len(option_tuples) > 1:
|
if len(option_tuples) > 1:
|
||||||
options = ', '.join(
|
options = ', '.join(
|
||||||
[option_string for action, option_string, explicit_arg in option_tuples])
|
[option_string for action, option_string, explicit_arg in option_tuples],
|
||||||
|
)
|
||||||
tup = arg_string, options
|
tup = arg_string, options
|
||||||
self.error(_('ambiguous option: %s could match %s') % tup)
|
self.error(_('ambiguous option: %s could match %s') % tup)
|
||||||
|
|
||||||
@ -2218,8 +2292,10 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
|
|
||||||
# when nargs='*' on a positional, if there were no command-line
|
# when nargs='*' on a positional, if there were no command-line
|
||||||
# args, use the default if it is anything other than None
|
# args, use the default if it is anything other than None
|
||||||
elif (not arg_strings and action.nargs == ZERO_OR_MORE and
|
elif (
|
||||||
not action.option_strings):
|
not arg_strings and action.nargs == ZERO_OR_MORE and
|
||||||
|
not action.option_strings
|
||||||
|
):
|
||||||
if action.default is not None:
|
if action.default is not None:
|
||||||
value = action.default
|
value = action.default
|
||||||
else:
|
else:
|
||||||
@ -2287,16 +2363,20 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
# =======================
|
# =======================
|
||||||
def format_usage(self):
|
def format_usage(self):
|
||||||
formatter = self._get_formatter()
|
formatter = self._get_formatter()
|
||||||
formatter.add_usage(self.usage, self._actions,
|
formatter.add_usage(
|
||||||
self._mutually_exclusive_groups)
|
self.usage, self._actions,
|
||||||
|
self._mutually_exclusive_groups,
|
||||||
|
)
|
||||||
return formatter.format_help()
|
return formatter.format_help()
|
||||||
|
|
||||||
def format_help(self):
|
def format_help(self):
|
||||||
formatter = self._get_formatter()
|
formatter = self._get_formatter()
|
||||||
|
|
||||||
# usage
|
# usage
|
||||||
formatter.add_usage(self.usage, self._actions,
|
formatter.add_usage(
|
||||||
self._mutually_exclusive_groups)
|
self.usage, self._actions,
|
||||||
|
self._mutually_exclusive_groups,
|
||||||
|
)
|
||||||
|
|
||||||
# description
|
# description
|
||||||
formatter.add_text(self.description)
|
formatter.add_text(self.description)
|
||||||
@ -2319,7 +2399,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
warnings.warn(
|
warnings.warn(
|
||||||
'The format_version method is deprecated -- the "version" '
|
'The format_version method is deprecated -- the "version" '
|
||||||
'argument to ArgumentParser is no longer supported.',
|
'argument to ArgumentParser is no longer supported.',
|
||||||
DeprecationWarning)
|
DeprecationWarning,
|
||||||
|
)
|
||||||
formatter = self._get_formatter()
|
formatter = self._get_formatter()
|
||||||
formatter.add_text(self.version)
|
formatter.add_text(self.version)
|
||||||
return formatter.format_help()
|
return formatter.format_help()
|
||||||
@ -2345,7 +2426,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||||||
warnings.warn(
|
warnings.warn(
|
||||||
'The print_version method is deprecated -- the "version" '
|
'The print_version method is deprecated -- the "version" '
|
||||||
'argument to ArgumentParser is no longer supported.',
|
'argument to ArgumentParser is no longer supported.',
|
||||||
DeprecationWarning)
|
DeprecationWarning,
|
||||||
|
)
|
||||||
self._print_message(self.format_version(), file)
|
self._print_message(self.format_version(), file)
|
||||||
|
|
||||||
def _print_message(self, message, file=None):
|
def _print_message(self, message, file=None):
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
@ -55,7 +55,8 @@ def load(config):
|
|||||||
os.path.expanduser('~'),
|
os.path.expanduser('~'),
|
||||||
'.local',
|
'.local',
|
||||||
'share',
|
'share',
|
||||||
'autojump')
|
'autojump',
|
||||||
|
)
|
||||||
|
|
||||||
if is_osx() and os.path.exists(xdg_aj_home):
|
if is_osx() and os.path.exists(xdg_aj_home):
|
||||||
migrate_osx_xdg_data(config)
|
migrate_osx_xdg_data(config)
|
||||||
@ -75,11 +76,14 @@ def load(config):
|
|||||||
with open(
|
with open(
|
||||||
config['data_path'],
|
config['data_path'],
|
||||||
'r', encoding='utf-8',
|
'r', encoding='utf-8',
|
||||||
errors='replace') as f:
|
errors='replace',
|
||||||
|
) as f:
|
||||||
return dict(
|
return dict(
|
||||||
imap(
|
imap(
|
||||||
tupleize,
|
tupleize,
|
||||||
ifilter(correct_length, imap(parse, f))))
|
ifilter(correct_length, imap(parse, f)),
|
||||||
|
),
|
||||||
|
)
|
||||||
except (IOError, EOFError):
|
except (IOError, EOFError):
|
||||||
return load_backup(config)
|
return load_backup(config)
|
||||||
|
|
||||||
@ -116,11 +120,12 @@ def migrate_osx_xdg_data(config):
|
|||||||
|
|
||||||
def save(config, data):
|
def save(config, data):
|
||||||
"""Save data and create backup, creating a new data file if necessary."""
|
"""Save data and create backup, creating a new data file if necessary."""
|
||||||
create_dir(os.path.dirname(config['data_path']))
|
data_dir = os.path.dirname(config['data_path'])
|
||||||
|
create_dir(data_dir)
|
||||||
|
|
||||||
# atomically save by writing to temporary file and moving to destination
|
# atomically save by writing to temporary file and moving to destination
|
||||||
try:
|
try:
|
||||||
temp = NamedTemporaryFile(delete=False)
|
temp = NamedTemporaryFile(delete=False, dir=data_dir)
|
||||||
# Windows cannot reuse the same open file name
|
# Windows cannot reuse the same open file name
|
||||||
temp.close()
|
temp.close()
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
@ -117,11 +117,13 @@ def match_fuzzy(needles, haystack, ignore_case=False, threshold=0.6):
|
|||||||
needle = last(needles).lower()
|
needle = last(needles).lower()
|
||||||
match_percent = lambda entry: SequenceMatcher(
|
match_percent = lambda entry: SequenceMatcher(
|
||||||
a=needle,
|
a=needle,
|
||||||
b=end_dir(entry.path.lower())).ratio()
|
b=end_dir(entry.path.lower()),
|
||||||
|
).ratio()
|
||||||
else:
|
else:
|
||||||
needle = last(needles)
|
needle = last(needles)
|
||||||
match_percent = lambda entry: SequenceMatcher(
|
match_percent = lambda entry: SequenceMatcher(
|
||||||
a=needle,
|
a=needle,
|
||||||
b=end_dir(entry.path)).ratio()
|
b=end_dir(entry.path),
|
||||||
|
).ratio()
|
||||||
meets_threshold = lambda entry: match_percent(entry) >= threshold
|
meets_threshold = lambda entry: match_percent(entry) >= threshold
|
||||||
return ifilter(meets_threshold, haystack)
|
return ifilter(meets_threshold, haystack)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
@ -56,7 +56,8 @@ def get_tab_entry_info(entry, separator):
|
|||||||
match_index = re.search(separator + r'([0-9]{1})', entry)
|
match_index = re.search(separator + r'([0-9]{1})', entry)
|
||||||
match_path = re.search(
|
match_path = re.search(
|
||||||
separator + r'[0-9]{1}' + separator + r'(.*)',
|
separator + r'[0-9]{1}' + separator + r'(.*)',
|
||||||
entry)
|
entry,
|
||||||
|
)
|
||||||
|
|
||||||
if match_needle:
|
if match_needle:
|
||||||
needle = match_needle.group(1)
|
needle = match_needle.group(1)
|
||||||
@ -163,7 +164,9 @@ def print_tab_menu(needle, tab_entries, separator):
|
|||||||
separator,
|
separator,
|
||||||
i + 1,
|
i + 1,
|
||||||
separator,
|
separator,
|
||||||
entry.path))
|
entry.path,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def sanitize(directories):
|
def sanitize(directories):
|
||||||
|
14
bin/j.bat
14
bin/j.bat
@ -3,15 +3,15 @@ setlocal EnableDelayedExpansion
|
|||||||
|
|
||||||
echo %*|>nul findstr /rx \-.*
|
echo %*|>nul findstr /rx \-.*
|
||||||
if ERRORLEVEL 1 (
|
if ERRORLEVEL 1 (
|
||||||
for /f %%i in ('python "%~dp0\autojump" %*') do set new_path=%%i
|
for /f "delims=" %%i in ('python "%~dp0\autojump" %*') do set new_path=%%i
|
||||||
if exist !new_path!\nul (
|
if exist !new_path!\nul (
|
||||||
echo !new_path!
|
echo !new_path!
|
||||||
pushd !new_path!
|
pushd !new_path!
|
||||||
REM endlocal is necessary so that we can change directory for outside of this script
|
REM endlocal is necessary so that we can change directory for outside of this script
|
||||||
REM but will automatically popd. We mush pushd twice to work around this.
|
REM but will automatically popd. We mush pushd twice to work around this.
|
||||||
pushd !new_path!
|
pushd !new_path!
|
||||||
endlocal
|
endlocal
|
||||||
popd
|
popd
|
||||||
) else (
|
) else (
|
||||||
echo autojump: directory %* not found
|
echo autojump: directory %* not found
|
||||||
echo try `autojump --help` for more information
|
echo try `autojump --help` for more information
|
||||||
|
@ -3,9 +3,9 @@ setlocal EnableDelayedExpansion
|
|||||||
|
|
||||||
echo %*|>nul findstr /rx \-.*
|
echo %*|>nul findstr /rx \-.*
|
||||||
if ERRORLEVEL 1 (
|
if ERRORLEVEL 1 (
|
||||||
for /f %%i in ('python "%~dp0\autojump" %*') do set new_path=%%i
|
for /f "delims=" %%i in ('python "%~dp0\autojump" %*') do set new_path=%%i
|
||||||
if exist !new_path!\nul (
|
if exist !new_path!\nul (
|
||||||
start !new_path!
|
start "" "explorer" !new_path!
|
||||||
) else (
|
) else (
|
||||||
echo autojump: directory %* not found
|
echo autojump: directory %* not found
|
||||||
echo try `autojump --help` for more information
|
echo try `autojump --help` for more information
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
.\" Automatically generated by Pandoc 1.16.0.2
|
.\" Automatically generated by Pandoc 1.16.0.2
|
||||||
.\"
|
.\"
|
||||||
.TH "autojump" "1" "10 April 2012" "release\-v22" ""
|
.TH "autojump" "1" "2018\-09\-09" "release\-v22.5.3" ""
|
||||||
.hy
|
.hy
|
||||||
.SS NAME
|
.SS NAME
|
||||||
.PP
|
.PP
|
||||||
@ -120,7 +120,7 @@ For any questions or issues please visit:
|
|||||||
.IP
|
.IP
|
||||||
.nf
|
.nf
|
||||||
\f[C]
|
\f[C]
|
||||||
https://github.com/joelthelion/autojump/issues
|
https://github.com/wting/autojump/issues
|
||||||
\f[]
|
\f[]
|
||||||
.fi
|
.fi
|
||||||
.SS AUTHORS
|
.SS AUTHORS
|
||||||
|
@ -17,7 +17,7 @@ REPORTING BUGS
|
|||||||
|
|
||||||
For any questions or issues please visit:
|
For any questions or issues please visit:
|
||||||
|
|
||||||
https://github.com/joelthelion/autojump/issues
|
https://github.com/wting/autojump/issues
|
||||||
|
|
||||||
AUTHORS
|
AUTHORS
|
||||||
-------
|
-------
|
||||||
|
@ -2,28 +2,59 @@
|
|||||||
|
|
||||||
### REQUIREMENTS
|
### REQUIREMENTS
|
||||||
|
|
||||||
- Python v2.6+ except v3.2
|
- Python v2.6+ or Python v3.3+
|
||||||
- Supported shells:
|
- Supported shells
|
||||||
- bash v4.0+
|
- bash - first class support
|
||||||
- zsh
|
- zsh - first class support
|
||||||
- fish
|
- fish - community supported
|
||||||
- tcsh (experimental)
|
- tcsh - community supported
|
||||||
- clink (Windows, experimental)
|
- clink - community supported
|
||||||
|
- Supported platforms
|
||||||
|
- Linux - first class support
|
||||||
|
- OS X - first class support
|
||||||
|
- Windows - community supported
|
||||||
|
- BSD - community supported
|
||||||
|
- Supported installation methods
|
||||||
|
- source code - first class support
|
||||||
|
- Debian and derivatives - first class support
|
||||||
|
- ArchLinux / Gentoo / openSUSE / RedHat and derivatives - community supported
|
||||||
|
- Homebrew / MacPorts - community supported
|
||||||
|
|
||||||
|
Due to limited time and resources, only "first class support" items will be
|
||||||
|
maintained by the primary committers. All "community supported" items will be
|
||||||
|
updated based on pull requests submitted by the general public.
|
||||||
|
|
||||||
|
Please continue opening issues and providing feedback for community supported
|
||||||
|
items since consolidating information helps other users troubleshoot and submit
|
||||||
|
enhancements and fixes.
|
||||||
|
|
||||||
|
### MANUAL
|
||||||
|
|
||||||
|
Grab a copy of autojump:
|
||||||
|
|
||||||
|
git clone git://github.com/wting/autojump.git
|
||||||
|
|
||||||
|
Run the installation script and follow on screen instructions.
|
||||||
|
|
||||||
|
cd autojump
|
||||||
|
./install.py or ./uninstall.py
|
||||||
|
|
||||||
### AUTOMATIC
|
### AUTOMATIC
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
autojump is included in the following distro repositories, please use relevant
|
autojump is included in the following distro repositories, please use relevant
|
||||||
package management utilities to install (e.g. yum, apt-get, etc):
|
package management utilities to install (e.g. apt-get, yum, pacman, etc):
|
||||||
|
|
||||||
- Debian testing/unstable, Ubuntu, Linux Mint
|
- Debian, Ubuntu, Linux Mint
|
||||||
|
|
||||||
All Debian-derived distros require manual activation for policy reasons,
|
All Debian-derived distros require manual activation for policy reasons,
|
||||||
please see `/usr/share/doc/autojump/README.Debian`.
|
please see `/usr/share/doc/autojump/README.Debian`.
|
||||||
|
|
||||||
- RedHat, Fedora, CentOS (install `autojump-zsh` for zsh, `autojump-fish` for
|
- RedHat, Fedora, CentOS
|
||||||
fish, etc.)
|
|
||||||
|
Install `autojump-zsh` for zsh, `autojump-fish` for fish, etc.
|
||||||
|
|
||||||
- ArchLinux
|
- ArchLinux
|
||||||
- Gentoo
|
- Gentoo
|
||||||
- Frugalware
|
- Frugalware
|
||||||
@ -35,7 +66,7 @@ Homebrew is the recommended installation method for Mac OS X:
|
|||||||
|
|
||||||
brew install autojump
|
brew install autojump
|
||||||
|
|
||||||
MacPorts also available:
|
MacPorts is also available:
|
||||||
|
|
||||||
port install autojump
|
port install autojump
|
||||||
|
|
||||||
@ -43,14 +74,3 @@ MacPorts also available:
|
|||||||
|
|
||||||
Windows support is enabled by [clink](https://mridgers.github.io/clink/) which
|
Windows support is enabled by [clink](https://mridgers.github.io/clink/) which
|
||||||
should be installed prior to installing autojump.
|
should be installed prior to installing autojump.
|
||||||
|
|
||||||
### MANUAL
|
|
||||||
|
|
||||||
Grab a copy of autojump:
|
|
||||||
|
|
||||||
git clone git://github.com/joelthelion/autojump.git
|
|
||||||
|
|
||||||
Run the installation script and follow on screen instructions.
|
|
||||||
|
|
||||||
cd autojump
|
|
||||||
./install.py or ./uninstall.py
|
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
% autojump(1) release-v22
|
% autojump(1) release-v22.5.3
|
||||||
%
|
%
|
||||||
% 10 April 2012
|
% 2018-09-09
|
||||||
|
59
install.py
59
install.py
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
@ -45,7 +45,8 @@ def modify_autojump_lua(clink_dir, bin_dir, dryrun=False):
|
|||||||
"""Prepend custom AUTOJUMP_BIN_DIR definition to autojump.lua"""
|
"""Prepend custom AUTOJUMP_BIN_DIR definition to autojump.lua"""
|
||||||
custom_install = "local AUTOJUMP_BIN_DIR = \"%s\"\n" % bin_dir.replace(
|
custom_install = "local AUTOJUMP_BIN_DIR = \"%s\"\n" % bin_dir.replace(
|
||||||
'\\',
|
'\\',
|
||||||
'\\\\')
|
'\\\\',
|
||||||
|
)
|
||||||
clink_file = os.path.join(clink_dir, 'autojump.lua')
|
clink_file = os.path.join(clink_dir, 'autojump.lua')
|
||||||
with open(clink_file, 'r') as f:
|
with open(clink_file, 'r') as f:
|
||||||
original = f.read()
|
original = f.read()
|
||||||
@ -57,11 +58,13 @@ def parse_arguments(): # noqa
|
|||||||
if platform.system() == 'Windows':
|
if platform.system() == 'Windows':
|
||||||
default_user_destdir = os.path.join(
|
default_user_destdir = os.path.join(
|
||||||
os.getenv('LOCALAPPDATA', ''),
|
os.getenv('LOCALAPPDATA', ''),
|
||||||
'autojump')
|
'autojump',
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
default_user_destdir = os.path.join(
|
default_user_destdir = os.path.join(
|
||||||
os.path.expanduser('~'),
|
os.path.expanduser('~'),
|
||||||
'.autojump')
|
'.autojump',
|
||||||
|
)
|
||||||
default_user_prefix = ''
|
default_user_prefix = ''
|
||||||
default_user_zshshare = 'functions'
|
default_user_zshshare = 'functions'
|
||||||
default_system_destdir = '/'
|
default_system_destdir = '/'
|
||||||
@ -71,28 +74,36 @@ def parse_arguments(): # noqa
|
|||||||
|
|
||||||
parser = ArgumentParser(
|
parser = ArgumentParser(
|
||||||
description='Installs autojump globally for root users, otherwise \
|
description='Installs autojump globally for root users, otherwise \
|
||||||
installs in current user\'s home directory.')
|
installs in current user\'s home directory.'
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-n', '--dryrun', action='store_true', default=False,
|
'-n', '--dryrun', action='store_true', default=False,
|
||||||
help='simulate installation')
|
help='simulate installation',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-f', '--force', action='store_true', default=False,
|
'-f', '--force', action='store_true', default=False,
|
||||||
help='skip root user, shell type, Python version checks')
|
help='skip root user, shell type, Python version checks',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-d', '--destdir', metavar='DIR', default=default_user_destdir,
|
'-d', '--destdir', metavar='DIR', default=default_user_destdir,
|
||||||
help='set destination to DIR')
|
help='set destination to DIR',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-p', '--prefix', metavar='DIR', default=default_user_prefix,
|
'-p', '--prefix', metavar='DIR', default=default_user_prefix,
|
||||||
help='set prefix to DIR')
|
help='set prefix to DIR',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-z', '--zshshare', metavar='DIR', default=default_user_zshshare,
|
'-z', '--zshshare', metavar='DIR', default=default_user_zshshare,
|
||||||
help='set zsh share destination to DIR')
|
help='set zsh share destination to DIR',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-c', '--clinkdir', metavar='DIR', default=default_clink_dir,
|
'-c', '--clinkdir', metavar='DIR', default=default_clink_dir,
|
||||||
help='set clink directory location to DIR (Windows only)')
|
help='set clink directory location to DIR (Windows only)',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-s', '--system', action='store_true', default=False,
|
'-s', '--system', action='store_true', default=False,
|
||||||
help='install system wide for all users')
|
help='install system wide for all users',
|
||||||
|
)
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
@ -102,18 +113,24 @@ def parse_arguments(): # noqa
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
if args.system:
|
if args.system:
|
||||||
if platform.system() == 'Windows':
|
if platform.system() == 'Windows':
|
||||||
print('System-wide installation is not supported on Windows.',
|
print(
|
||||||
file=sys.stderr)
|
'System-wide installation is not supported on Windows.',
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
elif os.geteuid() != 0:
|
elif os.geteuid() != 0:
|
||||||
print('Please rerun as root for system-wide installation.',
|
print(
|
||||||
file=sys.stderr)
|
'Please rerun as root for system-wide installation.',
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if platform.system() != 'Windows' \
|
if platform.system() != 'Windows' \
|
||||||
and get_shell() not in SUPPORTED_SHELLS:
|
and get_shell() not in SUPPORTED_SHELLS:
|
||||||
print('Unsupported shell: %s' % os.getenv('SHELL'),
|
print(
|
||||||
file=sys.stderr)
|
'Unsupported shell: %s' % os.getenv('SHELL'),
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if args.destdir != default_user_destdir \
|
if args.destdir != default_user_destdir \
|
||||||
@ -125,8 +142,10 @@ def parse_arguments(): # noqa
|
|||||||
|
|
||||||
if args.system:
|
if args.system:
|
||||||
if args.custom_install:
|
if args.custom_install:
|
||||||
print('Custom paths incompatible with --system option.',
|
print(
|
||||||
file=sys.stderr)
|
'Custom paths incompatible with --system option.',
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
args.destdir = default_system_destdir
|
args.destdir = default_system_destdir
|
||||||
|
@ -28,10 +28,12 @@ def j(path):
|
|||||||
newpath = Popen(
|
newpath = Popen(
|
||||||
cmd,
|
cmd,
|
||||||
stdout=PIPE,
|
stdout=PIPE,
|
||||||
shell=False).communicate()[0].strip()
|
shell=False,
|
||||||
|
).communicate()[0].strip()
|
||||||
|
|
||||||
if newpath:
|
if newpath:
|
||||||
ip.magic('cd %s' % newpath.decode('utf-8'))
|
ip.magic('cd %s' % newpath.decode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
# remove from namespace
|
# remove from namespace
|
||||||
del j
|
del j
|
||||||
|
51
uninstall.py
51
uninstall.py
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
@ -25,24 +25,31 @@ def parse_arguments():
|
|||||||
default_clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
|
default_clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
|
||||||
|
|
||||||
parser = ArgumentParser(
|
parser = ArgumentParser(
|
||||||
description='Uninstalls autojump.')
|
description='Uninstalls autojump.',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-n', '--dryrun', action='store_true', default=False,
|
'-n', '--dryrun', action='store_true', default=False,
|
||||||
help='simulate installation')
|
help='simulate installation',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-u', '--userdata', action='store_true', default=False,
|
'-u', '--userdata', action='store_true', default=False,
|
||||||
help='delete user data')
|
help='delete user data',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-d', '--destdir', metavar='DIR',
|
'-d', '--destdir', metavar='DIR',
|
||||||
help='custom destdir')
|
help='custom destdir',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-p', '--prefix', metavar='DIR', default='',
|
'-p', '--prefix', metavar='DIR', default='',
|
||||||
help='custom prefix')
|
help='custom prefix',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-z', '--zshshare', metavar='DIR', default='functions',
|
'-z', '--zshshare', metavar='DIR', default='functions',
|
||||||
help='custom zshshare')
|
help='custom zshshare',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-c', '--clinkdir', metavar='DIR', default=default_clink_dir)
|
'-c', '--clinkdir', metavar='DIR', default=default_clink_dir,
|
||||||
|
)
|
||||||
|
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
@ -98,13 +105,15 @@ def remove_system_installation(dryrun=False):
|
|||||||
default_prefix,
|
default_prefix,
|
||||||
'share',
|
'share',
|
||||||
'man',
|
'man',
|
||||||
'man1')
|
'man1',
|
||||||
|
)
|
||||||
etc_dir = os.path.join(default_destdir, 'etc', 'profile.d')
|
etc_dir = os.path.join(default_destdir, 'etc', 'profile.d')
|
||||||
share_dir = os.path.join(
|
share_dir = os.path.join(
|
||||||
default_destdir,
|
default_destdir,
|
||||||
default_prefix,
|
default_prefix,
|
||||||
'share',
|
'share',
|
||||||
'autojump')
|
'autojump',
|
||||||
|
)
|
||||||
zshshare_dir = os.path.join(default_destdir, default_zshshare)
|
zshshare_dir = os.path.join(default_destdir, default_zshshare)
|
||||||
|
|
||||||
if not os.path.exists(share_dir):
|
if not os.path.exists(share_dir):
|
||||||
@ -113,8 +122,10 @@ def remove_system_installation(dryrun=False):
|
|||||||
print('\nFound system installation...')
|
print('\nFound system installation...')
|
||||||
|
|
||||||
if os.geteuid() != 0:
|
if os.geteuid() != 0:
|
||||||
print('Please rerun as root for system-wide uninstall, skipping...',
|
print(
|
||||||
file=sys.stderr)
|
'Please rerun as root for system-wide uninstall, skipping...',
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
rm(os.path.join(bin_dir, 'autojump'), dryrun)
|
rm(os.path.join(bin_dir, 'autojump'), dryrun)
|
||||||
@ -135,11 +146,13 @@ def remove_user_data(dryrun=False):
|
|||||||
data_home = os.path.join(
|
data_home = os.path.join(
|
||||||
os.path.expanduser('~'),
|
os.path.expanduser('~'),
|
||||||
'Library',
|
'Library',
|
||||||
'autojump')
|
'autojump',
|
||||||
|
)
|
||||||
elif platform.system() == 'Windows':
|
elif platform.system() == 'Windows':
|
||||||
data_home = os.path.join(
|
data_home = os.path.join(
|
||||||
os.getenv('APPDATA'),
|
os.getenv('APPDATA'),
|
||||||
'autojump')
|
'autojump',
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
data_home = os.getenv(
|
data_home = os.getenv(
|
||||||
'XDG_DATA_HOME',
|
'XDG_DATA_HOME',
|
||||||
@ -147,7 +160,9 @@ def remove_user_data(dryrun=False):
|
|||||||
os.path.expanduser('~'),
|
os.path.expanduser('~'),
|
||||||
'.local',
|
'.local',
|
||||||
'share',
|
'share',
|
||||||
'autojump'))
|
'autojump',
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
if os.path.exists(data_home):
|
if os.path.exists(data_home):
|
||||||
print('\nFound user data...')
|
print('\nFound user data...')
|
||||||
@ -156,8 +171,10 @@ def remove_user_data(dryrun=False):
|
|||||||
|
|
||||||
def remove_user_installation(dryrun=False):
|
def remove_user_installation(dryrun=False):
|
||||||
if platform.system() == 'Windows':
|
if platform.system() == 'Windows':
|
||||||
default_destdir = os.path.join(os.getenv('LOCALAPPDATA', ''),
|
default_destdir = os.path.join(
|
||||||
'autojump')
|
os.getenv('LOCALAPPDATA', ''),
|
||||||
|
'autojump',
|
||||||
|
)
|
||||||
clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
|
clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
|
||||||
else:
|
else:
|
||||||
default_destdir = os.path.join(os.path.expanduser('~'), '.autojump')
|
default_destdir = os.path.join(os.path.expanduser('~'), '.autojump')
|
||||||
|
Loading…
Reference in New Issue
Block a user