So I'm finally grokking eshell and one feature I want is the following:
Suppose I'm looking at a buffer containing index.html which lives in ~/projects/hacking. I'd like to effortlessly switch to eshell and have it jump to this directory, so I'm ready to start entering commands.
If I had this feature in place, I could go from a file's buffer to a shell quickly and without futzing with changing directories. Using this example I was able to quickly write up a command that does exactly what the above description suggests:
;; Inspired by: http://www.emacswiki.org/emacs/EshellControlFromOtherBuffer
(defun bs-eshell-switch-to-and-change-dir ()
"Switch to eshell and make sure we're in the directory the current buffer is in."
(interactive)
(let ((dir default-directory))
(let ((b (get-buffer eshell-buffer-name)))
(unless b
(eshell)))
(display-buffer eshell-buffer-name t)
(switch-to-buffer-other-window eshell-buffer-name)
(end-of-buffer)
(unless (equalp dir default-directory)
(cd dir)
(eshell-send-input)
(end-of-buffer))))
(global-set-key (kbd "\C-c \C-s") 'bs-eshell-switch-to-and-change-dir)
From any buffer I can hit Control-c Control-s and bam! I'm now at a shell prompt ready type away.
Update: One of the comments below suggested shell-pop-el as a pre-existing implementation of the above concept. I'd definitely recommend using it over what I've got above.
Update: And try: shell-switcher, too!
Nice!
ReplyDeleteI have a similar use case, but maybe more minimal(maybe it's also your case), usually, I want to run some command in the file I'm currently editing.
That's why I wrote this tiny elisp that replaces % for the current file:
http://puntoblogspot.blogspot.com.es/2013/04/running-shell-command-on-current-file.html
> I have a similar use case, but maybe more minimal(maybe it's also your case), usually, I want to run some command in the file I'm currently editing.
ReplyDeleteOooh, that's a handy one, too. I'll have to look into using it.
Thanks!
-Ben
There's aready a package that does this and more: https://github.com/kyagi/shell-pop-el
ReplyDeleteIt's a nice practice to try to search before reimplementing functionality :) (it saves time and millions of "forks" of same idea). Remember: if you think something is a good idea, someone probably already did it for emacs :P
-Fuco
> There's aready a package that does this and more: https://github.com/kyagi/shell-pop-el
ReplyDeleteSweet, thanks for sharing.
> It's a nice practice to try to search before reimplementing functionality :)
It's also a nice practice to implement little bits of functionality to learn something. :)
> Remember: if you think something is a good idea, someone probably already did it for emacs :P
So true.
You should add this to the eshell category page on the emacswiki. That's where I originally searched around for the functionality I had in mind.
I implemented the same idea with more features in shell-switcher. Check the screencast at http://www.youtube.com/watch?v=jNSrrQwcCr4 and the code at https://github.com/DamienCassou/shell-switcher.
ReplyDeleteThanks Damien! I'll have to check that package out.
ReplyDelete