This post follows my post on the zsh macros, and explain how to use the zsh hooks "preexec", and how to customize your (right) prompt to give information about something that changes (current branch of git, date, …).
1 Preexec hook
To enable the hooks, the user first has to load the add-zsh-hook function. To achieve that goal, paste the following line:
autoload -U add-zsh-hook
Once it is done, we are able to add and remove a function from a
hook. For our case, we suppose we want to add the hook_function
to the preexec
hook. The following snippet shows how to do that.
hook_function() { echo $1 echo $2 echo $3 } add-zsh-hook preexec hook_function # Add it to the preexec hook. # add-zsh-hook -d preexec hook_function # Remove it for this hook.
Adding and removing a function from a hook is done the same way for every hooks.
The preexec hook is ran each time a command is read by the shell and is about to be executed.
Each function run by the preexec hook receives three arguments. The first one is the line as it was written. The second line is the line with alias expanded and truncated with a certain size limit. The third line is the full line with alias expanded. This thread shows an example. For the macros module, I decided to use the third expression because I want to be able to use my aliases in my macros. But that depends of the application you want to write.
2 Interactive prompt
You know that, there is plenty of ways to customize your prompts in Zsh. I'll just present one of them today, some post about the same topic might follow.
What I present today is how to use your RPROMPT
to print some
information about what you want, and is actualized every time you enter
a new command. It is easy to do, here is the first step:
setopt prompt_subst
Maybe you have recognized the beginning of what you have to add to your configuration file to make the zsh macros module working? Well done! Otherwise, it doesn't matter. So what does this little line? According to the man (man zshoptions): "If set, parameter expansion, command substitution and arithmetic expansion are performed in prompts".
Let's see what happens if we don't set this option:
$ msg="Hello" $ RPROMPT="($msg)" $ (Hello) $ msg="Goodbye" (Hello) $ (Hello) $ echo $RPROMPT (Hello) (Hello) $ (Hello)
Pretty annoying right? In fact, the shell expands $msg
before it is
received by RPROMPT
, so what happens is simple, it prints the value of
what he receives: "Hello" literally. So, let's see what happens if we
re-execute the same sequence of commands with the prompt_subst
option set?
$ setopt prompt_subst $ msg="Hello" $ RPROMPT="($msg)" $ (Hello) $ msg="Goodbye" (Hello) $ (Hello) $ echo $RPROMPT (Hello) (Hello) $ (Hello)
Here is the most common error (I think) that leads your prompt not to expand your
variables. The RPROMPT
command doesn't know there is a
variable to expand, and you have to prevent your shell to expand it by
single-quoting your assignation. This way:
$ RPROMPT='($msg)' $ echo $RPROMPT (Hello) ($msg) $ msg="Goodbye" (Hello) $ (Goodbye)
There is two things to be careful with when you want to have your
prompt expanding some content: the option prompt_subst
must be set,
and the content of the variable RPROMPT
contains the thing you want
to be expanded each time (Think about single quoting it!).
Now let's see what we can do with it! If you are a module writer, you can use a variable as flag (as I did), or give a function that allows to get information about something (as it's done by zsh to allow user to get vcs information).
For getting your branch in your RPROMPT
, I recommend you to read the answer of ko-dos which is very complete. If you just paste the code,
it will work. But you know why it uses single quotes, and why there
must be the prompt_subst option set. For the zstyle part, I didn't try to
understand it. One day, I'll try :)
Let's see how get the time in your right prompt. First, how to get the
time only when calling the date
command? I read this post to find
the right format. It is just date +%T
. Now let's apply what we have
learn:
$ RPROMPT='$(date +%T)' $ (23:42:00)
Now you are just limited by your needs and by your imagination :) If you make your own custom prompt, please share it in comments. I hope you like it!
Oluturpostdo Erica Parish https://wakelet.com/wake/aw9nnBiqZCUGj9Nyq2_SH
ReplyDeleteeremousra
enrhotgast_ni Candy Mizeur
ReplyDeleteclick here
paxwadaloug