dirk postma

mijn aantekeningen . . .

021 - Vim, vi improved, een super editor

Aug 17, 2016 - Comments - linux

Vim

Vim is een editor. Niet eenvoudig om te leren, maar wel erg krachtig. De kracht zit er o.a. in doordat Vim in hoge mate aangepast (geconfigureerd) kan worden aan de eigen behoefte.
De bediening is wel bijzonder, geen gedoe met menu’s of de muis Vim wordt bediend met het toetsenbord.

Installeren

Op de Raspberry staat standaard vim niet geïnstalleerd. Installeren gaat op de bekende manier.

sudo apt-get install vim

Daarna start je het op door in te typen: vi.

Het configuratie bestand van vim heet .vimrc en is te vinden in de home directory. Dat configuratie bestand is belangrijk, daarmee kan vim na eigen behoefte aangepast worden.

Een eenvoudig configuratie bestand zou er als volgt uit kunnen zien.

" default instellingen voor vim
" regelnummering aan
set nu
" set syntax on
syntax on
" case insensitive search
set ic
" highlight search
set hls
" colors
color blue

Vim als standaard editor

Voeg de volgende regels aan .bashrc toe om Vim de standaard editor te maken.

export EDITOR="vi"
export VISUAL="vi"

Bron: http://www.linux.org/threads/set-your-default-editor-for-things-like-crontab-visudo-etc.452/

Gvim

Gvim is een grafische versie van vim. Het werkt op dezelfde manier als vim. De kleuren zijn beter te configureren. Eveneens kan het lettertype aangepast worden, iets dat met vim niet kan. Start Gvim op uit het menu, of door op de prompt in te typen: Gvim.

Voor Gvim is een aanvullend configuratie bestand aanwezig in de home directory van de gebruiker, dat heet: .gvimrc

Python ondersteuning met vim-nox

Om de vele plug-ins in vim te kunnen gebruiken is het nodig dat vim gecompileerd is met python support. Voor de Raspberry is dat niet het geval. Installeer daarom vim-nox, daarmee wordt de ondersteuning dan geregeld.

sudo apt-get install vim-nox

Vim toets combinaties

Vim wordt bediend met het toetsenbord. De functionaliteit is ondergebracht in soms één toets maar meestal in meerdere toetscombinaties. Het is van belang om er een aantal te kennen om lekker met Vim te kunnen werken. Onderstaand een aantal welke ik regelmatig gebruik, er zijn er nog veel meer.

Meest gebruikte

Opdracht Verklaring
:w huidige bestand opslaan
:q afsluiten
:qa alle bestanden sluiten, vim afsluiten
:q! afsluiten en negeer wijzigingen
x wis teken onder de cursor, of highlighted text (visual mode)
X wis teken, werkt zoals backspace
u undo
U undo alle veranderingen van de huidige regel
ctrl-r Redo
Opdracht Verklaring
j, k Naar beneden, omhoog
h, l Naar links, rechts.

Type eventueel eerst een getal en dat de opdracht, om de cursor sneller te verplaatsen.

Opdracht Verklaring
w, W Woord vooruit, woord vooruit spaties overslaan
b, B woord terug, woord terug spaties overslaan
e, E einde (volgend) woord, einde (volgend) woord spatie is seperator
Opdracht Verklaring
0, $ Begin, einde van de regel
^ eerste teken op huidige regel
+, – 1e teken volgende regel, 1e teken vorige regel
(, ) vorige paragraaf, volgende paragraaf
M verplaats cursor naar midden van scherm
H verplaats cursor naar eerst regel op scherm
L verplaats cursor naar laatste regel

Scrollen

Opdracht Verklaring
ctrl-e Scroll 1 regel naar beneden
ctrl-y scroll 1 regel omhoog
z, . herpositioneer huidige regel in het midden van het scherm
z, <enter> herpositioneer huidige regel, op 1e regel in het scherm
z, – herpositioneer huidige regel, op laatste regel in het scherm
z, z herpositioneer huidige regel, in het midden, zelfde kolom!

G, goto commando’s

Opdracht Verklaring
G Ga naar einde van het bestand
g, g Ga naar begin van het bestand
<n>, G Ga naar regel <n>, alternatief: <n>gg

Ook handig zijn hiermee de volgende opdrachten.

Opdracht Verklaring
ctrl-o spring terug naar vorige positie
ctrl-i spring naar volgende positie

