diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2020-05-03 02:16:34 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2020-05-03 02:16:34 +1200 |
commit | fd7bbd4599d1c15555c8c563d840d7fae6fd60bf (patch) | |
tree | e1030e690578e97208d3f96b7ede1ea1c3b7d02f | |
parent | Merge branch 'release/v8.23.0' (diff) | |
parent | Bump VERSION (diff) | |
download | dotfiles-8.24.0.tar.gz (sig) dotfiles-8.24.0.zip |
Merge branch 'release/v8.24.0'v8.24.0
* release/v8.24.0:
Use v:null in XDG-related contexts
Add handling of "after" subdirs in Vim XDG config
Separate cache runtime behaviour from config
Tolerate unset iteration variables
Improve "absolute path" check for XDG base dirs
Tidy and correct XDG var getenv() fallback
-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 |