The atload Ice (and other at… ices)#


There are four code-receiving ices: atclone, atpull, atinit, atload. 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.

The atpull is similar, but works:

  • after updating the associated plugin or snippet.

Next, atinit works similar, but is being activated:

  • before loading of the associated plugin or snippet.

Last, 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 zinit ice … invocation – all the passed commands will be executed in the given order.

The 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 Direnv example.

Exclamation mark-preceded atload#

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

the $PATH is being changed within atload ice. Zinit's tracking records $PATH changes and withdraws them on plugin unload, and also shows information loading:

$ zplg report test
Report for test plugin
Source  (reporting enabled)

PATH elements added:

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 unload the test plugin:

$ zinit unload test
--- Unloading plugin: test ---
Removing PATH element /home/sg/share
Unregistering plugin test
Plugin report saved to $LASTREPORT

Practical example#

The same example as in the Tracking precmd-based Plugins article, but using the exclamation mark-preceded atload instead of wrap-track:

# 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 article on 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.