mirror of
https://github.com/Raimondi/delimitMate.git
synced 2025-12-07 05:04:34 +08:00
Compare commits
325 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe1983cfa1 | ||
|
|
a4ac44a84f | ||
|
|
4c13ed6aee | ||
|
|
eafd832c04 | ||
|
|
e13872fdb2 | ||
|
|
9a9b9edb9a | ||
|
|
0f353bd2b3 | ||
|
|
c1b832bbf8 | ||
|
|
073957f0a1 | ||
|
|
c678061b79 | ||
|
|
12c7d85ff6 | ||
|
|
66834e7209 | ||
|
|
21072cf13e | ||
|
|
d952f6c721 | ||
|
|
0efe44bc70 | ||
|
|
631d72465a | ||
|
|
4024181af2 | ||
|
|
38487bbec8 | ||
|
|
c74a48ccd8 | ||
|
|
df1f32f772 | ||
|
|
f2b9b3a0c2 | ||
|
|
1c45f7bbde | ||
|
|
a1f21e8ef5 | ||
|
|
eba94168ce | ||
|
|
06c1f31632 | ||
|
|
9826c667e0 | ||
|
|
35280c1444 | ||
|
|
82160a5de6 | ||
|
|
07d9fa9ddc | ||
|
|
54853a954c | ||
|
|
f00f6b6cf2 | ||
|
|
d280d23a83 | ||
|
|
821e0019fb | ||
|
|
5ef40e0234 | ||
|
|
399e18d669 | ||
|
|
92fba35d27 | ||
|
|
0528bdac15 | ||
|
|
5db098e953 | ||
|
|
b45536fe8d | ||
|
|
3dde5cc8cb | ||
|
|
5787ec4f59 | ||
|
|
2dc880bf1c | ||
|
|
440f38858f | ||
|
|
f7f895c211 | ||
|
|
654dc14e6e | ||
|
|
543be33b13 | ||
|
|
7345bfddef | ||
|
|
16a35eefab | ||
|
|
74ab16ea5b | ||
|
|
2adbf5a8d7 | ||
|
|
e4a02eb998 | ||
|
|
ad11ab2210 | ||
|
|
6b0d448f6a | ||
|
|
32c9db8f37 | ||
|
|
a77423a46f | ||
|
|
57fd02b2e0 | ||
|
|
14faba1c62 | ||
|
|
8ab087c95c | ||
|
|
61d62e8920 | ||
|
|
7ce61655a7 | ||
|
|
8d133d4726 | ||
|
|
7caa6092b7 | ||
|
|
d98d8c0a0d | ||
|
|
e2d63e38f6 | ||
|
|
579e3520a4 | ||
|
|
90d07a68be | ||
|
|
2cb3f4d5e6 | ||
|
|
3a23e89cb5 | ||
|
|
70e1ac1462 | ||
|
|
d4ba528935 | ||
|
|
8a8aad183f | ||
|
|
cfc6654855 | ||
|
|
f2efe4331b | ||
|
|
dfa7e9b730 | ||
|
|
765bdd80dc | ||
|
|
739d2f9bd4 | ||
|
|
eb7738e4aa | ||
|
|
32f5d8df07 | ||
|
|
7b5887c324 | ||
|
|
0326b7c14a | ||
|
|
1dfe26a538 | ||
|
|
9c1564a22f | ||
|
|
028964cf7d | ||
|
|
5a84c1a746 | ||
|
|
0f9563969d | ||
|
|
d3ffebab74 | ||
|
|
ece6c39a65 | ||
|
|
ad151d3e55 | ||
|
|
b65d719353 | ||
|
|
a42dff4ad8 | ||
|
|
4a7d5a6e54 | ||
|
|
50a0df0be4 | ||
|
|
cecebf6e86 | ||
|
|
ad4430706e | ||
|
|
93d4a373fb | ||
|
|
a9f51531d9 | ||
|
|
6bb98110b4 | ||
|
|
0b34aea202 | ||
|
|
f1e92d05d5 | ||
|
|
8ec2bcb89a | ||
|
|
beb87ef41f | ||
|
|
26a6def62f | ||
|
|
0fb597ef36 | ||
|
|
fe5dd9a61a | ||
|
|
bb9b0edcc5 | ||
|
|
f3176a664c | ||
|
|
1cbbe90a09 | ||
|
|
a9174f65ba | ||
|
|
2af2dd2350 | ||
|
|
9c77b8434a | ||
|
|
646794cbda | ||
|
|
93fdcf92e1 | ||
|
|
fbbd9514c5 | ||
|
|
be5c41b3c1 | ||
|
|
b853ee9f35 | ||
|
|
eb2625c4a7 | ||
|
|
e17f6cd23c | ||
|
|
54acd56b48 | ||
|
|
9bdd4b078a | ||
|
|
f5748da36c | ||
|
|
eade67b409 | ||
|
|
b3f62f79c2 | ||
|
|
9d133d5b69 | ||
|
|
9f003b5bf5 | ||
|
|
e688e20151 | ||
|
|
8749708115 | ||
|
|
5cc5d8d9b3 | ||
|
|
98b4119746 | ||
|
|
c889905e47 | ||
|
|
db54dadb46 | ||
|
|
604260f56e | ||
|
|
581a3ebc17 | ||
|
|
cc1acaba96 | ||
|
|
7b781ab6b6 | ||
|
|
233eb52a97 | ||
|
|
aff9743269 | ||
|
|
ce1d05fac5 | ||
|
|
6dad313734 | ||
|
|
5263e25548 | ||
|
|
39b8298390 | ||
|
|
57b80ea78a | ||
|
|
a5b7141fc4 | ||
|
|
9efb01da68 | ||
|
|
860c45ab2a | ||
|
|
8686edfc63 | ||
|
|
5e7a7c4738 | ||
|
|
928cc1146a | ||
|
|
d420afdacd | ||
|
|
f6015300a0 | ||
|
|
e183064744 | ||
|
|
40849c94ef | ||
|
|
4c1424f9bd | ||
|
|
0783f97fc0 | ||
|
|
e551885c24 | ||
|
|
4891a04258 | ||
|
|
ad77a9a75e | ||
|
|
5bf35a6b31 | ||
|
|
49044099dd | ||
|
|
7c423067a8 | ||
|
|
d08fa765b9 | ||
|
|
f47bcd8e3f | ||
|
|
873e79ec37 | ||
|
|
589b2ae85a | ||
|
|
f9f2b5f177 | ||
|
|
4157dc8a88 | ||
|
|
d0fc1456b7 | ||
|
|
86f70a7d9c | ||
|
|
f7b53f045d | ||
|
|
f3d140e363 | ||
|
|
93a1770f37 | ||
|
|
859a732509 | ||
|
|
eb778be64b | ||
|
|
2b2ae65182 | ||
|
|
e1b52d3676 | ||
|
|
ff4745b191 | ||
|
|
2ba694830d | ||
|
|
12c5c96ca2 | ||
|
|
a97af1fb97 | ||
|
|
5bf6a1e30c | ||
|
|
f8883cb700 | ||
|
|
f72ffe3c12 | ||
|
|
d2e896fbe1 | ||
|
|
a0b1799270 | ||
|
|
1d423ab2b9 | ||
|
|
7f5df4bf6e | ||
|
|
9f1fdc418d | ||
|
|
64cf4beb8a | ||
|
|
119174b7dd | ||
|
|
b3a7728299 | ||
|
|
2266a19900 | ||
|
|
1b587bee9a | ||
|
|
31b289adfe | ||
|
|
efadb34c84 | ||
|
|
58d63b4e5b | ||
|
|
0441a03bb9 | ||
|
|
90cb449ada | ||
|
|
a678d7baab | ||
|
|
2911bf33c9 | ||
|
|
221daf6e6a | ||
|
|
8f5a45f9e7 | ||
|
|
6f5fd80e0e | ||
|
|
1caeda0799 | ||
|
|
3fb33b8e47 | ||
|
|
e6288a7313 | ||
|
|
7dd7edff64 | ||
|
|
4b94c38f95 | ||
|
|
217adb3d8e | ||
|
|
e63e373ae1 | ||
|
|
9c11c5cc82 | ||
|
|
8b24f0fd9f | ||
|
|
701e14f72f | ||
|
|
c9c1464075 | ||
|
|
e831d89acf | ||
|
|
133c125f93 | ||
|
|
b9cea6312a | ||
|
|
1b37d60840 | ||
|
|
a70aa5285e | ||
|
|
2eba04961d | ||
|
|
3519f82f79 | ||
|
|
e9491e473c | ||
|
|
9e3075cff5 | ||
|
|
7c9ba95565 | ||
|
|
3ae285424c | ||
|
|
fa1d3b3d6a | ||
|
|
63f8c2af4f | ||
|
|
29eb98d79d | ||
|
|
5b004ca49d | ||
|
|
34df78f8ab | ||
|
|
e234e45846 | ||
|
|
081ec279ed | ||
|
|
4399fa327f | ||
|
|
ceaa6e01ed | ||
|
|
235f0dcbfb | ||
|
|
fadd7fefbc | ||
|
|
193b6027c2 | ||
|
|
a76439a641 | ||
|
|
89cc598217 | ||
|
|
28ce6213fc | ||
|
|
6d1f48c1bf | ||
|
|
0e20bcaff8 | ||
|
|
aae61ad8ba | ||
|
|
4dac6ce6ac | ||
|
|
875a9e450b | ||
|
|
48d2e3b9d1 | ||
|
|
5626a633d5 | ||
|
|
3652ba24e3 | ||
|
|
740fc90ae7 | ||
|
|
e0de2dbf39 | ||
|
|
efcf9eb341 | ||
|
|
2545fa5967 | ||
|
|
c91674eed2 | ||
|
|
542728671e | ||
|
|
d1621b6672 | ||
|
|
6d1cc1187b | ||
|
|
377c3a37e1 | ||
|
|
d03324135c | ||
|
|
edeaff4730 | ||
|
|
c85fee6eb5 | ||
|
|
0ccb143a12 | ||
|
|
941beed3b3 | ||
|
|
739a3e606c | ||
|
|
61cc934b68 | ||
|
|
7aec4532f9 | ||
|
|
6f22aab0b8 | ||
|
|
592cf2fea1 | ||
|
|
3d818560eb | ||
|
|
da66a3f7c9 | ||
|
|
e5ce5b0967 | ||
|
|
03342b8d22 | ||
|
|
86c1895ceb | ||
|
|
fd4fb482fe | ||
|
|
0fbbc0f808 | ||
|
|
ced80ebb21 | ||
|
|
7b0d9367b2 | ||
|
|
37512d7f89 | ||
|
|
f8b5bbe555 | ||
|
|
698b3f1e43 | ||
|
|
bdf477de4b | ||
|
|
b03d5dce36 | ||
|
|
03390cfb5f | ||
|
|
45c66a4d07 | ||
|
|
a317b6ead7 | ||
|
|
ed672dd39b | ||
|
|
72e639ff1a | ||
|
|
95c899f3e2 | ||
|
|
6d4113e3c3 | ||
|
|
8d720b8932 | ||
|
|
422420c494 | ||
|
|
2c8b586679 | ||
|
|
e748b461b6 | ||
|
|
17a061a1fa | ||
|
|
29d42e0771 | ||
|
|
e818c05e33 | ||
|
|
29cb16c42e | ||
|
|
d478e75178 | ||
|
|
eb03c7058e | ||
|
|
1e7a5c7f6e | ||
|
|
b9bd9e3229 | ||
|
|
b25906e610 | ||
|
|
5ca0eee4cd | ||
|
|
a751498fbc | ||
|
|
9292c9294a | ||
|
|
4083c581d6 | ||
|
|
86ff123318 | ||
|
|
a8cbf2e429 | ||
|
|
96d53eaa31 | ||
|
|
b5292f7c58 | ||
|
|
6b80cfefb6 | ||
|
|
7540b37e8f | ||
|
|
9c6b615397 | ||
|
|
007da2c08a | ||
|
|
5e8f9eacac | ||
|
|
4c8f55722d | ||
|
|
00da04d835 | ||
|
|
8ba4a6ddd2 | ||
|
|
4f2db7a481 | ||
|
|
23326b1178 | ||
|
|
2e786b5ca6 | ||
|
|
4e63e5fe10 | ||
|
|
d3348192b8 | ||
|
|
6f0c91468a | ||
|
|
75b4f3b520 | ||
|
|
3ce7f7ffcf | ||
|
|
11b08278fa | ||
|
|
e0b8ef45ec |
11
.gitignore
vendored
Normal file
11
.gitignore
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
*.sw?
|
||||||
|
*.un?
|
||||||
|
*.vba
|
||||||
|
*.zip
|
||||||
|
*.gz
|
||||||
|
vimball.txt
|
||||||
|
*.orig
|
||||||
|
tags
|
||||||
|
test/build
|
||||||
|
test/*.tap
|
||||||
|
test/*.msgout
|
||||||
82
Makefile
Normal file
82
Makefile
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
PLUGIN = $(wildcard plugin/*.vim)
|
||||||
|
SOURCES = $(PLUGIN)
|
||||||
|
LIB = $(wildcard autoload/*.vim)
|
||||||
|
SOURCES += $(LIB)
|
||||||
|
DOC = $(wildcard doc/*.txt)
|
||||||
|
SOURCES += $(DOC)
|
||||||
|
#NAME = $(shell basename "$$PWD")
|
||||||
|
NAME = delimitMate
|
||||||
|
VERSION = $(shell $(SED) -n -e '/Current \+release/{s/^ \+\([0-9.]\+\).*/\1/;p;}' $(firstword $(DOC)))
|
||||||
|
FILENAME = $(NAME)-$(VERSION)
|
||||||
|
DESTDIR = $(HOME)/.vim
|
||||||
|
VIM = vim
|
||||||
|
SED = $(shell command -v gsed || command -v sed)
|
||||||
|
PERL = perl
|
||||||
|
comma := ,
|
||||||
|
empty :=
|
||||||
|
space := $(empty) $(empty)
|
||||||
|
|
||||||
|
.PHONY: version clean distclean undo release test install uninstall
|
||||||
|
|
||||||
|
all: zip gzip
|
||||||
|
dist: version all
|
||||||
|
vimball: $(FILENAME).vmb
|
||||||
|
zip: $(FILENAME).zip $(FILENAME).vmb.zip
|
||||||
|
gzip: $(FILENAME).tar.gz $(FILENAME).vmb.gz
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f */*.orig *.~* .VimballRecord *.zip *.gz *.vmb
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
-zsh -c 'setopt extendedglob; rm -f ^(README.md|Makefile)'
|
||||||
|
-zsh -c 'setopt extendedglob; rm -f .^(git|README.md|Makefile)*'
|
||||||
|
|
||||||
|
undo:
|
||||||
|
for i in */*.orig; do mv -f "$$i" "$${i%.*}"; done
|
||||||
|
|
||||||
|
version:
|
||||||
|
$(PERL) -i.orig -pne 'if (/^"\sVersion:/) {s/(\d+\.\S+)/$(VERSION)/}' $(PLUGIN) $(LIB)
|
||||||
|
$(PERL) -i.orig -pne \
|
||||||
|
'if (/let\sdelimitMate_version/) {s/"(\d+\.\S+)"/"$(VERSION)"/}' $(PLUGIN)
|
||||||
|
$(PERL) -i.orig -pne 'if (/beasts/) {s/(v\d+\.\S+)/v$(VERSION)/}' $(DOC)
|
||||||
|
$(PERL) -i.orig -MPOSIX -pne \
|
||||||
|
'if (/^"\sModified:/) {$$now_string = strftime "%F", localtime; s/(\d+-\d+-\d+)/$$now_string/e}' \
|
||||||
|
$(PLUGIN) $(LIB)
|
||||||
|
$(PERL) -i.orig -MPOSIX -pne \
|
||||||
|
'if (/^\s+$(VERSION)\s+\d+-\d+-\d+\s+\*/) {$$now_string = strftime "%F", localtime; s/(\d+-\d+-\d+)/$$now_string/}' \
|
||||||
|
$(DOC)
|
||||||
|
|
||||||
|
test:
|
||||||
|
$(MAKE) -C test
|
||||||
|
|
||||||
|
install: $(SOURCES)
|
||||||
|
for dir in $(^D);\
|
||||||
|
do install -d -m 0755 $(DESTDIR)$(PREFIX)/$$dir;\
|
||||||
|
done;\
|
||||||
|
for file in $^;\
|
||||||
|
do install -m 0644 $$file $(DESTDIR)$(PREFIX)/$$file;\
|
||||||
|
done;
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
for file in $(SOURCES);\
|
||||||
|
do rm -f $(DESTDIR)$(PREFIX)/$$file;\
|
||||||
|
done;
|
||||||
|
|
||||||
|
%.vmb: $(SOURCES)
|
||||||
|
$(VIM) -N -es -u NORC \
|
||||||
|
-c 'call setline(1,["$(subst $(space),"$(comma)",$^)"])'\
|
||||||
|
-c "%MkVimball! $(basename $@) ." -c 'q!'
|
||||||
|
|
||||||
|
%.vmb.zip: vimball
|
||||||
|
zip $@ $(basename $@)
|
||||||
|
|
||||||
|
%.zip: $(SOURCES)
|
||||||
|
zip $@ $^
|
||||||
|
|
||||||
|
%.vmb.gz: vimball
|
||||||
|
gzip -f $(basename $@)
|
||||||
|
|
||||||
|
%.tar.gz: $(SOURCES)
|
||||||
|
tar -cvzf $@ $^
|
||||||
|
|
||||||
|
# vim:ts=2:sw=2
|
||||||
6
README.md
Normal file
6
README.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
This plug-in provides automatic closing of quotes, parenthesis, brackets, etc., besides some other related features that
|
||||||
|
should make your time in insert mode a little bit easier, like syntax awareness (will not insert the closing delimiter
|
||||||
|
in comments and other configurable regions), <CR> and <Space> expansions (off by default), and some more.
|
||||||
|
|
||||||
|
Most of the features can be modified or disabled permanently, using global variables, or on a FileType basis, using
|
||||||
|
:autocmd.
|
||||||
693
autoload/delimitMate.vim
Normal file
693
autoload/delimitMate.vim
Normal file
@@ -0,0 +1,693 @@
|
|||||||
|
" File: autoload/delimitMate.vim
|
||||||
|
" Version: 2.7
|
||||||
|
" Modified: 2013-07-15
|
||||||
|
" Description: This plugin provides auto-completion for quotes, parens, etc.
|
||||||
|
" Maintainer: Israel Chauca F. <israelchauca@gmail.com>
|
||||||
|
" Manual: Read ":help delimitMate".
|
||||||
|
" ============================================================================
|
||||||
|
|
||||||
|
" Utilities {{{
|
||||||
|
|
||||||
|
"let delimitMate_loaded = 1
|
||||||
|
|
||||||
|
if !exists('s:options')
|
||||||
|
let s:options = {}
|
||||||
|
endif
|
||||||
|
function! s:s(name, value, ...) "{{{
|
||||||
|
let scope = a:0 ? a:1 : 's'
|
||||||
|
let bufnr = bufnr('%')
|
||||||
|
if !exists('s:options[bufnr]')
|
||||||
|
let s:options[bufnr] = {}
|
||||||
|
endif
|
||||||
|
if scope == 's'
|
||||||
|
let name = 's:options.' . bufnr . '.' . a:name
|
||||||
|
else
|
||||||
|
let name = scope . ':delimitMate_' . a:name
|
||||||
|
endif
|
||||||
|
exec 'silent! unlet! ' . name
|
||||||
|
exec 'let ' . name . ' = a:value'
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:g(name, ...) "{{{
|
||||||
|
if a:0 == 2
|
||||||
|
return deepcopy(get(a:2, 'delimitMate_' . a:name, a:1))
|
||||||
|
elseif a:0 == 1
|
||||||
|
let bufoptions = get(s:options, bufnr('%'), {})
|
||||||
|
return deepcopy(get(bufoptions, a:name, a:1))
|
||||||
|
else
|
||||||
|
return deepcopy(eval('s:options.' . bufnr('%') . '.' . a:name))
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:exists(name, ...) "{{{
|
||||||
|
let scope = a:0 ? a:1 : 's'
|
||||||
|
if scope == 's'
|
||||||
|
let bufnr = bufnr('%')
|
||||||
|
let name = 'options.' . bufnr . '.' . a:name
|
||||||
|
else
|
||||||
|
let name = 'delimitMate_' . a:name
|
||||||
|
endif
|
||||||
|
return exists(scope . ':' . name)
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#Set(...) "{{{
|
||||||
|
return call('s:s', a:000)
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#Get(...) "{{{
|
||||||
|
return call('s:g', a:000)
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#ShouldJump(...) "{{{
|
||||||
|
" Returns 1 if the next character is a closing delimiter.
|
||||||
|
let char = delimitMate#GetCharFromCursor(0)
|
||||||
|
let list = s:g('right_delims') + s:g('quotes_list')
|
||||||
|
|
||||||
|
" Closing delimiter on the right.
|
||||||
|
if (!a:0 && index(list, char) > -1)
|
||||||
|
\ || (a:0 && char == a:1)
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Closing delimiter with space expansion.
|
||||||
|
let nchar = delimitMate#GetCharFromCursor(1)
|
||||||
|
if !a:0 && s:g('expand_space') && char == " "
|
||||||
|
if index(list, nchar) > -1
|
||||||
|
return 2
|
||||||
|
endif
|
||||||
|
elseif a:0 && s:g('expand_space') && nchar == a:1 && char == ' '
|
||||||
|
return 3
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !s:g('jump_expansion')
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Closing delimiter with CR expansion.
|
||||||
|
let uchar = matchstr(getline(line('.') + 1), '^\s*\zs\S')
|
||||||
|
if !a:0 && s:g('expand_cr') && char == ""
|
||||||
|
if index(list, uchar) > -1
|
||||||
|
return 4
|
||||||
|
endif
|
||||||
|
elseif a:0 && s:g('expand_cr') && uchar == a:1
|
||||||
|
return 5
|
||||||
|
endif
|
||||||
|
return 0
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#IsEmptyPair(str) "{{{
|
||||||
|
if strlen(substitute(a:str, ".", "x", "g")) != 2
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let idx = index(s:g('left_delims'), matchstr(a:str, '^.'))
|
||||||
|
if idx > -1 &&
|
||||||
|
\ s:g('right_delims')[idx] == matchstr(a:str, '.$')
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
let idx = index(s:g('quotes_list'), matchstr(a:str, '^.'))
|
||||||
|
if idx > -1 &&
|
||||||
|
\ s:g('quotes_list')[idx] == matchstr(a:str, '.$')
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
return 0
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#RightQ(char) "{{{
|
||||||
|
let i = 0
|
||||||
|
while delimitMate#GetCharFromCursor(i) ==# a:char
|
||||||
|
let i += 1
|
||||||
|
endwhile
|
||||||
|
return i
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#LeftQ(char) "{{{
|
||||||
|
let i = 0
|
||||||
|
while delimitMate#GetCharFromCursor(i - 1) ==# a:char
|
||||||
|
let i -= 1
|
||||||
|
endwhile
|
||||||
|
return i * -1
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#GetCharFromCursor(...) "{{{
|
||||||
|
let idx = col('.') - 1
|
||||||
|
if !a:0 || (a:0 && a:1 >= 0)
|
||||||
|
" Get char from cursor.
|
||||||
|
let line = getline('.')[idx :]
|
||||||
|
let pos = a:0 ? a:1 : 0
|
||||||
|
return matchstr(line, '^'.repeat('.', pos).'\zs.')
|
||||||
|
endif
|
||||||
|
" Get char behind cursor.
|
||||||
|
let line = getline('.')[: idx - 1]
|
||||||
|
let pos = 0 - (1 + a:1)
|
||||||
|
return matchstr(line, '.\ze'.repeat('.', pos).'$')
|
||||||
|
endfunction "delimitMate#GetCharFromCursor }}}
|
||||||
|
|
||||||
|
function! delimitMate#IsCRExpansion(...) " {{{
|
||||||
|
let nchar = getline(line('.')-1)[-1:]
|
||||||
|
let schar = matchstr(getline(line('.')+1), '^\s*\zs\S')
|
||||||
|
let isEmpty = a:0 ? getline('.') =~ '^\s*$' : empty(getline('.'))
|
||||||
|
if index(s:g('left_delims'), nchar) > -1
|
||||||
|
\ && index(s:g('left_delims'), nchar)
|
||||||
|
\ == index(s:g('right_delims'), schar)
|
||||||
|
\ && isEmpty
|
||||||
|
return 1
|
||||||
|
elseif index(s:g('quotes_list'), nchar) > -1
|
||||||
|
\ && index(s:g('quotes_list'), nchar)
|
||||||
|
\ == index(s:g('quotes_list'), schar)
|
||||||
|
\ && isEmpty
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction " }}} delimitMate#IsCRExpansion()
|
||||||
|
|
||||||
|
function! delimitMate#IsSpaceExpansion() " {{{
|
||||||
|
if col('.') > 2
|
||||||
|
let pchar = delimitMate#GetCharFromCursor(-2)
|
||||||
|
let nchar = delimitMate#GetCharFromCursor(1)
|
||||||
|
let isSpaces =
|
||||||
|
\ (delimitMate#GetCharFromCursor(-1)
|
||||||
|
\ == delimitMate#GetCharFromCursor(0)
|
||||||
|
\ && delimitMate#GetCharFromCursor(-1) == " ")
|
||||||
|
|
||||||
|
if index(s:g('left_delims'), pchar) > -1 &&
|
||||||
|
\ index(s:g('left_delims'), pchar)
|
||||||
|
\ == index(s:g('right_delims'), nchar) &&
|
||||||
|
\ isSpaces
|
||||||
|
return 1
|
||||||
|
elseif index(s:g('quotes_list'), pchar) > -1 &&
|
||||||
|
\ index(s:g('quotes_list'), pchar)
|
||||||
|
\ == index(s:g('quotes_list'), nchar) &&
|
||||||
|
\ isSpaces
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return 0
|
||||||
|
endfunction " }}} IsSpaceExpansion()
|
||||||
|
|
||||||
|
function! delimitMate#WithinEmptyPair() "{{{
|
||||||
|
" if cursor is at column 1 return 0
|
||||||
|
if col('.') == 1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
" get char before the cursor.
|
||||||
|
let char1 = delimitMate#GetCharFromCursor(-1)
|
||||||
|
" get char under the cursor.
|
||||||
|
let char2 = delimitMate#GetCharFromCursor(0)
|
||||||
|
return delimitMate#IsEmptyPair( char1.char2 )
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#WithinEmptyMatchpair() "{{{
|
||||||
|
" get char before the cursor.
|
||||||
|
let open = delimitMate#GetCharFromCursor(-1)
|
||||||
|
let idx = index(s:g('left_delims'), open)
|
||||||
|
if idx == -1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let close = get(s:g('right_delims'), idx, '')
|
||||||
|
return close ==# delimitMate#GetCharFromCursor(0)
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#WithinEmptyQuotes() "{{{
|
||||||
|
" get char before the cursor.
|
||||||
|
let quote = delimitMate#GetCharFromCursor(-1)
|
||||||
|
let idx = index(s:g('quotes_list'), quote)
|
||||||
|
if idx == -1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
return quote ==# delimitMate#GetCharFromCursor(0)
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#CursorIdx() "{{{
|
||||||
|
let idx = len(split(getline('.')[: col('.') - 1], '\zs')) - 1
|
||||||
|
return idx
|
||||||
|
endfunction "delimitMate#CursorCol }}}
|
||||||
|
|
||||||
|
function! delimitMate#GetSyntaxRegion(line, col) "{{{
|
||||||
|
return synIDattr(synIDtrans(synID(a:line, a:col, 1)), 'name')
|
||||||
|
endfunction " }}}
|
||||||
|
|
||||||
|
function! delimitMate#GetCurrentSyntaxRegion() "{{{
|
||||||
|
let col = col('.')
|
||||||
|
if col == col('$')
|
||||||
|
let col = col - 1
|
||||||
|
endif
|
||||||
|
return delimitMate#GetSyntaxRegion(line('.'), col)
|
||||||
|
endfunction " }}}
|
||||||
|
|
||||||
|
function! delimitMate#GetCurrentSyntaxRegionIf(char) "{{{
|
||||||
|
let col = col('.')
|
||||||
|
let origin_line = getline('.')
|
||||||
|
let changed_line = strpart(origin_line, 0, col - 1) . a:char
|
||||||
|
\ . strpart(origin_line, col - 1)
|
||||||
|
call setline('.', changed_line)
|
||||||
|
let region = delimitMate#GetSyntaxRegion(line('.'), col)
|
||||||
|
call setline('.', origin_line)
|
||||||
|
return region
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#IsForbidden(char) "{{{
|
||||||
|
if !s:g('excluded_regions_enabled')
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let region = delimitMate#GetCurrentSyntaxRegion()
|
||||||
|
"if index(s:g('excluded_regions_list'), region) >= 0
|
||||||
|
" "echom "Forbidden 1!"
|
||||||
|
" return 1
|
||||||
|
"endif
|
||||||
|
"let region = delimitMate#GetCurrentSyntaxRegionIf(a:char)
|
||||||
|
"echom "Forbidden 2!"
|
||||||
|
return index(s:g('excluded_regions_list'), region) >= 0
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#BalancedParens(char) "{{{
|
||||||
|
" Returns:
|
||||||
|
" = 0 => Parens balanced.
|
||||||
|
" > 0 => More opening parens.
|
||||||
|
" < 0 => More closing parens.
|
||||||
|
|
||||||
|
let line = getline('.')
|
||||||
|
let col = delimitMate#CursorIdx() - 1
|
||||||
|
let col = col >= 0 ? col : 0
|
||||||
|
let list = split(line, '\zs')
|
||||||
|
let left = s:g('left_delims')[index(s:g('right_delims'), a:char)]
|
||||||
|
let right = a:char
|
||||||
|
let opening = 0
|
||||||
|
let closing = 0
|
||||||
|
|
||||||
|
" If the cursor is not at the beginning, count what's behind it.
|
||||||
|
if col > 0
|
||||||
|
" Find the first opening paren:
|
||||||
|
let start = index(list, left)
|
||||||
|
" Must be before cursor:
|
||||||
|
let start = start < col ? start : col - 1
|
||||||
|
" Now count from the first opening until the cursor, this will prevent
|
||||||
|
" extra closing parens from being counted.
|
||||||
|
let opening = count(list[start : col - 1], left)
|
||||||
|
let closing = count(list[start : col - 1], right)
|
||||||
|
" I don't care if there are more closing parens than opening parens.
|
||||||
|
let closing = closing > opening ? opening : closing
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Evaluate parens from the cursor to the end:
|
||||||
|
let opening += count(list[col :], left)
|
||||||
|
let closing += count(list[col :], right)
|
||||||
|
|
||||||
|
" Return the found balance:
|
||||||
|
return opening - closing
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#IsSmartQuote(char) "{{{
|
||||||
|
" TODO: Allow using a:char in the pattern.
|
||||||
|
let tmp = s:g('smart_quotes')
|
||||||
|
if empty(tmp)
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let regex = matchstr(tmp, '^!\?\zs.*')
|
||||||
|
" Flip matched value if regex starts with !
|
||||||
|
let mod = tmp =~ '^!' ? [1, 0] : [0, 1]
|
||||||
|
let matched = search(regex, 'ncb', line('.')) > 0
|
||||||
|
let noescaped = substitute(getline('.'), '\\.', '', 'g')
|
||||||
|
let odd = (count(split(noescaped, '\zs'), a:char) % 2)
|
||||||
|
let result = mod[matched] || odd
|
||||||
|
return result
|
||||||
|
endfunction "delimitMate#SmartQuote }}}
|
||||||
|
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" Doers {{{
|
||||||
|
function! delimitMate#SkipDelim(char) "{{{
|
||||||
|
if delimitMate#IsForbidden(a:char)
|
||||||
|
return a:char
|
||||||
|
endif
|
||||||
|
let col = col('.') - 1
|
||||||
|
let line = getline('.')
|
||||||
|
if col > 0
|
||||||
|
let cur = delimitMate#GetCharFromCursor(0)
|
||||||
|
let pre = delimitMate#GetCharFromCursor(-1)
|
||||||
|
else
|
||||||
|
let cur = delimitMate#GetCharFromCursor(0)
|
||||||
|
let pre = ""
|
||||||
|
endif
|
||||||
|
if pre == "\\"
|
||||||
|
" Escaped character
|
||||||
|
return a:char
|
||||||
|
elseif cur == a:char
|
||||||
|
" Exit pair
|
||||||
|
return a:char . "\<Del>"
|
||||||
|
elseif delimitMate#IsEmptyPair( pre . a:char )
|
||||||
|
" Add closing delimiter and jump back to the middle.
|
||||||
|
return a:char . "\<Left>"
|
||||||
|
else
|
||||||
|
" Nothing special here, return the same character.
|
||||||
|
return a:char
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#ParenDelim(right) " {{{
|
||||||
|
let left = s:g('left_delims')[index(s:g('right_delims'),a:right)]
|
||||||
|
if delimitMate#IsForbidden(a:right)
|
||||||
|
return left
|
||||||
|
endif
|
||||||
|
" Try to balance matchpairs
|
||||||
|
if s:g('balance_matchpairs') &&
|
||||||
|
\ delimitMate#BalancedParens(a:right) < 0
|
||||||
|
return left
|
||||||
|
endif
|
||||||
|
let line = getline('.')
|
||||||
|
let col = col('.')-2
|
||||||
|
if s:g('smart_matchpairs') != ''
|
||||||
|
let smart_matchpairs = substitute(s:g('smart_matchpairs'), '\\!', left, 'g')
|
||||||
|
let smart_matchpairs = substitute(smart_matchpairs, '\\#', a:right, 'g')
|
||||||
|
if line[col+1:] =~ smart_matchpairs
|
||||||
|
return left
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
let tail = len(line) == (col + 1) ? s:g('eol_marker') : ''
|
||||||
|
"if (col) < 0
|
||||||
|
" call setline('.',a:right.line)
|
||||||
|
"endif
|
||||||
|
return left . a:right . tail . repeat("\<Left>", len(split(tail, '\zs')) + 1)
|
||||||
|
endfunction " }}}
|
||||||
|
|
||||||
|
function! delimitMate#QuoteDelim(char) "{{{
|
||||||
|
if delimitMate#IsForbidden(a:char)
|
||||||
|
return a:char
|
||||||
|
endif
|
||||||
|
let char_at = delimitMate#GetCharFromCursor(0)
|
||||||
|
let char_before = delimitMate#GetCharFromCursor(-1)
|
||||||
|
let nesting_on = index(s:g('nesting_quotes'), a:char) > -1
|
||||||
|
let left_q = nesting_on ? delimitMate#LeftQ(a:char) : 0
|
||||||
|
if nesting_on && left_q > 1
|
||||||
|
" Nesting quotes.
|
||||||
|
let right_q = delimitMate#RightQ(a:char)
|
||||||
|
let quotes = right_q > left_q + 1 ? 0 : left_q - right_q + 2
|
||||||
|
let lefts = quotes - 1
|
||||||
|
return repeat(a:char, quotes) . repeat("\<Left>", lefts)
|
||||||
|
elseif char_at == a:char
|
||||||
|
" Inside an empty pair, jump out
|
||||||
|
return a:char . "\<Del>"
|
||||||
|
elseif a:char == '"' && index(split(&ft, '\.'), "vim") != -1 && getline('.') =~ '^\s*$'
|
||||||
|
" If we are in a vim file and it looks like we're starting a comment, do
|
||||||
|
" not add a closing char.
|
||||||
|
return a:char
|
||||||
|
elseif delimitMate#IsSmartQuote(a:char)
|
||||||
|
" Seems like a smart quote, insert a single char.
|
||||||
|
return a:char
|
||||||
|
elseif (char_before == a:char && char_at != a:char)
|
||||||
|
\ && !empty(s:g('smart_quotes'))
|
||||||
|
" Seems like we have an unbalanced quote, insert one quotation
|
||||||
|
" mark and jump to the middle.
|
||||||
|
return a:char . "\<Left>"
|
||||||
|
else
|
||||||
|
" Insert a pair and jump to the middle.
|
||||||
|
let sufix = ''
|
||||||
|
if !empty(s:g('eol_marker')) && col('.') - 1 == len(getline('.'))
|
||||||
|
let idx = len(s:g('eol_marker')) * -1
|
||||||
|
let marker = getline('.')[idx : ]
|
||||||
|
let has_marker = marker == s:g('eol_marker')
|
||||||
|
let sufix = !has_marker ? s:g('eol_marker') : ''
|
||||||
|
endif
|
||||||
|
return a:char . a:char . "\<Left>"
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#JumpOut(char) "{{{
|
||||||
|
if delimitMate#IsForbidden(a:char)
|
||||||
|
return a:char
|
||||||
|
endif
|
||||||
|
let jump = delimitMate#ShouldJump(a:char)
|
||||||
|
if jump == 1
|
||||||
|
" HACK: Instead of <Right>, we remove the char to be jumped over and
|
||||||
|
" insert it again. This will trigger re-indenting via 'indentkeys'.
|
||||||
|
" Ref: https://github.com/Raimondi/delimitMate/issues/168
|
||||||
|
return "\<Del>".a:char
|
||||||
|
elseif jump == 3
|
||||||
|
return "\<Right>\<Right>"
|
||||||
|
elseif jump == 5
|
||||||
|
return "\<Down>\<C-O>I\<Right>"
|
||||||
|
else
|
||||||
|
return a:char
|
||||||
|
endif
|
||||||
|
endfunction " }}}
|
||||||
|
|
||||||
|
function! delimitMate#JumpAny(...) " {{{
|
||||||
|
if delimitMate#IsForbidden('')
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
if !delimitMate#ShouldJump()
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
" Let's get the character on the right.
|
||||||
|
let char = delimitMate#GetCharFromCursor(0)
|
||||||
|
if char == " "
|
||||||
|
" Space expansion.
|
||||||
|
return "\<Right>\<Right>"
|
||||||
|
elseif char == ""
|
||||||
|
" CR expansion.
|
||||||
|
return "\<CR>" . getline(line('.') + 1)[0] . "\<Del>\<Del>"
|
||||||
|
else
|
||||||
|
return "\<Right>"
|
||||||
|
endif
|
||||||
|
endfunction " delimitMate#JumpAny() }}}
|
||||||
|
|
||||||
|
function! delimitMate#JumpMany() " {{{
|
||||||
|
let line = split(getline('.')[col('.') - 1 : ], '\zs')
|
||||||
|
let rights = ""
|
||||||
|
let found = 0
|
||||||
|
for char in line
|
||||||
|
if index(s:g('quotes_list'), char) >= 0 ||
|
||||||
|
\ index(s:g('right_delims'), char) >= 0
|
||||||
|
let rights .= "\<Right>"
|
||||||
|
let found = 1
|
||||||
|
elseif found == 0
|
||||||
|
let rights .= "\<Right>"
|
||||||
|
else
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if found == 1
|
||||||
|
return rights
|
||||||
|
else
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
endfunction " delimitMate#JumpMany() }}}
|
||||||
|
|
||||||
|
function! delimitMate#ExpandReturn() "{{{
|
||||||
|
if delimitMate#IsForbidden("")
|
||||||
|
return "\<CR>"
|
||||||
|
endif
|
||||||
|
let escaped = delimitMate#CursorIdx() >= 2
|
||||||
|
\ && delimitMate#GetCharFromCursor(-2) == '\'
|
||||||
|
let expand_right_matchpair = s:g('expand_cr') == 2
|
||||||
|
\ && index(s:g('right_delims'), delimitMate#GetCharFromCursor(0)) > -1
|
||||||
|
let expand_inside_quotes = s:g('expand_inside_quotes')
|
||||||
|
\ && delimitMate#WithinEmptyQuotes()
|
||||||
|
\ && !escaped
|
||||||
|
if !pumvisible()
|
||||||
|
\ && (delimitMate#WithinEmptyMatchpair()
|
||||||
|
\ || expand_right_matchpair
|
||||||
|
\ || expand_inside_quotes)
|
||||||
|
let val = "\<Esc>a\<CR>"
|
||||||
|
if &smartindent && !&cindent && !&indentexpr
|
||||||
|
\ && delimitMate#GetCharFromCursor(0) == '}'
|
||||||
|
" indentation is controlled by 'smartindent', and the first character on
|
||||||
|
" the new line is '}'. If this were typed manually it would reindent to
|
||||||
|
" match the current line. Let's reproduce that behavior.
|
||||||
|
let shifts = indent('.') / &sw
|
||||||
|
let spaces = indent('.') - (shifts * &sw)
|
||||||
|
let val .= "^\<C-D>".repeat("\<C-T>", shifts).repeat(' ', spaces)
|
||||||
|
endif
|
||||||
|
" Expand:
|
||||||
|
" XXX zv prevents breaking expansion with syntax folding enabled by
|
||||||
|
" InsertLeave.
|
||||||
|
let val .= "\<Esc>zvO"
|
||||||
|
return val
|
||||||
|
else
|
||||||
|
return "\<CR>"
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#ExpandSpace() "{{{
|
||||||
|
if delimitMate#IsForbidden("\<Space>")
|
||||||
|
return "\<Space>"
|
||||||
|
endif
|
||||||
|
let escaped = delimitMate#CursorIdx() >= 2
|
||||||
|
\ && delimitMate#GetCharFromCursor(-2) == '\'
|
||||||
|
let expand_inside_quotes = s:g('expand_inside_quotes')
|
||||||
|
\ && delimitMate#WithinEmptyQuotes()
|
||||||
|
\ && !escaped
|
||||||
|
if delimitMate#WithinEmptyMatchpair() || expand_inside_quotes
|
||||||
|
" Expand:
|
||||||
|
return "\<Space>\<Space>\<Left>"
|
||||||
|
else
|
||||||
|
return "\<Space>"
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! delimitMate#BS() " {{{
|
||||||
|
if delimitMate#IsForbidden("")
|
||||||
|
let extra = ''
|
||||||
|
elseif &bs !~ 'start\|2'
|
||||||
|
let extra = ''
|
||||||
|
elseif delimitMate#WithinEmptyPair()
|
||||||
|
let extra = "\<Del>"
|
||||||
|
elseif delimitMate#IsSpaceExpansion()
|
||||||
|
let extra = "\<Del>"
|
||||||
|
elseif delimitMate#IsCRExpansion()
|
||||||
|
let extra = repeat("\<Del>",
|
||||||
|
\ len(matchstr(getline(line('.') + 1), '^\s*\S')))
|
||||||
|
else
|
||||||
|
let extra = ''
|
||||||
|
endif
|
||||||
|
return "\<BS>" . extra
|
||||||
|
endfunction " }}} delimitMate#BS()
|
||||||
|
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" Tools: {{{
|
||||||
|
function! delimitMate#TestMappings() "{{{
|
||||||
|
echom 1
|
||||||
|
%d
|
||||||
|
let options = sort([
|
||||||
|
\ 'apostrophes',
|
||||||
|
\ 'autoclose',
|
||||||
|
\ 'balance_matchpairs',
|
||||||
|
\ 'jump_expansion',
|
||||||
|
\ 'eol_marker',
|
||||||
|
\ 'excluded_ft',
|
||||||
|
\ 'excluded_regions',
|
||||||
|
\ 'expand_cr',
|
||||||
|
\ 'expand_space',
|
||||||
|
\ 'matchpairs',
|
||||||
|
\ 'nesting_quotes',
|
||||||
|
\ 'quotes',
|
||||||
|
\ 'smart_matchpairs',
|
||||||
|
\ 'smart_quotes',
|
||||||
|
\ 'expand_inside_quotes',
|
||||||
|
\])
|
||||||
|
let optoutput = ['delimitMate Report', '==================', '',
|
||||||
|
\ '* Options: ( ) default, (g) global, (b) buffer','']
|
||||||
|
for option in options
|
||||||
|
let scope = s:exists(option, 'b') ? 'b'
|
||||||
|
\ : s:exists(option, 'g') ? 'g' : ' '
|
||||||
|
call add(optoutput,
|
||||||
|
\'(' . scope . ')' . ' delimitMate_' . option . ' = ' . string(s:g(option)))
|
||||||
|
endfor
|
||||||
|
call append(line('$'), optoutput + ['--------------------',''])
|
||||||
|
|
||||||
|
" Check if mappings were set. {{{
|
||||||
|
let imaps = s:g('right_delims')
|
||||||
|
let imaps += ( s:g('autoclose') ? s:g('left_delims') : [] )
|
||||||
|
let imaps +=
|
||||||
|
\ s:g('quotes_list') +
|
||||||
|
\ s:g('apostrophes_list') +
|
||||||
|
\ ['<BS>', '<S-BS>', '<S-Tab>', '<Esc>', '<C-G>g']
|
||||||
|
let imaps += ( s:g('expand_cr') ? ['<CR>'] : [] )
|
||||||
|
let imaps += ( s:g('expand_space') ? ['<Space>'] : [] )
|
||||||
|
|
||||||
|
let imappings = []
|
||||||
|
for map in imaps
|
||||||
|
let output = ''
|
||||||
|
if map == '|'
|
||||||
|
let map = '<Bar>'
|
||||||
|
endif
|
||||||
|
redir => output | execute "verbose imap ".map | redir END
|
||||||
|
let imappings += split(output, '\n')
|
||||||
|
endfor
|
||||||
|
|
||||||
|
unlet! output
|
||||||
|
let output = ['* Mappings:', ''] + imappings + ['--------------------', '']
|
||||||
|
call append('$', output+['* Showcase:', ''])
|
||||||
|
" }}}
|
||||||
|
if s:g('autoclose')
|
||||||
|
" {{{
|
||||||
|
for i in range(len(s:g('left_delims')))
|
||||||
|
exec "normal Go0\<C-D>Open: " . s:g('left_delims')[i]. "|"
|
||||||
|
exec "normal o0\<C-D>Delete: " . s:g('left_delims')[i] . "\<BS>|"
|
||||||
|
exec "normal o0\<C-D>Exit: " . s:g('left_delims')[i] . s:g('right_delims')[i] . "|"
|
||||||
|
if s:g('expand_space') == 1
|
||||||
|
exec "normal o0\<C-D>Space: " . s:g('left_delims')[i] . " |"
|
||||||
|
exec "normal o0\<C-D>Delete space: " . s:g('left_delims')[i]
|
||||||
|
\ . " \<BS>|"
|
||||||
|
endif
|
||||||
|
if s:g('expand_cr') == 1
|
||||||
|
exec "normal o0\<C-D>Car return: " . s:g('left_delims')[i] .
|
||||||
|
\ "\<CR>|"
|
||||||
|
exec "normal Go0\<C-D>Delete car return: " . s:g('left_delims')[i]
|
||||||
|
\ . "\<CR>0\<C-D>\<BS>|"
|
||||||
|
endif
|
||||||
|
call append(line('$'), '')
|
||||||
|
endfor
|
||||||
|
for i in range(len(s:g('quotes_list')))
|
||||||
|
exec "normal Go0\<C-D>Open: " . s:g('quotes_list')[i] . "|"
|
||||||
|
exec "normal o0\<C-D>Delete: " . s:g('quotes_list')[i] . "\<BS>|"
|
||||||
|
exec "normal o0\<C-D>Exit: " . s:g('quotes_list')[i] . s:g('quotes_list')[i] . "|"
|
||||||
|
if s:g('expand_space') == 1
|
||||||
|
exec "normal o0\<C-D>Space: " . s:g('quotes_list')[i] . " |"
|
||||||
|
exec "normal o0\<C-D>Delete space: " . s:g('quotes_list')[i]
|
||||||
|
\ . " \<BS>|"
|
||||||
|
endif
|
||||||
|
if s:g('expand_cr') == 1
|
||||||
|
exec "normal o0\<C-D>Car return: " . s:g('quotes_list')[i]
|
||||||
|
\ . "\<CR>|"
|
||||||
|
exec "normal Go0\<C-D>Delete car return: " . s:g('quotes_list')[i]
|
||||||
|
\ . "\<CR>\<BS>|"
|
||||||
|
endif
|
||||||
|
call append(line('$'), '')
|
||||||
|
endfor
|
||||||
|
"}}}
|
||||||
|
else
|
||||||
|
"{{{
|
||||||
|
for i in range(len(s:g('left_delims')))
|
||||||
|
exec "normal GoOpen & close: " . s:g('left_delims')[i]
|
||||||
|
\ . s:g('right_delims')[i] . "|"
|
||||||
|
exec "normal oDelete: " . s:g('left_delims')[i]
|
||||||
|
\ . s:g('right_delims')[i] . "\<BS>|"
|
||||||
|
exec "normal oExit: " . s:g('left_delims')[i] . s:g('right_delims')[i]
|
||||||
|
\ . s:g('right_delims')[i] . "|"
|
||||||
|
if s:g('expand_space') == 1
|
||||||
|
exec "normal oSpace: " . s:g('left_delims')[i]
|
||||||
|
\ . s:g('right_delims')[i] . " |"
|
||||||
|
exec "normal oDelete space: " . s:g('left_delims')[i]
|
||||||
|
\ . s:g('right_delims')[i] . " \<BS>|"
|
||||||
|
endif
|
||||||
|
if s:g('expand_cr') == 1
|
||||||
|
exec "normal oCar return: " . s:g('left_delims')[i]
|
||||||
|
\ . s:g('right_delims')[i] . "\<CR>|"
|
||||||
|
exec "normal GoDelete car return: " . s:g('left_delims')[i]
|
||||||
|
\ . s:g('right_delims')[i] . "\<CR>\<BS>|"
|
||||||
|
endif
|
||||||
|
call append(line('$'), '')
|
||||||
|
endfor
|
||||||
|
for i in range(len(s:g('quotes_list')))
|
||||||
|
exec "normal GoOpen & close: " . s:g('quotes_list')[i]
|
||||||
|
\ . s:g('quotes_list')[i] . "|"
|
||||||
|
exec "normal oDelete: " . s:g('quotes_list')[i]
|
||||||
|
\ . s:g('quotes_list')[i] . "\<BS>|"
|
||||||
|
exec "normal oExit: " . s:g('quotes_list')[i] . s:g('quotes_list')[i]
|
||||||
|
\ . s:g('quotes_list')[i] . "|"
|
||||||
|
if s:g('expand_space') == 1
|
||||||
|
exec "normal oSpace: " . s:g('quotes_list')[i]
|
||||||
|
\ . s:g('quotes_list')[i] . " |"
|
||||||
|
exec "normal oDelete space: " . s:g('quotes_list')[i]
|
||||||
|
\ . s:g('quotes_list')[i] . " \<BS>|"
|
||||||
|
endif
|
||||||
|
if s:g('expand_cr') == 1
|
||||||
|
exec "normal oCar return: " . s:g('quotes_list')[i]
|
||||||
|
\ . s:g('quotes_list')[i] . "\<CR>|"
|
||||||
|
exec "normal GoDelete car return: " . s:g('quotes_list')[i]
|
||||||
|
\ . s:g('quotes_list')[i] . "\<CR>\<BS>|"
|
||||||
|
endif
|
||||||
|
call append(line('$'), '')
|
||||||
|
endfor
|
||||||
|
endif "}}}
|
||||||
|
redir => setoptions | set | filetype | version | redir END
|
||||||
|
call append(line('$'), split(setoptions,"\n")
|
||||||
|
\ + ['--------------------'])
|
||||||
|
setlocal nowrap
|
||||||
|
call feedkeys("\<Esc>\<Esc>", 'n')
|
||||||
|
endfunction "}}}
|
||||||
|
"}}}
|
||||||
|
|
||||||
|
" vim:foldmethod=marker:foldcolumn=4:ts=2:sw=2
|
||||||
4
basic_vimrc
Normal file
4
basic_vimrc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
so ./test/_setup.vim
|
||||||
|
let delimitMate_expand_cr = 1
|
||||||
|
filetype indent plugin on
|
||||||
|
|
||||||
343
delimitMate.txt
343
delimitMate.txt
@@ -1,343 +0,0 @@
|
|||||||
*delimitMate.txt* Trying to keep those beasts at bay!
|
|
||||||
|
|
||||||
|
|
||||||
REFERENCE MANUAL *
|
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
0.- CONTENTS *delimitMate-contents*
|
|
||||||
|
|
||||||
1. Introduction____________________________|delimitMate|
|
|
||||||
2. Functionality___________________________|delimitMateFunctionality|
|
|
||||||
2.1 Automatic closing & exiting________|delimitMateAutoClose|
|
|
||||||
2.2 Expansion of space and CR__________|delimitMateExpansion|
|
|
||||||
2.3 Deletion of empty pairs____________|delimitMateBackspace|
|
|
||||||
2.4 Visual wrapping____________________|delimitMateVisualWrapping|
|
|
||||||
3. Customization___________________________|delimitMateOptions|
|
|
||||||
3.1 Option summary_____________________|delimitMateOptionSummary|
|
|
||||||
3.2 Options details____________________|delimitMateOptionDetails|
|
|
||||||
4. Public commands_________________________|delimitMatePublicCommands|
|
|
||||||
5. TODO list_______________________________|delimitMateTodo|
|
|
||||||
6. Maintainer______________________________|delimitMateMaintainer|
|
|
||||||
7. Credits_________________________________|delimitMateCredits|
|
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
1.- INTRODUCTION *delimitMate*
|
|
||||||
|
|
||||||
The delimitMate plugin tries to provide some not so dumb help in the work with
|
|
||||||
delimiters (brackets, quotes, etc.), with some optional auto-completions and
|
|
||||||
expansions.
|
|
||||||
|
|
||||||
When automatic closing is enabled, if an opening delimiter is inserted
|
|
||||||
delimitMate inserts the closing pair and places the cursor between them. When
|
|
||||||
automatic closing is disabled, no closing delimiters is inserted by
|
|
||||||
delimitMate, but if a pair of delimiters is typed, the cursor is placed in the
|
|
||||||
middle. Also, to get out of a pair of delimiters just type the right delimiter
|
|
||||||
and the cursor will jump to the right.
|
|
||||||
|
|
||||||
If the cursor is inside an empty pair of delimiters <Space> and <CR> can be
|
|
||||||
expanded to follow your coding style, you just need to define a couple of
|
|
||||||
options with the desired mappings for them.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
2. FUNCTIONALITY PROVIDED *delimitMateFunctionality*
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
2.1 AUTOMATIC CLOSING AND EXITING *delimitMateAutoClose*
|
|
||||||
|
|
||||||
With automatic closing enabled, if an opening delimiter is inserted the plugin
|
|
||||||
inserts the closing delimiter and places the cursor between the pair. With
|
|
||||||
automatic closing disabled, no closing delimiters is inserted by delimitMate,
|
|
||||||
but when a pair of delimiters is typed, the cursor is placed in the middle.
|
|
||||||
|
|
||||||
When the cursor is inside an empty pair or located next to the left of a
|
|
||||||
closing delimiter, the cursor is placed outside the pair to the right of the
|
|
||||||
closing delimiter.
|
|
||||||
|
|
||||||
Unless |'b:delimitMate_matchpairs'| and |'b:delimitMate_quotes'|is set, this
|
|
||||||
script uses the values in '&matchpirs' to identify the pairs, and "\" ' ` "
|
|
||||||
for quotes respectively.
|
|
||||||
|
|
||||||
The following table shows the behaviour, this applies to quotes too (the final
|
|
||||||
position of the cursor is represented by a "|"):
|
|
||||||
|
|
||||||
With auto-close: >
|
|
||||||
Type | You get
|
|
||||||
====================
|
|
||||||
( | (|)
|
|
||||||
–––––––––|––––––––––
|
|
||||||
() | ()|
|
|
||||||
<
|
|
||||||
Without auto-close: >
|
|
||||||
|
|
||||||
Type | You get
|
|
||||||
====================
|
|
||||||
() | (|)
|
|
||||||
–––––––––|––––––––––
|
|
||||||
()) | ()|
|
|
||||||
<
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
2.2 EXPANSION OF SPACE AND CAR RETURN *delimitMateExpansion*
|
|
||||||
|
|
||||||
When the cursor is inside an empty pair of delimiters, <Space> and <CR> can be
|
|
||||||
expanded to follow your coding style with |'b:delimitMate_expand_space'| and
|
|
||||||
|'b:delimitMate_expand_cr'|. e.g. (cursor represented by a "|"):
|
|
||||||
|
|
||||||
Expand <Space> to: >
|
|
||||||
|
|
||||||
<Space><Space><Left> | You get
|
|
||||||
====================================
|
|
||||||
(|) | ( | )
|
|
||||||
<
|
|
||||||
Expand <CR> to: >
|
|
||||||
|
|
||||||
<CR><CR><Up> | You get
|
|
||||||
============================
|
|
||||||
(|) | (
|
|
||||||
| |
|
|
||||||
| )
|
|
||||||
<
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
2.3 DELETION OF EMPTY PAIR *delimitMateBackspace*
|
|
||||||
|
|
||||||
If you press backspace inside an empty pair, both delimiters are deleted.
|
|
||||||
|
|
||||||
e.g.: >
|
|
||||||
|
|
||||||
Before | After
|
|
||||||
====================================
|
|
||||||
call expand(|) | call expand|
|
|
||||||
<
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
2.4 WRAPPING OF VISUAL SELECTION *delimitMateVisualWrapping*
|
|
||||||
|
|
||||||
When visual mode is active this script allows for the selection to be enclosed
|
|
||||||
with delimiters. But, since brackets have special meaning in visual mode, a
|
|
||||||
leader (the value of 'mapleader' by default) should precede the delimiter.
|
|
||||||
This feature doesn't currently work on blockwise visual mode, any suggestions
|
|
||||||
will be welcome.
|
|
||||||
|
|
||||||
e.g. (selection represented between square brackets): >
|
|
||||||
|
|
||||||
Selected text | After q"
|
|
||||||
=============================================
|
|
||||||
An [absurd] example! | An "absurd" example!
|
|
||||||
<
|
|
||||||
==============================================================================
|
|
||||||
3. CUSTOMIZATION *delimitMateOptions*
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
3.1 OPTIONS SUMMARY *delimitMateOptionSummary*
|
|
||||||
|
|
||||||
The behaviour of this script can be customized setting the following options
|
|
||||||
in your vimrc file.
|
|
||||||
|
|
||||||
|'loaded_delimitMate'| Turns off the script.
|
|
||||||
|
|
||||||
|'delimitMate_autoclose'| Tells delimitMate whether to automagically
|
|
||||||
insert the closing delimiter.
|
|
||||||
|
|
||||||
|'b:delimitMate_matchpairs'| Tells delimitMate which characters are
|
|
||||||
matching pairs.
|
|
||||||
|
|
||||||
|'b:delimitMate_quotes'| Tells delimitMate which quotes should be
|
|
||||||
used.
|
|
||||||
|
|
||||||
|'delimitMate_visual_leader'| Sets the leader to be used in visual mode.
|
|
||||||
|
|
||||||
|'b:delimitMate_expand_cr'| Sets the expansion for <CR> inside an empty
|
|
||||||
pair of matching delimiters or quotes.
|
|
||||||
|
|
||||||
|'b:delimitMate_expand_space'| Sets the expansion for <Space> inside an
|
|
||||||
empty pair of matching delimiters or quotes.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
3.2 OPTIONS DETAILS *delimitMateOptionDetails*
|
|
||||||
|
|
||||||
Add the shown lines to your vimrc files in order to set the below options.
|
|
||||||
|
|
||||||
*'loaded_delimitMate'*
|
|
||||||
You can turn off this plugin using this line in your vimrc: >
|
|
||||||
let loaded_delimitMate = 1
|
|
||||||
<
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
*'delimitMate_autoclose'*
|
|
||||||
Values: 0 or 1.
|
|
||||||
Default: 1
|
|
||||||
|
|
||||||
If this option is set to 0, delimitMate will not add a closing delimiter
|
|
||||||
automagically. See |delimitMateAutoClose| for details.
|
|
||||||
e.g.: >
|
|
||||||
let delimitMate_autoclose = 0
|
|
||||||
<
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
*'b:delimitMate_matchpairs'*
|
|
||||||
Values: A string with |matchpairs| syntax.
|
|
||||||
Default: &matchpairs
|
|
||||||
|
|
||||||
Use this option to tell delimitMate which characters should be considered
|
|
||||||
matching pairs. Read |delimitMateAutoClose| for details.
|
|
||||||
e.g: >
|
|
||||||
let delimitMate = "(:),[:],{:},<:>"
|
|
||||||
<
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
*'b:delimitMate_quotes'*
|
|
||||||
Values: A string of characters separated by spaces.
|
|
||||||
Default: "\" ' `"
|
|
||||||
|
|
||||||
Use this option to tell delimitMate which characters should be considered as
|
|
||||||
quotes. Read |delimitMateAutoClose| for details.
|
|
||||||
e.g.: >
|
|
||||||
let b:delimitMate_quotes = "\" ' ` *"
|
|
||||||
<
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
*'delimitMate_visual_leader'*
|
|
||||||
Values: Any character.
|
|
||||||
Default: q
|
|
||||||
|
|
||||||
The value of this option will be used to wrap the selection in visual mode
|
|
||||||
when followed by a delimiter. Read |delimitMateVisualWrap| for details.
|
|
||||||
e.g: >
|
|
||||||
let delimitMate_visual_leader = "f"
|
|
||||||
<
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
*'b:delimitMate_expand_cr'*
|
|
||||||
Values: A key mapping.
|
|
||||||
Default: "\<CR>"
|
|
||||||
|
|
||||||
The value of this option will be used to expand the car return character when
|
|
||||||
typed inside an empty delimiter pair. Read |delimitMateExpansion| for details.
|
|
||||||
e.g.: >
|
|
||||||
let b:delimitMate_expand_cr = "\<CR>\<CR>\<Up>"
|
|
||||||
<
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
*'b:delimitMate_expand_space'*
|
|
||||||
Values: A key mapping.
|
|
||||||
Default: "\<Space>"
|
|
||||||
|
|
||||||
The value of this option will be used to expand the space character when typed
|
|
||||||
inside an empty delimiter pair. Read |delimitMateExpansion| for details.
|
|
||||||
e.g.: >
|
|
||||||
let b:delimitMate_expand_space = "\<Space>\<Space>\<Left>"
|
|
||||||
<
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
4. PUBLIC COMMANDS *delimitMatePublicCommands*
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
:DelimitMateReload *:DelimitMateReload*
|
|
||||||
|
|
||||||
Re-sets all the mappings used for this script, use it if any option has been
|
|
||||||
changed.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
:DelimitMateTest *:DelimitMateTest*
|
|
||||||
|
|
||||||
This command tests every mapping set-up for this script, useful for testing
|
|
||||||
custom configurations.
|
|
||||||
|
|
||||||
The following output corresponds to the default values, it will be different
|
|
||||||
depending on your configuration. "Open & close:" represents the final result
|
|
||||||
when the closing delimiter has been inserted, either manually or
|
|
||||||
automatically, see |delimitMateExpansion|. "Delete:" typing backspace in an
|
|
||||||
empty pair, see |delimitMateBackspace|. "Exit:" typing a closing delimiter
|
|
||||||
inside a pair of delimiters, see |delimitMateAutoclose|. "Space:" the
|
|
||||||
expansion, if any, of space, see |delimitMateExpansion|. "Visual-L",
|
|
||||||
"Visual-R" and "Visual" shows visual wrapping, see
|
|
||||||
|delimitMateVisualWrapping|. "Car return:" the expansion of car return, see
|
|
||||||
|delimitMateExpansion|. The cursor's position at the end of every test is
|
|
||||||
represented by an "|": >
|
|
||||||
|
|
||||||
* AUTOCLOSE:
|
|
||||||
Open & close: (|)
|
|
||||||
Delete: |
|
|
||||||
Exit: ()|
|
|
||||||
Space: ( |)
|
|
||||||
Visual-L: (v)
|
|
||||||
Visual-R: (v)
|
|
||||||
Car return: (
|
|
||||||
|)
|
|
||||||
|
|
||||||
Open & close: {|}
|
|
||||||
Delete: |
|
|
||||||
Exit: {}|
|
|
||||||
Space: { |}
|
|
||||||
Visual-L: {v}
|
|
||||||
Visual-R: {v}
|
|
||||||
Car return: {
|
|
||||||
|}
|
|
||||||
|
|
||||||
Open & close: [|]
|
|
||||||
Delete: |
|
|
||||||
Exit: []|
|
|
||||||
Space: [ |]
|
|
||||||
Visual-L: [v]
|
|
||||||
Visual-R: [v]
|
|
||||||
Car return: [
|
|
||||||
|]
|
|
||||||
|
|
||||||
Open & close: "|"
|
|
||||||
Delete: |
|
|
||||||
Exit: ""|
|
|
||||||
Space: " |"
|
|
||||||
Visual: "v"
|
|
||||||
Car return: "
|
|
||||||
|"
|
|
||||||
|
|
||||||
Open & close: '|'
|
|
||||||
Delete: |
|
|
||||||
Exit: ''|
|
|
||||||
Space: ' |'
|
|
||||||
Visual: 'v'
|
|
||||||
Car return: '
|
|
||||||
|'
|
|
||||||
|
|
||||||
Open & close: `|`
|
|
||||||
Delete: |
|
|
||||||
Exit: ``|
|
|
||||||
Space: ` |`
|
|
||||||
Visual: `v`
|
|
||||||
Car return: `
|
|
||||||
|`
|
|
||||||
<
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
5. TODO LIST *delimitMateTodo*
|
|
||||||
|
|
||||||
- Automatic set-up by file type.
|
|
||||||
- Make visual wrapping work on blockwise visual mode.
|
|
||||||
- Limit behaviour by region.
|
|
||||||
- Fix some problems wrapping a single empty line in visual mode.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
6. MAINTAINER *delimitMateMaintainer*
|
|
||||||
|
|
||||||
Hi there! My name is Israel Chauca F. and I can be reached at:
|
|
||||||
mailto:israelchauca@gmail.com
|
|
||||||
|
|
||||||
Feel free to send me any suggestions and/or comments about this plugin, I'll
|
|
||||||
be very pleased to read them.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
7. CREDITS *delimitMateCredits*
|
|
||||||
|
|
||||||
Some of the code that make this script is modified or just shamelessly copied
|
|
||||||
from the following sources:
|
|
||||||
|
|
||||||
- Ian McCracken
|
|
||||||
Post titled: Vim, Part II: Matching Pairs:
|
|
||||||
http://concisionandconcinnity.blogspot.com/
|
|
||||||
|
|
||||||
- Aristotle Pagaltzis
|
|
||||||
From the comments on the previous blog post and from:
|
|
||||||
http://gist.github.com/144619
|
|
||||||
|
|
||||||
- Vim Scripts:
|
|
||||||
http://www.vim.org/scripts
|
|
||||||
|
|
||||||
This script was inspired by the auto-completion of delimiters of TextMate.
|
|
||||||
|
|
||||||
vim:tw=78:ts=8:ft=help:norl:
|
|
||||||
376
delimitMate.vim
376
delimitMate.vim
@@ -1,376 +0,0 @@
|
|||||||
" ============================================================================
|
|
||||||
" File: delimitMate.vim
|
|
||||||
" Version: 1.1
|
|
||||||
" Description: This plugin tries to emulate the auto-completion of delimiters
|
|
||||||
" that TextMate provides.
|
|
||||||
" Maintainer: Israel Chauca F. <israelchauca@gmail.com>
|
|
||||||
" Credits: Some of the code is modified or just copied from the following:
|
|
||||||
"
|
|
||||||
" - Ian McCracken
|
|
||||||
" Post titled: Vim, Part II: Matching Pairs:
|
|
||||||
" http://concisionandconcinnity.blogspot.com/
|
|
||||||
"
|
|
||||||
" - Aristotle Pagaltzis
|
|
||||||
" From the comments on the previous blog post and from:
|
|
||||||
" http://gist.github.com/144619
|
|
||||||
"
|
|
||||||
" - Vim Scripts:
|
|
||||||
" http://www.vim.org/scripts/
|
|
||||||
|
|
||||||
if exists("g:loaded_delimitMate") && !exists("g:delimitMate_testing") "{{{1
|
|
||||||
" Don't define the functions if they already exist: just do the work (unless we are testing):
|
|
||||||
call s:DelimitMateDo()
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
if v:version < 700
|
|
||||||
echoerr "delimitMate: this plugin requires vim >= 7!"
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
let g:loaded_delimitMate = 1
|
|
||||||
|
|
||||||
function! s:Init() "{{{1
|
|
||||||
|
|
||||||
if !exists("g:delimitMate_autoclose")
|
|
||||||
let s:autoclose = 1
|
|
||||||
else
|
|
||||||
let s:autoclose = g:delimitMate_autoclose
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("b:delimitMate_matchpairs")
|
|
||||||
if s:ValidMatchpairs(&matchpairs) == 1
|
|
||||||
let s:matchpairs_temp = &matchpairs
|
|
||||||
else
|
|
||||||
echoerr "delimitMate: There seems to be a problem with 'matchpairs', read ':help matchpairs' and fix it or notify the maintainer of this script if this is a bug."
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if s:ValidMatchpairs(b:delimitMate_matchpairs) || b:delimitMate_matchpairs == ""
|
|
||||||
let s:matchpairs_temp = b:delimitMate_matchpairs
|
|
||||||
else
|
|
||||||
echoerr "delimitMate: Invalid format in 'b:delimitMate_matchpairs', falling back to matchpairs. Fix the error and use the command :DelimitMateReload to try again."
|
|
||||||
if s:ValidMatchpairs(&matchpairs) == 1
|
|
||||||
let s:matchpairs_temp = &matchpairs
|
|
||||||
else
|
|
||||||
echoerr "delimitMate: There seems to be a problem with 'matchpairs', read ':help matchpairs' and fix it or notify the maintainer of this script if this is a bug."
|
|
||||||
let s:matchpairs_temp = ""
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists("b:delimitMate_quotes")
|
|
||||||
if b:delimitMate_quotes =~ '^\(\S\)\(\s\S\)*$' || b:delimitMate_quotes == ""
|
|
||||||
let s:quotes = split(b:delimitMate_quotes)
|
|
||||||
else
|
|
||||||
let s:quotes = split("\" ' `")
|
|
||||||
echoerr "delimitMate: There is a problem with the format of 'b:delimitMate_quotes', it should be a string of single characters separated by spaces. Falling back to default values."
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let s:quotes = split("\" ' `")
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:delimitMate_visual_leader")
|
|
||||||
if !exists("g:mapleader")
|
|
||||||
let s:visual_leader = "\\"
|
|
||||||
else
|
|
||||||
let s:visual_leader = g:mapleader
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let s:visual_leader = g:delimitMate_visual_leader
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("b:delimitMate_expand_space")
|
|
||||||
let s:expand_space = "\<Space>"
|
|
||||||
elseif b:delimitMate_expand_space == ""
|
|
||||||
let s:expand_space = "\<Space>"
|
|
||||||
else
|
|
||||||
let s:expand_space = b:delimitMate_expand_space
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("b:delimitMate_expand_cr")
|
|
||||||
let s:expand_return = "\<CR>"
|
|
||||||
elseif b:delimitMate_expand_cr == ""
|
|
||||||
let s:expand_return = "\<CR>"
|
|
||||||
else
|
|
||||||
let s:expand_return = b:delimitMate_expand_cr
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:matchpairs = split(s:matchpairs_temp, ',')
|
|
||||||
let s:left_delims = split(s:matchpairs_temp, ':.,\=')
|
|
||||||
let s:right_delims = split(s:matchpairs_temp, ',\=.:')
|
|
||||||
let s:VMapMsg = "delimitMate: delimitMate is disabled on blockwise visual mode."
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:ValidMatchpairs(str) "{{{1
|
|
||||||
if a:str !~ '^\(.:.\)\+\(,.:.\)*$'
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
for pair in split(a:str,',')
|
|
||||||
if strpart(pair, 0, 1) == strpart(pair, 2, 1) || strlen(pair) != 3
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return 1
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function! s:IsEmptyPair(str) "{{{1
|
|
||||||
for pair in s:matchpairs
|
|
||||||
if a:str == join( split( pair, ':' ),'' )
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
for quote in s:quotes
|
|
||||||
if a:str == quote . quote
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return 0
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function! s:WithinEmptyPair() "{{{1
|
|
||||||
let cur = strpart( getline('.'), col('.')-2, 2 )
|
|
||||||
return s:IsEmptyPair( cur )
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function! s:SkipDelim(char) "{{{1
|
|
||||||
let cur = strpart( getline('.'), col('.')-2, 3 )
|
|
||||||
if cur[0] == "\\"
|
|
||||||
return a:char
|
|
||||||
elseif cur[1] == a:char
|
|
||||||
return "\<Right>"
|
|
||||||
elseif cur[1] == ' ' && cur[2] == a:char
|
|
||||||
" I'm leaving this in case someone likes it.
|
|
||||||
return "\<Right>\<Right>"
|
|
||||||
elseif s:IsEmptyPair( cur[0] . a:char )
|
|
||||||
return a:char . "\<Left>"
|
|
||||||
else
|
|
||||||
return a:char
|
|
||||||
endif
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function! s:QuoteDelim(char) "{{{1
|
|
||||||
let line = getline('.')
|
|
||||||
let col = col('.')
|
|
||||||
if line[col - 2] == "\\"
|
|
||||||
"Inserting a quoted quotation mark into the string
|
|
||||||
return a:char
|
|
||||||
elseif line[col - 1] == a:char
|
|
||||||
"Escaping out of the string
|
|
||||||
return "\<Right>"
|
|
||||||
else
|
|
||||||
"Starting a string
|
|
||||||
return a:char.a:char."\<Left>"
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
function! s:ClosePair(char) "{{{1
|
|
||||||
if getline('.')[col('.') - 1] == a:char
|
|
||||||
return "\<Right>"
|
|
||||||
else
|
|
||||||
return a:char
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
function! s:ResetMappings() "{{{1
|
|
||||||
for delim in s:right_delims + s:left_delims + s:quotes
|
|
||||||
silent! exec 'iunmap <buffer> ' . delim
|
|
||||||
silent! exec 'vunmap <buffer> ' . s:visual_leader . delim
|
|
||||||
endfor
|
|
||||||
silent! iunmap <buffer> <CR>
|
|
||||||
silent! iunmap <buffer> <Space>
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:MapMsg(msg) "{{{1
|
|
||||||
redraw
|
|
||||||
echomsg a:msg
|
|
||||||
return ""
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:NoAutoClose() "{{{1
|
|
||||||
" imap <buffer> ) <C-R>=<SID>SkipDelim('\)')<CR>
|
|
||||||
for delim in s:right_delims + s:quotes
|
|
||||||
exec 'imap <buffer> ' . delim . ' <C-R>=<SID>SkipDelim("' . escape(delim,'"') . '")<CR>'
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" Wrap the selection with delimiters, but do nothing if blockwise visual mode is active:
|
|
||||||
for i in range(len(s:matchpairs))
|
|
||||||
" Map left delimiter:
|
|
||||||
" vmap <buffer> <expr> q( visualmode() == "<C-V>" ? <SID>MapMsg(VMapMsg) : "s(\<C-R>\")\<Esc>"
|
|
||||||
exec 'vmap <buffer> <expr> ' . s:visual_leader . s:left_delims[i] . ' visualmode() == "<C-V>" ? <SID>MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[i] . '\<C-R>\"' . s:right_delims[i] . '\<Esc>"'
|
|
||||||
|
|
||||||
" Map right delimiter:
|
|
||||||
" vmap <buffer> <expr> q) visualmode() == "<C-V>" ? <SID>MapMsg(VMapMsg) : "s(\<C-R>\")\<Esc>"
|
|
||||||
exec 'vmap <buffer> <expr> ' . s:visual_leader . s:right_delims[i] . ' visualmode() == "<C-V>" ? <SID>MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[i] . '\<C-R>\"' . s:right_delims[i] . '"'
|
|
||||||
endfor
|
|
||||||
|
|
||||||
for quote in s:quotes
|
|
||||||
" vmap <buffer> <expr> q" visualmode() == "<C-V>" ? <SID>MapMsg(VMapMsg) : "s'\<C-R>\"'\<Esc>"
|
|
||||||
exec 'vmap <buffer> <expr> ' . s:visual_leader . quote . ' visualmode() == "<C-V>" ? <SID>MapMsg("' . s:VMapMsg . '") : "s' . escape(quote,'"') . '\<C-R>\"' . escape(quote,'"') . '\<Esc>"'
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:AutoClose() "{{{1
|
|
||||||
" Add matching pair and jump to the midle:
|
|
||||||
" imap <buffer> ( ()<Left>
|
|
||||||
let s:i = 0
|
|
||||||
while s:i < len(s:matchpairs)
|
|
||||||
exec 'imap <buffer> ' . s:left_delims[s:i] . ' ' . s:left_delims[s:i] . s:right_delims[s:i] . '<Left>'
|
|
||||||
let s:i += 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
" Add matching quote and jump to the midle, or exit if inside a pair of matching quotes:
|
|
||||||
" imap <buffer> " <C-R>=<SID>QuoteDelim("\"")<CR>
|
|
||||||
for delim in s:quotes
|
|
||||||
exec 'imap <buffer> ' . delim . ' <C-R>=<SID>QuoteDelim("\' . delim . '")<CR>'
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" Exit from inside the matching pair:
|
|
||||||
" imap <buffer> ) <C-R>=<SID>ClosePair(')')<CR>
|
|
||||||
for delim in s:right_delims
|
|
||||||
exec 'imap <buffer> ' . delim . ' <C-R>=<SID>ClosePair("\' . delim . '")<CR>'
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" Wrap the selection with matching pairs, but do nothing if blockwise visual mode is active:
|
|
||||||
let s:i = 0
|
|
||||||
while s:i < len(s:matchpairs)
|
|
||||||
" Map left delimiter:
|
|
||||||
" vmap <buffer> <expr> q( visualmode() == "<C-V>" ? <SID>MapMsg("Message") : "s(\<C-R>\"\<Esc>"
|
|
||||||
exec 'vmap <buffer> <expr> ' . s:visual_leader . s:left_delims[s:i] . ' visualmode() == "<C-V>" ? <SID>MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[s:i] . '\<C-R>\"\<Esc>"'
|
|
||||||
|
|
||||||
" Map right delimiter:
|
|
||||||
" vmap <buffer> <expr> q) visualmode() == "<C-V>" ? <SID>MapMsg("Message") : "s(\<C-R>\""\<Esc>"
|
|
||||||
exec 'vmap <buffer> <expr> ' . s:visual_leader . s:right_delims[s:i] . ' visualmode() == "<C-V>" ? <SID>MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[s:i] . '\<C-R>\""'
|
|
||||||
let s:i += 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
" Wrap the selection with matching quotes, but do nothing if blockwise visual mode is active:
|
|
||||||
for quote in s:quotes
|
|
||||||
" vmap <buffer> <expr> q' visualmode() == "<C-V>" ? <SID>MapMsg("Message") : "s'\<C-R>\"'\<Esc>"
|
|
||||||
exec 'vmap <buffer> <expr> ' . s:visual_leader . quote . ' visualmode() == "<C-V>" ? <SID>MapMsg("' . s:VMapMsg . '") : "s' . escape(quote,'"') .'\<C-R>\"' . escape(quote,'"') . '\<Esc>"'
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:ExpandReturn() "{{{1
|
|
||||||
if s:WithinEmptyPair()
|
|
||||||
return s:expand_return
|
|
||||||
else
|
|
||||||
return "\<CR>"
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:ExpandSpace() "{{{1
|
|
||||||
if s:WithinEmptyPair()
|
|
||||||
return s:expand_space
|
|
||||||
else
|
|
||||||
return "\<Space>"
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:ExtraMappings() "{{{1
|
|
||||||
" If pair is empty, delete both delimiters:
|
|
||||||
imap <buffer> <expr> <BS> <SID>WithinEmptyPair() ? "\<Right>\<BS>\<BS>" : "\<BS>"
|
|
||||||
|
|
||||||
" Expand return if inside an empty pair:
|
|
||||||
imap <buffer> <CR> <C-R>=<SID>ExpandReturn()<CR>
|
|
||||||
|
|
||||||
" Expand space if inside an empty pair:
|
|
||||||
imap <buffer> <Space> <C-R>=<SID>ExpandSpace()<CR>
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:TestMappings() "{{{1
|
|
||||||
if s:autoclose
|
|
||||||
exec "normal i* AUTOCLOSE:\<CR>"
|
|
||||||
for i in range(len(s:left_delims))
|
|
||||||
exec "normal GGAOpen & close: " . s:left_delims[i]. "|"
|
|
||||||
exec "normal A\<CR>Delete: " . s:left_delims[i] . "\<BS>|"
|
|
||||||
exec "normal A\<CR>Exit: " . s:left_delims[i] . s:right_delims[i] . "|"
|
|
||||||
exec "normal A\<CR>Space: " . s:left_delims[i] . " |"
|
|
||||||
exec "normal GGA\<CR>Visual-L: v\<Esc>v" . s:visual_leader . s:left_delims[i]
|
|
||||||
exec "normal A\<CR>Visual-R: v\<Esc>v" . s:visual_leader . s:right_delims[i]
|
|
||||||
exec "normal A\<CR>Car return: " . s:left_delims[i] . "\<CR>|\<Esc>GGA\<CR>\<CR>"
|
|
||||||
endfor
|
|
||||||
for i in range(len(s:quotes))
|
|
||||||
exec "normal GGAOpen & close: " . s:quotes[i] . "|"
|
|
||||||
exec "normal A\<CR>Delete: " . s:quotes[i] . "\<BS>|"
|
|
||||||
exec "normal A\<CR>Exit: " . s:quotes[i] . s:quotes[i] . "|"
|
|
||||||
exec "normal A\<CR>Space: " . s:quotes[i] . " |"
|
|
||||||
exec "normal GGA\<CR>Visual: v\<Esc>v" . s:visual_leader . s:quotes[i]
|
|
||||||
exec "normal A\<CR>Car return: " . s:quotes[i] . "\<CR>|\<Esc>GGA\<CR>\<CR>"
|
|
||||||
endfor
|
|
||||||
else
|
|
||||||
exec "normal i* NO AUTOCLOSE:\<CR>"
|
|
||||||
for i in range(len(s:left_delims))
|
|
||||||
exec "normal GGAOpen & close: " . s:left_delims[i] . s:right_delims[i] . "|"
|
|
||||||
exec "normal A\<CR>Delete: " . s:left_delims[i] . s:right_delims[i] . "\<BS>|"
|
|
||||||
exec "normal A\<CR>Exit: " . s:left_delims[i] . s:right_delims[i] . s:right_delims[i] . "|"
|
|
||||||
exec "normal A\<CR>Space: " . s:left_delims[i] . s:right_delims[i] . " |"
|
|
||||||
exec "normal GGA\<CR>Visual-L: v\<Esc>v" . s:visual_leader . s:left_delims[i]
|
|
||||||
exec "normal A\<CR>Visual-R: v\<Esc>v" . s:visual_leader . s:right_delims[i]
|
|
||||||
exec "normal A\<CR>Car return: " . s:left_delims[i] . s:right_delims[i] . "\<CR>|\<Esc>GGA\<CR>\<CR>"
|
|
||||||
endfor
|
|
||||||
for i in range(len(s:quotes))
|
|
||||||
exec "normal GGAOpen & close: " . s:quotes[i] . s:quotes[i] . "|"
|
|
||||||
exec "normal A\<CR>Delete: " . s:quotes[i] . s:quotes[i] . "\<BS>|"
|
|
||||||
exec "normal A\<CR>Exit: " . s:quotes[i] . s:quotes[i] . s:quotes[i] . "|"
|
|
||||||
exec "normal A\<CR>Space: " . s:quotes[i] . s:quotes[i] . " |"
|
|
||||||
exec "normal GGA\<CR>Visual: v\<Esc>v" . s:visual_leader . s:quotes[i]
|
|
||||||
exec "normal A\<CR>Car return: " . s:quotes[i] . s:quotes[i] . "\<CR>|\<Esc>GGA\<CR>\<CR>"
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
exec "normal \<Esc>"
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:SwitchAutoclose() "{{{1
|
|
||||||
if !exists("g:delimitMate_autoclose")
|
|
||||||
let g:delimitMate_autoclose = 1
|
|
||||||
elseif g:delimitMate_autoclose == 1
|
|
||||||
let g:delimitMate_autoclose = 0
|
|
||||||
else
|
|
||||||
let g:delimitMate_autoclose = 1
|
|
||||||
endif
|
|
||||||
DelimitMateReload
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:TestMappingsDo() "{{{1
|
|
||||||
if !exists("g:delimitMate_testing")
|
|
||||||
call s:DelimitMateDo()
|
|
||||||
call s:TestMappings()
|
|
||||||
else
|
|
||||||
call s:SwitchAutoclose()
|
|
||||||
call s:TestMappings()
|
|
||||||
exec "normal i\<CR>"
|
|
||||||
call s:SwitchAutoclose()
|
|
||||||
call s:TestMappings()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:DelimitMateDo() "{{{1
|
|
||||||
try
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
call s:Init()
|
|
||||||
call s:ResetMappings()
|
|
||||||
if s:autoclose
|
|
||||||
call s:AutoClose()
|
|
||||||
else
|
|
||||||
call s:NoAutoClose()
|
|
||||||
endif
|
|
||||||
call s:ExtraMappings()
|
|
||||||
finally
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Do the real work: {{{1
|
|
||||||
call s:DelimitMateDo()
|
|
||||||
|
|
||||||
" Let me refresh without re-loading the buffer:
|
|
||||||
command! DelimitMateReload call s:DelimitMateDo()
|
|
||||||
|
|
||||||
" Quick test:
|
|
||||||
command! DelimitMateTest call s:TestMappingsDo()
|
|
||||||
|
|
||||||
" GetLatestVimScripts: 2754 1 :AutoInstall: delimitMate.vim
|
|
||||||
" vim:foldmethod=marker:foldcolumn=2
|
|
||||||
882
doc/delimitMate.txt
Normal file
882
doc/delimitMate.txt
Normal file
@@ -0,0 +1,882 @@
|
|||||||
|
*delimitMate.txt* Trying to keep those beasts at bay! v2.7 *delimitMate*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||||
|
MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMM MMMMMMMMMMMMMMMMMMMMM ~
|
||||||
|
MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMM MMMMMMMMMMMMMMMMMMMMM
|
||||||
|
MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMM MMM M M MMMMMMMMMM MMMMMMMMM ~
|
||||||
|
MMMM MMM MMM MM MM M M MMM MM MM MM MM MMM MMM MMM MM
|
||||||
|
MM MM M MM MMMMMM MMMMMMM MMM MMMMM MM M MMM MMM M M ~
|
||||||
|
M M MM MM MM MM M M MM MMM MMM MMMMM MMMMM MMM MMM M
|
||||||
|
M M MM MMMMM MM MM M M MM MMM MMM MMMMM MMM MMM MMM MMMM ~
|
||||||
|
M M MM M MM MM MM M M MM MMM MMM MMMMM MM M MMM MMM M M
|
||||||
|
MM MMM MMM MM MM M M MM MMM MM MMMMM MMM MMM MMM MM ~
|
||||||
|
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
0.- CONTENTS *delimitMate-contents*
|
||||||
|
|
||||||
|
1. Introduction____________________________|delimitMateIntro|
|
||||||
|
2. Customization___________________________|delimitMateOptions|
|
||||||
|
2.1 Options summary____________________|delimitMateOptionSummary|
|
||||||
|
2.2 Options details____________________|delimitMateOptionDetails|
|
||||||
|
3. Functionality___________________________|delimitMateFunctionality|
|
||||||
|
3.1 Automatic closing & exiting________|delimitMateAutoClose|
|
||||||
|
3.2 Expansion of space and CR__________|delimitMateExpansion|
|
||||||
|
3.3 Backspace__________________________|delimitMateBackspace|
|
||||||
|
3.4 Smart Quotes_______________________|delimitMateSmartQuotes|
|
||||||
|
3.5 Balancing matching pairs___________|delimitMateBalance|
|
||||||
|
3.6 FileType based configuration_______|delimitMateFileType|
|
||||||
|
3.7 Syntax awareness___________________|delimitMateSyntax|
|
||||||
|
4. Commands________________________________|delimitMateCommands|
|
||||||
|
5. Mappings________________________________|delimitMateMappings|
|
||||||
|
6. Functions_______________________________|delimitMateFunctions|
|
||||||
|
7. TODO list_______________________________|delimitMateTodo|
|
||||||
|
8. Maintainer______________________________|delimitMateMaintainer|
|
||||||
|
9. Credits_________________________________|delimitMateCredits|
|
||||||
|
10. History_________________________________|delimitMateHistory|
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
1.- INTRODUCTION *delimitMateIntro*
|
||||||
|
|
||||||
|
This plug-in provides automatic closing of quotes, parenthesis, brackets,
|
||||||
|
etc.; besides some other related features that should make your time in insert
|
||||||
|
mode a little bit easier.
|
||||||
|
|
||||||
|
Most of the features can be modified or disabled permanently, using global
|
||||||
|
variables, or on a FileType basis, using autocommands.
|
||||||
|
|
||||||
|
NOTE 1: If you have any trouble with this plugin, please run |:DelimitMateTest|
|
||||||
|
in a new buffer to see what is not working.
|
||||||
|
|
||||||
|
NOTE 2: Abbreviations set with |:iabbrev| will not be expanded by delimiters
|
||||||
|
used on delimitMate, you should use <C-]> (read |i_CTRL-]|) to expand them on
|
||||||
|
the go.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
2. CUSTOMIZATION *delimitMateOptions*
|
||||||
|
|
||||||
|
You can create your own mappings for some features using the global functions.
|
||||||
|
Read |DelimitMateFunctions| for more info.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
2.1 OPTIONS SUMMARY *delimitMateOptionSummary*
|
||||||
|
|
||||||
|
The behaviour of this script can be customized setting the following options
|
||||||
|
in your vimrc file. You can use local options to set the configuration for
|
||||||
|
specific file types, see |delimitMateOptionDetails| for examples.
|
||||||
|
|
||||||
|
|'loaded_delimitMate'| Turns off the script.
|
||||||
|
|
||||||
|
|'delimitMate_autoclose'| Tells delimitMate whether to automagically
|
||||||
|
insert the closing delimiter.
|
||||||
|
|
||||||
|
|'delimitMate_matchpairs'| Tells delimitMate which characters are
|
||||||
|
matching pairs.
|
||||||
|
|
||||||
|
|'delimitMate_quotes'| Tells delimitMate which quotes should be
|
||||||
|
used.
|
||||||
|
|
||||||
|
|'delimitMate_nesting_quotes'| Tells delimitMate which quotes should be
|
||||||
|
allowed to be nested.
|
||||||
|
|
||||||
|
|'delimitMate_expand_cr'| Turns on/off the expansion of <CR>.
|
||||||
|
|
||||||
|
|'delimitMate_expand_space'| Turns on/off the expansion of <Space>.
|
||||||
|
|
||||||
|
|'delimitMate_jump_expansion'| Turns on/off jumping over expansions.
|
||||||
|
|
||||||
|
|'delimitMate_smart_quotes'| Turns on/off the "smart quotes" feature.
|
||||||
|
|
||||||
|
|'delimitMate_smart_matchpairs'| Turns on/off the "smart matchpairs" feature.
|
||||||
|
|
||||||
|
|'delimitMate_balance_matchpairs'|Turns on/off the "balance matching pairs"
|
||||||
|
feature.
|
||||||
|
|
||||||
|
|'delimitMate_excluded_regions'| Turns off the script for the given regions or
|
||||||
|
syntax group names.
|
||||||
|
|
||||||
|
|'delimitMate_excluded_ft'| Turns off the script for the given file types.
|
||||||
|
|
||||||
|
|'delimitMate_eol_marker'| Determines what to insert after the closing
|
||||||
|
matchpair when typing an opening matchpair on
|
||||||
|
the end of the line.
|
||||||
|
|
||||||
|
|'delimitMate_apostrophes'| Tells delimitMate how it should "fix"
|
||||||
|
balancing of single quotes when used as
|
||||||
|
apostrophes. NOTE: Not needed any more, kept
|
||||||
|
for compatibility with older versions.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
2.2 OPTIONS DETAILS *delimitMateOptionDetails*
|
||||||
|
|
||||||
|
Add the shown lines to your vimrc file in order to set the below options.
|
||||||
|
Buffer variables take precedence over global ones and can be used along with
|
||||||
|
autocmd to modify delimitMate's behavior for specific file types, read more in
|
||||||
|
|delimitMateFileType|.
|
||||||
|
|
||||||
|
Note: Use buffer variables only to set options for specific file types using
|
||||||
|
:autocmd, use global variables to set options for all buffers. Read more in
|
||||||
|
|g:var| and |b:var|.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'loaded_delimitMate'*
|
||||||
|
*'b:loaded_delimitMate'*
|
||||||
|
This option prevents delimitMate from loading.
|
||||||
|
e.g.: >
|
||||||
|
let loaded_delimitMate = 1
|
||||||
|
au FileType mail let b:loaded_delimitMate = 1
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_offByDefault'*
|
||||||
|
Values: 0 or 1.~
|
||||||
|
Default: 0~
|
||||||
|
|
||||||
|
If this option is set to 1, delimitMate will load, but will not take
|
||||||
|
effect in any buffer unless |:DelimitMateSwitch| is called in that
|
||||||
|
buffer.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_autoclose'*
|
||||||
|
*'b:delimitMate_autoclose'*
|
||||||
|
Values: 0 or 1. ~
|
||||||
|
Default: 1 ~
|
||||||
|
|
||||||
|
If this option is set to 0, delimitMate will not add a closing delimiter
|
||||||
|
automagically. See |delimitMateAutoClose| for details.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_autoclose = 0
|
||||||
|
au FileType mail let b:delimitMate_autoclose = 0
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_matchpairs'*
|
||||||
|
*'b:delimitMate_matchpairs'*
|
||||||
|
Values: A string with |'matchpairs'| syntax, plus support for multi-byte~
|
||||||
|
characters.~
|
||||||
|
Default: &matchpairs ~
|
||||||
|
|
||||||
|
Use this option to tell delimitMate which characters should be considered
|
||||||
|
matching pairs. Read |delimitMateAutoClose| for details.
|
||||||
|
e.g: >
|
||||||
|
let delimitMate_matchpairs = "(:),[:],{:},<:>"
|
||||||
|
au FileType vim,html let b:delimitMate_matchpairs = "(:),[:],{:},<:>"
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_quotes'*
|
||||||
|
*'b:delimitMate_quotes'*
|
||||||
|
Values: A string of characters separated by spaces. ~
|
||||||
|
Default: "\" ' `" ~
|
||||||
|
|
||||||
|
Use this option to tell delimitMate which characters should be considered as
|
||||||
|
quotes. Read |delimitMateAutoClose| for details.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_quotes = "\" ' ` *"
|
||||||
|
au FileType html let b:delimitMate_quotes = "\" '"
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_nesting_quotes'*
|
||||||
|
*'b:delimitMate_nesting_quotes'*
|
||||||
|
Values: A list of quotes. ~
|
||||||
|
Default: [] ~
|
||||||
|
|
||||||
|
When adding a third quote listed in this option is inserted, three quotes will
|
||||||
|
be inserted to the right of the cursor and the cursor will stay in the middle.
|
||||||
|
If more quotes are inserted the number of quotes on both sides of the cursor
|
||||||
|
will stay balanced.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_nesting_quotes = ['"','`']
|
||||||
|
au FileType python let b:delimitMate_nesting_quotes = ['"']
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_expand_cr'*
|
||||||
|
*'b:delimitMate_expand_cr'*
|
||||||
|
Values: 0, 1 or 2 ~
|
||||||
|
Default: 0 ~
|
||||||
|
|
||||||
|
This option turns on/off the expansion of <CR>. Read |delimitMateExpansion|
|
||||||
|
for details. NOTE This feature requires that 'backspace' is either set to 2 or
|
||||||
|
has "eol" and "start" as part of its value.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_expand_cr = 1
|
||||||
|
au FileType mail let b:delimitMate_expand_cr = 1
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_expand_space'*
|
||||||
|
*'b:delimitMate_expand_space'*
|
||||||
|
Values: 1 or 0 ~
|
||||||
|
Default: 0 ~
|
||||||
|
This option turns on/off the expansion of <Space>. Read |delimitMateExpansion|
|
||||||
|
for details.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_expand_space = 1
|
||||||
|
au FileType tcl let b:delimitMate_expand_space = 1
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_expand_inside_quotes'*
|
||||||
|
*'b:delimitMate_expand_inside_quotes'*
|
||||||
|
Values: 1 or 0 ~
|
||||||
|
Default: 0 ~
|
||||||
|
When this option is set to 1 the expansion of space and cr will also be
|
||||||
|
applied to quotes. Read |delimitMateExpansion| for details.
|
||||||
|
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_expand_inside_quotes = 1
|
||||||
|
au FileType mail let b:delimitMate_expand_inside_quotes = 1
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_jump_expansion'*
|
||||||
|
*'b:delimitMate_jump_expansion'*
|
||||||
|
Values: 1 or 0 ~
|
||||||
|
Default: 0 ~
|
||||||
|
This option turns on/off the jumping over <CR> and <Space> expansions when
|
||||||
|
inserting closing matchpairs. Read |delimitMateExpansion| for details.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_jump_expansion = 1
|
||||||
|
au FileType tcl let b:delimitMate_jump_expansion = 1
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_smart_quotes'*
|
||||||
|
*'b:delimitMate_smart_quotes'*
|
||||||
|
Values: String with an optional ! at the beginning followed by a regexp ~
|
||||||
|
Default:~
|
||||||
|
'\%(\w\|[^[:punct:][:space:]]\|\%(\\\\\)*\\\)\%#\|\%#\%(\w\|[^[:space:][:punct:]]\)' ~
|
||||||
|
|
||||||
|
A bang (!) at the beginning is removed and used to "negate" the pattern. The
|
||||||
|
remaining text is used as a regexp to be matched on the current line. A single
|
||||||
|
quote is inserted when the pattern matches and a bang is not present. The bang
|
||||||
|
changes that, so a single quote is inserted only if the regexp does not match.
|
||||||
|
|
||||||
|
This feature is disabled when the variable is set to an empty string, with the
|
||||||
|
exception of apostrophes.
|
||||||
|
|
||||||
|
Note that you need to use '\%#' to match the position of the cursor. Keep in
|
||||||
|
mind that '\%#' matches with zero width, so if you need to match the char
|
||||||
|
under the cursor (which would be the one to the right on insert mode) use
|
||||||
|
something like '\%#.'.
|
||||||
|
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_smart_quotes = '\w\%#'
|
||||||
|
au FileType tcl let b:delimitMate_smart_quotes = '!\s\%#\w'
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_smart_matchpairs'*
|
||||||
|
*'b:delimitMate_smart_matchpairs'*
|
||||||
|
Values: Regexp ~
|
||||||
|
Default: '^\%(\w\|\!\|£\|\$\|_\|["'']\s*\S\)' ~
|
||||||
|
|
||||||
|
This regex is matched against the text to the right of cursor, if it's not
|
||||||
|
empty and there is a match delimitMate will not autoclose the pair. At the
|
||||||
|
moment to match the text, an escaped bang (\!) in the regex will be replaced
|
||||||
|
by the character being inserted, while an escaped number symbol (\#) will be
|
||||||
|
replaced by the closing pair.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_smart_matchpairs = ''
|
||||||
|
au FileType tcl let b:delimitMate_smart_matchpairs = '^\%(\w\|\$\)'
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_balance_matchpairs'*
|
||||||
|
*'b:delimitMate_balance_matchpairs'*
|
||||||
|
Values: 1 or 0 ~
|
||||||
|
Default: 0 ~
|
||||||
|
|
||||||
|
This option turns on/off the balancing of matching pairs. Read
|
||||||
|
|delimitMateBalance| for details.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_balance_matchpairs = 1
|
||||||
|
au FileType tcl let b:delimitMate_balance_matchpairs = 1
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_excluded_regions'*
|
||||||
|
Values: A string of syntax group names names separated by single commas. ~
|
||||||
|
Default: Comment ~
|
||||||
|
|
||||||
|
This options turns delimitMate off for the listed regions, read |group-name|
|
||||||
|
for more info about what is a region.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_excluded_regions = "Comment,String"
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_excluded_ft'*
|
||||||
|
Values: A string of file type names separated by single commas. ~
|
||||||
|
Default: Empty. ~
|
||||||
|
|
||||||
|
This options turns delimitMate off for the listed file types, use this option
|
||||||
|
only if you don't want any of the features it provides on those file types.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_excluded_ft = "mail,txt"
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_eol_marker'*
|
||||||
|
Values: String. ~
|
||||||
|
Default: Empty. ~
|
||||||
|
|
||||||
|
The contents of this string will be inserted after the closing matchpair or
|
||||||
|
quote when the respective opening matchpair or quote is inserted at the end
|
||||||
|
of the line.
|
||||||
|
e.g.: >
|
||||||
|
au FileType c,perl let b:delimitMate_eol_marker = ";"
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*'delimitMate_apostrophes'*
|
||||||
|
Values: Strings separated by ":". ~
|
||||||
|
Default: No longer used. ~
|
||||||
|
|
||||||
|
NOTE: This feature is turned off by default, it's been kept for compatibility
|
||||||
|
with older version, read |delimitMateSmartQuotes| for details.
|
||||||
|
If auto-close is enabled, this option tells delimitMate how to try to fix the
|
||||||
|
balancing of single quotes when used as apostrophes. The values of this option
|
||||||
|
are strings of text where a single quote would be used as an apostrophe (e.g.:
|
||||||
|
the "n't" of wouldn't or can't) separated by ":". Set it to an empty string to
|
||||||
|
disable this feature.
|
||||||
|
e.g.: >
|
||||||
|
let delimitMate_apostrophes = ""
|
||||||
|
au FileType tcl let delimitMate_apostrophes = ""
|
||||||
|
<
|
||||||
|
==============================================================================
|
||||||
|
3. FUNCTIONALITY *delimitMateFunctionality*
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.1 AUTOMATIC CLOSING AND EXITING *delimitMateAutoClose*
|
||||||
|
|
||||||
|
With automatic closing enabled, if an opening delimiter is inserted the plugin
|
||||||
|
inserts the closing delimiter and places the cursor between the pair. With
|
||||||
|
automatic closing disabled, no closing delimiters is inserted by delimitMate,
|
||||||
|
but when a pair of delimiters is typed, the cursor is placed in the middle.
|
||||||
|
|
||||||
|
When the cursor is inside an empty pair or located next to the left of a
|
||||||
|
closing delimiter, the cursor is placed outside the pair to the right of the
|
||||||
|
closing delimiter.
|
||||||
|
|
||||||
|
When |'delimitMate_smart_matchpairs'| is not empty and it matches the text to
|
||||||
|
the right of the cursor, delimitMate will not automatically insert the closing
|
||||||
|
pair.
|
||||||
|
|
||||||
|
Unless |'delimitMate_matchpairs'| or |'delimitMate_quotes'| are set, this
|
||||||
|
script uses the values in '&matchpairs' to identify the pairs, and ", ' and `
|
||||||
|
for quotes respectively.
|
||||||
|
|
||||||
|
<S-Tab> will jump over a single closing delimiter or quote, <C-G>g will jump
|
||||||
|
over contiguous delimiters and/or quotes.
|
||||||
|
|
||||||
|
The following table shows the behaviour, this applies to quotes too (the final
|
||||||
|
position of the cursor is represented by a "|"):
|
||||||
|
|
||||||
|
With auto-close: >
|
||||||
|
Type | You get
|
||||||
|
=======================
|
||||||
|
( | (|)
|
||||||
|
–––––––––––|–––––––––––
|
||||||
|
() | ()|
|
||||||
|
–––––––––––|–––––––––––
|
||||||
|
(<S-Tab> | ()|
|
||||||
|
–––––––––––|–––––––––––
|
||||||
|
{("<C-G>g | {("")}|
|
||||||
|
<
|
||||||
|
Without auto-close: >
|
||||||
|
|
||||||
|
Type | You get
|
||||||
|
=========================
|
||||||
|
() | (|)
|
||||||
|
–––––––––-----|––––––––––
|
||||||
|
()) | ()|
|
||||||
|
–––––––––-----|––––––––––
|
||||||
|
()<S-Tab> | ()|
|
||||||
|
––––––––––––––|–––––––––––
|
||||||
|
{}()""<C-G>g | {("")}|
|
||||||
|
<
|
||||||
|
NOTE: Abbreviations will not be expanded by delimiters used on delimitMate,
|
||||||
|
you should use <C-]> (read |i_CTRL-]|) to expand them on the go.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.2 EXPANSION OF SPACE AND CAR RETURN *delimitMateExpansion*
|
||||||
|
|
||||||
|
When the cursor is inside an empty pair of any matchpair, <Space> and <CR> can be
|
||||||
|
expanded, see |'delimitMate_expand_space'| and
|
||||||
|
|'delimitMate_expand_cr'|:
|
||||||
|
|
||||||
|
Expand <Space> to: >
|
||||||
|
|
||||||
|
You start with | You get
|
||||||
|
==============================
|
||||||
|
(|) | ( | )
|
||||||
|
<
|
||||||
|
Expand <CR> to: >
|
||||||
|
|
||||||
|
You start with | You get
|
||||||
|
==============================
|
||||||
|
(|) | (
|
||||||
|
| |
|
||||||
|
| )
|
||||||
|
<
|
||||||
|
|
||||||
|
When you have |'delimitMate_jump_expansion'| enabled, if there is an existing
|
||||||
|
closing paren/bracket/etc. on the next line, delimitMate will make the cursor
|
||||||
|
jump over any whitespace/<CR> and place it after the existing closing
|
||||||
|
delimiter instead of inserting a new one.
|
||||||
|
|
||||||
|
When |'delimitMate_expand_cr'| is set to 2, the following will also happen: >
|
||||||
|
|
||||||
|
You start with | You get
|
||||||
|
==============================
|
||||||
|
(foo|) | (foo
|
||||||
|
| |
|
||||||
|
| )
|
||||||
|
<
|
||||||
|
|
||||||
|
Since <Space> and <CR> are used everywhere, I have made the functions involved
|
||||||
|
in expansions global, so they can be used to make custom mappings. Read
|
||||||
|
|delimitMateFunctions| for more details.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.3 BACKSPACE *delimitMateBackspace*
|
||||||
|
|
||||||
|
If you press backspace inside an empty pair, both delimiters are deleted. When
|
||||||
|
expansions are enabled, <BS> will also delete the expansions.
|
||||||
|
|
||||||
|
If you type <S-BS> (shift + backspace) instead, only the closing delimiter
|
||||||
|
will be deleted. NOTE that this will not usually work when using Vim from the
|
||||||
|
terminal, see 'delimitMate#JumpAny()' below to see how to fix it.
|
||||||
|
|
||||||
|
e.g. typing at the "|": >
|
||||||
|
|
||||||
|
What | Before | After
|
||||||
|
==============================================
|
||||||
|
<BS> | call expand(|) | call expand|
|
||||||
|
---------|-------------------|-----------------
|
||||||
|
<BS> | call expand( | ) | call expand(|)
|
||||||
|
---------|-------------------|-----------------
|
||||||
|
<BS> | call expand( | call expand(|)
|
||||||
|
| | |
|
||||||
|
| ) |
|
||||||
|
---------|-------------------|-----------------
|
||||||
|
<S-BS> | call expand(|) | call expand(|
|
||||||
|
<
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.4 SMART QUOTES *delimitMateSmartQuotes*
|
||||||
|
|
||||||
|
Only one quote will be inserted following a quote, a "\", following or
|
||||||
|
preceding a keyword character, or when the number of quotes in the current
|
||||||
|
line is odd. This should cover closing quotes after a string, opening quotes
|
||||||
|
before a string, escaped quotes and apostrophes. See more details about
|
||||||
|
customizing this feature on |'delimitMate_smart_quotes'|.
|
||||||
|
|
||||||
|
e.g. typing at the "|": >
|
||||||
|
|
||||||
|
What | Before | After
|
||||||
|
=======================================
|
||||||
|
" | Text | | Text "|"
|
||||||
|
" | "String| | "String"|
|
||||||
|
" | let i = "| | let i = "|"
|
||||||
|
'm | I| | I'm|
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.4 SMART MATCHPAIRS *delimitMateSmartMatchpairs*
|
||||||
|
|
||||||
|
This is similar to "smart quotes", but applied to the characters in
|
||||||
|
|'delimitMate_matchpairs'|. The difference is that delimitMate will not
|
||||||
|
auto-close the pair when the regex matches the text on the right of the
|
||||||
|
cursor. See |'delimitMate_smart_matchpairs'| for more details.
|
||||||
|
|
||||||
|
|
||||||
|
e.g. typing at the "|": >
|
||||||
|
|
||||||
|
What | Before | After
|
||||||
|
=======================================
|
||||||
|
( | function| | function(|)
|
||||||
|
( | |var | (|var
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.5 BALANCING MATCHING PAIRS *delimitMateBalance*
|
||||||
|
|
||||||
|
When inserting an opening paren and |'delimitMate_balance_matchpairs'| is
|
||||||
|
enabled, delimitMate will try to balance the closing pairs in the current
|
||||||
|
line.
|
||||||
|
|
||||||
|
e.g. typing at the "|": >
|
||||||
|
|
||||||
|
What | Before | After
|
||||||
|
=======================================
|
||||||
|
( | | | (|)
|
||||||
|
( | |) | (|)
|
||||||
|
(( | |) | ((|))
|
||||||
|
<
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.6 FILE TYPE BASED CONFIGURATION *delimitMateFileType*
|
||||||
|
|
||||||
|
delimitMate options can be set globally for all buffers using global
|
||||||
|
("regular") variables in your |vimrc| file. But |:autocmd| can be used to set
|
||||||
|
options for specific file types (see |'filetype'|) using buffer variables in
|
||||||
|
the following way: >
|
||||||
|
|
||||||
|
au FileType mail,text let b:delimitMate_autoclose = 0
|
||||||
|
^ ^ ^ ^ ^
|
||||||
|
| | | | |
|
||||||
|
| | | | - Option value.
|
||||||
|
| | | - Option name.
|
||||||
|
| | - Buffer variable.
|
||||||
|
| - File types for which the option will be set.
|
||||||
|
- Don't forget to put this event.
|
||||||
|
<
|
||||||
|
NOTE that you should use buffer variables (|b:var|) only to set options with
|
||||||
|
|:autocmd|, for global options use regular variables (|g:var|) in your vimrc.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
3.7 SYNTAX AWARENESS *delimitMateSyntax*
|
||||||
|
|
||||||
|
The features of this plug-in might not be always helpful, comments and strings
|
||||||
|
usualy don't need auto-completion. delimitMate monitors which region is being
|
||||||
|
edited and if it detects that the cursor is in a comment it'll turn itself off
|
||||||
|
until the cursor leaves the comment. The excluded regions can be set using the
|
||||||
|
option |'delimitMate_excluded_regions'|. Read |group-name| for a list of
|
||||||
|
regions or syntax group names.
|
||||||
|
|
||||||
|
NOTE that this feature relies on a proper syntax file for the current file
|
||||||
|
type, if the appropiate syntax file doesn't define a region, delimitMate won't
|
||||||
|
know about it.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
4. COMMANDS *delimitMateCommands*
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
:DelimitMateReload *:DelimitMateReload*
|
||||||
|
|
||||||
|
Re-sets all the mappings used for this script, use it if any option has been
|
||||||
|
changed or if the filetype option hasn't been set yet.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
:DelimitMateSwitch *:DelimitMateSwitch*
|
||||||
|
|
||||||
|
Switches the plug-in on and off.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
:DelimitMateTest *:DelimitMateTest*
|
||||||
|
|
||||||
|
This command tests every mapping set-up for this script, useful for testing
|
||||||
|
custom configurations.
|
||||||
|
|
||||||
|
The following output corresponds to the default values, it will be different
|
||||||
|
depending on your configuration. "Open & close:" represents the final result
|
||||||
|
when the closing delimiter has been inserted, either manually or
|
||||||
|
automatically, see |delimitMateExpansion|. "Delete:" typing backspace in an
|
||||||
|
empty pair, see |delimitMateBackspace|. "Exit:" typing a closing delimiter
|
||||||
|
inside a pair of delimiters, see |delimitMateAutoclose|. "Space:" the
|
||||||
|
expansion, if any, of space, see |delimitMateExpansion|. "Visual-L",
|
||||||
|
"Visual-R" and "Visual" shows visual wrapping, see
|
||||||
|
|delimitMateVisualWrapping|. "Car return:" the expansion of car return, see
|
||||||
|
|delimitMateExpansion|. The cursor's position at the end of every test is
|
||||||
|
represented by an "|": >
|
||||||
|
|
||||||
|
* AUTOCLOSE:
|
||||||
|
Open & close: (|)
|
||||||
|
Delete: |
|
||||||
|
Exit: ()|
|
||||||
|
Space: ( |)
|
||||||
|
Visual-L: (v)
|
||||||
|
Visual-R: (v)
|
||||||
|
Car return: (
|
||||||
|
|)
|
||||||
|
|
||||||
|
Open & close: {|}
|
||||||
|
Delete: |
|
||||||
|
Exit: {}|
|
||||||
|
Space: { |}
|
||||||
|
Visual-L: {v}
|
||||||
|
Visual-R: {v}
|
||||||
|
Car return: {
|
||||||
|
|}
|
||||||
|
|
||||||
|
Open & close: [|]
|
||||||
|
Delete: |
|
||||||
|
Exit: []|
|
||||||
|
Space: [ |]
|
||||||
|
Visual-L: [v]
|
||||||
|
Visual-R: [v]
|
||||||
|
Car return: [
|
||||||
|
|]
|
||||||
|
|
||||||
|
Open & close: "|"
|
||||||
|
Delete: |
|
||||||
|
Exit: ""|
|
||||||
|
Space: " |"
|
||||||
|
Visual: "v"
|
||||||
|
Car return: "
|
||||||
|
|"
|
||||||
|
|
||||||
|
Open & close: '|'
|
||||||
|
Delete: |
|
||||||
|
Exit: ''|
|
||||||
|
Space: ' |'
|
||||||
|
Visual: 'v'
|
||||||
|
Car return: '
|
||||||
|
|'
|
||||||
|
|
||||||
|
Open & close: `|`
|
||||||
|
Delete: |
|
||||||
|
Exit: ``|
|
||||||
|
Space: ` |`
|
||||||
|
Visual: `v`
|
||||||
|
Car return: `
|
||||||
|
|`
|
||||||
|
<
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
5. MAPPINGS *delimitMateMappings*
|
||||||
|
|
||||||
|
delimitMate doesn't override any existing map, so you may encounter that it
|
||||||
|
doesn't work as expected because a mapping is missing. In that case, the
|
||||||
|
conflicting mappings should be resolved by either disabling the conflicting
|
||||||
|
mapping or creating a custom mappings.
|
||||||
|
|
||||||
|
In order to make custom mappings easier and prevent overwritting existing
|
||||||
|
ones, delimitMate uses the |<Plug>| + |hasmapto()| (|usr_41.txt|) construct
|
||||||
|
for its mappings.
|
||||||
|
|
||||||
|
These are the default mappings for the extra features:
|
||||||
|
|
||||||
|
<BS> is mapped to <Plug>delimitMateBS
|
||||||
|
<S-BS> is mapped to <Plug>delimitMateS-BS
|
||||||
|
<S-Tab> is mapped to <Plug>delimitMateS-Tab
|
||||||
|
<C-G>g is mapped to <Plug>delimitMateJumpMany
|
||||||
|
|
||||||
|
The rest of the mappings correspond to parens, quotes, CR, Space, etc. and they
|
||||||
|
depend on the values of the delimitMate options, they have the following form:
|
||||||
|
|
||||||
|
<Plug>delimitMate + char
|
||||||
|
|
||||||
|
e.g.: for "(":
|
||||||
|
|
||||||
|
( is mapped to <Plug>delimitMate(
|
||||||
|
|
||||||
|
e.g.: If you have <CR> expansion enabled, you might want to skip it on pop-up
|
||||||
|
menus:
|
||||||
|
|
||||||
|
imap <expr> <CR> pumvisible()
|
||||||
|
\ ? "\<C-Y>"
|
||||||
|
\ : "<Plug>delimitMateCR"
|
||||||
|
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
6. FUNCTIONS *delimitMateFunctions*
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
delimitMate#WithinEmptyPair() *delimitMate#WithinEmptyPair()*
|
||||||
|
|
||||||
|
Returns 1 if the cursor is inside an empty pair, 0 otherwise.
|
||||||
|
e.g.: >
|
||||||
|
|
||||||
|
inoremap <expr> <CR> delimitMate#WithinEmptyPair() ?
|
||||||
|
\ "\<C-R>=delimitMate#ExpandReturn()\<CR>" :
|
||||||
|
\ "external_mapping"
|
||||||
|
<
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
delimitMate#ShouldJump() *delimitMate#ShouldJump()*
|
||||||
|
|
||||||
|
Returns 1 if there is a closing delimiter or a quote to the right of the
|
||||||
|
cursor, 0 otherwise.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
delimitMate#JumpAny() *delimitMate#JumpAny()*
|
||||||
|
|
||||||
|
This function returns a mapping that will make the cursor jump to the right
|
||||||
|
when delimitMate#ShouldJump() returns 1, returns the argument "key" otherwise.
|
||||||
|
e.g.: You can use this to create your own mapping to jump over any delimiter.
|
||||||
|
>
|
||||||
|
inoremap <C-Tab> <C-R>=delimitMate#JumpAny()<CR>
|
||||||
|
<
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
7. TODO LIST *delimitMateTodo*
|
||||||
|
|
||||||
|
- Automatic set-up by file type.
|
||||||
|
- Make block-wise visual wrapping work on un-even regions.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
8. MAINTAINER *delimitMateMaintainer*
|
||||||
|
|
||||||
|
Hi there! My name is Israel Chauca F. and I can be reached at:
|
||||||
|
mailto:israelchauca@gmail.com
|
||||||
|
|
||||||
|
Feel free to send me any suggestions and/or comments about this plugin, I'll
|
||||||
|
be very pleased to read them.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
9. CREDITS *delimitMateCredits*
|
||||||
|
|
||||||
|
Contributors: ~
|
||||||
|
|
||||||
|
- Kim Silkebækken ~
|
||||||
|
Fixed mappings being echoed in the terminal.
|
||||||
|
|
||||||
|
- Eric Van Dewoestine ~
|
||||||
|
Implemented smart matchpairs.
|
||||||
|
|
||||||
|
Some of the code that makes this script was modified or just shamelessly
|
||||||
|
copied from the following sources:
|
||||||
|
|
||||||
|
- Ian McCracken ~
|
||||||
|
Post titled: Vim, Part II: Matching Pairs:
|
||||||
|
http://concisionandconcinnity.blogspot.com/
|
||||||
|
|
||||||
|
- Aristotle Pagaltzis ~
|
||||||
|
From the comments on the previous blog post and from:
|
||||||
|
http://gist.github.com/144619
|
||||||
|
|
||||||
|
- Karl Guertin ~
|
||||||
|
AutoClose:
|
||||||
|
http://www.vim.org/scripts/script.php?script_id=1849
|
||||||
|
|
||||||
|
- Thiago Alves ~
|
||||||
|
AutoClose:
|
||||||
|
http://www.vim.org/scripts/script.php?script_id=2009
|
||||||
|
|
||||||
|
- Edoardo Vacchi ~
|
||||||
|
ClosePairs:
|
||||||
|
http://www.vim.org/scripts/script.php?script_id=2373
|
||||||
|
|
||||||
|
This script was inspired by the auto-completion of delimiters on TextMate.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
10. HISTORY *delimitMateHistory*
|
||||||
|
|
||||||
|
Version Date Release notes ~
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.7 2013-07-15 * Current release:
|
||||||
|
- Lots of bug fixes.
|
||||||
|
- Add delimitMate_offByDefault.
|
||||||
|
- Add delimitMate_eol_marker.
|
||||||
|
- Reduce the number of mappings.
|
||||||
|
- Stop using setline().
|
||||||
|
- Better handling of nested quotes.
|
||||||
|
- Allow a custom pattern for smart_quotes.
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.6 2011-01-14 * - Add smart_matchpairs feature.
|
||||||
|
- Add mapping to jump over contiguous delimiters.
|
||||||
|
- Fix behaviour of b:loaded_delimitMate.
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.5.1 2010-09-30 * - Remove visual wrapping. Surround.vim offers a much
|
||||||
|
better implementation.
|
||||||
|
- Minor mods to DelimitMateTest.
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.5 2010-09-22 * - Better handling of mappings.
|
||||||
|
- Add report for mappings in |:DelimitMateTest|.
|
||||||
|
- Allow the use of "|" and multi-byte characters in
|
||||||
|
|'delimitMate_quotes'| and |'delimitMate_matchpairs'|.
|
||||||
|
- Allow commands to be concatenated using |.
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.4.1 2010-07-31 * - Fix problem with <Home> and <End>.
|
||||||
|
- Add missing doc on |'delimitMate_smart_quotes'|,
|
||||||
|
|delimitMateBalance| and
|
||||||
|
|'delimitMate_balance_matchpairs'|.
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.4 2010-07-29 * - Unbalanced parens: see :help delimitMateBalance.
|
||||||
|
- Visual wrapping now works on block-wise visual
|
||||||
|
with some limitations.
|
||||||
|
- Arrow keys didn't work on terminal.
|
||||||
|
- Added option to allow nested quotes.
|
||||||
|
- Expand Smart Quotes to look for a string on the
|
||||||
|
right of the cursor.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.3.1 2010-06-06 * - Fix: an extra <Space> is inserted after <Space>
|
||||||
|
expansion.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.3 2010-06-06 * - Syntax aware: Will turn off when editing comments
|
||||||
|
or other regions, customizable.
|
||||||
|
- Changed format of most mappings.
|
||||||
|
- Fix: <CR> expansion doesn't break automatic
|
||||||
|
indentation adjustments anymore.
|
||||||
|
- Fix: Arrow keys would insert A, B, C or D instead
|
||||||
|
of moving the cursor when using Vim on a terminal.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.2 2010-05-16 * - Added command to switch the plug-in on and off.
|
||||||
|
- Fix: some problems with <Left>, <Right> and <CR>.
|
||||||
|
- Fix: A small problem when inserting a delimiter at
|
||||||
|
the beginning of the line.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.1 2010-05-10 * - Most of the functions have been moved to an
|
||||||
|
autoload script to avoid loading unnecessary ones.
|
||||||
|
- Fixed a problem with the redo command.
|
||||||
|
- Many small fixes.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
2.0 2010-04-01 * New features:
|
||||||
|
- All features are redo/undo-wise safe.
|
||||||
|
- A single quote typed after an alphanumeric
|
||||||
|
character is considered an apostrophe and one
|
||||||
|
single quote is inserted.
|
||||||
|
- A quote typed after another quote inserts a single
|
||||||
|
quote and the cursor jumps to the middle.
|
||||||
|
- <S-Tab> jumps out of any empty pair.
|
||||||
|
- <CR> and <Space> expansions are fixed, but the
|
||||||
|
functions used for it are global and can be used in
|
||||||
|
custom mappings. The previous system is still
|
||||||
|
active if you have any of the expansion options
|
||||||
|
set.
|
||||||
|
- <S-Backspace> deletes the closing delimiter.
|
||||||
|
* Fixed bug:
|
||||||
|
- s:vars were being used to store buffer options.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
1.6 2009-10-10 * Now delimitMate tries to fix the balancing of single
|
||||||
|
quotes when used as apostrophes. You can read
|
||||||
|
|delimitMate_apostrophes| for details.
|
||||||
|
Fixed an error when |b:delimitMate_expand_space|
|
||||||
|
wasn't set but |delimitMate_expand_space| wasn't.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
1.5 2009-10-05 * Fix: delimitMate should work correctly for files
|
||||||
|
passed as arguments to Vim. Thanks to Ben Beuchler
|
||||||
|
for helping to nail this bug.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
1.4 2009-09-27 * Fix: delimitMate is now enabled on new buffers even
|
||||||
|
if they don't have set the file type option or were
|
||||||
|
opened directly from the terminal.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
1.3 2009-09-24 * Now local options can be used along with autocmd
|
||||||
|
for specific file type configurations.
|
||||||
|
Fixes:
|
||||||
|
- Unnamed register content is not lost on visual
|
||||||
|
mode.
|
||||||
|
- Use noremap where appropiate.
|
||||||
|
- Wrapping a single empty line works as expected.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
1.2 2009-09-07 * Fixes:
|
||||||
|
- When inside nested empty pairs, deleting the
|
||||||
|
innermost left delimiter would delete all right
|
||||||
|
contiguous delimiters.
|
||||||
|
- When inside an empty pair, inserting a left
|
||||||
|
delimiter wouldn't insert the right one, instead
|
||||||
|
the cursor would jump to the right.
|
||||||
|
- New buffer inside the current window wouldn't
|
||||||
|
have the mappings set.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
1.1 2009-08-25 * Fixed an error that ocurred when mapleader wasn't
|
||||||
|
set and added support for GetLatestScripts
|
||||||
|
auto-detection.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
1.0 2009-08-23 * Initial upload.
|
||||||
|
|
||||||
|
|---------|------------|-----------------------------------------------------|
|
||||||
|
|
||||||
|
|
||||||
|
`\|||/´ MMM \|/ www __^__ ~
|
||||||
|
(o o) (o o) @ @ (O-O) /(o o)\\ ~
|
||||||
|
ooO_(_)_Ooo__ ooO_(_)_Ooo___oOO_(_)_OOo___oOO__(_)__OOo___oOO__(_)__OOo_____ ~
|
||||||
|
_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~
|
||||||
|
__|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_ ~
|
||||||
|
_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~
|
||||||
|
|
||||||
|
vim:tw=78:et:ts=8:sw=2:ft=help:norl:formatoptions+=tcroqn:autoindent:
|
||||||
399
plugin/delimitMate.vim
Normal file
399
plugin/delimitMate.vim
Normal file
@@ -0,0 +1,399 @@
|
|||||||
|
" File: plugin/delimitMate.vim
|
||||||
|
" Version: 2.7
|
||||||
|
" Modified: 2013-07-15
|
||||||
|
" Description: This plugin provides auto-completion for quotes, parens, etc.
|
||||||
|
" Maintainer: Israel Chauca F. <israelchauca@gmail.com>
|
||||||
|
" Manual: Read ":help delimitMate".
|
||||||
|
" ============================================================================
|
||||||
|
|
||||||
|
" Initialization: {{{
|
||||||
|
|
||||||
|
if exists("g:loaded_delimitMate") || &cp
|
||||||
|
" User doesn't want this plugin or compatible is set, let's get out!
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let g:loaded_delimitMate = 1
|
||||||
|
let save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
if v:version < 700
|
||||||
|
echoerr "delimitMate: this plugin requires vim >= 7!"
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:loaded_delimitMate = 1
|
||||||
|
let delimitMate_version = "2.7"
|
||||||
|
|
||||||
|
function! s:option_init(name, default) "{{{
|
||||||
|
let b = exists("b:delimitMate_" . a:name)
|
||||||
|
let g = exists("g:delimitMate_" . a:name)
|
||||||
|
" Find value to use.
|
||||||
|
if !b && !g
|
||||||
|
let value = a:default
|
||||||
|
elseif b
|
||||||
|
exec "let value = b:delimitMate_" . a:name
|
||||||
|
else
|
||||||
|
exec "let value = g:delimitMate_" . a:name
|
||||||
|
endif
|
||||||
|
call s:s(a:name, value)
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:init() "{{{
|
||||||
|
" Initialize variables:
|
||||||
|
" autoclose
|
||||||
|
call s:option_init("autoclose", 1)
|
||||||
|
" matchpairs
|
||||||
|
call s:option_init("matchpairs", string(&matchpairs)[1:-2])
|
||||||
|
call s:option_init("matchpairs_list", map(split(s:g('matchpairs'), ','), 'split(v:val, '':'')'))
|
||||||
|
let pairs = s:g('matchpairs_list')
|
||||||
|
if len(filter(pairs, 'v:val[0] ==# v:val[1]'))
|
||||||
|
echohl ErrorMsg
|
||||||
|
echom 'delimitMate: each member of a pair in delimitMate_matchpairs must be different from each other.'
|
||||||
|
echom 'delimitMate: invalid pairs: ' . join(map(pairs, 'join(v:val, ":")'), ', ')
|
||||||
|
echohl Normal
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
call s:option_init("left_delims", map(copy(s:g('matchpairs_list')), 'v:val[0]'))
|
||||||
|
call s:option_init("right_delims", map(copy(s:g('matchpairs_list')), 'v:val[1]'))
|
||||||
|
" quotes
|
||||||
|
call s:option_init("quotes", "\" ' `")
|
||||||
|
call s:option_init("quotes_list",split(s:g('quotes'), '\s\+'))
|
||||||
|
" nesting_quotes
|
||||||
|
call s:option_init("nesting_quotes", [])
|
||||||
|
" excluded_regions
|
||||||
|
call s:option_init("excluded_regions", "Comment")
|
||||||
|
call s:option_init("excluded_regions_list", split(s:g('excluded_regions'), ',\s*'))
|
||||||
|
let enabled = len(s:g('excluded_regions_list')) > 0
|
||||||
|
call s:option_init("excluded_regions_enabled", enabled)
|
||||||
|
" excluded filetypes
|
||||||
|
call s:option_init("excluded_ft", "")
|
||||||
|
" expand_space
|
||||||
|
if exists("b:delimitMate_expand_space") && type(b:delimitMate_expand_space) == type("")
|
||||||
|
echom "b:delimitMate_expand_space is '".b:delimitMate_expand_space."' but it must be either 1 or 0!"
|
||||||
|
echom "Read :help 'delimitMate_expand_space' for more details."
|
||||||
|
unlet b:delimitMate_expand_space
|
||||||
|
let b:delimitMate_expand_space = 1
|
||||||
|
endif
|
||||||
|
if exists("g:delimitMate_expand_space") && type(g:delimitMate_expand_space) == type("")
|
||||||
|
echom "delimitMate_expand_space is '".g:delimitMate_expand_space."' but it must be either 1 or 0!"
|
||||||
|
echom "Read :help 'delimitMate_expand_space' for more details."
|
||||||
|
unlet g:delimitMate_expand_space
|
||||||
|
let g:delimitMate_expand_space = 1
|
||||||
|
endif
|
||||||
|
call s:option_init("expand_space", 0)
|
||||||
|
" expand_cr
|
||||||
|
if exists("b:delimitMate_expand_cr") && type(b:delimitMate_expand_cr) == type("")
|
||||||
|
echom "b:delimitMate_expand_cr is '".b:delimitMate_expand_cr."' but it must be either 1 or 0!"
|
||||||
|
echom "Read :help 'delimitMate_expand_cr' for more details."
|
||||||
|
unlet b:delimitMate_expand_cr
|
||||||
|
let b:delimitMate_expand_cr = 1
|
||||||
|
endif
|
||||||
|
if exists("g:delimitMate_expand_cr") && type(g:delimitMate_expand_cr) == type("")
|
||||||
|
echom "delimitMate_expand_cr is '".g:delimitMate_expand_cr."' but it must be either 1 or 0!"
|
||||||
|
echom "Read :help 'delimitMate_expand_cr' for more details."
|
||||||
|
unlet g:delimitMate_expand_cr
|
||||||
|
let g:delimitMate_expand_cr = 1
|
||||||
|
endif
|
||||||
|
if ((&backspace !~ 'eol' || &backspace !~ 'start') && &backspace != 2) &&
|
||||||
|
\ ((exists('b:delimitMate_expand_cr') && b:delimitMate_expand_cr == 1) ||
|
||||||
|
\ (exists('g:delimitMate_expand_cr') && g:delimitMate_expand_cr == 1))
|
||||||
|
echom "delimitMate: There seems to be some incompatibility with your settings that may interfer with the expansion of <CR>. See :help 'delimitMate_expand_cr' for details."
|
||||||
|
endif
|
||||||
|
call s:option_init("expand_cr", 0)
|
||||||
|
" expand_in_quotes
|
||||||
|
call s:option_init('expand_inside_quotes', 0)
|
||||||
|
" jump_expansion
|
||||||
|
call s:option_init("jump_expansion", 0)
|
||||||
|
" smart_matchpairs
|
||||||
|
call s:option_init("smart_matchpairs", '^\%(\w\|\!\|£\|\$\|_\|["'']\s*\S\)')
|
||||||
|
" smart_quotes
|
||||||
|
" XXX: backward compatibility. Ugly, should go the way of the dodo soon.
|
||||||
|
let quotes = escape(join(s:g('quotes_list'), ''), '\-^[]')
|
||||||
|
let default_smart_quotes = '\%(\w\|[^[:punct:][:space:]' . quotes . ']\|\%(\\\\\)*\\\)\%#\|\%#\%(\w\|[^[:space:][:punct:]' . quotes . ']\)'
|
||||||
|
if exists('g:delimitMate_smart_quotes') && type(g:delimitMate_smart_quotes) == type(0)
|
||||||
|
if g:delimitMate_smart_quotes
|
||||||
|
unlet g:delimitMate_smart_quotes
|
||||||
|
else
|
||||||
|
unlet g:delimitMate_smart_quotes
|
||||||
|
let g:delimitMate_smart_quotes = ''
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
if exists('b:delimitMate_smart_quotes') && type(b:delimitMate_smart_quotes) == type(0)
|
||||||
|
if b:delimitMate_smart_quotes
|
||||||
|
unlet b:delimitMate_smart_quotes
|
||||||
|
if exists('g:delimitMate_smart_quotes') && type(g:delimitMate_smart_quotes) && g:delimitMate_smart_quotes
|
||||||
|
let b:delimitMate_smart_quotes = default_smart_quotes
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
unlet b:delimitMate_smart_quotes
|
||||||
|
let b:delimitMate_smart_quotes = ''
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
call s:option_init("smart_quotes", default_smart_quotes)
|
||||||
|
" apostrophes
|
||||||
|
call s:option_init("apostrophes", "")
|
||||||
|
call s:option_init("apostrophes_list", split(s:g('apostrophes'), ":\s*"))
|
||||||
|
" tab2exit
|
||||||
|
call s:option_init("tab2exit", 1)
|
||||||
|
" balance_matchpairs
|
||||||
|
call s:option_init("balance_matchpairs", 0)
|
||||||
|
" eol marker
|
||||||
|
call s:option_init("eol_marker", "")
|
||||||
|
" Everything is fine.
|
||||||
|
return 1
|
||||||
|
endfunction "}}} Init()
|
||||||
|
|
||||||
|
"}}}
|
||||||
|
|
||||||
|
" Functions: {{{
|
||||||
|
|
||||||
|
function! s:g(...) " {{{
|
||||||
|
return call('delimitMate#Get', a:000)
|
||||||
|
endfunction " }}}
|
||||||
|
|
||||||
|
function! s:s(...) " {{{
|
||||||
|
return call('delimitMate#Set', a:000)
|
||||||
|
endfunction " }}}
|
||||||
|
|
||||||
|
function! s:Map() "{{{
|
||||||
|
" Set mappings:
|
||||||
|
try
|
||||||
|
let save_keymap = &keymap
|
||||||
|
let save_iminsert = &iminsert
|
||||||
|
let save_imsearch = &imsearch
|
||||||
|
let save_cpo = &cpo
|
||||||
|
set keymap=
|
||||||
|
set cpo&vim
|
||||||
|
if s:g('autoclose')
|
||||||
|
call s:AutoClose()
|
||||||
|
else
|
||||||
|
call s:NoAutoClose()
|
||||||
|
endif
|
||||||
|
call s:ExtraMappings()
|
||||||
|
finally
|
||||||
|
let &cpo = save_cpo
|
||||||
|
let &keymap = save_keymap
|
||||||
|
let &iminsert = save_iminsert
|
||||||
|
let &imsearch = save_imsearch
|
||||||
|
endtry
|
||||||
|
|
||||||
|
let b:delimitMate_enabled = 1
|
||||||
|
|
||||||
|
endfunction "}}} Map()
|
||||||
|
|
||||||
|
function! s:Unmap() " {{{
|
||||||
|
let imaps =
|
||||||
|
\ s:g('right_delims', []) +
|
||||||
|
\ s:g('left_delims', []) +
|
||||||
|
\ s:g('quotes_list', []) +
|
||||||
|
\ s:g('apostrophes_list', []) +
|
||||||
|
\ ['<BS>', '<C-h>', '<S-BS>', '<Del>', '<CR>', '<Space>', '<S-Tab>', '<Esc>'] +
|
||||||
|
\ ['<Up>', '<Down>', '<Left>', '<Right>', '<LeftMouse>', '<RightMouse>'] +
|
||||||
|
\ ['<C-Left>', '<C-Right>'] +
|
||||||
|
\ ['<Home>', '<End>', '<PageUp>', '<PageDown>', '<S-Down>', '<S-Up>', '<C-G>g']
|
||||||
|
|
||||||
|
for map in imaps
|
||||||
|
if maparg(map, "i") =~? 'delimitMate'
|
||||||
|
if map == '|'
|
||||||
|
let map = '<Bar>'
|
||||||
|
endif
|
||||||
|
exec 'silent! iunmap <buffer> ' . map
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
let b:delimitMate_enabled = 0
|
||||||
|
endfunction " }}} s:Unmap()
|
||||||
|
|
||||||
|
function! s:TestMappingsDo() "{{{
|
||||||
|
if &modified
|
||||||
|
let confirm = input("Modified buffer, type \"yes\" to write and proceed "
|
||||||
|
\ . "with test: ") ==? 'yes'
|
||||||
|
if !confirm
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
call delimitMate#TestMappings()
|
||||||
|
g/\%^$/d
|
||||||
|
0
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:DelimitMateDo(...) "{{{
|
||||||
|
" First, remove all magic, if needed:
|
||||||
|
if exists("b:delimitMate_enabled") && b:delimitMate_enabled == 1
|
||||||
|
call s:Unmap()
|
||||||
|
endif
|
||||||
|
" Check if this file type is excluded:
|
||||||
|
if exists("g:delimitMate_excluded_ft") &&
|
||||||
|
\ index(split(g:delimitMate_excluded_ft, ','), &filetype, 0, 1) >= 0
|
||||||
|
" Finish here:
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
" Check if user tried to disable using b:loaded_delimitMate
|
||||||
|
if exists("b:loaded_delimitMate")
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
" Initialize settings:
|
||||||
|
if ! s:init()
|
||||||
|
" Something went wrong.
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
" Now, add magic:
|
||||||
|
if !exists("g:delimitMate_offByDefault") || !g:delimitMate_offByDefault
|
||||||
|
call s:Map()
|
||||||
|
endif
|
||||||
|
if a:0 > 0
|
||||||
|
echo "delimitMate has been reset."
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:DelimitMateSwitch() "{{{
|
||||||
|
if exists("b:delimitMate_enabled") && b:delimitMate_enabled
|
||||||
|
call s:Unmap()
|
||||||
|
echo "delimitMate has been disabled."
|
||||||
|
else
|
||||||
|
call s:Unmap()
|
||||||
|
call s:init()
|
||||||
|
call s:Map()
|
||||||
|
echo "delimitMate has been enabled."
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
"}}}
|
||||||
|
|
||||||
|
" Mappers: {{{
|
||||||
|
function! s:TriggerAbb() "{{{
|
||||||
|
if v:version < 703
|
||||||
|
\ || ( v:version == 703 && !has('patch489') )
|
||||||
|
\ || pumvisible()
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
return "\<C-]>"
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:NoAutoClose() "{{{
|
||||||
|
" inoremap <buffer> ) <C-R>=delimitMate#SkipDelim('\)')<CR>
|
||||||
|
for delim in s:g('right_delims') + s:g('quotes_list')
|
||||||
|
if delim == '|'
|
||||||
|
let delim = '<Bar>'
|
||||||
|
endif
|
||||||
|
exec 'inoremap <silent> <Plug>delimitMate' . delim . ' <C-R>=<SID>TriggerAbb().delimitMate#SkipDelim("' . escape(delim,'"') . '")<CR>'
|
||||||
|
exec 'silent! imap <unique> <buffer> '.delim.' <Plug>delimitMate'.delim
|
||||||
|
endfor
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:AutoClose() "{{{
|
||||||
|
" Add matching pair and jump to the midle:
|
||||||
|
" inoremap <silent> <buffer> ( ()<Left>
|
||||||
|
let i = 0
|
||||||
|
while i < len(s:g('matchpairs_list'))
|
||||||
|
let ld = s:g('left_delims')[i] == '|' ? '<bar>' : s:g('left_delims')[i]
|
||||||
|
let rd = s:g('right_delims')[i] == '|' ? '<bar>' : s:g('right_delims')[i]
|
||||||
|
exec 'inoremap <expr><silent> <Plug>delimitMate' . ld
|
||||||
|
\. ' <SID>TriggerAbb().delimitMate#ParenDelim("' . escape(rd, '|') . '")'
|
||||||
|
exec 'silent! imap <unique> <buffer> '.ld
|
||||||
|
\.' <Plug>delimitMate'.ld
|
||||||
|
let i += 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
" Exit from inside the matching pair:
|
||||||
|
for delim in s:g('right_delims')
|
||||||
|
let delim = delim == '|' ? '<bar>' : delim
|
||||||
|
exec 'inoremap <expr><silent> <Plug>delimitMate' . delim
|
||||||
|
\. ' <SID>TriggerAbb().delimitMate#JumpOut("\' . delim . '")'
|
||||||
|
exec 'silent! imap <unique> <buffer> ' . delim
|
||||||
|
\. ' <Plug>delimitMate'. delim
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" Add matching quote and jump to the midle, or exit if inside a pair of matching quotes:
|
||||||
|
" inoremap <silent> <buffer> " <C-R>=delimitMate#QuoteDelim("\"")<CR>
|
||||||
|
for delim in s:g('quotes_list')
|
||||||
|
if delim == '|'
|
||||||
|
let delim = '<Bar>'
|
||||||
|
endif
|
||||||
|
exec 'inoremap <expr><silent> <Plug>delimitMate' . delim
|
||||||
|
\. ' <SID>TriggerAbb()."<C-R>=delimitMate#QuoteDelim(\"\\\' . delim . '\")<CR>"'
|
||||||
|
exec 'silent! imap <unique> <buffer> ' . delim
|
||||||
|
\. ' <Plug>delimitMate' . delim
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" Try to fix the use of apostrophes (kept for backward compatibility):
|
||||||
|
" inoremap <silent> <buffer> n't n't
|
||||||
|
for map in s:g('apostrophes_list')
|
||||||
|
exec "inoremap <silent> " . map . " " . map
|
||||||
|
exec 'silent! imap <unique> <buffer> ' . map . ' <Plug>delimitMate' . map
|
||||||
|
endfor
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
function! s:ExtraMappings() "{{{
|
||||||
|
" If pair is empty, delete both delimiters:
|
||||||
|
inoremap <silent> <Plug>delimitMateBS <C-R>=delimitMate#BS()<CR>
|
||||||
|
if !hasmapto('<Plug>delimitMateBS','i')
|
||||||
|
if maparg('<BS>'. 'i') == ''
|
||||||
|
silent! imap <unique> <buffer> <BS> <Plug>delimitMateBS
|
||||||
|
endif
|
||||||
|
if maparg('<C-h>'. 'i') == ''
|
||||||
|
silent! imap <unique> <buffer> <C-h> <Plug>delimitMateBS
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
" If pair is empty, delete closing delimiter:
|
||||||
|
inoremap <silent> <expr> <Plug>delimitMateS-BS delimitMate#WithinEmptyPair() ? "\<Del>" : "\<S-BS>"
|
||||||
|
if !hasmapto('<Plug>delimitMateS-BS','i') && maparg('<S-BS>', 'i') == ''
|
||||||
|
silent! imap <unique> <buffer> <S-BS> <Plug>delimitMateS-BS
|
||||||
|
endif
|
||||||
|
" Expand return if inside an empty pair:
|
||||||
|
inoremap <expr><silent> <Plug>delimitMateCR <SID>TriggerAbb()."\<C-R>=delimitMate#ExpandReturn()\<CR>"
|
||||||
|
if s:g('expand_cr') && !hasmapto('<Plug>delimitMateCR', 'i') && maparg('<CR>', 'i') == ''
|
||||||
|
silent! imap <unique> <buffer> <CR> <Plug>delimitMateCR
|
||||||
|
endif
|
||||||
|
" Expand space if inside an empty pair:
|
||||||
|
inoremap <expr><silent> <Plug>delimitMateSpace <SID>TriggerAbb()."\<C-R>=delimitMate#ExpandSpace()\<CR>"
|
||||||
|
if s:g('expand_space') && !hasmapto('<Plug>delimitMateSpace', 'i') && maparg('<Space>', 'i') == ''
|
||||||
|
silent! imap <unique> <buffer> <Space> <Plug>delimitMateSpace
|
||||||
|
endif
|
||||||
|
" Jump over any delimiter:
|
||||||
|
inoremap <expr><silent> <Plug>delimitMateS-Tab <SID>TriggerAbb()."\<C-R>=delimitMate#JumpAny()\<CR>"
|
||||||
|
if s:g('tab2exit') && !hasmapto('<Plug>delimitMateS-Tab', 'i') && maparg('<S-Tab>', 'i') == ''
|
||||||
|
silent! imap <unique> <buffer> <S-Tab> <Plug>delimitMateS-Tab
|
||||||
|
endif
|
||||||
|
" Jump over next delimiters
|
||||||
|
inoremap <expr><buffer> <Plug>delimitMateJumpMany <SID>TriggerAbb()."\<C-R>=delimitMate#JumpMany()\<CR>"
|
||||||
|
if !hasmapto('<Plug>delimitMateJumpMany', 'i') && maparg("<C-G>g", 'i') == ''
|
||||||
|
imap <silent> <buffer> <C-G>g <Plug>delimitMateJumpMany
|
||||||
|
endif
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
"}}}
|
||||||
|
|
||||||
|
" Commands: {{{
|
||||||
|
|
||||||
|
call s:DelimitMateDo()
|
||||||
|
|
||||||
|
" Let me refresh without re-loading the buffer:
|
||||||
|
command! -bar DelimitMateReload call s:DelimitMateDo(1)
|
||||||
|
|
||||||
|
" Quick test:
|
||||||
|
command! -bar DelimitMateTest call s:TestMappingsDo()
|
||||||
|
|
||||||
|
" Switch On/Off:
|
||||||
|
command! -bar DelimitMateSwitch call s:DelimitMateSwitch()
|
||||||
|
"}}}
|
||||||
|
|
||||||
|
" Autocommands: {{{
|
||||||
|
|
||||||
|
augroup delimitMate
|
||||||
|
au!
|
||||||
|
" Run on file type change.
|
||||||
|
"autocmd VimEnter * autocmd FileType * call <SID>DelimitMateDo()
|
||||||
|
autocmd FileType * call <SID>DelimitMateDo()
|
||||||
|
|
||||||
|
" Run on new buffers.
|
||||||
|
autocmd BufNewFile,BufRead,BufEnter *
|
||||||
|
\ if !exists('b:delimitMate_was_here') |
|
||||||
|
\ call <SID>DelimitMateDo() |
|
||||||
|
\ let b:delimitMate_was_here = 1 |
|
||||||
|
\ endif
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
"}}}
|
||||||
|
|
||||||
|
let &cpo = save_cpo
|
||||||
|
" GetLatestVimScripts: 2754 1 :AutoInstall: delimitMate.vim
|
||||||
|
" vim:foldmethod=marker:foldcolumn=4:ts=2:sw=2
|
||||||
9
test/Makefile
Normal file
9
test/Makefile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
all: build/runVimTests
|
||||||
|
build/runVimTests/bin/runVimTests.sh -0 .
|
||||||
|
|
||||||
|
build/runVimTests: build/VimTAP
|
||||||
|
git clone https://github.com/inkarkat/runVimTests $@
|
||||||
|
|
||||||
|
# Use VimTAP as directory name, as used with runVimTestsSetup.vim.
|
||||||
|
build/VimTAP:
|
||||||
|
git clone https://github.com/inkarkat/vimtap $@
|
||||||
18
test/README.md
Normal file
18
test/README.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Automatic test setup
|
||||||
|
You can use `make` (or `make test` from the top level directory) to run the
|
||||||
|
tests.
|
||||||
|
|
||||||
|
# Manual test setup instructions
|
||||||
|
The plugins [runVimTests](http://www.vim.org/scripts/script.php?script_id=2565)
|
||||||
|
and [VimTAP](http://www.vim.org/scripts/script.php?script_id=2213) are needed
|
||||||
|
to run these tests.
|
||||||
|
|
||||||
|
Besides the `_setup.vim` configuration file present in this repo you need to
|
||||||
|
create a global one and place it in the same dir where the runVimTests
|
||||||
|
executable is located. Assuming the executable is at '~/bin/runVimTests' this
|
||||||
|
global configuration file should be '~/bin/runVimTestsSetup.vim' and should
|
||||||
|
have something like the following lines inside of it:
|
||||||
|
|
||||||
|
" Prepend tests repos to &rtp
|
||||||
|
let &runtimepath = '/path/to/runVimTests_dir,' . &rtp
|
||||||
|
let &runtimepath = '/path/to/vimTAP_dir,' . &rtp
|
||||||
12
test/_setup.vim
Normal file
12
test/_setup.vim
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
let &rtp = expand('<sfile>:p:h:h') . ',' . &rtp . ',' . expand('<sfile>:p:h:h') . '/after'
|
||||||
|
set bs=2
|
||||||
|
ru plugin/delimitMate.vim
|
||||||
|
let runVimTests = expand('<sfile>:p:h').'/build/runVimTests'
|
||||||
|
if isdirectory(runVimTests)
|
||||||
|
let &rtp = runVimTests . ',' . &rtp
|
||||||
|
endif
|
||||||
|
let vimTAP = expand('<sfile>:p:h').'/build/VimTAP'
|
||||||
|
if isdirectory(vimTAP)
|
||||||
|
let &rtp = vimTAP . ',' . &rtp
|
||||||
|
endif
|
||||||
|
|
||||||
41
test/autoclose_matchpairs.txt
Normal file
41
test/autoclose_matchpairs.txt
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
let g:delimitMate_autoclose = 1
|
||||||
|
"(x" "(x)"
|
||||||
|
"(\<BS>x" "x"
|
||||||
|
"()x" "()x"
|
||||||
|
"((\<C-G>gx" "(())x"
|
||||||
|
"(x\<Esc>u" ""
|
||||||
|
"@(x" "@(x)"
|
||||||
|
"@#\<Left>(x" "@(x)#"
|
||||||
|
"(\<S-Tab>x" "()x"
|
||||||
|
let g:delimitMate_autoclose = 0
|
||||||
|
"(x" "(x"
|
||||||
|
"()x" "(x)"
|
||||||
|
"())x" "()x"
|
||||||
|
"()\<BS>x" "x"
|
||||||
|
"@()x" "@(x)"
|
||||||
|
"@#\<Left>()x" "@(x)#"
|
||||||
|
let g:delimitMate_expand_space = 1
|
||||||
|
let g:delimitMate_autoclose = 1
|
||||||
|
"(\<Space>x" "( x )"
|
||||||
|
"(\<Space>\<BS>x" "(x)"
|
||||||
|
let g:delimitMate_autoclose = 0
|
||||||
|
"()\<Space>\<BS>x" "(x)"
|
||||||
|
let g:delimitMate_autoclose = 1
|
||||||
|
# Handle backspace gracefully.
|
||||||
|
set backspace=
|
||||||
|
"(\<Esc>a\<BS>x" "(x)"
|
||||||
|
set bs=2
|
||||||
|
# closing parens removes characters. #133
|
||||||
|
"(a\<Esc>i)" "()a)"
|
||||||
|
|
||||||
|
# Add semicolon next to the closing paren. Issue #77.
|
||||||
|
new
|
||||||
|
let b:delimitMate_eol_marker = ';'
|
||||||
|
"abc(x" "abc(x);"
|
||||||
|
%d
|
||||||
|
# BS should behave accordingly.
|
||||||
|
"abc(\<BS>" "abc;"
|
||||||
|
# Expand iabbreviations
|
||||||
|
unlet b:delimitMate_eol_marker
|
||||||
|
iabb def ghi
|
||||||
|
"def(" "ghi()"
|
||||||
42
test/autoclose_matchpairs.vim
Normal file
42
test/autoclose_matchpairs.vim
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
let g:delimitMate_matchpairs = '(:),{:},[:],<:>,¿:?,¡:!'
|
||||||
|
let lines = readfile(expand('<sfile>:t:r').'.txt')
|
||||||
|
call vimtest#StartTap()
|
||||||
|
let testsnumber = len(filter(copy(lines), 'v:val =~ ''^"'''))
|
||||||
|
let itemsnumber = len(split(g:delimitMate_matchpairs, ','))
|
||||||
|
call vimtap#Plan(testsnumber * itemsnumber)
|
||||||
|
let tcount = 1
|
||||||
|
let reload = 1
|
||||||
|
for item in lines
|
||||||
|
if item =~ '^#\|^\s*$'
|
||||||
|
" A comment or empty line.
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if item !~ '^"'
|
||||||
|
" A command.
|
||||||
|
exec item
|
||||||
|
call vimtap#Diag(item)
|
||||||
|
let reload = 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if reload
|
||||||
|
DelimitMateReload
|
||||||
|
call vimtap#Diag('DelimitMateReload')
|
||||||
|
let reload = 0
|
||||||
|
endif
|
||||||
|
let [input, output] = split(item, '"\%(\\.\|[^\\"]\)*"\zs\s*\ze"\%(\\.\|[^\\"]\)*"')
|
||||||
|
for [s:l,s:r] in map(split(g:delimitMate_matchpairs, ','), 'split(v:val, ":")')
|
||||||
|
let input2 = substitute(input, '(', s:l, 'g')
|
||||||
|
let input2 = substitute(input2, ')', s:r, 'g')
|
||||||
|
let output2 = substitute(output, '(', s:l, 'g')
|
||||||
|
let output2 = substitute(output2, ')', s:r, 'g')
|
||||||
|
%d
|
||||||
|
exec 'normal i'.eval(input2)."\<Esc>"
|
||||||
|
let line = getline('.')
|
||||||
|
let passed = line == eval(output2)
|
||||||
|
call vimtap#Is(line, eval(output2), input2)
|
||||||
|
", input2 . ' => ' . string(line) .
|
||||||
|
" \ (passed ? ' =' : ' !') . '= ' . string(eval(output2)))
|
||||||
|
let tcount += 1
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
call vimtest#Quit()
|
||||||
73
test/autoclose_quotes.txt
Normal file
73
test/autoclose_quotes.txt
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
let g:delimitMate_autoclose = 1
|
||||||
|
"'x" "'x'"
|
||||||
|
"'x\<Esc>u" ""
|
||||||
|
"''x" "''x"
|
||||||
|
"'\<BS>x" "x"
|
||||||
|
"'\<C-G>gx" "''x"
|
||||||
|
# This will fail for double quote.
|
||||||
|
"'\"x" "'\"x\"'"
|
||||||
|
"@'x" "@'x'"
|
||||||
|
"@#\<Left>'x" "@'x'#"
|
||||||
|
"'\<S-Tab>x" "''x"
|
||||||
|
"abc'" "abc'"
|
||||||
|
"abc\\'x" "abc\\'x"
|
||||||
|
"u'Привет'" "u'Привет'"
|
||||||
|
"u'string'" "u'string'"
|
||||||
|
let g:delimitMate_autoclose = 0
|
||||||
|
"'x" "'x"
|
||||||
|
"''x" "'x'"
|
||||||
|
"'''x" "''x"
|
||||||
|
"''\<BS>x" "x"
|
||||||
|
"@''x" "@'x'"
|
||||||
|
"@#\<Left>''x" "@'x'#"
|
||||||
|
let g:delimitMate_expand_space = 1
|
||||||
|
let g:delimitMate_autoclose = 1
|
||||||
|
"'\<Space>x" "' x'"
|
||||||
|
let g:delimitMate_expand_inside_quotes = 1
|
||||||
|
"'\<Space>x" "' x '"
|
||||||
|
"'\<Space>\<BS>x" "'x'"
|
||||||
|
"abc\\''\<Space>x" "abc\\' x'"
|
||||||
|
let g:delimitMate_autoclose = 0
|
||||||
|
"''\<Space>\<BS>x" "'x'"
|
||||||
|
let g:delimitMate_autoclose = 1
|
||||||
|
# Handle backspace gracefully.
|
||||||
|
set backspace=
|
||||||
|
"'\<Esc>a\<BS>x" "'x'"
|
||||||
|
set backspace=2
|
||||||
|
set cpo=ces$
|
||||||
|
"'x" "'x'"
|
||||||
|
# Make sure smart quote works beyond first column.
|
||||||
|
" 'x" " 'x'"
|
||||||
|
# smart quote, check fo char on the right.
|
||||||
|
"a\<space>b\<left>'" "a 'b"
|
||||||
|
# Make sure we jump over a quote on the right. #89.
|
||||||
|
"('test'x" "('test'x)"
|
||||||
|
# Duplicate whole line when inserting quote at bol #105
|
||||||
|
"}\<Home>'" "''}"
|
||||||
|
"'\<Del>abc '" "'abc '"
|
||||||
|
"''abc '" "''abc ''"
|
||||||
|
# Nesting quotes:
|
||||||
|
let g:delimitMate_nesting_quotes = split(g:delimitMate_quotes, '\s\+')
|
||||||
|
"'''x" "'''x'''"
|
||||||
|
"''''x" "''''x''''"
|
||||||
|
"''x" "''x"
|
||||||
|
"'x" "'x'"
|
||||||
|
unlet g:delimitMate_nesting_quotes
|
||||||
|
# expand iabbreviations
|
||||||
|
iabb def ghi
|
||||||
|
"def'" "ghi'"
|
||||||
|
let g:delimitMate_smart_quotes = '\w\%#\_.'
|
||||||
|
"xyz'x" "xyz'x"
|
||||||
|
"xyz 'x" "xyz 'x'"
|
||||||
|
let g:delimitMate_smart_quotes = '\s\%#\_.'
|
||||||
|
"abc'x" "abc'x'"
|
||||||
|
"abc 'x" "abc 'x"
|
||||||
|
# let's try the negated form
|
||||||
|
let g:delimitMate_smart_quotes = '!\w\%#\_.'
|
||||||
|
"cba'x" "cba'x'"
|
||||||
|
"cba 'x" "cba 'x"
|
||||||
|
let g:delimitMate_smart_quotes = '!\s\%#\_.'
|
||||||
|
"zyx'x" "zyx'x"
|
||||||
|
"zyx 'x" "zyx 'x'"
|
||||||
|
unlet g:delimitMate_smart_quotes
|
||||||
|
"'\<CR>\<BS>" "''"
|
||||||
47
test/autoclose_quotes.vim
Normal file
47
test/autoclose_quotes.vim
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
"let g:delimitMate_quotes = '" '' ` ” « |'
|
||||||
|
let g:delimitMate_quotes = '" '' ` « |'
|
||||||
|
let lines = readfile(expand('<sfile>:t:r').'.txt')
|
||||||
|
call vimtest#StartTap()
|
||||||
|
let testsnumber = len(filter(copy(lines), 'v:val =~ ''^"'''))
|
||||||
|
let itemsnumber = len(split(g:delimitMate_quotes, ' '))
|
||||||
|
call vimtap#Plan(testsnumber * itemsnumber)
|
||||||
|
let reload = 1
|
||||||
|
let tcount = 1
|
||||||
|
let linenr = 0
|
||||||
|
for item in lines
|
||||||
|
let linenr += 1
|
||||||
|
if item =~ '^#\|^\s*$'
|
||||||
|
" A comment or empty line.
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if item !~ '^"'
|
||||||
|
" A command.
|
||||||
|
exec item
|
||||||
|
call vimtap#Diag(item)
|
||||||
|
let reload = 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if reload
|
||||||
|
DelimitMateReload
|
||||||
|
call vimtap#Diag('DelimitMateReload')
|
||||||
|
let reload = 0
|
||||||
|
endif
|
||||||
|
let quotes = split(g:delimitMate_quotes, '\s')
|
||||||
|
for quote in quotes
|
||||||
|
if vimtap#Skip(1, tcount != 26, "This test is invalid for double quote.")
|
||||||
|
let tcount += 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let [input, output] = split(item, '"\%(\\.\|[^\\"]\)*"\zs\s*\ze"\%(\\.\|[^\\"]\)*"')
|
||||||
|
let input_q = substitute(input,"'" , escape(escape(quote, '"'), '\'), 'g')
|
||||||
|
let output_q = substitute(output,"'" , escape(escape(quote, '"'), '\'), 'g')
|
||||||
|
%d
|
||||||
|
exec 'normal i'.eval(input_q)."\<Esc>"
|
||||||
|
if quote == '”'
|
||||||
|
call vimtap#Todo(1)
|
||||||
|
endif
|
||||||
|
call vimtap#Is(getline('.'), eval(output_q), 'Line '.linenr.': '.eval(substitute(input_q, '\\<', '<','g')))
|
||||||
|
let tcount += 1
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
call vimtest#Quit()
|
||||||
96
test/expand_cr.txt
Normal file
96
test/expand_cr.txt
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
#
|
||||||
|
%d
|
||||||
|
filetype indent on
|
||||||
|
set bs=2 et sts=4 sw=4 ft=javascript
|
||||||
|
call setline(1, '$(document).ready(function() {})')
|
||||||
|
DelimitMateReload
|
||||||
|
exec "normal 31|i\<CR>x\<Esc>"
|
||||||
|
================================================================================
|
||||||
|
$(document).ready(function() {
|
||||||
|
x
|
||||||
|
})
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Issue #95
|
||||||
|
new
|
||||||
|
let b:delimitMate_jump_expansion = 1
|
||||||
|
DelimitMateReload
|
||||||
|
exec "normal i(\<CR>test)x"
|
||||||
|
================================================================================
|
||||||
|
(
|
||||||
|
test
|
||||||
|
)x
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Remove CR expansion on BS
|
||||||
|
%d
|
||||||
|
exec "normal i(\<CR>\<BS>x"
|
||||||
|
================================================================================
|
||||||
|
(x)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Consider indentation with BS inside an empty CR expansion.
|
||||||
|
%d
|
||||||
|
exec "normal i( \<CR>\<BS>\<BS>x"
|
||||||
|
================================================================================
|
||||||
|
(x)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Conflict with indentation settings (cindent). Issue #95
|
||||||
|
se cindent
|
||||||
|
call setline(1, ['sub foo {',' while (1) {', ' ', ' }', '}'])
|
||||||
|
call cursor(3, 8)
|
||||||
|
normal a}x
|
||||||
|
================================================================================
|
||||||
|
sub foo {
|
||||||
|
while (1) {
|
||||||
|
|
||||||
|
}x
|
||||||
|
}
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
%d
|
||||||
|
call setline(1, '"{bracketed}')
|
||||||
|
normal A"x
|
||||||
|
================================================================================
|
||||||
|
"{bracketed}"x
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Syntax folding enabled by autocmd breaks expansion. But ti can't be tested
|
||||||
|
# with :normal
|
||||||
|
new
|
||||||
|
autocmd InsertEnter * let w:fdm=&foldmethod | setl foldmethod=manual
|
||||||
|
autocmd InsertLeave * let &foldmethod = w:fdm
|
||||||
|
set foldmethod=marker
|
||||||
|
set foldmarker={,}
|
||||||
|
set foldlevel=0
|
||||||
|
set backspace=2
|
||||||
|
exec "normal iabc {\<CR>x"
|
||||||
|
================================================================================
|
||||||
|
abc {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# expand_cr != 2
|
||||||
|
%d_
|
||||||
|
call setline(1, 'abc(def)')
|
||||||
|
exec "normal $i\<CR>x"
|
||||||
|
================================================================================
|
||||||
|
abc(def
|
||||||
|
x)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# expand_cr == 2
|
||||||
|
%d_
|
||||||
|
let delimitMate_expand_cr = 2
|
||||||
|
DelimitMateReload
|
||||||
|
call setline(1, 'abc(def)')
|
||||||
|
exec "normal $i\<CR>x"
|
||||||
|
================================================================================
|
||||||
|
abc(def
|
||||||
|
x
|
||||||
|
)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
# Play nice with smartindent
|
||||||
|
%d_
|
||||||
|
set all&
|
||||||
|
set smartindent
|
||||||
|
exec "normal $i{\<CR>x"
|
||||||
|
================================================================================
|
||||||
|
{
|
||||||
|
x
|
||||||
|
}
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
55
test/expand_cr.vim
Normal file
55
test/expand_cr.vim
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
let g:delimitMate_expand_cr = 1
|
||||||
|
"DelimitMateReload
|
||||||
|
let lines = readfile(expand('<sfile>:t:r').'.txt')
|
||||||
|
call vimtest#StartTap()
|
||||||
|
let testsnumber = len(filter(copy(lines), 'v:val =~ ''^=\{80}$'''))
|
||||||
|
call vimtap#Plan(testsnumber)
|
||||||
|
let tcount = 1
|
||||||
|
let expect = 0
|
||||||
|
let evaluate = 0
|
||||||
|
let commands = []
|
||||||
|
let header = ''
|
||||||
|
for item in lines
|
||||||
|
if item =~ '^=\{80}$'
|
||||||
|
let expect = 1
|
||||||
|
let expected = []
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
if item =~ '^#' && expect == 0
|
||||||
|
" A comment.
|
||||||
|
let header = empty(header) ? item[1:] : 'Lines should match.'
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if item =~ '^\s*$' && expect == 0
|
||||||
|
" An empty line.
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if ! expect
|
||||||
|
" A command.
|
||||||
|
call add(commands, item)
|
||||||
|
exec item
|
||||||
|
"call vimtap#Diag(item)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if item =~ '^-\{80}$'
|
||||||
|
let expect = 0
|
||||||
|
endif
|
||||||
|
if expect
|
||||||
|
call add(expected, item)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let lines = getline(1, line('$'))
|
||||||
|
let passed = lines == expected
|
||||||
|
echom string(lines)
|
||||||
|
echom string(expected)
|
||||||
|
call vimtap#Is(lines, expected, header)
|
||||||
|
echom string(commands)
|
||||||
|
for cmd in commands
|
||||||
|
call vimtap#Diag(cmd)
|
||||||
|
endfor
|
||||||
|
let commands = []
|
||||||
|
let header = ''
|
||||||
|
let tcount += 1
|
||||||
|
endfor
|
||||||
|
call vimtest#Quit()
|
||||||
8
test/expand_space.txt
Normal file
8
test/expand_space.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Issue #95
|
||||||
|
new
|
||||||
|
let b:delimitMate_jump_expansion = 1
|
||||||
|
DelimitMateReload
|
||||||
|
exec "normal i( test)x"
|
||||||
|
================================================================================
|
||||||
|
( test )x
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
42
test/expand_space.vim
Normal file
42
test/expand_space.vim
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
let g:delimitMate_expand_space = 1
|
||||||
|
"DelimitMateReload
|
||||||
|
let lines = readfile(expand('<sfile>:t:r').'.txt')
|
||||||
|
call vimtest#StartTap()
|
||||||
|
let testsnumber = len(filter(copy(lines), 'v:val =~ ''^=\{80}$'''))
|
||||||
|
call vimtap#Plan(testsnumber)
|
||||||
|
let tcount = 1
|
||||||
|
let expect = 0
|
||||||
|
let evaluate = 0
|
||||||
|
for item in lines
|
||||||
|
if item =~ '^=\{80}$'
|
||||||
|
let expect = 1
|
||||||
|
let expected = []
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
if item =~ '^#\|^\s*$' && expect == 0
|
||||||
|
" A comment or empty line.
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if ! expect
|
||||||
|
" A command.
|
||||||
|
exec item
|
||||||
|
call vimtap#Diag(item)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if item =~ '^-\{80}$'
|
||||||
|
let expect = 0
|
||||||
|
endif
|
||||||
|
if expect
|
||||||
|
call add(expected, item)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let lines = getline(1, line('$'))
|
||||||
|
let passed = lines == expected
|
||||||
|
echom string(lines)
|
||||||
|
echom string(expected)
|
||||||
|
call vimtap#Ok(passed, string(expected) .
|
||||||
|
\ (passed ? ' =' : ' !') . '= ' . string(lines))
|
||||||
|
let tcount += 1
|
||||||
|
endfor
|
||||||
|
call vimtest#Quit()
|
||||||
Reference in New Issue
Block a user