summaryrefslogtreecommitdiff
path: root/.config/vim
diff options
context:
space:
mode:
Diffstat (limited to '.config/vim')
-rw-r--r--.config/vim/autoload/pathogen.vim264
-rw-r--r--.config/vim/colors/cyberpunk.vim136
-rw-r--r--.config/vim/colors/jellybeans.vim673
-rw-r--r--.config/vim/compiler/futhark.vim17
-rw-r--r--.config/vim/ftdetect/cpp.vim2
-rw-r--r--.config/vim/ftdetect/cu.vim1
-rw-r--r--.config/vim/ftdetect/fut.vim2
-rw-r--r--.config/vim/ftdetect/tex.vim9
-rw-r--r--.config/vim/ftplugin/fut.vim8
-rw-r--r--.config/vim/indent/fsharp.vim249
-rw-r--r--.config/vim/indent/fut.vim90
-rw-r--r--.config/vim/syntax/fut.vim53
-rw-r--r--.config/vim/vimrc117
13 files changed, 1621 insertions, 0 deletions
diff --git a/.config/vim/autoload/pathogen.vim b/.config/vim/autoload/pathogen.vim
new file mode 100644
index 0000000..3582fbf
--- /dev/null
+++ b/.config/vim/autoload/pathogen.vim
@@ -0,0 +1,264 @@
+" pathogen.vim - path option manipulation
+" Maintainer: Tim Pope <http://tpo.pe/>
+" Version: 2.4
+
+" Install in ~/.vim/autoload (or ~\vimfiles\autoload).
+"
+" For management of individually installed plugins in ~/.vim/bundle (or
+" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your
+" .vimrc is the only other setup necessary.
+"
+" The API is documented inline below.
+
+if exists("g:loaded_pathogen") || &cp
+ finish
+endif
+let g:loaded_pathogen = 1
+
+" Point of entry for basic default usage. Give a relative path to invoke
+" pathogen#interpose() or an absolute path to invoke pathogen#surround().
+" Curly braces are expanded with pathogen#expand(): "bundle/{}" finds all
+" subdirectories inside "bundle" inside all directories in the runtime path.
+" If no arguments are given, defaults "bundle/{}", and also "pack/{}/start/{}"
+" on versions of Vim without native package support.
+function! pathogen#infect(...) abort
+ if a:0
+ let paths = filter(reverse(copy(a:000)), 'type(v:val) == type("")')
+ else
+ let paths = ['bundle/{}', 'pack/{}/start/{}']
+ endif
+ if has('packages')
+ call filter(paths, 'v:val !~# "^pack/[^/]*/start/[^/]*$"')
+ endif
+ let static = '^\%([$~\\/]\|\w:[\\/]\)[^{}*]*$'
+ for path in filter(copy(paths), 'v:val =~# static')
+ call pathogen#surround(path)
+ endfor
+ for path in filter(copy(paths), 'v:val !~# static')
+ if path =~# '^\%([$~\\/]\|\w:[\\/]\)'
+ call pathogen#surround(path)
+ else
+ call pathogen#interpose(path)
+ endif
+ endfor
+ call pathogen#cycle_filetype()
+ if pathogen#is_disabled($MYVIMRC)
+ return 'finish'
+ endif
+ return ''
+endfunction
+
+" Split a path into a list.
+function! pathogen#split(path) abort
+ if type(a:path) == type([]) | return a:path | endif
+ if empty(a:path) | return [] | endif
+ let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,')
+ return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")')
+endfunction
+
+" Convert a list to a path.
+function! pathogen#join(...) abort
+ if type(a:1) == type(1) && a:1
+ let i = 1
+ let space = ' '
+ else
+ let i = 0
+ let space = ''
+ endif
+ let path = ""
+ while i < a:0
+ if type(a:000[i]) == type([])
+ let list = a:000[i]
+ let j = 0
+ while j < len(list)
+ let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g')
+ let path .= ',' . escaped
+ let j += 1
+ endwhile
+ else
+ let path .= "," . a:000[i]
+ endif
+ let i += 1
+ endwhile
+ return substitute(path,'^,','','')
+endfunction
+
+" Convert a list to a path with escaped spaces for 'path', 'tag', etc.
+function! pathogen#legacyjoin(...) abort
+ return call('pathogen#join',[1] + a:000)
+endfunction
+
+" Turn filetype detection off and back on again if it was already enabled.
+function! pathogen#cycle_filetype() abort
+ if exists('g:did_load_filetypes')
+ filetype off
+ filetype on
+ endif
+endfunction
+
+" Check if a bundle is disabled. A bundle is considered disabled if its
+" basename or full name is included in the list g:pathogen_blacklist or the
+" comma delimited environment variable $VIMBLACKLIST.
+function! pathogen#is_disabled(path) abort
+ if a:path =~# '\~$'
+ return 1
+ endif
+ let sep = pathogen#slash()
+ let blacklist = get(g:, 'pathogen_blacklist', get(g:, 'pathogen_disabled', [])) + pathogen#split($VIMBLACKLIST)
+ if !empty(blacklist)
+ call map(blacklist, 'substitute(v:val, "[\\/]$", "", "")')
+ endif
+ return index(blacklist, fnamemodify(a:path, ':t')) != -1 || index(blacklist, a:path) != -1
+endfunction
+
+" Prepend the given directory to the runtime path and append its corresponding
+" after directory. Curly braces are expanded with pathogen#expand().
+function! pathogen#surround(path) abort
+ let sep = pathogen#slash()
+ let rtp = pathogen#split(&rtp)
+ let path = fnamemodify(a:path, ':s?[\\/]\=$??')
+ let before = filter(pathogen#expand(path), '!pathogen#is_disabled(v:val)')
+ let after = filter(reverse(pathogen#expand(path, sep.'after')), '!pathogen#is_disabled(v:val[0:-7])')
+ call filter(rtp, 'index(before + after, v:val) == -1')
+ let &rtp = pathogen#join(before, rtp, after)
+ return &rtp
+endfunction
+
+" For each directory in the runtime path, add a second entry with the given
+" argument appended. Curly braces are expanded with pathogen#expand().
+function! pathogen#interpose(name) abort
+ let sep = pathogen#slash()
+ let name = a:name
+ if has_key(s:done_bundles, name)
+ return ""
+ endif
+ let s:done_bundles[name] = 1
+ let list = []
+ for dir in pathogen#split(&rtp)
+ if dir =~# '\<after$'
+ let list += reverse(filter(pathogen#expand(dir[0:-6].name, sep.'after'), '!pathogen#is_disabled(v:val[0:-7])')) + [dir]
+ else
+ let list += [dir] + filter(pathogen#expand(dir.sep.name), '!pathogen#is_disabled(v:val)')
+ endif
+ endfor
+ let &rtp = pathogen#join(pathogen#uniq(list))
+ return 1
+endfunction
+
+let s:done_bundles = {}
+
+" Invoke :helptags on all non-$VIM doc directories in runtimepath.
+function! pathogen#helptags() abort
+ let sep = pathogen#slash()
+ for glob in pathogen#split(&rtp)
+ for dir in map(split(glob(glob), "\n"), 'v:val.sep."/doc/".sep')
+ if (dir)[0 : strlen($VIMRUNTIME)] !=# $VIMRUNTIME.sep && filewritable(dir) == 2 && !empty(split(glob(dir.'*.txt'))) && (!filereadable(dir.'tags') || filewritable(dir.'tags'))
+ silent! execute 'helptags' pathogen#fnameescape(dir)
+ endif
+ endfor
+ endfor
+endfunction
+
+command! -bar Helptags :call pathogen#helptags()
+
+" Execute the given command. This is basically a backdoor for --remote-expr.
+function! pathogen#execute(...) abort
+ for command in a:000
+ execute command
+ endfor
+ return ''
+endfunction
+
+" Section: Unofficial
+
+function! pathogen#is_absolute(path) abort
+ return a:path =~# (has('win32') ? '^\%([\\/]\|\w:\)[\\/]\|^[~$]' : '^[/~$]')
+endfunction
+
+" Given a string, returns all possible permutations of comma delimited braced
+" alternatives of that string. pathogen#expand('/{a,b}/{c,d}') yields
+" ['/a/c', '/a/d', '/b/c', '/b/d']. Empty braces are treated as a wildcard
+" and globbed. Actual globs are preserved.
+function! pathogen#expand(pattern, ...) abort
+ let after = a:0 ? a:1 : ''
+ let pattern = substitute(a:pattern, '^[~$][^\/]*', '\=expand(submatch(0))', '')
+ if pattern =~# '{[^{}]\+}'
+ let [pre, pat, post] = split(substitute(pattern, '\(.\{-\}\){\([^{}]\+\)}\(.*\)', "\\1\001\\2\001\\3", ''), "\001", 1)
+ let found = map(split(pat, ',', 1), 'pre.v:val.post')
+ let results = []
+ for pattern in found
+ call extend(results, pathogen#expand(pattern))
+ endfor
+ elseif pattern =~# '{}'
+ let pat = matchstr(pattern, '^.*{}[^*]*\%($\|[\\/]\)')
+ let post = pattern[strlen(pat) : -1]
+ let results = map(split(glob(substitute(pat, '{}', '*', 'g')), "\n"), 'v:val.post')
+ else
+ let results = [pattern]
+ endif
+ let vf = pathogen#slash() . 'vimfiles'
+ call map(results, 'v:val =~# "\\*" ? v:val.after : isdirectory(v:val.vf.after) ? v:val.vf.after : isdirectory(v:val.after) ? v:val.after : ""')
+ return filter(results, '!empty(v:val)')
+endfunction
+
+" \ on Windows unless shellslash is set, / everywhere else.
+function! pathogen#slash() abort
+ return !exists("+shellslash") || &shellslash ? '/' : '\'
+endfunction
+
+function! pathogen#separator() abort
+ return pathogen#slash()
+endfunction
+
+" Convenience wrapper around glob() which returns a list.
+function! pathogen#glob(pattern) abort
+ let files = split(glob(a:pattern),"\n")
+ return map(files,'substitute(v:val,"[".pathogen#slash()."/]$","","")')
+endfunction
+
+" Like pathogen#glob(), only limit the results to directories.
+function! pathogen#glob_directories(pattern) abort
+ return filter(pathogen#glob(a:pattern),'isdirectory(v:val)')
+endfunction
+
+" Remove duplicates from a list.
+function! pathogen#uniq(list) abort
+ let i = 0
+ let seen = {}
+ while i < len(a:list)
+ if (a:list[i] ==# '' && exists('empty')) || has_key(seen,a:list[i])
+ call remove(a:list,i)
+ elseif a:list[i] ==# ''
+ let i += 1
+ let empty = 1
+ else
+ let seen[a:list[i]] = 1
+ let i += 1
+ endif
+ endwhile
+ return a:list
+endfunction
+
+" Backport of fnameescape().
+function! pathogen#fnameescape(string) abort
+ if exists('*fnameescape')
+ return fnameescape(a:string)
+ elseif a:string ==# '-'
+ return '\-'
+ else
+ return substitute(escape(a:string," \t\n*?[{`$\\%#'\"|!<"),'^[+>]','\\&','')
+ endif
+endfunction
+
+" Like findfile(), but hardcoded to use the runtimepath.
+function! pathogen#runtime_findfile(file,count) abort
+ let rtp = pathogen#join(1,pathogen#split(&rtp))
+ let file = findfile(a:file,rtp,a:count)
+ if file ==# ''
+ return ''
+ else
+ return fnamemodify(file,':p')
+ endif
+endfunction
+
+" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=':
diff --git a/.config/vim/colors/cyberpunk.vim b/.config/vim/colors/cyberpunk.vim
new file mode 100644
index 0000000..87ab9ac
--- /dev/null
+++ b/.config/vim/colors/cyberpunk.vim
@@ -0,0 +1,136 @@
+""" ===========================================================================
+" File: cyberpunk.vim
+" Description: A port of Emacs' Cyberpunk colorscheme for vim.
+""" ===========================================================================
+
+set background=dark
+
+if version > 580
+ hi clear
+ if exists("syntax_on")
+ syntax reset
+ endif
+endif
+
+let colors_name = "cyberpunk"
+
+" Cyberpunk theme colors {{{
+let s:colors = {
+ \ "cyberpunk-fg": "#dcdccc",
+ \ "cyberpunk-bg-1": "#2b2b2b",
+ \ "cyberpunk-bg-05": "#383838",
+ \ "cyberpunk-bg": "#000000",
+ \ "cyberpunk-bg+1": "#4f4f4f",
+ \ "cyberpunk-bg+2": "#5f5f5f",
+ \ "cyberpunk-bg+3": "#6f6f6f",
+ \ "cyberpunk-red+1": "#dca3a3",
+ \ "cyberpunk-red": "#ff0000",
+ \ "cyberpunk-red-1": "#8b0000",
+ \ "cyberpunk-red-2": "#8b0000",
+ \ "cyberpunk-red-3": "#9c6363",
+ \ "cyberpunk-red-4": "#8c5353",
+ \ "cyberpunk-red-5": "#7F073F",
+ \ "cyberpunk-pink": "#ff69b4",
+ \ "cyberpunk-pink-1": "#ff1493",
+ \ "cyberpunk-pink-2": "#cd1076",
+ \ "cyberpunk-orange-2": "#FF6400",
+ \ "cyberpunk-orange-1": "#ff8c00",
+ \ "cyberpunk-orange": "#ffa500",
+ \ "cyberpunk-yellow": "#ffff00",
+ \ "cyberpunk-yellow-1": "#FBDE2D",
+ \ "cyberpunk-yellow-2": "#d0bf8f",
+ \ "cyberpunk-yellow-3": "#D8FA3C",
+ \ "cyberpunk-yellow-4": "#E9C062",
+ \ "cyberpunk-yellow-5": "#ffd700",
+ \ "cyberpunk-green-2": "#006400",
+ \ "cyberpunk-green-1": "#2e8b57",
+ \ "cyberpunk-green": "#00ff00",
+ \ "cyberpunk-green+1": "#61CE3C",
+ \ "cyberpunk-green+2": "#9fc59f",
+ \ "cyberpunk-green+3": "#afd8af",
+ \ "cyberpunk-green+4": "#bfebbf",
+ \ "cyberpunk-cyan": "#93e0e3",
+ \ "cyberpunk-blue+1": "#94bff3",
+ \ "cyberpunk-blue": "#0000ff",
+ \ "cyberpunk-blue-1": "#7b68ee",
+ \ "cyberpunk-blue-2": "#6a5acd",
+ \ "cyberpunk-blue-3": "#add8e6",
+ \ "cyberpunk-blue-4": "#b2dfee",
+ \ "cyberpunk-blue-5": "#4c83ff",
+ \ "cyberpunk-blue-6": "#96CBFE",
+ \ "cyberpunk-blue-7": "#00ffff",
+ \ "cyberpunk-blue-8": "#4F94CD",
+ \ "cyberpunk-magenta": "#dc8cc3",
+ \ "cyberpunk-black": "#000000",
+ \ "cyberpunk-black-2": "#0C1021",
+ \ "cyberpunk-black-3": "#0A0A0A",
+ \ "cyberpunk-gray": "#d3d3d3",
+ \ "cyberpunk-gray-2": "#8B8989",
+ \ "cyberpunk-gray-3": "#919191",
+ \ "cyberpunk-gray-4": "#999999",
+ \ "cyberpunk-gray-5": "#333333",
+ \ "cyberpunk-gray-6": "#1A1A1A",
+ \ "cyberpunk-gray-7": "#4D4D4D",
+ \ "cyberpunk-gray-8": "#262626",
+ \ "cyberpunk-white": "#ffffff",
+ \ "cyberpunk-white-2": "#F8F8F8",
+ \ "cyberpunk-white-3": "#fffafa"
+\ }
+
+
+function! Hi(name, guifg, guibg)
+ let l:cmd = "hi " . a:name . " guifg=" . a:guifg . " guibg=" . a:guibg
+ exe l:cmd
+endfunc
+
+call Hi("Normal", s:colors["cyberpunk-fg"], s:colors["cyberpunk-black"])
+call Hi("Cursor", s:colors["cyberpunk-fg"], s:colors["cyberpunk-yellow-1"])
+call Hi("Visual", s:colors["cyberpunk-fg"], s:colors["cyberpunk-red-5"])
+call Hi("Visual", s:colors["cyberpunk-fg"], s:colors["cyberpunk-red-5"])
+call Hi("LineNr", s:colors["cyberpunk-green+2"], s:colors["cyberpunk-bg"])
+
+call Hi("DiffAdd", s:colors["cyberpunk-green"], s:colors["cyberpunk-black"])
+call Hi("DiffChange", s:colors["cyberpunk-yellow"], s:colors["cyberpunk-black"])
+call Hi("DiffDelete", s:colors["cyberpunk-red"], s:colors["cyberpunk-black"])
+
+call Hi("StatusLine", s:colors["cyberpunk-gray-5"], s:colors["cyberpunk-blue-5"])
+call Hi("StatusLineNC", s:colors["cyberpunk-gray-6"], s:colors["cyberpunk-gray-7"])
+
+
+exe "hi Warning guifg=" . s:colors["cyberpunk-pink"]
+call Hi("VertSplit", s:colors["cyberpunk-gray-5"], s:colors["cyberpunk-gray-5"])
+
+if version >= 700
+ exe "hi CursorLine guibg=" . s:colors["cyberpunk-gray-5"]
+endif
+
+" Syntax highlighting {{{
+exe "hi String guifg=" . s:colors["cyberpunk-green+1"]
+exe "hi Type guifg=" . s:colors["cyberpunk-yellow-3"]
+exe "hi Function guifg=" . s:colors["cyberpunk-pink-1"]
+exe "hi Comment guifg=" . s:colors["cyberpunk-gray-2"] . " cterm=italic"
+exe "hi Keyword guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi Identifier guifg=" . s:colors["cyberpunk-yellow-3"]
+exe "hi Conditional guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi Repeat guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi Operator guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi Label guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi Structure guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi StorageClass guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi Typedef guifg=" . s:colors["cyberpunk-yellow-1"]
+exe "hi Constant guifg=" . s:colors["cyberpunk-blue-5"]
+exe "hi PreProc guifg=" . s:colors["cyberpunk-gray-3"]
+
+exe "hi Delimiter guifg=" . s:colors["cyberpunk-fg"]
+" Numbers
+exe "hi Number guifg=" . s:colors["cyberpunk-fg"]
+exe "hi Float guifg=" . s:colors["cyberpunk-fg"]
+" }}}
+
+if has("gui_running")
+ set guicursor+=n-v-i:blinkwait750-blinkon750-blinkoff750
+endif
+
+exe "hi Directory guifg=" . s:colors["cyberpunk-pink-1"]
+
+exe "hi ExtraWhitespace guibg=" . s:colors["cyberpunk-red"] \ No newline at end of file
diff --git a/.config/vim/colors/jellybeans.vim b/.config/vim/colors/jellybeans.vim
new file mode 100644
index 0000000..40509a4
--- /dev/null
+++ b/.config/vim/colors/jellybeans.vim
@@ -0,0 +1,673 @@
+" Vim color file
+"
+" " __ _ _ _ "
+" " \ \ ___| | |_ _| |__ ___ __ _ _ __ ___ "
+" " \ \/ _ \ | | | | | _ \ / _ \/ _ | _ \/ __| "
+" " /\_/ / __/ | | |_| | |_| | __/ |_| | | | \__ \ "
+" " \___/ \___|_|_|\__ |____/ \___|\____|_| |_|___/ "
+" " \___/ "
+"
+" "A colorful, dark color scheme for Vim."
+"
+" File: jellybeans.vim
+" URL: github.com/nanotech/jellybeans.vim
+" Scripts URL: vim.org/scripts/script.php?script_id=2555
+" Maintainer: NanoTech (nanotech.nanotechcorp.net)
+" Version: 1.6
+" Last Change: October 18th, 2016
+" License: MIT
+" Contributors: Andrew Wong (w0ng)
+" Brian Marshall (bmars)
+" Daniel Herbert (pocketninja)
+" David Liang <bmdavll at gmail dot com>
+" Henry So, Jr. <henryso@panix.com>
+" Joe Doherty (docapotamus)
+" Karl Litterfeldt (Litterfeldt)
+" Keith Pitt (keithpitt)
+" Philipp Rustemeier (12foo)
+" Rafael Bicalho (rbika)
+" Rich Healey (richo)
+" Siwen Yu (yusiwen)
+" Tim Willis (willist)
+"
+" Copyright (c) 2009-2016 NanoTech
+"
+" Permission is hereby granted, free of charge, to any per‐
+" son obtaining a copy of this software and associated doc‐
+" umentation files (the “Software”), to deal in the Soft‐
+" ware without restriction, including without limitation
+" the rights to use, copy, modify, merge, publish, distrib‐
+" ute, sublicense, and/or sell copies of the Software, and
+" to permit persons to whom the Software is furnished to do
+" so, subject to the following conditions:
+"
+" The above copyright notice and this permission notice
+" shall be included in all copies or substantial portions
+" of the Software.
+"
+" THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY
+" KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+" THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICU‐
+" LAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CON‐
+" TRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON‐
+" NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+" THE SOFTWARE.
+
+set background=dark
+
+hi clear
+
+if exists("syntax_on")
+ syntax reset
+endif
+
+let colors_name = "jellybeans"
+
+if has("gui_running") || &t_Co == 88 || &t_Co == 256
+ let s:low_color = 0
+else
+ let s:low_color = 1
+endif
+
+" Configuration Variables:
+" - g:jellybeans_overrides (default = {})
+" - g:jellybeans_use_lowcolor_black (default = 1)
+" - g:jellybeans_use_gui_italics (default = 1)
+" - g:jellybeans_use_term_italics (default = 0)
+
+" let s:background_color = "151515"
+let s:background_color = "none"
+
+if exists("g:jellybeans_overrides")
+ let s:overrides = g:jellybeans_overrides
+else
+ let s:overrides = {}
+endif
+
+" Backwards compatibility
+if exists("g:jellybeans_background_color")
+ \ || exists("g:jellybeans_background_color_256")
+ \ || exists("g:jellybeans_use_term_background_color")
+
+ let s:overrides = deepcopy(s:overrides)
+
+ if !has_key(s:overrides, "background")
+ let s:overrides["background"] = {}
+ endif
+
+ if exists("g:jellybeans_background_color")
+ let s:overrides["background"]["guibg"] = g:jellybeans_background_color
+ endif
+
+ if exists("g:jellybeans_background_color_256")
+ let s:overrides["background"]["256ctermbg"] = g:jellybeans_background_color_256
+ endif
+
+ if exists("g:jellybeans_use_term_background_color")
+ \ && g:jellybeans_use_term_background_color
+ let s:overrides["background"]["ctermbg"] = "NONE"
+ let s:overrides["background"]["256ctermbg"] = "NONE"
+ endif
+endif
+
+if !exists("g:jellybeans_use_lowcolor_black") || g:jellybeans_use_lowcolor_black
+ let s:termBlack = "Black"
+else
+ let s:termBlack = "Grey"
+endif
+
+" Color approximation functions by Henry So, Jr. and David Liang {{{
+" Added to jellybeans.vim by Daniel Herbert
+
+" returns an approximate grey index for the given grey level
+fun! s:grey_number(x)
+ if &t_Co == 88
+ if a:x < 23
+ return 0
+ elseif a:x < 69
+ return 1
+ elseif a:x < 103
+ return 2
+ elseif a:x < 127
+ return 3
+ elseif a:x < 150
+ return 4
+ elseif a:x < 173
+ return 5
+ elseif a:x < 196
+ return 6
+ elseif a:x < 219
+ return 7
+ elseif a:x < 243
+ return 8
+ else
+ return 9
+ endif
+ else
+ if a:x < 14
+ return 0
+ else
+ let l:n = (a:x - 8) / 10
+ let l:m = (a:x - 8) % 10
+ if l:m < 5
+ return l:n
+ else
+ return l:n + 1
+ endif
+ endif
+ endif
+endfun
+
+" returns the actual grey level represented by the grey index
+fun! s:grey_level(n)
+ if &t_Co == 88
+ if a:n == 0
+ return 0
+ elseif a:n == 1
+ return 46
+ elseif a:n == 2
+ return 92
+ elseif a:n == 3
+ return 115
+ elseif a:n == 4
+ return 139
+ elseif a:n == 5
+ return 162
+ elseif a:n == 6
+ return 185
+ elseif a:n == 7
+ return 208
+ elseif a:n == 8
+ return 231
+ else
+ return 255
+ endif
+ else
+ if a:n == 0
+ return 0
+ else
+ return 8 + (a:n * 10)
+ endif
+ endif
+endfun
+
+" returns the palette index for the given grey index
+fun! s:grey_color(n)
+ if &t_Co == 88
+ if a:n == 0
+ return 16
+ elseif a:n == 9
+ return 79
+ else
+ return 79 + a:n
+ endif
+ else
+ if a:n == 0
+ return 16
+ elseif a:n == 25
+ return 231
+ else
+ return 231 + a:n
+ endif
+ endif
+endfun
+
+" returns an approximate color index for the given color level
+fun! s:rgb_number(x)
+ if &t_Co == 88
+ if a:x < 69
+ return 0
+ elseif a:x < 172
+ return 1
+ elseif a:x < 230
+ return 2
+ else
+ return 3
+ endif
+ else
+ if a:x < 75
+ return 0
+ else
+ let l:n = (a:x - 55) / 40
+ let l:m = (a:x - 55) % 40
+ if l:m < 20
+ return l:n
+ else
+ return l:n + 1
+ endif
+ endif
+ endif
+endfun
+
+" returns the actual color level for the given color index
+fun! s:rgb_level(n)
+ if &t_Co == 88
+ if a:n == 0
+ return 0
+ elseif a:n == 1
+ return 139
+ elseif a:n == 2
+ return 205
+ else
+ return 255
+ endif
+ else
+ if a:n == 0
+ return 0
+ else
+ return 55 + (a:n * 40)
+ endif
+ endif
+endfun
+
+" returns the palette index for the given R/G/B color indices
+fun! s:rgb_color(x, y, z)
+ if &t_Co == 88
+ return 16 + (a:x * 16) + (a:y * 4) + a:z
+ else
+ return 16 + (a:x * 36) + (a:y * 6) + a:z
+ endif
+endfun
+
+" returns the palette index to approximate the given R/G/B color levels
+fun! s:color(r, g, b)
+ " map greys directly (see xterm's 256colres.pl)
+ if &t_Co == 256 && a:r == a:g && a:g == a:b && a:r > 3 && a:r < 243
+ return float2nr(round(a:r - 8) / 10.0) + 232
+ endif
+
+ " get the closest grey
+ let l:gx = s:grey_number(a:r)
+ let l:gy = s:grey_number(a:g)
+ let l:gz = s:grey_number(a:b)
+
+ " get the closest color
+ let l:x = s:rgb_number(a:r)
+ let l:y = s:rgb_number(a:g)
+ let l:z = s:rgb_number(a:b)
+
+ if l:gx == l:gy && l:gy == l:gz
+ " there are two possibilities
+ let l:dgr = s:grey_level(l:gx) - a:r
+ let l:dgg = s:grey_level(l:gy) - a:g
+ let l:dgb = s:grey_level(l:gz) - a:b
+ let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb)
+ let l:dr = s:rgb_level(l:gx) - a:r
+ let l:dg = s:rgb_level(l:gy) - a:g
+ let l:db = s:rgb_level(l:gz) - a:b
+ let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db)
+ if l:dgrey < l:drgb
+ " use the grey
+ return s:grey_color(l:gx)
+ else
+ " use the color
+ return s:rgb_color(l:x, l:y, l:z)
+ endif
+ else
+ " only one possibility
+ return s:rgb_color(l:x, l:y, l:z)
+ endif
+endfun
+
+fun! s:is_empty_or_none(str)
+ return empty(a:str) || a:str ==? "NONE"
+endfun
+
+" returns the palette index to approximate the 'rrggbb' hex string
+fun! s:rgb(rgb)
+ if s:is_empty_or_none(a:rgb)
+ return "NONE"
+ endif
+ let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0
+ let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0
+ let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0
+ return s:color(l:r, l:g, l:b)
+endfun
+
+fun! s:prefix_highlight_value_with(prefix, color)
+ if s:is_empty_or_none(a:color)
+ return "NONE"
+ else
+ return a:prefix . a:color
+ endif
+endfun
+
+fun! s:remove_italic_attr(attr)
+ let l:attr = join(filter(split(a:attr, ","), "v:val !=? 'italic'"), ",")
+ if empty(l:attr)
+ let l:attr = "NONE"
+ endif
+ return l:attr
+endfun
+
+" sets the highlighting for the given group
+fun! s:X(group, fg, bg, attr, lcfg, lcbg)
+ if s:low_color
+ exec "hi ".a:group.
+ \ " ctermfg=".s:prefix_highlight_value_with("", a:lcfg).
+ \ " ctermbg=".s:prefix_highlight_value_with("", a:lcbg)
+ else
+ exec "hi ".a:group.
+ \ " guifg=".s:prefix_highlight_value_with("#", a:fg).
+ \ " guibg=".s:prefix_highlight_value_with("#", a:bg).
+ \ " ctermfg=".s:rgb(a:fg).
+ \ " ctermbg=".s:rgb(a:bg)
+ endif
+
+ let l:attr = s:prefix_highlight_value_with("", a:attr)
+
+ if exists("g:jellybeans_use_term_italics") && g:jellybeans_use_term_italics
+ let l:cterm_attr = l:attr
+ else
+ let l:cterm_attr = s:remove_italic_attr(l:attr)
+ endif
+
+ if !exists("g:jellybeans_use_gui_italics") || g:jellybeans_use_gui_italics
+ let l:gui_attr = l:attr
+ else
+ let l:gui_attr = s:remove_italic_attr(l:attr)
+ endif
+
+ exec "hi ".a:group." gui=".l:gui_attr." cterm=".l:cterm_attr
+endfun
+" }}}
+
+call s:X("Normal","e8e8d3",s:background_color,"","White","")
+set background=dark
+
+if version >= 700
+ call s:X("CursorLine","","1c1c1c","","",s:termBlack)
+ call s:X("CursorColumn","","1c1c1c","","",s:termBlack)
+ call s:X("MatchParen","ffffff","556779","bold","","DarkCyan")
+
+ call s:X("TabLine","000000","b0b8c0","italic","",s:termBlack)
+ call s:X("TabLineFill","9098a0","","","",s:termBlack)
+ call s:X("TabLineSel","000000","f0f0f0","italic,bold",s:termBlack,"White")
+
+ " Auto-completion
+ call s:X("Pmenu","ffffff","606060","","White",s:termBlack)
+ call s:X("PmenuSel","101010","eeeeee","",s:termBlack,"White")
+endif
+
+call s:X("Visual","","404040","","",s:termBlack)
+call s:X("Cursor",s:background_color,"b0d0f0","","","")
+
+call s:X("LineNr","605958",s:background_color,"NONE",s:termBlack,"")
+call s:X("CursorLineNr","ccc5c4","","NONE","White","")
+call s:X("Comment","888888","","italic","Grey","")
+call s:X("Todo","c7c7c7","","bold","White",s:termBlack)
+
+call s:X("StatusLine","000000","dddddd","italic","","White")
+call s:X("StatusLineNC","ffffff","403c41","italic","White","Black")
+call s:X("VertSplit","777777","403c41","",s:termBlack,s:termBlack)
+call s:X("WildMenu","f0a0c0","302028","","Magenta","")
+
+call s:X("Folded","a0a8b0","384048","italic",s:termBlack,"")
+call s:X("FoldColumn","535D66","1f1f1f","","",s:termBlack)
+call s:X("SignColumn","777777","333333","","",s:termBlack)
+call s:X("ColorColumn","","000000","","",s:termBlack)
+
+call s:X("Title","70b950","","bold","Green","")
+
+call s:X("Constant","cf6a4c","","","Red","")
+call s:X("Special","799d6a","","","Green","")
+call s:X("Delimiter","668799","","","Grey","")
+
+call s:X("String","99ad6a","","","Green","")
+call s:X("StringDelimiter","556633","","","DarkGreen","")
+
+call s:X("Identifier","c6b6ee","","","LightCyan","")
+call s:X("Structure","8fbfdc","","","LightCyan","")
+call s:X("Function","fad07a","","","Yellow","")
+call s:X("Statement","8197bf","","","DarkBlue","")
+call s:X("PreProc","8fbfdc","","","LightBlue","")
+
+hi! link Operator Structure
+hi! link Conceal Operator
+
+call s:X("Type","ffb964","","","Yellow","")
+call s:X("NonText","101010",s:background_color,"",s:termBlack,"")
+
+call s:X("SpecialKey","141414","","",s:termBlack,"")
+
+call s:X("Search","f0a0c0","302028","underline","Magenta","")
+
+call s:X("Directory","dad085","","","Yellow","")
+call s:X("ErrorMsg","","902020","","","DarkRed")
+hi! link Error ErrorMsg
+hi! link MoreMsg Special
+call s:X("Question","65C254","","","Green","")
+
+
+" Spell Checking
+
+call s:X("SpellBad","","902020","underline","","DarkRed")
+call s:X("SpellCap","","0000df","underline","","Blue")
+call s:X("SpellRare","","540063","underline","","DarkMagenta")
+call s:X("SpellLocal","","2D7067","underline","","Green")
+
+" Diff
+
+hi! link diffRemoved Constant
+hi! link diffAdded String
+
+" VimDiff
+
+call s:X("DiffAdd","D2EBBE","437019","","White","DarkGreen")
+call s:X("DiffDelete","40000A","700009","","DarkRed","DarkRed")
+call s:X("DiffChange","","2B5B77","","White","DarkBlue")
+call s:X("DiffText","8fbfdc","000000","reverse","Yellow","")
+
+" PHP
+
+hi! link phpFunctions Function
+call s:X("StorageClass","c59f6f","","","Red","")
+hi! link phpSuperglobal Identifier
+hi! link phpQuoteSingle StringDelimiter
+hi! link phpQuoteDouble StringDelimiter
+hi! link phpBoolean Constant
+hi! link phpNull Constant
+hi! link phpArrayPair Operator
+hi! link phpOperator Normal
+hi! link phpRelation Normal
+hi! link phpVarSelector Identifier
+
+" Python
+
+hi! link pythonOperator Statement
+
+" Ruby
+
+hi! link rubySharpBang Comment
+call s:X("rubyClass","447799","","","DarkBlue","")
+call s:X("rubyIdentifier","c6b6fe","","","Cyan","")
+hi! link rubyConstant Type
+hi! link rubyFunction Function
+
+call s:X("rubyInstanceVariable","c6b6fe","","","Cyan","")
+call s:X("rubySymbol","7697d6","","","Blue","")
+hi! link rubyGlobalVariable rubyInstanceVariable
+hi! link rubyModule rubyClass
+call s:X("rubyControl","7597c6","","","Blue","")
+
+hi! link rubyString String
+hi! link rubyStringDelimiter StringDelimiter
+hi! link rubyInterpolationDelimiter Identifier
+
+call s:X("rubyRegexpDelimiter","540063","","","Magenta","")
+call s:X("rubyRegexp","dd0093","","","DarkMagenta","")
+call s:X("rubyRegexpSpecial","a40073","","","Magenta","")
+
+call s:X("rubyPredefinedIdentifier","de5577","","","Red","")
+
+" Erlang
+
+hi! link erlangAtom rubySymbol
+hi! link erlangBIF rubyPredefinedIdentifier
+hi! link erlangFunction rubyPredefinedIdentifier
+hi! link erlangDirective Statement
+hi! link erlangNode Identifier
+
+" Elixir
+
+hi! link elixirAtom rubySymbol
+
+
+" JavaScript
+
+hi! link javaScriptValue Constant
+hi! link javaScriptRegexpString rubyRegexp
+hi! link javaScriptTemplateVar StringDelim
+hi! link javaScriptTemplateDelim Identifier
+hi! link javaScriptTemplateString String
+
+" CoffeeScript
+
+hi! link coffeeRegExp javaScriptRegexpString
+
+" Lua
+
+hi! link luaOperator Conditional
+
+" C
+
+hi! link cFormat Identifier
+hi! link cOperator Constant
+
+" Objective-C/Cocoa
+
+hi! link objcClass Type
+hi! link cocoaClass objcClass
+hi! link objcSubclass objcClass
+hi! link objcSuperclass objcClass
+hi! link objcDirective rubyClass
+hi! link objcStatement Constant
+hi! link cocoaFunction Function
+hi! link objcMethodName Identifier
+hi! link objcMethodArg Normal
+hi! link objcMessageName Identifier
+
+" Vimscript
+
+hi! link vimOper Normal
+
+" HTML
+
+hi! link htmlTag Statement
+hi! link htmlEndTag htmlTag
+hi! link htmlTagName htmlTag
+
+" XML
+
+hi! link xmlTag Statement
+hi! link xmlEndTag xmlTag
+hi! link xmlTagName xmlTag
+hi! link xmlEqual xmlTag
+hi! link xmlEntity Special
+hi! link xmlEntityPunct xmlEntity
+hi! link xmlDocTypeDecl PreProc
+hi! link xmlDocTypeKeyword PreProc
+hi! link xmlProcessingDelim xmlAttrib
+
+" Debugger.vim
+
+call s:X("DbgCurrent","DEEBFE","345FA8","","White","DarkBlue")
+call s:X("DbgBreakPt","","4F0037","","","DarkMagenta")
+
+" vim-indent-guides
+
+if !exists("g:indent_guides_auto_colors")
+ let g:indent_guides_auto_colors = 0
+endif
+call s:X("IndentGuidesOdd","","232323","","","")
+call s:X("IndentGuidesEven","","1b1b1b","","","")
+
+" Plugins, etc.
+
+hi! link TagListFileName Directory
+call s:X("PreciseJumpTarget","B9ED67","405026","","White","Green")
+
+" Manual overrides for 256-color terminals. Dark colors auto-map badly.
+if !s:low_color
+ hi StatusLineNC ctermbg=235
+ hi Folded ctermbg=236
+ hi DiffText ctermfg=81
+ hi DbgBreakPt ctermbg=53
+ hi IndentGuidesOdd ctermbg=235
+ hi IndentGuidesEven ctermbg=234
+endif
+
+if !empty("s:overrides")
+ fun! s:current_attr(group)
+ let l:synid = synIDtrans(hlID(a:group))
+ let l:attrs = []
+ for l:attr in ["bold", "italic", "reverse", "standout", "underline", "undercurl"]
+ if synIDattr(l:synid, l:attr, "gui") == 1
+ call add(l:attrs, l:attr)
+ endif
+ endfor
+ return join(l:attrs, ",")
+ endfun
+ fun! s:current_color(group, what, mode)
+ let l:color = synIDattr(synIDtrans(hlID(a:group)), a:what, a:mode)
+ if l:color == -1
+ return ""
+ else
+ return substitute(l:color, "^#", "", "")
+ endif
+ endfun
+ fun! s:load_color_def(group, def)
+ call s:X(a:group, get(a:def, "guifg", s:current_color(a:group, "fg", "gui")),
+ \ get(a:def, "guibg", s:current_color(a:group, "bg", "gui")),
+ \ get(a:def, "attr", s:current_attr(a:group)),
+ \ get(a:def, "ctermfg", s:current_color(a:group, "fg", "cterm")),
+ \ get(a:def, "ctermbg", s:current_color(a:group, "bg", "cterm")))
+ if !s:low_color
+ for l:prop in ["ctermfg", "ctermbg"]
+ let l:override_key = "256".l:prop
+ if has_key(a:def, l:override_key)
+ exec "hi ".a:group." ".l:prop."=".a:def[l:override_key]
+ endif
+ endfor
+ endif
+ endfun
+ fun! s:load_colors(defs)
+ for [l:group, l:def] in items(a:defs)
+ if l:group == "background"
+ call s:load_color_def("LineNr", l:def)
+ call s:load_color_def("NonText", l:def)
+ call s:load_color_def("Normal", l:def)
+ else
+ call s:load_color_def(l:group, l:def)
+ endif
+ unlet l:group
+ unlet l:def
+ endfor
+ endfun
+ call s:load_colors(s:overrides)
+ delf s:load_colors
+ delf s:load_color_def
+ delf s:current_color
+ delf s:current_attr
+endif
+
+call s:X("ExtraWhitespace","902020","902020","","red",s:termBlack)
+match ExtraWhitespace /^\t*\zs \+/
+match ExtraWhitespace /\s\+$/
+
+" delete functions {{{
+delf s:X
+delf s:remove_italic_attr
+delf s:prefix_highlight_value_with
+delf s:rgb
+delf s:is_empty_or_none
+delf s:color
+delf s:rgb_color
+delf s:rgb_level
+delf s:rgb_number
+delf s:grey_color
+delf s:grey_level
+delf s:grey_number
+" }}}
diff --git a/.config/vim/compiler/futhark.vim b/.config/vim/compiler/futhark.vim
new file mode 100644
index 0000000..132ccfe
--- /dev/null
+++ b/.config/vim/compiler/futhark.vim
@@ -0,0 +1,17 @@
+" Vim compiler file
+" Compiler: Futhark Compiler
+" Latest Revision: 2020/05/24
+
+if exists("current_compiler") || &cp
+ finish
+endif
+let current_compiler = "futhark"
+
+let s:cpo_save = "futhark"
+set cpo&vim
+
+"CompilerSet errorformat=Error at %f:%l:%c-%v:\r%m
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/.config/vim/ftdetect/cpp.vim b/.config/vim/ftdetect/cpp.vim
new file mode 100644
index 0000000..3166fda
--- /dev/null
+++ b/.config/vim/ftdetect/cpp.vim
@@ -0,0 +1,2 @@
+autocmd BufRead *.cpp setlocal tabstop=4
+autocmd BufRead *.cpp setlocal shiftwidth=4
diff --git a/.config/vim/ftdetect/cu.vim b/.config/vim/ftdetect/cu.vim
new file mode 100644
index 0000000..d7e8516
--- /dev/null
+++ b/.config/vim/ftdetect/cu.vim
@@ -0,0 +1 @@
+au BufRead,BufNewFile *.cu,*.cuh,*.cu.h set filetype=cuda
diff --git a/.config/vim/ftdetect/fut.vim b/.config/vim/ftdetect/fut.vim
new file mode 100644
index 0000000..2c281c7
--- /dev/null
+++ b/.config/vim/ftdetect/fut.vim
@@ -0,0 +1,2 @@
+au BufRead,BufNewFile *.fut set filetype=fut
+au BufRead,BufNewFile *.fut set includeexpr=v:fname.'.fut'
diff --git a/.config/vim/ftdetect/tex.vim b/.config/vim/ftdetect/tex.vim
new file mode 100644
index 0000000..43f5fde
--- /dev/null
+++ b/.config/vim/ftdetect/tex.vim
@@ -0,0 +1,9 @@
+" put \begin{} \end{} tags tags around the current word
+autocmd BufRead *.tex map <C-B> YpkI\begin{<ESC>A}<ESC>jI\end{<ESC>A}<esc>kA
+autocmd BufRead *.tex map! <C-B> <ESC>YpkI\begin{<ESC>A}<ESC>jI\end{<ESC>A}<esc>kA
+autocmd BufRead *.tex map <C-M> :call Synctex()<CR>
+
+"autocmd BufRead *.tex imap /\ \land
+"autocmd BufRead *.tex imap \/ \lor
+"autocmd BufRead *.tex imap -> \rightarrow
+"autocmd BufRead *.tex imap ~~ \neg
diff --git a/.config/vim/ftplugin/fut.vim b/.config/vim/ftplugin/fut.vim
new file mode 100644
index 0000000..29410d5
--- /dev/null
+++ b/.config/vim/ftplugin/fut.vim
@@ -0,0 +1,8 @@
+" ftplugin/fut.vim
+setlocal commentstring=--%s
+setlocal comments=:--
+setlocal iskeyword+=',_
+setlocal tabstop=2
+setlocal softtabstop=2
+setlocal shiftwidth=2
+setlocal expandtab
diff --git a/.config/vim/indent/fsharp.vim b/.config/vim/indent/fsharp.vim
new file mode 100644
index 0000000..6227bdd
--- /dev/null
+++ b/.config/vim/indent/fsharp.vim
@@ -0,0 +1,249 @@
+" Vim indent file
+" Language: FSharp
+" Maintainers: Jean-Francois Yuen <jfyuen@happycoders.org>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus.mottl@gmail.com>
+" Rudi Grinberg <rudi.grinberg@gmail.com>
+" Gregor Uhlenheuer <kongo2002@gmail.com>
+" Last Change: 2013 Jun 29
+" 2005 Jun 25 - Fixed multiple bugs due to 'else\nreturn ind' working
+" 2005 May 09 - Added an option to not indent OCaml-indents specially (MM)
+" 2013 June - commented textwidth (Marc Weber)
+" 2014 August - Ported to F#
+" 2014 August - F# specific cleanup
+"
+" Marc Weber's comment: This file may contain a lot of (very custom) stuff
+" which eventually should be moved somewhere else ..
+
+" Only load this indent file when no other was loaded.
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetFsharpIndent()
+setlocal indentkeys+=0=and,0=class,0=constraint,0=done,0=else,0=end,0=exception,0=external,0=if,0=in,0=include,0=inherit,0=let,0=method,0=open,0=then,0=type,0=val,0=with,0;;,0>\],0\|\],0>},0\|,0},0\],0)
+
+" Only define the function once.
+if exists("*GetFsharpIndent")
+ finish
+endif
+
+" Skipping pattern, for comments
+function! s:GetLineWithoutFullComment(lnum)
+ let lnum = prevnonblank(a:lnum - 1)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+ while lline =~ '^\s*$' && lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+ endwhile
+ return lnum
+endfunction
+
+" Indent for ';;' to match multiple 'let'
+function! s:GetInd(lnum, pat, lim)
+ let llet = search(a:pat, 'bW')
+ let old = indent(a:lnum)
+ while llet > 0
+ let old = indent(llet)
+ let nb = s:GetLineWithoutFullComment(llet)
+ if getline(nb) =~ a:lim
+ return old
+ endif
+ let llet = search(a:pat, 'bW')
+ endwhile
+ return old
+endfunction
+
+" Indent pairs
+function! s:FindPair(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+ return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+endfunction
+
+" Indent 'let'
+function! s:FindLet(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+ return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ s:beflet'))
+endfunction
+
+function! GetFsharpIndent()
+ " Find a non-commented line above the current line.
+ let lnum = s:GetLineWithoutFullComment(v:lnum)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+
+ " " Return single 'shiftwidth' after lines matching:
+ " if lline =~ '^\s*|.*->\s*$'
+ " return ind + &sw
+ " endif
+
+ let line = getline(v:lnum)
+
+ " Indent if current line begins with 'end':
+ if line =~ '^\s*end\>'
+ return s:FindPair(s:module, '','\<end\>')
+
+ " Indent if current line begins with 'done' for 'do':
+ elseif line =~ '^\s*done\>'
+ return s:FindPair('\<do\>', '','\<done\>')
+
+ " Indent if current line begins with '}' or '>}':
+ elseif line =~ '^\s*\(\|>\)}'
+ return s:FindPair('{', '','}')
+
+ " Indent if current line begins with ']', '|]' or '>]':
+ elseif line =~ '^\s*\(\||\|>\)\]'
+ return s:FindPair('\[', '','\]')
+
+ " Indent if current line begins with ')':
+ elseif line =~ '^\s*)'
+ return s:FindPair('(', '',')')
+
+ " Indent if current line begins with 'let':
+ elseif line =~ '^\s*let\>'
+ if lline !~ s:lim . '\|' . s:letlim . '\|' . s:beflet
+ return s:FindLet(s:type, '','\<let\s*$')
+ endif
+
+ " Indent if current line begins with 'class' or 'type':
+ elseif line =~ '^\s*\(class\|type\)\>'
+ if lline !~ s:lim . '\|\<and\s*$\|' . s:letlim
+ return s:FindLet(s:type, '','\<\(class\|type\)\s*$')
+ endif
+
+ " Indent for pattern matching:
+ elseif line =~ '^\s*|'
+ if lline !~ '^\s*\(|[^\]]\|\(match\|type\|with\)\>\)\|\<\(function\|private\|with\)\s*$'
+ call search('|', 'bW')
+ return indent(searchpair('^\s*\(match\|type\)\>\|\<\(function\|private\|with\)\s*$', '', '^\s*|', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") !~ "^\\s*|.*->"'))
+ endif
+
+ " Indent if current line begins with ';;':
+ elseif line =~ '^\s*;;'
+ if lline !~ ';;\s*$'
+ return s:GetInd(v:lnum, s:letpat, s:letlim)
+ endif
+
+ " Indent if current line begins with 'in':
+ elseif line =~ '^\s*in\>'
+ if lline !~ '^\s*\(let\|and\)\>'
+ return s:FindPair('\<let\>', '', '\<in\>')
+ endif
+
+ " Indent if current line begins with 'else':
+ elseif line =~ '^\s*else\>'
+ if lline !~ '^\s*\(if\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<else\>')
+ endif
+
+ " Indent if current line begins with 'then':
+ elseif line =~ '^\s*then\>'
+ if lline !~ '^\s*\(if\|else\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ endif
+
+ " Indent if current line begins with 'and':
+ elseif line =~ '^\s*and\>'
+ if lline !~ '^\s*\(and\|let\|type\)\>\|\<end\s*$'
+ return ind - &sw
+ endif
+
+ " Indent if current line begins with 'with':
+ elseif line =~ '^\s*with\>'
+ if lline !~ '^\s*\(match\|try\)\>'
+ return s:FindPair('\<\%(match\|try\)\>', '','\<with\>')
+ endif
+
+ " Indent if current line begins with 'exception', 'external', 'include' or
+ " 'open':
+ elseif line =~ '^\s*\(exception\|external\|include\|open\)\>'
+ if lline !~ s:lim . '\|' . s:letlim
+ call search(line)
+ return indent(search('^\s*\(\(exception\|external\|include\|open\|type\)\>\|val\>.*:\)', 'bW'))
+ endif
+
+ " Indent if current line begins with 'val':
+ elseif line =~ '^\s*val\>'
+ if lline !~ '^\s*\(exception\|external\|include\|open\)\>\|' . s:obj . '\|' . s:letlim
+ return indent(search('^\s*\(\(exception\|include\|initializer\|method\|open\|type\|val\)\>\|external\>.*:\)', 'bW'))
+ endif
+
+ " Indent if current line begins with 'constraint', 'inherit', 'initializer'
+ " or 'method':
+ elseif line =~ '^\s*\(constraint\|inherit\|initializer\|method\)\>'
+ if lline !~ s:obj
+ return indent(search('\<\(object\|object\s*(.*)\)\s*$', 'bW')) + &sw
+ endif
+
+ endif
+
+ " Add a 'shiftwidth' after lines ending with:
+ if lline =~ '\(:\|=\|->\|<-\|(\|\[\|{\|{<\|\[|\|\[<\|\<\(begin\|do\|else\|fun\|function\|functor\|if\|initializer\|object\|private\|sig\|struct\|then\|try\)\|\<object\s*(.*)\)\s*$'
+ let ind = ind + &sw
+
+ " Back to normal indent after lines ending with ';;':
+ elseif lline =~ ';;\s*$' && lline !~ '^\s*;;'
+ let ind = s:GetInd(v:lnum, s:letpat, s:letlim)
+
+ " Back to normal indent after lines ending with 'end':
+ elseif lline =~ '\<end\s*$'
+ let ind = s:FindPair(s:module, '','\<end\>')
+
+ " Back to normal indent after lines ending with 'in':
+ elseif lline =~ '\<in\s*$' && lline !~ '^\s*in\>'
+ let ind = s:FindPair('\<let\>', '', '\<in\>')
+
+ " Back to normal indent after lines ending with 'done':
+ elseif lline =~ '\<done\s*$'
+ let ind = s:FindPair('\<do\>', '','\<done\>')
+
+ " Back to normal indent after lines ending with '}' or '>}':
+ elseif lline =~ '\(\|>\)}\s*$'
+ let ind = s:FindPair('{', '','}')
+
+ " Back to normal indent after lines ending with ']', '|]' or '>]':
+ elseif lline =~ '\(\||\|>\)\]\s*$'
+ let ind = s:FindPair('\[', '','\]')
+
+ " Back to normal indent after comments:
+ elseif lline =~ '\*)\s*$'
+ call search('\*)', 'bW')
+ let ind = indent(searchpair('(\*', '', '\*)', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"'))
+
+ " Back to normal indent after lines ending with ')':
+ elseif lline =~ ')\s*$'
+ let ind = s:FindPair('(', '',')')
+
+ " If this is a multiline comment then align '*':
+ elseif lline =~ '^\s*(\*' && line =~ '^\s*\*'
+ let ind = ind + 1
+
+ else
+ " Don't change indentation of this line
+ " for new lines (indent==0) use indentation of previous line
+
+ " This is for preventing removing indentation of these args:
+ " let f x =
+ " let y = x + 1 in
+ " Printf.printf
+ " "o" << here
+ " "oeuth" << don't touch indentation
+
+ let i = indent(v:lnum)
+ return i == 0 ? ind : i
+
+ endif
+
+ return ind
+
+endfunction
+
+" vim: sw=4 et sts=4
diff --git a/.config/vim/indent/fut.vim b/.config/vim/indent/fut.vim
new file mode 100644
index 0000000..fb0df69
--- /dev/null
+++ b/.config/vim/indent/fut.vim
@@ -0,0 +1,90 @@
+" Vim indent file
+" Language: Futhark
+" Authors: Bene Collyridam, 0undefined
+" Last Change: 2020/01/11
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nolisp
+setlocal autoindent
+
+setlocal indentkeys=0{,0},0),0],!^F,e,o,O
+setlocal indentexpr=FutharkIndent(v:lnum)
+
+if exists("*FutharkIndent")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+function! s:get_line_trimmed(lnum)
+ " Get the line and remove a trailing comment.
+ " Use syntax highlighting attributes when possible.
+ " NOTE: this is not accurate; /* */ or a line continuation could trick it
+ let line = getline(a:lnum)
+ let line_len = strlen(line)
+ if has('syntax_items')
+ " If the last character in the line is a comment, do a binary search for
+ " the start of the comment. synID() is slow, a linear search would take
+ " too long on a long line.
+ if synIDattr(synID(a:lnum, line_len, 1), "name") =~ 'Comment\|Todo'
+ let min = 1
+ let max = line_len
+ while min < max
+ let col = (min + max) / 2
+ if synIDattr(synID(a:lnum, col, 1), "name") =~ 'Comment\|Todo'
+ let max = col
+ else
+ let min = col + 1
+ endif
+ endwhile
+ let line = strpart(line, 0, min - 1)
+ endif
+ return substitute(line, "\s*$", "", "")
+ else
+ " Sorry, this is not complete, nor fully correct (e.g. string "--").
+ " Such is life.
+ return substitute(line, "\s*--.*$", "", "")
+ endif
+endfunction
+
+function! FutharkIndent(lnum)
+ let line = getline(a:lnum)
+ let prevNum = prevnonblank(a:lnum - 1)
+ let prev = s:get_line_trimmed(prevNum)
+ while prevNum > 1 && prevline !~ '[^[:blank:]]'
+ let prevNum = prevnonblank(prevNum - 1)
+ let prev = s:get_line_trimmed(prevNum)
+ endwhile
+
+ if prev[len(prevline) - 1] == ","
+ \ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]'
+ \ && prevline !~ '^\s*let\s'
+ \ && prevline !~ '([^()]\+,$'
+ \ && s:get_line_trimmed(a:lnum) !~ '^\s*\S\+\s*=>'
+ return indent(prevNum)
+ endif
+
+ " Indent extra if matching these patterns
+ if prev =~ "=$"
+ \ || prev =~ "->$"
+ \ || prev =~ "do$"
+ \ || prev =~ "($"
+ \ || prev =~ "in$"
+ \ || prev =~ "then$"
+ \ || prev =~ "else$"
+ return indent(prevNum) + &shiftwidth
+
+ " Else keep same level of indentation
+ else
+ return indent(prevNum)
+
+ endif
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/.config/vim/syntax/fut.vim b/.config/vim/syntax/fut.vim
new file mode 100644
index 0000000..d3d7b78
--- /dev/null
+++ b/.config/vim/syntax/fut.vim
@@ -0,0 +1,53 @@
+syntax case match
+
+syn match FutharkAssigment "\v\="
+syn match FutharkOperator "\(+\|-\|*\|/\|>\|<\|%\|!\|&\||\|\^\)"
+syn match FutharkOperator "\(++\|==\|!=\|>->\|<-<\||>\|<|\)" containedin=FutharkLambdaOperator
+
+" Literally the same, just with parenthesis
+syn match FutharkLambdaOperator "(\ *\(++\|==\|!=\|>->\|<-<\||>\|<|\)\ *)"
+syn match FutharkLambdaOperator "(\ *\(+\|-\|*\|/\|>\|<\|%\|!\|&\||\|^\)\ *)"
+" Except for these two
+syn match FutharkLambdaOperator "(\ *\(\.[1-9][0-9]*\)\ *)"
+syn match FutharkLambdaOperator /).[1-9][0-9]*/ms=s+1
+
+syn match Number "\v[+-]?<((\d+|0[xX]\x+|0[bB][01]+)([ui](8|16|32|64))?)>"
+
+syn match float "\v[+-]?<((\d+(\.\d+)?)(f(32|64))?)>"
+
+" Exponent
+syn match float "\v-?(\d(\d|_)*|(\d(\d|_)*)?\.(\d(\d|_)*))[eE][+\-]?\d+"
+
+syn keyword boolean true false
+
+syn match FutIdentifier "\v\h(\w|')*" skipwhite contained contains=NONE
+
+syn keyword type i8 i16 i32 i64 u8 u16 u32 u64 int real bool char f32 f64
+
+syn keyword conditional if then else
+syn keyword Statement loop with entry for while do in local val
+syn keyword keyword concat zip unzip unsafe
+syn keyword typedef type
+syn keyword FutharkBinding let entry nextgroup=FutIdentifier skipwhite skipempty
+syn keyword PreProc module open import nextgroup=FutIdentifier skipwhite skipempty
+
+syn keyword function map map1 map2 map3 map4 map5 stream_map stream_map_per
+syn keyword function reduce reduce_comm scan filter partition
+syn keyword function stream_red stream_red_per stream_seq iota
+syn keyword function replicate scatter drop
+syn keyword function rotate split flatten unflatten
+syn keyword function curry uncurry
+syn keyword function id const
+
+syn match constant /'.'/
+
+syn region string start=/"/ skip=/\\"/ end=/"/ keepend excludenl
+
+syn match comment "--.*$"
+
+hi def link FutIdentifier Function
+
+hi def link FutharkBinding Statement
+hi def link number constant
+hi def link FutharkOperator operator
+hi def link FutharkLambdaOperator operator
diff --git a/.config/vim/vimrc b/.config/vim/vimrc
new file mode 100644
index 0000000..d590f53
--- /dev/null
+++ b/.config/vim/vimrc
@@ -0,0 +1,117 @@
+set directory=$XDG_CACHE_HOME/vim,~/,/tmp
+set backupdir=$XDG_CACHE_HOME/vim,~/,/tmp
+set viminfo+=n$XDG_CACHE_HOME/vim/viminfo
+let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc"
+set runtimepath=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$VIM,$VIMRUNTIME
+runtime! archlinux.vim
+scriptencoding utf-8
+
+" behaviour
+set history=200
+set wildmenu
+set ruler
+set cursorline
+set showmatch
+set hlsearch
+set nocompatible
+set backspace=2
+set incsearch
+set formatoptions+=tcroqn2bmj
+"set formatoptions+=1cjmnoqrw
+"set formatoptions+=2acjnoqrtw
+set relativenumber
+set number
+
+" Enable mouse support
+set mouse=a
+
+" tabs
+set expandtab
+set tabstop=2
+set softtabstop=2
+set shiftwidth=2
+set smartindent
+set textwidth=80
+set wrap
+
+" theme
+syntax enable
+
+" thematics
+set background=dark
+colorscheme jellybeans
+"set listchars=space:·\,eol:¬
+set listchars=
+set list
+
+
+" adding pathogen
+execute pathogen#infect('bundle/{}')
+filetype plugin indent on
+
+" encodings
+set fileencoding=utf-8
+set encoding=utf-8
+set fileformats=unix
+
+set viminfofile=${XDG_DATA_HOME:-$HOME/.local/share}/viminfo
+
+set grepprg=grep\ -nH\ $*
+
+"set statusline+=%#warningmsg#
+"set statusline+=%{SyntasticStatuslineFlag()}
+"set statusline+=%*
+
+let g:syntastic_always_populate_loc_list = 1
+let g:syntastic_auto_loc_list = 1
+let g:syntastic_check_on_open = 1
+let g:syntastic_check_on_wq = 0
+
+" filetypes
+let g:syntastic_disabled_filetypes=['asm', 's', 'latex', 'tex']
+
+let g:tex_flavor='latex'
+let g:vimtex_view_method='zathura'
+let g:vimtex_quickfix_mode=0
+set conceallevel=2
+let g:tex_conceal='abdmg'
+"let g:syntastic_tex_checkers=['lacheck']
+let g:vimtex_compiler_method = 'latexrun'
+let g:vimtex_compiler_latexrun = {
+ \ 'backend' : 'jobs',
+ \ 'background' : 1,
+ \ 'build_dir' : 'latex.out',
+ \ 'options' : [
+ \ '-verbose-cmds',
+ \ '--latex-args="-synctex=1"',
+ \ ],
+ \}
+
+let g:latex_view_general_viewer = 'zathura'
+let g:vimtex_view_method = 'zathura'
+
+function! Synctex()
+ " remove 'silent' for debugging
+ execute "silent !mv -u latex.out/" . bufname('%')[:-5] . ".synctex.gz ."
+ execute "silent !zathura --synctex-forward " . line('.') . ":" . col('.') . ":" . bufname('%') . " " . bufname('%')[:-5] . ".pdf"
+ redraw!
+endfunction
+
+map <F5> :make<CR>
+au BufNewFile,BufRead *.fo setlocal ft=fasto
+au BufNewFile,BufRead /tmp/[a-zA-Z0-9]\+/ setlocal ft=sh
+
+" Remove trailing cancer on write
+autocmd BufWritePre * %s/\s\+$//e
+autocmd BufWritePost *.tex !latexrun --bibtex-cmd="biber" --latex-args="-synctex=1" %
+
+set makeprg=GCC_COLORS=\ make
+
+vnoremap // y/\V<C-R>"<CR>
+
+map! <ESC>[1;5A <C-Up>
+map! <ESC>[1;5B <C-Down>
+map! <ESC>[1;5C <C-Right>
+map! <ESC>[1;5D <C-Left>
+
+autocmd VimEnter * silent !echo -ne "\e[1 q"