"+p
oder "+y
) nicht funktionieren, ist in aller Regel eine Version ohne Clipboard-Modul installiert:
vim --version VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan 2 2014 19:39:32) ... Riesige Version ohne GUI. Ein- (+) oder ausschließlich (-) der Eigenschaften: ... -clipboard +iconv +path_extra -toolbar ...
Um dies zu beheben einfach das Paket vim-gtk
installieren, was auch gleich Gvim auf den Rechner schaufelt. Wer sich an den drei MB extra stört kann es auch mit dem Paket vim-gui-common
versuchen.
sudo apt-get install vim-gtk vim --version VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan 2 2014 19:39:59) Inklusive der Korrekturen: 1-52 Verändert von pkg-vim-maintainers@lists.alioth.debian.org Übersetzt von buildd@ Riesige Version mit GTK2 GUI. Ein- (+) oder ausschließlich (-) der Eigenschaften: +acl +farsi +mouse_netterm +syntax +arabic +file_in_path +mouse_sgr +tag_binary +autocmd +find_in_path -mouse_sysmouse +tag_old_static +balloon_eval +float +mouse_urxvt -tag_any_white +browse +folding +mouse_xterm +tcl ++builtin_terms -footer +multi_byte +terminfo +byte_offset +fork() +multi_lang +termresponse +cindent +gettext -mzscheme +textobjects +clientserver -hangul_input +netbeans_intg +title +clipboard +iconv +path_extra +toolbar +cmdline_compl +insert_expand +perl +user_commands +cmdline_hist +jumplist +persistent_undo +vertsplit +cmdline_info +keymap +postscript +virtualedit +comments +langmap +printer +visual +conceal +libcall +profile +visualextra +cryptv +linebreak +python +viminfo +cscope +lispindent -python3 +vreplace +cursorbind +listcmds +quickfix +wildignore +cursorshape +localmap +reltime +wildmenu +dialog_con_gui +lua +rightleft +windows +diff +menu +ruby +writebackup +digraphs +mksession +scrollbind +X11 +dnd +modify_fname +signs -xfontset -ebcdic +mouse +smartindent +xim +emacs_tags +mouseshape -sniff +xsmp_interact +eval +mouse_dec +startuptime +xterm_clipboard +ex_extra +mouse_gpm +statusline -xterm_save +extra_search -mouse_jsbterm -sun_workshop +xpm]]>
cd ~/.vim/bundle git clone git://github.com/tpope/vim-surround.git
Dieses Plugin erlaubt es (unter anderem), bestimmte umschließende Zeichen der aktuellen Position zu ersetzen. So lassen sich die umschließenden doppelten Anführungszeichen mittels cs"' („change surrounding double quotes to single quotes“) ersetzen. Surround unterstützt Anführungszeichen, Klammern und auch HTML.
Selbst kein Verfechter dieser Konvention, muss ich oft Leerzeichen zum Einrücken verwenden. Ich hatte dies bereits in einem vorigen Artikel angesprochen, der korrigierte aber fälschlicherweise nur die Darstellung. Mittels expandtab
werden die Tabs auch beim Speichern ersetzt:
" Tab width to 2 spaces autocmd FileType html setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType ruby setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType javascript setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType coffee setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType css setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType sass setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType scss setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType haml setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType erb setlocal shiftwidth=2 tabstop=2 expandtab autocmd FileType yaml setlocal shiftwidth=2 tabstop=2 expandtab
" Set line numbers set number
Seit ich den Mouse-Mode aktiviert habe, kann ich keinen Text aus Vim mehr kopieren, indem ich ihn mit der Maus markieren und mittels Rechtsklick kopieren wähle. Dies lässt sich recht einfach beheben, indem man während des Vorgangs die Taste Shift gedrückt hält.
Syntax-Highlighting und Einrückungsunterstützung für Coffeescript:
git clone https://github.com/kchmck/vim-coffee-script.git ~/.vim/bundle/vim-coffee-script]]>
Ja, einer der Vorteile von Vim ist, dass man nicht ständig zur Maus greifen muss. Die Umkehrung kann man aber nicht von der Hand weisen: Ist man gerade mit der Maus unterwegs, ist sie ein recht geeignetes Werkzeug um Cursor zu positionieren oder Textstellen zu markieren. Dies muss lediglich in der .vimrc aktiviert werden:
set mouse=a
Vim verhält sich hier wie die meisten grafischen Editoren: Ein Klick setzt den Cursor, ein Doppelklick markiert ein Wort, ein Dreifachklick markiert eine Zeile. Markierungen kann man dann mit y kopieren oder mit s oder c überschreiben.
Vor allem in Anbetracht der Finger-Wegeoptimierung von Vim hat mich von Anfang an die allgegenwärtige Taste ESC genervt. Die Taste erfordert (jedenfalls bei mir) nicht nur Finger-, sondern eine ganze Handbewegung. Das kann doch nicht im Sinne des Erfinders sein. Vim bietet daher auch von Haus aus eine sinnvolle Alternative:
Als Sublime-Nutzer fällt vor allem auf, wie beschwerlich das Speichern ist. In aller Regel will man dies aus dem Insert-Mode, so dass der Vorgang sehr umständlich ist: In den Normal-Mode wechseln, :w
und Enter – das ist für einen Vorgang den ich täglich hundert mal mache sicher keine Lösung. Lediglich zum Speichern und Schließen des aktuellen Buffers konnte ich mit ZZ einen Shortcut für den Normal-Mode finden. Schließen will ich in aller Regel aber nicht und auch hier müsste man erst den Modus wechseln. Strg+s hat sich bewährt, warum nicht erstmal übernehmen?
:nmap <c-s> :w<CR> :imap <c-s> <Esc>:w<CR>a :imap <c-s> <Esc><c-s>
Die letzte Zeile sorgt dafür, dass man aus dem Insert-Mode auch gleich wieder in den Normal-Mode wechselt. Diese kann wenn gewünscht weggelassen werden.
Im Terminal kann der Shortcut für Probleme sorgen, da er auch zur Flusskontrolle verwendet wird. In KDEs Konsole lässt sich diese in den Profileinstellungen unter Erweitert deaktivieren.
Oft verschiebe ich einzelne Code-Zeilen oder ganze Blöcke. In Sublime markiere ich diese und schiebe sie mit Strg+Shift+↑/↓ hoch bzw. runter. Vim kann das im Endeffekt genauso, hierfür ist aber etwas Konfiguration und ein Plugin erforderlich:
nmap <C-Up> [e nmap <C-Down> ]e vmap <C-Up> [egv vmap <C-Down> ]egv
git clone git://github.com/tpope/vim-unimpaired.git ~/.vim/bundle/vim-unimpaired
Nun kann man mit V in den zeilenbasierten Visual-Mode wechseln, den Bereich markieren und ihn mit Strg+↑/↓ nach oben bzw. unter verschieben.
Zum Abschluss noch ein nettes, von Haus aus eingebautes Feature: Vim erlaubt es, den kompletten Inhalt zwischen zwei logischen Gruppierungszeichen zu editieren. Ein Beispiel:
def distance(a, b)
Um a und b in x und y umzubenennen, muss man lediglich den Cursor auf oder innerhalb der Klammern positionieren. Nun kann man mit ci) den Inhalt der Klammern löschen, in den Insert-Mode wechseln und den neuen Inhalt eingeben. Statt der schließenden kann man auch die öffnende Klammer nutzen. Statt normalen lassen sich auch eckige und geschweifte Klammern oder auch Anführungszeichen adressieren:
Mal sehen, wie ich meinen auf Sublime aufbauenden Entwickleralltag übertragen kann.
Wer, wie ich, wirklich von vorne beginnen will:
rm -rf .vimrc .vim
Terminal auf, ins Projektverzeichnis wechseln, vim
tippen. Wie nun die gewünschte Datei öffnen? In Sublime suche ich „fuzzy“ danach, indem ich Strg+p drücke. Super, genau dieser Workflow hat es in ein Vim-Plugin namens ctrlp.vim geschafft.
mkdir ~/.vim && cd ~/.vim && git clone https://github.com/kien/ctrlp.vim.git bundle/ctrlp.vim && echo "set runtimepath^=~/.vim/bundle/ctrlp.vim" >> ~/.vimrc
In Vim:
:helptags ~/.vim/bundle/ctrlp.vim/doc :q
Beim nächsten Öffnen von Vim sollte man im Projekt sublimisch navigieren können.
Apropos Plugins: Das ist in Sublime schön zentral durch ein Plugin gelöst. Das kann Vim auch: Pathogen. Nach der Installation kann man Plugins direkt als Git-Repo in das Verzeichnis ~/.vim klonen.
mkdir -p ~/.vim/autoload ~/.vim/bundle; curl -Sso ~/.vim/autoload/pathogen.vim https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
Nun noch an den Anfang der ~/.vimrc:
execute pathogen#infect()
Bei den ersten Gehversuchen fällt schnell auf, dass Vim zumindest für Ruby unübliche Tab-Einstellungen nutzt und, welch ein Graus, bei der Einrückung nicht mitdenkt: Man beginnt nach einem Druck auf Enter immer ganz vorne in der Zeile.
Erstmal wieder in die .vimrc, aufgeräumt wird später:
echo "autocmd FileType html setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType ruby setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType javascript setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType coffee setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType css setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType sass setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType scss setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType haml setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType erb setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc echo "autocmd FileType yaml setlocal shiftwidth=2 tabstop=2" >> ~/.vimrc
.vimrc:
set nocompatible set smartindent set autoindent filetype indent on
Nicht wirklich aus Sublime, aber aus einigen Vim-Eindrücken weiß ich um schicke Statusleisten, die den aktuellen Modus farbig hervorheben, den Git-Status zeigen und auch sonst viel Zeug können. Das meiste Zeug ist sicher sinnlos, genau das will ich also auch.
Mal googeln: Da gibt es Powerline, die Super-Allzweckwaffe getarnt als Statusanzeiger. Ist laut eigener Aussage aber etwas komplizierter zu installieren. Wer es einfach will, möge stattdessen Airline nehmen. Machen wir das doch, das kann unser neuer Paketmanager wenigstens ohne Hilfe:
git clone https://github.com/bling/vim-airline ~/.vim/bundle/vim-airline
Vim neustarten, nichts zu sehen. Super. Im Projektwiki dann bisschen was zusammengesucht und ab in die .vimrc:
set laststatus=2 let g:airline_theme = 'powerlineish' if !exists('g:airline_powerline_fonts') " Use the default set of separators with a few customizations let g:airline_left_sep=' ›' " Slightly fancier than '>' let g:airline_right_sep='‹ ' " Slightly fancier than '<' endif
Keine Ahnung was die erste Zeile bedeutet, aber es hilft. Dennoch sieht alles nicht sehr schick aus.
Hier musste ich eine Weile experimentieren, mein Terminal hat die von mir gewählten Farbschemata immer wieder überschrieben. Grund dafür ist, dass ich Vim im Terminal nutze und nicht als Standalone-GUI. Daher muss man auf 256-Farb-Schemen zurückgreifen und Vim ensprechend konfigurieren:
cd ~/.vim/colors wget https://raw.github.com/vim-scripts/wombat256.vim/master/colors/wombat256mod.vim
Und wieder in die .vimrc:
set t_Co=256 color wombat256mod
Das sieht schick aus. Aber vor einem Screenshot noch die...
In der Statusbar soll der aktuelle Branch angezeigt werden. Hierfür wird das (auch außerhalb der Statuszeile überaus mächtige) Plugin fugitive.vim verwendet.
cd ~/.vim/bundle && git clone git://github.com/tpope/vim-fugitive.git
Nun das Plugin mit Airline verknüpfen (natürlich in der .vimrc):
let g:airline#extensions#branch#enabled = 1
Ich bin von meiner ersten Konfiguration recht angetan. Pragmatismus hin oder her, um sich einer Entwicklungsumgebung wohlzufühlen muss das Ganze auch nach etwas aussehen. Ich denke nicht, dass sich Vim vor Sublime verstecken braucht.
Dennoch bleibt der Einstieg hart. Ich habe Vim in den letzten Jahren immer mal wieder für Konfigurationen genutzt und bin mit der HJKL-Navigation recht gut vertraut. Dennoch ist Code-Schreiben noch sehr ungewohnt. Der ständige Modiwechsel verwirrt, wirkt sperrig und überhaupt muss man vor fast jeder Aktion nachdenken. Das wird mit etwas Übung sicher leichter, dennoch werde ich mich demnächst mal umsehen, wie man einige bekannte Verhaltensmuster aus Sublime und Co. übernehmen kann.
]]>