aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2019-01-04 14:55:19 +1300
committerTom Ryder <tom@sanctum.geek.nz>2019-01-04 14:55:19 +1300
commit6ed48b12e451a0770d5a3f236e66e0e7e9a39c8d (patch)
treef63a011a642d8bdaa75aee6d87c17306784244bc
parentMerge branch 'hotfix/v4.6.1' into develop (diff)
downloaddotfiles-6ed48b12e451a0770d5a3f236e66e0e7e9a39c8d.tar.gz
dotfiles-6ed48b12e451a0770d5a3f236e66e0e7e9a39c8d.zip
Add experimental delimit_operator.vim plugin
This is an attempt at a small subset of surround.vim's behaviour, hopefully drastically simplified. I'm not actually sure how useful or practical this is going to be yet.
-rw-r--r--vim/autoload/delimit_operator.vim50
-rw-r--r--vim/plugin/delimit_operator.vim12
-rw-r--r--vim/vimrc8
3 files changed, 70 insertions, 0 deletions
diff --git a/vim/autoload/delimit_operator.vim b/vim/autoload/delimit_operator.vim
new file mode 100644
index 00000000..026fe63f
--- /dev/null
+++ b/vim/autoload/delimit_operator.vim
@@ -0,0 +1,50 @@
+let s:pairs = {
+ \ '(': ')',
+ \ '<': '>',
+ \ '[': ']',
+ \ '{': '}',
+ \ }
+
+function! delimit_operator#Operatorfunc(type) abort
+
+ let l:save = {
+ \ 'unnamed': @@,
+ \ 'clipboard': &clipboard,
+ \ 'selection': &selection
+ \ }
+
+ set clipboard-=unnamed
+ set clipboard-=unnamedplus
+
+ set selection=inclusive
+
+ let l:delimiters = {
+ \ 'open': s:char,
+ \ 'close': get(s:pairs, s:char, s:char)
+ \ }
+
+ if a:type ==# 'line'
+ silent normal! '[V']y
+ elseif a:type ==# 'block'
+ silent execute "normal! `[\<C-V>`]y"
+ else
+ silent normal! `[v`]y
+ endif
+
+ let @@ = l:delimiters['open']
+ \ . @@
+ \ . l:delimiters['close']
+
+ silent normal! gvp
+
+ let @@ = l:save['unnamed']
+ let &clipboard = l:save['clipboard']
+ let &selection = l:save['selection']
+
+endfunction
+
+function! delimit_operator#Map() abort
+ let s:char = nr2char(getchar())
+ set operatorfunc=delimit_operator#Operatorfunc
+ return 'g@'
+endfunction
diff --git a/vim/plugin/delimit_operator.vim b/vim/plugin/delimit_operator.vim
new file mode 100644
index 00000000..0a3e62fc
--- /dev/null
+++ b/vim/plugin/delimit_operator.vim
@@ -0,0 +1,12 @@
+if exists('g:loaded_delimit_operator') || &compatible
+ finish
+endif
+if v:version < 700
+ finish
+endif
+let g:loaded_delimit_operator = 1
+
+nnoremap <expr> <Plug>(DelimitOperator)
+ \ delimit_operator#Map()
+xnoremap <expr> <Plug>(DelimitOperator)
+ \ delimit_operator#Map()
diff --git a/vim/vimrc b/vim/vimrc
index 724a32e7..bf30df7d 100644
--- a/vim/vimrc
+++ b/vim/vimrc
@@ -421,5 +421,13 @@ nnoremap <Leader>: ^"zyg_:<C-R>z<CR>
" \! executes line with 'shell'
nnoremap <Leader>! ^"zyg_:!<C-R>z<CR>
+" Testing out delimit_operator.vim, in development
+" Use q for a prefix key, followed by the wrapping quote
+for s:char in ["'", '"', '`', '[', '<', '(', '{', '*']
+ execute 'nmap q'.s:char.' <Plug>(DelimitOperator)'.s:char
+ execute 'xmap q'.s:char.' <Plug>(DelimitOperator)'.s:char
+endfor
+unlet s:char
+
" Source any .vim files from ~/.vim/config
runtime! config/*.vim