F, find = zoeken op dezelfde regel

Opdracht Verklaring
f, <c> zoek vooruit naar <c> op huidige regel
F, <c> zoek terug naar <c> op huidige regel

Window management

Een window is wat anders dan een geopend bestand in Vim. Je kunt meerdere Windows openen voor een zelfde bestand, handig als het om grote bestanden gaat.

Opdracht Verklaring
ctrl w, c Close huidige window
ctrl w, v split window verticaal
ctrl w, s split window horizontaal
ctrl w, o maak huidige window maximaal
ctrl w, <m> maak andere window actief, m = richting

Springen tussen, en van, naar ()[]{}<>

Met % kan gesprongen worden naar het begin teken. Indien de cursor staat op begin of eind teken wordt de cursor verplaatst naar tegenovergestelde teken. Werkt ook over meerdere regels heen. Handig voor het programmeren van code.

Wissen

Onderstaande commando’s kunnen ook vooraf gegaan worden door een getal, dat aangeeft hoevaak het moet worden uitgevoerd.

Opdracht Verklaring
d, w wis huidig woord
d, d wis huidig regel
D verwijder tot het einde van de regel

Regels samenvoegen

Opdracht Verklaring
J Regels samenvoegen

Visual mode

Deze modus is handig voor selecteren van tekst. Deze kan daarna gekopieerd of verwijderd worden.

Opdracht Verklaring
v Begin visual mode, selecteer tekst
V Begin visual mode, selecteer regels
Ctrl-v Begin visual mode in kolom modus, selecteer tekst
O Spring naar eerste of laatste teken in visual mode
x Verwijder naar het register

Toevoegen, invoegen

Opdracht Verklaring
i (kleine letter i) invoegen op de huidige positie
I (hoofdletter i) invoegen voor de 1e tekst op de regel
a enter insert mode to the right of the cursor
A Append at the end of the current line
o Voeg een nieuwe regel toe onder de cursor
O Voeg een nieuwe regel toe boven de cursor

Knippen en plakken (yank and put)

Opdracht Verklaring
y Kopieer geselecteerde tekst (of alleen huidige teken)
Y Kopieer huidige regel
P Plak gekopieerde tekst voor huidige positie, cq huidige regel
p Plak gekopieerde tekst na huidige positie, cq na huidige regel

Verwijderen (x) doet de tekst in het register terecht komen. Kan dus hergebruikt worden met put.

Zoeken

Zoeken begint vanaf huidige de positie.

Opdracht Verklaring
* Snel zoeken, zoek huidige woord op in de tekst
? Zoeken, maar zoek van achteren naar voren
n, N Verder zoeken, n volgende, N vorige
/ Zoeken naar de tekst
:noh Zet alle “gehighlighte” tekst uit

Folding

Met folding kunnen stukken in een document worden worden in- of uitgeklapt. Handig om sneller de structuur van een document te doorgronden, om stukken te kunnen verbergen die even niet van belang zijn. Hoe de folds worden bepaald dat kan weer geconfigureerd worden.

Opdracht Verklaring
zi Allen in of uitklappen (completely fold/unfold)
zj Spring naar next fold, werkt ook als alles is uitgeklapt
zk Ga naar previous fold, werkt ook als alles is uitgeklapt
za Open of sluit één fold
zo Open een fold
zc Sluit huidige fold, als die gesloten is sluit de parent fold

Meer info: : help fold-commands

Tabbladen

Vim kan met tabbladen werken. In Vim zelf viel de functionaliteit mij hiervan tegen. Mogelijk is Gvim hier geschikter voor. De tabbladen opdrachten beginnen met :tab*, onderstaand een paar.

Opdracht Verklaring
:tabnew Opent een nieuw tabblad
:tabc[lose] Sluit een tabblad, dus niet het bestand!

Opgelet, tabbladen werken anders in vim dan in andere editors. Een tabblad bevat één of meerdere windows. Een window bevat een buffer. Een buffer bevat een (geopend) bestand :-).

Autocompletion

Nog een handige functie die ik alweer vergeten was, autocompletion: <ctrl><n>

Buffers

In vim worden bestanden worden geladen in buffers. Dus om te switchen tussen geopende bestanden, moet je switchen tussen buffers.

