" let s:defaults = { \ 'XDG_CACHE_HOME': '~/.cache', \ 'XDG_CONFIG_HOME': '~/.config', \ 'XDG_CONFIG_DIRS': '/etc/xdg', \ 'XDG_DATA_HOME': '~/.local/share', \ 'XDG_DATA_DIRS': '/usr/local/share/:/usr/share/', \} let s:subdir = 'vim' function! s:Get(name) abort let name = a:name if !has_key(s:defaults, name) throw 'Illegal XDG basedirs env var name' endif let value = getenv#(name) return value !=# v:null \ ? value \ : s:defaults[name] endfunction function! s:Absolute(path) abort return a:path =~# '^/' \ || a:path =~# '^\~/' \ || a:path ==# '~' endfunction function! s:Home(name) abort let home = s:Get(a:name) if !s:Absolute(home) return v:null endif return join([home, s:subdir], '/') endfunction function! s:Dirs(name) abort let dirs = split(s:Get(a:name), ':') return map( \ filter(dirs, 's:Absolute(v:val)') \,'join([v:val, s:subdir], "/")' \) endfunction let xdg# = { \ 'cache': { \ 'home': s:Home('XDG_CACHE_HOME'), \ }, \ 'config': { \ 'home': s:Home('XDG_CONFIG_HOME'), \ 'dirs': s:Dirs('XDG_CONFIG_DIRS'), \ }, \ 'data': { \ 'home': s:Home('XDG_DATA_HOME'), \ 'dirs': s:Dirs('XDG_DATA_DIRS'), \ }, \}