Vim Tips
This post evolves each time I discover an exciting feature of Vim.
Pasting The Output of a Shell Command
Recently, I wondered if it was possible to display in a buffer a specific revision of a file taken from the Git repository of my project without leaving Vim. In my case, the file was removed in the latest branches on the project and I had to backport some logic that was in the original file.
I ended up on the read command and more precisely to the following
form which is documented at :h read!
:
:[range]r[ead] [++opt] !{cmd}
So if I want to fill an empty buffer with the file of a specified commit/branch:
:r !git show old_branch:src/build.sh
Insert The Current Date/Time
We can use the Vim internal strftime()
function with the put
command
(see :h strftime()
and :h put
). Be careful, your system needs to
have this function available.
So to insert the current date in the default format:
:pu=strftime('%c')
Clearing the Search Pattern
When search highlighting is enabled, you might want to clear the
highlighted patterns. One solution could be to disable the highlighting
with the command :noh
. This can be cumbersome because you will need to
enable it again on your next search.
A better way is probably to clear the last search pattern register as shown below:
:let @/=""
More info there: :h noh
and :h registers
My Vim configure options
My options for the vim build I use everyday (here for MacOS, to be adapted for other environments):
% ./configure --prefix="$HOME/.local" \ --enable-multibyte \ --with-tlib=ncurses \ --with-compiledby=stac47 \ --enable-cscope \ --enable-terminal \ --disable-perlinterp \ --disable-rubyinterp \ --disable-python3interp \ --disable-gui \ --without-x \ --disable-luainterp \ --disable-gtktest \ --disable-netbeans \ --enable-fail-if-missing
Opening Files From A Generated Files List
Sometime, we may want to start vim and open the set of files you were working on, let's say a subset of the files in the previous git commit.
That's sound easy, but there's a tiny trick to be aware of.
If you run the following command:
% git diff --name-only HEAD~1 | grep '.rb$' | xargs vim --
You will see the following warning (and maybe, it will break your
terminal display and you will have to use reset
or stty sane
to fix
it).
Vim: Warning: Input is not from a terminal
The reason is that vim expects to be started from a terminal: here vim
is a child process created by xargs
. But there is an option with the
xargs
command as described in the manpage:
-o Reopen stdin as /dev/tty in the child process before executing the command. This is useful if you want xargs to run an interactive application.
So the right command is:
% git diff --name-only HEAD~1 | grep '.rb$' | xargs -o vim --