Opdracht Verklaring
:b <tab> toon volgende geopende bestand, met enter spring je hier naar toe.
:ls! Lijst alle buffers
:ls lijst alle buffers voor geopende bestanden
:b Switch naar buffer nummer om naar zo’n buffer toe te gaan.
b: Er kan dan door alle geopende buffers ge-tabt worden.
:bd buffer delete, de buffer wordt afgesloten, er volgt een waarschuwing als bestand nog niet is opgeslagen is optioneel, indien niets opgegeven wordt huidige buffer gesloten

Idee? Maak onderstaande sneltoets aan om eenvoudig te switchen

:nnoremap <F5> :buffers<CR>:buffer<Space>

Er zijn nog veel commando’s voor het werken met buffers.

Spellingscontrole

Spellingscontrole aanzetten en taal instellen op Nederlands gaat als volgt.

:set spell
:set spellang=nl

Dit is eenmalig. Voor markdown bestanden wil ik dat de spellingscontrole automatisch wordt aangezet. Dus de volgende 2 regels toegevoegd aan het .vimrc bestand.

autocmd FileType markdown setlocal spell
autocmd FileType markdown setlocal spelllang=nl

De spellingscontrole bestanden voor Nederlands waren niet aanwezig in mijn Vim installatie. Vim bood aan deze te downloaden, hetgeen met succes werd uitgevoerd.

Opdracht Verklaring
z= Lijst met suggesties om huidig woord te verbeteren
zg Voeg woord toe aan de woordenlijst
zug Verwijder woord van de woordenlijst
zw Voeg woord toe, aan de foute woorden? Mee oefenen.
]s Volgend fout gespeld woord
[s Vorige fout gespeld woord

Dit zijn slechts enkele spellingscontrole commando’s.

Bronnen

Registers

Kort en zeker niet volledig. Registers zijn een soort klemborden. Er zijn named en unnamed registers. De informatie van registers blijft aanwezig, ook nadat Vim wordt afgesloten.

Opdracht Verklaring
:reg toon inhoud van alle registers
:reg a toon de inhoud van register a
“ap register opdracht, a = te gebruiken register, p = paste
“ay vul register a

Opgepast alleen " typen werkt vaak niet, dus type ".

Bronnen

Vimgrep, zoeken met de foutbuffer

Met :vimgrep kan het gehele document worden doorzocht, en het en het zoek resultaat in een lijstje worden getoond.

Opdracht Verklaring
:vimgrep zoekwaarde % Het % teken is verplicht! Het resultaat wordt bewaard in de “error list” van vim, open deze met :copen
:cn Spring naar volgende
:cp Spring naar vorige

Sessies

Vim heeft een oplossing ingebouwd om de gehele sessie op te slaan en te restoren. Geopende bestanden en cursor posities worden opgeslagen zodat je een volgende keer zo verder kunt waar je gebleven was.

Opdracht Verklaring
:mksession Huidige sessie opslaan, eventueel kan een bestandsnaam worden opgegeven, indien niet dan doet vim dat.
:source Een sessie herstellen, met een bestandsnaam.

Om het werken met sessies te vereenvoudigen, heb ik hiervoor 2 functie toetsen geconfigureerd.

map <F2> :mksession! ~/vim_session <cr> " Quick write session with F2
map <F3> :source ~/vim_session <cr>     " And load session with F3

Bron: http://stackoverflow.com/questions/1416572/vi-vim-restore-opened-files

Bookmarks

Met bookmarks kan in vim snel gesprongen worden naar verschillende locaties in een document en zelfs naar verschillende documenten.

Opdracht Verklaring
m Bijvoorbeeld ma, de markering a wordt gemaakt.
’ gevolgd door een spatie, met teken, keer terug naar de markering
a-z Markeringen in het huidige document, local bookmarks
A-Z Markeringen over verschillende documenten heen, global bookmarks
:marks Overzicht van alle markeringen, er kunnen ook letters worden opgegeven, gescheiden door een spatie

Bron: http://www.thegeekstuff.com/2009/02/how-to-add-bookmarks-inside-vi-and-vim-editor/

Shell

Met de opdracht :sh kan vanuit vim een shell worden opstart. Doe ctrl-d om de shell te verlaten en terug te keren naar vim. Met :! kan een shell opdracht worden uitgevoerd en wordt meteen teruggekeerd naar vim, bijvoorbeeld:

:!ls

Met het % teken wordt de naam van het huidige bestand doorgegeven, voorbeeld:

:!wc "%"

Kleuren

Huidige kleurenschema in detail bekijken gaat met commando: :highlight. De naam van het huidige kleurenschema: :colorscheme

Vimtutor

Vim heeft een cursus aan boord, om deze op te starten type: vimtutor op de shell prompt.

Plugins

Plugins maken het werken met Vim een stuk eenvoudiger en productiever.

NERDTree plugin

NERDTree, een bestandsverkenner voor Vim.
“The NERD tree allows you to explore your filesystem and to open files and directories. It presents the filesystem to you in the form of a tree which you manipulate with the keyboard and/or mouse. It also allows you to perform simple filesystem operations.”

Opdracht Verklaring
F3 Open NERDTree
B Open bookmarks
t Open bestand in een nieuwe page-tab
? Help
:Bookmark Maak nieuwe bookmark, eventueel met de opgegeven naam

Configuratie .vimrc

" NERDTree, file browser
let NERDTreeShowHidden=1              " toon hidden files en directories
let NERDTreeIgnore=['\.pyc$', '\~$']  “ toon bepaalde extensies niet
map <F3> :NERDTreeToggle<CR>          " wijs NERDTree toe aan F3

Bron: https://github.com/scrooloose/nerdtree

Jedi Vim plugin

Met deze plugin wordt het programmeren van python een stuk eenvoudiger. Het kan o.a. docstrings van objecten tonen, je kunt naar definities springen, en biedt autocompletion.

Het vereist de Jedi plugin voor Vim en de installatie van de python module Jedi. Installeer deze laatste als volgt.

sudo pip install jedi
Opdracht Verklaring
Shift-k toon de docstring van het object
Leader-d (leader is meestal ) Ga naar de definition
Ctrl-o Spring terug naar vorig punt
Ctrl-space Autocompletion
Leader-g Ga naar de assignments
Leader-n Show all usages of a name
:Pyimport Open python module

Er zijn nog een aantal instellingen voor deze plugin waar ik nog niets meegedaan heb. Deze maken het python leven waarschijnlijk nog eenvoudiger :-).

