Vim – Sebastians Blog https://sgaul.de Neues aus den Softwareminen Sat, 03 May 2014 09:33:44 +0000 de-DE hourly 1 https://wordpress.org/?v=6.1.1 https://sgaul.de/wp-content/uploads/2019/02/cropped-sgaul-2-1-32x32.jpg Vim – Sebastians Blog https://sgaul.de 32 32 Vim-Zwischenablage unter Ubuntu 14.04 https://sgaul.de/2014/05/03/vim-zwischenablage-unter-ubuntu-14-04/ Sat, 03 May 2014 09:33:20 +0000 https://sgaul.de/?p=2664 Vim-Zwischenablage unter Ubuntu 14.04 weiterlesen]]> Wenn in Vim von Ubuntu 14.04 die Zugriffe auf das System-Clipboard (etwa "+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
]]>
Vim Surround, Zeilennummern, Coffeescript und Probleme mit dem Mausmodus https://sgaul.de/2013/11/08/vim-surround-zeilennummern-coffeescript-und-probleme-mit-dem-mausmodus/ Fri, 08 Nov 2013 14:15:33 +0000 https://sgaul.de/?p=2411 Vim Surround, Zeilennummern, Coffeescript und Probleme mit dem Mausmodus weiterlesen]]> Teil 3 meiner Erfahrungen vom Umstieg von Sublime zu Vim.

vim.surround

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.

Leerzeichen statt Tabs

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

Zeilennummern anzeigen

" Set line numbers
set number

Texte aus Vim kopieren

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.

Shift + Mausaktionen
Vim verhält sich, als wäre der Mouse-Mode nicht aktiv

Coffeescript-Unterstützung

Syntax-Highlighting und Einrückungsunterstützung für Coffeescript:

git clone https://github.com/kchmck/vim-coffee-script.git ~/.vim/bundle/vim-coffee-script
]]>
:s/sublime/vim/ – Mäuse, Speichern, Zeilenschieben und mehr https://sgaul.de/2013/10/20/ssublimevim-maeuse-speichern-zeilenschieben-und-mehr/ Sun, 20 Oct 2013 11:55:49 +0000 https://sgaul.de/?p=2399 :s/sublime/vim/ – Mäuse, Speichern, Zeilenschieben und mehr weiterlesen]]> Nach den kosmetischen Details des ersten Artikels geht es heute um einige Standardaktionen, die mich als Entwickler begleiten.

vim-wombat-airline

Maussteuerung

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.

ESC und der Normal-Mode

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:

Strg+c
In den Normal-Mode wechseln

Speichern in der Kommandozeile

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.

Zeilen und Blöcke verschieben

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.

Klammer- und Anführungszeicheninhalte ändern

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:

  • ci)
  • ci}
  • ci]
  • ci"
  • ci'
]]>
Von Sublime zu Vim? Ein Um- und Einstiegsversuch https://sgaul.de/2013/10/17/von-sublime-zu-vim-ein-um-und-einstiegsversuch/ https://sgaul.de/2013/10/17/von-sublime-zu-vim-ein-um-und-einstiegsversuch/#comments Thu, 17 Oct 2013 17:42:37 +0000 https://sgaul.de/?p=2364 Von Sublime zu Vim? Ein Um- und Einstiegsversuch weiterlesen]]> Vim ist so einiges, aber sicher nicht einsteigerfreundlich. Dennoch bin ich immer wieder fasziniert, wie sich erfahrene Anwender durch ihren Code navigieren und in der kleinen Kommandozeile Aktionen auslösen, für die die meisten erstmal ein anderes Programm starten müssen. Zudem ist alles frei konfigurierbar und vor allem freie Software.

Mal sehen, wie ich meinen auf Sublime aufbauenden Entwickleralltag übertragen kann.

Vim zurücksetzen

Wer, wie ich, wirklich von vorne beginnen will:

rm -rf .vimrc .vim

Fuzzy-Search mit Crtlp

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.

<c-p>
Mit Fuzzy-Search suchen
<c-j>/<c-k>
Durch Suchergebnisse navigieren
ctrlp.vim
ctrlp.vim

Plugin-Verwaltung: Pathogen

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()

Grundlegende Formatierung

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.

Tab-Größe nach Dateitypen einstellen

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

Automatische Einrückung

.vimrc:

set nocompatible
set smartindent
set autoindent
filetype indent on

Eine Statuszeile: Airline

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.

Color-Schemes

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...

Git-Unterstützung

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

Ersteindruck

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.

Vim mit Wombat-Theme und Airline-Statusleiste
Vim mit Wombat-Theme und Airline-Statusleiste

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.

]]>
https://sgaul.de/2013/10/17/von-sublime-zu-vim-ein-um-und-einstiegsversuch/feed/ 8