Merge branch 'ohmyzsh:master' into recursive_dotenv

This commit is contained in:
Heitor Polidoro 2024-05-22 15:00:38 -03:00 committed by GitHub
commit af3825e13e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
123 changed files with 1323 additions and 629 deletions

View file

@ -6,3 +6,6 @@ insert_final_newline = true
charset = utf-8 charset = utf-8
indent_size = 2 indent_size = 2
indent_style = space indent_style = space
[*.py]
indent_size = 4

View file

@ -36,3 +36,11 @@ dependencies:
precopy: | precopy: |
set -e set -e
find . ! -name _gradle ! -name LICENSE -delete find . ! -name _gradle ! -name LICENSE -delete
plugins/wd:
repo: mfaerevaag/wd
branch: master
version: tag:v0.7.0
precopy: |
set -e
rm -r test
rm install.sh tty.gif wd.1

View file

@ -1,8 +1,8 @@
name: Update dependencies name: Update dependencies
on: on:
workflow_dispatch: {} workflow_dispatch: {}
# schedule: schedule:
# - cron: '34 3 * * */8' - cron: "0 6 * * 0"
jobs: jobs:
check: check:
@ -12,12 +12,19 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Authenticate as @ohmyzsh - name: Authenticate as @ohmyzsh
id: generate_token id: generate_token
uses: ohmyzsh/github-app-token@v2 uses: ohmyzsh/github-app-token@v2
with: with:
app_id: ${{ secrets.OHMYZSH_APP_ID }} app_id: ${{ secrets.OHMYZSH_APP_ID }}
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"
- name: Process dependencies - name: Process dependencies
env: env:
GH_TOKEN: ${{ steps.generate_token.outputs.token }} GH_TOKEN: ${{ steps.generate_token.outputs.token }}

View file

@ -1,2 +1,7 @@
PyYAML~=6.0.1 certifi==2024.2.2
requests~=2.31.0 charset-normalizer==3.3.2
idna==3.7
PyYAML==6.0.1
requests==2.31.0
semver==3.0.2
urllib3==2.2.1

View file