Bron: https://github.com/davidhalter/jedi-vim/blob/master/README.rst

Taglist plugin

Inleiding
M.b.v. tags kan handig door een een bestand gesprongen worden en wordt inzicht verkregen welke functies, objecten etc. in een bestand gedefinieerd zijn.

Ctags installeren
Tags worden gegenereerd en opgeslagen in een bestand. De plugin heeft daarvoor een programma nodig, het programma ctags. Installeer dat als volgt.

apt-get install exuberant-ctags

Tags bestand genereren
De vim plugin kan on-the-fly de tags genereren maar dat werkt niet indien definities staan in andere bestanden. Daarvoor is een bestand nodig waar alle tags instaan, genereer dat als volgt.

ctags -R *.py

-R betekent verwerk ook subdirectory’s, *.py betekent behandel alle python bestanden.

Taglist installeren
Maak de volgende map aan als dit nog niet bestaat en ga er naar toe.

mkdir -p ~/.vim/bundle && cd ~/.vim/bundle

Maak een submap aan

mkdir -p && mkdir taglist

Download taglist en rename het.

wget http://vim.sourceforge.net/scripts/download_script.php?src_id=19574
mv http://vim.sourceforge.net/scripts/script.php?script_id=273 taglist.zip

Pak het zip bestand uit.

.vimrc aanpassen
Voeg onderstaand toe aan .vimrc. Het wijst de plugin toe aan de functietoets F7. Daarnaast worden nog wat instellingen ingesteld.

" Syntax for multiple tag files are
" set tags=/my/dir1/tags, /my/dir2/tags
set tags=tags;$HOME/.vim/tags/

" TagList Plugin Configuration
let Tlist_Ctags_Cmd='/usr/bin/ctags'
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Close_On_Select = 1
let Tlist_Use_Right_Window = 1
let Tlist_File_Fold_Auto_Close = 1
map <F7> :TlistToggle<CR>

Enkele functie toetsen

Opdracht Verklaring
Ctrl-] Gaan naar de definitie van het object
Ctrl-t Keer terug naar het vorige punt
F7 Open de taglist, dit is een eigen instelling in .vimrc

Bronnen

Github

