Extreme Productivity with Screen and Vim
airodig.com
airodig.com
"...cuz you know, like back in the day we didn't have fancy X-windows where we could you-know move around and play on the web and look at porn and shit... so it was uh...you know, I mean... screen... but screen is still definitely, you know.. something that is really good to use."
I do however agree with him that screen and vim are both pretty kickass, I just think he could have done a better job showing why.
I'm actually kind of jealous that it's got 26 upvotes on the frontpage. That's a lot! I love vim and screen with all my heart; maybe I should make a video like this, too. I feel like I could do them justice better.
anyways, your right, I should have organized my thoughts a bit more before getting into this -- I tried writing them down on a notecard beforehand but eventually I was like 'fuck it'
As far a text-editor goes, I'm 100% sure that vim/emacs power users are extremely productive (And I'll wage that this video isn't the best example of productivity vs. a GUI).
What I haven't been able to figure out though is the workflow of vim users when working on real projects, not a single source file.
I rarely spend a lot of time writing code in a single file. I often have to navigate the project folder structure to look for stuff, I need to compare files, work with the source control and so on.. all of this I feel I can do pretty efficiently from within Eclipse.
So how do vim/emacs users do? I presume it's all command line and a lot of typing. Am i wrong?
It's not much typing, and it's definitely faster than switching to a mouse. Both vim and emacs have plugins for easily browsing file systems, and through trees of source code. I personally use a separate terminal window for source control, but that can easily be integrated as well. It's probably a similar workflow to what you're doing now, just without a mouse, and with different key bindings.
Emacs users can also do everything from within Emacs.
That, and once you learn Vim frame management, you become a lot more productive on multiple files.
set wmh=0
set winheight=1000
map <C-j> <C-W>j<C-W>_
map <C-k> <C-W>k<C-W>_
map <C-h> <C-W>h<C-W>_
map <C-l> <C-W>l<C-W>_
This is the first stanza of my vimrc.
I use :sp and :vsp a lot. My capslock key is mapped to behave like left control.
The result is moving between files is a matter of holding capslock and pressing hjk or l.
I argue it's a lot faster than using a mouse or even control and pageup/down in a tab-based IDE.
For opening new files, tab completion is a godsend, and then there's other bonuses to using vim, like
:!grep "def functionImLookingFor" lib/*.py
and, when I'm sifting through logfiles for patterns, :%!grep has become one of my most often used tools.That, and I haven't really fooled around with ctags much, though I've been meaning to for the longest time. No time like the present, I guess.
vim - ctags for class/method navigation - fuzzyfinder for buffer/file system navigation
I will agree that out of the box vim/emacs aren't set up as an IDE replacement. But since you're investing so much time in learning vim modal concept or emacs bindings, the added effort to customize your editor for what you do is a drop in the bucket.
To give examples for the things you mention, emacs has an interface for version control that works consistently with CVS, Subversion, bzr, git, hg, and others. And if you need something more powerful you can use a mode for your specific version control system, like magit for git [1] (I suggest you check this magit screencast [2]). Emacs has a built-in mode to compare files (ediff) [3], to compile programs, run interpreters inside emacs, and so on.
You can see a good overview of these features at [7]. I'm sure you can have a similar setup with vim.
[1] http://philjackson.github.com/magit/
[3] http://tech-rantings.blogspot.com/2008/12/emacs-diff-ediff-t...
[4] http://ecb.sourceforge.net/screenshots/index.html
[5] http://www.gnu.org/software/emacs/manual/html_node/emacs/Gre...
Yes anything is possible and people have done work that probably intersects with what you're looking to do. But rarely does anything just work.
I spend too much time try to make things work and re-implementing features that exist in other environments. I tend to use Textmate and Intellij -- although extending Intellij is such a heavy process that I pretty don't do it.
Actually most of the functionalities I mentioned are available out-of-the-box. Ediff just works. Version control just works. I sent a long list of links so people could have a better idea how these features work. It's true, though, that emacs doesn't have everything out-of-the-box and you need to download and install and configure things, but the same is true for every single editor and IDE out there.
I do believe that people have gotten it configured just right and that they are extremely productive with it. But for me there was just always one more thing that I needed to do from change the appearance slightly or override the annoying way that vc-dir takes over existing windows. I end up just wishing that the defaults were a little bit better.
For Vim, there are a lot of plugins to deal with source trees, but I get along fine with Vim's built-in wildmenu and tab completion. Both options are nicely configurable. For emacs, I like ido-mode. I find it much faster to browse a directory and open a file with the keyboard and tab-completed filenames than to use a mouse.
There are also commands to jump to other files to find the definitions of functions and such. It depends which programming language you're using. Vim has `gd` and friends to do the same. And then there's ctags, which integrates with Vim wonderfully. Editing Lisp code in Emacs with SLIME (for example), `M-.` will jump you to a function definition in another file.
For comparing files, it'd be hard to beat vimdiff, which provides built-in, cross-platform colored diffs of buffers. Emacs has a diff mode as well.
For source control, Vim and Emacs both integrate well with Git and others. You can stage and commit files and such via a keystroke or two. But personally I use the command line for git. (Of course you can embed a shell right in Emacs too.)
Vim and Emacs let you use "windows" (panes) instead of tabs for editing multiple files; don't overlook how awesome this is. You can view files side-by-side without having to close or hide one to open another. It frees short-term memory for other things. Once you set up keybindings for opening, closing, resizing and moving between windows, you're set. I haven't found anything faster or easier to use. Finding and viewing a buffer that isn't currently visible again uses tab-completion and is very fast.
So yes, a lot of typing. But typing is more efficient than mousing, I find. That's part of the point of Vim and Emacs to begin with.
I often work on Ruby on Rails projects in Vim with 2 dozen files open, or more, and have a very easy time.
* Eclipse projects integration * Ant Integration * Dozens of language / markup integrations -- validation (at minimum) * VCS integration * and more... enhancements of vim built-ins
I type very, very little and use the mouse even less (which is more important IMO) though because:
Tab completion both in vim and bash shell.
History both in vim and bash shell.
Things like CDPATH are great.
Vim also has the 'gf' (go-to-file) keybinding while goes to the file under the cursor. It does a good job of being language specific when it needs to be. For example, if the 'file' is a perl module or java package/class it will convert "Text::Utils" or "text.utils" to text/utils{.pm,.java} and search for it in the comma separated list of paths in the &path variable (i.e. :set path). Vim auto-magically imports the perl path @INC or java path into &path (though weird local configurations aren't auto-detected, and you'll just have to write something to inject those paths into &path).
Vim also has things like NERDTree and LustyExplorer that make navigating a dev tree pretty easy.
Some screen hacks:
* I use grabssh[1] so that I can get ssh-agent forwarding working again when I reattach. ssh into the server, run grabssh, then reattach the screen session. Now all of my shells in the session can source fixssh to update their environment.
* I also use a wrapper for ssh within a screen session:
function screen_ssh_wrapper()
{
if [ -n "$STY" ]; then
HOST=$(echo "$1" | sed -e 's,[a-zA-Z0-9],,g')
if [ -z "$HOST" ]; then
# Note: We need all of these vars b/c we want the ssh command to
# inherit them from the current shell, and *not* from screen (for
# long-running screen sessions, those values may be out of date)
screen -t "$1" \
env \
SSH_CLIENT="$SSH_CLIENT" \
SSH_TTY="$SSH_TTY" \
SSH_AUTH_SOCK="$SSH_AUTH_SOCK" \
SSH_CONNECTION="SSH_CONNECTION" \
DISPLAY="$DISPLAY" \
ssh "$@"
return
fi
fi
ssh "$@"
}
alias ssh='screen_ssh_wrapper'
[1] http://samrowe.com/wordpress/ssh-agent-and-gnu-screen/Cache: http://webcache.googleusercontent.com/search?q=cache:http://...
Honestly, I fail to see the advantage to this approach.
Want to quickly send blocks or lines of code to REPLs (and sometimes the command line) in your other screen windows? slime.vim is a vim extension that copies text from your vim session and pastes it into the screen window of your choice.
Personally I have the 'escape' mapped to the back-tick (`), and if I need to send an actual back-tick then I just hit it twice (``). I ripped this setup off from someone on StackOverflow.
From the looks of it, the screen to tmux transition will be the easy part :)
Lately I've been witing LaTeX documents using the Vim Latex-Suite plugin. What I really should do is configure Orgmode to work with my LaTeX preamble and/or revise the LatexSuite so its outlining works more like Vimoutliner.
Either way you can't lose.
EDIT, ty hubb
For example start a bittorrent download running in screen at home and then monitor it from work, reload X without loosing your work, or the canonical example: idle in irc all day without being disconnected.
Vim ftw!
Ruby => http://vimdoc.sourceforge.net/htmldoc/if_ruby.html Python => http://vimdoc.sourceforge.net/htmldoc/if_pyth.html
In insert mode the keys CTRL-P, CTRL-N complete the previous/next matching word. Instead of these keys you can use the supertab plugin, to complete a word by hiting tab in insert mode.
You can choose where vim searches for matching words with the variable 'complete'.
There's also the omnicompletion, which does language specific completes, like method names of an object, by using ctags.
Search for 'omnicomplete <language>' to find the language specific plugin.