@ -1,11 +1,16 @@
import json
import os import os
import re
import shutil
import subprocess import subprocess
import sys import sys
import requests import timeit
import shutil
import yaml
from copy import deepcopy from copy import deepcopy
from typing import Optional, TypedDict from typing import Literal, NotRequired, Optional, TypedDict
import requests
import yaml
from semver import Version
# Get TMP_DIR variable from environment # Get TMP_DIR variable from environment
TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh") TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh")
@ -14,28 +19,58 @@ DEPS_YAML_FILE = ".github/dependencies.yml"
# Dry run flag # Dry run flag
DRY_RUN = os.environ.get("DRY_RUN", "0") == "1" DRY_RUN = os.environ.get("DRY_RUN", "0") == "1"
import timeit # utils for tag comparison
BASEVERSION = re.compile(
r"""[vV]?
(?P<major>(0|[1-9])\d*)
(\.
(?P<minor>(0|[1-9])\d*)
(\.
(?P<patch>(0|[1-9])\d*)
)?
)?
""",
re.VERBOSE,
)
def coerce(version: str) -> Optional[Version]:
match = BASEVERSION.search(version)
if not match:
return None
# BASEVERSION looks for `MAJOR.minor.patch` in the string given
# it fills with None if any of them is missing (for example `2.1`)
ver = {
key: 0 if value is None else value for key, value in match.groupdict().items()
}
# Version takes `major`, `minor`, `patch` arguments
ver = Version(**ver) # pyright: ignore[reportArgumentType]
return ver
class CodeTimer: class CodeTimer:
def __init__(self, name=None): def __init__(self, name=None):
self.name = " '" + name + "'" if name else '' self.name = " '" + name + "'" if name else ""
def __enter__(self): def __enter__(self):
self.start = timeit.default_timer() self.start = timeit.default_timer()
def __exit__(self, exc_type, exc_value, traceback): def __exit__(self, exc_type, exc_value, traceback):
self.took = (timeit.default_timer() - self.start) * 1000.0 self.took = (timeit.default_timer() - self.start) * 1000.0
print('Code block' + self.name + ' took: ' + str(self.took) + ' ms') print("Code block" + self.name + " took: " + str(self.took) + " ms")
### YAML representation ### YAML representation
def str_presenter(dumper, data): def str_presenter(dumper, data):
""" """
Configures yaml for dumping multiline strings Configures yaml for dumping multiline strings
Ref: https://stackoverflow.com/a/33300001 Ref: https://stackoverflow.com/a/33300001
""" """
if len(data.splitlines()) > 1: # check for multiline string if len(data.splitlines()) > 1: # check for multiline string
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|")
return dumper.represent_scalar('tag:yaml.org,2002:str', data) return dumper.represent_scalar("tag:yaml.org,2002:str", data)
yaml.add_representer(str, str_presenter) yaml.add_representer(str, str_presenter)
yaml.representer.SafeRepresenter.add_representer(str, str_presenter) yaml.representer.SafeRepresenter.add_representer(str, str_presenter)
@ -43,408 +78,521 @@ yaml.representer.SafeRepresenter.add_representer(str, str_presenter)
# Types # Types
class DependencyDict(TypedDict): class DependencyDict(TypedDict):
repo: str repo: str
branch: str branch: str
version: str version: str
precopy: Optional[str] precopy: NotRequired[str]
postcopy: Optional[str] postcopy: NotRequired[str]
class DependencyYAML(TypedDict): class DependencyYAML(TypedDict):
dependencies: dict[str, DependencyDict] dependencies: dict[str, DependencyDict]
class UpdateStatus(TypedDict):
has_updates: bool class UpdateStatusFalse(TypedDict):
version: Optional[str] has_updates: Literal[False]
compare_url: Optional[str]
head_ref: Optional[str]
head_url: Optional[str] class UpdateStatusTrue(TypedDict):
has_updates: Literal[True]
version: str
compare_url: str
head_ref: str
head_url: str
class CommandRunner: class CommandRunner:
class Exception(Exception): class Exception(Exception):
def __init__(self, message, returncode, stage, stdout, stderr): def __init__(self, message, returncode, stage, stdout, stderr):
super().__init__(message) super().__init__(message)
self.returncode = returncode self.returncode = returncode
self.stage = stage self.stage = stage
self.stdout = stdout self.stdout = stdout
self.stderr = stderr self.stderr = stderr
@staticmethod @staticmethod
def run_or_fail(command: list[str], stage: str, *args, **kwargs): def run_or_fail(command: list[str], stage: str, *args, **kwargs):
if DRY_RUN and command[0] == "gh": if DRY_RUN and command[0] == "gh":
command.insert(0, "echo") command.insert(0, "echo")
result = subprocess.run(command, *args, capture_output=True, **kwargs) result = subprocess.run(command, *args, capture_output=True, **kwargs)
if result.returncode != 0: if result.returncode != 0:
raise CommandRunner.Exception( raise CommandRunner.Exception(
f"{stage} command failed with exit code {result.returncode}", returncode=result.returncode, f"{stage} command failed with exit code {result.returncode}",
stage=stage, returncode=result.returncode,
stdout=result.stdout.decode("utf-8"), stage=stage,
stderr=result.stderr.decode("utf-8") stdout=result.stdout.decode("utf-8"),
) stderr=result.stderr.decode("utf-8"),
)
return result return result
class DependencyStore: class DependencyStore:
store: DependencyYAML = { store: DependencyYAML = {"dependencies": {}}
"dependencies": {}
}
@staticmethod @staticmethod
def set(data: DependencyYAML): def set(data: DependencyYAML):
DependencyStore.store = data DependencyStore.store = data
@staticmethod @staticmethod
def update_dependency_version(path: str, version: str) -> DependencyYAML: def update_dependency_version(path: str, version: str) -> DependencyYAML:
with CodeTimer(f"store deepcopy: {path}"): with CodeTimer(f"store deepcopy: {path}"):
store_copy = deepcopy(DependencyStore.store) store_copy = deepcopy(DependencyStore.store)
dependency = store_copy["dependencies"].get(path, {}) dependency = store_copy["dependencies"].get(path)
dependency["version"] = version if dependency is None:
store_copy["dependencies"][path] = dependency raise ValueError(f"Dependency {path} {version} not found")
dependency["version"] = version
store_copy["dependencies"][path] = dependency
return store_copy return store_copy
@staticmethod @staticmethod
def write_store(file: str, data: DependencyYAML): def write_store(file: str, data: DependencyYAML):
with open(file, "w") as yaml_file: with open(file, "w") as yaml_file:
yaml.safe_dump(data, yaml_file, sort_keys=False) yaml.safe_dump(data, yaml_file, sort_keys=False)
class Dependency: class Dependency:
def __init__(self, path: str, values: DependencyDict): def __init__(self, path: str, values: DependencyDict):
self.path = path self.path = path
self.values = values self.values = values
self.name: str = "" self.name: str = ""
self.desc: str = "" self.desc: str = ""
self.kind: str = "" self.kind: str = ""
match path.split("/"): match path.split("/"):
case ["plugins", name]: case ["plugins", name]:
self.name = name self.name = name
self.kind = "plugin" self.kind = "plugin"
self.desc = f"{name} plugin" self.desc = f"{name} plugin"
case ["themes", name]: case ["themes", name]:
self.name = name.replace(".zsh-theme", "") self.name = name.replace(".zsh-theme", "")
self.kind = "theme" self.kind = "theme"
self.desc = f"{self.name} theme" self.desc = f"{self.name} theme"
case _: case _:
self.name = self.desc = path self.name = self.desc = path
def __str__(self): def __str__(self):
output: str = "" output: str = ""
for key in DependencyDict.__dict__['__annotations__'].keys(): for key in DependencyDict.__dict__["__annotations__"].keys():
if key not in self.values: if key not in self.values:
output += f"{key}: None\n" output += f"{key}: None\n"
continue continue
value = self.values[key] value = self.values[key]
if "\n" not in value: if "\n" not in value:
output += f"{key}: {value}\n" output += f"{key}: {value}\n"
else: else:
output += f"{key}:\n " output += f"{key}:\n "
output += value.replace("\n", "\n ", value.count("\n") - 1) output += value.replace("\n", "\n ", value.count("\n") - 1)
return output return output
def update_or_notify(self): def update_or_notify(self):
# Print dependency settings # Print dependency settings
print(f"Processing {self.desc}...", file=sys.stderr) print(f"Processing {self.desc}...", file=sys.stderr)
print(self, file=sys.stderr) print(self, file=sys.stderr)
# Check for updates # Check for updates
repo = self.values["repo"] repo = self.values["repo"]
remote_branch = self.values["branch"] remote_branch = self.values["branch"]
version = self.values["version"] version = self.values["version"]
is_tag = version.startswith("tag:") is_tag = version.startswith("tag:")
try:
with CodeTimer(f"update check: {repo}"):
if is_tag:
status = GitHub.check_newer_tag(repo, version.replace("tag:", ""))
else:
status = GitHub.check_updates(repo, remote_branch, version)
if status["has_updates"]:
short_sha = status["head_ref"][:8]
new_version = status["version"] if is_tag else short_sha
try: try:
# Create new branch with CodeTimer(f"update check: {repo}"):
branch = Git.create_branch(self.path, new_version) if is_tag:
status = GitHub.check_newer_tag(repo, version.replace("tag:", ""))
else:
status = GitHub.check_updates(repo, remote_branch, version)
# Update dependencies.yml file if status["has_updates"] is True:
self.__update_yaml(f"tag:{new_version}" if is_tag else status["version"]) short_sha = status["head_ref"][:8]
new_version = status["version"] if is_tag else short_sha
# Update dependency files try:
self.__apply_upstream_changes() branch_name = f"update/{self.path}/{new_version}"
# Add all changes and commit # Create new branch
Git.add_and_commit(self.name, short_sha) branch = Git.checkout_or_create_branch(branch_name)
# Push changes to remote # Update dependencies.yml file
Git.push(branch) self.__update_yaml(
f"tag:{new_version}" if is_tag else status["version"]
)
# Create GitHub PR # Update dependency files
GitHub.create_pr( self.__apply_upstream_changes()
branch,
f"feat({self.name}): update to version {new_version}", # Add all changes and commit
f"""## Description has_new_commit = Git.add_and_commit(self.name, short_sha)
if has_new_commit:
# Push changes to remote
Git.push(branch)
# Create GitHub PR
GitHub.create_pr(
branch,
f"feat({self.name}): update to version {new_version}",
f"""## Description
Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}). Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}).
Check out the [list of changes]({status['compare_url']}). Check out the [list of changes]({status['compare_url']}).
""" """,
) )
# Clean up repository # Clean up repository
Git.clean_repo() Git.clean_repo()
except (CommandRunner.Exception, shutil.Error) as e: except (CommandRunner.Exception, shutil.Error) as e:
# Handle exception on automatic update # Handle exception on automatic update
match type(e): match type(e):
case CommandRunner.Exception: case CommandRunner.Exception:
# Print error message # Print error message
print(f"Error running {e.stage} command: {e.returncode}", file=sys.stderr) print(
print(e.stderr, file=sys.stderr) f"Error running {e.stage} command: {e.returncode}", # pyright: ignore[reportAttributeAccessIssue]
case shutil.Error: file=sys.stderr,
print(f"Error copying files: {e}", file=sys.stderr) )
print(e.stderr, file=sys.stderr) # pyright: ignore[reportAttributeAccessIssue]
case shutil.Error:
print(f"Error copying files: {e}", file=sys.stderr)
try: try:
Git.clean_repo() Git.clean_repo()
except CommandRunner.Exception as e: except CommandRunner.Exception as e:
print(f"Error reverting repository to clean state: {e}", file=sys.stderr) print(
sys.exit(1) f"Error reverting repository to clean state: {e}",
file=sys.stderr,
)
sys.exit(1)
# Create a GitHub issue to notify maintainer # Create a GitHub issue to notify maintainer
title = f"{self.path}: update to {new_version}" title = f"{self.path}: update to {new_version}"
body = ( body = f"""## Description
f"""## Description
There is a new version of `{self.name}` {self.kind} available. There is a new version of `{self.name}` {self.kind} available.
New version: [{new_version}]({status['head_url']}) New version: [{new_version}]({status['head_url']})
Check out the [list of changes]({status['compare_url']}). Check out the [list of changes]({status['compare_url']}).
""" """
)
print(f"Creating GitHub issue", file=sys.stderr) print("Creating GitHub issue", file=sys.stderr)
print(f"{title}\n\n{body}", file=sys.stderr) print(f"{title}\n\n{body}", file=sys.stderr)
GitHub.create_issue(title, body) GitHub.create_issue(title, body)
except Exception as e: except Exception as e:
print(e, file=sys.stderr) print(e, file=sys.stderr)
def __update_yaml(self, new_version: str) -> None: def __update_yaml(self, new_version: str) -> None:
dep_yaml = DependencyStore.update_dependency_version(self.path, new_version) dep_yaml = DependencyStore.update_dependency_version(self.path, new_version)
DependencyStore.write_store(DEPS_YAML_FILE, dep_yaml) DependencyStore.write_store(DEPS_YAML_FILE, dep_yaml)
def __apply_upstream_changes(self) -> None: def __apply_upstream_changes(self) -> None:
# Patterns to ignore in copying files from upstream repo # Patterns to ignore in copying files from upstream repo
GLOBAL_IGNORE = [ GLOBAL_IGNORE = [".git", ".github", ".gitignore"]
".git",
".github",
".gitignore"
]
path = os.path.abspath(self.path) path = os.path.abspath(self.path)
precopy = self.values.get("precopy") precopy = self.values.get("precopy")
postcopy = self.values.get("postcopy") postcopy = self.values.get("postcopy")
repo = self.values["repo"] repo = self.values["repo"]
branch = self.values["branch"] branch = self.values["branch"]
remote_url = f"https://github.com/{repo}.git" remote_url = f"https://github.com/{repo}.git"
repo_dir = os.path.join(TMP_DIR, repo) repo_dir = os.path.join(TMP_DIR, repo)
# Clone repository # Clone repository
Git.clone(remote_url, branch, repo_dir, reclone=True) Git.clone(remote_url, branch, repo_dir, reclone=True)
# Run precopy on tmp repo # Run precopy on tmp repo
if precopy is not None: if precopy is not None:
print("Running precopy script:", end="\n ", file=sys.stderr) print("Running precopy script:", end="\n ", file=sys.stderr)
print(precopy.replace("\n", "\n ", precopy.count("\n") - 1), file=sys.stderr) print(
CommandRunner.run_or_fail(["bash", "-c", precopy], cwd=repo_dir, stage="Precopy") precopy.replace("\n", "\n ", precopy.count("\n") - 1), file=sys.stderr
)
CommandRunner.run_or_fail(
["bash", "-c", precopy], cwd=repo_dir, stage="Precopy"
)
# Copy files from upstream repo # Copy files from upstream repo
print(f"Copying files from {repo_dir} to {path}", file=sys.stderr) print(f"Copying files from {repo_dir} to {path}", file=sys.stderr)
shutil.copytree(repo_dir, path, dirs_exist_ok=True, ignore=shutil.ignore_patterns(*GLOBAL_IGNORE)) shutil.copytree(
repo_dir,
path,
dirs_exist_ok=True,
ignore=shutil.ignore_patterns(*GLOBAL_IGNORE),
)
# Run postcopy on our repository # Run postcopy on our repository
if postcopy is not None: if postcopy is not None:
print("Running postcopy script:", end="\n ", file=sys.stderr) print("Running postcopy script:", end="\n ", file=sys.stderr)
print(postcopy.replace("\n", "\n ", postcopy.count("\n") - 1), file=sys.stderr) print(
CommandRunner.run_or_fail(["bash", "-c", postcopy], cwd=path, stage="Postcopy") postcopy.replace("\n", "\n ", postcopy.count("\n") - 1),
file=sys.stderr,
)
CommandRunner.run_or_fail(
["bash", "-c", postcopy], cwd=path, stage="Postcopy"
)
class Git: class Git:
default_branch = "master" default_branch = "master"
@staticmethod @staticmethod
def clone(remote_url: str, branch: str, repo_dir: str, reclone=False): def clone(remote_url: str, branch: str, repo_dir: str, reclone=False):
# If repo needs to be fresh # If repo needs to be fresh
if reclone and os.path.exists(repo_dir): if reclone and os.path.exists(repo_dir):
shutil.rmtree(repo_dir) shutil.rmtree(repo_dir)
# Clone repo in tmp directory and checkout branch # Clone repo in tmp directory and checkout branch
if not os.path.exists(repo_dir): if not os.path.exists(repo_dir):
print(f"Cloning {remote_url} to {repo_dir} and checking out {branch}", file=sys.stderr) print(
CommandRunner.run_or_fail(["git", "clone", "--depth=1", "-b", branch, remote_url, repo_dir], stage="Clone") f"Cloning {remote_url} to {repo_dir} and checking out {branch}",
file=sys.stderr,
)
CommandRunner.run_or_fail(
["git", "clone", "--depth=1", "-b", branch, remote_url, repo_dir],
stage="Clone",
)
@staticmethod @staticmethod
def create_branch(path: str, version: str): def checkout_or_create_branch(branch_name: str):
# Get current branch name # Get current branch name
result = CommandRunner.run_or_fail(["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch") result = CommandRunner.run_or_fail(
Git.default_branch = result.stdout.decode("utf-8").strip() ["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch"
)
Git.default_branch = result.stdout.decode("utf-8").strip()
# Create new branch and return created branch name # Create new branch and return created branch name
branch_name = f"update/{path}/{version}" try:
CommandRunner.run_or_fail(["git", "checkout", "-b", branch_name], stage="CreateBranch") # try to checkout already existing branch
return branch_name CommandRunner.run_or_fail(
["git", "checkout", branch_name], stage="CreateBranch"
)
except CommandRunner.Exception:
# otherwise create new branch
CommandRunner.run_or_fail(
["git", "checkout", "-b", branch_name], stage="CreateBranch"
)
return branch_name
@staticmethod @staticmethod
def add_and_commit(scope: str, version: str): def add_and_commit(scope: str, version: str) -> bool:
user_name = os.environ.get("GIT_APP_NAME") """
user_email = os.environ.get("GIT_APP_EMAIL") Returns `True` if there were changes and were indeed commited.
Returns `False` if the repo was clean and no changes were commited.
"""
# check if repo is clean (clean => no error, no commit)
try:
CommandRunner.run_or_fail(
["git", "diff", "--exit-code"], stage="CheckRepoClean"
)
return False
except CommandRunner.Exception:
# if it's other kind of error just throw!
pass
# Add all files to git staging user_name = os.environ.get("GIT_APP_NAME")
CommandRunner.run_or_fail(["git", "add", "-A", "-v"], stage="AddFiles") user_email = os.environ.get("GIT_APP_EMAIL")
# Reset environment and git config # Add all files to git staging
clean_env = os.environ.copy() CommandRunner.run_or_fail(["git", "add", "-A", "-v"], stage="AddFiles")
clean_env["LANG"]="C.UTF-8"
clean_env["GIT_CONFIG_GLOBAL"]="/dev/null"
clean_env["GIT_CONFIG_NOSYSTEM"]="1"
# Commit with settings above # Reset environment and git config
CommandRunner.run_or_fail([ clean_env = os.environ.copy()
"git", clean_env["LANG"] = "C.UTF-8"
"-c", f"user.name={user_name}", clean_env["GIT_CONFIG_GLOBAL"] = "/dev/null"
"-c", f"user.email={user_email}", clean_env["GIT_CONFIG_NOSYSTEM"] = "1"
"commit",
"-m", f"feat({scope}): update to {version}"
], stage="CreateCommit", env=clean_env)
@staticmethod # Commit with settings above
def push(branch: str): CommandRunner.run_or_fail(
CommandRunner.run_or_fail(["git", "push", "-u", "origin", branch], stage="PushBranch") [
"git",
"-c",
f"user.name={user_name}",
"-c",
f"user.email={user_email}",
"commit",
"-m",
f"feat({scope}): update to {version}",
],
stage="CreateCommit",
env=clean_env,
)
return True
@staticmethod @staticmethod
def clean_repo(): def push(branch: str):
CommandRunner.run_or_fail(["git", "reset", "--hard", "HEAD"], stage="ResetRepository") CommandRunner.run_or_fail(
CommandRunner.run_or_fail(["git", "checkout", Git.default_branch], stage="CheckoutDefaultBranch") ["git", "push", "-u", "origin", branch], stage="PushBranch"
)
@staticmethod
def clean_repo():
CommandRunner.run_or_fail(
["git", "reset", "--hard", "HEAD"], stage="ResetRepository"
)
CommandRunner.run_or_fail(
["git", "checkout", Git.default_branch], stage="CheckoutDefaultBranch"
)
class GitHub: class GitHub:
@staticmethod @staticmethod
def check_newer_tag(repo, current_tag) -> UpdateStatus: def check_newer_tag(repo, current_tag) -> UpdateStatusFalse | UpdateStatusTrue:
# GET /repos/:owner/:repo/git/refs/tags # GET /repos/:owner/:repo/git/refs/tags
url = f"https://api.github.com/repos/{repo}/git/refs/tags" url = f"https://api.github.com/repos/{repo}/git/refs/tags"
# Send a GET request to the GitHub API # Send a GET request to the GitHub API
response = requests.get(url) response = requests.get(url)
current_version = coerce(current_tag)
if current_version is None:
raise ValueError(
f"Stored {current_version} from {repo} does not follow semver"
)
# If the request was successful # If the request was successful
if response.status_code == 200: if response.status_code == 200:
# Parse the JSON response # Parse the JSON response
data = response.json() data = response.json()
if len(data) == 0: if len(data) == 0:
return { return {
"has_updates": False, "has_updates": False,
} }
latest_ref = data[-1] latest_ref = None
latest_tag = latest_ref["ref"].replace("refs/tags/", "") latest_version: Optional[Version] = None
for ref in data:
# we find the tag since GitHub returns it as plain git ref
tag_version = coerce(ref["ref"].replace("refs/tags/", ""))
if tag_version is None:
# we skip every tag that is not semver-complaint
continue
if latest_version is None or tag_version.compare(latest_version) > 0:
# if we have a "greater" semver version, set it as latest
latest_version = tag_version
latest_ref = ref
if latest_tag == current_tag: # raise if no valid semver tag is found
return { if latest_ref is None or latest_version is None:
"has_updates": False, raise ValueError(f"No tags following semver found in {repo}")
}
return { # we get the tag since GitHub returns it as plain git ref
"has_updates": True, latest_tag = latest_ref["ref"].replace("refs/tags/", "")
"version": latest_tag,
"compare_url": f"https://github.com/{repo}/compare/{current_tag}...{latest_tag}",
"head_ref": latest_ref["object"]["sha"],
"head_url": f"https://github.com/{repo}/releases/tag/{latest_tag}",
}
else:
# If the request was not successful, raise an exception
raise Exception(f"GitHub API request failed with status code {response.status_code}: {response.json()}")
@staticmethod if latest_version.compare(current_version) <= 0:
def check_updates(repo, branch, version) -> UpdateStatus: return {
# TODO: add support for semver updating (based on tags) "has_updates": False,
# Check if upstream github repo has a new version }
# GitHub API URL for comparing two commits
url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}"
# Send a GET request to the GitHub API return {
response = requests.get(url) "has_updates": True,
"version": latest_tag,
"compare_url": f"https://github.com/{repo}/compare/{current_tag}...{latest_tag}",
"head_ref": latest_ref["object"]["sha"],
"head_url": f"https://github.com/{repo}/releases/tag/{latest_tag}",
}
else:
# If the request was not successful, raise an exception
raise Exception(
f"GitHub API request failed with status code {response.status_code}: {response.json()}"
)
# If the request was successful @staticmethod
if response.status_code == 200: def check_updates(repo, branch, version) -> UpdateStatusFalse | UpdateStatusTrue:
# Parse the JSON response url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}"
data = response.json()
# If the base is behind the head, there is a newer version # Send a GET request to the GitHub API
has_updates = data["status"] != "identical" response = requests.get(url)
if not has_updates: # If the request was successful
return { if response.status_code == 200:
"has_updates": False, # Parse the JSON response
} data = response.json()
return { # If the base is behind the head, there is a newer version
"has_updates": data["status"] != "identical", has_updates = data["status"] != "identical"
"version": data["commits"][-1]["sha"],
"compare_url": data["permalink_url"],
"head_ref": data["commits"][-1]["sha"],
"head_url": data["commits"][-1]["html_url"]
}
else:
# If the request was not successful, raise an exception
raise Exception(f"GitHub API request failed with status code {response.status_code}: {response.json()}")
@staticmethod if not has_updates:
def create_issue(title: str, body: str) -> None: return {
cmd = [ "has_updates": False,
"gh", }
"issue",
"create",
"-t", title,
"-b", body
]
CommandRunner.run_or_fail(cmd, stage="CreateIssue")
@staticmethod return {
def create_pr(branch: str, title: str, body: str) -> None: "has_updates": data["status"] != "identical",
cmd = [ "version": data["commits"][-1]["sha"],
"gh", "compare_url": data["permalink_url"],
"pr", "head_ref": data["commits"][-1]["sha"],
"create", "head_url": data["commits"][-1]["html_url"],
"-B", Git.default_branch, }
"-H", branch, else:
"-t", title, # If the request was not successful, raise an exception
"-b", body raise Exception(
] f"GitHub API request failed with status code {response.status_code}: {response.json()}"
CommandRunner.run_or_fail(cmd, stage="CreatePullRequest") )
@staticmethod
def create_issue(title: str, body: str) -> None:
cmd = ["gh", "issue", "create", "-t", title, "-b", body]
CommandRunner.run_or_fail(cmd, stage="CreateIssue")
@staticmethod
def create_pr(branch: str, title: str, body: str) -> None:
# first of all let's check if PR is already open
check_cmd = [
"gh",
"pr",
"list",
"--state",
"open",
"--head",
branch,
"--json",
"title",
]
# returncode is 0 also if no PRs are found
output = json.loads(
CommandRunner.run_or_fail(check_cmd, stage="CheckPullRequestOpen")
.stdout.decode("utf-8")
.strip()
)
# we have PR in this case!
if len(output) > 0:
return
cmd = [
"gh",
"pr",
"create",
"-B",
Git.default_branch,
"-H",
branch,
"-t",
title,
"-b",
body,
]
CommandRunner.run_or_fail(cmd, stage="CreatePullRequest")
def main(): def main():
# Load the YAML file # Load the YAML file
with open(DEPS_YAML_FILE, "r") as yaml_file: with open(DEPS_YAML_FILE, "r") as yaml_file:
data: DependencyYAML = yaml.safe_load(yaml_file) data: DependencyYAML = yaml.safe_load(yaml_file)
if "dependencies" not in data: if "dependencies" not in data:
raise Exception(f"dependencies.yml not properly formatted") raise Exception("dependencies.yml not properly formatted")
# Cache YAML version # Cache YAML version
DependencyStore.set(data) DependencyStore.set(data)
dependencies = data["dependencies"]
for path in dependencies:
dependency = Dependency(path, dependencies[path])
dependency.update_or_notify()
dependencies = data["dependencies"]
for path in dependencies:
dependency = Dependency(path, dependencies[path])
dependency.update_or_notify()
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View file

@ -43,6 +43,7 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi
- [Custom Plugins And Themes](#custom-plugins-and-themes) - [Custom Plugins And Themes](#custom-plugins-and-themes)
- [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems) - [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems)
- [Skip Aliases](#skip-aliases) - [Skip Aliases](#skip-aliases)
- [Disable async git prompt](#disable-async-git-prompt)
- [Getting Updates](#getting-updates) - [Getting Updates](#getting-updates)
- [Updates Verbosity](#updates-verbosity) - [Updates Verbosity](#updates-verbosity)
- [Manual Updates](#manual-updates) - [Manual Updates](#manual-updates)
@ -361,6 +362,17 @@ Instead, you can now use the following:
zstyle ':omz:lib:directories' aliases no zstyle ':omz:lib:directories' aliases no
``` ```
### Disable async git prompt
Async prompt functions are an experimental feature (included on April 3, 2024) that allows Oh My Zsh to render prompt information
asyncronously. This can improve prompt rendering performance, but it might not work well with some setups. We hope that's not an
issue, but if you're seeing problems with this new feature, you can turn it off by setting the following in your .zshrc file,
before Oh My Zsh is sourced:
```sh
zstyle ':omz:alpha:lib:git' async-prompt no
```
#### Notice <!-- omit in toc --> #### Notice <!-- omit in toc -->
> This feature is currently in a testing phase and it may be subject to change in the future. > This feature is currently in a testing phase and it may be subject to change in the future.

View file

@ -1,12 +1,12 @@
# Put files in this folder to add your own custom functionality. # Put files in this folder to add your own custom functionality.
# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization # See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization
# #
# Files in the custom/ directory will be: # Files in the custom/ directory will be:
# - loaded automatically by the init script, in alphabetical order # - loaded automatically by the init script, in alphabetical order
# - loaded last, after all built-ins in the lib/ directory, to override them # - loaded last, after all built-ins in the lib/ directory, to override them
# - ignored by git by default # - ignored by git by default
# #
# Example: add custom/shortcuts.zsh for shortcuts to your local projects # Example: add custom/shortcuts.zsh for shortcuts to your local projects
# #
# brainstormr=~/Projects/development/planetargon/brainstormr # brainstormr=~/Projects/development/planetargon/brainstormr
# cd $brainstormr # cd $brainstormr

View file

@ -1,6 +1,6 @@
# Put your custom themes in this folder. # Put your custom themes in this folder.
# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes # See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes
# #
# Example: # Example:
PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% " PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "

View file

@ -3,6 +3,7 @@
# https://github.com/woefe/git-prompt.zsh/blob/master/git-prompt.zsh # https://github.com/woefe/git-prompt.zsh/blob/master/git-prompt.zsh
zmodload zsh/system zmodload zsh/system
autoload -Uz is-at-least
# For now, async prompt function handlers are set up like so: # For now, async prompt function handlers are set up like so:
# First, define the async function handler and register the handler # First, define the async function handler and register the handler
@ -82,10 +83,8 @@ function _omz_async_request {
exec {fd}< <( exec {fd}< <(
# Tell parent process our PID # Tell parent process our PID
builtin echo ${sysparams[pid]} builtin echo ${sysparams[pid]}
# Store handler name for callback
builtin echo $handler
# Set exit code for the handler if used # Set exit code for the handler if used
(exit $ret) () { return $ret }
# Run the async function handler # Run the async function handler
$handler $handler
) )
@ -95,11 +94,11 @@ function _omz_async_request {
# There's a weird bug here where ^C stops working unless we force a fork # There's a weird bug here where ^C stops working unless we force a fork
# See https://github.com/zsh-users/zsh-autosuggestions/issues/364 # See https://github.com/zsh-users/zsh-autosuggestions/issues/364
command true # and https://github.com/zsh-users/zsh-autosuggestions/pull/612
is-at-least 5.8 || command true
# Save the PID from the handler child process # Save the PID from the handler child process
read pid <&$fd read -u $fd "_OMZ_ASYNC_PIDS[$handler]"
_OMZ_ASYNC_PIDS[$handler]=$pid
# When the fd is readable, call the response handler # When the fd is readable, call the response handler
zle -F "$fd" _omz_async_callback zle -F "$fd" _omz_async_callback
@ -114,19 +113,18 @@ function _omz_async_callback() {
local err=$2 # Second arg will be passed in case of error local err=$2 # Second arg will be passed in case of error
if [[ -z "$err" || "$err" == "hup" ]]; then if [[ -z "$err" || "$err" == "hup" ]]; then
# Get handler name from first line # Get handler name from fd
local handler local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}"
read handler <&$fd
# Store old output which is supposed to be already printed # Store old output which is supposed to be already printed
local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}" local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}"
# Read output from fd # Read output from fd
_OMZ_ASYNC_OUTPUT[$handler]="$(cat <&$fd)" IFS= read -r -u $fd -d '' "_OMZ_ASYNC_OUTPUT[$handler]"
# Repaint prompt if output has changed # Repaint prompt if output has changed
if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then
zle reset-prompt zle .reset-prompt
zle -R zle -R
fi fi

View file

@ -241,10 +241,18 @@ function _omz::plugin::disable {
# Remove plugins substitution awk script # Remove plugins substitution awk script
local awk_subst_plugins="\ local awk_subst_plugins="\
gsub(/[ \t]+(${(j:|:)dis_plugins})/, \"\") # with spaces before gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after
gsub(/(${(j:|:)dis_plugins})[ \t]+/, \"\") # with spaces after gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL
gsub(/\((${(j:|:)dis_plugins})\)/, \"\") # without spaces (only plugin) gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after
gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after
gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after
gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses
gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis
gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL
" "
# Disable plugins awk script # Disable plugins awk script
local awk_script=" local awk_script="
# if plugins=() is in oneline form, substitute disabled plugins and go to next line # if plugins=() is in oneline form, substitute disabled plugins and go to next line
@ -773,7 +781,17 @@ function _omz::theme::use {
} }
function _omz::update { function _omz::update {
local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD) # Check if git command is available
(( $+commands[git] )) || {
_omz::log error "git is not installed. Aborting..."
return 1
}
local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)
[[ $? -eq 0 ]] || {
_omz::log error "\`$ZSH\` is not a git directory. Aborting..."
return 1
}
# Run update script # Run update script
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default

View file

@ -13,7 +13,7 @@ function handle_completion_insecurities() {
# /usr/share/zsh/5.0.6 # /usr/share/zsh/5.0.6
# #
# Since the ignorable first line is printed to stderr and thus not captured, # Since the ignorable first line is printed to stderr and thus not captured,
# stderr is squelched to prevent this output from leaking to the user. # stderr is squelched to prevent this output from leaking to the user.
local -aU insecure_dirs local -aU insecure_dirs
insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} ) insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} )

View file

@ -30,7 +30,7 @@
# #
# This is written in a defensive style so it still works (and can detect) cases when # This is written in a defensive style so it still works (and can detect) cases when
# basic functionality like echo and which have been redefined. In particular, almost # basic functionality like echo and which have been redefined. In particular, almost
# everything is invoked with "builtin" or "command", to work in the face of user # everything is invoked with "builtin" or "command", to work in the face of user
# redefinitions. # redefinitions.
# #
# OPTIONS # OPTIONS
@ -59,7 +59,7 @@ function omz_diagnostic_dump() {
emulate -L zsh emulate -L zsh
builtin echo "Generating diagnostic dump; please be patient..." builtin echo "Generating diagnostic dump; please be patient..."
local thisfcn=omz_diagnostic_dump local thisfcn=omz_diagnostic_dump
local -A opts local -A opts
local opt_verbose opt_noverbose opt_outfile local opt_verbose opt_noverbose opt_outfile
@ -90,7 +90,7 @@ function omz_diagnostic_dump() {
builtin echo builtin echo
builtin echo Diagnostic dump file created at: "$outfile" builtin echo Diagnostic dump file created at: "$outfile"
builtin echo builtin echo
builtin echo To share this with OMZ developers, post it as a gist on GitHub builtin echo To share this with OMZ developers, post it as a gist on GitHub
builtin echo at "https://gist.github.com" and share the link to the gist. builtin echo at "https://gist.github.com" and share the link to the gist.
builtin echo builtin echo
builtin echo "WARNING: This dump file contains all your zsh and omz configuration files," builtin echo "WARNING: This dump file contains all your zsh and omz configuration files,"
@ -105,8 +105,8 @@ function _omz_diag_dump_one_big_text() {
builtin echo oh-my-zsh diagnostic dump builtin echo oh-my-zsh diagnostic dump
builtin echo builtin echo
builtin echo $outfile builtin echo $outfile
builtin echo builtin echo
# Basic system and zsh information # Basic system and zsh information
command date command date
command uname -a command uname -a
@ -151,7 +151,7 @@ function _omz_diag_dump_one_big_text() {
# Core command definitions # Core command definitions
_omz_diag_dump_check_core_commands || return 1 _omz_diag_dump_check_core_commands || return 1
builtin echo builtin echo
# ZSH Process state # ZSH Process state
builtin echo Process state: builtin echo Process state:
@ -167,7 +167,7 @@ function _omz_diag_dump_one_big_text() {
#TODO: Should this include `env` instead of or in addition to `export`? #TODO: Should this include `env` instead of or in addition to `export`?
builtin echo Exported: builtin echo Exported:
builtin echo $(builtin export | command sed 's/=.*//') builtin echo $(builtin export | command sed 's/=.*//')
builtin echo builtin echo
builtin echo Locale: builtin echo Locale:
command locale command locale
builtin echo builtin echo
@ -181,7 +181,7 @@ function _omz_diag_dump_one_big_text() {
builtin echo builtin echo
builtin echo 'compaudit output:' builtin echo 'compaudit output:'
compaudit compaudit
builtin echo builtin echo
builtin echo '$fpath directories:' builtin echo '$fpath directories:'
command ls -lad $fpath command ls -lad $fpath
builtin echo builtin echo
@ -224,7 +224,7 @@ function _omz_diag_dump_one_big_text() {
local cfgfile cfgfiles local cfgfile cfgfiles
# Some files for bash that zsh does not use are intentionally included # Some files for bash that zsh does not use are intentionally included
# to help with diagnosing behavior differences between bash and zsh # to help with diagnosing behavior differences between bash and zsh
cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout
$zdotdir/.zshenv $zdotdir/.zprofile $zdotdir/.zshrc $zdotdir/.zlogin $zdotdir/.zlogout $zdotdir/.zshenv $zdotdir/.zprofile $zdotdir/.zshrc $zdotdir/.zlogin $zdotdir/.zlogout
~/.zsh.pre-oh-my-zsh ~/.zsh.pre-oh-my-zsh
/etc/bashrc /etc/profile ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_logout ) /etc/bashrc /etc/profile ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_logout )
@ -258,8 +258,8 @@ function _omz_diag_dump_check_core_commands() {
# (For back-compatibility, if any of these are newish, they should be removed, # (For back-compatibility, if any of these are newish, they should be removed,
# or at least made conditional on the version of the current running zsh.) # or at least made conditional on the version of the current running zsh.)
# "history" is also excluded because OMZ is known to redefine that # "history" is also excluded because OMZ is known to redefine that
reserved_words=( do done esac then elif else fi for case if while function reserved_words=( do done esac then elif else fi for case if while function
repeat time until select coproc nocorrect foreach end '!' '[[' '{' '}' repeat time until select coproc nocorrect foreach end '!' '[[' '{' '}'
) )
builtins=( alias autoload bg bindkey break builtin bye cd chdir command builtins=( alias autoload bg bindkey break builtin bye cd chdir command
comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comparguments compcall compctl compdescribe compfiles compgroups compquote comptags
@ -331,7 +331,7 @@ function _omz_diag_dump_os_specific_version() {
case "$OSTYPE" in case "$OSTYPE" in
darwin*) darwin*)
osname=$(command sw_vers -productName) osname=$(command sw_vers -productName)
osver=$(command sw_vers -productVersion) osver=$(command sw_vers -productVersion)
builtin echo "OS Version: $osname $osver build $(sw_vers -buildVersion)" builtin echo "OS Version: $osname $osver build $(sw_vers -buildVersion)"
;; ;;
cygwin) cygwin)

View file

@ -1,3 +1,5 @@
autoload -Uz is-at-least
# The git prompt's git commands are read-only and should not interfere with # The git prompt's git commands are read-only and should not interfere with
# other processes. This environment variable is equivalent to running with `git # other processes. This environment variable is equivalent to running with `git
# --no-optional-locks`, but falls back gracefully for older versions of git. # --no-optional-locks`, but falls back gracefully for older versions of git.
@ -9,7 +11,7 @@ function __git_prompt_git() {
GIT_OPTIONAL_LOCKS=0 command git "$@" GIT_OPTIONAL_LOCKS=0 command git "$@"
} }
function _omz_git_prompt_status() { function _omz_git_prompt_info() {
# If we are on a folder not tracked by git, get out. # If we are on a folder not tracked by git, get out.
# Otherwise, check for hide-info at global and local repository level # Otherwise, check for hide-info at global and local repository level
if ! __git_prompt_git rev-parse --git-dir &> /dev/null \ if ! __git_prompt_git rev-parse --git-dir &> /dev/null \
@ -37,11 +39,17 @@ function _omz_git_prompt_status() {
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}" echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
} }
# Enable async prompt by default unless the setting is at false / no # Use async version if setting is enabled or undefined
if zstyle -t ':omz:alpha:lib:git' async-prompt; then if zstyle -T ':omz:alpha:lib:git' async-prompt; then
function git_prompt_info() { function git_prompt_info() {
if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" ]]; then
echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}"
fi
}
function git_prompt_status() {
if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" ]]; then
echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}"
fi fi
} }
@ -49,10 +57,15 @@ if zstyle -t ':omz:alpha:lib:git' async-prompt; then
# or any of the other prompt variables # or any of the other prompt variables
function _defer_async_git_register() { function _defer_async_git_register() {
# Check if git_prompt_info is used in a prompt variable # Check if git_prompt_info is used in a prompt variable
case "${PS1}:${PS2}:${PS3}:${PS4}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in
*(\$\(git_prompt_info\)|\`git_prompt_info\`)*) *(\$\(git_prompt_info\)|\`git_prompt_info\`)*)
_omz_register_handler _omz_git_prompt_info
;;
esac
case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in
*(\$\(git_prompt_status\)|\`git_prompt_status\`)*)
_omz_register_handler _omz_git_prompt_status _omz_register_handler _omz_git_prompt_status
return
;; ;;
esac esac
@ -65,6 +78,9 @@ if zstyle -t ':omz:alpha:lib:git' async-prompt; then
precmd_functions=(_defer_async_git_register $precmd_functions) precmd_functions=(_defer_async_git_register $precmd_functions)
else else
function git_prompt_info() { function git_prompt_info() {
_omz_git_prompt_info
}
function git_prompt_status() {
_omz_git_prompt_status _omz_git_prompt_status
} }
fi fi
@ -197,7 +213,7 @@ function git_prompt_long_sha() {
SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
} }
function git_prompt_status() { function _omz_git_prompt_status() {
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
# Maps a git status prefix to an internal constant # Maps a git status prefix to an internal constant

View file

@ -1,19 +1,20 @@
## History wrapper ## History wrapper
function omz_history { function omz_history {
local clear list # parse arguments and remove from $@
zparseopts -E c=clear l=list local clear list stamp
zparseopts -E -D c=clear l=list f=stamp E=stamp i=stamp t:=stamp
if [[ -n "$clear" ]]; then if [[ -n "$clear" ]]; then
# if -c provided, clobber the history file # if -c provided, clobber the history file
echo -n >| "$HISTFILE" echo -n >| "$HISTFILE"
fc -p "$HISTFILE" fc -p "$HISTFILE"
echo >&2 History file deleted. echo >&2 History file deleted.
elif [[ -n "$list" ]]; then elif [[ $# -eq 0 ]]; then
# if -l provided, run as if calling `fc' directly # if no arguments provided, show full history starting from 1
builtin fc "$@" builtin fc $stamp -l 1
else else
# unless a number is provided, show all history events (starting from 1) # otherwise, run `fc -l` with a custom format
[[ ${@[-1]-} = *[0-9]* ]] && builtin fc -l "$@" || builtin fc -l "$@" 1 builtin fc $stamp -l "$@"
fi fi
} }

View file

@ -17,7 +17,7 @@ function title {
: ${2=$1} : ${2=$1}
case "$TERM" in case "$TERM" in
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot*|contour*) cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*)
print -Pn "\e]2;${2:q}\a" # set window name print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name print -Pn "\e]1;${1:q}\a" # set tab name
;; ;;
@ -129,7 +129,7 @@ fi
# Don't define the function if we're in an unsupported terminal # Don't define the function if we're in an unsupported terminal
case "$TERM" in case "$TERM" in
# all of these either process OSC 7 correctly or ignore entirely # all of these either process OSC 7 correctly or ignore entirely
xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty|screen*|tmux*) ;; xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty*|screen*|tmux*) ;;
contour*|foot*) ;; contour*|foot*) ;;
*) *)
# Terminal.app and iTerm2 process OSC 7 correctly # Terminal.app and iTerm2 process OSC 7 correctly

169
lib/tests/cli.test.zsh Normal file
View file

@ -0,0 +1,169 @@
#!/usr/bin/zsh -df
run_awk() {
local -a dis_plugins=(${=1})
local input_text="$2"
(( ! DEBUG )) || set -xv
local awk_subst_plugins="\
gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after
gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL
gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after
gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after
gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after
gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses
gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis
gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL
"
# Disable plugins awk script
local awk_script="
# if plugins=() is in oneline form, substitute disabled plugins and go to next line
/^[ \t]*plugins=\([^#]+\).*\$/ {
$awk_subst_plugins
print \$0
next
}
# if plugins=() is in multiline form, enable multi flag and disable plugins if they're there
/^[ \t]*plugins=\(/ {
multi=1
$awk_subst_plugins
print \$0
next
}
# if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag
multi == 1 && /^[^#]*\)/ {
multi=0
$awk_subst_plugins
print \$0
next
}
multi == 1 && length(\$0) > 0 {
$awk_subst_plugins
if (length(\$0) > 0) print \$0
next
}
{ print \$0 }
"
command awk "$awk_script" <<< "$input_text"
(( ! DEBUG )) || set +xv
}
# runs awk against stdin, checks if the resulting file is not empty and then checks if the file has valid zsh syntax
run_awk_and_test() {
local description="$1"
local plugins_to_disable="$2"
local input_text="$3"
local expected_output="$4"
local tmpfile==(:)
{
print -u2 "Test: $description"
DEBUG=0 run_awk "$plugins_to_disable" "$input_text" >| $tmpfile
if [[ ! -s "$tmpfile" ]]; then
print -u2 "\e[31mError\e[0m: output file empty"
return 1
fi
if ! zsh -n $tmpfile; then
print -u2 "\e[31mError\e[0m: zsh syntax error"
diff -u $tmpfile <(echo "$expected_output")
return 1
fi
if ! diff -u --color=always $tmpfile <(echo "$expected_output"); then
if (( DEBUG )); then
print -u2 ""
DEBUG=1 run_awk "$plugins_to_disable" "$input_text"
print -u2 ""
fi
print -u2 "\e[31mError\e[0m: output file does not match expected output"
return 1
fi
print -u2 "\e[32mSuccess\e[0m"
} always {
print -u2 ""
command rm -f "$tmpfile"
}
}
# These tests are for the `omz plugin disable` command
run_awk_and_test \
"it should delete a single plugin in oneline format" \
"git" \
"plugins=(git)" \
"plugins=()"
run_awk_and_test \
"it should delete a single plugin in multiline format" \
"github" \
"plugins=(
github
)" \
"plugins=(
)"
run_awk_and_test \
"it should delete multiple plugins in oneline format" \
"github git z" \
"plugins=(github git z)" \
"plugins=()"
run_awk_and_test \
"it should delete multiple plugins in multiline format" \
"github git z" \
"plugins=(
github
git
z
)" \
"plugins=(
)"
run_awk_and_test \
"it should delete a single plugin among multiple in oneline format" \
"git" \
"plugins=(github git z)" \
"plugins=(github z)"
run_awk_and_test \
"it should delete a single plugin among multiple in multiline format" \
"git" \
"plugins=(
github
git
z
)" \
"plugins=(
github
z
)"
run_awk_and_test \
"it should delete multiple plugins in mixed format" \
"git z" \
"plugins=(github
git z)" \
"plugins=(github
)"
run_awk_and_test \
"it should delete multiple plugins in mixed format 2" \
"github z" \
"plugins=(github
git
z)" \
"plugins=(
git
)"

View file

@ -152,7 +152,7 @@ unset zcompdump_revision zcompdump_fpath zcompdump_refresh
# zcompile the completion dump file if the .zwc is older or missing. # zcompile the completion dump file if the .zwc is older or missing.
if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
zrecompile -q -p "$ZSH_COMPDUMP" zrecompile -q -p "$ZSH_COMPDUMP"
command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock" command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
fi fi
_omz_source() { _omz_source() {

View file

@ -28,6 +28,6 @@ plugins=(... ansible)
## Maintainer ## Maintainer
### [Deepankumar](https://github.com/deepan10) ### [Deepankumar](https://github.com/deepan10)
[https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin](https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin) [https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin](https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin)

View file

@ -179,8 +179,8 @@ fi
# Check Arch Linux PGP Keyring before System Upgrade to prevent failure. # Check Arch Linux PGP Keyring before System Upgrade to prevent failure.
function upgrade() { function upgrade() {
echo ":: Checking Arch Linux PGP Keyring..." echo ":: Checking Arch Linux PGP Keyring..."
local installedver="$(sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')" local installedver="$(LANG= sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')"
local currentver="$(sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')" local currentver="$(LANG= sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')"
if [ $installedver != $currentver ]; then if [ $installedver != $currentver ]; then
echo " Arch Linux PGP Keyring is out of date." echo " Arch Linux PGP Keyring is out of date."
echo " Updating before full system upgrade." echo " Updating before full system upgrade."

View file

@ -13,7 +13,9 @@ autojump_paths=(
/opt/local/etc/profile.d/autojump.sh # macOS with MacPorts /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts
/usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default) /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default)
/opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs) /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs)
/opt/pkg/share/autojump/autojump.zsh # macOS with pkgsrc
/etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes /etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes
/nix/var/nix/gcroots/current-system/sw/share/zsh/site-functions/autojump.zsh # macOS Nix, nix-darwin
) )
for file in $autojump_paths; do for file in $autojump_paths; do