Op Github zijn vele plugins voor Vim te vinden. Downloaden gaat eenvoudig. Pak het https adres van een pagina, kopieer dit naar het klembord (ctrl-c).

In een shell type het volgende:

git clone <ctrl-v><enter>

En de code wordt gedownload.

Editen van markdown bestanden

Editing tips

Programmeren is wat anders dan een tekst schrijven. De regel lengte heb ik daarom voor markdown files korter geconfigureerd. Toegevoegd aan vimrc:

autocmd bufreadpre *.md setlocal textwidth=80

De format options heb ik niet aangepast formatoptions=tcqln. Bij het typen van de tekst zorgt vim er nu voor dat de regels niet langer worden dan 80 posities. Formatoptions kunnen als volgt gecontroleerd worden.

:set formatoptions?

Als een stuk tekst nu een rommeltje is geworden dan kan dit eenvoudig worden aangepast door het eerst te selecteren en vervolgens opnieuw te formatteren met gq.

Syntax highlighting

Tim Pope heeft een uitstekende plugin gemaakt voor markdown files (.md). Het is de moeite om deze toe te voegen aan Vim.

Bron: https://github.com/tpope/vim-markdown


Folding

Markdown bestanden kunnen erg lang worden, je kunt dan het overzicht kwijt raken. Onderstaande zorgt ervoor dat op de headings # eenvoudig folding toegepast wordt. Onderstaande werkte nadat ik de Markdown plugin van Tim Pope had geïnstalleerd.

Voeg dit toe aan het markdown syntax bestand ~/.vim/syntax/markdown.vim

" folding voor markdown bestanden
syntax region markdownFold start="^\z(#\+\) " end="\(^#\(\z1#*\)\@!#*[^#]\)\@=" transparent fold

En voeg dit toe aan .vimrc

" folding voor markdown bestanden
autocmd FileType markdown set foldmethod=syntax

Bron: http://occasionallycogent.com/post/5222794912/folding-fun-with-vim-and-markdown

Een geweldige tip!

Taglist plugin configureren voor markdown bestanden

Nadat de Taglist plugin is geïnstalleerd moeten nog wat aanvullende configuratie werkzaamheden plaatsvinden.

Edit het bestand $HOME/.ctags in de home directory dus, en voeg daar het volgende aan toe.

--langdef=markdown
--langmap=markdown:.md
--regex-markdown=/^#[ \t]+(.*)/-\1/h,heading1/
--regex-markdown=/^##[ \t]+(.*)/-  \1/h,heading2/
--regex-markdown=/^###[ \t]+(.*)/-    \1/h,heading3/
--regex-markdown=/^####[ \t]+(.*)/-      \1/h,heading4/
--regex-markdown=/^#####[ \t]+(.*)/-        \1/h,heading5/
--regex-markdown=/^######[ \t]+(.*)/-          \1/h,heading6/
--regex-markdown=/^#######[ \t]+(.*)/-            \1/h,heading7/

Vim moet weten wat markdown bestanden zijn, zorg ervoor dat dat reeds geconfigureerd is of voeg aan .vimrc het volgende toe.

au BufNewFile,BufRead *.md set filetype=markdown

En als laatste moet er dan nog een stukje configuratie van de Taglist plugin gebeuren in het bestand .vimrc voeg het volgende toe.

let g:tlist_markdown_settings = 'markdown;h:Headlins'

Hierna herkent de Taglist plugin ook markdown bestanden.

Bron: https://github.com/hupili/evermd/tree/master/doc/howto-markdown-in-vim

Python code runnen in Vim

Op internet 2 functie toetsen definities gevonden, neem er eentje op.

nnoremap <buffer> <F5> :exec '!python' shellescape(@%, 1)<cr>
nnoremap <silent> <F5> <Esc>:w<CR>:!clear;python %<CR>

De 2e maakt eerst scherm schoon en voert de code dan uit.

Een leuke optie is dat een gedeelte van de code kan ook uitgevoerd worden. Selecteer de uit te voeren code (visual mode). Type vervolgens:

:!python

en de code wordt uitgevoerd. De output komt op het scherm in Vim. Druk u om de output van het script te verwijderen en de code te herstellen.

Bronnen

Vim heeft veel fans. Er zijn een aantal websites die allemaal over Vim gaan.


Tags: vim linux markdown raspberry

comments powered by Disqus