diff options
-rw-r--r-- | VERSION | 4 | ||||
-rw-r--r-- | vim/autoload/getenv.vim | 22 | ||||
-rw-r--r-- | vim/autoload/xdg.vim | 23 | ||||
-rw-r--r-- | vim/vimrc | 47 |
4 files changed, 62 insertions, 34 deletions
@@ -1,2 +1,2 @@ -tejr dotfiles v8.23.0 -Sat, 02 May 2020 11:39:33 +0000 +tejr dotfiles v8.24.0 +Sat, 02 May 2020 14:16:31 +0000 diff --git a/vim/autoload/getenv.vim b/vim/autoload/getenv.vim new file mode 100644 index 00000000..2b8fef1b --- /dev/null +++ b/vim/autoload/getenv.vim @@ -0,0 +1,22 @@ +" Backport getenv() from v8.1.1305 +" +" <https://github.com/vim/vim/releases/tag/v8.1.1305> +" +function! getenv#(name) abort + + " Use native if available + if exists('*getenv') + return getenv(a:name) + endif + + " Backport + if a:name !~# '^[A-Z][A-Z0-9_]*$' + throw 'Illegal env var name' + endif + let value = v:null + if exists('$'.a:name) + execute 'let value = $'.a:name + endif + return value + +endfunction diff --git a/vim/autoload/xdg.vim b/vim/autoload/xdg.vim index 2b1e7c56..2b90f5f1 100644 --- a/vim/autoload/xdg.vim +++ b/vim/autoload/xdg.vim @@ -11,28 +11,25 @@ let s:subdir = 'vim' function! s:Get(name) abort let name = a:name - if name !~# '^[A-Z][A-Z0-9_]*$' - throw 'Illegal env var name' - endif - let value = '' - execute 'let value = $'.name - if value !=# '' - return value - elseif has_key(s:defaults, name) - return s:defaults[name] - else - return '' + 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 =~# '^[/~]' + return a:path =~# '^/' + \ || a:path =~# '^\~/' + \ || a:path ==# '~' endfunction function! s:Home(name) abort let home = s:Get(a:name) if !s:Absolute(home) - return '' + return v:null endif return join([home, s:subdir], '/') endfunction @@ -2,7 +2,7 @@ " Tom Ryder (tejr)’s Literate Vimrc " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ " -" Last updated: Wed, 29 Apr 2020 02:53:22 UTC +" Last updated: Sat, 02 May 2020 14:04:10 UTC " " │ And I was lifted up in heart, and thought " │ Of all my late-shown prowess in the lists, @@ -103,22 +103,30 @@ endif " We'll use the XDG directories as machine-local configuration and storage. " <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables> " -" Add all the configuration directories to 'runtimepath', and then put the -" cache home at the very front, so that e.g. 'spellfile' gets created in there -" rather than in the configuration directories. +" Add all the configuration directories to 'runtimepath', including "after" +" directories to the end of it, in reverse order, forming the desired layers +" of configuration. " -let s:xdgruntimepaths = xdg#['config']['dirs'] -if xdg#['config']['home'] !=# '' - call insert(s:xdgruntimepaths, xdg#['config']['home']) +let s:xdgconfigpaths = xdg#['config']['dirs'] +if xdg#['config']['home'] !=# v:null + call insert(s:xdgconfigpaths, xdg#['config']['home']) endif -if xdg#['cache']['home'] !=# '' - call insert(s:xdgruntimepaths, xdg#['cache']['home']) -endif -for s:xdgruntimepath in reverse(s:xdgruntimepaths) +for s:xdgconfigpath in reverse(s:xdgconfigpaths) execute 'set runtimepath^=' - \.option#Escape(option#item#Escape(s:xdgruntimepath)) + \.option#Escape(option#item#Escape(s:xdgconfigpath)) + execute 'set runtimepath+=' + \.option#Escape(option#item#Escape(s:xdgconfigpath.'/after')) endfor -unlet s:xdgruntimepaths s:xdgruntimepath +unlet! s:xdgconfigpath +unlet s:xdgconfigpaths + +" Now put the XDG cache home at the very front, so that e.g. 'spellfile' gets +" created in there rather than in the configuration directories. +" +if xdg#['cache']['home'] !=# v:null + execute 'set runtimepath^=' + \.option#Escape(option#item#Escape(xdg#['cache']['home'])) +endif " We need a command to reliably establish a full path, whether or not the " directories already exist. We create a wrapper for the autoloaded function @@ -145,7 +153,7 @@ command! -bang -bar -complete=dir -nargs=1 CreatePath " v8.1.716 introduced a way to set this with an option named 'viminfofile', " but I don't see a reason to use that. " -if xdg#['cache']['home'] !=# '' && path#Create(xdg#['cache']['home']) +if xdg#['cache']['home'] !=# v:null && path#Create(xdg#['cache']['home']) execute 'set viminfo+='.option#Escape( \ 'n'.xdg#['cache']['home'].'/viminfo' \) @@ -194,7 +202,7 @@ set history=10000 " 'backupfullname', 'swapfilefullname' would have been clearer. " set backup -if xdg#['cache']['home'] !=# '' +if xdg#['cache']['home'] !=# v:null let s:backupdir = xdg#['cache']['home'].'/backup' if path#Create(s:backupdir) execute 'set backupdir^='.option#Escape(option#item#Escape( @@ -238,7 +246,7 @@ endif " option has supported that hint for much longer than 'backupdir' has. We " apply path#Create() to attempt to create the path, if needed. " -if xdg#['cache']['home'] !=# '' +if xdg#['cache']['home'] !=# v:null let s:directory = xdg#['cache']['home'].'/swap' if path#Create(s:directory) execute 'set directory^='.option#Escape(option#item#Escape( @@ -263,7 +271,7 @@ endif " if has#('persistent_undo') set undofile - if xdg#['cache']['home'] !=# '' + if xdg#['cache']['home'] !=# v:null let s:undodir = xdg#['cache']['home'].'/undo' if path#Create(s:undodir) execute 'set undodir^='.option#Escape(option#item#Escape( @@ -402,7 +410,7 @@ set spellcapcheck=[.?!]\\%(\ \ \\\|[\\n\\r\\t]\\) set dictionary^=/usr/share/dict/words try let s:refdirs = xdg#['data']['dirs'] - if xdg#['data']['home'] !=# '' + if xdg#['data']['home'] !=# v:null call insert(s:refdirs, xdg#['data']['home']) endif for s:refdir in reverse(s:refdirs) @@ -411,7 +419,8 @@ try execute 'set thesaurus^=' \.option#Escape(option#item#Escape(s:refdir.'/thesaurus.txt')) endfor - unlet s:refdirs s:refdir + unlet! s:refdir + unlet s:refdirs catch /^Vim\%((\a\+)\)\=:E474:/ endtry |