atload Ice (and other
There are four code-receiving ices:
Their role is to receive a portion of Zsh code and execute it in certain
moments of the plugin life-cycle. The
atclone executes it:
- after cloning the associated plugin or snippet to the disk.
atpull is similar, but works:
- after updating the associated plugin or snippet.
atinit works similar, but is being activated:
- before loading of the associated plugin or snippet.
atload is being activated:
- after loading of the associated plugin or snippet.
For convenience, you can use each of the ices multiple times in single
ice … invocation – all the passed commands will be executed in the given order.
atpull ice recognizes a special value:
%atclone (so the code looks i.e.:
atpull'%atclone'). It causes the contents of the
atclone ice to be copied
into the contents of the
atpull ice. This is handy when the same tasks have to
be performed on clone and on update of plugin or snippet, like e.g.: in the
wrap-track ice allows to track and unload plugins that defer their
initialization into a function run later after sourcing the plugin's script –
when the function is called, the plugin is then being fully initialized.
However, if the function is being called from the
atload ice, then there is a
simpler method than the
wrap-track ice – an exclamation mark-preceded
atload contents. The exclamation mark causes the effects of the execution of
the code passed to
atload ice to be recorded.
For example, in the following invocation:
zinit ice id-as'test' atload'!PATH+=:~/share' zinit load zdharma/null
$PATH is being changed within
atload ice. Zinit's tracking records
$PATH changes and withdraws them on plugin unload, and also shows information
$ zplg report test Report for test plugin ---------------------- Source (reporting enabled) PATH elements added: /home/sg/share
As it can be seen, the
atload code is being correctly tracked and can be
unloaded & viewed. Below is the result of using the
unload subcommand to
$ zinit unload test --- Unloading plugin: test --- Removing PATH element /home/sg/share Unregistering plugin test Plugin report saved to $LASTREPORT
The same example as in the Tracking precmd-based Plugins
article, but using the exclamation mark-preceded
atload instead of
# Load when MYPROMPT == 4 zinit ice load'![[ $MYPROMPT = 4 ]]' unload'![[ $MYPROMPT != 4 ]]' \ atload'!source ~/.p10k.zsh; _p9k_precmd' zinit load romkatv/powerlevel10k
The creation of the four additional Zle-widgets will be recorded (see the
wrap-track for more information) – the effect will
be exactly the same as with the
wrap-track ice. The widgets will be properly
deleted/restored on the plugin unload with
MYPROMPT=3 (for example) and the
shell state will be clean, ready to load a new prompt.