View file

@ -280,7 +280,7 @@ if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
test -s "${AWS_STATE_FILE}" || return test -s "${AWS_STATE_FILE}" || return
aws_state=($(cat $AWS_STATE_FILE)) aws_state=($(cat $AWS_STATE_FILE))
export AWS_DEFAULT_PROFILE="${aws_state[1]}" export AWS_DEFAULT_PROFILE="${aws_state[1]}"
export AWS_PROFILE="$AWS_DEFAULT_PROFILE" export AWS_PROFILE="$AWS_DEFAULT_PROFILE"
export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE" export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE"

View file

@ -39,7 +39,7 @@ index 2fd5f2cd..9d89a464 100644
PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )" PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
-PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)' -PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
+PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(branch_prompt_info)' +PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(branch_prompt_info)'
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}" ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} " ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
``` ```

View file

@ -2,7 +2,7 @@
_source-from-omz-settings() { _source-from-omz-settings() {
local _chruby_path _chruby_auto local _chruby_path _chruby_auto
zstyle -s :omz:plugins:chruby path _chruby_path || return 1 zstyle -s :omz:plugins:chruby path _chruby_path || return 1
zstyle -s :omz:plugins:chruby auto _chruby_auto || return 1 zstyle -s :omz:plugins:chruby auto _chruby_auto || return 1
@ -23,7 +23,7 @@ _source-from-homebrew() {
if [[ -h /usr/local/opt/chruby ]];then if [[ -h /usr/local/opt/chruby ]];then
_brew_prefix="/usr/local/opt/chruby" _brew_prefix="/usr/local/opt/chruby"
else else
# ok , it is not default prefix # ok , it is not default prefix
# this call to brew is expensive ( about 400 ms ), so at least let's make it only once # this call to brew is expensive ( about 400 ms ), so at least let's make it only once
_brew_prefix=$(brew --prefix chruby) _brew_prefix=$(brew --prefix chruby)
fi fi

View file

@ -50,7 +50,7 @@ Alternatively, seek out the [online documentation][3]. And don't forget, there a
## Contributors ## Contributors
Contributed to `oh_my_zsh` by [benwilcock][2]. Contributed to `oh_my_zsh` by [benwilcock][2].
[1]: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html [1]: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html
[2]: https://github.com/benwilcock [2]: https://github.com/benwilcock

View file

@ -24,7 +24,7 @@ Also provides the following aliases:
* **cfc:** Copies the compiled JS to your clipboard. Very useful when you want * **cfc:** Copies the compiled JS to your clipboard. Very useful when you want
to run the code in a JS console. to run the code in a JS console.
* **cfp:** Compiles from your currently copied clipboard. Useful when you want * **cfp:** Compiles from your currently copied clipboard. Useful when you want
to compile large/multi-line snippets to compile large/multi-line snippets
* **cfpc:** Paste coffeescript from clipboard, compile to JS, then copy the * **cfpc:** Paste coffeescript from clipboard, compile to JS, then copy the

View file

@ -7,7 +7,7 @@
if (( ${+commands[compleat]} )); then if (( ${+commands[compleat]} )); then
local prefix="${commands[compleat]:h:h}" local prefix="${commands[compleat]:h:h}"
local setup="${prefix}/share/compleat-1.0/compleat_setup" local setup="${prefix}/share/compleat-1.0/compleat_setup"
if [[ -f "$setup" ]]; then if [[ -f "$setup" ]]; then
if ! bashcompinit >/dev/null 2>&1; then if ! bashcompinit >/dev/null 2>&1; then
@ -15,6 +15,6 @@ if (( ${+commands[compleat]} )); then
bashcompinit -i bashcompinit -i
fi fi
source "$setup" source "$setup"
fi fi
fi fi

View file

@ -1,8 +1,8 @@
# copy the active line from the command line buffer # copy the active line from the command line buffer
# onto the system clipboard # onto the system clipboard
copybuffer () { copybuffer () {
if which clipcopy &>/dev/null; then if builtin which clipcopy &>/dev/null; then
printf "%s" "$BUFFER" | clipcopy printf "%s" "$BUFFER" | clipcopy
else else
zle -M "clipcopy not found. Please make sure you have Oh My Zsh installed correctly." zle -M "clipcopy not found. Please make sure you have Oh My Zsh installed correctly."

View file

@ -19,7 +19,7 @@ dash
- Query for something in dash app: `dash query` - Query for something in dash app: `dash query`
``` ```
dash golang dash golang
``` ```
- You can optionally provide a keyword: `dash [keyword:]query` - You can optionally provide a keyword: `dash [keyword:]query`

View file

@ -11,7 +11,7 @@ _dotnet_completion() {
compdef _dotnet_completion dotnet compdef _dotnet_completion dotnet
# Aliases bellow are here for backwards compatibility # Aliases bellow are here for backwards compatibility
# added by Shaun Tabone (https://github.com/xontab) # added by Shaun Tabone (https://github.com/xontab)
alias dn='dotnet new' alias dn='dotnet new'
alias dr='dotnet run' alias dr='dotnet run'

View file

@ -24,7 +24,7 @@ unset _omz_emoji_plugin_dir
# This is a combining character that can be placed after any other character to surround # This is a combining character that can be placed after any other character to surround
# it in a "keycap" symbol. # it in a "keycap" symbol.
# The digits 0-9 are already in the emoji table as keycap_digit_<N>, keycap_ten, etc. # The digits 0-9 are already in the emoji table as keycap_digit_<N>, keycap_ten, etc.
# It's unclear whether this should be in the $emoji array, because those characters are all ones # It's unclear whether this should be in the $emoji array, because those characters are all ones
# which can be displayed on their own. # which can be displayed on their own.
@ -63,9 +63,9 @@ function random_emoji() {
[[ $list_size -eq 0 ]] && return 1 [[ $list_size -eq 0 ]] && return 1
local random_index=$(( ( RANDOM % $list_size ) + 1 )) local random_index=$(( ( RANDOM % $list_size ) + 1 ))
local name=${names[$random_index]} local name=${names[$random_index]}
if [[ "$group" == "flags" ]]; then if [[ "$group" == "flags" ]]; then
echo ${emoji_flags[$name]} echo ${emoji_flags[$name]}
else else
echo ${emoji[$name]} echo ${emoji[$name]}
fi fi
} }
@ -86,22 +86,22 @@ function display_emoji() {
# terminals treat these emoji chars as single-width. # terminals treat these emoji chars as single-width.
local counter=1 local counter=1
for i in $names; do for i in $names; do
if [[ "$group" == "flags" ]]; then if [[ "$group" == "flags" ]]; then
printf '%s ' "$emoji_flags[$i]" printf '%s ' "$emoji_flags[$i]"
else else
printf '%s ' "$emoji[$i]" printf '%s ' "$emoji[$i]"
fi fi
# New line every 20 emoji, to avoid weirdnesses # New line every 20 emoji, to avoid weirdnesses
if (($counter % 20 == 0)); then if (($counter % 20 == 0)); then
printf "\n" printf "\n"
fi fi
let counter=$counter+1 let counter=$counter+1
done done
print print
for i in $names; do for i in $names; do
if [[ "$group" == "flags" ]]; then if [[ "$group" == "flags" ]]; then
echo "${emoji_flags[$i]} = $i" echo "${emoji_flags[$i]} = $i"
else else
echo "${emoji[$i]} = $i" echo "${emoji[$i]} = $i"
fi fi
done done

View file

@ -4,7 +4,7 @@
# AUTHOR: Alexis Hildebrandt (afh[at]surryhill.net) # AUTHOR: Alexis Hildebrandt (afh[at]surryhill.net)
# VERSION: 1.0.0 # VERSION: 1.0.0
# DEPENDS: emoji plugin # DEPENDS: emoji plugin
# #
# There are different sets of emoji characters available, to choose a different # There are different sets of emoji characters available, to choose a different
# set export emotty_set to the name of the set you would like to use, e.g.: # set export emotty_set to the name of the set you would like to use, e.g.:
# % export emotty_set=nature # % export emotty_set=nature

View file

@ -40,7 +40,7 @@ plugins=(... encode64)
### Encoding a file ### Encoding a file
Encode a file's contents to base64 and save output to text file. Encode a file's contents to base64 and save output to text file.
**NOTE:** Takes provided file and saves encoded content as new file with `.txt` extension **NOTE:** Takes provided file and saves encoded content as new file with `.txt` extension
- From parameter - From parameter

View file

@ -87,7 +87,7 @@ EOF
builtin cd -q control; extract ../control.tar.* builtin cd -q control; extract ../control.tar.*
builtin cd -q ../data; extract ../data.tar.* builtin cd -q ../data; extract ../data.tar.*
builtin cd -q ..; command rm *.tar.* debian-binary ;; builtin cd -q ..; command rm *.tar.* debian-binary ;;
(*.zst) unzstd "$full_path" ;; (*.zst) unzstd --stdout "$full_path" > "${file:t:r}" ;;
(*.cab|*.exe) cabextract "$full_path" ;; (*.cab|*.exe) cabextract "$full_path" ;;
(*.cpio|*.obscpio) cpio -idmvF "$full_path" ;; (*.cpio|*.obscpio) cpio -idmvF "$full_path" ;;
(*.zpaq) zpaq x "$full_path" ;; (*.zpaq) zpaq x "$full_path" ;;

View file

@ -1,14 +1,14 @@
# Use Ctrl-Z to switch back to Vim # Use Ctrl-Z to switch back to Vim
I frequently need to execute random commands in my shell. To achieve it I pause I frequently need to execute random commands in my shell. To achieve it I pause
Vim by pressing Ctrl-z, type command and press fg<Enter> to switch back to Vim. Vim by pressing Ctrl-z, type command and press fg<Enter> to switch back to Vim.
The fg part really hurts me. I just wanted to hit Ctrl-z once again to get back The fg part really hurts me. I just wanted to hit Ctrl-z once again to get back
to Vim. I could not find a solution, so I developed one on my own that to Vim. I could not find a solution, so I developed one on my own that
works wonderfully with ZSH. works wonderfully with ZSH.
Source: http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/ Source: http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/
Credits: Credits:
- original idea by @sheerun - original idea by @sheerun
- added to OMZ by @mbologna - added to OMZ by @mbologna

View file

@ -71,13 +71,13 @@ them, add `<variable>=<value>` to your zshrc file, before Oh My Zsh is sourced.
For example: `fastfile_var_prefix='@'`. For example: `fastfile_var_prefix='@'`.
- `fastfile_var_prefix`: prefix for the global aliases created. Controls the prefix of the - `fastfile_var_prefix`: prefix for the global aliases created. Controls the prefix of the
created global aliases. created global aliases.
**Default:** `§` (section sign), easy to type in a german keyboard via the combination **Default:** `§` (section sign), easy to type in a german keyboard via the combination
[`⇧ Shift`+`3`](https://en.wikipedia.org/wiki/German_keyboard_layout#/media/File:KB_Germany.svg), [`⇧ Shift`+`3`](https://en.wikipedia.org/wiki/German_keyboard_layout#/media/File:KB_Germany.svg),
or using `⌥ Option`+`6` in macOS. or using `⌥ Option`+`6` in macOS.
- `fastfile_dir`: directory where the fastfile shortcuts are stored. Needs to end - `fastfile_dir`: directory where the fastfile shortcuts are stored. Needs to end
with a trailing slash. with a trailing slash.
**Default:** `$HOME/.fastfile/`. **Default:** `$HOME/.fastfile/`.
## Author ## Author

View file

@ -58,7 +58,7 @@ function fl {
tell application forkLiftSetapp tell application forkLiftSetapp
activate activate
set forkLiftVersion to version set forkLiftVersion to version
end tell end tell
else if forkLift3 is not null and application forkLift3 is running then else if forkLift3 is not null and application forkLift3 is running then
tell application forkLift3 tell application forkLift3
activate activate
@ -84,7 +84,7 @@ function fl {
else if forkLift is not null then else if forkLift is not null then
set appName to forkLift set appName to forkLift
end if end if
tell application appName tell application appName
activate activate
set forkLiftVersion to version set forkLiftVersion to version

View file

@ -1,3 +1,16 @@
function fzf_setup_using_fzf() {
(( ${+commands[fzf]} )) || return 1
# we remove "fzf " prefix, this fixes really old fzf versions behaviour
# see https://github.com/ohmyzsh/ohmyzsh/issues/12387
local fzf_ver=${"$(fzf --version)"#fzf }
autoload -Uz is-at-least
is-at-least 0.48.0 ${${(s: :)fzf_ver}[1]} || return 1
eval "$(fzf --zsh)"
}
function fzf_setup_using_base_dir() { function fzf_setup_using_base_dir() {
local fzf_base fzf_shell fzfdirs dir local fzf_base fzf_shell fzfdirs dir
@ -62,7 +75,7 @@ function fzf_setup_using_base_dir() {
function fzf_setup_using_debian() { function fzf_setup_using_debian() {
if (( ! $+commands[apt] && ! $+commands[apt-get] )); then if (( ! $+commands[apt] && ! $+commands[apt-get] )); then
# Not a debian based distro # Not a debian based distro
return 1 return 1
fi fi
@ -135,6 +148,27 @@ function fzf_setup_using_opensuse() {
return 0 return 0
} }
function fzf_setup_using_fedora() {
(( $+commands[fzf] )) || return 1
local completions="/usr/share/zsh/site-functions/fzf"
local key_bindings="/usr/share/fzf/shell/key-bindings.zsh"
if [[ ! -f "$completions" || ! -f "$key_bindings" ]]; then
return 1
fi
if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then
source "$completions" 2>/dev/null
fi
if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then
source "$key_bindings" 2>/dev/null
fi
return 0
}
function fzf_setup_using_openbsd() { function fzf_setup_using_openbsd() {
# openBSD installs fzf in /usr/local/bin/fzf # openBSD installs fzf in /usr/local/bin/fzf
if [[ "$OSTYPE" != openbsd* ]] || (( ! $+commands[fzf] )); then if [[ "$OSTYPE" != openbsd* ]] || (( ! $+commands[fzf] )); then
@ -217,9 +251,11 @@ Please add `export FZF_BASE=/path/to/fzf/install/dir` to your .zshrc
EOF EOF
} }
fzf_setup_using_openbsd \ fzf_setup_using_fzf \
|| fzf_setup_using_openbsd \
|| fzf_setup_using_debian \ || fzf_setup_using_debian \
|| fzf_setup_using_opensuse \ || fzf_setup_using_opensuse \
|| fzf_setup_using_fedora \
|| fzf_setup_using_cygwin \ || fzf_setup_using_cygwin \
|| fzf_setup_using_macports \ || fzf_setup_using_macports \
|| fzf_setup_using_base_dir \ || fzf_setup_using_base_dir \

View file

@ -9,6 +9,7 @@ if [[ -z "${CLOUDSDK_HOME}" ]]; then
"/usr/local/share/google-cloud-sdk" "/usr/local/share/google-cloud-sdk"
"/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk" "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk"
"/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk" "/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk"
"/opt/homebrew/share/google-cloud-sdk"
"/usr/share/google-cloud-sdk" "/usr/share/google-cloud-sdk"
"/snap/google-cloud-sdk/current" "/snap/google-cloud-sdk/current"
"/snap/google-cloud-cli/current" "/snap/google-cloud-cli/current"

View file

@ -9,6 +9,10 @@ To use it, add `git-prompt` to the plugins array in your zshrc file:
plugins=(... git-prompt) plugins=(... git-prompt)
``` ```
You may also need to [customize your theme](https://github.com/ohmyzsh/ohmyzsh/issues/9395#issuecomment-1027130429)
to change the way the prompt is built. See the
[OMZ wiki on customizing themes](https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes).
See the [original repository](https://github.com/olivierverdier/zsh-git-prompt). See the [original repository](https://github.com/olivierverdier/zsh-git-prompt).
## Requirements ## Requirements

View file

@ -41,8 +41,8 @@ plugins=(... git)
| `gba` | `git branch --all` | | `gba` | `git branch --all` |
| `gbd` | `git branch --delete` | | `gbd` | `git branch --delete` |
| `gbD` | `git branch --delete --force` | | `gbD` | `git branch --delete --force` |
| `gbgd` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -d` | | `gbgd` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| cut -c 3- \| awk '"'"'{print $1}'"'"' \| xargs git branch -d` |
| `gbgD` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -D` | | `gbgD` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| cut -c 3- \| awk '"'"'{print $1}'"'"' \| xargs git branch -D` |
| `gbm` | `git branch --move` | | `gbm` | `git branch --move` |
| `gbnm` | `git branch --no-merged` | | `gbnm` | `git branch --no-merged` |
| `gbr` | `git branch --remote` | | `gbr` | `git branch --remote` |
@ -111,6 +111,7 @@ plugins=(... git)
| `gfg` | `git ls-files \| grep` | | `gfg` | `git ls-files \| grep` |
| `gm` | `git merge` | | `gm` | `git merge` |
| `gma` | `git merge --abort` | | `gma` | `git merge --abort` |
| `gmc` | `git merge --continue` |
| `gms` | `git merge --squash` | | `gms` | `git merge --squash` |
| `gmom` | `git merge origin/$(git_main_branch)` | | `gmom` | `git merge origin/$(git_main_branch)` |
| `gmum` | `git merge upstream/$(git_main_branch)` | | `gmum` | `git merge upstream/$(git_main_branch)` |
@ -166,6 +167,7 @@ plugins=(... git)
| `grhk` | `git reset --keep` | | `grhk` | `git reset --keep` |
| `grhs` | `git reset --soft` | | `grhs` | `git reset --soft` |
| `gpristine` | `git reset --hard && git clean --force -dfx` | | `gpristine` | `git reset --hard && git clean --force -dfx` |
| `gwipe` | `git reset --hard && git clean --force -df` |
| `groh` | `git reset origin/$(git_current_branch) --hard` | | `groh` | `git reset origin/$(git_current_branch) --hard` |
| `grs` | `git restore` | | `grs` | `git restore` |
| `grss` | `git restore --source` | | `grss` | `git restore --source` |

View file

@ -147,8 +147,8 @@ function gbds() {
done done
} }
alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | cut -c 3- | awk '"'"'{print $1}'"'"' | xargs git branch -d'
alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | cut -c 3- | awk '"'"'{print $1}'"'"' | xargs git branch -D'
alias gbm='git branch --move' alias gbm='git branch --move'
alias gbnm='git branch --no-merged' alias gbnm='git branch --no-merged'
alias gbr='git branch --remote' alias gbr='git branch --remote'
@ -252,6 +252,7 @@ alias gignored='git ls-files -v | grep "^[[:lower:]]"'
alias gfg='git ls-files | grep' alias gfg='git ls-files | grep'
alias gm='git merge' alias gm='git merge'
alias gma='git merge --abort' alias gma='git merge --abort'
alias gmc='git merge --continue'
alias gms="git merge --squash" alias gms="git merge --squash"
alias gmom='git merge origin/$(git_main_branch)' alias gmom='git merge origin/$(git_main_branch)'
alias gmum='git merge upstream/$(git_main_branch)' alias gmum='git merge upstream/$(git_main_branch)'
@ -349,6 +350,7 @@ alias grhh='git reset --hard'
alias grhk='git reset --keep' alias grhk='git reset --keep'
alias grhs='git reset --soft' alias grhs='git reset --soft'
alias gpristine='git reset --hard && git clean --force -dfx' alias gpristine='git reset --hard && git clean --force -dfx'
alias gwipe='git reset --hard && git clean --force -df'
alias groh='git reset origin/$(git_current_branch) --hard' alias groh='git reset origin/$(git_current_branch) --hard'
alias grs='git restore' alias grs='git restore'
alias grss='git restore --source' alias grss='git restore --source'

View file

@ -14,7 +14,7 @@ __gnu_utils() {
local -a gcmds local -a gcmds
local gcmd local gcmd
# coreutils # coreutils
gcmds=('g[' 'gbase64' 'gbasename' 'gcat' 'gchcon' 'gchgrp' 'gchmod' gcmds=('g[' 'gbase64' 'gbasename' 'gcat' 'gchcon' 'gchgrp' 'gchmod'
'gchown' 'gchroot' 'gcksum' 'gcomm' 'gcp' 'gcsplit' 'gcut' 'gdate' 'gchown' 'gchroot' 'gcksum' 'gcomm' 'gcp' 'gcsplit' 'gcut' 'gdate'
'gdd' 'gdf' 'gdir' 'gdircolors' 'gdirname' 'gdu' 'gecho' 'genv' 'gexpand' 'gdd' 'gdf' 'gdir' 'gdircolors' 'gdirname' 'gdu' 'gecho' 'genv' 'gexpand'
@ -41,7 +41,7 @@ __gnu_utils() {
for gcmd in "${gcmds[@]}"; do for gcmd in "${gcmds[@]}"; do
# Do nothing if the command isn't found # Do nothing if the command isn't found
(( ${+commands[$gcmd]} )) || continue (( ${+commands[$gcmd]} )) || continue
# This method allows for builtin commands to be primary but it's # This method allows for builtin commands to be primary but it's
# lost if hash -r or rehash is executed, or if $PATH is updated. # lost if hash -r or rehash is executed, or if $PATH is updated.
# Thus, a preexec hook is needed, which will only run if whoami # Thus, a preexec hook is needed, which will only run if whoami

View file

@ -7,7 +7,7 @@ _enumerateGrailsScripts() {
then then
directories+=(plugins/*/scripts) directories+=(plugins/*/scripts)
fi fi
# Enumerate all of the Groovy files # Enumerate all of the Groovy files
files=() files=()
for dir in $directories; for dir in $directories;
@ -17,13 +17,13 @@ _enumerateGrailsScripts() {
files+=($dir/[^_]*.groovy) files+=($dir/[^_]*.groovy)
fi fi
done done
# Don't try to basename () # Don't try to basename ()
if [ ${#files} -eq 0 ]; if [ ${#files} -eq 0 ];
then then
return return
fi fi
scripts=() scripts=()
for file in $files for file in $files
do do
@ -42,19 +42,19 @@ _enumerateGrailsScripts() {
done done
echo $scripts echo $scripts
} }
_grails() { _grails() {
if (( CURRENT == 2 )); then if (( CURRENT == 2 )); then
scripts=( $(_enumerateGrailsScripts) ) scripts=( $(_enumerateGrailsScripts) )
if [ ${#scripts} -ne 0 ]; if [ ${#scripts} -ne 0 ];
then then
_multi_parts / scripts _multi_parts / scripts
return return
fi fi
fi fi
_files _files
} }
compdef _grails grails compdef _grails grails

View file

@ -57,13 +57,13 @@ Using [antigen](https://github.com/zsh-users/antigen):
1. Add the `antigen bundle` command just before `antigen apply`, like this: 1. Add the `antigen bundle` command just before `antigen apply`, like this:
``` ```
antigen bundle zsh-users/zsh-history-substring-search antigen bundle zsh-users/zsh-history-substring-search
antigen apply antigen apply
``` ```
2. Then, **after** `antigen apply`, add the key binding configurations, like this: 2. Then, **after** `antigen apply`, add the key binding configurations, like this:
``` ```
# zsh-history-substring-search configuration # zsh-history-substring-search configuration
bindkey '^[[A' history-substring-search-up # or '\eOA' bindkey '^[[A' history-substring-search-up # or '\eOA'
@ -120,7 +120,7 @@ Usage
bindkey "$terminfo[kcuu1]" history-substring-search-up bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down bindkey "$terminfo[kcud1]" history-substring-search-down
Users have also observed that `[OA` and `[OB` are correct values, Users have also observed that `[OA` and `[OB` are correct values,
_even if_ these were not the observed values. If you are having trouble _even if_ these were not the observed values. If you are having trouble
with the observed values, give these a try. with the observed values, give these a try.

View file

@ -1,4 +1,4 @@
#compdef http #compdef http https
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Copyright (c) 2015 GitHub zsh-users - http://github.com/zsh-users # Copyright (c) 2015 GitHub zsh-users - http://github.com/zsh-users
# All rights reserved. # All rights reserved.

View file

@ -3,13 +3,13 @@ alias ih="ionic --help"
alias ist="ionic start" alias ist="ionic start"
alias ii="ionic info" alias ii="ionic info"
alias is="ionic serve" alias is="ionic serve"
alias icba="ionic cordova build android" alias icba="ionic cordova build android"
alias icbi="ionic cordova build ios" alias icbi="ionic cordova build ios"
alias icra="ionic cordova run android" alias icra="ionic cordova run android"
alias icri="ionic cordova run ios" alias icri="ionic cordova run ios"
alias icrsa="ionic cordova resources android" alias icrsa="ionic cordova resources android"
alias icrsi="ionic cordova resources ios" alias icrsi="ionic cordova resources ios"
alias icpaa="ionic cordova platform add android" alias icpaa="ionic cordova platform add android"
alias icpai="ionic cordova platform add ios" alias icpai="ionic cordova platform add ios"
alias icpra="ionic cordova platform rm android" alias icpra="ionic cordova platform rm android"
alias icpri="ionic cordova platform rm ios" alias icpri="ionic cordova platform rm ios"

View file

@ -9,7 +9,7 @@ plugins=(... iterm2)
``` ```
Optionally, the plugin also applies the [Shell Integration Script for iTerm2](https://iterm2.com/documentation-shell-integration.html). Optionally, the plugin also applies the [Shell Integration Script for iTerm2](https://iterm2.com/documentation-shell-integration.html).
You can enable the integration with zstyle. It's important to add this line You can enable the integration with zstyle. It's important to add this line
before the line sourcing oh-my-zsh: before the line sourcing oh-my-zsh:
``` ```

View file

@ -8,7 +8,7 @@
if [[ "$OSTYPE" == darwin* ]] && [[ -n "$ITERM_SESSION_ID" ]] ; then if [[ "$OSTYPE" == darwin* ]] && [[ -n "$ITERM_SESSION_ID" ]] ; then
# maybe make it the default in the future and allow opting out? # maybe make it the default in the future and allow opting out?
if zstyle -t ':omz:plugins:iterm2' shell-integration; then if zstyle -t ':omz:plugins:iterm2' shell-integration; then
# Handle $0 according to the standard: # Handle $0 according to the standard:
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html # https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"

View file

@ -2,12 +2,12 @@
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 # as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version. # of the License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

View file

@ -16,23 +16,26 @@ This plugin supplies one command, `jira`, through which all its features are exp
## Commands ## Commands
`jira help` or `jira usage` will print the below usage instructions
| Command | Description | | Command | Description |
| :------------ | :-------------------------------------------------------- | | :------------ | :-------------------------------------------------------- |
| `jira` | Performs the default action | | `jira` | Performs the default action |
| `jira new` | Opens a new Jira issue dialogue | | `jira new` | Opens a new Jira issue dialogue |
| `jira ABC-123` | Opens an existing issue | | `jira ABC-123` | Opens an existing issue |
| `jira ABC-123 m` | Opens an existing issue for adding a comment | | `jira ABC-123 m` | Opens an existing issue for adding a comment |
| `jira dashboard [rapid_view]` | # opens your JIRA dashboard | | `jira dashboard [rapid_view]` | Opens your JIRA dashboard |
| `jira mine` | Queries for your own issues | | `jira mine` | Queries for your own issues |
| `jira tempo` | Opens your JIRA Tempo | | `jira tempo` | Opens your JIRA Tempo |
| `jira reported [username]` | Queries for issues reported by a user | | `jira reported [username]` | Queries for issues reported by a user |
| `jira assigned [username]` | Queries for issues assigned to a user | | `jira assigned [username]` | Queries for issues assigned to a user |
| `jira branch` | Opens an existing issue matching the current branch name | | `jira branch` | Opens an existing issue matching the current branch name |
| `jira help` | Prints usage instructions |
### Jira Branch usage notes ### Jira Branch usage notes
The branch name may have prefixes ending in "/": "feature/MP-1234", and also suffixes The branch name may have prefixes ending in "/": "feature/MP-1234", and also suffixes
starting with "_": "MP-1234_fix_dashboard". In both these cases, the issue opened will be "MP-1234" starting with "_": "MP-1234_fix_dashboard". In both these cases, the issue opened will be "MP-1234"
This is also checks if the prefix is in the name, and adds it if not, so: "MP-1234" opens the issue "MP-1234", This is also checks if the prefix is in the name, and adds it if not, so: "MP-1234" opens the issue "MP-1234",

View file

@ -11,6 +11,7 @@ _1st_arguments=(
'assigned:search for issues assigned to a user' 'assigned:search for issues assigned to a user'
'branch:open the issue named after the git branch of the current directory' 'branch:open the issue named after the git branch of the current directory'
'dumpconfig:display effective jira configuration' 'dumpconfig:display effective jira configuration'
'help:print usage help to stdout'
) )
_arguments -C \ _arguments -C \

View file

@ -2,6 +2,21 @@
# #
# See README.md for details # See README.md for details
function _jira_usage() {
cat <<EOF
jira Performs the default action
jira new Opens a new Jira issue dialogue
jira ABC-123 Opens an existing issue
jira ABC-123 m Opens an existing issue for adding a comment
jira dashboard [rapid_view] Opens your JIRA dashboard
jira mine Queries for your own issues
jira tempo Opens your JIRA Tempo
jira reported [username] Queries for issues reported by a user
jira assigned [username] Queries for issues assigned to a user
jira branch Opens an existing issue matching the current branch name
EOF
}
function jira() { function jira() {
emulate -L zsh emulate -L zsh
local action jira_url jira_prefix local action jira_url jira_prefix
@ -44,6 +59,8 @@ function jira() {
open_command "${jira_url}/secure/CreateIssue!default.jspa" open_command "${jira_url}/secure/CreateIssue!default.jspa"
elif [[ "$action" == "assigned" || "$action" == "reported" ]]; then elif [[ "$action" == "assigned" || "$action" == "reported" ]]; then
_jira_query ${@:-$action} _jira_query ${@:-$action}
elif [[ "$action" == "help" || "$action" == "usage" ]]; then
_jira_usage
elif [[ "$action" == "mine" ]]; then elif [[ "$action" == "mine" ]]; then
echo "Opening my issues" echo "Opening my issues"
open_command "${jira_url}/issues/?filter=-1" open_command "${jira_url}/issues/?filter=-1"

View file

@ -184,7 +184,7 @@ jmodel() {
fi fi
local model="$(yq e ".controllers.$(jcontroller).current-model" < ~/.local/share/juju/models.yaml | cut -d/ -f2)" local model="$(yq e ".controllers.$(jcontroller).current-model" < ~/.local/share/juju/models.yaml | cut -d/ -f2)"
if [[ -z "$model" ]]; then if [[ -z "$model" ]]; then
echo "--" echo "--"
return 1 return 1

View file

@ -4,5 +4,5 @@
if [ $commands[kn] ]; then if [ $commands[kn] ]; then
source <(kn completion zsh) source <(kn completion zsh)
compdef _kn kn compdef _kn kn
fi fi

View file

@ -10,6 +10,7 @@ plugins=(... laravel)
|:-:|:-:| |:-:|:-:|
| `artisan` | `php artisan` | | `artisan` | `php artisan` |
| `pas` | `php artisan serve` | | `pas` | `php artisan serve` |
| `pats` | `php artisan test` |
## Database ## Database
@ -35,6 +36,10 @@ plugins=(... laravel)
| `pamj` | `php artisan make:job` | | `pamj` | `php artisan make:job` |
| `paml` | `php artisan make:listener` | | `paml` | `php artisan make:listener` |
| `pamn` | `php artisan make:notification` | | `pamn` | `php artisan make:notification` |
| `pamcl` | `php artisan make:class` |
| `pamen` | `php artisan make:enum` |
| `pami` | `php artisan make:interface` |
| `pamtr` | `php artisan make:trait` |
## Clears ## Clears

View file

@ -4,6 +4,7 @@ alias bob='php artisan bob::build'
# Development # Development
alias pas='php artisan serve' alias pas='php artisan serve'
alias pats='php artisan test'
# Database # Database
alias pam='php artisan migrate' alias pam='php artisan migrate'
@ -24,6 +25,10 @@ alias pamj='php artisan make:job'
alias paml='php artisan make:listener' alias paml='php artisan make:listener'
alias pamn='php artisan make:notification' alias pamn='php artisan make:notification'
alias pampp='php artisan make:provider' alias pampp='php artisan make:provider'
alias pamcl='php artisan make:class'
alias pamen='php artisan make:enum'
alias pami='php artisan make:interface'
alias pamtr='php artisan make:trait'
# Clears # Clears

View file

@ -17,7 +17,7 @@ Original author: [Sorin Ionescu](https://github.com/sorin-ionescu)
| `tab` | Open the current directory in a new tab | | `tab` | Open the current directory in a new tab |
| `split_tab` | Split the current terminal tab horizontally | | `split_tab` | Split the current terminal tab horizontally |
| `vsplit_tab` | Split the current terminal tab vertically | | `vsplit_tab` | Split the current terminal tab vertically |
| `ofd` | Open the current directory in a Finder window | | `ofd` | Open passed directories (or $PWD by default) in Finder |
| `pfd` | Return the path of the frontmost Finder window | | `pfd` | Return the path of the frontmost Finder window |
| `pfs` | Return the current Finder selection | | `pfs` | Return the current Finder selection |
| `cdf` | `cd` to the current Finder directory | | `cdf` | `cd` to the current Finder directory |

View file

@ -3,8 +3,15 @@
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}" 0="${${(M)0:#/*}:-$PWD/$0}"
# Open the current directory in a Finder window # Open in Finder the directories passed as arguments, or the current directory if
alias ofd='open_command $PWD' # no directories are passed
function ofd {
if (( ! $# )); then
open_command $PWD
else
open_command $@
fi
}
# Show/hide hidden files in the Finder # Show/hide hidden files in the Finder
alias showfiles="defaults write com.apple.finder AppleShowAllFiles -bool true && killall Finder" alias showfiles="defaults write com.apple.finder AppleShowAllFiles -bool true && killall Finder"

View file

@ -1,6 +1,6 @@
#compdef port #compdef port
local subcmds local subcmds
# we cache the list of ports # we cache the list of ports
# we shall use some cache policy to avoid problems with new ports # we shall use some cache policy to avoid problems with new ports
@ -31,8 +31,8 @@ subcmds=(
'file' 'file'
'help' 'help'
'info' 'info'
'install' 'install'
'installed' 'installed'
'list' 'list'
'livecheck' 'livecheck'
'location' 'location'
@ -51,7 +51,7 @@ subcmds=(
'test' 'test'
'unarchive' 'unarchive'
'uninstall' 'uninstall'
'upgrade' 'upgrade'
'variants' 'variants'
'version' 'version'
) )

View file

@ -1,6 +1,6 @@
## marked2 ## marked2
Plugin for Marked 2, a previewer for Markdown files on Mac OS X Plugin for Marked 2, a previewer for Markdown files on Mac OS X
### Requirements ### Requirements

View file

@ -1,6 +1,6 @@
## marktext ## marktext
Plugin for MarkText, a previewer for Markdown files on Mac OS X Plugin for MarkText, a previewer for Markdown files on Mac OS X
### Requirements ### Requirements

View file

@ -11,6 +11,9 @@ fi
# Load mise hooks # Load mise hooks
eval "$($__mise activate zsh)" eval "$($__mise activate zsh)"
# Hook mise into current environment
eval "$($__mise hook-env -s zsh)"
# If the completion file doesn't exist yet, we need to autoload it and # If the completion file doesn't exist yet, we need to autoload it and
# bind it to `mise`. Otherwise, compinit will have already done that. # bind it to `mise`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_$__mise" ]]; then if [[ ! -f "$ZSH_CACHE_DIR/completions/_$__mise" ]]; then

View file

@ -1,6 +1,6 @@
# MongoDB Atlas plugin # MongoDB Atlas plugin
This plugin adds completion for [Atlas](https://www.mongodb.com/docs/atlas/cli/stable/) a command line interface built specifically for This plugin adds completion for [Atlas](https://www.mongodb.com/docs/atlas/cli/stable/) a command line interface built specifically for
MongoDB Atlas. MongoDB Atlas.
To use it, add `mongo-atlas` to the plugins array in your zshrc file: To use it, add `mongo-atlas` to the plugins array in your zshrc file:

View file

@ -1,6 +1,6 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# FILE: n98-magerun.plugin.zsh # FILE: n98-magerun.plugin.zsh
# DESCRIPTION: oh-my-zsh n98-magerun plugin file. Adapted from composer plugin # DESCRIPTION: oh-my-zsh n98-magerun plugin file. Adapted from composer plugin
# AUTHOR: Andrew Dwyer (andrewrdwyer at gmail dot com) # AUTHOR: Andrew Dwyer (andrewrdwyer at gmail dot com)
# AUTHOR: Jisse Reitsma (jisse at yireo dot com) # AUTHOR: Jisse Reitsma (jisse at yireo dot com)
# VERSION: 1.1.0 # VERSION: 1.1.0

View file

@ -27,6 +27,6 @@ alias nmap_detect_versions="sudo nmap -sV -p1-65535 -O --osscan-guess -T4 -Pn"
alias nmap_check_for_vulns="nmap --script=vuln" alias nmap_check_for_vulns="nmap --script=vuln"
alias nmap_full_udp="sudo nmap -sS -sU -T4 -A -v -PE -PS22,25,80 -PA21,23,80,443,3389 " alias nmap_full_udp="sudo nmap -sS -sU -T4 -A -v -PE -PS22,25,80 -PA21,23,80,443,3389 "
alias nmap_traceroute="sudo nmap -sP -PE -PS22,25,80 -PA21,23,80,3389 -PU -PO --traceroute " alias nmap_traceroute="sudo nmap -sP -PE -PS22,25,80 -PA21,23,80,3389 -PU -PO --traceroute "
alias nmap_full_with_scripts="sudo nmap -sS -sU -T4 -A -v -PE -PP -PS21,22,23,25,80,113,31339 -PA80,113,443,10042 -PO --script all " alias nmap_full_with_scripts="sudo nmap -sS -sU -T4 -A -v -PE -PP -PS21,22,23,25,80,113,31339 -PA80,113,443,10042 -PO --script all "
alias nmap_web_safe_osscan="sudo nmap -p 80,443 -O -v --osscan-guess --fuzzy " alias nmap_web_safe_osscan="sudo nmap -p 80,443 -O -v --osscan-guess --fuzzy "
alias nmap_ping_scan="nmap -n -sP" alias nmap_ping_scan="nmap -n -sP"

View file

@ -89,7 +89,7 @@ __plan() {
'-address=[(addr) The address of the Nomad server. Overrides the NOMAD_ADDR environment variable if set. Default = http://127.0.0.1:4646]' \ '-address=[(addr) The address of the Nomad server. Overrides the NOMAD_ADDR environment variable if set. Default = http://127.0.0.1:4646]' \
'-region=[(region) The region of the Nomad servers to forward commands to. Overrides the NOMAD_REGION environment variable if set. Defaults to the Agent s local region.]' \ '-region=[(region) The region of the Nomad servers to forward commands to. Overrides the NOMAD_REGION environment variable if set. Defaults to the Agent s local region.]' \
'-no-color[Disables colored command output.]' \ '-no-color[Disables colored command output.]' \
'-diff[Determines whether the diff between the remote job and planned job is shown. Defaults to true.]' '-diff[Determines whether the diff between the remote job and planned job is shown. Defaults to true.]'
} }
__run() { __run() {

View file

@ -58,7 +58,7 @@ alias npmt="npm test"
# Run npm scripts # Run npm scripts
alias npmR="npm run" alias npmR="npm run"
# Run npm publish # Run npm publish
alias npmP="npm publish" alias npmP="npm publish"
# Run npm init # Run npm init

View file

@ -26,9 +26,9 @@ These settings should go in your zshrc file, before Oh My Zsh is sourced:
#### Lazy startup #### Lazy startup
This option will help you to defer nvm's load until you use it to speed-up your zsh startup. This will source This option will help you to defer nvm's load until you use it to speed-up your zsh startup. This will source
nvm script only when using it, and will create a function for `node`, `npm`, `npx`, `pnpm`, `yarn`, and the nvm script only when using it, and will create a function for `node`, `npm`, `npx`, `pnpm`, `yarn`, `corepack`
command(s) specified by `lazy-cmd` option, so when you call either of them, nvm will be loaded and run with and the command(s) specified by `lazy-cmd` option, so when you call either of them, nvm will be loaded and run
default version. To enable it, you can add this snippet to your zshrc, before Oh My Zsh is sourced: with default version. To enable it, you can add this snippet to your zshrc, before Oh My Zsh is sourced:
```zsh ```zsh
zstyle ':omz:plugins:nvm' lazy yes zstyle ':omz:plugins:nvm' lazy yes

View file

@ -16,7 +16,7 @@ if [[ -z "$NVM_DIR" ]]; then
fi fi
fi fi
if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then
return return
fi fi
@ -50,11 +50,11 @@ function _omz_setup_autoload {
zstyle -t ':omz:plugins:nvm' silent-autoload && nvm_silent="--silent" zstyle -t ':omz:plugins:nvm' silent-autoload && nvm_silent="--silent"
if [[ -n "$nvmrc_path" ]]; then if [[ -n "$nvmrc_path" ]]; then
local nvmrc_node_version=$(nvm version $(cat "$nvmrc_path" | tr -dc '[:print:]')) local nvmrc_node_version=$(nvm version $(command cat "$nvmrc_path" | tr -dc '[:print:]'))
if [[ "$nvmrc_node_version" = "N/A" ]]; then if [[ "$nvmrc_node_version" = "N/A" ]]; then
nvm install nvm install
elif [[ "$nvmrc_node_version" != "$node_version" ]]; then elif [[ "$nvmrc_node_version" != "$(nvm version)" ]]; then
nvm use $nvm_silent nvm use $nvm_silent
fi fi
elif [[ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ]] && [[ "$(nvm version)" != "$(nvm version default)" ]]; then elif [[ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ]] && [[ "$(nvm version)" != "$(nvm version default)" ]]; then
@ -72,9 +72,9 @@ function _omz_setup_autoload {
} }
if zstyle -t ':omz:plugins:nvm' lazy; then if zstyle -t ':omz:plugins:nvm' lazy; then
# Call nvm when first using nvm, node, npm, pnpm, yarn or other commands in lazy-cmd # Call nvm when first using nvm, node, npm, pnpm, yarn, corepack or other commands in lazy-cmd
zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd
nvm_lazy_cmd=(nvm node npm npx pnpm yarn $nvm_lazy_cmd) # default values nvm_lazy_cmd=(nvm node npm npx pnpm yarn corepack $nvm_lazy_cmd) # default values
eval " eval "
function $nvm_lazy_cmd { function $nvm_lazy_cmd {
for func in $nvm_lazy_cmd; do for func in $nvm_lazy_cmd; do

View file

@ -16,7 +16,7 @@ Provided aliases:
email address). Then the OTP key needs to be pasted, followed by a CTRL+D character email address). Then the OTP key needs to be pasted, followed by a CTRL+D character
inserted on an empty line. inserted on an empty line.
- `ot`: generates a MFA code based on the given key and copies it to the clipboard - `ot`: generates a MFA code based on the given key and copies it to the clipboard
(on Linux it relies on xsel, on MacOS X it uses pbcopy instead). (on Linux it relies on xsel, on MacOS X it uses pbcopy instead).
The plugin uses `$HOME/.otp` to store its internal files. The plugin uses `$HOME/.otp` to store its internal files.

View file

@ -79,7 +79,7 @@ _id_names() {
local app_list local app_list
app_list=`pm2 list -m` app_list=`pm2 list -m`
local -a names ids local -a names ids
names=(`echo $app_list | grep '+---' | awk '{print $2}'`) names=(`echo $app_list | grep '+---' | awk '{print $2}'`)
ids=(`echo $app_list | grep 'pm2 id' | awk '{print $4}'`) ids=(`echo $app_list | grep 'pm2 id' | awk '{print $4}'`)

View file

@ -1,6 +1,6 @@
# Poetry Environment Plugin # Poetry Environment Plugin
This plugin automatically changes poetry environment when you cd into or out of the project directory. This plugin automatically changes poetry environment when you cd into or out of the project directory.
Note: Script looks for pyproject.toml file to determine poetry if its a poetry environment Note: Script looks for pyproject.toml file to determine poetry if its a poetry environment
To use it, add `poetry-env` to the plugins array in your zshrc file: To use it, add `poetry-env` to the plugins array in your zshrc file:

View file

@ -1,27 +1,27 @@
# Automatic poetry environment activation/deactivation
_togglePoetryShell() { _togglePoetryShell() {
# deactivate environment if pyproject.toml doesn't exist and not in a subdir # Determine if currently in a Poetry-managed directory
if [[ ! -f "$PWD/pyproject.toml" ]] ; then local in_poetry_dir=0
if [[ "$poetry_active" == 1 ]]; then if [[ -f "$PWD/pyproject.toml" ]] && grep -q 'tool.poetry' "$PWD/pyproject.toml"; then
if [[ "$PWD" != "$poetry_dir"* ]]; then in_poetry_dir=1
export poetry_active=0
deactivate
return
fi
fi
fi fi
# activate the environment if pyproject.toml exists # Deactivate the current environment if moving out of a Poetry directory or into a different Poetry directory
if [[ "$poetry_active" != 1 ]]; then if [[ $poetry_active -eq 1 ]] && { [[ $in_poetry_dir -eq 0 ]] && [[ "$PWD" != "$poetry_dir"* ]]; }; then
if [[ -f "$PWD/pyproject.toml" ]]; then export poetry_active=0
if grep -q 'tool.poetry' "$PWD/pyproject.toml"; then unset poetry_dir
export poetry_active=1 deactivate
export poetry_dir="$PWD" fi
source "$(poetry env info --path)/bin/activate"
fi # Activate the environment if in a Poetry directory and no environment is currently active
if [[ $in_poetry_dir -eq 1 ]] && [[ $poetry_active -ne 1 ]]; then
venv_dir=$(poetry env info --path 2>/dev/null)
if [[ -n "$venv_dir" ]]; then
export poetry_active=1
export poetry_dir="$PWD"
source "${venv_dir}/bin/activate"
fi fi
fi fi
} }
autoload -U add-zsh-hook autoload -U add-zsh-hook
add-zsh-hook chpwd _togglePoetryShell add-zsh-hook chpwd _togglePoetryShell
_togglePoetryShell _togglePoetryShell # Initial call to check the current directory at shell startup

9
plugins/procs/README.md Normal file
View file

@ -0,0 +1,9 @@
# procs
This plugin provides completion for [procs](https://github.com/dalance/procs).
To use it, add `procs` to the plugins array in your zshrc file.
```
plugins=(... procs)
```

View file

@ -0,0 +1,13 @@
if (( ! $+commands[procs] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `minikube`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_procs" ]]; then
typeset -g -A _comps
autoload -Uz _procs
_comps[procs]=_procs
fi
procs --gen-completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs" &|

View file

@ -32,8 +32,9 @@ virtual environments:
`venv`) in the current directory. `venv`) in the current directory.
- `auto_vrun`: Automatically activate the venv virtual environment when entering a directory containing - `auto_vrun`: Automatically activate the venv virtual environment when entering a directory containing
`<venv-name>/bin/activate`, and automatically deactivate it when navigating out of it (including `<venv-name>/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated
subdirectories!). in subdirectories).
- To enable the feature, set `export PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. - To enable the feature, set `export PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh.
- The default virtual environment name is `venv`. To use a different name, set - Plugin activates first virtual environment in lexicographic order whose name begins with `<venv-name>`.
The default virtual environment name is `venv`. To use a different name, set
`export PYTHON_VENV_NAME=<venv-name>`. For example: `export PYTHON_VENV_NAME=".venv"` `export PYTHON_VENV_NAME=<venv-name>`. For example: `export PYTHON_VENV_NAME=".venv"`

View file

@ -86,11 +86,20 @@ function mkv() {
if [[ "$PYTHON_AUTO_VRUN" == "true" ]]; then if [[ "$PYTHON_AUTO_VRUN" == "true" ]]; then
# Automatically activate venv when changing dir # Automatically activate venv when changing dir
auto_vrun() { function auto_vrun() {
if [[ -f "${PYTHON_VENV_NAME}/bin/activate" ]]; then # deactivate if we're on a different dir than VIRTUAL_ENV states
source "${PYTHON_VENV_NAME}/bin/activate" > /dev/null 2>&1 # we don't deactivate subdirectories!
else if (( $+functions[deactivate] )) && [[ $PWD != ${VIRTUAL_ENV:h}* ]]; then
(( $+functions[deactivate] )) && deactivate > /dev/null 2>&1 deactivate > /dev/null 2>&1
fi
if [[ $PWD != ${VIRTUAL_ENV:h} ]]; then
for _file in "${PYTHON_VENV_NAME}"*/bin/activate(N.); do
# make sure we're not in a venv already
(( $+functions[deactivate] )) && deactivate > /dev/null 2>&1
source $_file > /dev/null 2>&1
break
done
fi fi
} }
add-zsh-hook chpwd auto_vrun add-zsh-hook chpwd auto_vrun

View file

@ -18,7 +18,7 @@ _1st_arguments=(
'config:Get and set options' 'config:Get and set options'
'version:Show the roswell version information' 'version:Show the roswell version information'
"help:Use \"ros help [command]\" for more information about a command."$'\n\t\t'"Use \"ros help [topic]\" for more information about the topic." "help:Use \"ros help [command]\" for more information about a command."$'\n\t\t'"Use \"ros help [topic]\" for more information about the topic."
) )
#local expl #local expl

View file

@ -4,7 +4,7 @@
# AUTHOR: Mirko Caserta (mirko.caserta@gmail.com) # AUTHOR: Mirko Caserta (mirko.caserta@gmail.com)
# VERSION: 1.0.2 # VERSION: 1.0.2
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# aliases - mnemonic: prefix is 'sb' # aliases - mnemonic: prefix is 'sb'
alias sbc='sbt compile' alias sbc='sbt compile'
alias sbcc='sbt clean compile' alias sbcc='sbt clean compile'

View file

@ -8,7 +8,7 @@ if [[ "$TERM" == screen* ]]; then
_GET_HOST='echo $HOST | sed "s/\..*//"' _GET_HOST='echo $HOST | sed "s/\..*//"'
fi fi
# use the current user as the prefix of the current tab title # use the current user as the prefix of the current tab title
TAB_TITLE_PREFIX='"`'$_GET_HOST'`:`'$_GET_PATH' | sed "s:..*/::"`$PROMPT_CHAR"' TAB_TITLE_PREFIX='"`'$_GET_HOST'`:`'$_GET_PATH' | sed "s:..*/::"`$PROMPT_CHAR"'
# when at the shell prompt, show a truncated version of the current path (with # when at the shell prompt, show a truncated version of the current path (with
# standard ~ replacement) as the rest of the title. # standard ~ replacement) as the rest of the title.

View file

@ -22,7 +22,8 @@ if parsed.scheme not in proxy_protocols:
def make_argv(): def make_argv():
yield "nc" yield "nc"
if sys.platform == 'linux': if sys.platform in {'linux', 'cygwin'}:
# caveats: the built-in netcat of most linux distributions and cygwin support proxy type
# caveats: macOS built-in netcat command not supported proxy-type # caveats: macOS built-in netcat command not supported proxy-type
yield "-X" # --proxy-type yield "-X" # --proxy-type
# Supported protocols are 4 (SOCKS v4), 5 (SOCKS v5) and connect (HTTP proxy). # Supported protocols are 4 (SOCKS v4), 5 (SOCKS v5) and connect (HTTP proxy).

View file

@ -1,5 +1,5 @@
########################### ###########################
# Settings # Settings
# These can be overwritten any time. # These can be overwritten any time.
# If they are not set yet, they will be # If they are not set yet, they will be

View file

@ -62,7 +62,7 @@ function _add_identities() {
# if id is an absolute path, make file equal to id # if id is an absolute path, make file equal to id
[[ "$id" = /* ]] && file="$id" || file="$HOME/.ssh/$id" [[ "$id" = /* ]] && file="$id" || file="$HOME/.ssh/$id"
# check for filename match, otherwise try for signature match # check for filename match, otherwise try for signature match
if [[ ${loaded_ids[(I)$file]} -le 0 ]]; then if [[ -f $file && ${loaded_ids[(I)$file]} -le 0 ]]; then
sig="$(ssh-keygen -lf "$file" | awk '{print $2}')" sig="$(ssh-keygen -lf "$file" | awk '{print $2}')"
[[ ${loaded_sigs[(I)$sig]} -le 0 ]] && not_loaded+=("$file") [[ ${loaded_sigs[(I)$sig]} -le 0 ]] && not_loaded+=("$file")
fi fi
@ -98,8 +98,10 @@ function _add_identities() {
# Add a nifty symlink for screen/tmux if agent forwarding is enabled # Add a nifty symlink for screen/tmux if agent forwarding is enabled
if zstyle -t :omz:plugins:ssh-agent agent-forwarding \ if zstyle -t :omz:plugins:ssh-agent agent-forwarding \
&& [[ -n "$SSH_AUTH_SOCK" && ! -L "$SSH_AUTH_SOCK" ]]; then && [[ -n "$SSH_AUTH_SOCK" ]]; then
ln -sf "$SSH_AUTH_SOCK" /tmp/ssh-agent-$USERNAME-screen if [[ ! -L "$SSH_AUTH_SOCK" ]]; then
ln -sf "$SSH_AUTH_SOCK" /tmp/ssh-agent-$USERNAME-screen
fi
else else
_start_agent _start_agent
fi fi

View file

@ -1,7 +1,7 @@
# ignore oh-my-zsh theme
unset ZSH_THEME
if (( $+commands[starship] )); then if (( $+commands[starship] )); then
# ignore oh-my-zsh theme
unset ZSH_THEME
eval "$(starship init zsh)" eval "$(starship init zsh)"
else else
echo '[oh-my-zsh] starship not found, please install it from https://starship.rs' echo '[oh-my-zsh] starship not found, please install it from https://starship.rs'

View file

@ -1,7 +1,7 @@
# Systemadmin plugin # Systemadmin plugin
This plugin adds a series of aliases and functions which make a System Administrator's life easier. This plugin adds a series of aliases and functions which make a System Administrator's life easier.
To use it, add `systemadmin` to the plugins array in your zshrc file: To use it, add `systemadmin` to the plugins array in your zshrc file:
```zsh ```zsh

View file

@ -15,19 +15,20 @@ plugins=(... terraform)
## Aliases ## Aliases
| Alias | Command | | Alias | Command |
| ----- | -------------------- | | ------ | -------------------- |
| `tf` | `terraform` | | `tf` | `terraform` |
| `tfa` | `terraform apply` | | `tfa` | `terraform apply` |
| `tfc` | `terraform console` | | `tfc` | `terraform console` |
| `tfd` | `terraform destroy` | | `tfd` | `terraform destroy` |
| `tff` | `terraform fmt` | | `tff` | `terraform fmt` |
| `tfi` | `terraform init` | | `tfi` | `terraform init` |
| `tfo` | `terraform output` | | `tfo` | `terraform output` |
| `tfp` | `terraform plan` | | `tfp` | `terraform plan` |
| `tfv` | `terraform validate` | | `tfv` | `terraform validate` |
| `tfs` | `terraform state` | | `tfs` | `terraform state` |
| `tfsh`| `terraform show` | | `tft` | `terraform test` |
| `tfsh` | `terraform show` |
## Prompt function ## Prompt function

View file

@ -25,4 +25,5 @@ alias tfo='terraform output'
alias tfp='terraform plan' alias tfp='terraform plan'
alias tfv='terraform validate' alias tfv='terraform validate'
alias tfs='terraform state' alias tfs='terraform state'
alias tft='terraform test'
alias tfsh='terraform show' alias tfsh='terraform show'

View file

@ -1,6 +1,6 @@
# Thor plugin # Thor plugin
This plugin adds completion for [Thor](http://whatisthor.com/), This plugin adds completion for [Thor](http://whatisthor.com/),
a ruby toolkit for building powerful command-line interfaces. a ruby toolkit for building powerful command-line interfaces.
To use it, add `thor` to the plugins array in your zshrc file: To use it, add `thor` to the plugins array in your zshrc file:

15
plugins/tldr/README.md Normal file
View file

@ -0,0 +1,15 @@
# tldr plugin
This plugin adds a shortcut to insert tldr before the previous command.
Heavily inspired from [Man plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/man).
To use it, add `tldr` to the plugins array in your zshrc file:
```zsh
plugins=(... tldr)
```
# Keyboard Shortcuts
| Shortcut | Description |
|------------------------------------|----------------------------------------------------------------------------|
| <kbd>Esc</kbd> + tldr | add tldr before the previous command to see the tldr page for this command |

View file

@ -0,0 +1,19 @@
tldr-command-line() {
# if there is no command typed, use the last command
[[ -z "$BUFFER" ]] && zle up-history
# if typed command begins with tldr, do nothing
[[ "$BUFFER" = tldr\ * ]] && return
# get command and possible subcommand
# http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags
local -a args
args=(${${(Az)BUFFER}[1]} ${${(Az)BUFFER}[2]})
BUFFER="tldr ${args[1]}"
}
zle -N tldr-command-line
# Defined shortcut keys: [Esc]tldr
bindkey "\e"tldr tldr-command-line

View file

@ -37,6 +37,7 @@ The plugin also supports the following:
| `ZSH_TMUX_AUTOQUIT` | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) | | `ZSH_TMUX_AUTOQUIT` | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) |
| `ZSH_TMUX_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) | | `ZSH_TMUX_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) |
| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled | | `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled |
| `ZSH_TMUX_AUTONAME_SESSION` | Automatically name new sessions based on the basename of `$PWD` (default: `false`) |
| `ZSH_TMUX_DETACHED` | Set the detached mode (default: `false`) | | `ZSH_TMUX_DETACHED` | Set the detached mode (default: `false`) |
| `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support | | `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support |
| `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `tmux` if available, `screen` otherwise) | | `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `tmux` if available, `screen` otherwise) |

View file

@ -13,6 +13,8 @@ fi
: ${ZSH_TMUX_AUTOCONNECT:=true} : ${ZSH_TMUX_AUTOCONNECT:=true}
# Automatically close the terminal when tmux exits # Automatically close the terminal when tmux exits
: ${ZSH_TMUX_AUTOQUIT:=$ZSH_TMUX_AUTOSTART} : ${ZSH_TMUX_AUTOQUIT:=$ZSH_TMUX_AUTOSTART}
# Automatically name the new session based on the basename of PWD
: ${ZSH_TMUX_AUTONAME_SESSION:=false}
# Set term to screen or screen-256color based on current terminal support # Set term to screen or screen-256color based on current terminal support
: ${ZSH_TMUX_DETACHED:=false} : ${ZSH_TMUX_DETACHED:=false}
# Set detached mode # Set detached mode
@ -102,9 +104,22 @@ function _zsh_tmux_plugin_run() {
local _detached="" local _detached=""
[[ "$ZSH_TMUX_DETACHED" == "true" ]] && _detached="-d" [[ "$ZSH_TMUX_DETACHED" == "true" ]] && _detached="-d"
local session_name
if [[ "$ZSH_TMUX_AUTONAME_SESSION" == "true" ]]; then
# Name the session after the basename of the current directory
session_name=${PWD##*/}
# If the current directory is the home directory, name it 'HOME'
[[ "$PWD" == "$HOME" ]] && session_name="HOME"
# If the current directory is the root directory, name it 'ROOT'
[[ "$PWD" == "/" ]] && session_name="ROOT"
else
session_name="$ZSH_TMUX_DEFAULT_SESSION_NAME"
fi
# Try to connect to an existing session. # Try to connect to an existing session.
if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then if [[ -n "$session_name" ]]; then
[[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached -t $ZSH_TMUX_DEFAULT_SESSION_NAME [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached -t "$session_name"
else else
[[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached
fi fi
@ -116,8 +131,9 @@ function _zsh_tmux_plugin_run() {
elif [[ -e "$ZSH_TMUX_CONFIG" ]]; then elif [[ -e "$ZSH_TMUX_CONFIG" ]]; then
tmux_cmd+=(-f "$ZSH_TMUX_CONFIG") tmux_cmd+=(-f "$ZSH_TMUX_CONFIG")
fi fi
if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then
$tmux_cmd new-session -s $ZSH_TMUX_DEFAULT_SESSION_NAME if [[ -n "$session_name" ]]; then
$tmux_cmd new-session -s "$session_name"
else else
$tmux_cmd new-session $tmux_cmd new-session
fi fi

View file

@ -10,7 +10,7 @@ plugins=(... ufw)
Some of the commands include: Some of the commands include:
* `allow <port>/<optional: protocol>` add an allow rule * `allow <port>/<optional: protocol>` add an allow rule
* `default` set default policy * `default` set default policy
* `delete <port>/<optional: protocol>` delete RULE * `delete <port>/<optional: protocol>` delete RULE
* `deny <port>/<optional: protocol>` add deny rule * `deny <port>/<optional: protocol>` add deny rule

View file

@ -1,6 +1,6 @@
This plugin prompts the status of the Vagrant VMs. It supports single-host and This plugin prompts the status of the Vagrant VMs. It supports single-host and
multi-host configurations as well. multi-host configurations as well.
Look inside the source for documentation about custom variables. Look inside the source for documentation about custom variables.
Alberto Re <alberto.re@gmail.com> Alberto Re <alberto.re@gmail.com>

View file

@ -55,7 +55,7 @@ INSERT_MODE_INDICATOR="%F{yellow}+%f"
### Adding mode indicators to your prompt ### Adding mode indicators to your prompt
`Vi-mode` by default will add mode indicators to `RPROMPT` **unless** that is defined by `Vi-mode` by default will add mode indicators to `RPROMPT` **unless** that is defined by
a preceding plugin. a preceding plugin.
If `PROMPT` or `RPROMPT` is not defined to your liking, you can add mode info manually. The `vi_mode_prompt_info` function is available to insert mode indicator information. If `PROMPT` or `RPROMPT` is not defined to your liking, you can add mode info manually. The `vi_mode_prompt_info` function is available to insert mode indicator information.

View file

@ -3,7 +3,7 @@
The plugin presents a function called `callvim` whose usage is: The plugin presents a function called `callvim` whose usage is:
usage: callvim [-b cmd] [-a cmd] [file ... fileN] usage: callvim [-b cmd] [-a cmd] [file ... fileN]
-b cmd Run this command in GVIM before editing the first file -b cmd Run this command in GVIM before editing the first file
-a cmd Run this command in GVIM after editing the first file -a cmd Run this command in GVIM after editing the first file
file The file to edit file The file to edit

View file

@ -2,7 +2,7 @@
# See README.md # See README.md
# #
# Derek Wyatt (derek@{myfirstnamemylastname}.org # Derek Wyatt (derek@{myfirstnamemylastname}.org
# #
function callvim { function callvim {
if [[ $# == 0 ]]; then if [[ $# == 0 ]]; then

View file

@ -52,7 +52,7 @@ if [[ ! $DISABLE_VENV_CD -eq 1 ]]; then
else else
ENV_NAME="" ENV_NAME=""
fi fi
if [[ -n $CD_VIRTUAL_ENV && "$ENV_NAME" != "$CD_VIRTUAL_ENV" ]]; then if [[ -n $CD_VIRTUAL_ENV && "$ENV_NAME" != "$CD_VIRTUAL_ENV" ]]; then
# We've just left the repo, deactivate the environment # We've just left the repo, deactivate the environment
# Note: this only happens if the virtualenv was activated automatically # Note: this only happens if the virtualenv was activated automatically

View file

@ -57,6 +57,24 @@ wd() {
} }
``` ```
### [Home Manager](https://github.com/nix-community/home-manager)
Add the following to your `home.nix` then run `home-manager switch`:
```nix
programs.zsh.plugins = [
{
name = "wd";
src = pkgs.fetchFromGitHub {
owner = "mfaerevaag";
repo = "wd";
rev = "v0.5.2";
sha256 = "sha256-4yJ1qhqhNULbQmt6Z9G22gURfDLe30uV1ascbzqgdhg=";
};
}
];
```
### [zplug](https://github.com/zplug/zplug) ### [zplug](https://github.com/zplug/zplug)
```zsh ```zsh
@ -119,6 +137,14 @@ Also, you may have to force a rebuild of `zcompdump` by running:
rm -f ~/.zcompdump; compinit rm -f ~/.zcompdump; compinit
``` ```
## Browse
If you want to make use of the `fzf`-powered browse feature to fuzzy search through all your warp points, set up a keybind in your `.zshrc`:
```zsh
bindkey ${FZF_WD_BINDKEY:-'^B'} fuzzy_wd_widget
```
## Usage ## Usage
* Add warp point to current working directory: * Add warp point to current working directory:
@ -132,6 +158,19 @@ If a warp point with the same name exists, use `wd add foo --force` to overwrite
**Note:** a warp point cannot contain colons, or consist of only spaces and dots. **Note:** a warp point cannot contain colons, or consist of only spaces and dots.
The first will conflict in how `wd` stores the warp points, and the second will conflict with other features, as below. The first will conflict in how `wd` stores the warp points, and the second will conflict with other features, as below.
* Add warp point to any directory with default name:
```zsh
wd addcd /foo/ bar
```
* Add warp point to any directory with a custom name:
```zsh
wd addcd /foo/
```
You can omit point name to automatically use the current directory's name instead. You can omit point name to automatically use the current directory's name instead.
* From any directory, warp to `foo` with: * From any directory, warp to `foo` with:

View file

@ -31,6 +31,7 @@ function _wd() {
commands=( commands=(
'add:Adds the current working directory to your warp points' 'add:Adds the current working directory to your warp points'
'addcd:Adds a directory to your warp points'
'add!:Overwrites existing warp point' 'add!:Overwrites existing warp point'
'export:Export warp points as static named directories' 'export:Export warp points as static named directories'
'rm:Removes the given warp point' 'rm:Removes the given warp point'
@ -63,6 +64,9 @@ function _wd() {
add) add)
_message 'Write the name of your warp point' && ret=0 _message 'Write the name of your warp point' && ret=0
;; ;;
addcd)
_message 'Write the name of your path' && ret=0
;;
show) show)
_describe -t points "Warp points" warp_points && ret=0 _describe -t points "Warp points" warp_points && ret=0
;; ;;
@ -77,7 +81,7 @@ function _wd() {
# complete sub directories from the warp point # complete sub directories from the warp point
_path_files -W "(${points[$target]})" -/ && ret=0 _path_files -W "(${points[$target]})" -/ && ret=0
fi fi
# don't complete anything if warp point is not valid # don't complete anything if warp point is not valid
;; ;;
esac esac

Some files were not shown because too many files have changed in this diff Show more