Compare commits
64 commits
Author | SHA1 | Date | |
---|---|---|---|
|
869a8f5f17 | ||
|
3fe3ba2b48 | ||
|
ded640ed80 | ||
|
880ed131a1 | ||
|
7f3491b1bb | ||
|
6166fce1a1 | ||
|
3b7908dca1 | ||
|
0785d87ea4 | ||
|
eb37844857 | ||
|
3e812ed311 | ||
|
897afc9cf9 | ||
|
76164d6217 | ||
|
9a47fde0c8 | ||
|
06f8bc71a3 | ||
|
9dc4056c4e | ||
|
96f60da366 | ||
|
cdd9258d5c | ||
|
4fcc85b2db | ||
|
4200e6cdb3 | ||
|
c86223f473 | ||
|
39d2087ad4 | ||
|
2e9256a567 | ||
|
8bec2f7549 | ||
|
5f649d3031 | ||
|
26151d2f54 | ||
|
d33d632ec1 | ||
|
e0d067977c | ||
|
49386cad6d | ||
|
0566b9b8a3 | ||
|
f9648e07a9 | ||
|
db96076cf0 | ||
|
f93e43e8a5 | ||
|
67de6ec25b | ||
|
ee93f7944f | ||
|
312b08c20a | ||
|
903e0e5249 | ||
|
b7b33f3786 | ||
|
a34b8dab64 | ||
|
222c971542 | ||
|
6a24459de9 | ||
|
fff151be09 | ||
|
f71bff5418 | ||
|
d10d7c627c | ||
|
e47eaae2e4 | ||
|
05164357b8 | ||
|
7778e9749a | ||
|
a434fda508 | ||
|
281cde57f7 | ||
|
e54958b91c | ||
|
3959a7f4e0 | ||
|
8a9d63c522 | ||
|
3351dc6dac | ||
|
238da94b54 | ||
|
05b8e0cdf2 | ||
|
887bfd6a03 | ||
|
b5703f9e17 | ||
|
a620953556 | ||
|
5bcfb8cc9f | ||
|
d6b4aa6ff4 | ||
|
741bb78a04 | ||
|
e0fe8ef9c9 | ||
|
98fd5fa4da | ||
|
8b8938f414 | ||
|
97133502fd |
40 changed files with 1960 additions and 1229 deletions
161
CHANGELOG.md
161
CHANGELOG.md
|
@ -7,16 +7,148 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
_No unreleased changes._
|
### Changed
|
||||||
|
|
||||||
|
- Ask before uninstalling each unused module, instead of asking just once for
|
||||||
|
all.
|
||||||
|
|
||||||
|
## [1.14.0] - 2024-06-25
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Don't expand `${HOME}` in the init.zsh script. (See
|
||||||
|
[#509](https://github.com/zimfw/zimfw/issues/509))
|
||||||
|
- Don't allow calling `zmodule` from the command line. Let it fail with "command
|
||||||
|
not found" instead, as it's intended to be used only in the .zimrc script.
|
||||||
|
- `ZIM_HOME` must be defined before sourcing zimfw.zsh. All documentation was
|
||||||
|
already doing so, hence not considering this as a breaking change.
|
||||||
|
- Allow zimfw.zsh to exist anywhere else, not only inside `ZIM_HOME`. This
|
||||||
|
enables installing the zimfw.zsh script independently with a package manager.
|
||||||
|
- Don't try to upgrade if sourced zimfw.zsh is not in a writable path.
|
||||||
|
- Don't try actions that write to `ZIM_HOME` if user has no write permissions
|
||||||
|
there.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Update error messages to hopefully make it clearer when either the git or the
|
||||||
|
degit tool is being used.
|
||||||
|
- Set read permissions to generated init.zsh script, so it can be read from
|
||||||
|
other users.
|
||||||
|
|
||||||
|
## [1.13.1] - 2024-04-28
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The `--strip` option in tar command is not BSD compatible.
|
||||||
|
|
||||||
|
## [1.13.0] - 2024-02-17
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `--if-command` option to `zmodule`. This option is equivalent to
|
||||||
|
`--if "(( \${+commands[${1}]} ))"`.
|
||||||
|
- `mkdir` tool option in `zmodule` that creates an empty directory. This allows
|
||||||
|
creating modules that contain only externally generated files.
|
||||||
|
|
||||||
|
## [1.12.1] - 2023-09-16
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Expansion of prompt sequences in print statements causing text between
|
||||||
|
backticks to be executed by the shell.
|
||||||
|
|
||||||
|
## [1.12.0] - 2023-07-17
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `check-version` action, that immediately checks if a new version of `zimfw` is
|
||||||
|
available and returns code 4 if there is one.
|
||||||
|
- `check` action, that checks if there are updates available for current modules.
|
||||||
|
- Output of `LANG` and `LC_*` parameters in `info` action.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Don't resolve symlinks when building init.zsh.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Show warning when there's no write permission to compile Zsh scripts.
|
||||||
|
|
||||||
|
## [1.11.3] - 2023-02-26
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- `check-dumpfile` action. The [completion] module alone now handles
|
||||||
|
checking the dumpfile. (See
|
||||||
|
[zimfw/completion#12](https://github.com/zimfw/completion/pull/12))
|
||||||
|
|
||||||
|
## [1.11.2] - 2023-02-16
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Quote path names in init.zsh to properly handle path names with spaces.
|
||||||
|
|
||||||
|
## [1.11.1] - 2023-02-04
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Use `_zim_dumpfile_fpath` defined by the completion module
|
||||||
|
[here](https://github.com/zimfw/completion/blob/33737e8c15fa8dba9af47bef8408b1af2599c21b/init.zsh#L11),
|
||||||
|
right before `compinit` is run, to more accurately do `zimfw check-dumpfile`.
|
||||||
|
|
||||||
|
## [1.11.0] - 2022-12-18
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `--if` option to `zmodule` that will only initialize the module root if the
|
||||||
|
specified test returns a zero exit status. The test is evaluated at every new
|
||||||
|
terminal startup.
|
||||||
|
- Ability to customize the .zimrc file name and path with the `ZIM_CONFIG_FILE`
|
||||||
|
environment variable.
|
||||||
|
|
||||||
|
## [1.10.0] - 2022-09-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `--root` option to `zmodule`. Combined with the ability to call `zmodule`
|
||||||
|
multiple times for the same module, this allows initializing from multiple
|
||||||
|
roots in repositories like prezto or ohmyzsh. Also, `--on-pull` and `--disable`
|
||||||
|
now work on a per-module-root basis.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Show `OSTYPE`, `TERM`, `TERM_PROGRAM` and `TERM_PROGRAM_VERSION` environment
|
||||||
|
variables instead of calling the `uname -a` command to show system info in the
|
||||||
|
`zimfw info` action.
|
||||||
|
|
||||||
|
## [1.9.1] - 2022-05-24
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Override repository options along multiple `zmodule` calls with the same
|
||||||
|
module name.
|
||||||
|
- Show already installed modules skipped with install action and `-v`.
|
||||||
|
- Consider external module directory paths when calling compile action directly.
|
||||||
|
- Ignore return value from `zargs` with `-P`.
|
||||||
|
(See https://www.zsh.org/mla/workers/2022/msg00611.html)
|
||||||
|
|
||||||
|
## [1.9.0] - 2022-05-09
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `--on-pull` option to `zmodule`, which allows setting a command that is always
|
||||||
|
triggered after the module is installed or updated.
|
||||||
|
|
||||||
## [1.8.0] - 2022-01-25
|
## [1.8.0] - 2022-01-25
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- `check-dumpfile` action. It runs in the build, install and update actions, and checks if a
|
- `check-dumpfile` action. It runs in the build, install and update actions, and
|
||||||
new completion configuration needs to be dumped. It's intended to be used with `compinit -C`,
|
checks if a new completion configuration needs to be dumped. It's intended to
|
||||||
so no checks are done during the shell startup.
|
be used with `compinit -C`, so no checks are done during the shell startup.
|
||||||
- `--no-submodules` option to `zmodule`, which disables installing or updating git submodules.
|
(See [zimfw/completion#8](https://github.com/zimfw/completion/pull/8))
|
||||||
|
- `--no-submodules` option to `zmodule`, which disables installing or updating
|
||||||
|
git submodules.
|
||||||
|
|
||||||
## [1.7.0] - 2022-01-12
|
## [1.7.0] - 2022-01-12
|
||||||
|
|
||||||
|
@ -30,7 +162,7 @@ _No unreleased changes._
|
||||||
[here](https://github.com/zimfw/completion/blob/9386a76eac3f55b1c04d57d26238f725b4b3ba25/init.zsh#L10-L11).
|
[here](https://github.com/zimfw/completion/blob/9386a76eac3f55b1c04d57d26238f725b4b3ba25/init.zsh#L10-L11).
|
||||||
- Don't compile user Zsh startup scripts anymore
|
- Don't compile user Zsh startup scripts anymore
|
||||||
(See [#450](https://github.com/zimfw/zimfw/pull/450)). This means you can:
|
(See [#450](https://github.com/zimfw/zimfw/pull/450)). This means you can:
|
||||||
- either manually delete the compiled files, as they won't be updated by Zim
|
- either manually delete the compiled files, as they won't be updated by zimfw
|
||||||
anymore (recommended):
|
anymore (recommended):
|
||||||
```
|
```
|
||||||
for zfile in ${ZDOTDIR:-${HOME}}/.z(shenv|profile|shrc|login|logout); do
|
for zfile in ${ZDOTDIR:-${HOME}}/.z(shenv|profile|shrc|login|logout); do
|
||||||
|
@ -231,7 +363,7 @@ Take your time to review the updated [README.md] and the changes listed below.
|
||||||
- The Zim "core" is reduced to a single file, namely zimfw.zsh, that is
|
- The Zim "core" is reduced to a single file, namely zimfw.zsh, that is
|
||||||
self-updated without requiring git. With this, `ZIM_HOME` is not (the root of)
|
self-updated without requiring git. With this, `ZIM_HOME` is not (the root of)
|
||||||
a git repo anymore.
|
a git repo anymore.
|
||||||
- Zsh and modules are configured in .zshrc instead of .zimrc.
|
- Zsh and modules are initialized in .zshrc instead of .zimrc.
|
||||||
- .zimrc is not sourced during Zsh startup anymore, and only contains the module
|
- .zimrc is not sourced during Zsh startup anymore, and only contains the module
|
||||||
definitions.
|
definitions.
|
||||||
- Zim's init.zsh and login_init.zsh scripts are generated by the `zimfw` CLI
|
- Zim's init.zsh and login_init.zsh scripts are generated by the `zimfw` CLI
|
||||||
|
@ -262,6 +394,7 @@ Take your time to review the updated [README.md] and the changes listed below.
|
||||||
- `ZIM_HOME` is set in .zshenv instead of .zshrc. The issue was that the
|
- `ZIM_HOME` is set in .zshenv instead of .zshrc. The issue was that the
|
||||||
variable was not available in .zlogin in non-interactive login shells.
|
variable was not available in .zlogin in non-interactive login shells.
|
||||||
|
|
||||||
|
[completion]: https://github.com/zimfw/completion
|
||||||
[README.md]: https://github.com/zimfw/zimfw/blob/master/README.md
|
[README.md]: https://github.com/zimfw/zimfw/blob/master/README.md
|
||||||
[environment]: https://github.com/zimfw/environment
|
[environment]: https://github.com/zimfw/environment
|
||||||
[input]: https://github.com/zimfw/input
|
[input]: https://github.com/zimfw/input
|
||||||
|
@ -269,7 +402,19 @@ Take your time to review the updated [README.md] and the changes listed below.
|
||||||
[termtitle]: https://github.com/zimfw/termtitle
|
[termtitle]: https://github.com/zimfw/termtitle
|
||||||
[s1ck94]: https://github.com/zimfw/s1ck94
|
[s1ck94]: https://github.com/zimfw/s1ck94
|
||||||
|
|
||||||
[Unreleased]: https://github.com/zimfw/zimfw/compare/v1.8.0...HEAD
|
[Unreleased]: https://github.com/zimfw/zimfw/compare/v1.14.0...HEAD
|
||||||
|
[1.14.0]: https://github.com/zimfw/zimfw/compare/v1.13.1...v1.14.0
|
||||||
|
[1.13.1]: https://github.com/zimfw/zimfw/compare/v1.13.0...v1.13.1
|
||||||
|
[1.13.0]: https://github.com/zimfw/zimfw/compare/v1.12.1...v1.13.0
|
||||||
|
[1.12.1]: https://github.com/zimfw/zimfw/compare/v1.12.0...v1.12.1
|
||||||
|
[1.12.0]: https://github.com/zimfw/zimfw/compare/v1.11.3...v1.12.0
|
||||||
|
[1.11.3]: https://github.com/zimfw/zimfw/compare/v1.11.2...v1.11.3
|
||||||
|
[1.11.2]: https://github.com/zimfw/zimfw/compare/v1.11.1...v1.11.2
|
||||||
|
[1.11.1]: https://github.com/zimfw/zimfw/compare/v1.11.0...v1.11.1
|
||||||
|
[1.11.0]: https://github.com/zimfw/zimfw/compare/v1.10.0...v1.11.0
|
||||||
|
[1.10.0]: https://github.com/zimfw/zimfw/compare/v1.9.1...v1.10.0
|
||||||
|
[1.9.1]: https://github.com/zimfw/zimfw/compare/v1.9.0...v1.9.1
|
||||||
|
[1.9.0]: https://github.com/zimfw/zimfw/compare/v1.8.0...v1.9.0
|
||||||
[1.8.0]: https://github.com/zimfw/zimfw/compare/v1.7.0...v1.8.0
|
[1.8.0]: https://github.com/zimfw/zimfw/compare/v1.7.0...v1.8.0
|
||||||
[1.7.0]: https://github.com/zimfw/zimfw/compare/v1.6.2...v1.7.0
|
[1.7.0]: https://github.com/zimfw/zimfw/compare/v1.6.2...v1.7.0
|
||||||
[1.6.2]: https://github.com/zimfw/zimfw/compare/v1.6.1...v1.6.2
|
[1.6.2]: https://github.com/zimfw/zimfw/compare/v1.6.1...v1.6.2
|
||||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,7 +1,7 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2015-2016 Matt Hamilton and contributors
|
Copyright (c) 2015-2016 Matt Hamilton and contributors
|
||||||
Copyright (c) 2016-2022 Eric Nielsen, Matt Hamilton and contributors
|
Copyright (c) 2016-2024 Eric Nielsen, Matt Hamilton and contributors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
350
README.md
350
README.md
|
@ -1,3 +1,13 @@
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/zimfw/zimfw/releases"><img src="https://img.shields.io/github/v/release/zimfw/zimfw"></a>
|
||||||
|
<a href="https://github.com/zimfw/zimfw/issues"><img src="https://img.shields.io/github/issues/zimfw/zimfw.svg"></a>
|
||||||
|
<a href="https://github.com/zimfw/zimfw/network/members"><img src="https://img.shields.io/github/forks/zimfw/zimfw.svg"></a>
|
||||||
|
<a href="https://github.com/zimfw/zimfw/stargazers"><img src="https://img.shields.io/github/stars/zimfw/zimfw.svg"></a>
|
||||||
|
<a href="https://github.com/zimfw/zimfw/releases"><img src="https://img.shields.io/github/downloads/zimfw/zimfw/total.svg"></a>
|
||||||
|
<a href="https://github.com/zimfw/zimfw/discussions"><img src="https://img.shields.io/badge/forum-online-green.svg"></a>
|
||||||
|
<a href="https://github.com/zimfw/zimfw/blob/master/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/zimfw/zimfw"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://github.com/zimfw/zimfw">
|
<a href="https://github.com/zimfw/zimfw">
|
||||||
<img width="600" src="https://zimfw.github.io/images/zimfw-banner@2.jpg">
|
<img width="600" src="https://zimfw.github.io/images/zimfw-banner@2.jpg">
|
||||||
|
@ -6,74 +16,197 @@
|
||||||
|
|
||||||
What is Zim?
|
What is Zim?
|
||||||
------------
|
------------
|
||||||
Zim is a Zsh configuration framework with [blazing speed] and modular extensions.
|
Zim is a Zsh configuration framework that bundles a [plugin manager](#usage),
|
||||||
|
useful [modules] and a wide variety of [themes], without compromising on [speed].
|
||||||
|
|
||||||
Zim bundles useful [modules], a wide variety of [themes], and plenty of
|
Check how Zim compares to other frameworks and plugin managers:
|
||||||
customizability without compromising on speed.
|
|
||||||
|
|
||||||
What does Zim offer?
|
|
||||||
--------------------
|
|
||||||
Below is a brief showcase of Zim's features.
|
|
||||||
|
|
||||||
### Speed
|
|
||||||
<a href="https://github.com/zimfw/zimfw/wiki/Speed">
|
<a href="https://github.com/zimfw/zimfw/wiki/Speed">
|
||||||
<img src="https://zimfw.github.io/images/results.svg">
|
<img src="https://zimfw.github.io/images/results.svg">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
For more details, see [this wiki entry][blazing speed].
|
Table of Contents
|
||||||
|
-----------------
|
||||||
### Modules
|
* [Installation](#installation)
|
||||||
|
* [Automatic installation](#automatic-installation)
|
||||||
Zim has many [modules available][modules]. Enable as many or as few as you'd like.
|
* [Manual installation](#manual-installation)
|
||||||
|
* [Set up `~/.zshrc`](#set-up-zshrc)
|
||||||
### Themes
|
* [Create `~/.zimrc`](#create-zimrc)
|
||||||
|
* [Usage](#usage)
|
||||||
To preview some of the available themes, check the [themes page][themes].
|
* [`zmodule`](#zmodule)
|
||||||
|
* [`zimfw`](#zimfw)
|
||||||
### Degit
|
* [Settings](#settings)
|
||||||
|
* [Uninstalling](#uninstalling)
|
||||||
Install modules without requiring `git` using our degit tool. It's faster and
|
|
||||||
lighter than `git`. See the [zmodule](#zmodule-usage) usage below.
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
Installing Zim is easy:
|
Installing Zim is easy. You can choose either the automatic or manual method below:
|
||||||
|
|
||||||
* With curl:
|
### Automatic installation
|
||||||
|
|
||||||
curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
|
This will install a predefined set of modules and a theme for you.
|
||||||
|
|
||||||
* With wget:
|
* With `curl`:
|
||||||
|
```zsh
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
|
||||||
|
```
|
||||||
|
|
||||||
wget -nv -O - https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
|
* With `wget`:
|
||||||
|
```zsh
|
||||||
|
wget -nv -O - https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
|
||||||
|
```
|
||||||
|
|
||||||
Open a new terminal and you're done. Enjoy your Zsh IMproved! Take some time to
|
Restart your terminal and you're done. Enjoy your Zsh IMproved! Take some time
|
||||||
tweak your `~/.zshrc` file, and to also check the available [modules] and [themes]
|
to tweak your [`~/.zshrc`](#set-up-zshrc) file and to also check the available
|
||||||
you can add to your `~/.zimrc`.
|
[modules] and [themes] you can add to your [`~/.zimrc`](#create-zimrc).
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Prefer to install manually?</summary>
|
|
||||||
|
|
||||||
### Manual installation
|
### Manual installation
|
||||||
|
|
||||||
1. Set Zsh as the default shell:
|
1. Set Zsh as the default shell, if you haven't done so already:
|
||||||
|
```zsh
|
||||||
|
chsh -s $(which zsh)
|
||||||
|
````
|
||||||
|
|
||||||
chsh -s $(which zsh)
|
2. [Set up your `~/.zshrc` file](#set-up-zshrc)
|
||||||
|
|
||||||
2. Prepend the lines in the following templates to the respective dot files:
|
3. [Create your `~/.zimrc` file](#create-zimrc)
|
||||||
|
|
||||||
* [~/.zshrc](https://raw.githubusercontent.com/zimfw/install/master/src/templates/zshrc)
|
4. Restart your terminal and you're done. Enjoy your Zsh IMproved!
|
||||||
* [~/.zimrc](https://raw.githubusercontent.com/zimfw/install/master/src/templates/zimrc)
|
|
||||||
|
|
||||||
3. Restart your terminal to automatically install the `zimfw` command line utility,
|
#### Set up `~/.zshrc`
|
||||||
install the modules defined in `~/.zimrc`, and build the initialization scripts.
|
|
||||||
</details>
|
Add the lines below to your `~/.zshrc` file, in the following order:
|
||||||
|
|
||||||
|
1. To use our `degit` tool by default to install modules:
|
||||||
|
```zsh
|
||||||
|
zstyle ':zim:zmodule' use 'degit'
|
||||||
|
````
|
||||||
|
This is optional and only required if you don't have `git` installed (yes,
|
||||||
|
zimfw works even without `git`!)
|
||||||
|
|
||||||
|
2. To set where the zimfw plugin manager configuration file will be located:
|
||||||
|
```zsh
|
||||||
|
ZIM_CONFIG_FILE=~/.config/zsh/zimrc
|
||||||
|
```
|
||||||
|
This is optional. The value of `ZIM_CONFIG_FILE` can be any path your user
|
||||||
|
has at least read access to. By default, the file must be at `~/.zimrc`, if
|
||||||
|
the `ZDOTDIR` environment variable is not defined. Otherwise, it must be at
|
||||||
|
`${ZDOTDIR}/.zimrc`.
|
||||||
|
|
||||||
|
3. To set the directory where the zimfw plugin manager will keep necessary files:
|
||||||
|
```zsh
|
||||||
|
ZIM_HOME=~/.zim
|
||||||
|
```
|
||||||
|
The value of `ZIM_HOME` can be any directory your user has write access to.
|
||||||
|
You can even set it to a cache directory like `${XDG_CACHE_HOME}/zim` or
|
||||||
|
`~/.cache/zim`.
|
||||||
|
|
||||||
|
4. To automatically download the zimfw plugin manager if missing:
|
||||||
|
```zsh
|
||||||
|
# Download zimfw plugin manager if missing.
|
||||||
|
if [[ ! -e ${ZIM_HOME}/zimfw.zsh ]]; then
|
||||||
|
curl -fsSL --create-dirs -o ${ZIM_HOME}/zimfw.zsh \
|
||||||
|
https://github.com/zimfw/zimfw/releases/latest/download/zimfw.zsh
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
Or if you use `wget` instead of `curl`:
|
||||||
|
```zsh
|
||||||
|
# Download zimfw plugin manager if missing.
|
||||||
|
if [[ ! -e ${ZIM_HOME}/zimfw.zsh ]]; then
|
||||||
|
mkdir -p ${ZIM_HOME} && wget -nv -O ${ZIM_HOME}/zimfw.zsh \
|
||||||
|
https://github.com/zimfw/zimfw/releases/latest/download/zimfw.zsh
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
This is optional. Alternatively, you can download the `zimfw.zsh` script
|
||||||
|
anywhere your user has write access to: just replace the occurrences of
|
||||||
|
`${ZIM_HOME}/zimfw.zsh` by the preferred path, like `/usr/local/bin/zimfw.zsh`
|
||||||
|
for example. If you choose to not include this step, you should manually
|
||||||
|
download the `zimfw.zsh` script once and keep it at the preferred path.
|
||||||
|
|
||||||
|
5. To automatically install missing modules and update the static initialization
|
||||||
|
script if missing or outdated:
|
||||||
|
```zsh
|
||||||
|
# Install missing modules and update ${ZIM_HOME}/init.zsh if missing or outdated.
|
||||||
|
if [[ ! ${ZIM_HOME}/init.zsh -nt ${ZIM_CONFIG_FILE:-${ZDOTDIR:-${HOME}}/.zimrc} ]]; then
|
||||||
|
source ${ZIM_HOME}/zimfw.zsh init -q
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
This step is optional, but highly recommended. If you choose to not include
|
||||||
|
it, you must remember to manually run `zimfw install` every time you update
|
||||||
|
your [`~/.zimrc`](#create-zimrc) file. If you have chosen to keep the
|
||||||
|
`zimfw.zsh` in a different path as mentioned in the previous step, replace
|
||||||
|
`${ZIM_HOME}/zimfw.zsh` by the chosen path.
|
||||||
|
|
||||||
|
6. To source the static script, that will initialize your modules:
|
||||||
|
```zsh
|
||||||
|
# Initialize modules.
|
||||||
|
source ${ZIM_HOME}/init.zsh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Create `~/.zimrc`
|
||||||
|
|
||||||
|
This file configures the zimfw plugin manager. It's referred to as `~/.zimrc`
|
||||||
|
in the documentation for the sake of simplicity, but the actual location of the
|
||||||
|
file is defined by the following rules:
|
||||||
|
|
||||||
|
1. You can define the full path and name of the file with a `ZIM_CONFIG_FILE`
|
||||||
|
environment variable. For example:
|
||||||
|
```zsh
|
||||||
|
ZIM_CONFIG_FILE=~/.config/zsh/zimrc
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Or, if you defined a `ZDOTDIR` environment variable, then the file must be at
|
||||||
|
`${ZDOTDIR}/.zimrc`
|
||||||
|
|
||||||
|
3. Otherwise, it must be at at `~/.zimrc`, which is it's default location.
|
||||||
|
|
||||||
|
As for the contents of the file, you can start with just:
|
||||||
|
```zsh
|
||||||
|
zmodule zsh-users/zsh-syntax-highlighting
|
||||||
|
zmodule zsh-users/zsh-autosuggestions
|
||||||
|
```
|
||||||
|
|
||||||
|
If you also want one of our prompt [themes]:
|
||||||
|
```zsh
|
||||||
|
zmodule git-info
|
||||||
|
zmodule duration-info
|
||||||
|
zmodule asciiship
|
||||||
|
zmodule zsh-users/zsh-syntax-highlighting
|
||||||
|
zmodule zsh-users/zsh-autosuggestions
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to use our [completion] module too, instead of using `compinit` directly:
|
||||||
|
```zsh
|
||||||
|
zmodule git-info
|
||||||
|
zmodule duration-info
|
||||||
|
zmodule asciiship
|
||||||
|
zmodule zsh-users/zsh-completions --fpath src
|
||||||
|
zmodule completion
|
||||||
|
zmodule zsh-users/zsh-syntax-highlighting
|
||||||
|
zmodule zsh-users/zsh-autosuggestions
|
||||||
|
```
|
||||||
|
The [completion] module calls `compinit` for you. You should remove any
|
||||||
|
`compinit` calls from your `~/.zshrc` when you use this module. The modules will
|
||||||
|
be initialized in the order they are defined, and [completion] must be
|
||||||
|
initialized *after* all modules that add completion definitions, so it must come
|
||||||
|
after [zsh-users/zsh-completions].
|
||||||
|
|
||||||
|
Check the [`zmodule` usage](#zmodule) below for more examples on how to use it to
|
||||||
|
define the modules you want to use.
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
The zimfw plugin manager installs your modules at `${ZIM_HOME}/modules` and
|
||||||
|
builds a static script at `${ZIM_HOME}/init.zsh` that will initialize them. Your
|
||||||
|
modules are defined in your `~/.zimrc` file.
|
||||||
|
|
||||||
Add `zmodule` calls to your `~/.zimrc` file to define the modules to be
|
The `~/.zimrc` file must contain `zmodule` calls to define the modules to be
|
||||||
initialized, then run `zimfw install` to install them.
|
initialized. The modules will be initialized in the same order they're defined.
|
||||||
|
|
||||||
|
The `~/.zimrc` file is not sourced during Zsh startup and it's only used to
|
||||||
|
configure the zimfw plugin manager.
|
||||||
|
|
||||||
|
Check [examples of `~/.zimrc` files](#create-zimrc) above.
|
||||||
|
|
||||||
### zmodule
|
### zmodule
|
||||||
|
|
||||||
|
@ -85,77 +218,133 @@ Below are some usage examples:
|
||||||
* A module at an absolute path, that is already installed:
|
* A module at an absolute path, that is already installed:
|
||||||
`zmodule /usr/local/share/zsh-autosuggestions`
|
`zmodule /usr/local/share/zsh-autosuggestions`
|
||||||
* A module with a custom fpath: `zmodule zsh-users/zsh-completions --fpath src`
|
* A module with a custom fpath: `zmodule zsh-users/zsh-completions --fpath src`
|
||||||
* A module with a custom initialization file, and with git submodules disabled:
|
* A module with a custom initialization file and with git submodules disabled:
|
||||||
`zmodule spaceship-prompt/spaceship-prompt --source spaceship.zsh --no-submodules` or
|
`zmodule spaceship-prompt/spaceship-prompt --source spaceship.zsh --no-submodules` or
|
||||||
`zmodule spaceship-prompt/spaceship-prompt --name spaceship --no-submodules`
|
`zmodule spaceship-prompt/spaceship-prompt --name spaceship --no-submodules`
|
||||||
* A module with two custom initialization files:
|
* A module with two custom initialization files:
|
||||||
`zmodule sindresorhus/pure --source async.zsh --source pure.zsh`
|
`zmodule sindresorhus/pure --source async.zsh --source pure.zsh`. Separate
|
||||||
|
zmodule calls can also be used. In this equivalent example, the second call
|
||||||
|
automatically discovers the second file to be sourced:
|
||||||
|
```
|
||||||
|
zmodule sindresorhus/pure --source async.zsh
|
||||||
|
zmodule sindresorhus/pure
|
||||||
|
```
|
||||||
* A module with a custom initialization command:
|
* A module with a custom initialization command:
|
||||||
`zmodule skywind3000/z.lua --cmd 'eval "$(lua {}/z.lua --init zsh enhanced once)"'`
|
`zmodule skywind3000/z.lua --cmd 'eval "$(lua {}/z.lua --init zsh enhanced once)"'`
|
||||||
|
* A module with an on-pull command. It can be used to create a cached initialization script:
|
||||||
|
`zmodule skywind3000/z.lua --on-pull 'lua z.lua --init zsh enhanced once >! init.zsh'`
|
||||||
* A module with a big git repository: `zmodule romkatv/powerlevel10k --use degit`
|
* A module with a big git repository: `zmodule romkatv/powerlevel10k --use degit`
|
||||||
|
* A module with a custom root subdirectory: `zmodule ohmyzsh/ohmyzsh --root plugins/vim-interaction`
|
||||||
|
* A module with multiple roots:
|
||||||
|
```
|
||||||
|
zmodule sorin-ionescu/prezto --root modules/command-not-found
|
||||||
|
zmodule sorin-ionescu/prezto --root modules/gnu-utility
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```
|
||||||
|
zmodule ohmyzsh/ohmyzsh --root plugins/perl
|
||||||
|
zmodule ohmyzsh/ohmyzsh --root plugins/vim-interaction
|
||||||
|
```
|
||||||
|
|
||||||
<details id="zmodule-usage">
|
<details id="zmodule-usage">
|
||||||
<summary>Want help with the complete <code>zmodule</code> usage?</summary>
|
<summary>Want help with the complete <code>zmodule</code> usage?</summary>
|
||||||
|
|
||||||
<pre>Usage: <b>zmodule</b> <url> [<b>-n</b>|<b>--name</b> <module_name>] [options]
|
<pre>Usage: <b>zmodule</b> <url> [<b>-n</b>|<b>--name</b> <module_name>] [<b>-r</b>|<b>--root</b> <path>] [options]
|
||||||
|
|
||||||
Add <b>zmodule</b> calls to your <b>~/.zimrc</b> file to define the modules to be initialized. The modules
|
Add <b>zmodule</b> calls to your <b>~/.zimrc</b> file to define the modules to be initialized. The initiali-
|
||||||
are initialized in the same order they are defined.
|
zation will be done in the same order it's defined.
|
||||||
|
|
||||||
<url> Module absolute path or repository URL. The following URL formats
|
<url> Module absolute path or repository URL. The following URL formats
|
||||||
are equivalent: <b>foo</b>, <b>zimfw/foo</b>, <b>https://github.com/zimfw/foo.git</b>.
|
are equivalent: <b>foo</b>, <b>zimfw/foo</b>, <b>https://github.com/zimfw/foo.git</b>.
|
||||||
|
If an absolute path is given, the module is considered externally
|
||||||
|
installed and won't be installed or updated by zimfw.
|
||||||
<b>-n</b>|<b>--name</b> <module_name> Set a custom module name. Default: the last component in <url>.
|
<b>-n</b>|<b>--name</b> <module_name> Set a custom module name. Default: the last component in <url>.
|
||||||
Use slashes inside the name to organize the module into subdirec-
|
Slashes can be used inside the name to organize the module into
|
||||||
tories.
|
subdirectories. The module will be installed at
|
||||||
|
<b>${ZIM_HOME}/</b><module_name>.
|
||||||
|
<b>-r</b>|<b>--root</b> <path> Relative path to the module root.
|
||||||
|
|
||||||
Repository options:
|
Per-module options:
|
||||||
<b>-b</b>|<b>--branch</b> <branch_name> Use specified branch when installing and updating the module.
|
<b>-b</b>|<b>--branch</b> <branch_name> Use specified branch when installing and updating the module.
|
||||||
Overrides the tag option. Default: the repository default branch.
|
Overrides the tag option. Default: the repository default branch.
|
||||||
<b>-t</b>|<b>--tag</b> <tag_name> Use specified tag when installing and updating the module. Over-
|
<b>-t</b>|<b>--tag</b> <tag_name> Use specified tag when installing and updating the module. Over-
|
||||||
rides the branch option.
|
rides the branch option.
|
||||||
<b>-u</b>|<b>--use</b> <<b>git</b>|<b>degit</b>> Install and update the module using the defined tool. Default is
|
<b>-u</b>|<b>--use</b> <tool_name> Install and update the module using the defined tool. Default is
|
||||||
either defined by <b>zstyle ':zim:zmodule' use '</b><<b>git</b>|<b>degit</b>><b>'</b>, or <b>git</b>
|
either defined by <b>zstyle ':zim:zmodule' use '</b><tool_name><b>'</b>, or <b>git</b>
|
||||||
if none is provided.
|
if none is provided. The tools available are:
|
||||||
<b>git</b> requires git itself. Local changes are preserved on updates.
|
<b>git</b> uses the git command. Local changes are preserved on updates.
|
||||||
<b>degit</b> requires curl or wget, and currently only works with GitHub
|
<b>degit</b> uses curl or wget, and currently only works with GitHub
|
||||||
URLs. Modules install faster and take less disk space. Local
|
URLs. Modules install faster and take less disk space. Local
|
||||||
changes are lost on updates. Git submodules are not supported.
|
changes are lost on updates. Git submodules are not supported.
|
||||||
|
<b>mkdir</b> creates an empty directory. The <url> is only used to set
|
||||||
|
the module name. Use the <b>-c</b>|<b>--cmd</b> or <b>--on-pull</b> options to execute
|
||||||
|
the desired command to generate the module files.
|
||||||
<b>--no-submodules</b> Don't install or update git submodules.
|
<b>--no-submodules</b> Don't install or update git submodules.
|
||||||
<b>-z</b>|<b>--frozen</b> Don't install or update the module.
|
<b>-z</b>|<b>--frozen</b> Don't install or update the module.
|
||||||
|
|
||||||
Initialization options:
|
The per-module options above are carried over multiple zmodule calls for the same module.
|
||||||
<b>-f</b>|<b>--fpath</b> <path> Add specified path to fpath. The path is relative to the module
|
Modules are uniquely identified by their name.
|
||||||
root directory. Default: <b>functions</b>, if the subdirectory exists.
|
|
||||||
<b>-a</b>|<b>--autoload</b> <func_name> Autoload specified function. Default: all valid names inside the
|
|
||||||
<b>functions</b> subdirectory, if any.
|
|
||||||
<b>-s</b>|<b>--source</b> <file_path> Source specified file. The file path is relative to the module
|
|
||||||
root directory. Default: <b>init.zsh</b>, if the <b>functions</b> subdirectory
|
|
||||||
also exists, or the largest of the files with name matching
|
|
||||||
<b>{init.zsh,module_name.{zsh,plugin.zsh,zsh-theme,sh}}</b>, if any.
|
|
||||||
<b>-c</b>|<b>--cmd</b> <command> Execute specified command. Occurrences of the <b>{}</b> placeholder in
|
|
||||||
the command are substituted by the module root directory path.
|
|
||||||
I.e., <b>-s 'foo.zsh'</b> and <b>-c 'source {}/foo.zsh'</b> are equivalent.
|
|
||||||
<b>-d</b>|<b>--disabled</b> Don't initialize or uninstall the module.
|
|
||||||
|
|
||||||
Setting any initialization option above will disable all the default values from the other
|
Per-module-root options:
|
||||||
initialization options, so only your provided values are used. I.e. these values are either
|
<b>--if</b> <test> Will only initialize module root if specified test returns a zero
|
||||||
all automatic, or all manual.
|
exit status. The test is evaluated at every new terminal startup.
|
||||||
|
<b>--if-command</b> <cmd_name> Will only initialize module root if specified external command is
|
||||||
|
available. This is evaluated at every new terminal startup.
|
||||||
|
Equivalent to <b>--if '(( ${+commands[</b><cmd_name><b>]} ))'</b>.
|
||||||
|
<b>--on-pull</b> <command> Execute command after installing or updating the module. The com-
|
||||||
|
mand is executed in the module root directory.
|
||||||
|
<b>-d</b>|<b>--disabled</b> Don't initialize the module root or uninstall the module.
|
||||||
|
|
||||||
|
The per-module-root options above are carried over multiple zmodule calls for the same mod-
|
||||||
|
ule root.
|
||||||
|
|
||||||
|
Per-call initialization options:
|
||||||
|
<b>-f</b>|<b>--fpath</b> <path> Will add specified path to fpath. The path is relative to the
|
||||||
|
module root directory. Default: <b>functions</b>, if the subdirectory
|
||||||
|
exists and is non-empty.
|
||||||
|
<b>-a</b>|<b>--autoload</b> <func_name> Will autoload specified function. Default: all valid names inside
|
||||||
|
the <b>functions</b> subdirectory, if any.
|
||||||
|
<b>-s</b>|<b>--source</b> <file_path> Will source specified file. The path is relative to the module
|
||||||
|
root directory. Default: <b>init.zsh</b>, if a non-empty <b>functions</b> sub-
|
||||||
|
directory exists, else the largest of the files matching the glob
|
||||||
|
<b>(init.zsh|</b><name><b>.(zsh|plugin.zsh|zsh-theme|sh))</b>, if any.
|
||||||
|
<name> in the glob is resolved to the last component of the mod-
|
||||||
|
ule name, or the last component of the path to the module root.
|
||||||
|
<b>-c</b>|<b>--cmd</b> <command> Will execute specified command. Occurrences of the <b>{}</b> placeholder
|
||||||
|
in the command are substituted by the module root directory path.
|
||||||
|
I.e., <b>-s 'foo.zsh'</b> and <b>-c 'source {}/foo.zsh'</b> are equivalent.
|
||||||
|
|
||||||
|
Setting any per-call initialization option above will disable the default values from the
|
||||||
|
other per-call initialization options, so only your provided values will be used. I.e. these
|
||||||
|
values are either all automatic, or all manual in each zmodule call. To use default values
|
||||||
|
and also provided values, use separate zmodule calls.
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### zimfw
|
### zimfw
|
||||||
|
|
||||||
The command line utility for Zim:
|
The Zim plugin manager:
|
||||||
|
|
||||||
* Added new modules to `~/.zimrc`? Run `zimfw install`.
|
* Added new modules to `~/.zimrc`? Run `zimfw install`.
|
||||||
* Removed modules from `~/.zimrc`? Run `zimfw uninstall`.
|
* Removed modules from `~/.zimrc`? Run `zimfw uninstall`.
|
||||||
* Want to update your modules to their latest revisions? Run `zimfw update`.
|
* Want to update your modules to their latest revisions? Run `zimfw update`.
|
||||||
* Want to upgrade `zimfw` to its latest version? Run `zimfw upgrade`.
|
* Want to upgrade zimfw to its latest version? Run `zimfw upgrade`.
|
||||||
* For more information about the `zimfw` utility, run `zimfw help`.
|
* For more information about the zimfw plugin manager, run `zimfw help`.
|
||||||
|
|
||||||
Settings
|
Settings
|
||||||
--------
|
--------
|
||||||
|
Set the path of the directory used by zimfw with the `ZIM_HOME` environment
|
||||||
|
variable:
|
||||||
|
|
||||||
|
ZIM_HOME=~/.zim
|
||||||
|
|
||||||
|
By default, the zimfw plugin manager configuration file must be at `~/.zimrc`,
|
||||||
|
if the `ZDOTDIR` environment variable is not defined. Otherwise, it must be at
|
||||||
|
`${ZDOTDIR}/.zimrc`. You can customize its full path and name with the
|
||||||
|
`ZIM_CONFIG_FILE` environment variable:
|
||||||
|
|
||||||
|
ZIM_CONFIG_FILE=~/.config/zsh/zimrc
|
||||||
|
|
||||||
Modules are installed using `git` by default. If you don't have `git`
|
Modules are installed using `git` by default. If you don't have `git`
|
||||||
installed, or if you want to take advantage of our degit tool for faster and
|
installed, or if you want to take advantage of our degit tool for faster and
|
||||||
|
@ -163,18 +352,21 @@ lighter module installations, you can set degit as the default tool with:
|
||||||
|
|
||||||
zstyle ':zim:zmodule' use 'degit'
|
zstyle ':zim:zmodule' use 'degit'
|
||||||
|
|
||||||
By default, `zimfw` will check if it has a new version available every 30 days.
|
By default, zimfw will check if it has a new version available every 30 days. If
|
||||||
This can be disabled with:
|
the `zimfw.zsh` file cannot be upgraded, either because your user does not have
|
||||||
|
write access to it, or because it was sourced from a symlink, then this will be
|
||||||
|
disabled. This can be manually disabled with:
|
||||||
|
|
||||||
zstyle ':zim' disable-version-check yes
|
zstyle ':zim' disable-version-check yes
|
||||||
|
|
||||||
Uninstalling
|
Uninstalling
|
||||||
------------
|
------------
|
||||||
|
|
||||||
The best way to remove Zim is to manually delete `~/.zim`, `~/.zimrc`, and
|
The best way to remove Zim is to manually delete `~/.zim`, `~/.zimrc`, and
|
||||||
remove the initialization lines from your `~/.zshenv`, `~/.zshrc` and `~/.zlogin`.
|
remove the initialization lines from your `~/.zshenv`, `~/.zshrc` and `~/.zlogin`.
|
||||||
|
|
||||||
[blazing speed]: https://github.com/zimfw/zimfw/wiki/Speed
|
|
||||||
[modules]: https://zimfw.sh/docs/modules/
|
[modules]: https://zimfw.sh/docs/modules/
|
||||||
[themes]: https://zimfw.sh/docs/themes/
|
[themes]: https://zimfw.sh/docs/themes/
|
||||||
|
[speed]: https://github.com/zimfw/zimfw/wiki/Speed
|
||||||
[@zimfw]: https://github.com/zimfw
|
[@zimfw]: https://github.com/zimfw
|
||||||
|
[completion]: https://github.com/zimfw/completion
|
||||||
|
[zsh-users/zsh-completions]: https://github.com/zsh-users/zsh-completions
|
||||||
|
|
241
src/functions/30_zmodule.zsh.erb
Normal file
241
src/functions/30_zmodule.zsh.erb
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
zmodule() {
|
||||||
|
local -r ztarget=${ZIM_CONFIG_FILE:-<%= home %>/.zimrc}
|
||||||
|
local -r zusage=$'Usage: <%= bold %>'${0}$'<%= normal %> <url> [<%= bold %>-n<%= normal %>|<%= bold %>--name<%= normal %> <module_name>] [<%= bold %>-r<%= normal %>|<%= bold %>--root<%= normal %> <path>] [options]
|
||||||
|
|
||||||
|
Add <%= bold %>zmodule<%= normal %> calls to your <%= bold %>'${ztarget}$'<%= normal %> file to define the modules to be initialized.
|
||||||
|
The initialization will be done in the same order it\'s defined.
|
||||||
|
|
||||||
|
<url> Module absolute path or repository URL. The following URL formats
|
||||||
|
are equivalent: <%= bold %>foo<%= normal %>, <%= bold %>zimfw/foo<%= normal %>, <%= bold %>https://github.com/zimfw/foo.git<%= normal %>.
|
||||||
|
If an absolute path is given, the module is considered externally
|
||||||
|
installed and won\'t be installed or updated by zimfw.
|
||||||
|
<%= bold %>-n<%= normal %>|<%= bold %>--name<%= normal %> <module_name> Set a custom module name. Default: the last component in <url>.
|
||||||
|
Slashes can be used inside the name to organize the module into
|
||||||
|
subdirectories. The module will be installed at
|
||||||
|
<%= bold %>'${ZIM_HOME}$'/<%= normal %><module_name>.
|
||||||
|
<%= bold %>-r<%= normal %>|<%= bold %>--root<%= normal %> <path> Relative path to the module root.
|
||||||
|
|
||||||
|
Per-module options:
|
||||||
|
<%= bold %>-b<%= normal %>|<%= bold %>--branch<%= normal %> <branch_name> Use specified branch when installing and updating the module.
|
||||||
|
Overrides the tag option. Default: the repository default branch.
|
||||||
|
<%= bold %>-t<%= normal %>|<%= bold %>--tag<%= normal %> <tag_name> Use specified tag when installing and updating the module. Over-
|
||||||
|
rides the branch option.
|
||||||
|
<%= bold %>-u<%= normal %>|<%= bold %>--use<%= normal %> <tool_name> Install and update the module using the defined tool. Default is
|
||||||
|
either defined by <%= bold %>zstyle \':zim:zmodule\' use \'<%= normal %><tool_name><%= bold %>\'<%= normal %>, or <%= bold %>git<%= normal %>
|
||||||
|
if none is provided. The tools available are:
|
||||||
|
<%= bold %>git<%= normal %> uses the git command. Local changes are preserved on updates.
|
||||||
|
<%= bold %>degit<%= normal %> uses curl or wget, and currently only works with GitHub
|
||||||
|
URLs. Modules install faster and take less disk space. Local
|
||||||
|
changes are lost on updates. Git submodules are not supported.
|
||||||
|
<%= bold %>mkdir<%= normal %> creates an empty directory. The <url> is only used to set
|
||||||
|
the module name. Use the <%= bold %>-c<%= normal %>|<%= bold %>--cmd<%= normal %> or <%= bold %>--on-pull<%= normal %> options to execute
|
||||||
|
the desired command to generate the module files.
|
||||||
|
<%= bold %>--no-submodules<%= normal %> Don\'t install or update git submodules.
|
||||||
|
<%= bold %>-z<%= normal %>|<%= bold %>--frozen<%= normal %> Don\'t install or update the module.
|
||||||
|
|
||||||
|
The per-module options above are carried over multiple zmodule calls for the same module.
|
||||||
|
Modules are uniquely identified by their name.
|
||||||
|
|
||||||
|
Per-module-root options:
|
||||||
|
<%= bold %>--if<%= normal %> <test> Will only initialize module root if specified test returns a zero
|
||||||
|
exit status. The test is evaluated at every new terminal startup.
|
||||||
|
<%= bold %>--if-command<%= normal %> <cmd_name> Will only initialize module root if specified external command is
|
||||||
|
available. This is evaluated at every new terminal startup.
|
||||||
|
Equivalent to <%= bold %>--if \'(( \${+commands[<%= normal %><cmd_name><%= bold %>]} ))\'<%= normal %>.
|
||||||
|
<%= bold %>--on-pull<%= normal %> <command> Execute command after installing or updating the module. The com-
|
||||||
|
mand is executed in the module root directory.
|
||||||
|
<%= bold %>-d<%= normal %>|<%= bold %>--disabled<%= normal %> Don\'t initialize the module root or uninstall the module.
|
||||||
|
|
||||||
|
The per-module-root options above are carried over multiple zmodule calls for the same mod-
|
||||||
|
ule root.
|
||||||
|
|
||||||
|
Per-call initialization options:
|
||||||
|
<%= bold %>-f<%= normal %>|<%= bold %>--fpath<%= normal %> <path> Will add specified path to fpath. The path is relative to the
|
||||||
|
module root directory. Default: <%= bold %>functions<%= normal %>, if the subdirectory
|
||||||
|
exists and is non-empty.
|
||||||
|
<%= bold %>-a<%= normal %>|<%= bold %>--autoload<%= normal %> <func_name> Will autoload specified function. Default: all valid names inside
|
||||||
|
the <%= bold %>functions<%= normal %> subdirectory, if any.
|
||||||
|
<%= bold %>-s<%= normal %>|<%= bold %>--source<%= normal %> <file_path> Will source specified file. The path is relative to the module
|
||||||
|
root directory. Default: <%= bold %>init.zsh<%= normal %>, if a non-empty <%= bold %>functions<%= normal %> sub-
|
||||||
|
directory exists, else the largest of the files matching the glob
|
||||||
|
<%= bold %>(init.zsh|<%= normal %><name><%= bold %>.(zsh|plugin.zsh|zsh-theme|sh))<%= normal %>, if any.
|
||||||
|
<name> in the glob is resolved to the last component of the mod-
|
||||||
|
ule name, or the last component of the path to the module root.
|
||||||
|
<%= bold %>-c<%= normal %>|<%= bold %>--cmd<%= normal %> <command> Will execute specified command. Occurrences of the <%= bold %>{}<%= normal %> placeholder
|
||||||
|
in the command are substituted by the module root directory path.
|
||||||
|
I.e., <%= bold %>-s \'foo.zsh\'<%= normal %> and <%= bold %>-c \'source {}/foo.zsh\'<%= normal %> are equivalent.
|
||||||
|
|
||||||
|
Setting any per-call initialization option above will disable the default values from the
|
||||||
|
other per-call initialization options, so only your provided values will be used. I.e. these
|
||||||
|
values are either all automatic, or all manual in each zmodule call. To use default values
|
||||||
|
and also provided values, use separate zmodule calls.'
|
||||||
|
if [[ ${${funcfiletrace[1]%:*}:A} != ${ztarget:A} ]]; then
|
||||||
|
print -u2 -lR $'<%= red %>'${0}$': Must be called from <%= bold %>'${ztarget}$'<%= normal %>' '' ${zusage}
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
if (( ! # )); then
|
||||||
|
print -u2 -lR $'<%= red %><%= error %>'${funcfiletrace[1]}$': Missing zmodule url<%= normal %>' '' ${zusage}
|
||||||
|
_zfailed=1
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
local zurl=${1} zname=${1:t} zroot zarg
|
||||||
|
local -a zfpaths zfunctions zcmds
|
||||||
|
if [[ ${zurl} =~ ^[^:/]+: ]]; then
|
||||||
|
zname=${zname%.git}
|
||||||
|
elif [[ ${zurl} != /* ]]; then
|
||||||
|
# Count number of slashes
|
||||||
|
case ${#zurl//[^\/]/} in
|
||||||
|
0) zurl=https://github.com/zimfw/${zurl}.git ;;
|
||||||
|
1) zurl=https://github.com/${zurl}.git ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
while [[ ${1} == (-n|--name|-r|--root) ]]; do
|
||||||
|
if (( # < 2 )); then
|
||||||
|
print -u2 -lR $'<%= red %><%= error %>'${funcfiletrace[1]}$':<%= bold %>'${zname}$':<%= normalred %> Missing argument for zmodule option <%= bold %>'${1}$'<%= normal %>' '' ${zusage}
|
||||||
|
_zfailed=1
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
case ${1} in
|
||||||
|
-n|--name)
|
||||||
|
shift
|
||||||
|
zname=${${1%%/##}##/##}
|
||||||
|
;;
|
||||||
|
-r|--root)
|
||||||
|
shift
|
||||||
|
zroot=${${1%%/##}##/##}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
if [[ ${zurl} == /* ]]; then
|
||||||
|
_zdirs[${zname}]=${zurl%%/##}
|
||||||
|
zurl=
|
||||||
|
else
|
||||||
|
_zdirs[${zname}]=${ZIM_HOME}/modules/${zname}
|
||||||
|
fi
|
||||||
|
if [[ ${+_zurls[${zname}]} -ne 0 && ${_zurls[${zname}]} != ${zurl} ]]; then
|
||||||
|
print -u2 -lR $'<%= red %><%= error %>'${funcfiletrace[1]}$':<%= bold %>'${zname}$':<%= normalred %> Module already defined with a different URL. Expected <%= bold %>'${_zurls[${zname}]}$'<%= normal %>' '' ${zusage}
|
||||||
|
_zfailed=1
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
_zurls[${zname}]=${zurl}
|
||||||
|
local -r zroot_dir=${_zdirs[${zname}]}${zroot:+/${zroot}}
|
||||||
|
_zroot_dirs+=(${zroot_dir})
|
||||||
|
# Set default values
|
||||||
|
if (( ! ${+_ztools[${zname}]} )); then
|
||||||
|
zstyle -s ':zim:zmodule' use "_ztools[${zname}]" || _ztools[${zname}]=git
|
||||||
|
fi
|
||||||
|
if (( ! ${+_ztypes[${zname}]} )) _ztypes[${zname}]=branch
|
||||||
|
if (( ! ${+_zsubmodules[${zname}]} )) _zsubmodules[${zname}]=1
|
||||||
|
# Set values from options
|
||||||
|
while (( # > 0 )); do
|
||||||
|
case ${1} in
|
||||||
|
-b|--branch|-t|--tag|-u|--use|--on-pull|--if|--if-command|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd)
|
||||||
|
if (( # < 2 )); then
|
||||||
|
print -u2 -lR $'<%= red %><%= error %>'${funcfiletrace[1]}$':<%= bold %>'${zname}$':<%= normalred %> Missing argument for zmodule option <%= bold %>'${1}$'<%= normal %>' '' ${zusage}
|
||||||
|
_zfailed=1
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ${1} in
|
||||||
|
-b|--branch|-t|--tag|-u|--use|--no-submodules)
|
||||||
|
if [[ -z ${zurl} ]] _zimfw_print -u2 -R $'<%= yellow %><%= warn %>'${funcfiletrace[1]}$':<%= bold %>'${zname}$':<%= normalyellow %> The zmodule option <%= bold %>'${1}$'<%= normalyellow %> has no effect for external modules<%= normal %>'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ${1} in
|
||||||
|
-b|--branch)
|
||||||
|
shift
|
||||||
|
_ztypes[${zname}]=branch
|
||||||
|
_zrevs[${zname}]=${1}
|
||||||
|
;;
|
||||||
|
-t|--tag)
|
||||||
|
shift
|
||||||
|
_ztypes[${zname}]=tag
|
||||||
|
_zrevs[${zname}]=${1}
|
||||||
|
;;
|
||||||
|
-u|--use)
|
||||||
|
shift
|
||||||
|
_ztools[${zname}]=${1}
|
||||||
|
;;
|
||||||
|
--no-submodules) _zsubmodules[${zname}]=0 ;;
|
||||||
|
-z|--frozen) _zfrozens[${zname}]=1 ;;
|
||||||
|
--on-pull)
|
||||||
|
shift
|
||||||
|
zarg=${1}
|
||||||
|
if [[ -n ${zroot} ]] zarg="(builtin cd -q ${zroot}; ${zarg})"
|
||||||
|
_zonpulls[${zname}]="${_zonpulls[${zname}]+${_zonpulls[${zname}]}; }${zarg}"
|
||||||
|
;;
|
||||||
|
--if)
|
||||||
|
shift
|
||||||
|
_zifs[${zroot_dir}]=${1}
|
||||||
|
;;
|
||||||
|
--if-command)
|
||||||
|
shift
|
||||||
|
_zifs[${zroot_dir}]="(( \${+commands[${1}]} ))"
|
||||||
|
;;
|
||||||
|
-f|--fpath)
|
||||||
|
shift
|
||||||
|
zarg=${1}
|
||||||
|
if [[ ${zarg} != /* ]] zarg=${zroot_dir}/${zarg}
|
||||||
|
zfpaths+=(${zarg})
|
||||||
|
;;
|
||||||
|
-a|--autoload)
|
||||||
|
shift
|
||||||
|
zfunctions+=(${1})
|
||||||
|
;;
|
||||||
|
-s|--source)
|
||||||
|
shift
|
||||||
|
zarg=${1}
|
||||||
|
if [[ ${zarg} != /* ]] zarg=${zroot_dir}/${zarg}
|
||||||
|
zcmds+=('source '${(qqq)zarg:a})
|
||||||
|
;;
|
||||||
|
-c|--cmd)
|
||||||
|
shift
|
||||||
|
zcmds+=(${1//{}/${(qqq)zroot_dir:a}})
|
||||||
|
;;
|
||||||
|
-d|--disabled) _zdisabled_root_dirs+=(${zroot_dir}) ;;
|
||||||
|
*)
|
||||||
|
print -u2 -lR $'<%= red %><%= error %>'${funcfiletrace[1]}$':<%= bold %>'${zname}$':<%= normalred %> Unknown zmodule option <%= bold %>'${1}$'<%= normal %>' '' ${zusage}
|
||||||
|
_zfailed=1
|
||||||
|
return 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
if (( _zflags & 1 )); then
|
||||||
|
_znames+=(${zname})
|
||||||
|
fi
|
||||||
|
if (( _zflags & 2 )); then
|
||||||
|
if [[ ! -e ${zroot_dir} ]]; then
|
||||||
|
print -u2 -R $'<%= red %><%= error %>'${funcfiletrace[1]}$':<%= bold %>'${zname}': '${zroot_dir}$'<%= normalred %> not found<%= normal %>'
|
||||||
|
_zfailed=1
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then
|
||||||
|
zfpaths=(${zroot_dir}/functions(NF))
|
||||||
|
# _* functions are autoloaded by compinit
|
||||||
|
# prompt_*_setup functions are autoloaded by promptinit
|
||||||
|
zfunctions=(${^zfpaths}/^(*~|*.zwc(|.old)|_*|prompt_*_setup)(N-.:t))
|
||||||
|
local -ra prezto_scripts=(${zroot_dir}/init.zsh(N))
|
||||||
|
if (( ${#zfpaths} && ${#prezto_scripts} )); then
|
||||||
|
# this follows the prezto module format, no need to check for other scripts
|
||||||
|
zcmds=('source '${(qqq)^prezto_scripts:a})
|
||||||
|
else
|
||||||
|
# get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first)
|
||||||
|
local -ra zscripts=(${zroot_dir}/(init.zsh|(${zname:t}|${zroot_dir:t}).(zsh|plugin.zsh|zsh-theme|sh))(NOL[1]))
|
||||||
|
zcmds=('source '${(qqq)^zscripts:a})
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then
|
||||||
|
_zimfw_print -u2 -lR $'<%= yellow %><%= warn %>'${funcfiletrace[1]}$':<%= bold %>'${zname}$':<%= normalyellow %> Nothing found to be initialized. Customize the module name, root or initialization with <%= bold %>zmodule<%= normalyellow %> options.<%= normal %>' '' ${zusage}
|
||||||
|
fi
|
||||||
|
# Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating root dir
|
||||||
|
local -r zpre=${zroot_dir}$'\0'
|
||||||
|
_zfpaths+=(${zpre}${^zfpaths})
|
||||||
|
_zfunctions+=(${zpre}${^zfunctions})
|
||||||
|
zcmds=(${zcmds//${HOME}/\${HOME}})
|
||||||
|
_zcmds+=(${zpre}${^zcmds})
|
||||||
|
fi
|
||||||
|
}
|
|
@ -1,8 +1,12 @@
|
||||||
autoload -Uz is-at-least && if ! is-at-least <%= min_zsh_version %>; then
|
autoload -Uz is-at-least && if ! is-at-least <%= min_zsh_version %>; then
|
||||||
print -u2 -PR "%F{red}${0}: Error starting Zim. You're using Zsh version %B${ZSH_VERSION}%b and versions < %B<%= min_zsh_version %>%b are not supported. Upgrade your Zsh.%f"
|
print -u2 -R $'<%= red %>'${0}$': Error starting zimfw. You\'re using Zsh version <%= bold %>'${ZSH_VERSION}$'<%= normalred %> and versions < <%= bold %><%= min_zsh_version %><%= normalred %> are not supported. Upgrade your Zsh.<%= normal %>'
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
autoload -Uz zargs
|
autoload -Uz zargs
|
||||||
|
|
||||||
# Define Zim location
|
if (( ! ${+ZIM_HOME} )); then
|
||||||
if (( ! ${+ZIM_HOME} )) typeset -g ZIM_HOME=${0:A:h}
|
print -u2 -R $'<%= red %>'${0}$': <%= bold %>ZIM_HOME<%= normalred %> not defined<%= normal %>'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# Define zimfw location
|
||||||
|
typeset -g __ZIMFW_FILE=${0}
|
||||||
|
|
|
@ -2,11 +2,11 @@ _zimfw_mv() {
|
||||||
local -a cklines
|
local -a cklines
|
||||||
if cklines=(${(f)"$(command cksum ${1} ${2} 2>/dev/null)"}) && \
|
if cklines=(${(f)"$(command cksum ${1} ${2} 2>/dev/null)"}) && \
|
||||||
[[ ${${(z)cklines[1]}[1,2]} == ${${(z)cklines[2]}[1,2]} ]]; then
|
[[ ${${(z)cklines[1]}[1,2]} == ${${(z)cklines[2]}[1,2]} ]]; then
|
||||||
_zimfw_print -PR "<%= okay %>%B${2}:%b Already up to date"
|
_zimfw_print -R $'<%= okay %><%= bold %>'${2}$':<%= normal %> Already up to date'
|
||||||
else
|
else
|
||||||
if [[ -e ${2} ]]; then
|
if [[ -e ${2} ]]; then
|
||||||
command mv -f ${2}{,.old} || return 1
|
command mv -f ${2}{,.old} || return 1
|
||||||
fi
|
fi
|
||||||
command mv -f ${1} ${2} && _zimfw_print -PR "<%= okay %>%B${2}:%b Updated.${_zrestartmsg}"
|
command mv -f ${1} ${2} && command chmod a+r ${2} && _zimfw_print -R $'<%= okay %><%= bold %>'${2}$':<%= normal %> Updated.'${_zrestartmsg}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,43 @@
|
||||||
_zimfw_build_init() {
|
_zimfw_build_init() {
|
||||||
local -r ztarget=${ZIM_HOME}/init.zsh
|
local -r ztarget=${ZIM_HOME}/init.zsh
|
||||||
# Force update of init.zsh if it's older than .zimrc
|
# Force update of init.zsh if it's older than .zimrc
|
||||||
if [[ ${ztarget} -ot <%= home %>/.zimrc ]]; then
|
if [[ ${ztarget} -ot ${ZIM_CONFIG_FILE:-<%= home %>/.zimrc} ]]; then
|
||||||
command mv -f ${ztarget}{,.old} || return 1
|
command mv -f ${ztarget}{,.old} || return 1
|
||||||
fi
|
fi
|
||||||
_zimfw_mv =(
|
_zimfw_mv =(
|
||||||
print -R "zimfw() { source ${ZIM_HOME}/zimfw.zsh \"\${@}\" }"
|
print -R 'if [[ -e ${ZIM_CONFIG_FILE:-<%= home %>/.zimrc} ]] zimfw() { source '${${(qqq)__ZIMFW_FILE}/${HOME}/\${HOME}}' "${@}" }'
|
||||||
print -R "zmodule() { source ${ZIM_HOME}/zimfw.zsh \"\${@}\" }"
|
local zroot_dir zpre
|
||||||
# Remove all prefixes from _zfpaths, _zfunctions and _zcmds
|
local -a zif_functions zif_cmds zroot_functions zroot_cmds
|
||||||
local -r zpre=$'*\0'
|
local -a zfunctions=(${_zfunctions}) zcmds=(${_zcmds})
|
||||||
print -R 'typeset -g _zim_fpath=('${${_zfpaths#${~zpre}}:A}')'
|
# Keep fpath constant regardless of "if" root dirs, to avoid confusing compinit.
|
||||||
if (( ${#_zfpaths} )) print 'fpath=(${_zim_fpath} ${fpath})'
|
# Move all from zfunctions and zcmds with "if" root dirs prefixes.
|
||||||
if (( ${#_zfunctions} )) print -R 'autoload -Uz -- '${_zfunctions#${~zpre}}
|
for zroot_dir in ${_zroot_dirs}; do
|
||||||
print -R ${(F)_zcmds#${~zpre}}
|
if (( ${+_zifs[${zroot_dir}]} )); then
|
||||||
|
zpre=${zroot_dir}$'\0'
|
||||||
|
zif_functions+=(${(M)zfunctions:#${zpre}*})
|
||||||
|
zif_cmds+=(${(M)zcmds:#${zpre}*})
|
||||||
|
zfunctions=(${zfunctions:#${zpre}*})
|
||||||
|
zcmds=(${zcmds:#${zpre}*})
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
zpre=$'*\0'
|
||||||
|
if (( ${#_zfpaths} )) print -R 'fpath=('${${(qqq)${_zfpaths#${~zpre}}:a}/${HOME}/\${HOME}}' ${fpath})'
|
||||||
|
if (( ${#zfunctions} )) print -R 'autoload -Uz -- '${zfunctions#${~zpre}}
|
||||||
|
for zroot_dir in ${_zroot_dirs}; do
|
||||||
|
zpre=${zroot_dir}$'\0'
|
||||||
|
if (( ${+_zifs[${zroot_dir}]} )); then
|
||||||
|
zroot_functions=(${${(M)zif_functions:#${zpre}*}#${zpre}})
|
||||||
|
zroot_cmds=(${${(M)zif_cmds:#${zpre}*}#${zpre}})
|
||||||
|
if (( ${#zroot_functions} || ${#zroot_cmds} )); then
|
||||||
|
print -R 'if '${_zifs[${zroot_dir}]}'; then'
|
||||||
|
if (( ${#zroot_functions} )) print -R ' autoload -Uz -- '${zroot_functions}
|
||||||
|
if (( ${#zroot_cmds} )) print -R ${(F):- ${^zroot_cmds}}
|
||||||
|
print fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
zroot_cmds=(${${(M)zcmds:#${zpre}*}#${zpre}})
|
||||||
|
if (( ${#zroot_cmds} )) print -R ${(F)zroot_cmds}
|
||||||
|
fi
|
||||||
|
done
|
||||||
) ${ztarget}
|
) ${ztarget}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
_zimfw_build_login_init() {
|
_zimfw_build_login_init() {
|
||||||
local -r ztarget=${ZIM_HOME}/login_init.zsh
|
local -r ztarget=${ZIM_HOME}/login_init.zsh
|
||||||
# Force update of login_init.zsh if it's older than .zimrc
|
# Force update of login_init.zsh if it's older than .zimrc
|
||||||
if [[ ${ztarget} -ot <%= home %>/.zimrc ]]; then
|
if [[ ${ztarget} -ot ${ZIM_CONFIG_FILE:-<%= home %>/.zimrc} ]]; then
|
||||||
command mv -f ${ztarget}{,.old} || return 1
|
command mv -f ${ztarget}{,.old} || return 1
|
||||||
fi
|
fi
|
||||||
_zimfw_mv =(
|
_zimfw_mv =(
|
||||||
print -nR "<%= render_escaped("src/templates/login_init.zsh.erb") %>"
|
print '# Do nothing. This file is deprecated.'
|
||||||
) ${ztarget}
|
) ${ztarget}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
_zimfw_build() {
|
_zimfw_build() {
|
||||||
_zimfw_build_init && _zimfw_build_login_init && _zimfw_print -P '<%= done %>Done with build.'
|
_zimfw_build_init && _zimfw_build_login_init && _zimfw_print 'Done with build.'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,187 +0,0 @@
|
||||||
zmodule() {
|
|
||||||
local -r zusage="Usage: %B${0}%b <url> [%B-n%b|%B--name%b <module_name>] [options]
|
|
||||||
|
|
||||||
Add %Bzmodule%b calls to your %B${ZDOTDIR:-${HOME}}/.zimrc%b file to define the modules to be initialized.
|
|
||||||
The modules are initialized in the same order they are defined.
|
|
||||||
|
|
||||||
<url> Module absolute path or repository URL. The following URL formats
|
|
||||||
are equivalent: %Bfoo%b, %Bzimfw/foo%b, %Bhttps://github.com/zimfw/foo.git%b.
|
|
||||||
%B-n%b|%B--name%b <module_name> Set a custom module name. Default: the last component in <url>.
|
|
||||||
Use slashes inside the name to organize the module into subdirec-
|
|
||||||
tories.
|
|
||||||
|
|
||||||
Repository options:
|
|
||||||
%B-b%b|%B--branch%b <branch_name> Use specified branch when installing and updating the module.
|
|
||||||
Overrides the tag option. Default: the repository default branch.
|
|
||||||
%B-t%b|%B--tag%b <tag_name> Use specified tag when installing and updating the module. Over-
|
|
||||||
rides the branch option.
|
|
||||||
%B-u%b|%B--use%b <%%Bgit%b|%Bdegit%b> Install and update the module using the defined tool. Default is
|
|
||||||
either defined by %Bzstyle ':zim:zmodule' use '%b<%%Bgit%b|%Bdegit%b>%B'%b, or %Bgit%b
|
|
||||||
if none is provided.
|
|
||||||
%Bgit%b requires git itself. Local changes are preserved on updates.
|
|
||||||
%Bdegit%b requires curl or wget, and currently only works with GitHub
|
|
||||||
URLs. Modules install faster and take less disk space. Local
|
|
||||||
changes are lost on updates. Git submodules are not supported.
|
|
||||||
%B--no-submodules%b Don't install or update git submodules.
|
|
||||||
%B-z%b|%B--frozen%b Don't install or update the module.
|
|
||||||
|
|
||||||
Initialization options:
|
|
||||||
%B-f%b|%B--fpath%b <path> Add specified path to fpath. The path is relative to the module
|
|
||||||
root directory. Default: %Bfunctions%b, if the subdirectory exists.
|
|
||||||
%B-a%b|%B--autoload%b <func_name> Autoload specified function. Default: all valid names inside the
|
|
||||||
%Bfunctions%b subdirectory, if any.
|
|
||||||
%B-s%b|%B--source%b <file_path> Source specified file. The file path is relative to the module
|
|
||||||
root directory. Default: %Binit.zsh%b, if the %Bfunctions%b subdirectory
|
|
||||||
also exists, or the largest of the files with name matching
|
|
||||||
%B{init.zsh,module_name.{zsh,plugin.zsh,zsh-theme,sh}}%b, if any.
|
|
||||||
%B-c%b|%B--cmd%b <command> Execute specified command. Occurrences of the %B{}%b placeholder in
|
|
||||||
the command are substituted by the module root directory path.
|
|
||||||
I.e., %B-s 'foo.zsh'%b and %B-c 'source {}/foo.zsh'%b are equivalent.
|
|
||||||
%B-d%b|%B--disabled%b Don't initialize or uninstall the module.
|
|
||||||
|
|
||||||
Setting any initialization option above will disable all the default values from the other
|
|
||||||
initialization options, so only your provided values are used. I.e. these values are either
|
|
||||||
all automatic, or all manual."
|
|
||||||
if [[ ${${funcfiletrace[1]%:*}:t} != .zimrc ]]; then
|
|
||||||
print -u2 -PlR "%F{red}${0}: Must be called from %B<%= home %>/.zimrc%b%f" '' ${zusage}
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
if (( ! # )); then
|
|
||||||
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}: Missing zmodule url%f" '' ${zusage}
|
|
||||||
_zfailed=1
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
local zurl=${1} zmodule=${1:t} ztool zdir ztype zrev zarg
|
|
||||||
local -i zsubmodules=1 zfrozen=0 zdisabled=0
|
|
||||||
local -a zfpaths zfunctions zcmds
|
|
||||||
zstyle -s ':zim:zmodule' use 'ztool' || ztool=git
|
|
||||||
if [[ ${zurl} =~ ^[^:/]+: ]]; then
|
|
||||||
zmodule=${zmodule%.git}
|
|
||||||
elif [[ ${zurl} != /* ]]; then
|
|
||||||
# Count number of slashes
|
|
||||||
case ${#zurl//[^\/]/} in
|
|
||||||
0) zurl=https://github.com/zimfw/${zurl}.git ;;
|
|
||||||
1) zurl=https://github.com/${zurl}.git ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
if [[ ${1} == (-n|--name) ]]; then
|
|
||||||
if (( # < 2 )); then
|
|
||||||
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage}
|
|
||||||
_zfailed=1
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
zmodule=${${1%%/##}##/##}
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
if [[ ${zurl} == /* ]]; then
|
|
||||||
zdir=${zurl%%/##}
|
|
||||||
zurl=
|
|
||||||
else
|
|
||||||
zdir=${ZIM_HOME}/modules/${zmodule}
|
|
||||||
fi
|
|
||||||
while (( # > 0 )); do
|
|
||||||
case ${1} in
|
|
||||||
-b|--branch|-t|--tag|-u|--use|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd)
|
|
||||||
if (( # < 2 )); then
|
|
||||||
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage}
|
|
||||||
_zfailed=1
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case ${1} in
|
|
||||||
-b|--branch|-t|--tag|-u|--use|--no-submodules)
|
|
||||||
if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%b The zmodule option %B${1}%b has no effect for external modules%f"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case ${1} in
|
|
||||||
-b|--branch)
|
|
||||||
shift
|
|
||||||
ztype=branch
|
|
||||||
zrev=${1}
|
|
||||||
;;
|
|
||||||
-t|--tag)
|
|
||||||
shift
|
|
||||||
ztype=tag
|
|
||||||
zrev=${1}
|
|
||||||
;;
|
|
||||||
-u|--use)
|
|
||||||
shift
|
|
||||||
ztool=${1}
|
|
||||||
;;
|
|
||||||
--no-submodules) zsubmodules=0 ;;
|
|
||||||
-z|--frozen) zfrozen=1 ;;
|
|
||||||
-f|--fpath)
|
|
||||||
shift
|
|
||||||
zarg=${1}
|
|
||||||
if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg}
|
|
||||||
zfpaths+=(${zarg})
|
|
||||||
;;
|
|
||||||
-a|--autoload)
|
|
||||||
shift
|
|
||||||
zfunctions+=(${1})
|
|
||||||
;;
|
|
||||||
-s|--source)
|
|
||||||
shift
|
|
||||||
zarg=${1}
|
|
||||||
if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg}
|
|
||||||
zcmds+=("source ${zarg:A}")
|
|
||||||
;;
|
|
||||||
-c|--cmd)
|
|
||||||
shift
|
|
||||||
zcmds+=(${1//{}/${zdir:A}})
|
|
||||||
;;
|
|
||||||
-d|--disabled) zdisabled=1 ;;
|
|
||||||
*)
|
|
||||||
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Unknown zmodule option %B${1}%b%f" '' ${zusage}
|
|
||||||
_zfailed=1
|
|
||||||
return 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
if (( _zflags & 1 )); then
|
|
||||||
_zmodules_zargs+=("${ztool}" "${_zargs_action}" "${zmodule}" "${zdir}" "${zurl}" "${ztype}" "${zrev}" "${zsubmodules}" "${zfrozen}" "${zdisabled}")
|
|
||||||
fi
|
|
||||||
if (( _zflags & 2 )); then
|
|
||||||
if (( zdisabled )); then
|
|
||||||
_zdisabled_dirs+=(${zdir})
|
|
||||||
else
|
|
||||||
if [[ ! -e ${zdir} ]]; then
|
|
||||||
if [[ -z ${zurl} ]]; then
|
|
||||||
print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}: ${zdir}%b not found%f"
|
|
||||||
else
|
|
||||||
print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f"
|
|
||||||
fi
|
|
||||||
_zfailed=1
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then
|
|
||||||
zfpaths=(${zdir}/functions(NF))
|
|
||||||
# _* functions are autoloaded by compinit
|
|
||||||
# prompt_*_setup functions are autoloaded by promptinit
|
|
||||||
zfunctions=(${^zfpaths}/^(*~|*.zwc(|.old)|_*|prompt_*_setup)(N-.:t))
|
|
||||||
local -ra prezto_scripts=(${zdir}/init.zsh(N))
|
|
||||||
if (( ${#zfpaths} && ${#prezto_scripts} )); then
|
|
||||||
# this follows the prezto module format, no need to check for other scripts
|
|
||||||
zcmds=('source '${^prezto_scripts:A})
|
|
||||||
else
|
|
||||||
# get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first)
|
|
||||||
local -ra zscripts=(${zdir}/(init.zsh|${zmodule:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1]))
|
|
||||||
zcmds=('source '${^zscripts:A})
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then
|
|
||||||
_zimfw_print -u2 -PlR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f" '' ${zusage}
|
|
||||||
fi
|
|
||||||
_zdirs+=(${zdir})
|
|
||||||
# Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating modules
|
|
||||||
local -r zpre=${zmodule}$'\0'
|
|
||||||
_zfpaths+=(${zpre}${^zfpaths})
|
|
||||||
_zfunctions+=(${zpre}${^zfunctions})
|
|
||||||
_zcmds+=(${zpre}${^zcmds})
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
|
@ -1,12 +1,25 @@
|
||||||
_zimfw_source_zimrc() {
|
_zimfw_source_zimrc() {
|
||||||
local -r ztarget=<%= home %>/.zimrc _zflags=${1} _zargs_action=${2}
|
<%= render_all("src/functions/*.erb") %>
|
||||||
local -i _zfailed=0
|
{
|
||||||
if ! source ${ztarget} || (( _zfailed )); then
|
local -r ztarget=${ZIM_CONFIG_FILE:-<%= home %>/.zimrc} _zflags=${1}
|
||||||
print -u2 -PR "%F{red}<%= failed %>Failed to source %B${ztarget}%b%f"
|
local -i _zfailed=0
|
||||||
return 1
|
if ! source ${ztarget} || (( _zfailed )); then
|
||||||
fi
|
print -u2 -R $'<%= red %>Failed to source <%= bold %>'${ztarget}$'<%= normal %>'
|
||||||
if (( _zflags & 1 && ${#_zmodules_zargs} == 0 )); then
|
return 1
|
||||||
print -u2 -PR "%F{red}<%= failed %>No modules defined in %B${ztarget}%b%f"
|
fi
|
||||||
return 1
|
if (( _zflags & 1 && ${#_znames} == 0 )); then
|
||||||
fi
|
print -u2 -R $'<%= red %>No modules defined in <%= bold %>'${ztarget}$'<%= normal %>'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# Remove all from _zfpaths, _zfunctions and _zcmds with disabled root dirs prefixes
|
||||||
|
local zroot_dir zpre
|
||||||
|
for zroot_dir in ${_zdisabled_root_dirs}; do
|
||||||
|
zpre=${zroot_dir}$'\0'
|
||||||
|
_zfpaths=(${_zfpaths:#${zpre}*})
|
||||||
|
_zfunctions=(${_zfunctions:#${zpre}*})
|
||||||
|
_zcmds=(${_zcmds:#${zpre}*})
|
||||||
|
done
|
||||||
|
} always {
|
||||||
|
unfunction zmodule
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,18 @@
|
||||||
_zimfw_list_unuseds() {
|
_zimfw_list_unuseds() {
|
||||||
local -i i=1
|
local -i i=1
|
||||||
local -a zinstalled=(${ZIM_HOME}/modules/*(N/))
|
local zinstalled=(${ZIM_HOME}/modules/*(N/))
|
||||||
|
local -r zdirs=(${(v)_zdirs})
|
||||||
# Search into subdirectories
|
# Search into subdirectories
|
||||||
while (( i <= ${#zinstalled} )); do
|
while (( i <= ${#zinstalled} )); do
|
||||||
if (( ${_zdirs[(I)${zinstalled[i]}/*]} || ${_zdisabled_dirs[(I)${zinstalled[i]}/*]} )); then
|
if (( ${zdirs[(I)${zinstalled[i]}/*]} )); then
|
||||||
zinstalled+=(${zinstalled[i]}/*(N/))
|
zinstalled+=(${zinstalled[i]}/*(N/))
|
||||||
zinstalled[i]=()
|
zinstalled[i]=()
|
||||||
else
|
else
|
||||||
(( i++ ))
|
(( i++ ))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
# Unused = all installed dirs not in _zdirs and _zdisabled_dirs
|
# Unused = all installed dirs not in zdirs
|
||||||
_zunused_dirs=(${${zinstalled:|_zdirs}:|_zdisabled_dirs})
|
_zunused_dirs=(${zinstalled:|zdirs})
|
||||||
local zunused
|
local zunused
|
||||||
for zunused in ${_zunused_dirs}; do
|
for zunused (${_zunused_dirs}) _zimfw_print -R $'<%= bold %>'${zunused:t}$':<%= normal %> '${zunused}${1}
|
||||||
_zimfw_print -PR "%B${zunused:t}:%b ${zunused}${1}"
|
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
_zimfw_version_check() {
|
|
||||||
if (( _zprintlevel > 0 )); then
|
|
||||||
local -r ztarget=${ZIM_HOME}/.latest_version
|
|
||||||
# If .latest_version does not exist or was not modified in the last 30 days
|
|
||||||
if [[ -w ${ztarget:h} && ! -f ${ztarget}(#qNm-30) ]]; then
|
|
||||||
# Get latest version (get all `v*` tags from repo, delete `*v` from beginning,
|
|
||||||
# sort in descending `O`rder `n`umerically, and get the `[1]` first)
|
|
||||||
print ${${(On)${(f)"$(command git ls-remote --tags --refs \
|
|
||||||
https://github.com/zimfw/zimfw.git 'v*' 2>/dev/null)"}##*v}[1]} >! ${ztarget} &!
|
|
||||||
fi
|
|
||||||
if [[ -f ${ztarget} ]]; then
|
|
||||||
local -r zlatest_version=$(<${ztarget})
|
|
||||||
if [[ -n ${zlatest_version} && ${_zversion} != ${zlatest_version} ]]; then
|
|
||||||
print -u2 -PlR "%F{yellow}Latest zimfw version is %B${zlatest_version}%b. You're using version %B${_zversion}%b. Run %Bzimfw upgrade%b to upgrade.%f" ''
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
|
@ -1,23 +1,3 @@
|
||||||
_zimfw_check_dumpfile() {
|
_zimfw_check_dumpfile() {
|
||||||
local zdumpfile zfpath zline
|
_zimfw_print -u2 $'<%= yellow %><%= warn %>Deprecated action. This is now handled by the completion module alone.<%= normal %>'
|
||||||
zstyle -s ':zim:completion' dumpfile 'zdumpfile' || zdumpfile=<%= home %>/.zcompdump
|
|
||||||
if [[ -e ${zdumpfile} ]]; then
|
|
||||||
if (( ${+_zim_fpath} )); then
|
|
||||||
local -r zpre=$'*\0'
|
|
||||||
zfpath=(${${_zfpaths#${~zpre}}:A} ${fpath:|_zim_fpath})
|
|
||||||
else
|
|
||||||
zfpath=(${fpath})
|
|
||||||
fi
|
|
||||||
local -r zcomps=(${^zfpath}/^([^_]*|*~|*.zwc(|.old))(N:t))
|
|
||||||
IFS=$' \t' read -rA zline < ${zdumpfile} || return 1
|
|
||||||
if [[ ${zline[2]} -eq ${#zcomps} && ${zline[4]} == ${ZSH_VERSION} ]]; then
|
|
||||||
_zimfw_print -PR "<%= okay %>%B${zdumpfile}:%b Already up to date"
|
|
||||||
else
|
|
||||||
_zimfw_print -PR "<%= okay %>%B${zdumpfile}:%b New completion configuration needs to be dumped. Will do %Bclean-dumpfile%b."
|
|
||||||
_zimfw_clean_dumpfile
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
_zimfw_print -PR "<%= okay %>%B${zdumpfile}:%b Not found"
|
|
||||||
fi
|
|
||||||
_zimfw_print 'Done with check-dumpfile.'
|
|
||||||
}
|
}
|
||||||
|
|
23
src/stage2/50_zimfw_check_version.zsh.erb
Normal file
23
src/stage2/50_zimfw_check_version.zsh.erb
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
_zimfw_check_version() {
|
||||||
|
if (( ${1} )); then
|
||||||
|
if (( ${2} )); then
|
||||||
|
# background check
|
||||||
|
if [[ -w ${_zversion_target:h} ]]; then
|
||||||
|
print -R ${${${(f)"$(GIT_HTTP_LOW_SPEED_LIMIT=1000 GIT_HTTP_LOW_SPEED_TIME=30 command git ls-remote --tags --refs --sort=-v:refname \
|
||||||
|
https://github.com/zimfw/zimfw.git 'v*' 2>/dev/null)"}##*v}[1]} >! ${_zversion_target} &!
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# foreground check
|
||||||
|
local tags
|
||||||
|
tags=$(command git ls-remote --tags --refs --sort=-v:refname https://github.com/zimfw/zimfw.git 'v*') || return 1
|
||||||
|
>! ${_zversion_target} <<<${${${(f)tags}##*v}[1]} || return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ -f ${_zversion_target} ]]; then
|
||||||
|
local -r zlatest_version=$(<${_zversion_target})
|
||||||
|
if [[ -n ${zlatest_version} && ${_zversion} != ${zlatest_version} ]]; then
|
||||||
|
_zimfw_print -u2 -R $'<%= yellow %>Latest zimfw version is <%= bold %>'${zlatest_version}$'<%= normalyellow %>. You\'re using version <%= bold %>'${_zversion}$'<%= normalyellow %>. Run <%= bold %>zimfw upgrade<%= normalyellow %> to upgrade.<%= normal %>'
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
_zimfw_clean_compiled() {
|
_zimfw_clean_compiled() {
|
||||||
# Array with unique dirs. ${ZIM_HOME} or any subdirectory should only occur once.
|
# Array with unique dirs. ${ZIM_HOME} or any subdirectory should only occur once.
|
||||||
local -Ur zscriptdirs=(${ZIM_HOME} ${${_zdirs##${ZIM_HOME}/*}:A})
|
local -Ur zscriptdirs=(${ZIM_HOME:A} ${${(v)_zdirs##${ZIM_HOME:A}/*}:A})
|
||||||
local zopt
|
local zopt
|
||||||
if (( _zprintlevel > 0 )) zopt=-v
|
if (( _zprintlevel > 0 )) zopt=-v
|
||||||
command rm -f ${zopt} ${^zscriptdirs}/**/*.zwc(|.old)(N) && \
|
command rm -f ${zopt} ${^zscriptdirs}/**/*.zwc(|.old)(N) && \
|
||||||
_zimfw_print -P '<%= done %>Done with clean-compiled. Restart your terminal or run %Bzimfw compile%b to re-compile.'
|
_zimfw_print $'Done with clean-compiled. Restart your terminal or run <%= bold %>zimfw compile<%= normal %> to re-compile.'
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,6 @@ _zimfw_clean_dumpfile() {
|
||||||
local zdumpfile zopt
|
local zdumpfile zopt
|
||||||
zstyle -s ':zim:completion' dumpfile 'zdumpfile' || zdumpfile=<%= home %>/.zcompdump
|
zstyle -s ':zim:completion' dumpfile 'zdumpfile' || zdumpfile=<%= home %>/.zcompdump
|
||||||
if (( _zprintlevel > 0 )) zopt=-v
|
if (( _zprintlevel > 0 )) zopt=-v
|
||||||
command rm -f ${zopt} ${zdumpfile}(|.zwc(|.old))(N) && \
|
command rm -f ${zopt} ${zdumpfile}(|.dat|.zwc(|.old))(N) && \
|
||||||
_zimfw_print -P "<%= done %>Done with clean-dumpfile.${_zrestartmsg}"
|
_zimfw_print -R "Done with clean-dumpfile.${_zrestartmsg}"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
_zimfw_compile() {
|
_zimfw_compile() {
|
||||||
# Array with unique dirs. ${ZIM_HOME} or any subdirectory should only occur once.
|
# Compile zimfw scripts
|
||||||
local -Ur zscriptdirs=(${ZIM_HOME} ${${_zdirs##${ZIM_HOME}/*}:A})
|
local zroot_dir zfile
|
||||||
# Compile Zim scripts
|
for zroot_dir in ${_zroot_dirs:|_zdisabled_root_dirs}; do
|
||||||
local zfile
|
if [[ ! -w ${zroot_dir} ]]; then
|
||||||
for zfile in ${^zscriptdirs}/(^*test*/)#*.zsh(|-theme)(N-.); do
|
_zimfw_print -R $'<%= yellow %><%= warn %><%= bold %>'${zroot_dir}$':<%= normalyellow %> No write permission, unable to compile.<%= normal %>'
|
||||||
if [[ ! ${zfile}.zwc -nt ${zfile} ]]; then
|
continue
|
||||||
zcompile -R ${zfile} && _zimfw_print -PR "<%= okay %>%B${zfile}.zwc:%b Compiled"
|
|
||||||
fi
|
fi
|
||||||
|
for zfile in ${zroot_dir}/(^*test*/)#*.zsh(|-theme)(N-.); do
|
||||||
|
if [[ ! ${zfile}.zwc -nt ${zfile} ]]; then
|
||||||
|
zcompile -UR ${zfile} && _zimfw_print -R $'<%= okay %><%= bold %>'${zfile}$'.zwc:<%= normal %> Compiled'
|
||||||
|
fi
|
||||||
|
done
|
||||||
done
|
done
|
||||||
_zimfw_print -P '<%= done %>Done with compile.'
|
_zimfw_print 'Done with compile.'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
_zimfw_info() {
|
_zimfw_info() {
|
||||||
print -R 'zimfw version: '${_zversion}' (built at <%= Time.now.utc %>, previous commit is <%= `git rev-parse --short HEAD | tr -d '\r\n'` %>)'
|
print -R 'zimfw version: '${_zversion}' (built at <%= Time.now.utc %>, previous commit is <%= `git rev-parse --short HEAD | tr -d '\r\n'` %>)'
|
||||||
print -R 'ZIM_HOME: '${ZIM_HOME}
|
local zparam
|
||||||
print -R 'Zsh version: '${ZSH_VERSION}
|
for zparam in LANG ${(Mk)parameters:#LC_*} OSTYPE TERM TERM_PROGRAM TERM_PROGRAM_VERSION ZIM_HOME ZSH_VERSION; do
|
||||||
print -R 'System info: '$(command uname -a)
|
print -R ${(r.22....:.)zparam}${(P)zparam}
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
_zimfw_install_update() {
|
|
||||||
_zimfw_source_zimrc 1 ${1} && zargs -n 10 -P 0 -- "${_zmodules_zargs[@]}" -- _zimfw_run_tool
|
|
||||||
}
|
|
|
@ -1,11 +1,17 @@
|
||||||
_zimfw_uninstall() {
|
_zimfw_uninstall() {
|
||||||
local zopt
|
if (( _zprintlevel <= 0 )); then
|
||||||
if (( _zprintlevel > 0 )) zopt=-v
|
command rm -rf ${_zunused_dirs} || return 1
|
||||||
if (( ${#_zunused_dirs} )); then
|
else
|
||||||
if (( _zprintlevel <= 0 )) || read -q "?Uninstall ${#_zunused_dirs} module(s) listed above [y/N]? "; then
|
local zunused_dir
|
||||||
_zimfw_print
|
print $'Found <%= bold %>'${#_zunused_dirs}$'<%= normal %> unused module(s).'
|
||||||
command rm -rf ${zopt} ${_zunused_dirs} || return 1
|
for zunused_dir in ${_zunused_dirs}; do
|
||||||
fi
|
if read -q "?Uninstall ${zunused_dir} [y/N]? "; then
|
||||||
|
print
|
||||||
|
command rm -rfv ${zunused_dir} || return 1
|
||||||
|
else
|
||||||
|
print
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
print 'Done with uninstall.'
|
||||||
fi
|
fi
|
||||||
_zimfw_print -P '<%= done %>Done with uninstall.'
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
_zimfw_upgrade() {
|
_zimfw_upgrade() {
|
||||||
local -r ztarget=${ZIM_HOME}/zimfw.zsh zurl=https://github.com/zimfw/zimfw/releases/latest/download/zimfw.zsh.gz
|
local -r ztarget=${__ZIMFW_FILE:A} zurl=https://github.com/zimfw/zimfw/releases/latest/download/zimfw.zsh.gz
|
||||||
|
if [[ ! -w ${ztarget:h} ]]; then
|
||||||
|
print -u2 -R $'<%= red %>No write permission to <%= bold %>'${ztarget:h}$'<%= normalred %>. Will not try to upgrade.<%= normal %>'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
{
|
{
|
||||||
if (( ${+commands[curl]} )); then
|
if (( ${+commands[curl]} )); then
|
||||||
command curl -fsSL -o ${ztarget}.new.gz ${zurl} || return 1
|
command curl -fsSL -o ${ztarget}.new.gz ${zurl} || return 1
|
||||||
|
@ -8,7 +12,7 @@ _zimfw_upgrade() {
|
||||||
if (( _zprintlevel <= 1 )) zopt=-q
|
if (( _zprintlevel <= 1 )) zopt=-q
|
||||||
if ! command wget -nv ${zopt} -O ${ztarget}.new.gz ${zurl}; then
|
if ! command wget -nv ${zopt} -O ${ztarget}.new.gz ${zurl}; then
|
||||||
if (( _zprintlevel <= 1 )); then
|
if (( _zprintlevel <= 1 )); then
|
||||||
print -u2 -PR "%F{red}<%= failed %>Failed to download %B${zurl}%b. Use %B-v%b option to see details.%f"
|
print -u2 -R $'<%= red %>Failed to download <%= bold %>'${zurl}$'<%= normalred %>. Use <%= bold %>-v<%= normalred %> option to see details.<%= normal %>'
|
||||||
fi
|
fi
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
@ -17,7 +21,7 @@ _zimfw_upgrade() {
|
||||||
# .latest_version can be outdated and will yield a false warning if zimfw is
|
# .latest_version can be outdated and will yield a false warning if zimfw is
|
||||||
# upgraded before .latest_version is refreshed. Bad thing about having a cache.
|
# upgraded before .latest_version is refreshed. Bad thing about having a cache.
|
||||||
_zimfw_mv ${ztarget}{.new,} && command rm -f ${ZIM_HOME}/.latest_version && \
|
_zimfw_mv ${ztarget}{.new,} && command rm -f ${ZIM_HOME}/.latest_version && \
|
||||||
_zimfw_print -P '<%= done %>Done with upgrade.'
|
_zimfw_print 'Done with upgrade.'
|
||||||
} always {
|
} always {
|
||||||
command rm -f ${ztarget}.new{,.gz}
|
command rm -f ${ztarget}.new{,.gz}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,42 @@
|
||||||
_zimfw_run_list() {
|
_zimfw_run_list() {
|
||||||
local -r ztool=${1} zmodule=${3} zdir=${4} zurl=${5} ztype=${6} zrev=${7}
|
local -r zname=${1}
|
||||||
local -ri zsubmodules=${8} zfrozen=${9} zdisabled=${10}
|
local -r zdir=${_zdirs[${zname}]}
|
||||||
print -PnR "%B${zmodule}:%b ${zdir}"
|
print -nR $'<%= bold %>'${zname}$':<%= normal %> '${zdir}
|
||||||
if [[ -z ${zurl} ]] print -Pn ' (external)'
|
if [[ -z ${_zurls[${zname}]} ]] print -n ' (external)'
|
||||||
if (( ${zfrozen} )) print -Pn ' (frozen)'
|
if (( ${_zfrozens[${zname}]} )) print -n ' (frozen)'
|
||||||
if (( ${zdisabled} )) print -Pn ' (disabled)'
|
if (( ${_zdisabled_root_dirs[(I)${zdir}]} )) print -n ' (disabled)'
|
||||||
print
|
print
|
||||||
if (( _zprintlevel > 1 )); then
|
if (( _zprintlevel > 1 )); then
|
||||||
if [[ ${zfrozen} -eq 0 && -n ${zurl} ]]; then
|
if [[ ${_zfrozens[${zname}]} -eq 0 && -n ${_zurls[${zname}]} ]]; then
|
||||||
print -nR " From: ${zurl}, "
|
if [[ ${_ztools[${zname}]} == mkdir ]]; then
|
||||||
if [[ -z ${zrev} ]]; then
|
print ' From: mkdir'
|
||||||
print -n 'default branch'
|
|
||||||
else
|
else
|
||||||
print -nR "${ztype} ${zrev}"
|
print -nR " From: ${_zurls[${zname}]}, "
|
||||||
|
if [[ -z ${_zrevs[${zname}]} ]]; then
|
||||||
|
print -n 'default branch'
|
||||||
|
else
|
||||||
|
print -nR "${_ztypes[${zname}]} ${_zrevs[${zname}]}"
|
||||||
|
fi
|
||||||
|
print -nR ", using ${_ztools[${zname}]}"
|
||||||
|
if (( ! _zsubmodules[${zname}] )) print -n ', no git submodules'
|
||||||
|
print
|
||||||
fi
|
fi
|
||||||
print -nR ", using ${ztool}"
|
if [[ -n ${_zonpulls[${zname}]} ]] print -R " On-pull: ${_zonpulls[${zname}]}"
|
||||||
if (( ! zsubmodules )) print -nR ', no git submodules'
|
|
||||||
print
|
|
||||||
fi
|
fi
|
||||||
# Match and remove the current module prefix from _zfpaths, _zfunctions and _zcmds
|
# Match the current module dir prefix from _zroot_dirs
|
||||||
local -r zpre=${zmodule}$'\0'
|
local -r zroot_dirs=(${(M)_zroot_dirs:#${zdir}/*})
|
||||||
local -r zfpaths=(${${(M)_zfpaths:#${zpre}*}#${zpre}}) zfunctions=(${${(M)_zfunctions:#${zpre}*}#${zpre}}) zcmds=(${${(M)_zcmds:#${zpre}*}#${zpre}})
|
if (( ${#zroot_dirs} )); then
|
||||||
|
print ' Additional root:'
|
||||||
|
local zroot_dir
|
||||||
|
for zroot_dir in ${zroot_dirs}; do
|
||||||
|
print -nR " ${zroot_dir}"
|
||||||
|
if (( ${_zdisabled_root_dirs[(I)${zroot_dir}]} )) print -n ' (disabled)'
|
||||||
|
print
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
# Match and remove the prefix from _zfpaths, _zfunctions and _zcmds
|
||||||
|
local -r zpre="${(q)zdir}(|/*)"$'\0'
|
||||||
|
local -r zfpaths=(${${(M)_zfpaths:#${~zpre}*}#${~zpre}}) zfunctions=(${${(M)_zfunctions:#${~zpre}*}#${~zpre}}) zcmds=(${${(M)_zcmds:#${~zpre}*}#${~zpre}})
|
||||||
if (( ${#zfpaths} )) print -R ' fpath: '${zfpaths}
|
if (( ${#zfpaths} )) print -R ' fpath: '${zfpaths}
|
||||||
if (( ${#zfunctions} )) print -R ' autoload: '${zfunctions}
|
if (( ${#zfunctions} )) print -R ' autoload: '${zfunctions}
|
||||||
if (( ${#zcmds} )) print -R ' cmd: '${(j:; :)zcmds}
|
if (( ${#zcmds} )) print -R ' cmd: '${(j:; :)zcmds}
|
||||||
|
|
6
src/stage2/70_zimfw_create_dir.zsh.erb
Normal file
6
src/stage2/70_zimfw_create_dir.zsh.erb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
_zimfw_create_dir() {
|
||||||
|
if ! ERR=$(command mkdir -p ${1} 2>&1); then
|
||||||
|
_zimfw_print_error "Error creating ${1}" ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
3
src/stage2/70_zimfw_print_error.zsh.erb
Normal file
3
src/stage2/70_zimfw_print_error.zsh.erb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
_zimfw_print_error() {
|
||||||
|
print -u2 -lR $'<%= clear_line %><%= red %><%= error %><%= bold %>'${_zname}$':<%= normalred %> '${1}$'<%= normal %>' ${2:+${(F):- ${(f)^2}}}
|
||||||
|
}
|
3
src/stage2/70_zimfw_print_okay.zsh.erb
Normal file
3
src/stage2/70_zimfw_print_okay.zsh.erb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
_zimfw_print_okay() {
|
||||||
|
if (( _zprintlevel > ${2:-0} )) print -lR $'<%= clear_line %><%= okay %><%= bold %>'${_zname}$':<%= normal %> '${1} ${3:+${(F):- ${(f)^3}}}
|
||||||
|
}
|
3
src/stage2/70_zimfw_print_warn.zsh.erb
Normal file
3
src/stage2/70_zimfw_print_warn.zsh.erb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
_zimfw_print_warn() {
|
||||||
|
_zimfw_print -u2 -R $'<%= clear_line %><%= yellow %><%= warn %><%= bold %>'${_zname}$':<%= normalyellow %> '${1}$'<%= normal %>'
|
||||||
|
}
|
|
@ -1,41 +0,0 @@
|
||||||
_zimfw_run_tool() {
|
|
||||||
local -r ztool=${1} zaction=${2} zmodule=${3} zdir=${4} zurl=${5}
|
|
||||||
if [[ -z ${zurl} ]]; then
|
|
||||||
if (( _zprintlevel > 1 )) print -u2 -PR <%= clear_line %>"<%= okay %>%B${zmodule}:%b Skipping external module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
local -ri zfrozen=${9}
|
|
||||||
if (( zfrozen )); then
|
|
||||||
if (( _zprintlevel > 1 )) print -u2 -PR <%= clear_line %>"<%= okay %>%B${zmodule}:%b Skipping frozen module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
case ${zaction} in
|
|
||||||
install)
|
|
||||||
if [[ -e ${zdir} ]]; then
|
|
||||||
# Already installed
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
_zimfw_print -nR <%= clear_line %>"Installing ${zmodule}<%= ellipsis %>"
|
|
||||||
;;
|
|
||||||
update)
|
|
||||||
if [[ ! -d ${zdir} ]]; then
|
|
||||||
print -u2 -PR <%= clear_line %>"%F{red}<%= error %>%B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
_zimfw_print -nR <%= clear_line %>"Updating ${zmodule}<%= ellipsis %>"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
print -u2 -PR <%= clear_line %>"%F{red}<%= error %>%B${zmodule}:%b Unknown action ${zaction}%f"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
local zcmd
|
|
||||||
case ${ztool} in
|
|
||||||
<%= render_tools("src/tools/*", "zcmd") %>
|
|
||||||
*)
|
|
||||||
print -u2 -PR "<%= clear_line %>%F{red}<%= error %>%B${zmodule}:%b Unknown tool ${ztool}%f"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
zsh -c ${zcmd} ${ztool} ${_zprintlevel} "${@[2,8]}"
|
|
||||||
}
|
|
13
src/stage2/71_zimfw_pull_print_okay.zsh.erb
Normal file
13
src/stage2/71_zimfw_pull_print_okay.zsh.erb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
_zimfw_pull_print_okay() {
|
||||||
|
# Useb by tools, which run in a subshell
|
||||||
|
if [[ -n ${ONPULL} ]]; then
|
||||||
|
if ! ERR=$(builtin cd -q ${DIR} 2>&1 && builtin eval ${ONPULL} 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during on-pull' ${ERR}
|
||||||
|
return 1
|
||||||
|
elif [[ ${_zprintlevel} -gt 1 && -n ${ERR} ]]; then
|
||||||
|
# Overrides ${3} to include the on-pull output, to be used by _zimfw_print_okay below.
|
||||||
|
builtin set ${1} ${2:-0} ${3:+${3}$'\n'}'On-pull output:'$'\n'${ERR}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
_zimfw_print_okay "${@}"
|
||||||
|
}
|
149
src/stage2/75_zimfw_tool_degit.zsh.erb
Normal file
149
src/stage2/75_zimfw_tool_degit.zsh.erb
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
_zimfw_download_tarball() {
|
||||||
|
if [[ ${URL} =~ <%= url_regex %> ]]; then
|
||||||
|
readonly HOST=${match[3]}
|
||||||
|
readonly REPO=${match[4]%.git}
|
||||||
|
fi
|
||||||
|
if [[ ${HOST} != github.com || -z ${REPO} ]]; then
|
||||||
|
_zimfw_print_error ${URL}$' is not a valid URL. Will not try to '${ACTION}$'. The zimfw degit tool only supports GitHub URLs. Use zmodule option <%= bold %>--use git<%= normalred %> to use git instead.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
readonly HEADERS_TARGET=${DIR}/${TEMP}_headers
|
||||||
|
{
|
||||||
|
readonly INFO=("${(@f)"$(<${INFO_TARGET})"}")
|
||||||
|
# Previous REV is in line 2, reserved for future use.
|
||||||
|
readonly INFO_HEADER=${INFO[3]}
|
||||||
|
readonly TARBALL_URL=https://api.github.com/repos/${REPO}/tarball/${REV}
|
||||||
|
if [[ ${ACTION} == check ]]; then
|
||||||
|
if [[ -z ${INFO_HEADER} ]] return 0
|
||||||
|
if (( ${+commands[curl]} )); then
|
||||||
|
command curl -IfsL -H ${INFO_HEADER} ${TARBALL_URL} >${HEADERS_TARGET}
|
||||||
|
else
|
||||||
|
command wget --spider -qS --header=${INFO_HEADER} ${TARBALL_URL} 2>${HEADERS_TARGET}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if (( ${+commands[curl]} )); then
|
||||||
|
if ! ERR=$(command curl -fsSL ${INFO_HEADER:+-H} ${INFO_HEADER} -o ${TARBALL_TARGET} -D ${HEADERS_TARGET} ${TARBALL_URL} 2>&1); then
|
||||||
|
_zimfw_print_error "Error downloading ${TARBALL_URL} with curl" ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# wget returns 8 when 304 Not Modified, so we cannot use wget's error codes
|
||||||
|
command wget -qS ${INFO_HEADER:+--header=${INFO_HEADER}} -O ${TARBALL_TARGET} ${TARBALL_URL} 2>${HEADERS_TARGET}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
while IFS= read -r HEADER; do
|
||||||
|
HEADER=${${HEADER## ##}%%$'\r'##}
|
||||||
|
if [[ ${HEADER} == HTTP/* ]]; then
|
||||||
|
HTTP_CODE=${${(s: :)HEADER}[2]}
|
||||||
|
elif [[ ${${(L)HEADER%%:*}%% ##} == etag ]]; then
|
||||||
|
ETAG=${${HEADER#*:}## ##}
|
||||||
|
fi
|
||||||
|
done < ${HEADERS_TARGET}
|
||||||
|
if (( HTTP_CODE == 304 )); then
|
||||||
|
# Not Modified
|
||||||
|
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
||||||
|
return 0
|
||||||
|
elif (( HTTP_CODE != 200 )); then
|
||||||
|
_zimfw_print_error "Error downloading ${TARBALL_URL}, HTTP code ${HTTP_CODE}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ -z ${ETAG} ]]; then
|
||||||
|
_zimfw_print_error "Error downloading ${TARBALL_URL}, no ETag header found in response"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${ACTION} == check ]]; then
|
||||||
|
command touch ${TARBALL_TARGET} # Update available
|
||||||
|
else
|
||||||
|
if ! print -lR "${URL}" "${REV}" "If-None-Match: ${ETAG}" >! ${INFO_TARGET} 2>/dev/null; then
|
||||||
|
_zimfw_print_error "Error creating or updating ${INFO_TARGET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
} always {
|
||||||
|
command rm -f ${HEADERS_TARGET} 2>/dev/null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_zimfw_untar_tarball() {
|
||||||
|
if ! ERR=$(command tar -C ${1} -xzf ${TARBALL_TARGET} 2>&1); then
|
||||||
|
_zimfw_print_error "Error extracting ${TARBALL_TARGET}" ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local zsubdir
|
||||||
|
for zsubdir in ${1}/*(/); do
|
||||||
|
if ! ERR=$(command mv -f ${zsubdir}/*(DN) ${1} 2>&1 && command rmdir ${zsubdir} 2>&1); then
|
||||||
|
_zimfw_print_error "Error moving ${zsubdir}" ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_zimfw_tool_degit() {
|
||||||
|
# This runs in a subshell
|
||||||
|
readonly -i SUBMODULES=${6}
|
||||||
|
readonly ACTION=${1} DIR=${2} URL=${3} REV=${5} ONPULL=${7} TEMP=.zdegit_${sysparams[pid]}
|
||||||
|
readonly TARBALL_TARGET=${DIR}/${TEMP}_tarball.tar.gz INFO_TARGET=${DIR}/.zdegit
|
||||||
|
case ${ACTION} in
|
||||||
|
pre)
|
||||||
|
if [[ -e ${DIR} ]]; then
|
||||||
|
if [[ ! -r ${INFO_TARGET} ]]; then
|
||||||
|
_zimfw_print_error $'Module was not installed using zimfw\'s degit. Use zmodule option <%= bold %>-z<%= normalred %>|<%= bold %>--frozen<%= normalred %> to disable this error.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
readonly INFO=("${(@f)"$(<${INFO_TARGET})"}")
|
||||||
|
if [[ ${URL} != ${INFO[1]} ]]; then
|
||||||
|
_zimfw_print_error 'The zimfw degit URL does not match. Expected '${URL}$'. Use zmodule option <%= bold %>-z<%= normalred %>|<%= bold %>--frozen<%= normalred %> to disable this error.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
install)
|
||||||
|
{
|
||||||
|
_zimfw_create_dir ${DIR} && _zimfw_download_tarball && _zimfw_untar_tarball ${DIR} && _zimfw_pull_print_okay Installed || return 1
|
||||||
|
} always {
|
||||||
|
# return 1 does not change ${TRY_BLOCK_ERROR}, only changes ${?}
|
||||||
|
(( TRY_BLOCK_ERROR = ? ))
|
||||||
|
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
||||||
|
if (( TRY_BLOCK_ERROR )) command rm -rf ${DIR} 2>/dev/null
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
check|update)
|
||||||
|
readonly DIR_NEW=${DIR}${TEMP}
|
||||||
|
{
|
||||||
|
_zimfw_download_tarball || return 1
|
||||||
|
if [[ ${ACTION} == check ]]; then
|
||||||
|
if [[ -e ${TARBALL_TARGET} ]]; then
|
||||||
|
_zimfw_print_okay 'Update available'
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
if [[ -e ${TARBALL_TARGET} ]]; then
|
||||||
|
_zimfw_create_dir ${DIR_NEW} && _zimfw_untar_tarball ${DIR_NEW} || return 1
|
||||||
|
if (( ${+commands[diff]} )); then
|
||||||
|
LOG=$(command diff -x '.zdegit*' -x '*.zwc' -x '*.zwc.old' -qr ${DIR} ${DIR_NEW} 2>/dev/null)
|
||||||
|
LOG=${${LOG//${DIR_NEW}/new}//${DIR}/old}
|
||||||
|
fi
|
||||||
|
if ! ERR=$({ command cp -f ${INFO_TARGET} ${DIR_NEW} && \
|
||||||
|
command rm -rf ${DIR} && command mv -f ${DIR_NEW} ${DIR} } 2>&1); then
|
||||||
|
_zimfw_print_error "Error updating ${DIR}" ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_zimfw_pull_print_okay Updated 0 ${LOG} || return 1
|
||||||
|
else
|
||||||
|
_zimfw_pull_print_okay 'Already up to date' || return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
} always {
|
||||||
|
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
||||||
|
command rm -rf ${DIR_NEW} 2>/dev/null
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Check after successful install or update
|
||||||
|
if [[ ${SUBMODULES} -ne 0 && -e ${DIR}/.gitmodules ]]; then
|
||||||
|
_zimfw_print_warn $'Module contains git submodules, which are not supported by zimfw\'s degit. Use zmodule option <%= bold %>--no-submodules<%= normalyellow %> to disable this warning.'
|
||||||
|
fi
|
||||||
|
}
|
97
src/stage2/75_zimfw_tool_git.zsh.erb
Normal file
97
src/stage2/75_zimfw_tool_git.zsh.erb
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
_zimfw_tool_git() {
|
||||||
|
# This runs in a subshell
|
||||||
|
readonly -i SUBMODULES=${6}
|
||||||
|
readonly ACTION=${1} DIR=${2} URL=${3} TYPE=${4} ONPULL=${7}
|
||||||
|
REV=${5}
|
||||||
|
case ${ACTION} in
|
||||||
|
pre)
|
||||||
|
if [[ -e ${DIR} ]]; then
|
||||||
|
if [[ ! -r ${DIR}/.git ]]; then
|
||||||
|
_zimfw_print_error $'Module was not installed using git. Use zmodule option <%= bold %>-z<%= normalred %>|<%= bold %>--frozen<%= normalred %> to disable this error.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${URL} != $(command git -C ${DIR} config --get remote.origin.url) ]]; then
|
||||||
|
_zimfw_print_error 'The git URL does not match. Expected '${URL}.$' Use zmodule option <%= bold %>-z<%= normalred %>|<%= bold %>--frozen<%= normalred %> to disable this error.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
install)
|
||||||
|
if ERR=$(command git clone ${REV:+-b} ${REV} -q --config core.autocrlf=false ${${SUBMODULES:#0}:+--recursive} -- ${URL} ${DIR} 2>&1); then
|
||||||
|
_zimfw_pull_print_okay Installed
|
||||||
|
else
|
||||||
|
_zimfw_print_error 'Error during git clone' ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
check|update)
|
||||||
|
if ! ERR=$(command git -C ${DIR} fetch -pqt origin 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git fetch' ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${TYPE} == branch ]]; then
|
||||||
|
if [[ -z ${REV} ]]; then
|
||||||
|
# Get HEAD remote branch
|
||||||
|
if ! ERR=$(command git -C ${DIR} remote set-head origin -a 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git remote set-head' ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if REV=$(command git -C ${DIR} symbolic-ref --short refs/remotes/origin/HEAD 2>&1); then
|
||||||
|
REV=${REV#origin/}
|
||||||
|
else
|
||||||
|
_zimfw_print_error 'Error during git symbolic-ref' ${REV}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
TO_REV=${REV}@{u}
|
||||||
|
if [[ ${ACTION} == check ]]; then
|
||||||
|
readonly -i BEHIND=$(command git -C ${DIR} rev-list --count ${REV}..${TO_REV} -- 2>/dev/null)
|
||||||
|
if (( BEHIND )); then
|
||||||
|
_zimfw_print_okay "Update available [behind ${BEHIND}]"
|
||||||
|
return 4
|
||||||
|
else
|
||||||
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ ${REV} == $(command git -C ${DIR} describe --tags --exact-match 2>/dev/null) ]]; then
|
||||||
|
if [[ ${ACTION} == check ]]; then
|
||||||
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
_zimfw_pull_print_okay 'Already up to date'
|
||||||
|
return ${?}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ ${ACTION} == check ]]; then
|
||||||
|
_zimfw_print_okay 'Update available'
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
TO_REV=${REV}
|
||||||
|
fi
|
||||||
|
LOG=$(command git -C ${DIR} log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ..${TO_REV} -- 2>/dev/null)
|
||||||
|
if ! ERR=$(command git -C ${DIR} checkout -q ${REV} -- 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git checkout' ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${TYPE} == branch ]]; then
|
||||||
|
if ! OUT=$(command git -C ${DIR} merge --ff-only --no-progress -n 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git merge' ${OUT}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# keep just first line of OUT
|
||||||
|
OUT=${OUT%%($'\n'|$'\r')*}
|
||||||
|
else
|
||||||
|
OUT="Updating to ${TYPE} ${REV}"
|
||||||
|
fi
|
||||||
|
if (( SUBMODULES )); then
|
||||||
|
if ! ERR=$(command git -C ${DIR} submodule update --init --recursive -q -- 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git submodule update' ${ERR}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
_zimfw_pull_print_okay ${OUT} 0 ${LOG}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
15
src/stage2/75_zimfw_tool_mkdir.zsh.erb
Normal file
15
src/stage2/75_zimfw_tool_mkdir.zsh.erb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
_zimfw_tool_mkdir() {
|
||||||
|
# This runs in a subshell
|
||||||
|
readonly -i SUBMODULES=${6}
|
||||||
|
readonly ACTION=${1} DIR=${2} TYPE=${4} REV=${5} ONPULL=${7}
|
||||||
|
if [[ ${ACTION} == pre ]] return 0
|
||||||
|
if [[ -n ${REV} ]]; then
|
||||||
|
_zimfw_print_warn $'The zmodule option <%= bold %>-'${TYPE[1]}$'<%= normalyellow %>|<%= bold %>--'${TYPE}$'<%= normalyellow %> has no effect when using the mkdir tool'
|
||||||
|
fi
|
||||||
|
if (( ! SUBMODULES )); then
|
||||||
|
_zimfw_print_warn $'The zmodule option <%= bold %>--no-submodules<%= normalyellow %> has no effect when using the mkdir tool'
|
||||||
|
fi
|
||||||
|
if [[ ! -d ${DIR} || -n ${ONPULL} ]]; then
|
||||||
|
_zimfw_create_dir ${DIR} && _zimfw_pull_print_okay Created || return 1
|
||||||
|
fi
|
||||||
|
}
|
43
src/stage2/77_zimfw_run_tool.zsh.erb
Normal file
43
src/stage2/77_zimfw_run_tool.zsh.erb
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
_zimfw_run_tool() {
|
||||||
|
local -r _zname=${1}
|
||||||
|
if [[ -z ${_zurls[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_okay 'Skipping external module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if (( _zfrozens[${_zname}] )); then
|
||||||
|
_zimfw_print_okay 'Skipping frozen module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
local -r ztool=${_ztools[${_zname}]}
|
||||||
|
if [[ ${ztool} != (degit|git|mkdir) ]]; then
|
||||||
|
_zimfw_print_error "Unknown tool ${ztool}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
set "${_zdirs[${_zname}]}" "${_zurls[${_zname}]}" "${_ztypes[${_zname}]}" "${_zrevs[${_zname}]}" "${_zsubmodules[${_zname}]}" "${_zonpulls[${_zname}]}"
|
||||||
|
_zimfw_tool_${ztool} pre "${@}" || return 1
|
||||||
|
case ${_zaction} in
|
||||||
|
install)
|
||||||
|
if [[ -e ${_zdirs[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_okay 'Skipping already installed module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
_zimfw_print -nR $'<%= clear_line %>Installing '${_zname}'<%= ellipsis %>'
|
||||||
|
;;
|
||||||
|
check|update)
|
||||||
|
if [[ ! -d ${_zdirs[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_error $'Not installed. Run <%= bold %>zimfw install<%= normalred %> to install.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
if (( _zprintlevel > 1 )) print -nR $'<%= clear_line %>Checking '${_zname}'<%= ellipsis %>'
|
||||||
|
else
|
||||||
|
_zimfw_print -nR $'<%= clear_line %>Updating '${_zname}'<%= ellipsis %>'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
_zimfw_print_error "Unknown action ${_zaction}"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
_zimfw_tool_${ztool} ${_zaction} "${@}"
|
||||||
|
}
|
6
src/stage2/78_zimfw_run_tool_action.zsh.erb
Normal file
6
src/stage2/78_zimfw_run_tool_action.zsh.erb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
_zimfw_run_tool_action() {
|
||||||
|
local -r _zaction=${1}
|
||||||
|
_zimfw_source_zimrc 1 || return 1
|
||||||
|
zargs -n 1 -P 0 -- "${_znames[@]}" -- _zimfw_run_tool
|
||||||
|
return 0
|
||||||
|
}
|
|
@ -1,91 +1,111 @@
|
||||||
zimfw() {
|
zimfw() {
|
||||||
builtin emulate -L zsh -o EXTENDED_GLOB
|
builtin emulate -L zsh -o EXTENDED_GLOB
|
||||||
local -r _zversion='<%= version %>' zusage="Usage: %B${0}%b <action> [%B-q%b|%B-v%b]
|
local -r _zversion='<%= version %>' zusage=$'Usage: <%= bold %>'${0}$'<%= normal %> <action> [<%= bold %>-q<%= normal %>|<%= bold %>-v<%= normal %>]
|
||||||
|
|
||||||
Actions:
|
Actions:
|
||||||
%Bbuild%b Build %B${ZIM_HOME}/init.zsh%b and %B${ZIM_HOME}/login_init.zsh%b.
|
<%= bold %>build<%= normal %> Build <%= bold %>'${ZIM_HOME}$'/init.zsh<%= normal %> and <%= bold %>'${ZIM_HOME}$'/login_init.zsh<%= normal %>.
|
||||||
Also does %Bcheck-dumpfile%b and %Bcompile%b. Use %B-v%b to also see their output.
|
Also does <%= bold %>compile<%= normal %>. Use <%= bold %>-v<%= normal %> to also see its output.
|
||||||
%Bcheck-dumpfile%b Does %Bclean-dumpfile%b if new completion configuration needs to be dumped.
|
<%= bold %>clean<%= normal %> Clean all. Does both <%= bold %>clean-compiled<%= normal %> and <%= bold %>clean-dumpfile<%= normal %>.
|
||||||
%Bclean%b Clean all. Does both %Bclean-compiled%b and %Bclean-dumpfile%b.
|
<%= bold %>clean-compiled<%= normal %> Clean Zsh compiled files.
|
||||||
%Bclean-compiled%b Clean Zsh compiled files.
|
<%= bold %>clean-dumpfile<%= normal %> Clean completion dumpfile.
|
||||||
%Bclean-dumpfile%b Clean completion dumpfile.
|
<%= bold %>compile<%= normal %> Compile Zsh files.
|
||||||
%Bcompile%b Compile Zsh files.
|
<%= bold %>help<%= normal %> Print this help.
|
||||||
%Bhelp%b Print this help.
|
<%= bold %>info<%= normal %> Print zimfw and system info.
|
||||||
%Binfo%b Print Zim and system info.
|
<%= bold %>list<%= normal %> List all modules currently defined in <%= bold %>'${ZIM_CONFIG_FILE:-<%= home %>/.zimrc}$'<%= normal %>.
|
||||||
%Blist%b List all modules currently defined in %B<%= home %>/.zimrc%b.
|
Use <%= bold %>-v<%= normal %> to also see the modules details.
|
||||||
Use %B-v%b to also see the modules details.
|
<%= bold %>init<%= normal %> Same as <%= bold %>install<%= normal %>, but with output tailored to be used at terminal startup.
|
||||||
%Binit%b Same as %Binstall%b, but with output tailored to be used at terminal startup.
|
<%= bold %>install<%= normal %> Install new modules. Also does <%= bold %>build<%= normal %>, <%= bold %>compile<%= normal %>. Use <%= bold %>-v<%= normal %> to also see their
|
||||||
%Binstall%b Install new modules. Also does %Bbuild%b, %Bcheck-dumpfile%b and %Bcompile%b. Use %B-v%b to
|
output, any on-pull output and skipped modules.
|
||||||
also see their output, and see skipped modules.
|
<%= bold %>uninstall<%= normal %> Delete unused modules. Prompts for confirmation. Use <%= bold %>-q<%= normal %> for quiet uninstall.
|
||||||
%Buninstall%b Delete unused modules. Prompts for confirmation. Use %B-q%b for quiet uninstall.
|
<%= bold %>check<%= normal %> Check if updates for current modules are available. Use <%= bold %>-v<%= normal %> to also see
|
||||||
%Bupdate%b Update current modules. Also does %Bbuild%b, %Bcheck-dumpfile%b and %Bcompile%b. Use %B-v%b
|
skipped and up to date modules.
|
||||||
to also see their output, and see skipped modules.
|
<%= bold %>update<%= normal %> Update current modules. Also does <%= bold %>build<%= normal %>, <%= bold %>compile<%= normal %>. Use <%= bold %>-v<%= normal %> to also see their
|
||||||
%Bupgrade%b Upgrade zimfw. Also does %Bcompile%b. Use %B-v%b to also see its output.
|
output, any on-pull output and skipped modules.
|
||||||
%Bversion%b Print zimfw version.
|
<%= bold %>check-version<%= normal %> Check if a new version of zimfw is available.
|
||||||
|
<%= bold %>upgrade<%= normal %> Upgrade zimfw. Also does <%= bold %>compile<%= normal %>. Use <%= bold %>-v<%= normal %> to also see its output.
|
||||||
|
<%= bold %>version<%= normal %> Print zimfw version.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
%B-q%b Quiet (yes to prompts, and only outputs errors)
|
<%= bold %>-q<%= normal %> Quiet (yes to prompts and only outputs errors)
|
||||||
%B-v%b Verbose (outputs more details)"
|
<%= bold %>-v<%= normal %> Verbose (outputs more details)'
|
||||||
local -a _zdisabled_dirs _zdirs _zfpaths _zfunctions _zcmds _zmodules_zargs _zunused_dirs
|
local -Ua _znames _zroot_dirs _zdisabled_root_dirs
|
||||||
|
local -A _zfrozens _ztools _zdirs _zurls _ztypes _zrevs _zsubmodules _zonpulls _zifs
|
||||||
|
local -a _zfpaths _zfunctions _zcmds _zunused_dirs
|
||||||
local -i _zprintlevel=1
|
local -i _zprintlevel=1
|
||||||
if (( # > 2 )); then
|
if (( # > 2 )); then
|
||||||
print -u2 -PlR "%F{red}${0}: Too many options%f" '' ${zusage}
|
print -u2 -lR $'<%= red %>'${0}$': Too many options<%= normal %>' '' ${zusage}
|
||||||
return 2
|
return 2
|
||||||
elif (( # > 1 )); then
|
elif (( # > 1 )); then
|
||||||
case ${2} in
|
case ${2} in
|
||||||
-q) _zprintlevel=0 ;;
|
-q) _zprintlevel=0 ;;
|
||||||
-v) _zprintlevel=2 ;;
|
-v) _zprintlevel=2 ;;
|
||||||
*)
|
*)
|
||||||
print -u2 -PlR "%F{red}${0}: Unknown option ${2}%f" '' ${zusage}
|
print -u2 -lR $'<%= red %>'${0}': Unknown option '${2}$'<%= normal %>' '' ${zusage}
|
||||||
return 2
|
return 2
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! zstyle -t ':zim' disable-version-check; then
|
local -r _zversion_target=${ZIM_HOME}/.latest_version
|
||||||
_zimfw_version_check
|
if ! zstyle -t ':zim' disable-version-check && \
|
||||||
|
[[ ${1} != check-version && -w ${ZIM_HOME} && -w ${__ZIMFW_FILE:A:h} ]]
|
||||||
|
then
|
||||||
|
# If .latest_version does not exist or was not modified in the last 30 days
|
||||||
|
[[ -f ${_zversion_target}(#qNm-30) ]]; local -r zversion_check_force=${?}
|
||||||
|
_zimfw_check_version ${zversion_check_force} 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ ! -w ${ZIM_HOME} && ${1} == (build|check|init|install|update|check-version) ]]; then
|
||||||
|
print -u2 -R $'<%= red %>'${0}$': No write permission to <%= bold %>'${ZIM_HOME}$'<%= normalred %>. Will not try to '${1}$'.<%= normal %>'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
local _zrestartmsg=' Restart your terminal for changes to take effect.'
|
local _zrestartmsg=' Restart your terminal for changes to take effect.'
|
||||||
case ${1} in
|
case ${1} in
|
||||||
build)
|
build)
|
||||||
_zimfw_source_zimrc 2 && _zimfw_build || return 1
|
_zimfw_source_zimrc 2 && _zimfw_build || return 1
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_check_dumpfile && _zimfw_compile
|
_zimfw_compile
|
||||||
;;
|
;;
|
||||||
check-dumpfile) _zimfw_source_zimrc 2 && _zimfw_check_dumpfile ;;
|
check-dumpfile) _zimfw_check_dumpfile ;;
|
||||||
clean) _zimfw_source_zimrc 2 && _zimfw_clean_compiled && _zimfw_clean_dumpfile ;;
|
clean) _zimfw_source_zimrc 0 && _zimfw_clean_compiled && _zimfw_clean_dumpfile ;;
|
||||||
clean-compiled) _zimfw_source_zimrc 2 && _zimfw_clean_compiled ;;
|
clean-compiled) _zimfw_source_zimrc 0 && _zimfw_clean_compiled ;;
|
||||||
clean-dumpfile) _zimfw_clean_dumpfile ;;
|
clean-dumpfile) _zimfw_clean_dumpfile ;;
|
||||||
compile) _zimfw_compile ;;
|
compile) _zimfw_source_zimrc 0 && _zimfw_compile ;;
|
||||||
help) print -PR ${zusage} ;;
|
help) print -R ${zusage} ;;
|
||||||
info) _zimfw_info ;;
|
info) _zimfw_info ;;
|
||||||
list)
|
list)
|
||||||
_zimfw_source_zimrc 3 && zargs -n 10 -- "${_zmodules_zargs[@]}" -- _zimfw_run_list && \
|
_zimfw_source_zimrc 3 && zargs -n 1 -- "${_znames[@]}" -- _zimfw_run_list && \
|
||||||
_zimfw_list_unuseds ' (unused)'
|
_zimfw_list_unuseds ' (unused)'
|
||||||
;;
|
;;
|
||||||
|
check)
|
||||||
|
_zrestartmsg=
|
||||||
|
_zimfw_run_tool_action ${1} || return 1
|
||||||
|
(( _zprintlevel-- ))
|
||||||
|
_zimfw_print -R "Done with ${1}." # Only printed in verbose mode
|
||||||
|
;;
|
||||||
init)
|
init)
|
||||||
_zrestartmsg=
|
_zrestartmsg=
|
||||||
_zimfw_install_update install || return 1
|
_zimfw_run_tool_action install || return 1
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_print -PR "<%= done %>Done with install.${_zrestartmsg}" # Only printed in verbose mode
|
_zimfw_print 'Done with install.' # Only printed in verbose mode
|
||||||
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_check_dumpfile && _zimfw_compile
|
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_compile
|
||||||
;;
|
;;
|
||||||
install|update)
|
install|update)
|
||||||
_zimfw_install_update ${1} || return 1
|
_zimfw_run_tool_action ${1} || return 1
|
||||||
_zimfw_print -PR "<%= done %>Done with ${1}.${_zrestartmsg}"
|
_zimfw_print -R "Done with ${1}.${_zrestartmsg}"
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_check_dumpfile && _zimfw_compile
|
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_compile
|
||||||
;;
|
;;
|
||||||
uninstall) _zimfw_source_zimrc 2 && _zimfw_list_unuseds && _zimfw_uninstall ;;
|
uninstall) _zimfw_source_zimrc 0 && _zimfw_list_unuseds && _zimfw_uninstall ;;
|
||||||
|
check-version) _zimfw_check_version 1 ;;
|
||||||
upgrade)
|
upgrade)
|
||||||
_zimfw_upgrade || return 1
|
_zimfw_upgrade || return 1
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_compile
|
_zimfw_source_zimrc 0 && _zimfw_compile
|
||||||
;;
|
;;
|
||||||
version) print -PR ${_zversion} ;;
|
version) print -R ${_zversion} ;;
|
||||||
*)
|
*)
|
||||||
print -u2 -PlR "%F{red}${0}: Unknown action ${1}%f" '' ${zusage}
|
print -u2 -lR $'<%= red %>'${0}': Unknown action '${1}$'<%= normal %>' '' ${zusage}
|
||||||
return 2
|
return 2
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
# Do nothing. This file is deprecated.
|
|
|
@ -1,139 +0,0 @@
|
||||||
# This runs in a new shell
|
|
||||||
builtin emulate -L zsh -o EXTENDED_GLOB
|
|
||||||
readonly -i PRINTLEVEL=${1} SUBMODULES=${8}
|
|
||||||
readonly ACTION=${2} MODULE=${3} DIR=${4} URL=${5} REV=${7} TEMP=.zdegit_${RANDOM}
|
|
||||||
readonly TARBALL_TARGET=${DIR}/${TEMP}_tarball.tar.gz INFO_TARGET=${DIR}/.zdegit
|
|
||||||
|
|
||||||
print_error() {
|
|
||||||
print -u2 -PlR <%= clear_line %>"%F{red}<%= error %>%B${MODULE}:%b ${1}%f" ${2:+${(F):- ${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
print_okay() {
|
|
||||||
if (( PRINTLEVEL > 0 )); then
|
|
||||||
local -r log=${2:+${(F):- ${(f)^2}}}
|
|
||||||
if [[ ${SUBMODULES} -ne 0 && -e ${DIR}/.gitmodules ]]; then
|
|
||||||
print -u2 -PlR <%= clear_line %>"%F{yellow}<%= warn %>%B${MODULE}:%b ${(C)1}. Module contains git submodules, which are not supported by Zim's degit and were not ${1}. Use zmodule option %B--no-submodules%b to disable this warning.%f" ${log}
|
|
||||||
else
|
|
||||||
print -PlR <%= clear_line %>"<%= okay %>%B${MODULE}:%b ${(C)1}" ${log}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
download_tarball() {
|
|
||||||
local host repo
|
|
||||||
if [[ ${URL} =~ <%= url_regex %> ]]; then
|
|
||||||
host=${match[3]}
|
|
||||||
repo=${match[4]%.git}
|
|
||||||
fi
|
|
||||||
if [[ ${host} != github.com || -z ${repo} ]]; then
|
|
||||||
print_error "${URL} is not a valid GitHub URL. Will not try to ${ACTION}."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
local -r headers_target=${DIR}/${TEMP}_headers
|
|
||||||
{
|
|
||||||
local info_header header etag
|
|
||||||
if [[ -r ${INFO_TARGET} ]]; then
|
|
||||||
local -r info=("${(@f)"$(<${INFO_TARGET})"}")
|
|
||||||
if [[ ${URL} != ${info[1]} ]]; then
|
|
||||||
print_error "URL does not match. Expected ${URL}. Will not try to ${ACTION}."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
# Previous REV is in line 2, reserved for future use.
|
|
||||||
info_header=${info[3]}
|
|
||||||
fi
|
|
||||||
local -r tarball_url=https://api.github.com/repos/${repo}/tarball/${REV}
|
|
||||||
if (( ${+commands[curl]} )); then
|
|
||||||
if ! ERR=$(command curl -fsSL ${info_header:+-H} ${info_header} -o ${TARBALL_TARGET} -D ${headers_target} ${tarball_url} 2>&1); then
|
|
||||||
print_error "Error downloading ${tarball_url} with curl" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# wget returns 8 when 304 Not Modified, so we cannot use wget's error codes
|
|
||||||
command wget -q ${info_header:+--header=${info_header}} -O ${TARBALL_TARGET} -S ${tarball_url} 2>${headers_target}
|
|
||||||
fi
|
|
||||||
local -i http_code
|
|
||||||
while IFS= read -r header; do
|
|
||||||
header=${${header## ##}%%$'\r'##}
|
|
||||||
if [[ ${header} == HTTP/* ]]; then
|
|
||||||
http_code=${${(s: :)header}[2]}
|
|
||||||
elif [[ ${${(L)header%%:*}%% ##} == etag ]]; then
|
|
||||||
etag=${${header#*:}## ##}
|
|
||||||
fi
|
|
||||||
done < ${headers_target}
|
|
||||||
if (( http_code == 304 )); then
|
|
||||||
# Not Modified
|
|
||||||
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
|
||||||
return 0
|
|
||||||
elif (( http_code != 200 )); then
|
|
||||||
print_error "Error downloading ${tarball_url}, HTTP code ${http_code}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [[ -z ${etag} ]]; then
|
|
||||||
print_error "Error downloading ${tarball_url}, no ETag header found in response"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if ! print -lR "${URL}" "${REV}" "If-None-Match: ${etag}" >! ${INFO_TARGET} 2>/dev/null; then
|
|
||||||
print_error "Error creating or updating ${INFO_TARGET}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
} always {
|
|
||||||
command rm -f ${headers_target} 2>/dev/null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
untar_tarball() {
|
|
||||||
if ! ERR=$(command tar -C ${1} --strip=1 -xzf ${TARBALL_TARGET} 2>&1); then
|
|
||||||
print_error "Error extracting ${TARBALL_TARGET}" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
create_dir() {
|
|
||||||
if ! ERR=$(command mkdir -p ${1} 2>&1); then
|
|
||||||
print_error "Error creating ${1}" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
case ${ACTION} in
|
|
||||||
install)
|
|
||||||
{
|
|
||||||
create_dir ${DIR} && download_tarball && untar_tarball ${DIR} && print_okay installed
|
|
||||||
} always {
|
|
||||||
# return 1 does not change ${TRY_BLOCK_ERROR}, only changes ${?}
|
|
||||||
(( TRY_BLOCK_ERROR = ? ))
|
|
||||||
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
|
||||||
if (( TRY_BLOCK_ERROR )) command rm -rf ${DIR} 2>/dev/null
|
|
||||||
}
|
|
||||||
;;
|
|
||||||
update)
|
|
||||||
if [[ ! -r ${INFO_TARGET} ]]; then
|
|
||||||
if (( PRINTLEVEL > 0 )); then
|
|
||||||
print -u2 -PR <%= clear_line %>"%F{yellow}<%= warn %>%B${MODULE}:%b Module was not installed using Zim's degit. Will not try to update. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
readonly DIR_NEW=${DIR}${TEMP}
|
|
||||||
{
|
|
||||||
download_tarball || return 1
|
|
||||||
if [[ ! -e ${TARBALL_TARGET} ]]; then
|
|
||||||
if (( PRINTLEVEL > 0 )) print -PR <%= clear_line %>"<%= okay %>%B${MODULE}:%b Already up to date"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
create_dir ${DIR_NEW} && untar_tarball ${DIR_NEW} || return 1
|
|
||||||
if (( ${+commands[diff]} )); then
|
|
||||||
LOG=$(command diff -x '.zdegit*' -x '*.zwc' -x '*.zwc.old' -qr ${DIR} ${DIR_NEW} 2>/dev/null)
|
|
||||||
LOG=${${LOG//${DIR_NEW}/new}//${DIR}/old}
|
|
||||||
fi
|
|
||||||
if ! ERR=$({ command cp -f ${INFO_TARGET} ${DIR_NEW} && \
|
|
||||||
command rm -rf ${DIR} && command mv -f ${DIR_NEW} ${DIR} } 2>&1); then
|
|
||||||
print_error "Error updating ${DIR}" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
print_okay updated ${LOG}
|
|
||||||
} always {
|
|
||||||
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
|
||||||
command rm -rf ${DIR_NEW} 2>/dev/null
|
|
||||||
}
|
|
||||||
;;
|
|
||||||
esac
|
|
|
@ -1,85 +0,0 @@
|
||||||
# This runs in a new shell
|
|
||||||
builtin emulate -L zsh
|
|
||||||
readonly -i PRINTLEVEL=${1} SUBMODULES=${8}
|
|
||||||
readonly ACTION=${2} MODULE=${3} DIR=${4} URL=${5} TYPE=${6:=branch}
|
|
||||||
REV=${7}
|
|
||||||
|
|
||||||
print_error() {
|
|
||||||
print -u2 -PlR <%= clear_line %>"%F{red}<%= error %>%B${MODULE}:%b ${1}%f" ${2:+${(F):- ${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
print_okay() {
|
|
||||||
if (( PRINTLEVEL > 0 )) print -PlR <%= clear_line %>"<%= okay %>%B${MODULE}:%b ${1}" ${2:+${(F):- ${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
case ${ACTION} in
|
|
||||||
install)
|
|
||||||
if ERR=$(command git clone ${REV:+-b} ${REV} -q --config core.autocrlf=false ${${SUBMODULES:#0}:+--recursive} -- ${URL} ${DIR} 2>&1); then
|
|
||||||
print_okay Installed
|
|
||||||
else
|
|
||||||
print_error 'Error during git clone' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
update)
|
|
||||||
if [[ ! -r ${DIR}/.git ]]; then
|
|
||||||
if (( PRINTLEVEL > 0 )); then
|
|
||||||
print -u2 -PR <%= clear_line %>"%F{yellow}<%= warn %>%B${MODULE}:%b Module was not installed using git. Will not try to update. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
if [[ ${URL} != $(command git -C ${DIR} config --get remote.origin.url) ]]; then
|
|
||||||
print_error "URL does not match. Expected ${URL}. Will not try to update."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if ! ERR=$(command git -C ${DIR} fetch -pq origin 2>&1); then
|
|
||||||
print_error 'Error during git fetch' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [[ ${TYPE} == tag ]]; then
|
|
||||||
if [[ ${REV} == $(command git -C ${DIR} describe --tags --exact-match 2>/dev/null) ]]; then
|
|
||||||
print_okay 'Already up to date'
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
elif [[ -z ${REV} ]]; then
|
|
||||||
# Get HEAD remote branch
|
|
||||||
if ! ERR=$(command git -C ${DIR} remote set-head origin -a 2>&1); then
|
|
||||||
print_error 'Error during git remote set-head' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if REV=$(command git -C ${DIR} symbolic-ref --short refs/remotes/origin/HEAD 2>&1); then
|
|
||||||
REV=${REV#origin/}
|
|
||||||
else
|
|
||||||
print_error 'Error during git symbolic-ref' ${REV}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [[ ${TYPE} == branch ]]; then
|
|
||||||
LOG_REV=${REV}@{u}
|
|
||||||
else
|
|
||||||
LOG_REV=${REV}
|
|
||||||
fi
|
|
||||||
LOG=$(command git -C ${DIR} log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ..${LOG_REV} -- 2>/dev/null)
|
|
||||||
if ! ERR=$(command git -C ${DIR} checkout -q ${REV} -- 2>&1); then
|
|
||||||
print_error 'Error during git checkout' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [[ ${TYPE} == branch ]]; then
|
|
||||||
if ! OUT=$(command git -C ${DIR} merge --ff-only --no-progress -n 2>&1); then
|
|
||||||
print_error 'Error during git merge' ${OUT}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
# keep just first line of OUT
|
|
||||||
OUT=${OUT%%($'\n'|$'\r')*}
|
|
||||||
else
|
|
||||||
OUT="Updating to ${TYPE} ${REV}"
|
|
||||||
fi
|
|
||||||
if (( SUBMODULES )); then
|
|
||||||
if ! ERR=$(command git -C ${DIR} submodule update --init --recursive -q -- 2>&1); then
|
|
||||||
print_error 'Error during git submodule update' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
print_okay ${OUT} ${LOG}
|
|
||||||
;;
|
|
||||||
esac
|
|
|
@ -1,23 +1,27 @@
|
||||||
<%
|
<%
|
||||||
class Zim
|
class Zim
|
||||||
attr_reader :version, :home, :min_zsh_version, :url_regex,
|
attr_reader :version, :home, :min_zsh_version, :url_regex,
|
||||||
:clear_line, :ellipsis, :okay, :warn, :error, :done, :failed
|
:bold, :normal, :red, :normalred, :yellow, :normalyellow, :clear_line, :ellipsis, :okay, :warn, :error
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@version = "1.8.0"
|
@version = "1.15.0-SNAPSHOT"
|
||||||
@home = "${ZDOTDIR:-${HOME}}"
|
@home = "${ZDOTDIR:-${HOME}}"
|
||||||
@min_zsh_version = "5.2"
|
@min_zsh_version = "5.2"
|
||||||
# Matches {ssh,http,https,git}://{user@,}host/org/repo and {user@,}host:org/repo
|
# Matches {ssh,http,https,git}://{user@,}host/org/repo and {user@,}host:org/repo
|
||||||
# but not file:///path/to/repo or /path/to/repo
|
# but not file:///path/to/repo or /path/to/repo
|
||||||
# ${match[3]} contains host, and ${match[4]} contains org/repo
|
# ${match[3]} contains host, and ${match[4]} contains org/repo
|
||||||
@url_regex = "^([^:@/]+://)?([^@]+@)?([^:/]+)[:/]([^/]+/[^/]+)/?$"
|
@url_regex = "^([^:@/]+://)?([^@]+@)?([^:/]+)[:/]([^/]+/[^/]+)/?$"
|
||||||
@clear_line = "$'\\E[2K\\r'"
|
@bold = "\\E[1m"
|
||||||
|
@normal = "\\E[0m"
|
||||||
|
@yellow = "\\E[33m"
|
||||||
|
@normalyellow = "\\E[0;33m"
|
||||||
|
@red = "\\E[31m"
|
||||||
|
@normalred = "\\E[0;31m"
|
||||||
|
@clear_line = "\\E[2K\\r"
|
||||||
@ellipsis = " ..."
|
@ellipsis = " ..."
|
||||||
@okay = "%F{green})%f "
|
@okay = "\\E[32m)\\E[0m "
|
||||||
@warn = "! "
|
@warn = "! "
|
||||||
@error = "x "
|
@error = "x "
|
||||||
@done = ""
|
|
||||||
@failed = ""
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(filename)
|
def render(filename)
|
||||||
|
@ -31,16 +35,6 @@ class Zim
|
||||||
def render_commented(filename)
|
def render_commented(filename)
|
||||||
render(filename).gsub(/^(?=.)/, "# ").gsub(/^$/, "#")
|
render(filename).gsub(/^(?=.)/, "# ").gsub(/^$/, "#")
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_escaped(filename)
|
|
||||||
render(filename).gsub(/(?=\$[^']|"|`)/, "\\\\").gsub(/#\{/, "$\{")
|
|
||||||
end
|
|
||||||
|
|
||||||
def render_tools(pattern, var)
|
|
||||||
Dir[pattern].sort.map { |filename|
|
|
||||||
" #{File.basename(filename, ".zsh.erb")}) #{var}=\"#{render_escaped(filename)}\" ;;"
|
|
||||||
}.join("\n")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
zim = Zim.new
|
zim = Zim.new
|
||||||
%># AUTOMATICALLY GENERATED FILE. EDIT ONLY THE SOURCE FILES AND THEN COMPILE.
|
%># AUTOMATICALLY GENERATED FILE. EDIT ONLY THE SOURCE FILES AND THEN COMPILE.
|
||||||
|
@ -48,8 +42,4 @@ zim = Zim.new
|
||||||
|
|
||||||
<%= zim.render_commented("LICENSE") %>
|
<%= zim.render_commented("LICENSE") %>
|
||||||
<%= zim.render_all("src/stage2/*.erb") %>
|
<%= zim.render_all("src/stage2/*.erb") %>
|
||||||
if [[ ${functrace[1]} == zmodule:* ]]; then
|
zimfw "${@}"
|
||||||
zmodule "${@}"
|
|
||||||
else
|
|
||||||
zimfw "${@}"
|
|
||||||
fi
|
|
||||||
|
|
Loading…
Reference in a new issue