Sometimes even Linux crashes, or a machine loses power, in which case applications lose their history.
This has been an annoyance for me with Emacs and a project that I’m working on that is version controlled with Git, or perhaps I just want to open all of the files in a commit so that they are the most recent in my list of open files in Emacs.
Finally I’ve devised a one line solution, as is noted below.
The first step is to get a list of files from the most recent Git commit, with the output being only the file names — no commit message, author, committer, etc.. Easy enough, where --pretty=format:
means “write no commit summary output”:
% git log --git log --name-only --pretty=format: -1
This will be fed into the command to open a file in Emacs, which in my case is function named ec
. This is Z shell, but should work for Bash.
ec () { for i in $* do emacsclient --no-wait $i done }
Why a function and not an alias? Because evidently emacsclient
only takes one file name as an argument, so it needs to be called once for each file.
Since ec
is a function (and the same restriction applies to aliases as well), it cannot be a command executed by xargs, which would have been:
% git log --name-only --pretty=format: -1 | xargs ec
which produces the message “xargs: ec: No such file or directory”.
The fix is to read each line into a variable, then run the function against it. Voila:
% git log --name-only --pretty=format: -1 | while read -r i; do ec $i; done
More of my Z shell blatherings are over here.