" 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/', \} function! s:Get(name) abort let name = a:name let env = environ() if has_key(env, name) && strlen(env[name]) > 0 return env[name] elseif has_key(s:defaults, name) return s:defaults[name] else return '' endif endfunction function! s:Absolute(path) abort return a:path !=# '^[/~]' endfunction function! xdg#CacheDir(name) abort let name = a:name let home = s:Get('XDG_CACHE_HOME') if !s:Absolute(home) return endif return join([home, name], '/') endfunction function! xdg#ConfigDirs(name) abort let name = a:name let home = s:Get('XDG_CONFIG_HOME') let dirs = split(s:Get('XDG_CONFIG_DIRS'), ':') return map( \ filter(insert(dirs, home), 's:Absolute(v:val)') \,'join([v:val, name], "/")' \) endfunction function! xdg#DataDirs(name) abort let name = a:name let home = s:Get('XDG_DATA_HOME') let dirs = split(s:Get('XDG_DATA_DIRS'), ':') return map( \ filter(insert(dirs, home), 's:Absolute(v:val)') \,'join([v:val, name], "/")' \) endfunction