Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: save a command in history from within the widget



Hi Daniel Shahaf,

Thank you very much for responding. To get some context to my use case you can check:

https://www.reddit.com/r/git/comments/jdl11c/can_not_use_some_of_my_aliases_with_bare_repo/
https://stackoverflow.com/questions/64416625/can-not-use-some-of-my-aliases-with-bare-repo

Long story short, as far I know, there is no easy way to use some of my aliases with bare repo. There are some solutions like special git alias like:

example1 = "!f() { .....; }; f"

However, I am feeling much comfortable with this approach. Here, I am trying to change my command on the fly by running it before accept-line. The widget is working perfectly for me except, it is not saving the original buffer in the history.

I need a command or widget like save-to-history so that I can use it the following way:

if [[ $BUFFER =~ ^"g d untrack-all" ]]
then
zle save-to-history $BUFFER
BUFFER="g d rm --cached -r ~"
zle .accept-line
....

That way I can save the value of the $BUFFER in the .zsh_history file in proper format.

And yes you are right when you said:

I'd scratch the approach of checking [[ $BUFFER =~ '^g d foo' ]],
because it'll break as soon as you want to interactively use complex
commands (e.g., sublists, lists, conditions, loops).

But, this script is only for my personal use, so I will continue tweaking it as per my requirement.

Being said that, I actually do not know how to check PREBUFFER before checking BUFFER. I will be glad if you can give me some code to fix this issue.

Thanks and Best Regards,

Ahmad Ismail



On Mon, Oct 26, 2020 at 2:24 AM Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx> wrote:
Ahmad Ismail wrote on Sun, 25 Oct 2020 01:00 +0600:
> I am currently working on a widget. It is used so that I can use my git
> alias also for my dotfiles.
>
> The widget is given bellow:

> Now, the problem is, the commands I am invoking are not being saved in the
> history file.
> For example, if I use:
>
> % g d add-and-commit "Few Modifications"
>
> it saves:
>
> : 1603565685:0;git d add ~ && g d commit -am "Few Modifications"
>
> I know the command below is the command I actually ran. But I want to save
> the command I used as well. Is there any way I can save a command in
> history from within the widget?

I don't understand your use-case.  You stated your purpose is to use
your «g» alias in your dotfiles, but then you gave an example from
interactive use, and in any case dotfiles don't run widgets.

In any case, I'd scratch the approach of checking [[ $BUFFER =~ '^g d foo' ]],
because it'll break as soon as you want to interactively use complex
commands (e.g., sublists, lists, conditions, loops).

I don't understand why you can't drop a script literally called «g»
into a directory in $path and implement in it whatever logic you want.
(Or possibly a function, depending on your use-case.)

As to your widget code, you don't need kill-whole-line if you set
BUFFER explicitly.  Also, you check BUFFER without first checking
PREBUFFER, which is subtly wrong because $PREBUFFER may end with a line
continuation.

Cheers,

Daniel


Messages sorted by: Reverse Date, Date, Thread, Author