Using Vim on Linux
in-silico toxicology gmbh blog
Vim is arguably among the best text editors. Text file editing is an everyday task on Linux, as opposed to e.g. Windows, where operating system and applications are configured graphically (by clicking with the mouse). Moreover, Vim is suitable for programming through plug-ins. This page applies to Debian/Ubuntu.
Installing Vim
sudo apt-get install vim
Add the following to your ~/.bashrc
:
export EDITOR=vim
and do
source ~/.bashrc
Now Vim will be invoked as the default text editor and you can start it by entering vim
at the command line.
Basic setup
Put this in your ~/.vimrc
:
" enable syntax highlighting
syntax on
" use spaces instead of tabs
set tabstop=2
set expandtab
set shiftwidth=2
set softtabstop=2
" always show ^M in DOS files
set fileformats=unix
" my terminal is white on black
set background=dark
highlight Comment ctermbg=blue
highlight Comment ctermfg=white
" always show line and col number and the current command, set title
set ruler
set showcmd
set title titlestring=vim\ %f
" caseinsensitive incremental search
set ignorecase
set incsearch
" Show matching brackets
set showmatch
" disable any autoindenting which could mess with your mouse pastes (and your head)
" (not useing 'set paste' here to keep fancy stuff like tab completion working)
set nocindent
set nosmartindent
set noautoindent
set indentexpr=
filetype indent on
" Enable 256 colors
set t_Co=256
" Maps Alt-[h,j,k,l] to resizing a window split
map <silent> <A-h> <C-w><
map <silent> <A-j> <C-W>-
map <silent> <A-k> <C-W>+
map <silent> <A-l> <C-w>>
" Maps Alt-[s.v] to horizontal and vertical split respectively
map <silent> <A-s> :split<CR>
map <silent> <A-v> :vsplit<CR>
" Maps Alt-[n,p] for moving next and previous window respectively
map <silent> <A-n> <C-w><C-w>
map <silent> <A-p> <C-w><S-w>
Your user experience should now be much better. You will have syntax highlighting, and can split the Vim window using Alt+s
and Alt+v
. See the comments above for more options.
Using Vim
Graphical Cheat Sheet
Learn Vim with the graphical cheat sheet.
Spell Checking
Download spell files. Example: for german, download de.utf-8.spl
, de.utf-8.sug
. As root, copy the downloaded spell files to /usr/share/vim/vim7x/spell/
.
Put the following in your ~/.vimrc
:
" Function to toggle spelling for language 'lang'
func! ToggleSpl( lang )
if &l:spl =~ '\v(^|,)\V'.escape(a:lang,'\').'\v(,|$)'
"Alternatively, since 'spl' may not contain a comma this also
"works:
"if index(split(&l:spl,','),a:lang) != -1
exec 'setl spl-='.a:lang
else
exec 'setl spl+='.a:lang
endif
:setl spell spl
endfun
This function toggles spell checking for a given language on/off. For the language files downloaded, you can now map keys to toggle spell checking for each of them. Example for german:
" Switch on german spelling (in addition to what is active already!)
map <F3> :call ToggleSpl('de')<cr>
Now, F3
will toggle spell checking for the german language. Go ahead and create keybindings for any needed language in the same way, using different keys for each language.
Note: Toggling a specific language on/off will not affect the status of other languages. Arbitrary combinations of languages can be enabled at a time.
To use spell correction, a few commands are needed:
]s
next misspelled word[s
previous misspelled wordz=
view spelling suggestions for a mispelled wordzg
add a word to the dictionaryzug
undo the addition of a word to the dictionary
Note: for the z*
commands, the cursor must be positioned on the corresponding word.
Text wrapping
You can do two things:
- Let Vim format (i.e.change) your text to have shorter lines, by inserting linebreaks. Type
v
to go to visual mode, select text, and pressgq
. - Leave lines as they are, but display them wrapped. This can be toggled by
:set wrap
,:set nowrap
Both are independent.
Auto-Indenting on Paste
In a console or terminal version of Vim, there is no standard procedure to paste text from another application. Instead, the terminal emulates pasting by inserting text into the keyboard buffer, so Vim thinks the text has been typed by the user. After each line ending, Vim moves the cursor so the next line starts with the same indent as the last. However, that will change the indentation already in the pasted text.
Put the following in your ~/.vimrc
:
nnoremap <F2> :set invpaste paste?
set pastetoggle=<F2>
set showmode
The first line sets a mapping so that pressing F2 in normal mode will
invert the 'paste'
{.western} option, and will then show the value of
that option. The second line allows you to press F2 when in insert mode,
to toggle 'paste'
{.western}on and off. The third line enables
displaying whether 'paste'
{.western} is turned on in insert mode.
To paste from another application:
- Start insert mode.
- Press F2 (toggles the
paste
option on). - Use your terminal to paste text from the clipboard.
- Press F2 (toggles the
paste
option off).
Then the existing indentation of the pasted text will be retained.
Using Vim as a pager
The standard tool to display (not edit) text files is Less. However, you also may want to use Vim to display source files. Add
alias vless='vim -u /usr/share/vim/vimcurrent/macros/less.vim'
to your ~/.bash_aliases
, and, after reading in the file, e.g. by a new login, you have the vless
command. When viewing a file with vless
, press v
to switch to the full Vim.
Plugins
Plugins are installed via ‘pathogen’, a vim package manager:
mkdir -p ~/.vim/autoload ~/.vim/bundle; \
curl -Sso ~/.vim/autoload/pathogen.vim \
https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
Add this to your .vimrc
:
execute pathogen#infect()
Now Vim loads all plugins from .vim/bundle
. Install plugins:
cd ~/.vim/bundle
git clone git://github.com/vim-ruby/vim-ruby.git
git clone git://github.com/msanders/snipmate.vim.git
git clone git://github.com/scrooloose/nerdtree.git
git clone git://github.com/vim-scripts/delimitMate.vim.git
git clone git://github.com/jcf/vim-latex.git
git clone git://github.com/ervandew/supertab.git
git clone git://github.com/kien/ctrlp.vim.git bundle/ctrlp.vim
git clone git://github.com/rking/ag.vim
You can install the plugins without git by downloading and expanding them to ~/.vim/bundle
.
For complete descriptions see the the github repositories. Here is a sample:
Nerdtree displays a directory tree to the right. Add this to your .vimrc
:
" map Ctrl+D to nerdtree
map <C-d> :NERDTreeToggle<CR>
CtrlP allows fuzzy file searching. Add this to your .vimrc
:
" map Ctrl+P to invoke CtrlP file finder (http://kien.github.com/ctrlp.vim/)
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
For details consult the respective plugin documentation.
Using Vim with Git
What happens when you type git diff
? You will receive a simple diff, but there is also a way to do a vimdiff
with a side-by-side view of a diff in nice colors! See this tutorial for Vimdiff usage.
Step 1: add this to your .gitconfig
[diff]
external = git_diff_wrapper
[pager]
diff =
Step 2: create a file named git_diff_wrapper
(and put it somewhere in your $PATH
):
#!/bin/sh
vimdiff "$2" "$5"
Step 3: there is still access to the default git diff
behavior with the --no-ext-diff
flag. Here’s a function I put in my bash configuration files:
function git_diff() {
git diff --no-ext-diff -w "$@" | vim -R -
}
where the argument’s meanings are:
--no-ext-diff
: to prevent using vimdiff-w
: to ignore whitespace-R
: to start vim in read-only mode-
: to make vim act as a pager
It turns out to be very useful to be able to alternate between the two versions of diff.
Using Vim with Ruby
Vim and ruby are like beer and pizza – a perfect couple. Following the above will already give you syntax highlighting on ruby files. Here is how you add code completion, i.e. type a command prefix and use the TAB key and be presented with a list of possible completions.
Although ruby support is built into Vim 7.x, the vim-ruby plugin should be installed manually for updates. Also install the SuperTab module, see ‘Plugins’ for both.
Then put this in your .vimrc
" ruby autocompletion
autocmd FileType ruby,eruby set omnifunc=rubycomplete#Complete
autocmd FileType ruby,eruby let g:rubycomplete_buffer_loading = 1
autocmd FileType ruby,eruby let g:rubycomplete_rails = 1
autocmd FileType ruby,eruby let g:rubycomplete_classes_in_global = 1
let g:SuperTabDefaultCompletionType = "<C-X><C-O>"
"improve autocomplete menu color
highlight Pmenu ctermbg=238 gui=bold
Now, for example, if you want to implement a collect
call on some container (such as a hash), you can type in Vim a prefix of collect
and press TAB:
{ ... }.c<TAB>
and Vim will present you with a list of applicable commands, from which you select collect
.
Using Vim with Latex
LaTeX is a system for setting characters (‘types’). Actually, it is a wrapper of macros around TeX, created by Donald Knuth. LaTeX is most widely used In technical writing, especially mathematics, physics, and computer science, because it can typeset mathematical formulae beautifully.
Install LaTeX:
sudo apt-get install \
texlive \
texlive-doc-de \
texlive-latex-extra \
texlive-lang-german \
texlive-science \
texlive-fonts-extra
Install Vim, the Gnome version:
sudo apt-get install \
vim-gnome
Install vim-latex as described under ‘Plugins’.
Basic editing and compiling
Add this to your ~/.vimrc
:
" REQUIRED. This makes **Vim** invoke Latex-Suite when you open a tex file.
filetype plugin on
" IMPORTANT: win32 users will need to have 'shellslash' set so that latex
" can be called correctly.
set shellslash
" IMPORTANT: grep will sometimes skip displaying the file name if you
" search in a singe file. This will confuse Latex-Suite. Set your grep
" program to always generate a file-name.
set grepprg=grep\ -nH\ $*
" Spelling:
autocmd FileType tex setlocal spell spelllang=en_us
Now you can edit and compile .tex
files from within GVim. Load a template document from Dropbox.
gvim technical_report.tex
In Vim, press \ll
to compile to dvi format. Start xdvi (the dvi viewer) to view results. Change something, compile again and reload (Ctrl+R
) the viewer.
Note: Reduce colors and decrease font size in Gvim by setting
colorscheme morning
set guifont=Monospace\ 8
set guioptions-=m
in your .gvimrc
.
GVim can interact with xdvi
If one clicks at some place in xdvi (usually Ctrl+Button1), Vim automatically jumps to the corresponding line in the LaTeX source file (“reverse search”). Also, from inside Vim, one can jump to the corresponding line in xdvi which becomes highlighted (“forward search”).
Note: This shows only the process for GVim, the graphical Vim version. It works analogous for the terminal Vim.
First of all, the LaTeX document need to tell the LaTeX compiler to set marks in the dvi file. Only put:
\usepackage{srcltx}
in the preamble of your latex document, or compile with:
latex --src [your_file.tex]
In your .vimrc
file, add at the end:
:map \ld :execute '!xdvi -editor "vim --servername 'v:servername' \
--remote +\%l \%f" -sourceposition ' . line(".") . expand("%") . \
" '" . expand(Tex_GetMainFileName(':r')) . ".dvi' >/dev/null&" <CR><CR>
Note: The above should be a single line. The \
are not part of the command and are there to indicate that the command continues on the next line!
And in your .bashrc
:
alias gvim='gvim --servername vimtex'
Press \ld
in GVim in normal mode to start xdvi with forward search.
For things to work you must, in order:
- Open the tex file with GVim (after
source
-ing your changed~/.bashrc
), - Open the dvi file with the command
\ld
- reverse-search using Ctrl + left-mouse-click.
blog comments powered by Disqus