196 Commits

Author SHA1 Message Date
Yasuhiro Matsumoto
84a0388827 [WIP] styled 2019-11-13 16:28:12 +09:00
mattn
5f559fae12 Update FUNDING.yml 2019-10-08 17:37:10 +09:00
mattn
10b3746ecb Merge pull request #468 from r6eve/fix/minor-typo
Fix minor typo
2019-08-27 18:25:18 +09:00
r6eve
61deeebdc9 Fix minor typo 2019-08-27 18:15:14 +09:00
Yasuhiro Matsumoto
37203af2b3 Add LICENSE 2019-08-27 15:06:44 +09:00
mattn
461700696e Merge pull request #462 from baxter2/installation-pathogen
explicit installation instructions for pathogen
2019-07-24 15:34:43 +09:00
baxter2
ef1d557b59 explicit installation instructions for pathogen 2019-07-24 15:55:53 +10:00
Yasuhiro Matsumoto
15ef997d4d Implement imageEncode on CSS 2019-06-24 23:35:52 +09:00
Yasuhiro Matsumoto
f4afd031a3 Fix next item in CSS 2019-06-24 23:20:54 +09:00
Yasuhiro Matsumoto
5a7c7930c6 Fix mergeLines() 2019-06-20 00:32:53 +09:00
Yasuhiro Matsumoto
3f53d7b637 Add mergeLines() 2019-06-20 00:05:36 +09:00
Yasuhiro Matsumoto
9f854c868e Add mergeLines() 2019-06-20 00:02:06 +09:00
Yasuhiro Matsumoto
6ee9d6d417 rename 2019-06-19 23:39:03 +09:00
Yasuhiro Matsumoto
685359e892 Merge branch 'master' of https://github.com/mattn/emmet-vim 2019-06-19 14:56:36 +09:00
Yasuhiro Matsumoto
b9f1ae467b Fix remove tag 2019-06-19 01:39:37 +09:00
Yasuhiro Matsumoto
32dd6d3064 Fix split/join tag 2019-06-19 01:08:51 +09:00
Yasuhiro Matsumoto
50b44d90c9 Fix hang-up while split/join tag 2019-06-19 00:46:33 +09:00
Yasuhiro Matsumoto
7b08b89d7d Implement image encode 2019-06-18 15:44:00 +09:00
Yasuhiro Matsumoto
d02023cd7a Fix unit expanding 2019-06-18 03:56:28 +09:00
Yasuhiro Matsumoto
6039842751 Fix unit expanding 2019-06-18 03:49:40 +09:00
Yasuhiro Matsumoto
dad174f359 auto is not unit name 2019-06-18 03:25:51 +09:00
Yasuhiro Matsumoto
47c28892d9 Fix unit expanding 2019-06-18 03:22:31 +09:00
Yasuhiro Matsumoto
192d22fe69 Handle ex 2019-06-18 03:10:06 +09:00
Yasuhiro Matsumoto
24fbb0aef7 Fix move next/prev 2019-06-07 15:18:29 +09:00
mattn
0414b53a23 Update FUNDING.yml 2019-05-23 23:51:11 +09:00
mattn
369a5420f0 Update FUNDING.yml 2019-05-23 23:49:26 +09:00
mattn
456d094ef3 Create FUNDING.yml 2019-05-23 23:43:41 +09:00
mattn
633320d968 Merge pull request #459 from mattn/fix-dot
Fix unittest
2019-05-23 20:23:08 +09:00
Yasuhiro Matsumoto
5531b23f20 Fix unittest 2019-05-23 20:20:45 +09:00
Yasuhiro Matsumoto
b7cc3a743f Fix emmet#isExpandable()
Fixes #458
2019-05-23 18:52:17 +09:00
mattn
758421535f Merge pull request #456 from mattn/fix-balance
Fix balance tag
2019-05-19 23:28:37 +09:00
Yasuhiro Matsumoto
6a6dc6e093 Fix balance tag 2019-05-19 23:26:36 +09:00
mattn
97b0b6c643 Merge pull request #455 from M4R7iNP/fix-root-filetype-detection
get extends recursively, minor additional fixes for pug and jsx
2019-05-19 22:03:15 +09:00
Martin Pedersen
f8fc806a61 get extends recursively, minor additional fixes for pug and jsx 2019-05-09 01:14:00 +02:00
Yasuhiro Matsumoto
ae7d31f290 Fixes #452, #448 2019-04-16 00:21:28 +09:00
Yasuhiro Matsumoto
d698f16587 Expand lorem with div only when there is multiplier. 2019-02-11 00:04:31 +09:00
mattn
19f2821b7b Merge pull request #447 from mattn/ignore-embeded
Add ignore_embeded_filetype since slim filetype is confusing to html.
2019-01-29 01:03:24 +09:00
Yasuhiro Matsumoto
922784dad6 Fix Makefile 2019-01-29 00:57:37 +09:00
Yasuhiro Matsumoto
eb8a4782ba Fix css 2019-01-29 00:54:17 +09:00
Yasuhiro Matsumoto
b79f9128d3 Fix test 2019-01-29 00:41:06 +09:00
Yasuhiro Matsumoto
5d6870c0af Add ignore_embeded_filetype 2019-01-29 00:15:23 +09:00
Yasuhiro Matsumoto
5fc2cc0fae xenial 2019-01-29 00:09:20 +09:00
Yasuhiro Matsumoto
d99b422a39 Add ignore_embeded_filetype since slim filetype is confusing to html. 2019-01-28 23:59:03 +09:00
mattn
3720be60fb Merge pull request #446 from soywod/master
Add support for TypeScript
2019-01-28 23:50:20 +09:00
Clément DOUIN
313e241932 add support for typescript 2019-01-28 14:21:25 +01:00
Yasuhiro Matsumoto
19e3240bf3 Fix getFileType 2019-01-16 21:57:43 +09:00
mattn
e6fb10d22a Merge pull request #416 from rgalbo/patch-1
fix a broken markdown heading
2018-11-29 15:56:27 +09:00
mattn
d2a7edf1ad Merge pull request #440 from tyru/add-gitlink
[Fix] Add gitlink of 'docs'
2018-11-29 15:55:44 +09:00
tyru
37ac8c3421 fix: add gitlink of 'docs'
.gitmodules has 'docs' entry, but no gitlink is committed in this
repository.
So volt (more specifically, go-git library) results in the error.
https://github.com/vim-volt/volt/issues/260
2018-11-10 13:46:15 +09:00
mattn
7492853a59 Merge pull request #439 from mattn/fix436
add dot into pattern of attributes
2018-11-09 15:44:46 +09:00
Yasuhiro Matsumoto
88ecfac350 add dot into pattern of attributes
Fixes #436
2018-11-09 15:42:39 +09:00
mattn
7a4bf3463e Merge pull request #433 from jpsouzasilva/prioritize-syntax
Prioritizes syntax at the current cursor position for determining the file type
2018-10-06 13:36:39 +09:00
jpsouzasilva
a33b7273a1 Removes extra spaces at line 523 2018-09-07 22:22:44 -03:00
jpsouzasilva
64656d8d4b Fixes the file identification for JSX 2018-08-30 08:11:50 -03:00
jpsouzasilva
0e20db0cb7 Changes from PR review #1 2018-08-29 13:17:06 -03:00
jpsouzasilva
581ba25bf8 Simplify pattern rules for matching single word syntax naming 2018-08-28 23:55:27 -03:00
jpsouzasilva
9cce773acb Case-insensitive type string matching
Fixing the plugin for Vim 7.4 (Travis)
2018-08-28 23:46:27 -03:00
jpsouzasilva
ca2b158737 Deleting the test.log file 2018-08-28 22:06:59 -03:00
jpsouzasilva
03c2309f44 Attempt at fixing the Javascript identifier pattern
Running tests locally seems OK!
2018-08-28 22:05:06 -03:00
jpsouzasilva
3dcdbff913 Remove empty string comparison for xml identification 2018-08-25 15:49:54 -03:00
jpsouzasilva
7843f18e40 Prioritizes syntax at the current cursor position for determining the file type 2018-08-25 15:22:18 -03:00
Yasuhiro Matsumoto
63c98d801b Merge branch 'master' of https://github.com/mattn/emmet-vim 2018-08-07 16:05:04 +09:00
Yasuhiro Matsumoto
645258ddd4 element configuration should be overridable
Fixes #432
2018-08-07 16:03:23 +09:00
Yasuhiro Matsumoto
2ac3648bc8 fix custom expanding
closes #429
2018-08-06 22:31:34 +09:00
Yasuhiro Matsumoto
3fb134b503 fix finding begining of token
closes #428
2018-07-19 01:02:57 +09:00
Yasuhiro Matsumoto
dcf8f6efd8 treat foo. as boolean attributes
closes #426
2018-07-13 12:56:55 +09:00
Yasuhiro Matsumoto
e7dd13a750 fix custom tag 2018-07-13 12:01:46 +09:00
Yasuhiro Matsumoto
f5b185e3a2 fix zero origin base value
closes #420
2018-05-21 10:39:09 +09:00
mattn
acc5ac7a9b Merge pull request #421 from Giorgiosaud/master
get blade syntax
2018-05-21 10:09:01 +09:00
Yasuhiro Matsumoto
fb31b5dbb6 make child node if current node have a name already
related #272
2018-05-02 14:29:53 +09:00
Yasuhiro Matsumoto
1ba2eb67fb fix attribute pattern 2018-04-25 11:15:55 +09:00
Yasuhiro Matsumoto
a0aa79d660 use : prefix for localvar 2018-04-25 10:41:25 +09:00
Yasuhiro Matsumoto
40c89e5415 handle inner []
closes #412
2018-04-25 10:32:16 +09:00
Yasuhiro Matsumoto
c0728a8dac Merge branch 'master' of https://github.com/mattn/emmet-vim 2018-04-25 10:04:27 +09:00
Yasuhiro Matsumoto
06b4cda774 expand local variables in custom snippets.
closes #414
2018-04-25 10:03:38 +09:00
mattn
5cb3b51e47 Merge pull request #410 from ashfinal/master
Adds emmet#anchorizeURL support for reStructuredText
2018-04-25 09:03:40 +09:00
Rick Galbo
927f72b49d fix a broken markdown heading
no space between heading indicator and text
2018-04-22 14:52:18 -05:00
ashfinal
18c0cf55f4 Adds emmet#anchorizeURL support for reStructuredText 2018-03-16 20:47:39 +08:00
mattn
350f0ba10b Merge pull request #398 from taylorzr/master
Fix "More Tutorials" link
2017-12-08 07:47:06 +09:00
Zach Taylor
2a8918a775 Fix "More Tutorials" link 2017-12-07 14:12:48 -06:00
Yasuhiro Matsumoto
abdd9e440d fix .travis.yml and README.mkd 2017-12-07 00:26:00 +09:00
Yasuhiro Matsumoto
e8c905853b fix README.mkd 2017-12-07 00:23:18 +09:00
Yasuhiro Matsumoto
8e06fbd056 remove --clean 2017-12-07 00:20:12 +09:00
Yasuhiro Matsumoto
2364a97f1c fix Makefile 2017-12-07 00:18:25 +09:00
Yasuhiro Matsumoto
1be61f24ba fix Makefile 2017-12-07 00:18:09 +09:00
Yasuhiro Matsumoto
ac8767eb15 fix Makefile 2017-12-07 00:16:02 +09:00
Yasuhiro Matsumoto
5405e9dbf0 add .travis.yml 2017-12-07 00:14:10 +09:00
Yasuhiro Matsumoto
c7923d1ec4 fix #389 2017-12-07 00:13:48 +09:00
Yasuhiro Matsumoto
5181a02a09 add test 2017-12-07 00:13:40 +09:00
mattn
1c6b56f0e0 Merge pull request #395 from pageYe123/patch-2
correct the wrong link address
2017-11-13 14:45:51 +09:00
Ye Shiqing
2196a056b4 correct the wrong link address
missing `/blob/` https://raw.github.com/mattn/emmet-vim/blob/master/TUTORIAL
2017-11-12 01:45:54 -06:00
mattn
a06966cfb2 Merge pull request #393 from vais/patch-2
Fix typo in documentation
2017-11-07 14:18:10 +09:00
mattn
fd4a3f6089 Merge pull request #394 from theRemix/doc/plug-install
README for vim-plug installation
2017-11-01 20:01:42 +09:00
Jon Borgonia
f1fba43944 add instructions for installation with vim-plug 2017-10-31 20:14:05 -07:00
Vais Salikhov
609c66f043 Fix typo in documentation 2017-10-23 22:14:30 +07:00
mattn
bcadf12a03 Merge pull request #392 from vais/patch-1
Fix typo in documentation
2017-10-22 19:51:33 +09:00
Vais Salikhov
d653ee7df0 Fix typo in documentation 2017-10-21 20:14:51 +07:00
mattn
ed79a9264d Merge pull request #384 from hpate-omicron/patch-1
Fix #382 - Multiple class name expansion with Elm
2017-08-21 10:57:21 +09:00
mattn
71c68c2d6c Merge pull request #383 from korneliakobiela/master
Rewrite TUTORIAL to markdown file format
2017-08-21 10:56:42 +09:00
hpate-omicron
4b4e68ae1d Fix #382 - Multiple class name expansion with Elm
This change makes the multiple class name expansion work correctly in Elm.

```
div.one.two.three
```

Becomes
```
    div [ class "one two three" ] []
```

Previously you would get
```
    div [ class "one.two.three" ] []
```
https://github.com/mattn/emmet-vim/issues/382
2017-08-16 09:52:32 -04:00
Kornelia Kobiela
abc97ac757 Rewrite TUTORIAL to markdown file format 2017-08-13 21:24:43 +02:00
Yasuhiro Matsumoto
9c6d783636 add test 2017-07-13 01:49:34 +09:00
Yasuhiro Matsumoto
230f41e55b handle attribute in join-tag
close #379
2017-07-13 01:47:17 +09:00
Yasuhiro Matsumoto
94261d6515 handle name={{width: 300px}}
close #377
2017-06-22 22:32:30 +09:00
Yasuhiro Matsumoto
aa801bc9b7 add block_all_childless
close #270
2017-06-13 18:10:16 +09:00
Yasuhiro Matsumoto
3af413c9a3 fix unittest 2017-06-01 22:42:56 +09:00
Yasuhiro Matsumoto
2247b1f457 fix indentation 2017-06-01 22:42:47 +09:00
Yasuhiro Matsumoto
6c38fe86c1 remove debug code 2017-05-16 17:07:20 +09:00
Yasuhiro Matsumoto
956f1b0b43 try to find short name in css snippets
close #371
2017-05-16 17:06:55 +09:00
mattn
4efb1c333e Merge pull request #368 from floscr/fix/add-viewport-units
Add viewport units to expansion
2017-03-30 10:26:09 +09:00
Florian Schroedl Home
d6e093d441 Add viewport units to expansion 2017-03-29 17:35:23 +02:00
mattn
5442207ccb Merge pull request #363 from jankjn/patch-1
fix script tag
2017-01-14 20:01:33 +09:00
Jankin Zhang
f0a0948d2d fix script tag
`script` and `script:src` both was expanded to `<script src=""></script>`
2017-01-14 18:45:49 +08:00
Yasuhiro Matsumoto
e5d28f004c add ! for pug 2017-01-04 12:49:12 +09:00
mattn
20dd275531 Merge pull request #359 from bobbylee/master
Updated CSS snippet section from emmetio/emmet
2017-01-03 22:30:00 +09:00
Bobby Lee
5db2c29f14 Updated CSS snippet section with the latest settings from emmetio/emmet (flexbox) 2016-12-27 12:35:08 +13:00
Michael Bøcker-Larsen
5b217264dd Minimal elm lang support #356 2016-12-07 00:04:49 +09:00
Yasuhiro Matsumoto
1a9c1493ab Fixes #355 2016-11-30 14:05:39 +09:00
Yasuhiro Matsumoto
44906fb16e fix #354 2016-11-23 23:41:57 +09:00
mattn
4eca5f5693 Merge pull request #352 from d8660091/fix351
fix while loop, #351
2016-11-10 10:19:42 +09:00
Xu Deng
dfff6672c6 fix while loop, #351 2016-11-09 20:02:15 -05:00
Yasuhiro Matsumoto
64544b778d fix test 2016-11-07 16:09:13 +09:00
Yasuhiro Matsumoto
ebcf6d2205 fix rtype 2016-11-07 16:09:09 +09:00
Yasuhiro Matsumoto
d7b70c656a handle javascript.jsx
Close #347
2016-10-30 21:10:30 +09:00
Yasuhiro Matsumoto
f12fa6e493 Merge commit '30d58ee' 2016-10-29 22:58:51 +09:00
Yasuhiro Matsumoto
b8bb1e51b8 Merge commit 'b56be29' 2016-10-29 22:58:40 +09:00
Yasuhiro Matsumoto
30d58ee417 lookup base type 2016-10-29 22:57:32 +09:00
Yasuhiro Matsumoto
b56be291c4 empty_element_suffix should be " />" for JSX
Close #313
2016-10-29 20:36:07 +09:00
Yasuhiro Matsumoto
d228a90eb1 Merge branch 'master' of git://github.com/mattn/emmet-vim 2016-10-29 20:34:36 +09:00
Yasuhiro Matsumoto
1fe780000b Self closing tag
Close #346
2016-10-29 20:33:05 +09:00
Yasuhiro Matsumoto
28ff569be3 empty_element_suffix should be " />" for JSX
Close #313
2016-10-27 09:14:09 +09:00
Yasuhiro Matsumoto
f4b097af50 fix #340
add -ms- and -o- for vendor prefixes
2016-07-27 16:53:33 +09:00
mattn
92710ebcd2 Merge pull request #339 from greuben/master
Use htmlFor in jsx
2016-07-18 20:31:29 +09:00
Reuben Gunday
4805d355c1 Use htmlFor in jsx 2016-07-17 01:13:52 +05:30
mattn
3654efd3d1 Merge pull request #338 from abobov/patch-1
Fix typo in documentation
2016-07-07 18:29:06 +09:00
Anton Bobov
3cace3fa08 Fix typo in documentation 2016-07-07 14:00:28 +05:00
Yasuhiro Matsumoto
26899b9981 needless div wrapped for lorem 2016-07-05 10:06:18 +09:00
Yasuhiro Matsumoto
c03599748f fix bem filter 2016-07-05 09:45:13 +09:00
Yasuhiro Matsumoto
52f3af7ca8 select is not inline element 2016-06-10 14:14:11 +09:00
Yasuhiro Matsumoto
6e93371365 fixes about #303 2016-06-07 17:59:41 +09:00
Yasuhiro Matsumoto
7e1aa89fa4 put space after variable like [st :] 2016-06-07 11:10:55 +09:00
Yasuhiro Matsumoto
bcab81cc24 fixes #333 2016-06-05 09:54:14 +09:00
Yasuhiro Matsumoto
02f5a2ec81 fix #332 2016-05-28 00:48:57 +09:00
Yasuhiro Matsumoto
f8bf9dbf69 fix #332 2016-05-28 00:39:18 +09:00
Yasuhiro Matsumoto
7735a778c8 fix #332 2016-05-27 03:48:58 +09:00
Yasuhiro Matsumoto
6a6698a179 fix #332 2016-05-27 01:52:33 +09:00
Yasuhiro Matsumoto
6f4869796c fix #332 2016-05-26 23:45:16 +09:00
Yasuhiro Matsumoto
31d903d390 li>lorem 2016-05-17 02:45:20 +09:00
Yasuhiro Matsumoto
e42c07978e Detect pug as well as jade file types
Close #330
2016-05-12 08:56:28 +09:00
Yasuhiro Matsumoto
e2be3aa391 Custom expands should be expanded in later
Fixes #272
2016-05-10 11:11:41 +09:00
Yasuhiro Matsumoto
05bfff176b Fixes #329 again 2016-05-10 10:00:18 +09:00
Yasuhiro Matsumoto
8239822548 fix test 2016-05-10 09:18:23 +09:00
Yasuhiro Matsumoto
1a0c1288e1 Fixes #329 2016-05-10 09:06:47 +09:00
Yasuhiro Matsumoto
b4b21450f2 fallback for shiftwidth() 2016-04-26 08:49:46 +09:00
mattn
0b4310353a Merge pull request #326 from ryunix/using-shiftwidth-func
Using shiftwidth()
2016-04-17 00:31:10 +09:00
ryunix
d550205295 Using shiftwidth() 2016-04-17 00:13:45 +09:00
Jorge Luis Saud Rosal
1e9df4f015 get blade syntax 2016-03-03 15:39:51 -04:30
Yasuhiro Matsumoto
0ccaa29dbd fix #314 2016-01-11 23:58:22 +09:00
mattn
41f005e740 Merge pull request #312 from jugend/jsx-multi-filetypes
fix jsx type check to support multi file types
2016-01-03 02:12:59 +09:00
Herryanto Siatono
4feadc4062 fix jsx type check to support multi file types 2016-01-03 01:08:04 +08:00
Yasuhiro Matsumoto
dee767c998 check type is JSX strictly 2016-01-01 00:11:00 +09:00
Herryanto Siatono
699689c985 add support for jsx attribute expression 2016-01-01 00:07:23 +09:00
mattn
1ac0fb7011 Merge pull request #310 from jugend/fix-join-space
fix missing space before /> on html tag join
2016-01-01 00:06:53 +09:00
Herryanto Siatono
cbe10f91b4 fix missing space before /> on html tag join 2015-12-31 15:23:29 +08:00
mattn
c790128137 Merge pull request #308 from nkalvi/master
Expand implicit tag names as span inside inline elements
2015-12-20 23:53:00 +09:00
nkalvi
997314f226 Merge pull request #1 from nkalvi/nkalvi-patch-to-307
A possible fix to issue #307
2015-12-19 13:21:30 -05:00
nkalvi
6f676c4a38 A possible fix to issue #307 2015-12-16 14:26:17 -05:00
Yasuhiro Matsumoto
8b8aefd64c more implements for #307 2015-12-14 12:21:17 +09:00
Yasuhiro Matsumoto
ea47fca11e fix implicit tag expansion.
Close #307
2015-12-14 00:39:47 +09:00
Yasuhiro Matsumoto
e24ea1734e add screenshot 2015-11-24 15:04:19 +09:00
Yasuhiro Matsumoto
fb3cac36bb Fixes #306 2015-11-23 23:42:12 +09:00
Yasuhiro Matsumoto
451367a2ce add doc for emmet-update-tag
Close #285
2015-11-10 10:34:50 +09:00
Yasuhiro Matsumoto
f752a4250c add doc for emmet-expand-word 2015-11-10 10:25:11 +09:00
Yasuhiro Matsumoto
1672e5664c should behave on only html 2015-11-10 09:43:25 +09:00
Yasuhiro Matsumoto
5819343b88 oops. fixed bug 2015-11-10 09:41:17 +09:00
Yasuhiro Matsumoto
913dfe686d remove debug message 2015-11-10 09:39:13 +09:00
Yasuhiro Matsumoto
603d6e4fcd fix bug 2015-11-10 09:38:27 +09:00
Yasuhiro Matsumoto
136b87a330 expand snippets for filetypes like html.handlebars
Close #298
2015-11-10 09:36:15 +09:00
Yasuhiro Matsumoto
5eb1061a3d redirect expanding.
Close #237
2015-11-10 09:13:48 +09:00
Yasuhiro Matsumoto
4110fb0f7b ignore django template 2015-10-26 09:44:07 +09:00
Yasuhiro Matsumoto
1691ccc7e8 fix default_attributes 2015-10-20 10:49:55 +09:00
Yasuhiro Matsumoto
0bd0a38a29 fix merge configuration 2015-10-20 10:12:03 +09:00
Yasuhiro Matsumoto
13b842d9c4 default_attributes should be array of dictionary 2015-10-20 09:29:34 +09:00
Yasuhiro Matsumoto
fceb37243a appending array configuration into map
Close #301
2015-10-20 09:04:11 +09:00
Yasuhiro Matsumoto
abdf10e91c allow empty configuration 2015-10-02 19:01:19 +09:00
Yasuhiro Matsumoto
333fede99b fix #296 2015-09-29 14:51:44 +09:00
Yasuhiro Matsumoto
037c7e5720 add test for bem filter 2015-09-25 09:26:43 +09:00
Yasuhiro Matsumoto
5041c20aae don't use getchar(0). unittest.vim stop the test-sequence. 2015-09-25 09:19:16 +09:00
Yasuhiro Matsumoto
77747c762a fix bem filter. close #295 2015-09-25 09:18:47 +09:00
Yasuhiro Matsumoto
4933347202 fix #292 2015-08-31 14:24:14 +09:00
Yasuhiro Matsumoto
1c240c6d6d extendible configuration with '*' 2015-08-20 00:20:53 +09:00
Yasuhiro Matsumoto
2c429485ec fix #290. use getpos('.') instead 2015-08-18 21:57:16 +09:00
Yasuhiro Matsumoto
7a9412d3da fix #289. don't remove ${cursor} in attributes 2015-08-18 10:50:09 +09:00
Yasuhiro Matsumoto
6e1175326e Merge branch 'master' of https://github.com/mattn/emmet-vim 2015-08-17 20:33:14 +09:00
mattn
cee9e9d6c8 Merge pull request #286 from xnuk/master
Jade: add snippets
2015-08-17 09:34:40 +09:00
즈눅
0617f58dd6 Jade: add snippets 2015-08-15 05:34:52 +09:00
23 changed files with 1576 additions and 399 deletions

8
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: mattn # Replace with a single Patreon username
open_collective: mattn # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # Replace with a single custom sponsorship URL

11
.travis.yml Normal file
View File

@@ -0,0 +1,11 @@
language: generic
sudo: false
dist: xenial
git:
depth: 10
script:
- uname -a
- which -a vim
- vim --cmd version --cmd quit
- make test

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2019 Yasuhiro Matsumoto
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -9,3 +9,7 @@ emmet-vim.zip: remove-zip
release: emmet-vim.zip release: emmet-vim.zip
vimup update-script emmet.vim vimup update-script emmet.vim
test:
@-rm -f test.log 2> /dev/null
@vim -N -c "let &rtp .= ',' . getcwd()" -c "so unittest.vim" -c EmmetUnitTest! || cat test.log || exit 1

View File

@@ -1,10 +1,13 @@
# Emmet-vim # Emmet-vim
[![Build Status](https://travis-ci.org/mattn/emmet-vim.svg?branch=master)](https://travis-ci.org/mattn/emmet-vim)
[emmet-vim](http://mattn.github.com/emmet-vim) is a vim plug-in [emmet-vim](http://mattn.github.com/emmet-vim) is a vim plug-in
which provides support for expanding abbreviations similar to which provides support for expanding abbreviations similar to
[emmet](http://emmet.io/). [emmet](http://emmet.io/).
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/mattn/emmet-vim/trend.png)](https://bitdeli.com/free "Bitdeli Badge") ![screenshot](https://raw.githubusercontent.com/mattn/emmet-vim/master/doc/screenshot.gif)
## Installation ## Installation
@@ -13,16 +16,20 @@ which provides support for expanding abbreviations similar to
cd ~/.vim cd ~/.vim
unzip emmet-vim.zip unzip emmet-vim.zip
To install using pathogen.vim: To install using [pathogen.vim](https://github.com/tpope/vim-pathogen):
git clone https://github.com/mattn/emmet-vim.git ~/.vim/bundle/emmet-vim
cd ~/.vim/bundle
git clone https://github.com/mattn/emmet-vim.git
To install using [Vundle](https://github.com/gmarik/vundle): To install using [Vundle](https://github.com/gmarik/vundle):
" add this line to your .vimrc file " add this line to your .vimrc file
Plugin 'mattn/emmet-vim' Plugin 'mattn/emmet-vim'
To install using [Vim-Plug](https://github.com/junegunn/vim-plug):
" add this line to your .vimrc file
Plug 'mattn/emmet-vim'
To checkout the source from repository: To checkout the source from repository:
cd ~/.vim/bundle cd ~/.vim/bundle
@@ -62,7 +69,7 @@ Then type `<c-y>,` (<kbd>Ctrl</kbd><kbd>y</kbd><kbd>,</kbd>), and you should see
</html> </html>
``` ```
[More Tutorials](https://raw.github.com/mattn/emmet-vim/master/TUTORIAL) [More Tutorials](https://raw.githubusercontent.com/mattn/emmet-vim/master/TUTORIAL)
## Enable in different mode ## Enable in different mode

247
TUTORIAL.mkd Normal file
View File

@@ -0,0 +1,247 @@
# Tutorial for Emmet.vim
mattn <mattn.jp@gmail.com>
## Expand an Abbreviation
Type the abbreviation as `div>p#foo$*3>a` and type `<c-y>,`
```html
<div>
<p id="foo1">
<a href=""></a>
</p>
<p id="foo2">
<a href=""></a>
</p>
<p id="foo3">
<a href=""></a>
</p>
</div>
```
## Wrap with an Abbreviation
Write as below:
```html
test1
test2
test3
```
Then do visual select(line wise) and type `<c-y>,`. Once you get to the 'Tag:' prompt, type `ul>li*`.
```html
<ul>
<li>test1</li>
<li>test2</li>
<li>test3</li>
</ul>
```
If you type a tag, such as `blockquote`, then you'll see the following:
```html
<blockquote>
test1
test2
test3
</blockquote>
```
## Balance a Tag Inward
Just type `<c-y>d` in insert mode.
## Balance a Tag Outward
Just type `<c-y>D` in insert mode.
## Go to the Next Edit Point
Just type `<c-y>n` in insert mode.
## Go to the Previous Edit Point
Just type `<c-y>N` in insert mode.
## Update an <img>s Size
Move cursor to the img tag.
```html
<img src="foo.png" />
```
Type `<c-y>i` on img tag
## Merge Lines
select the lines, which include `<li>`
```html
<ul>
<li class="list1"></li>
<li class="list2"></li>
<li class="list3"></li>
</ul>
```
and then type `<c-y>m`
```html
<ul>
<li class="list1"></li><li class="list2"></li><li class="list3"></li>
</ul>
```
## Remove the tag
Move cursor in block
```html
<div class="foo">
<a>cursor is here</a>
</div>
```
Type '<c-y>k' in insert mode.
```html
<div class="foo">
</div>
```
And type '<c-y>k' in there again.
```html
```
## Split/Join Tag
Move the cursor inside block
```html
<div class="foo">
cursor is here
</div>
```
Type '<c-y>j' in insert mode.
```html
<div class="foo"/>
```
And then type '<c-y>j' in there again.
```html
<div class="foo">
cursor is here
</div>
```
## Toggle Comment
Move cursor inside the block
```html
<div>
hello world
</div>
```
Type '<c-y>/' in insert mode.
```html
<!-- <div>
hello world
</div> -->
```
Type '<c-y>/' in there again.
```html
<div>
hello world
</div>
```
## Make an anchor from a URL
Move cursor to URL
```http
http://www.google.com/
```
Type '<c-y>a'
```html
<a href="http://www.google.com/">Google</a>
```
## Make some quoted text from a URL
Move cursor to the URL
```http
http://github.com/
```
Type '<c-y>A'
```html
<blockquote class="quote">
<a href="http://github.com/">Secure source code hosting and collaborative development - GitHub</a><br />
<p>How does it work? Get up and running in seconds by forking a project, pushing an existing repository...</p>
<cite>http://github.com/</cite>
</blockquote>
```
## Installing emmet.vim for the language you are using:
```sh
cd ~/.vim
unzip emmet-vim.zip
```
Or if you are using pathogen.vim:
```shell
cd ~/.vim/bundle # or make directory
unzip /path/to/emmet-vim.zip
```
Or if you get the sources from the repository:
```sh
cd ~/.vim/bundle # or make directory
git clone http://github.com/mattn/emmet-vim.git
```
## Enable emmet.vim for the language you using.
You can customize the behavior of the languages you are using.
```sh
cat >> ~/.vimrc
let g:user_emmet_settings = {
\ 'php' : {
\ 'extends' : 'html',
\ 'filters' : 'c',
\ },
\ 'xml' : {
\ 'extends' : 'html',
\ },
\ 'haml' : {
\ 'extends' : 'html',
\ },
\}
```

View File

@@ -6,7 +6,7 @@
let s:save_cpo = &cpoptions let s:save_cpo = &cpoptions
set cpoptions&vim set cpoptions&vim
let s:filtermx = '|\(\%(bem\|html\|haml\|slim\|e\|c\|s\|fc\|xsl\|t\|\/[^ ]\+\)\s*,\{0,1}\s*\)*$' let s:filtermx = '|\(\%(bem\|html\|blade\|haml\|slim\|e\|c\|s\|fc\|xsl\|t\|\/[^ ]\+\)\s*,\{0,1}\s*\)*$'
function! emmet#getExpandos(type, key) abort function! emmet#getExpandos(type, key) abort
let expandos = emmet#getResource(a:type, 'expandos', {}) let expandos = emmet#getResource(a:type, 'expandos', {})
@@ -49,7 +49,8 @@ function! emmet#getIndentation(...) abort
elseif has_key(s:emmet_settings.variables, 'indentation') elseif has_key(s:emmet_settings.variables, 'indentation')
let indent = s:emmet_settings.variables.indentation let indent = s:emmet_settings.variables.indentation
else else
let indent = (&l:expandtab || &l:tabstop !=# &l:shiftwidth) ? repeat(' ', &l:shiftwidth) : "\t" let sw = exists('*shiftwidth') ? shiftwidth() : &l:shiftwidth
let indent = (&l:expandtab || &l:tabstop !=# sw) ? repeat(' ', sw) : "\t"
endif endif
return indent return indent
endfunction endfunction
@@ -84,12 +85,7 @@ function! emmet#isExtends(type, extend) abort
if !has_key(s:emmet_settings[a:type], 'extends') if !has_key(s:emmet_settings[a:type], 'extends')
return 0 return 0
endif endif
let extends = s:emmet_settings[a:type].extends let extends = emmet#lang#getExtends(a:type)
if type(extends) ==# 1
let tmp = split(extends, '\s*,\s*')
unlet! extends
let extends = tmp
endif
for ext in extends for ext in extends
if a:extend ==# ext if a:extend ==# ext
return 1 return 1
@@ -101,8 +97,7 @@ endfunction
function! emmet#parseIntoTree(abbr, type) abort function! emmet#parseIntoTree(abbr, type) abort
let abbr = a:abbr let abbr = a:abbr
let type = a:type let type = a:type
let rtype = emmet#lang#exists(type) ? type : 'html' return emmet#lang#{emmet#lang#type(type)}#parseIntoTree(abbr, type)
return emmet#lang#{rtype}#parseIntoTree(abbr, type)
endfunction endfunction
function! emmet#expandAbbrIntelligent(feedkey) abort function! emmet#expandAbbrIntelligent(feedkey) abort
@@ -119,62 +114,87 @@ function! emmet#isExpandable() abort
endif endif
let part = matchstr(line, '\(\S.*\)$') let part = matchstr(line, '\(\S.*\)$')
let type = emmet#getFileType() let type = emmet#getFileType()
let ftype = emmet#lang#exists(type) ? type : 'html' let rtype = emmet#lang#type(type)
let part = emmet#lang#{ftype}#findTokens(part) let part = emmet#lang#{rtype}#findTokens(part)
return len(part) > 0 return len(part) > 0
endfunction endfunction
function! emmet#mergeConfig(lhs, rhs) abort function! emmet#mergeConfig(lhs, rhs) abort
let [lhs, rhs] = [a:lhs, a:rhs] let [lhs, rhs] = [a:lhs, a:rhs]
if type(lhs) ==# 3 && type(rhs) ==# 3 if type(lhs) ==# 3
let lhs += rhs if type(rhs) ==# 3
if len(lhs) let lhs += rhs
call remove(lhs, 0, len(lhs)-1) if len(lhs)
call remove(lhs, 0, len(lhs)-1)
endif
for rhi in rhs
call add(lhs, rhs[rhi])
endfor
elseif type(rhs) ==# 4
let lhs += map(keys(rhs), '{v:val : rhs[v:val]}')
endif endif
for rhi in rhs elseif type(lhs) ==# 4
call add(lhs, rhs[rhi]) if type(rhs) ==# 3
endfor for V in rhs
elseif type(lhs) ==# 4 && type(rhs) ==# 4 if type(V) != 4
for key in keys(rhs) continue
if type(rhs[key]) ==# 3
if !has_key(lhs, key)
let lhs[key] = []
endif endif
let lhs[key] += rhs[key] for k in keys(V)
elseif type(rhs[key]) ==# 4 let lhs[k] = V[k]
if has_key(lhs, key) endfor
call emmet#mergeConfig(lhs[key], rhs[key]) endfor
elseif type(rhs) ==# 4
for key in keys(rhs)
if type(rhs[key]) ==# 3
if !has_key(lhs, key)
let lhs[key] = []
endif
if type(lhs[key]) == 3
let lhs[key] += rhs[key]
elseif type(lhs[key]) == 4
for k in keys(rhs[key])
let lhs[key][k] = rhs[key][k]
endfor
endif
elseif type(rhs[key]) ==# 4
if has_key(lhs, key)
call emmet#mergeConfig(lhs[key], rhs[key])
else
let lhs[key] = rhs[key]
endif
else else
let lhs[key] = rhs[key] let lhs[key] = rhs[key]
endif endif
else endfor
let lhs[key] = rhs[key] endif
endif
endfor
endif endif
endfunction endfunction
function! emmet#newNode() abort function! emmet#newNode() abort
return { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'basevalue': 0, 'basedirect': 1, 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0, 'attrs_order': ['id', 'class'] } return { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'basevalue': 0, 'basedirect': 1, 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0, 'attrs_order': ['id', 'class'], 'block': 0, 'empty': 0 }
endfunction endfunction
function! s:itemno(itemno, current) abort function! s:itemno(itemno, current) abort
let current = a:current let current = a:current
if current.basedirect > 0 if current.basedirect > 0
if current.basevalue ==# 0 return current.basevalue - 1 + a:itemno
return a:itemno
else
return current.basevalue - 1 + a:itemno
endif
else else
if current.basevalue ==# 0 return current.multiplier + current.basevalue - 2 - a:itemno
return current.multiplier - 1 - a:itemno
else
return current.multiplier + current.basevalue - 2 - a:itemno
endif
endif endif
endfunction endfunction
function! s:localvar(current, key) abort
let val = ''
let cur = a:current
while !empty(cur)
if has_key(cur, 'variables') && has_key(cur.variables, a:key)
return cur.variables[a:key]
endif
let cur = cur.parent
endwhile
return ''
endfunction
function! emmet#toString(...) abort function! emmet#toString(...) abort
let current = a:1 let current = a:1
if a:0 > 1 if a:0 > 1
@@ -211,7 +231,7 @@ function! emmet#toString(...) abort
let dollar_expr = emmet#getResource(type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let itemno = 0 let itemno = 0
let str = '' let str = ''
let rtype = emmet#lang#exists(type) ? type : 'html' let rtype = emmet#lang#type(type)
while itemno < current.multiplier while itemno < current.multiplier
if len(current.name) if len(current.name)
if current.multiplier ==# 1 if current.multiplier ==# 1
@@ -270,6 +290,7 @@ function! emmet#toString(...) abort
let inner = current.value[1:-2] let inner = current.value[1:-2]
endif endif
let inner = substitute(inner, "\n", "\n" . indent, 'g') let inner = substitute(inner, "\n", "\n" . indent, 'g')
let str = substitute(str, '\${:\(\w\+\)}', '\=s:localvar(current, submatch(1))', '')
let str = substitute(str, '\${child}', inner, '') let str = substitute(str, '\${child}', inner, '')
endif endif
let itemno = itemno + 1 let itemno = itemno + 1
@@ -290,22 +311,32 @@ function! emmet#getResource(type, name, default) abort
if exists('b:emmet_' . a:name) if exists('b:emmet_' . a:name)
return get(b:, 'emmet_' . a:name) return get(b:, 'emmet_' . a:name)
endif endif
let global = {}
if has_key(s:emmet_settings, '*') && has_key(s:emmet_settings['*'], a:name)
let global = extend(global, s:emmet_settings['*'][a:name])
endif
for type in split(a:type, '\.') if has_key(s:emmet_settings, a:type)
let types = [a:type]
else
let types = split(a:type, '\.')
endif
for type in types
if !has_key(s:emmet_settings, type) if !has_key(s:emmet_settings, type)
continue continue
endif endif
let ret = a:default let ret = a:default
if has_key(s:emmet_settings[type], 'extends') if has_key(s:emmet_settings[type], 'extends')
let extends = s:emmet_settings[type].extends let extends = emmet#lang#getExtends(a:type)
if type(extends) ==# 1 call reverse(extends) " reverse to overwrite the correct way
let tmp = split(extends, '\s*,\s*')
unlet! extends
let extends = tmp
endif
for ext in extends for ext in extends
if has_key(s:emmet_settings, ext) && has_key(s:emmet_settings[ext], a:name) if !has_key(s:emmet_settings, ext)
continue
endif
if has_key(s:emmet_settings[ext], a:name)
if type(ret) ==# 3 || type(ret) ==# 4 if type(ret) ==# 3 || type(ret) ==# 4
call emmet#mergeConfig(ret, s:emmet_settings[ext][a:name]) call emmet#mergeConfig(ret, s:emmet_settings[ext][a:name])
else else
@@ -318,55 +349,84 @@ function! emmet#getResource(type, name, default) abort
if has_key(s:emmet_settings[type], a:name) if has_key(s:emmet_settings[type], a:name)
if type(ret) ==# 3 || type(ret) ==# 4 if type(ret) ==# 3 || type(ret) ==# 4
call emmet#mergeConfig(ret, s:emmet_settings[type][a:name]) call emmet#mergeConfig(ret, s:emmet_settings[type][a:name])
return extend(global, ret)
else else
let ret = s:emmet_settings[type][a:name] return s:emmet_settings[type][a:name]
endif endif
endif endif
if !empty(ret) if !empty(ret)
if type(ret) ==# 3 || type(ret) ==# 4
let ret = extend(global, ret)
endif
return ret return ret
endif endif
endfor endfor
return a:default let ret = a:default
if type(ret) ==# 3 || type(ret) ==# 4
let ret = extend(global, ret)
endif
return ret
endfunction endfunction
function! emmet#getFileType(...) abort function! emmet#getFileType(...) abort
let flg = get(a:000, 0, 0) let flg = get(a:000, 0, 0)
let type = ''
for part in split(&filetype, '\.') if has_key(s:emmet_settings, &filetype)
if emmet#lang#exists(part) let type = &filetype
let type = part if emmet#getResource(type, 'ignore_embeded_filetype', 0)
break return type
endif
let base = emmet#getBaseType(part)
if base !=# ''
if flg
let type = &filetype
else
let type = base
endif
unlet base
break
endif
endfor
if type ==# 'html'
let pos = emmet#util#getcurpos()
let type = synIDattr(synID(pos[1], pos[2], 1), 'name')
if type =~# '^css\w'
let type = 'css'
endif
if type =~# '^html\w'
let type = 'html'
endif
if type =~# '^javaScript'
let type = 'javascript'
endif
if len(type) ==# 0 && type =~# '^xml'
let type = 'xml'
endif endif
endif
let pos = emmet#util#getcurpos()
let type = synIDattr(synID(max([pos[1], 1]), max([pos[2], 1]), 1), 'name')
" ignore htmlTagName as it seems to occur too often
if type == 'htmlTagName'
let type = ''
endif endif
if len(type) ==# 0 | let type = 'html' | endif if type =~ '^mkdSnippet'
return type let type = tolower(type[10:])
endif
if type =~? '^css'
let type = 'css'
elseif type =~? '^html'
let type = 'html'
elseif type =~? '^jsx'
let type = 'jsx'
elseif type =~? '^jsTemplateString'
let type = 'css-block'
elseif (type =~? '^js\w' || type =~? '^javascript') && !(&filetype =~? 'jsx')
let type = 'javascript'
elseif type =~? '^tsx'
let type = 'tsx'
elseif type =~? '^ts\w' || type =~? '^typescript'
let type = 'typescript'
elseif type =~? '^xml'
let type = 'xml'
else
let types = split(&filetype, '\.')
for part in types
if has_key(s:emmet_settings, part)
let type = part
break
endif
let base = emmet#getBaseType(part)
if base !=# ''
if flg
let type = &filetype
else
let type = base
endif
unlet base
break
endif
endfor
endif
return len(type) == 0 ? 'html' : type
endfunction endfunction
function! emmet#getDollarExprs(expand) abort function! emmet#getDollarExprs(expand) abort
@@ -461,8 +521,7 @@ function! emmet#unescapeDollarExpr(expand) abort
endfunction endfunction
function! emmet#expandAbbr(mode, abbr) range abort function! emmet#expandAbbr(mode, abbr) range abort
let type = emmet#getFileType() let type = emmet#getFileType(1)
let rtype = emmet#getFileType(1)
let indent = emmet#getIndentation(type) let indent = emmet#getIndentation(type)
let expand = '' let expand = ''
let line = '' let line = ''
@@ -496,8 +555,12 @@ function! emmet#expandAbbr(mode, abbr) range abort
let spl = '' let spl = ''
endif endif
let items = emmet#parseIntoTree(query, type).child let items = emmet#parseIntoTree(query, type).child
let itemno = 0
for item in items for item in items
let expand .= emmet#toString(item, rtype, 0, filters, 0, indent) let inner = emmet#toString(item, type, 0, filters, 0, indent)
let inner = substitute(inner, '\$#', '$line'.(itemno*(a:lastline - a:firstline + 1)/len(items)+1).'$', 'g')
let expand .= inner
let itemno = itemno + 1
endfor endfor
if emmet#useFilter(filters, 'e') if emmet#useFilter(filters, 'e')
let expand = substitute(expand, '&', '\&amp;', 'g') let expand = substitute(expand, '&', '\&amp;', 'g')
@@ -564,7 +627,7 @@ function! emmet#expandAbbr(mode, abbr) range abort
let items = emmet#parseIntoTree(leader, type).child let items = emmet#parseIntoTree(leader, type).child
endif endif
for item in items for item in items
let expand .= emmet#toString(item, rtype, 0, filters, 0, '') let expand .= emmet#toString(item, type, 0, filters, 0, '')
endfor endfor
if emmet#useFilter(filters, 'e') if emmet#useFilter(filters, 'e')
let expand = substitute(expand, '&', '\&amp;', 'g') let expand = substitute(expand, '&', '\&amp;', 'g')
@@ -595,8 +658,8 @@ function! emmet#expandAbbr(mode, abbr) range abort
let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$') let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$')
else else
let part = matchstr(line, '\(\S.*\)$') let part = matchstr(line, '\(\S.*\)$')
let ftype = emmet#lang#exists(type) ? type : 'html' let rtype = emmet#lang#type(type)
let part = emmet#lang#{ftype}#findTokens(part) let part = emmet#lang#{rtype}#findTokens(part)
let line = line[0: strridx(line, part) + len(part) - 1] let line = line[0: strridx(line, part) + len(part) - 1]
endif endif
if col('.') ==# col('$') if col('.') ==# col('$')
@@ -609,9 +672,9 @@ function! emmet#expandAbbr(mode, abbr) range abort
let filters = split(matchstr(str, s:filtermx)[1:], '\s*,\s*') let filters = split(matchstr(str, s:filtermx)[1:], '\s*,\s*')
let str = substitute(str, s:filtermx, '', '') let str = substitute(str, s:filtermx, '', '')
endif endif
let items = emmet#parseIntoTree(str, rtype).child let items = emmet#parseIntoTree(str, type).child
for item in items for item in items
let expand .= emmet#toString(item, rtype, 0, filters, 0, indent) let expand .= emmet#toString(item, type, 0, filters, 0, indent)
endfor endfor
if emmet#useFilter(filters, 'e') if emmet#useFilter(filters, 'e')
let expand = substitute(expand, '&', '\&amp;', 'g') let expand = substitute(expand, '&', '\&amp;', 'g')
@@ -674,7 +737,7 @@ function! emmet#expandAbbr(mode, abbr) range abort
if g:emmet_debug > 1 if g:emmet_debug > 1
call getchar() call getchar()
endif endif
if search('\ze\$\(cursor\|select\)\$') if search('\ze\$\(cursor\|select\)\$', 'c')
let oldselection = &selection let oldselection = &selection
let &selection = 'inclusive' let &selection = 'inclusive'
if foldclosed(line('.')) !=# -1 if foldclosed(line('.')) !=# -1
@@ -737,48 +800,41 @@ endfunction
function! emmet#moveNextPrevItem(flag) abort function! emmet#moveNextPrevItem(flag) abort
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' return emmet#lang#{emmet#lang#type(type)}#moveNextPrevItem(a:flag)
return emmet#lang#{rtype}#moveNextPrevItem(a:flag)
endfunction endfunction
function! emmet#moveNextPrev(flag) abort function! emmet#moveNextPrev(flag) abort
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' return emmet#lang#{emmet#lang#type(type)}#moveNextPrev(a:flag)
return emmet#lang#{rtype}#moveNextPrev(a:flag)
endfunction endfunction
function! emmet#imageSize() abort function! emmet#imageSize() abort
let orgpos = emmet#util#getcurpos() let orgpos = emmet#util#getcurpos()
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' call emmet#lang#{emmet#lang#type(type)}#imageSize()
call emmet#lang#{rtype}#imageSize()
silent! call setpos('.', orgpos) silent! call setpos('.', orgpos)
return '' return ''
endfunction endfunction
function! emmet#encodeImage() abort function! emmet#imageEncode() abort
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' return emmet#lang#{emmet#lang#type(type)}#imageEncode()
return emmet#lang#{rtype}#encodeImage()
endfunction endfunction
function! emmet#toggleComment() abort function! emmet#toggleComment() abort
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' call emmet#lang#{emmet#lang#type(type)}#toggleComment()
call emmet#lang#{rtype}#toggleComment()
return '' return ''
endfunction endfunction
function! emmet#balanceTag(flag) range abort function! emmet#balanceTag(flag) range abort
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' return emmet#lang#{emmet#lang#type(type)}#balanceTag(a:flag)
return emmet#lang#{rtype}#balanceTag(a:flag)
endfunction endfunction
function! emmet#splitJoinTag() abort function! emmet#splitJoinTag() abort
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' return emmet#lang#{emmet#lang#type(type)}#splitJoinTag()
return emmet#lang#{rtype}#splitJoinTag()
endfunction endfunction
function! emmet#mergeLines() range abort function! emmet#mergeLines() range abort
@@ -790,8 +846,13 @@ endfunction
function! emmet#removeTag() abort function! emmet#removeTag() abort
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' call emmet#lang#{emmet#lang#type(type)}#removeTag()
call emmet#lang#{rtype}#removeTag() return ''
endfunction
function! emmet#mergeLines() abort
let type = emmet#getFileType()
call emmet#lang#{emmet#lang#type(type)}#mergeLines()
return '' return ''
endfunction endfunction
@@ -812,9 +873,11 @@ function! emmet#anchorizeURL(flag) abort
let title = matchstr(content, mx) let title = matchstr(content, mx)
let type = emmet#getFileType() let type = emmet#getFileType()
let rtype = emmet#lang#exists(type) ? type : 'html' let rtype = emmet#lang#type(type)
if &filetype ==# 'markdown' if &filetype ==# 'markdown'
let expand = printf('[%s](%s)', substitute(title, '[\[\]]', '\\&', 'g'), url) let expand = printf('[%s](%s)', substitute(title, '[\[\]]', '\\&', 'g'), url)
elseif &filetype ==# 'rst'
let expand = printf('`%s <%s>`_', substitute(title, '[\[\]]', '\\&', 'g'), url)
elseif a:flag ==# 0 elseif a:flag ==# 0
let a = emmet#lang#html#parseTag('<a>') let a = emmet#lang#html#parseTag('<a>')
let a.attr.href = url let a.attr.href = url
@@ -1027,6 +1090,7 @@ let s:emmet_settings = {
\ "d:n": "display:none;", \ "d:n": "display:none;",
\ "d:b": "display:block;", \ "d:b": "display:block;",
\ "d:f": "display:flex;", \ "d:f": "display:flex;",
\ "d:if": "display:inline-flex;",
\ "d:i": "display:inline;", \ "d:i": "display:inline;",
\ "d:ib": "display:inline-block;", \ "d:ib": "display:inline-block;",
\ "d:ib+": "display: inline-block;\n*display: inline;\n*zoom: 1;", \ "d:ib+": "display: inline-block;\n*display: inline;\n*zoom: 1;",
@@ -1531,6 +1595,47 @@ let s:emmet_settings = {
\ "cur:m": "cursor:move;", \ "cur:m": "cursor:move;",
\ "cur:p": "cursor:pointer;", \ "cur:p": "cursor:pointer;",
\ "cur:t": "cursor:text;", \ "cur:t": "cursor:text;",
\ "fxd": "flex-direction:|;",
\ "fxd:r": "flex-direction:row;",
\ "fxd:rr": "flex-direction:row-reverse;",
\ "fxd:c": "flex-direction:column;",
\ "fxd:cr": "flex-direction:column-reverse;",
\ "fxw": "flex-wrap: |;",
\ "fxw:n": "flex-wrap:nowrap;",
\ "fxw:w": "flex-wrap:wrap;",
\ "fxw:wr": "flex-wrap:wrap-reverse;",
\ "fxf": "flex-flow:|;",
\ "jc": "justify-content:|;",
\ "jc:fs": "justify-content:flex-start;",
\ "jc:fe": "justify-content:flex-end;",
\ "jc:c": "justify-content:center;",
\ "jc:sb": "justify-content:space-between;",
\ "jc:sa": "justify-content:space-around;",
\ "ai": "align-items:|;",
\ "ai:fs": "align-items:flex-start;",
\ "ai:fe": "align-items:flex-end;",
\ "ai:c": "align-items:center;",
\ "ai:b": "align-items:baseline;",
\ "ai:s": "align-items:stretch;",
\ "ac": "align-content:|;",
\ "ac:fs": "align-content:flex-start;",
\ "ac:fe": "align-content:flex-end;",
\ "ac:c": "align-content:center;",
\ "ac:sb": "align-content:space-between;",
\ "ac:sa": "align-content:space-around;",
\ "ac:s": "align-content:stretch;",
\ "ord": "order:|;",
\ "fxg": "flex-grow:|;",
\ "fxsh": "flex-shrink:|;",
\ "fxb": "flex-basis:|;",
\ "fx": "flex:|;",
\ "as": "align-self:|;",
\ "as:a": "align-self:auto;",
\ "as:fs": "align-self:flex-start;",
\ "as:fe": "align-self:flex-end;",
\ "as:c": "align-self:center;",
\ "as:b": "align-self:baseline;",
\ "as:s": "align-self:stretch;",
\ "pgbb": "page-break-before:|;", \ "pgbb": "page-break-before:|;",
\ "pgbb:au": "page-break-before:auto;", \ "pgbb:au": "page-break-before:auto;",
\ "pgbb:al": "page-break-before:always;", \ "pgbb:al": "page-break-before:always;",
@@ -1554,6 +1659,7 @@ let s:emmet_settings = {
\ "wfsm:n": "-webkit-font-smoothing:none;" \ "wfsm:n": "-webkit-font-smoothing:none;"
\ }, \ },
\ 'filters': 'fc', \ 'filters': 'fc',
\ 'ignore_embeded_filetype': 1,
\ }, \ },
\ 'sass': { \ 'sass': {
\ 'extends': 'css', \ 'extends': 'css',
@@ -1639,17 +1745,17 @@ let s:emmet_settings = {
\ ."</html>", \ ."</html>",
\ }, \ },
\ 'default_attributes': { \ 'default_attributes': {
\ 'a': {'href': ''}, \ 'a': [{'href': ''}],
\ 'a:link': {'href': 'http://|'}, \ 'a:link': [{'href': 'http://|'}],
\ 'a:mail': {'href': 'mailto:|'}, \ 'a:mail': [{'href': 'mailto:|'}],
\ 'abbr': {'title': ''}, \ 'abbr': [{'title': ''}],
\ 'acronym': {'title': ''}, \ 'acronym': [{'title': ''}],
\ 'base': {'href': ''}, \ 'base': [{'href': ''}],
\ 'bdo': {'dir': ''}, \ 'bdo': [{'dir': ''}],
\ 'bdo:r': {'dir': 'rtl'}, \ 'bdo:r': [{'dir': 'rtl'}],
\ 'bdo:l': {'dir': 'ltr'}, \ 'bdo:l': [{'dir': 'ltr'}],
\ 'del': {'datetime': '${datetime}'}, \ 'del': [{'datetime': '${datetime}'}],
\ 'ins': {'datetime': '${datetime}'}, \ 'ins': [{'datetime': '${datetime}'}],
\ 'link:css': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|style.css'}, {'media': 'all'}], \ 'link:css': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|style.css'}, {'media': 'all'}],
\ 'link:print': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|print.css'}, {'media': 'print'}], \ 'link:print': [{'rel': 'stylesheet'}, g:emmet_html5 ? {} : {'type': 'text/css'}, {'href': '|print.css'}, {'media': 'print'}],
\ 'link:import': [{'rel': 'import'}, {'href': '|.html'}], \ 'link:import': [{'rel': 'import'}, {'href': '|.html'}],
@@ -1662,9 +1768,9 @@ let s:emmet_settings = {
\ 'meta:vp': [{'name': 'viewport'}, {'content': 'width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'}], \ 'meta:vp': [{'name': 'viewport'}, {'content': 'width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'}],
\ 'meta:win': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=Win-1251'}], \ 'meta:win': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=Win-1251'}],
\ 'meta:compat': [{'http-equiv': 'X-UA-Compatible'}, {'content': 'IE=7'}], \ 'meta:compat': [{'http-equiv': 'X-UA-Compatible'}, {'content': 'IE=7'}],
\ 'style': g:emmet_html5 ? {} : {'type': 'text/css'}, \ 'style': g:emmet_html5 ? [] : [{'type': 'text/css'}],
\ 'script': g:emmet_html5 ? {} : {'type': 'text/javascript'}, \ 'script': g:emmet_html5 ? [] : [{'type': 'text/javascript'}],
\ 'script:src': g:emmet_html5 ? {'src': ''} : [{'type': 'text/javascript'}, {'src': ''}], \ 'script:src': (g:emmet_html5 ? [] : [{'type': 'text/javascript'}]) + [{'src': ''}],
\ 'img': [{'src': ''}, {'alt': ''}], \ 'img': [{'src': ''}, {'alt': ''}],
\ 'iframe': [{'src': ''}, {'frameborder': '0'}], \ 'iframe': [{'src': ''}, {'frameborder': '0'}],
\ 'embed': [{'src': ''}, {'type': ''}], \ 'embed': [{'src': ''}, {'type': ''}],
@@ -1677,12 +1783,12 @@ let s:emmet_settings = {
\ 'area:r': [{'shape': 'rect'}, {'coords': ''}, {'href': ''}, {'alt': ''}], \ 'area:r': [{'shape': 'rect'}, {'coords': ''}, {'href': ''}, {'alt': ''}],
\ 'area:p': [{'shape': 'poly'}, {'coords': ''}, {'href': ''}, {'alt': ''}], \ 'area:p': [{'shape': 'poly'}, {'coords': ''}, {'href': ''}, {'alt': ''}],
\ 'link': [{'rel': 'stylesheet'}, {'href': ''}], \ 'link': [{'rel': 'stylesheet'}, {'href': ''}],
\ 'form': {'action': ''}, \ 'form': [{'action': ''}],
\ 'form:get': {'action': '', 'method': 'get'}, \ 'form:get': [{'action': ''}, {'method': 'get'}],
\ 'form:post': {'action': '', 'method': 'post'}, \ 'form:post': [{'action': ''}, {'method': 'post'}],
\ 'form:upload': {'action': '', 'method': 'post', 'enctype': 'multipart/form-data'}, \ 'form:upload': [{'action': ''}, {'method': 'post'}, {'enctype': 'multipart/form-data'}],
\ 'label': {'for': ''}, \ 'label': [{'for': ''}],
\ 'input': {'type': ''}, \ 'input': [{'type': ''}],
\ 'input:hidden': [{'type': 'hidden'}, {'name': ''}], \ 'input:hidden': [{'type': 'hidden'}, {'name': ''}],
\ 'input:h': [{'type': 'hidden'}, {'name': ''}], \ 'input:h': [{'type': 'hidden'}, {'name': ''}],
\ 'input:text': [{'type': 'text'}, {'name': ''}, {'id': ''}], \ 'input:text': [{'type': 'text'}, {'name': ''}, {'id': ''}],
@@ -1715,14 +1821,14 @@ let s:emmet_settings = {
\ 'input:button': [{'type': 'button'}, {'value': ''}], \ 'input:button': [{'type': 'button'}, {'value': ''}],
\ 'input:b': [{'type': 'button'}, {'value': ''}], \ 'input:b': [{'type': 'button'}, {'value': ''}],
\ 'select': [{'name': ''}, {'id': ''}], \ 'select': [{'name': ''}, {'id': ''}],
\ 'option': {'value': ''}, \ 'option': [{'value': ''}],
\ 'textarea': [{'name': ''}, {'id': ''}, {'cols': '30'}, {'rows': '10'}], \ 'textarea': [{'name': ''}, {'id': ''}, {'cols': '30'}, {'rows': '10'}],
\ 'menu:context': {'type': 'context'}, \ 'menu:context': [{'type': 'context'}],
\ 'menu:c': {'type': 'context'}, \ 'menu:c': [{'type': 'context'}],
\ 'menu:toolbar': {'type': 'toolbar'}, \ 'menu:toolbar': [{'type': 'toolbar'}],
\ 'menu:t': {'type': 'toolbar'}, \ 'menu:t': [{'type': 'toolbar'}],
\ 'video': {'src': ''}, \ 'video': [{'src': ''}],
\ 'audio': {'src': ''}, \ 'audio': [{'src': ''}],
\ 'html:xml': [{'xmlns': 'http://www.w3.org/1999/xhtml'}, {'xml:lang': '${lang}'}], \ 'html:xml': [{'xmlns': 'http://www.w3.org/1999/xhtml'}, {'xml:lang': '${lang}'}],
\ }, \ },
\ 'aliases': { \ 'aliases': {
@@ -1783,9 +1889,20 @@ let s:emmet_settings = {
\ }, \ },
\ 'empty_elements': 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command', \ 'empty_elements': 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command',
\ 'block_elements': 'address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6', \ 'block_elements': 'address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6',
\ 'inline_elements': 'a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var', \ 'inline_elements': 'a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,small,span,strike,strong,sub,sup,textarea,tt,u,var',
\ 'empty_element_suffix': g:emmet_html5 ? '>' : ' />', \ 'empty_element_suffix': g:emmet_html5 ? '>' : ' />',
\ 'indent_blockelement': 0, \ 'indent_blockelement': 0,
\ 'block_all_childless': 0,
\ },
\ 'elm': {
\ 'indentation': ' ',
\ 'extends': 'html',
\ },
\ 'xml': {
\ 'extends': 'html',
\ 'empty_elements': '',
\ 'block_elements': '',
\ 'inline_elements': '',
\ }, \ },
\ 'htmldjango': { \ 'htmldjango': {
\ 'extends': 'html', \ 'extends': 'html',
@@ -1793,6 +1910,59 @@ let s:emmet_settings = {
\ 'html.django_template': { \ 'html.django_template': {
\ 'extends': 'html', \ 'extends': 'html',
\ }, \ },
\ 'jade': {
\ 'indentation': ' ',
\ 'extends': 'html',
\ 'snippets': {
\ '!': "html:5",
\ '!!!': "doctype html\n",
\ '!!!4t': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"\n",
\ '!!!4s': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"\n",
\ '!!!xt': "doctype transitional\n",
\ '!!!xs': "doctype strict\n",
\ '!!!xxs': "doctype 1.1\n",
\ 'c': "\/\/ |${child}",
\ 'html:4t': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"\n"
\ ."html(lang=\"${lang}\")\n"
\ ."\thead\n"
\ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n"
\ ."\t\ttitle\n"
\ ."\tbody\n\t\t${child}|",
\ 'html:4s': "doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"\n"
\ ."html(lang=\"${lang}\")\n"
\ ."\thead\n"
\ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n"
\ ."\t\ttitle\n"
\ ."\tbody\n\t\t${child}|",
\ 'html:xt': "doctype transitional\n"
\ ."html(xmlns=\"http://www.w3.org/1999/xhtml\", xml:lang=\"${lang}\")\n"
\ ."\thead\n"
\ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n"
\ ."\t\ttitle\n"
\ ."\tbody\n\t\t${child}|",
\ 'html:xs': "doctype strict\n"
\ ."html(xmlns=\"http://www.w3.org/1999/xhtml\", xml:lang=\"${lang}\")\n"
\ ."\thead\n"
\ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n"
\ ."\t\ttitle\n"
\ ."\tbody\n\t\t${child}|",
\ 'html:xxs': "doctype 1.1\n"
\ ."html(xmlns=\"http://www.w3.org/1999/xhtml\", xml:lang=\"${lang}\")\n"
\ ."\thead\n"
\ ."\t\tmeta(http-equiv=\"Content-Type\", content=\"text/html;charset=${charset}\")\n"
\ ."\t\ttitle\n"
\ ."\tbody\n\t\t${child}|",
\ 'html:5': "doctype html\n"
\ ."html(lang=\"${lang}\")\n"
\ ."\thead\n"
\ ."\t\tmeta(charset=\"${charset}\")\n"
\ ."\t\ttitle\n"
\ ."\tbody\n\t\t${child}|",
\ },
\ },
\ 'pug': {
\ 'extends': 'jade',
\ },
\ 'xsl': { \ 'xsl': {
\ 'extends': 'html', \ 'extends': 'html',
\ 'default_attributes': { \ 'default_attributes': {
@@ -1833,7 +2003,11 @@ let s:emmet_settings = {
\ }, \ },
\ 'jsx': { \ 'jsx': {
\ 'extends': 'html', \ 'extends': 'html',
\ 'attribute_name': {'class': 'className'}, \ 'attribute_name': {'class': 'className', 'for': 'htmlFor'},
\ 'empty_element_suffix': ' />',
\ },
\ 'tsx': {
\ 'extends': 'jsx',
\ }, \ },
\ 'xslt': { \ 'xslt': {
\ 'extends': 'xsl', \ 'extends': 'xsl',
@@ -1864,6 +2038,7 @@ let s:emmet_settings = {
\ ."\tbody\n" \ ."\tbody\n"
\ ."\t\t${child}|\n", \ ."\t\t${child}|\n",
\ }, \ },
\ 'ignore_embeded_filetype': 1,
\ }, \ },
\ 'xhtml': { \ 'xhtml': {
\ 'extends': 'html' \ 'extends': 'html'
@@ -1879,7 +2054,7 @@ let s:emmet_settings = {
\ ."\t<xsd:element name=\"\" type=\"\"/>\n" \ ."\t<xsd:element name=\"\" type=\"\"/>\n"
\ ."</xsd:schema>\n" \ ."</xsd:schema>\n"
\ } \ }
\ } \ },
\} \}
if exists('g:user_emmet_settings') if exists('g:user_emmet_settings')

View File

@@ -9,3 +9,45 @@ function! emmet#lang#exists(type) abort
return s:exists[a:type] return s:exists[a:type]
endfunction endfunction
function! emmet#lang#type(type) abort
let type = a:type
let base = type
let settings = emmet#getSettings()
while base != ''
for b in split(base, '\.')
let b = substitute(b, '-.*', '', '')
if emmet#lang#exists(b)
return b
endif
if has_key(settings, b) && has_key(settings[b], 'extends')
let base = settings[b].extends
break
else
let base = ''
endif
endfor
endwhile
return 'html'
endfunction
" get all extends for a type recursively
function! emmet#lang#getExtends(type) abort
let settings = emmet#getSettings()
if !has_key(settings[a:type], 'extends')
return []
endif
let extends = settings[a:type].extends
if type(extends) ==# 1
let tmp = split(extends, '\s*,\s*')
unlet! extends
let extends = tmp
endif
for ext in extends
let extends = extends + emmet#lang#getExtends(ext)
endfor
return extends
endfunction

View File

@@ -13,10 +13,11 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort
let prefix = 0 let prefix = 0
let value = '' let value = ''
let indent = emmet#getIndentation(type) let ftype = substitute(type, '-.*', '', '')
let aliases = emmet#getResource(type, 'aliases', {}) let indent = emmet#getIndentation(ftype)
let snippets = emmet#getResource(type, 'snippets', {}) let aliases = emmet#getResource(ftype, 'aliases', {})
let use_pipe_for_cursor = emmet#getResource(type, 'use_pipe_for_cursor', 1) let snippets = emmet#getResource(ftype, 'snippets', {})
let use_pipe_for_cursor = emmet#getResource(ftype, 'use_pipe_for_cursor', 1)
let root = emmet#newNode() let root = emmet#newNode()
@@ -31,7 +32,7 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort
else else
for n in range(len(tokens)) for n in range(len(tokens))
let token = tokens[n] let token = tokens[n]
let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+\%(p\|e\|em\|re\|rem\|%\)\{0,1}-\{0,1}\|-auto\)*\)$') let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+\%(p\|e\|em\|x\|vh\|vw\|re\|rem\|%\)\{0,}-\{0,1}\|-auto\)*\)$')
if len(prop) if len(prop)
let token = substitute(prop[1], '^(\(.*\))', '\1', '') let token = substitute(prop[1], '^(\(.*\))', '\1', '')
if token =~# '^-' if token =~# '^-'
@@ -39,34 +40,51 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort
let token = token[1:] let token = token[1:]
endif endif
let value = '' let value = ''
for v in split(prop[2], '\d\zs-') for vt in split(prop[2], '\a\+\zs')
if len(value) > 0 let ut = matchstr(vt, '[a-z]\+$')
let value .= ' ' if ut == 'auto'
endif let ut = ''
if token =~# '^[z]'
" TODO
let value .= substitute(v, '[^0-9.]*$', '', '')
elseif v =~# 'p$'
let value .= substitute(v, 'p$', '%', '')
elseif v =~# '%$'
let value .= v
elseif v =~# 'e$'
let value .= substitute(v, 'e$', 'em', '')
elseif v =~# 'em$'
let value .= v
elseif v =~# 're$'
let value .= substitute(v, 're$', 'rem', '')
elseif v =~# 'rem$'
let value .= v
elseif v =~# '\.'
let value .= v . 'em'
elseif v ==# 'auto'
let value .= v
elseif v ==# '0'
let value .= '0'
else
let value .= v . 'px'
endif endif
for v in split(vt, '\d\zs-')
if len(value) > 0
let value .= ' '
endif
if v !~ '[a-z]\+$'
let v .= ut
endif
if token =~# '^[z]'
" TODO
let value .= substitute(v, '[^0-9.]*$', '', '')
elseif v =~# 'em$'
let value .= v
elseif v =~# 'ex$'
let value .= v
elseif v =~# 'vh$'
let value .= v
elseif v =~# 'vw$'
let value .= v
elseif v =~# 'rem$'
let value .= v
elseif v ==# 'auto'
let value .= v
elseif v =~# 'p$'
let value .= substitute(v, 'p$', '%', '')
elseif v =~# '%$'
let value .= v
elseif v =~# 'e$'
let value .= substitute(v, 'e$', 'em', '')
elseif v =~# 'x$'
let value .= substitute(v, 'x$', 'ex', '')
elseif v =~# 're$'
let value .= substitute(v, 're$', 'rem', '')
elseif v =~# '\.'
let value .= v . 'em'
elseif v ==# '0'
let value .= '0'
else
let value .= v . 'px'
endif
endfor
endfor endfor
endif endif
@@ -93,6 +111,9 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort
if !has_key(snippets, snippet_name) if !has_key(snippets, snippet_name)
let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-\)') let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-\)')
let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(vv) == 0
let vv = filter(sort(keys(snippets)), 'substitute(v:val, ":", "", "g") == snippet_name')
endif
if len(vv) > 0 if len(vv) > 0
let snippet_name = vv[0] let snippet_name = vv[0]
else else
@@ -161,6 +182,10 @@ function! emmet#lang#css#parseIntoTree(abbr, type) abort
call add(root.child, deepcopy(current)) call add(root.child, deepcopy(current))
let current.snippet = '-moz-' . snippet . "\n" let current.snippet = '-moz-' . snippet . "\n"
call add(root.child, deepcopy(current)) call add(root.child, deepcopy(current))
let current.snippet = '-o-' . snippet . "\n"
call add(root.child, deepcopy(current))
let current.snippet = '-ms-' . snippet . "\n"
call add(root.child, deepcopy(current))
let current.snippet = snippet let current.snippet = snippet
call add(root.child, current) call add(root.child, current)
elseif token =~# '^c#\([0-9a-fA-F]\{3}\|[0-9a-fA-F]\{6}\)\(\.[0-9]\+\)\?' elseif token =~# '^c#\([0-9a-fA-F]\{3}\|[0-9a-fA-F]\{6}\)\(\.[0-9]\+\)\?'
@@ -244,7 +269,21 @@ function! emmet#lang#css#imageSize() abort
call emmet#util#setContent(img_region, content) call emmet#util#setContent(img_region, content)
endfunction endfunction
function! emmet#lang#css#encodeImage() abort function! emmet#lang#css#imageEncode() abort
let img_region = emmet#util#searchRegion('url(', ')')
if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return
endif
let content = emmet#util#getContent(img_region)
let fn = matchstr(content, '\<url(\zs[^)]\+\ze)')
let fn = substitute(fn, '[''" \t]', '', 'g')
if fn =~# '^\s*$'
return
elseif fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let encoded = emmet#util#imageEncodeDecode(fn, 0)
call emmet#util#setContent(img_region, 'url(' . encoded . ')')
endfunction endfunction
function! emmet#lang#css#parseTag(tag) abort function! emmet#lang#css#parseTag(tag) abort
@@ -272,7 +311,9 @@ function! emmet#lang#css#toggleComment() abort
let line = substitute(matchstr(line, mx), mx, '\2', '') let line = substitute(matchstr(line, mx), mx, '\2', '')
let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g') let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g')
else else
let mx = '^\(\s*\)\(.*\)\s*$' let mx = '^\(\s*\)\(''[^'']*''\|[^'']*\|;\)\s*$'
" TODO multi-property
"let mx = '^\(\s*\)\(\%(''[^'']*''\|[^'';]\+\)*;\{0,1}\)'
let line = substitute(line, mx, '\1/* \2 */', '') let line = substitute(line, mx, '\1/* \2 */', '')
endif endif
call setline('.', line) call setline('.', line)
@@ -328,13 +369,8 @@ function! emmet#lang#css#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#css#moveNextPrev(flag) abort function! emmet#lang#css#moveNextPrev(flag) abort
let pos = search('""\|()\|\(:\s*\zs$\)', a:flag ? 'Wbp' : 'Wp') call search('""\|()\|\(:\s*\zs;\{1,0}$\)', a:flag ? 'Wbp' : 'Wp')
if pos == 2 return ''
startinsert!
else
silent! normal! l
startinsert
endif
endfunction endfunction
function! emmet#lang#css#splitJoinTag() abort function! emmet#lang#css#splitJoinTag() abort
@@ -344,3 +380,7 @@ endfunction
function! emmet#lang#css#removeTag() abort function! emmet#lang#css#removeTag() abort
" nothing to do " nothing to do
endfunction endfunction
function! emmet#lang#css#mergeLines() abort
" nothing to do
endfunction

241
autoload/emmet/lang/elm.vim Normal file
View File

@@ -0,0 +1,241 @@
function! emmet#lang#elm#findTokens(str) abort
return emmet#lang#html#findTokens(a:str)
endfunction
function! emmet#lang#elm#parseIntoTree(abbr, type) abort
let tree = emmet#lang#html#parseIntoTree(a:abbr, a:type)
if len(tree.child) < 2 | return tree | endif
" Add ',' nodes between root elements.
let new_children = []
for child in tree.child[0:-2]
let comma = emmet#newNode()
let comma.name = ','
call add(new_children, child)
call add(new_children, comma)
endfor
call add(new_children, tree.child[-1])
let tree.child = new_children
return tree
endfunction
function! emmet#lang#elm#renderNode(node)
let elm_nodes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'
\, 'div', 'p', 'hr', 'pre', 'blockquote'
\, 'span', 'a', 'code', 'em', 'strong', 'i', 'b', 'u', 'sub', 'sup', 'br'
\, 'ol', 'ul', 'li', 'dl', 'dt', 'dd'
\, 'img', 'iframe', 'canvas', 'math'
\, 'form', 'input', 'textarea', 'button', 'select', 'option'
\, 'section', 'nav', 'article', 'aside', 'header', 'footer', 'address', 'main_', 'body'
\, 'figure', 'figcaption'
\, 'table', 'caption', 'colgroup', 'col', 'tbody', 'thead', 'tfoot', 'tr', 'td', 'th'
\, 'fieldset', 'legend', 'label', 'datalist', 'optgroup', 'keygen', 'output', 'progress', 'meter'
\, 'audio', 'video', 'source', 'track'
\, 'embed', 'object', 'param'
\, 'ins', 'del'
\, 'small', 'cite', 'dfn', 'abbr', 'time', 'var', 'samp', 'kbd', 's', 'q'
\, 'mark', 'ruby', 'rt', 'rp', 'bdi', 'bdo', 'wbr'
\, 'details', 'summary', 'menuitem', 'menu']
if index(elm_nodes, a:node) >= 0
return a:node
endif
return 'node "' . a:node . '"'
endfunction
function! emmet#lang#elm#renderParam(param)
let elm_events = ["onClick", "onDoubleClick"
\, "onMouseDown", "onMouseUp"
\, "onMouseEnter", "onMouseLeave"
\, "onMouseOver", "onMouseOut"
\, "onInput", "onCheck", "onSubmit"
\, "onBlur", "onFocus"
\, "on", "onWithOptions", "Options", "defaultOptions"
\, "targetValue", "targetChecked", "keyCode"]
if index(elm_events, a:param) >= 0
return a:param
endif
let elm_attributes = ["style", "map" , "class", "id", "title", "hidden"
\, "type", "type_", "value", "defaultValue", "checked", "placeholder", "selected"
\, "accept", "acceptCharset", "action", "autocomplete", "autofocus"
\, "disabled", "enctype", "formaction", "list", "maxlength", "minlength", "method", "multiple"
\, "name", "novalidate", "pattern", "readonly", "required", "size", "for", "form"
\, "max", "min", "step"
\, "cols", "rows", "wrap"
\, "href", "target", "download", "downloadAs", "hreflang", "media", "ping", "rel"
\, "ismap", "usemap", "shape", "coords"
\, "src", "height", "width", "alt"
\, "autoplay", "controls", "loop", "preload", "poster", "default", "kind", "srclang"
\, "sandbox", "seamless", "srcdoc"
\, "reversed", "start"
\, "align", "colspan", "rowspan", "headers", "scope"
\, "async", "charset", "content", "defer", "httpEquiv", "language", "scoped"
\, "accesskey", "contenteditable", "contextmenu", "dir", "draggable", "dropzone"
\, "itemprop", "lang", "spellcheck", "tabindex"
\, "challenge", "keytype"
\, "cite", "datetime", "pubdate", "manifest"]
if index(elm_attributes, a:param) >= 0
if a:param == 'type'
return 'type_'
endif
return a:param
endif
return 'attribute "' . a:param . '"'
endfunction
function! emmet#lang#elm#toString(settings, current, type, inline, filters, itemno, indent) abort
let settings = a:settings
let current = a:current
let type = a:type
let inline = a:inline
let filters = a:filters
let itemno = a:itemno
let indent = emmet#getIndentation(type)
let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let str = ''
" comma between items with *, eg. li*3
if itemno > 0
let str = ", "
endif
let current_name = current.name
if dollar_expr
let current_name = substitute(current.name, '\$$', itemno+1, '')
endif
if len(current.name) > 0
" inserted root comma nodes
if current_name == ','
return "\n, "
endif
let str .= emmet#lang#elm#renderNode(current_name)
let tmp = ''
for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(current.attr, attr)
continue
endif
let Val = current.attr[attr]
let attr = emmet#lang#elm#renderParam(attr)
if type(Val) == 2 && Val == function('emmet#types#true')
let tmp .= ', ' . attr . ' True'
else
if dollar_expr
while Val =~# '\$\([^#{]\|$\)'
let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile
let attr = substitute(attr, '\$$', itemno+1, '')
endif
let valtmp = substitute(Val, '\${cursor}', '', '')
if attr ==# 'id' && len(valtmp) > 0
let tmp .=', id "' . Val . '"'
elseif attr ==# 'class' && len(valtmp) > 0
let tmp .= ', class "' . substitute(Val, '\.', ' ', 'g') . '"'
else
let tmp .= ', ' . attr . ' "' . Val . '"'
endif
endif
endfor
if ! len(tmp)
let str .= ' []'
else
let tmp = strpart(tmp, 2)
let str .= ' [ ' . tmp . ' ]'
endif
" No children quit early
if len(current.child) == 0 && len(current.value) == 0
"Place cursor in node with no value or children
let str .= ' [${cursor}]'
return str
endif
let inner = ''
" Parent contex text
if len(current.value) > 0
let text = current.value[1:-2]
if dollar_expr
let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let text = substitute(text, '\${nr}', "\n", 'g')
let text = substitute(text, '\\\$', '$', 'g')
" let str = substitute(str, '\$#', text, 'g')
let inner .= ', text "' . text . '"'
endif
endif
" Has children
for child in current.child
if len(child.name) == 0 && len(child.value) > 0
" Text node
let text = child.value[1:-2]
if dollar_expr
let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let text = substitute(text, '\${nr}', "\n", 'g')
let text = substitute(text, '\\\$', '$', 'g')
endif
let inner .= ', text "' . text . '"'
else
" Other nodes
let inner .= ', ' . emmet#toString(child, type, inline, filters, 0, indent)
endif
endfor
let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let inner = strpart(inner, 2)
let inner = substitute(inner, ' ', '', 'g')
if ! len(inner)
let str .= ' []'
else
let str .= ' [ ' . inner . ' ]'
endif
else
let str = current.value[1:-2]
if dollar_expr
let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let str = substitute(str, '\${nr}', "\n", 'g')
let str = substitute(str, '\\\$', '$', 'g')
endif
endif
let str .= "\n"
return str
endfunction
function! emmet#lang#elm#imageEncode() abort
endfunction
function! emmet#lang#elm#parseTag(tag) abort
return {}
endfunction
function! emmet#lang#elm#toggleComment() abort
endfunction
function! emmet#lang#elm#balanceTag(flag) range abort
endfunction
function! emmet#lang#elm#moveNextPrevItem(flag) abort
return emmet#lang#elm#moveNextPrev(a:flag)
endfunction
function! emmet#lang#elm#moveNextPrev(flag) abort
endfunction
function! emmet#lang#elm#splitJoinTag() abort
endfunction
function! emmet#lang#elm#removeTag() abort
endfunction
function! emmet#lang#elm#mergeLines() abort
endfunction

View File

@@ -56,7 +56,6 @@ function! emmet#lang#haml#toString(settings, current, type, inline, filters, ite
let tmp .= ' ' let tmp .= ' '
endif endif
endif endif
let Val = substitute(Val, '\${cursor}', '', '')
if attribute_style ==# 'hash' if attribute_style ==# 'hash'
let tmp .= ' :' . attr . ' => "' . Val . '"' let tmp .= ' :' . attr . ' => "' . Val . '"'
elseif attribute_style ==# 'html' elseif attribute_style ==# 'html'
@@ -156,7 +155,7 @@ function! emmet#lang#haml#imageSize() abort
call setline('.', substitute(matchstr(line, '^\s*') . haml, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . haml, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#haml#encodeImage() abort function! emmet#lang#haml#imageEncode() abort
endfunction endfunction
function! emmet#lang#haml#parseTag(tag) abort function! emmet#lang#haml#parseTag(tag) abort
@@ -333,3 +332,6 @@ function! emmet#lang#haml#removeTag() abort
exe sn ',' (n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction
function! emmet#lang#haml#mergeLines() abort
endfunction

View File

@@ -1,14 +1,15 @@
let s:mx = '\([+>]\|[<^]\+\)\{-}\s*' let s:bx = '{\%("[^"]*"\|''[^'']*''\|\$#\|\${\w\+}\|\$\+\|{[^{]\+\|[^{}]\)\{-}}'
\ .'\((*\)\{-}\s*' let s:mx = '\([+>]\|[<^]\+\)\{-}'
\ .'\([@#.]\{-}[a-zA-Z_\!][a-zA-Z0-9:_\!\-$]*\|{\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}*[ \t\r\n}]*\|\[[^\]]\+\]\)' \ .'\((*\)\{-}'
\ .'\([@#.]\{-}[a-zA-Z_\!][a-zA-Z0-9:_\!\-$]*\|' . s:bx . '\|\[[^\]]\+\]\)'
\ .'\(' \ .'\('
\ .'\%(' \ .'\%('
\ .'\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)' \ .'\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)'
\ .'\|\%(\[\%("[^"]*"\|[^"\]]*\)\+\]\)' \ .'\|\%(\[\%(\[[^\]]*\]\|"[^"]*"\|[^"\[\]]*\)\+\]\)'
\ .'\|\%(\.{[{}a-zA-Z0-9_\-\$]\+\|\.[a-zA-Z0-9_\-\$]\+\)' \ .'\|\%(\.{[{}a-zA-Z0-9_\-\$\.]\+\|\.[a-zA-Z0-9_\-\$]\+\)'
\ .'\)*' \ .'\)*'
\ .'\)' \ .'\)'
\ .'\%(\({\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}\+\)\)\{0,1}' \ .'\%(\(' . s:bx . '\+\)\)\{0,1}'
\ .'\%(\(@-\{0,1}[0-9]*\)\{0,1}\*\([0-9]\+\)\)\{0,1}' \ .'\%(\(@-\{0,1}[0-9]*\)\{0,1}\*\([0-9]\+\)\)\{0,1}'
\ .'\(\%()\%(\(@-\{0,1}[0-9]*\)\{0,1}\*[0-9]\+\)\{0,1}\)*\)' \ .'\(\%()\%(\(@-\{0,1}[0-9]*\)\{0,1}\*[0-9]\+\)\{0,1}\)*\)'
@@ -22,16 +23,24 @@ function! emmet#lang#html#findTokens(str) abort
endif endif
let pos = stridx(str, tag, pos) + len(tag) let pos = stridx(str, tag, pos) + len(tag)
endwhile endwhile
while 1
let tag = matchstr(str, '{%[^%]\{-}%}', pos)
if len(tag) == 0
break
endif
let pos = stridx(str, tag, pos) + len(tag)
endwhile
let last_pos = pos let last_pos = pos
while len(str) > 0 while len(str) > 0
let white = matchstr(str, '^\s\+', pos)
if white != ''
let last_pos = pos + len(white)
let pos = last_pos
endif
let token = matchstr(str, s:mx, pos) let token = matchstr(str, s:mx, pos)
if token ==# '' if token ==# ''
break break
endif endif
if token =~# '^\s'
let token = matchstr(token, '^\s*\zs.*')
let last_pos = stridx(str, token, pos)
endif
let pos = stridx(str, token, pos) + len(token) let pos = stridx(str, token, pos) + len(token)
endwhile endwhile
let str = a:str[last_pos :-1] let str = a:str[last_pos :-1]
@@ -51,8 +60,31 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
endif endif
if len(type) == 0 | let type = 'html' | endif if len(type) == 0 | let type = 'html' | endif
let settings = emmet#getSettings()
let indent = emmet#getIndentation(type) let indent = emmet#getIndentation(type)
let pmap = {
\'p': 'span',
\'ul': 'li',
\'ol': 'li',
\'table': 'tr',
\'tr': 'td',
\'tbody': 'tr',
\'thead': 'tr',
\'tfoot': 'tr',
\'colgroup': 'col',
\'select': 'option',
\'optgroup': 'option',
\'audio': 'source',
\'video': 'source',
\'object': 'param',
\'map': 'area'
\}
let inlineLevel = split('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var',',')
let custom_expands = emmet#getResource(type, 'custom_expands', {})
if empty(custom_expands) && has_key(settings, 'custom_expands')
let custom_expands = settings['custom_expands']
endif
" try 'foo' to (foo-x) " try 'foo' to (foo-x)
let rabbr = emmet#getExpandos(type, abbr) let rabbr = emmet#getExpandos(type, abbr)
@@ -63,6 +95,7 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
let abbr = rabbr let abbr = rabbr
let root = emmet#newNode() let root = emmet#newNode()
let root['variables'] = {}
let parent = root let parent = root
let last = root let last = root
let pos = [] let pos = []
@@ -78,13 +111,14 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
let basevalue = substitute(match, s:mx, '\6', 'ig') let basevalue = substitute(match, s:mx, '\6', 'ig')
let multiplier = 0 + substitute(match, s:mx, '\7', 'ig') let multiplier = 0 + substitute(match, s:mx, '\7', 'ig')
let block_end = substitute(match, s:mx, '\8', 'ig') let block_end = substitute(match, s:mx, '\8', 'ig')
let custom = ''
let important = 0 let important = 0
if len(str) == 0 if len(str) == 0
break break
endif endif
if tag_name =~# '^#' if tag_name =~# '^#'
let attributes = tag_name . attributes let attributes = tag_name . attributes
let tag_name = 'div' let tag_name = ''
endif endif
if tag_name =~# '[^!]!$' if tag_name =~# '[^!]!$'
let tag_name = tag_name[:-2] let tag_name = tag_name[:-2]
@@ -92,20 +126,48 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
endif endif
if tag_name =~# '^\.' if tag_name =~# '^\.'
let attributes = tag_name . attributes let attributes = tag_name . attributes
let tag_name = 'div' let tag_name = ''
endif endif
if tag_name =~# '^\[.*\]$' if tag_name =~# '^\[.*\]$'
let attributes = tag_name . attributes let attributes = tag_name . attributes
let tag_name = 'div' let tag_name = ''
endif endif
for k in keys(custom_expands)
if tag_name =~ k
let custom = tag_name
let tag_name = ''
break
endif
endfor
if empty(tag_name)
let pname = len(parent.child) > 0 ? parent.child[0].name : ''
if !empty(pname) && has_key(pmap, pname) && custom == ''
let tag_name = pmap[pname]
elseif !empty(pname) && index(inlineLevel, pname) > -1
let tag_name = 'span'
elseif len(custom) == 0
let tag_name = 'div'
elseif len(custom) != 0 && multiplier > 1
let tag_name = 'div'
else
let tag_name = custom
endif
endif
let basedirect = basevalue[1] ==# '-' ? -1 : 1 let basedirect = basevalue[1] ==# '-' ? -1 : 1
let basevalue = 0 + abs(basevalue[1:]) if basevalue != ''
let basevalue = 0 + abs(basevalue[1:])
else
let basevalue = 1
endif
if multiplier <= 0 | let multiplier = 1 | endif if multiplier <= 0 | let multiplier = 1 | endif
" make default node " make default node
let current = emmet#newNode() let current = emmet#newNode()
let current.name = tag_name
let current.name = tag_name
let current.important = important let current.important = important
" aliases " aliases
@@ -128,6 +190,10 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
if use_pipe_for_cursor if use_pipe_for_cursor
let snippet = substitute(snippet, '|', '${cursor}', 'g') let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif endif
" just redirect to expanding
if type == 'html' && snippet !~ '^\s*[{\[<]'
return emmet#lang#html#parseIntoTree(snippet, a:type)
endif
let lines = split(snippet, "\n", 1) let lines = split(snippet, "\n", 1)
call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")') call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let current.snippet = join(lines, "\n") let current.snippet = join(lines, "\n")
@@ -135,14 +201,23 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
endif endif
endif endif
let custom_expands = emmet#getResource(type, 'custom_expands', {})
if empty(custom_expands) && has_key(settings, 'custom_expands')
let custom_expands = settings['custom_expands']
endif
for k in keys(custom_expands) for k in keys(custom_expands)
if tag_name =~# k if tag_name =~# k
let current.snippet = '${' . tag_name . '}' let snippet = '${' . (empty(custom) ? tag_name : custom) . '}'
let current.name = '' let current.name = ''
let current.snippet = snippet
break
elseif custom =~# k
let snippet = '${' . custom . '}'
let current.snippet = '${' . custom . '}'
if current.name != ''
let snode = emmet#newNode()
let snode.snippet = snippet
let snode.parent = current
call add(current.child, snode)
else
let current.snippet = snippet
endif
break break
endif endif
endfor endfor
@@ -190,7 +265,7 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
if len(attributes) if len(attributes)
let attr = attributes let attr = attributes
while len(attr) while len(attr)
let item = matchstr(attr, '\(\%(\%(#[{}a-zA-Z0-9_\-\$]\+\)\|\%(\[\%("[^"]*"\|[^"\]]*\)\+\]\)\|\%(\.[{}a-zA-Z0-9_\-\$]\+\)*\)\)') let item = matchstr(attr, '\(\%(\%(#[{}a-zA-Z0-9_\-\$]\+\)\|\%(\[\%(\[[^\]]*\]\|"[^"]*"\|[^"\[\]]*\)\+\]\)\|\%(\.[{}a-zA-Z0-9_\-\$]\+\)*\)\)')
if g:emmet_debug > 1 if g:emmet_debug > 1
echomsg 'attr=' . item echomsg 'attr=' . item
endif endif
@@ -199,29 +274,34 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
endif endif
if item[0] ==# '#' if item[0] ==# '#'
let current.attr.id = item[1:] let current.attr.id = item[1:]
let root['variables']['id'] = current.attr.id
endif endif
if item[0] ==# '.' if item[0] ==# '.'
let current.attr.class = substitute(item[1:], '\.', ' ', 'g') let current.attr.class = substitute(item[1:], '\.', ' ', 'g')
let root['variables']['class'] = current.attr.class
endif endif
if item[0] ==# '[' if item[0] ==# '['
let atts = item[1:-2] let atts = item[1:-2]
if matchstr(atts, '^\s*\zs[0-9a-zA-Z-:]\+\(="[^"]*"\|=''[^'']*''\|=[^ ''"]\+\)') ==# '' if matchstr(atts, '^\s*\zs[0-9a-zA-Z_\-:]\+\(="[^"]*"\|=''[^'']*''\|=[^ ''"]\+\)') ==# ''
let ks = [] let ks = []
if has_key(default_attributes, current.name) if has_key(default_attributes, current.name)
let dfa = default_attributes[current.name] let dfa = default_attributes[current.name]
let ks = type(dfa) == 3 ? keys(dfa[0]) : keys(dfa) let ks = type(dfa) == 3 ? len(dfa) > 0 ? keys(dfa[0]) : [] : keys(dfa)
endif endif
if len(ks) == 0 && has_key(default_attributes, current.name . ':src') if len(ks) == 0 && has_key(default_attributes, current.name . ':src')
let ks = keys(default_attributes[current.name . ':src']) let dfa = default_attributes[current.name . ':src']
let ks = type(dfa) == 3 ? len(dfa) > 0 ? keys(dfa[0]) : [] : keys(dfa)
endif endif
if len(ks) > 0 if len(ks) > 0
let current.attr[ks[0]] = atts let current.attr[ks[0]] = atts
elseif atts =~# '\.$'
let current.attr[atts[:-2]] = function('emmet#types#true')
else else
let current.attr[atts] = '' let current.attr[atts] = ''
endif endif
else else
while len(atts) while len(atts)
let amat = matchstr(atts, '^\s*\zs\([0-9a-zA-Z-:]\+\%(="[^"]*"\|=''[^'']*''\|=[^ ''"]\+\|[^ ''"\]]*\)\{0,1}\)') let amat = matchstr(atts, '^\s*\zs\([0-9a-zA-Z-:]\+\%(={{.\{-}}}\|="[^"]*"\|=''[^'']*''\|=[^ ''"]\+\|[^ ''"\]]*\)\{0,1}\)')
if len(amat) == 0 if len(amat) == 0
break break
endif endif
@@ -292,6 +372,7 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
if operator =~# '>' if operator =~# '>'
let last.pos += 1 let last.pos += 1
endif endif
let last.block = 1
for n in range(len(block_start)) for n in range(len(block_start))
let pos += [last.pos] let pos += [last.pos]
endfor endfor
@@ -314,7 +395,14 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
let last.pos += 1 let last.pos += 1
endif endif
elseif len(n) elseif len(n)
let cl = last.child let st = 0
for nc in range(len(last.child))
if last.child[nc].block
let st = nc
break
endif
endfor
let cl = last.child[st :]
let cls = [] let cls = []
for c in range(n[1:]) for c in range(n[1:])
for cc in cl for cc in cl
@@ -326,11 +414,18 @@ function! emmet#lang#html#parseIntoTree(abbr, type) abort
endfor endfor
let cls += deepcopy(cl) let cls += deepcopy(cl)
endfor endfor
let last.child = cls if st > 0
let last.child = last.child[:st-1] + cls
else
let last.child = cls
endif
endif endif
endfor endfor
endif endif
let abbr = abbr[stridx(abbr, match) + len(match):] let abbr = abbr[stridx(abbr, match) + len(match):]
if abbr == '/'
let current.empty = 1
endif
if g:emmet_debug > 1 if g:emmet_debug > 1
echomsg 'str='.str echomsg 'str='.str
@@ -372,6 +467,8 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
let q = emmet#getResource(type, 'quote_char', '"') let q = emmet#getResource(type, 'quote_char', '"')
let ct = emmet#getResource(type, 'comment_type', 'both') let ct = emmet#getResource(type, 'comment_type', 'both')
let an = emmet#getResource(type, 'attribute_name', {}) let an = emmet#getResource(type, 'attribute_name', {})
let empty_elements = emmet#getResource(type, 'empty_elements', settings.html.empty_elements)
let empty_element_suffix = emmet#getResource(type, 'empty_element_suffix', settings.html.empty_element_suffix)
if emmet#useFilter(filters, 'haml') if emmet#useFilter(filters, 'haml')
return emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent) return emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent)
@@ -442,17 +539,33 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
if len(Val) > 0 if len(Val) > 0
let Val .= ' ' let Val .= ' '
endif endif
if _val =~# '^\a_' if _val =~# '^_'
let lead = _val[0] if has_key(current.parent.attr, 'class')
let Val .= lead . ' ' . _val let lead = current.parent.attr["class"]
elseif _val =~# '^_' if _val =~# '^__'
if len(lead) == 0 let Val .= lead . _val
let pattr = current.parent.attr else
if has_key(pattr, 'class') let Val .= lead . ' ' . lead . _val
let lead = pattr['class']
endif endif
else
let lead = split(vals[0], '_')[0]
let Val .= lead . _val
endif endif
let Val .= lead . ' ' . lead . _val elseif _val =~# '^-'
for l in split(_val, '_')
if len(Val) > 0
let Val .= ' '
endif
let l = substitute(l, '^-', '__', '')
if len(lead) == 0
let pattr = current.parent.attr
if has_key(pattr, 'class')
let lead = split(pattr['class'], '\s\+')[0]
endif
endif
let Val .= lead . l
let lead .= l . '_'
endfor
else else
let Val .= _val let Val .= _val
endif endif
@@ -461,7 +574,11 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
if has_key(an, attr) if has_key(an, attr)
let attr = an[attr] let attr = an[attr]
endif endif
let str .= ' ' . attr . '=' . q . Val . q if emmet#isExtends(type, 'jsx') && Val =~ '^{.*}$'
let str .= ' ' . attr . '=' . Val
else
let str .= ' ' . attr . '=' . q . Val . q
endif
if emmet#useFilter(filters, 'c') if emmet#useFilter(filters, 'c')
if attr ==# 'id' | let comment .= '#' . Val | endif if attr ==# 'id' | let comment .= '#' . Val | endif
if attr ==# 'class' | let comment .= '.' . Val | endif if attr ==# 'class' | let comment .= '.' . Val | endif
@@ -472,8 +589,10 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
if len(comment) > 0 && ct ==# 'both' if len(comment) > 0 && ct ==# 'both'
let str = '<!-- ' . comment . " -->\n" . str let str = '<!-- ' . comment . " -->\n" . str
endif endif
if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 if current.empty
let str .= settings.html.empty_element_suffix let str .= ' />'
elseif stridx(','.empty_elements.',', ','.current_name.',') != -1
let str .= empty_element_suffix
else else
let str .= '>' let str .= '>'
let text = current.value[1:-2] let text = current.value[1:-2]
@@ -497,7 +616,7 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
if nc > 0 if nc > 0
for n in range(nc) for n in range(nc)
let child = current.child[n] let child = current.child[n]
if child.multiplier > 1 if child.multiplier > 1 || (child.multiplier == 1 && len(child.child) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1) || settings.html.block_all_childless
let str .= "\n" . indent let str .= "\n" . indent
let dr = 1 let dr = 1
elseif len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1 elseif len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1
@@ -516,7 +635,7 @@ function! emmet#lang#html#toString(settings, current, type, inline, filters, ite
let str .= inner let str .= inner
endfor endfor
else else
if settings.html.indent_blockelement && len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1 if settings.html.indent_blockelement && len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1 || settings.html.block_all_childless
let str .= "\n" . indent . '${cursor}' . "\n" let str .= "\n" . indent . '${cursor}' . "\n"
else else
let str .= '${cursor}' let str .= '${cursor}'
@@ -572,7 +691,7 @@ function! emmet#lang#html#imageSize() abort
call emmet#util#setContent(img_region, html) call emmet#util#setContent(img_region, html)
endfunction endfunction
function! emmet#lang#html#encodeImage() abort function! emmet#lang#html#imageEncode() abort
let img_region = emmet#util#searchRegion('<img\s', '>') let img_region = emmet#util#searchRegion('<img\s', '>')
if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region) if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return return
@@ -586,18 +705,17 @@ function! emmet#lang#html#encodeImage() abort
return return
endif endif
let fn = current.attr.src let fn = current.attr.src
if fn !~# '^\(/\|http\)' if fn =~# '^\s*$'
return
elseif fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [width, height] = emmet#util#getImageSize(fn) let encoded = emmet#util#imageEncodeDecode(fn, 0)
if width == -1 && height == -1 let current.attr.src = encoded
return let content = substitute(emmet#toString(current, 'html', 1), '\n', '', '')
endif let content = substitute(content, '\${cursor}', '', '')
let current.attr.width = width call emmet#util#setContent(img_region, content)
let current.attr.height = height
let html = emmet#toString(current, 'html', 1)
call emmet#util#setContent(img_region, html)
endfunction endfunction
function! emmet#lang#html#parseTag(tag) abort function! emmet#lang#html#parseTag(tag) abort
@@ -623,8 +741,8 @@ function! emmet#lang#html#parseTag(tag) abort
endfunction endfunction
function! emmet#lang#html#toggleComment() abort function! emmet#lang#html#toggleComment() abort
let orgpos = emmet#util#getcurpos() let orgpos = getpos('.')
let curpos = emmet#util#getcurpos() let curpos = getpos('.')
let mx = '<\%#[^>]*>' let mx = '<\%#[^>]*>'
while 1 while 1
let block = emmet#util#searchRegion('<!--', '-->') let block = emmet#util#searchRegion('<!--', '-->')
@@ -642,7 +760,7 @@ function! emmet#lang#html#toggleComment() abort
if pos1[0] == 0 && pos1[1] == 0 if pos1[0] == 0 && pos1[1] == 0
return return
endif endif
let curpos = emmet#util#getcurpos() let curpos = getpos('.')
continue continue
endif endif
let pos1 = block[0] let pos1 = block[0]
@@ -651,7 +769,7 @@ function! emmet#lang#html#toggleComment() abort
let tag_name = matchstr(content, '^<\zs/\{0,1}[^ \r\n>]\+') let tag_name = matchstr(content, '^<\zs/\{0,1}[^ \r\n>]\+')
if tag_name[0] ==# '/' if tag_name[0] ==# '/'
call setpos('.', [0, pos1[0], pos1[1], 0]) call setpos('.', [0, pos1[0], pos1[1], 0])
let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^>]*>', '', '</' . tag_name[1:] . '>', 'bnW') let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^/>]*>', '', '</' . tag_name[1:] . '>', 'bnW')
let pos1 = searchpos('>', 'cneW') let pos1 = searchpos('>', 'cneW')
let block = [pos2, pos1] let block = [pos2, pos1]
elseif tag_name =~# '/$' elseif tag_name =~# '/$'
@@ -666,7 +784,7 @@ function! emmet#lang#html#toggleComment() abort
endif endif
else else
call setpos('.', [0, pos2[0], pos2[1], 0]) call setpos('.', [0, pos2[0], pos2[1], 0])
let pos3 = searchpairpos('<'. tag_name . '\>[^>]*>', '', '</' . tag_name . '>', 'nW') let pos3 = searchpairpos('<'. tag_name . '\>[^/>]*>', '', '</' . tag_name . '>', 'nW')
if pos3 == [0, 0] if pos3 == [0, 0]
let block = [pos1, pos2] let block = [pos1, pos2]
else else
@@ -690,11 +808,7 @@ endfunction
function! emmet#lang#html#balanceTag(flag) range abort function! emmet#lang#html#balanceTag(flag) range abort
let vblock = emmet#util#getVisualBlock() let vblock = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 let curpos = emmet#util#getcurpos()
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = emmet#util#getcurpos()
endif
let settings = emmet#getSettings() let settings = emmet#getSettings()
if a:flag > 0 if a:flag > 0
@@ -710,7 +824,7 @@ function! emmet#lang#html#balanceTag(flag) range abort
let pos2 = searchpairpos('<' . tag_name . '[^>]*>', '', '</'. tag_name . '\zs>', 'nW') let pos2 = searchpairpos('<' . tag_name . '[^>]*>', '', '</'. tag_name . '\zs>', 'nW')
endif endif
let block = [pos1, pos2] let block = [pos1, pos2]
if pos1[0] == 0 && pos1[1] == 0 if pos1 == [0, 0]
break break
endif endif
if emmet#util#pointInRegion(last, block) && emmet#util#regionIsValid(block) if emmet#util#pointInRegion(last, block) && emmet#util#regionIsValid(block)
@@ -726,8 +840,8 @@ function! emmet#lang#html#balanceTag(flag) range abort
let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>' let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
while 1 while 1
let pos1 = searchpos(mx, 'W') let pos1 = searchpos(mx, 'W')
if pos1 == curpos[1:2] if pos1 == [0, 0] || pos1 == curpos[1:2]
let pos1 = searchpos(mx . '\zs', 'W') let pos1 = searchpos('>\zs', 'W')
let pos2 = searchpos('.\ze<', 'W') let pos2 = searchpos('.\ze<', 'W')
let block = [pos1, pos2] let block = [pos1, pos2]
if emmet#util#regionIsValid(block) if emmet#util#regionIsValid(block)
@@ -743,7 +857,7 @@ function! emmet#lang#html#balanceTag(flag) range abort
let pos2 = searchpairpos('<' . tag_name . '[^>]*>', '', '</'. tag_name . '\zs>', 'nW') let pos2 = searchpairpos('<' . tag_name . '[^>]*>', '', '</'. tag_name . '\zs>', 'nW')
endif endif
let block = [pos1, pos2] let block = [pos1, pos2]
if pos1[0] == 0 && pos1[1] == 0 if pos1 == [0, 0]
break break
endif endif
if emmet#util#regionIsValid(block) if emmet#util#regionIsValid(block)
@@ -752,11 +866,7 @@ function! emmet#lang#html#balanceTag(flag) range abort
endif endif
endwhile endwhile
endif endif
if a:flag == -2 || a:flag == 2 call setpos('.', curpos)
silent! exe 'normal! gv'
else
call setpos('.', curpos)
endif
endfunction endfunction
function! emmet#lang#html#moveNextPrevItem(flag) abort function! emmet#lang#html#moveNextPrevItem(flag) abort
@@ -766,6 +876,7 @@ function! emmet#lang#html#moveNextPrevItem(flag) abort
if pos != [0,0] if pos != [0,0]
call feedkeys('v?\s\zs'.mx."\<cr>", '') call feedkeys('v?\s\zs'.mx."\<cr>", '')
endif endif
return ''
endfunction endfunction
function! emmet#lang#html#moveNextPrev(flag) abort function! emmet#lang#html#moveNextPrev(flag) abort
@@ -776,82 +887,130 @@ function! emmet#lang#html#moveNextPrev(flag) abort
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
return ''
endfunction endfunction
function! emmet#lang#html#splitJoinTag() abort function! emmet#lang#html#splitJoinTag() abort
let curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
let mx = '<\(/\{0,1}[a-zA-Z][-a-zA-Z0-9:_\-]*\)\%(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\s*\%(/\{0,1}\)>'
while 1 while 1
let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>' let old = getpos('.')[1:2]
let pos1 = searchpos(mx, 'bcnW') let pos1 = searchpos(mx, 'bcnW')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\).*$', '\1', '') let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\).*$', '\1', '')
let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]]
if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block) if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block)
let content = content[:-3] . '></' . tag_name . '>' let content = substitute(content[:-3], '\s*$', '', '') . '></' . tag_name . '>'
call emmet#util#setContent(block, content) call emmet#util#setContent(block, content)
call setpos('.', [0, block[0][0], block[0][1], 0]) call setpos('.', [0, block[0][0], block[0][1], 0])
return return
endif
if tag_name[0] ==# '/'
let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW')
call setpos('.', [0, pos1[0], pos1[1], 0])
let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^/>]*>', '', '</' . tag_name[1:] . '>', 'W')
else else
if tag_name[0] ==# '/' let pos2 = searchpairpos('<'. tag_name . '[^/>]*>', '', '</' . tag_name . '>', 'W')
let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') endif
call setpos('.', [0, pos1[0], pos1[1], 0]) if pos2 == [0, 0]
let pos2 = searchpos('</' . tag_name[1:] . '>', 'cneW') return
else endif
let pos2 = searchpos('</' . tag_name . '>', 'cneW') let pos2 = searchpos('>', 'neW')
endif let block = [pos1, pos2]
let block = [pos1, pos2] if emmet#util#pointInRegion(curpos[1:2], block)
let content = emmet#util#getContent(block) let content = matchstr(content, mx)[:-2] . ' />'
if emmet#util#pointInRegion(curpos[1:2], block) && content[1:] !~# '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' call emmet#util#setContent(block, content)
let content = matchstr(content, mx)[:-2] . '/>' call setpos('.', [0, block[0][0], block[0][1], 0])
call emmet#util#setContent(block, content) return
call setpos('.', [0, block[0][0], block[0][1], 0]) endif
return if block[0][0] > 0
else call setpos('.', [0, block[0][0]-1, block[0][1], 0])
if block[0][0] > 0 else
call setpos('.', [0, block[0][0]-1, block[0][1], 0]) call setpos('.', curpos)
else return
call setpos('.', curpos) endif
return if pos1 == old
endif call setpos('.', curpos)
endif return
endif endif
endwhile endwhile
endfunction endfunction
function! emmet#lang#html#removeTag() abort function! emmet#lang#html#removeTag() abort
let curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
while 1 let mx = '<\(/\{0,1}[a-zA-Z][-a-zA-Z0-9:_\-]*\)\%(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\s*\%(/\{0,1}\)>'
let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*'
let pos1 = searchpos(mx, 'bcnW') let pos1 = searchpos(mx, 'bcnW')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
let tag_name = matchstr(content, '^<\zs/\{0,1}[a-zA-Z0-9:_\-]*') let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\).*$', '\1', '')
let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]]
if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block) if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block)
call emmet#util#setContent(block, '') call emmet#util#setContent(block, '')
call setpos('.', [0, block[0][0], block[0][1], 0]) call setpos('.', [0, block[0][0], block[0][1], 0])
return return
else endif
if tag_name[0] ==# '/' if tag_name[0] ==# '/'
let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW')
call setpos('.', [0, pos1[0], pos1[1], 0]) call setpos('.', [0, pos1[0], pos1[1], 0])
let pos2 = searchpos('</' . tag_name[1:] . '>', 'cneW') let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^/>]*>', '', '</' . tag_name[1:] . '>', 'W')
else else
let pos2 = searchpos('</' . tag_name . '>', 'cneW') let pos2 = searchpairpos('<'. tag_name . '[^/>]*>', '', '</' . tag_name . '>', 'W')
endif endif
let block = [pos1, pos2] if pos2 == [0, 0]
let content = emmet#util#getContent(block) return
if emmet#util#pointInRegion(curpos[1:2], block) && content[1:] !~# '^<' . tag_name . '[^a-zA-Z0-9]' endif
call emmet#util#setContent(block, '') let pos2 = searchpos('>', 'neW')
call setpos('.', [0, block[0][0], block[0][1], 0]) let block = [pos1, pos2]
return if emmet#util#pointInRegion(curpos[1:2], block)
else call emmet#util#setContent(block, '')
if block[0][0] > 0 call setpos('.', [0, block[0][0], block[0][1], 0])
call setpos('.', [0, block[0][0]-1, block[0][1], 0]) return
else endif
call setpos('.', curpos) if block[0][0] > 0
return call setpos('.', [0, block[0][0]-1, block[0][1], 0])
endif else
endif call setpos('.', curpos)
endif endif
endwhile endfunction
function! emmet#lang#html#mergeLines() abort
let curpos = emmet#util#getcurpos()
let settings = emmet#getSettings()
let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
let last = curpos[1:2]
while 1
let pos1 = searchpos(mx, 'bcW')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
echomsg string(content)
let tag_name = matchstr(content, '^<\zs[a-zA-Z0-9:_\-]*\ze')
if stridx(','.settings.html.empty_elements.',', ','.tag_name.',') != -1
let pos2 = searchpos('>', 'nW')
else
let pos2 = searchpairpos('<' . tag_name . '[^>]*>', '', '</'. tag_name . '\zs>', 'nW')
endif
if pos1 == [0, 0] || pos2 == [0, 0]
call setpos('.', curpos)
return
endif
let block = [pos1, pos2]
if emmet#util#pointInRegion(last, block) && emmet#util#regionIsValid(block)
break
endif
if pos1 == last
call setpos('.', curpos)
return
endif
let last = pos1
endwhile
let content = emmet#util#getContent(block)
let mx = '<\(/\{0,1}[a-zA-Z][-a-zA-Z0-9:_\-]*\)\%(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\s*\%(/\{0,1}\)>'
let content = join(map(split(content, mx . '\zs\s*'), 'trim(v:val)'), '')
call emmet#util#setContent(block, content)
if block[0][0] > 0
call setpos('.', [0, block[0][0], block[0][1], 0])
else
call setpos('.', curpos)
endif
endfunction endfunction

View File

@@ -56,7 +56,6 @@ function! emmet#lang#jade#toString(settings, current, type, inline, filters, ite
let tmp .= ' ' let tmp .= ' '
endif endif
endif endif
let Val = substitute(Val, '\${cursor}', '', '')
if attribute_style ==# 'hash' if attribute_style ==# 'hash'
let tmp .= '' . attr . '="' . Val . '"' let tmp .= '' . attr . '="' . Val . '"'
elseif attribute_style ==# 'html' elseif attribute_style ==# 'html'
@@ -153,7 +152,7 @@ function! emmet#lang#jade#imageSize() abort
call setline('.', substitute(matchstr(line, '^\s*') . jade, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . jade, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#jade#encodeImage() abort function! emmet#lang#jade#imageEncode() abort
endfunction endfunction
function! emmet#lang#jade#parseTag(tag) abort function! emmet#lang#jade#parseTag(tag) abort
@@ -330,3 +329,7 @@ function! emmet#lang#jade#removeTag() abort
exe sn ',' (n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction
function! emmet#lang#jade#mergeLines() abort
" nothing to do
endfunction

View File

@@ -14,8 +14,8 @@ function! emmet#lang#less#imageSize() abort
call emmet#lang#css#imageSize() call emmet#lang#css#imageSize()
endfunction endfunction
function! emmet#lang#less#encodeImage() abort function! emmet#lang#less#imageEncode() abort
return emmet#lang#css#encodeImage() return emmet#lang#css#imageEncode()
endfunction endfunction
function! emmet#lang#less#parseTag(tag) abort function! emmet#lang#less#parseTag(tag) abort
@@ -45,3 +45,7 @@ endfunction
function! emmet#lang#less#removeTag() abort function! emmet#lang#less#removeTag() abort
call emmet#lang#css#removeTag() call emmet#lang#css#removeTag()
endfunction endfunction
function! emmet#lang#less#mergeLines() abort
call emmet#lang#css#mergeLines()
endfunction

View File

@@ -3,7 +3,7 @@ function! emmet#lang#sass#findTokens(str) abort
endfunction endfunction
function! emmet#lang#sass#parseIntoTree(abbr, type) abort function! emmet#lang#sass#parseIntoTree(abbr, type) abort
return emmet#lang#html#parseIntoTree(a:abbr, a:type) return emmet#lang#css#parseIntoTree(a:abbr, a:type)
endfunction endfunction
function! emmet#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) abort
@@ -65,7 +65,7 @@ endfunction
function! emmet#lang#sass#imageSize() abort function! emmet#lang#sass#imageSize() abort
endfunction endfunction
function! emmet#lang#sass#encodeImage() abort function! emmet#lang#sass#imageEncode() abort
endfunction endfunction
function! emmet#lang#sass#parseTag(tag) abort function! emmet#lang#sass#parseTag(tag) abort
@@ -158,3 +158,6 @@ endfunction
function! emmet#lang#sass#removeTag() abort function! emmet#lang#sass#removeTag() abort
endfunction endfunction
function! emmet#lang#sass#mergeLines() abort
endfunction

View File

@@ -53,7 +53,7 @@ function! emmet#lang#scss#toString(settings, current, type, inline, filters, ite
endfor endfor
let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let str .= indent . inner . "\n}\n" let str .= indent . inner . "${cursor}\n}\n"
else else
return emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent) return emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
endif endif
@@ -64,8 +64,8 @@ function! emmet#lang#scss#imageSize() abort
call emmet#lang#css#imageSize() call emmet#lang#css#imageSize()
endfunction endfunction
function! emmet#lang#scss#encodeImage() abort function! emmet#lang#scss#imageEncode() abort
return emmet#lang#css#encodeImage() return emmet#lang#css#imageEncode()
endfunction endfunction
function! emmet#lang#scss#parseTag(tag) abort function! emmet#lang#scss#parseTag(tag) abort
@@ -123,3 +123,7 @@ endfunction
function! emmet#lang#scss#removeTag() abort function! emmet#lang#scss#removeTag() abort
call emmet#lang#css#removeTag() call emmet#lang#css#removeTag()
endfunction endfunction
function! emmet#lang#scss#mergeLines() abort
call emmet#lang#css#mergeLines()
endfunction

View File

@@ -114,7 +114,7 @@ function! emmet#lang#slim#imageSize() abort
call setline('.', substitute(matchstr(line, '^\s*') . slim, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . slim, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#slim#encodeImage() abort function! emmet#lang#slim#imageEncode() abort
endfunction endfunction
function! emmet#lang#slim#parseTag(tag) abort function! emmet#lang#slim#parseTag(tag) abort
@@ -279,3 +279,6 @@ function! emmet#lang#slim#removeTag() abort
exe sn ',' (n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction
function! emmet#lang#slim#mergeLines() abort
endfunction

View File

@@ -233,12 +233,12 @@ function! emmet#util#getImageSize(fn) abort
else else
if fn !~# '^\w\+://' if fn !~# '^\w\+://'
let path = fnamemodify(expand('%'), ':p:gs?\\?/?') let path = fnamemodify(expand('%'), ':p:gs?\\?/?')
if has('win32') || has('win64') | if has('win32') || has('win64') |
let path = tolower(path) let path = tolower(path)
endif endif
for k in keys(g:emmet_docroot) for k in keys(g:emmet_docroot)
let root = fnamemodify(k, ':p:gs?\\?/?') let root = fnamemodify(k, ':p:gs?\\?/?')
if has('win32') || has('win64') | if has('win32') || has('win64') |
let root = tolower(root) let root = tolower(root)
endif endif
if stridx(path, root) == 0 if stridx(path, root) == 0
@@ -298,6 +298,67 @@ function! emmet#util#isImageMagickInstalled() abort
return executable('identify') return executable('identify')
endfunction endfunction
function! s:b64encode(bytes, table, pad)
let b64 = []
for i in range(0, len(a:bytes) - 1, 3)
let n = a:bytes[i] * 0x10000
\ + get(a:bytes, i + 1, 0) * 0x100
\ + get(a:bytes, i + 2, 0)
call add(b64, a:table[n / 0x40000])
call add(b64, a:table[n / 0x1000 % 0x40])
call add(b64, a:table[n / 0x40 % 0x40])
call add(b64, a:table[n % 0x40])
endfor
if len(a:bytes) % 3 == 2
let b64[-1] = a:pad
elseif len(a:bytes) % 3 == 1
let b64[-1] = a:pad
let b64[-2] = a:pad
endif
return b64
endfunction
function! emmet#util#imageEncodeDecode(fn, flag) abort
let fn = a:fn
if filereadable(fn)
let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g')
else
if fn !~# '^\w\+://'
let path = fnamemodify(expand('%'), ':p:gs?\\?/?')
if has('win32') || has('win64') |
let path = tolower(path)
endif
for k in keys(g:emmet_docroot)
let root = fnamemodify(k, ':p:gs?\\?/?')
if has('win32') || has('win64') |
let root = tolower(root)
endif
if stridx(path, root) == 0
let v = g:emmet_docroot[k]
let fn = (len(v) == 0 ? k : v) . fn
break
endif
endfor
endif
let hex = substitute(system(g:emmet_curl_command.' "'.fn.'" | xxd -p'), '\n', '', 'g')
endif
let bin = map(split(hex, '..\zs'), 'eval("0x" . v:val)')
let table = split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', '\zs')
let ret = 'data:image/'
if hex =~# '^89504e470d0a1a0a'
let ret .= 'png'
elseif hex =~# '^ffd8'
let ret .= 'jpeg'
elseif hex =~# '^47494638'
let ret .= 'gif'
else
let ret .= 'unknown'
endif
return ret . ';base64,' . join(s:b64encode(bin, table, '='), '')
endfunction
function! emmet#util#unique(arr) abort function! emmet#util#unique(arr) abort
let m = {} let m = {}
let r = [] let r = []

View File

@@ -17,20 +17,22 @@ Introduction |emmet-introduction|
Install |emmet-install| Install |emmet-install|
Tutorial |emmet-tutorial| Tutorial |emmet-tutorial|
1. Expand abbreviation |emmet-expand-abbr| |<C-y>,| 1. Expand abbreviation |emmet-expand-abbr| |<C-y>,|
2. Wrap with abbreviation |emmet-wrap-with-abbreviation| |v_<C-y>,| 2. Expand word |emmet-expand-word| |<C-y>;|
3. Balance tag inward |emmet-balance-tag-inward| |<C-y>d| 3. Update tag |emmet-update-tag| |<C-y>u|
4. Balance tag outward |emmet-balance-tag-outward| |<C-y>D| 4. Wrap with abbreviation |emmet-wrap-with-abbreviation| |v_<C-y>,|
5. Go to next edit point |emmet-goto-next-point| |<C-y>n| 5. Balance tag inward |emmet-balance-tag-inward| |<C-y>d|
6. Go to previous edit point |emmet-goto-previous-point| |<C-y>N| 6. Balance tag outward |emmet-balance-tag-outward| |<C-y>D|
7. Add and update <img> size |emmet-update-image-size| |<C-y>i| 7. Go to next edit point |emmet-goto-next-point| |<C-y>n|
8. Merge lines |emmet-merge-lines| |<C-y>m| 8. Go to previous edit point |emmet-goto-previous-point| |<C-y>N|
9. Remove tag |emmet-remove-tag| |<C-y>k| 9. Add and update <img> size |emmet-update-image-size| |<C-y>i|
10. Split/join tag |emmet-split-join-tag| |<C-y>j| 10. Merge lines |emmet-merge-lines| |<C-y>m|
11. Toggle comment |emmet-toggle-comment| |<C-y>/| 11. Remove tag |emmet-remove-tag| |<C-y>k|
12. Make anchor from URL |emmet-make-anchor-url| |<C-y>a| 12. Split/join tag |emmet-split-join-tag| |<C-y>j|
13. Make quoted text from URL |emmet-quoted-text-url| |<C-y>A| 13. Toggle comment |emmet-toggle-comment| |<C-y>/|
14. Code pretty |emmet-code-pretty| |<C-y>c| 14. Make anchor from URL |emmet-make-anchor-url| |<C-y>a|
15. Lorem ipsum |emmet-lorem-ipsum| 15. Make quoted text from URL |emmet-quoted-text-url| |<C-y>A|
16. Code pretty |emmet-code-pretty| |<C-y>c|
17. Lorem ipsum |emmet-lorem-ipsum|
HTML expression syntax |emmet-html-expression-syntax| HTML expression syntax |emmet-html-expression-syntax|
1. Elements |emmet-html-syntax-elements| 1. Elements |emmet-html-syntax-elements|
2. Nesting operators |emmet-html-syntax-nesting-operators| 2. Nesting operators |emmet-html-syntax-nesting-operators|
@@ -146,7 +148,31 @@ You should copy this section and create new buffer, paste and write as
</p> </p>
</div> </div>
< <
2. Wrap with abbreviation *emmet-wrap-with-abbreviation* *v_<C-y>,* 2. Expand word *emmet-expand-word* *<C-y>;*
When you want to expand word except html tokens like below, use this.
>
<html>foo
<
This will be expanded like:
>
<html><foo></foo>
<
3. Update tag *emmet-update-tag* *<C-y>u*
The beginning of tags '<div>' on below
>
<div>foo</div>
<
Type '<C-y>u' request 'Enter Abbreviation:'. Then type
>
.global
<
This will be expanded like:
>
<div class="global">foo</div>
<
4. Wrap with abbreviation *emmet-wrap-with-abbreviation* *v_<C-y>,*
Write as below. Write as below.
> >
@@ -181,7 +207,7 @@ You should copy this section and create new buffer, paste and write as
< <
See also: |emmet-filter-t|, |emmet-$#| See also: |emmet-filter-t|, |emmet-$#|
3. Balance tag inward *emmet-balance-tag-inward* *<C-y>d* 5. Balance tag inward *emmet-balance-tag-inward* *<C-y>d*
To select inward of '<ul>' tag, type '<C-y>d' in insert mode. To select inward of '<ul>' tag, type '<C-y>d' in insert mode.
> >
@@ -194,7 +220,7 @@ You should copy this section and create new buffer, paste and write as
If cursor is at '*', '<C-y>d' select from begin of '<ul>' to end of '</ul>'. If cursor is at '*', '<C-y>d' select from begin of '<ul>' to end of '</ul>'.
If cursor is at first of '<li>', it select '<li class="list1"></li>'. If cursor is at first of '<li>', it select '<li class="list1"></li>'.
4. Balance tag outward *emmet-balance-tag-outward* *<C-y>D* 6. Balance tag outward *emmet-balance-tag-outward* *<C-y>D*
To select outward of '<ul>' tag type '<C-y>D' in insert mode. To select outward of '<ul>' tag type '<C-y>D' in insert mode.
> >
@@ -208,7 +234,7 @@ You should copy this section and create new buffer, paste and write as
to previous letter of '</ul>'. to previous letter of '</ul>'.
If cursor is at first of '<li>', it select '<li class="list1"></li>'. If cursor is at first of '<li>', it select '<li class="list1"></li>'.
5. Go to next edit point *emmet-goto-next-point* *<C-y>n* 7. Go to next edit point *emmet-goto-next-point* *<C-y>n*
To jump next point that need to edit, type '<C-y>n' in insert mode. To jump next point that need to edit, type '<C-y>n' in insert mode.
> >
@@ -220,7 +246,7 @@ You should copy this section and create new buffer, paste and write as
And type again '<C-y>n' to move a cursor And type again '<C-y>n' to move a cursor
into inner of '<div>' specified id as 'bar'. into inner of '<div>' specified id as 'bar'.
6. Go to previous edit point *emmet-goto-previous-point* *<C-y>N* 8. Go to previous edit point *emmet-goto-previous-point* *<C-y>N*
To jump previous point that need to edit, type '<C-y>N' in insert mode. To jump previous point that need to edit, type '<C-y>N' in insert mode.
> >
@@ -232,7 +258,7 @@ You should copy this section and create new buffer, paste and write as
And type again '<C-y>N' to move a cursor And type again '<C-y>N' to move a cursor
into attribute value of 'foo'. into attribute value of 'foo'.
7. Add and update <img> size *emmet-update-image-size* *<C-y>i* 9. Add and update <img> size *emmet-update-image-size* *<C-y>i*
To add or update 'width' and 'height' attributes of image, To add or update 'width' and 'height' attributes of image,
type '<C-y>i' on '<img>' tag type '<C-y>i' on '<img>' tag
@@ -250,7 +276,7 @@ You should copy this section and create new buffer, paste and write as
Image size retrieved using 'identify' (ImageMagick.org) (if available) Image size retrieved using 'identify' (ImageMagick.org) (if available)
or |xxd|. or |xxd|.
8. Merge lines *emmet-merge-lines* *<C-y>m* 10. Merge lines *emmet-merge-lines* *<C-y>m*
To join multi line text like following, type |J|. To join multi line text like following, type |J|.
> >
@@ -267,7 +293,7 @@ You should copy this section and create new buffer, paste and write as
<li class="list1"></li><li class="list2"></li><li class="list3"></li> <li class="list1"></li><li class="list2"></li><li class="list3"></li>
</ul> </ul>
< <
9. Remove tag *emmet-remove-tag* *<C-y>k* 11. Remove tag *emmet-remove-tag* *<C-y>k*
To remove tag in the block, type '<C-y>k'. To remove tag in the block, type '<C-y>k'.
> >
@@ -283,7 +309,7 @@ You should copy this section and create new buffer, paste and write as
< <
And type '<C-y>k' in there again, then '<div>' will be removed. And type '<C-y>k' in there again, then '<div>' will be removed.
10. Split/join tag *emmet-split-join-tag* *<C-y>j* 12. Split/join tag *emmet-split-join-tag* *<C-y>j*
To join block, type '<C-y>j'. To join block, type '<C-y>j'.
> >
@@ -300,7 +326,7 @@ You should copy this section and create new buffer, paste and write as
<div class="foo"> <div class="foo">
</div> </div>
< <
11. Toggle comment *emmet-toggle-comment* *<C-y>/* 13. Toggle comment *emmet-toggle-comment* *<C-y>/*
Move cursor to block Move cursor to block
> >
@@ -320,7 +346,7 @@ You should copy this section and create new buffer, paste and write as
hello world hello world
</div> </div>
< <
12. Make anchor from URL *emmet-make-anchor-url* *<C-y>a* 14. Make anchor from URL *emmet-make-anchor-url* *<C-y>a*
Move cursor to URL Move cursor to URL
> >
@@ -332,7 +358,7 @@ You should copy this section and create new buffer, paste and write as
< <
Text retrieved using command, specified by |g:emmet_curl_command|. Text retrieved using command, specified by |g:emmet_curl_command|.
13. Make quoted text from URL *emmet-quoted-text-url* *<C-y>A* 15. Make quoted text from URL *emmet-quoted-text-url* *<C-y>A*
Move cursor to URL Move cursor to URL
> >
@@ -348,7 +374,7 @@ You should copy this section and create new buffer, paste and write as
< <
Text retrieved using command, specified by |g:emmet_curl_command|. Text retrieved using command, specified by |g:emmet_curl_command|.
14. Code pretty *emmet-code-pretty* *<C-y>c* 16. Code pretty *emmet-code-pretty* *<C-y>c*
Select code block, for example select following code from 'int main()'. Select code block, for example select following code from 'int main()'.
> >
@@ -366,7 +392,7 @@ You should copy this section and create new buffer, paste and write as
< <
To convert text into html used command |:TOhtml|. To convert text into html used command |:TOhtml|.
15. Lorem ipsum *emmet-lorem-ipsum* 17. Lorem ipsum *emmet-lorem-ipsum*
To insert dummy text (30 words by default). To insert dummy text (30 words by default).
> >
@@ -1238,14 +1264,14 @@ CUSTOMIZE *emmet-customize*
1. Key mapping *emmet-customize-key-mappings* 1. Key mapping *emmet-customize-key-mappings*
To specify leading key for expanding or balance tag, or for all, To specify leading key for expanding or balance tag, or for all,
Add this line in your 'vimrc': > Add this line in your 'vimrc':
> >
let g:user_emmet_leader_key = '<C-y>' let g:user_emmet_leader_key = '<C-y>'
< <
Note that to expand abbreviation a trailing ',' must be typed, so Note that to expand abbreviation a trailing ',' must be typed, so
the resultant keymap is '<C-y>,'. the resultant keymap is '<C-y>,'.
If you prefer to map for each actions separately, use following valuables: If you prefer to map for each action separately, use following variables:
> >
let g:user_emmet_expandabbr_key = '<C-y>,' let g:user_emmet_expandabbr_key = '<C-y>,'
let g:user_emmet_expandword_key = '<C-y>;' let g:user_emmet_expandword_key = '<C-y>;'
@@ -1306,7 +1332,7 @@ CUSTOMIZE *emmet-customize*
3. Define tag's behavior *emmet-define-tags-behavior* 3. Define tag's behavior *emmet-define-tags-behavior*
User can create abbreviations and snippets for each filetypes User can create abbreviations and snippets for each filetype
using |g:user_emmet_settings|. For details, see official site of Emmet. using |g:user_emmet_settings|. For details, see official site of Emmet.
For example, user can add following: For example, user can add following:
> >

BIN
doc/screenshot.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

1
docs Submodule

Submodule docs added at ff5a094cc8

View File

@@ -46,7 +46,7 @@
" Tips: " Tips:
" "
" You can customize behavior of expanding with overriding config. " You can customize behavior of expanding with overriding config.
" This configuration will be marged at loading plugin. " This configuration will be merged at loading plugin.
" "
" let g:user_emmet_settings = { " let g:user_emmet_settings = {
" \ 'indentation' : ' ', " \ 'indentation' : ' ',
@@ -106,13 +106,13 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': 'user_emmet_update_tag', 'key': 'u', 'plug': 'emmet-update-tag', 'func': ':call emmet#updateTag()<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_update_tag', 'key': 'u', 'plug': 'emmet-update-tag', 'func': ':call emmet#updateTag()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': '<esc>:call emmet#balanceTag(1)<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': '<esc>:call emmet#balanceTag(1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': ':call emmet#balanceTag(1)<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': ':call emmet#balanceTag(1)<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': ':call emmet#balanceTag(2)<cr>'}, \ {'mode': 'v', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': '<esc>:call emmet#balanceTag(1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': '<esc>:call emmet#balanceTag(-1)<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': '<esc>:call emmet#balanceTag(-1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': ':call emmet#balanceTag(-1)<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': ':call emmet#balanceTag(-1)<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': ':call emmet#balanceTag(-2)<cr>'}, \ {'mode': 'v', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': '<esc>:call emmet#balanceTag(-1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': '<esc>:call emmet#moveNextPrev(0)<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#moveNextPrev(0)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': ':call emmet#moveNextPrev(0)<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': ':call emmet#moveNextPrev(0)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': '<esc>:call emmet#moveNextPrev(1)<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#moveNextPrev(1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': ':call emmet#moveNextPrev(1)<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': ':call emmet#moveNextPrev(1)<cr>'},
\ {'mode': 'i', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': '<esc>:call emmet#moveNextPrevItem(0)<cr>'}, \ {'mode': 'i', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': '<esc>:call emmet#moveNextPrevItem(0)<cr>'},
\ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': ':call emmet#moveNextPrevItem(0)<cr>'}, \ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': ':call emmet#moveNextPrevItem(0)<cr>'},
@@ -120,6 +120,8 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': ':call emmet#moveNextPrevItem(1)<cr>'}, \ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': ':call emmet#moveNextPrevItem(1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#imageSize()<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#imageSize()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': ':call emmet#imageSize()<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': ':call emmet#imageSize()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_imageencode_key', 'key': 'I', 'plug': 'emmet-image-encode', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#imageEncode()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_imageencode_key', 'key': 'I', 'plug': 'emmet-image-encode', 'func': ':call emmet#imageEncode()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#toggleComment()<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#toggleComment()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': ':call emmet#toggleComment()<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': ':call emmet#toggleComment()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_splitjointag_key', 'key': 'j', 'plug': 'emmet-split-join-tag', 'func': '<esc>:call emmet#splitJoinTag()<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_splitjointag_key', 'key': 'j', 'plug': 'emmet-split-join-tag', 'func': '<esc>:call emmet#splitJoinTag()<cr>'},
@@ -130,7 +132,8 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': 'user_emmet_anchorizeurl_key', 'key': 'a', 'plug': 'emmet-anchorize-url', 'func': ':call emmet#anchorizeURL(0)<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_anchorizeurl_key', 'key': 'a', 'plug': 'emmet-anchorize-url', 'func': ':call emmet#anchorizeURL(0)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_anchorizesummary_key', 'key': 'A', 'plug': 'emmet-anchorize-summary', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#anchorizeURL(1)<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_anchorizesummary_key', 'key': 'A', 'plug': 'emmet-anchorize-summary', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#anchorizeURL(1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_anchorizesummary_key', 'key': 'A', 'plug': 'emmet-anchorize-summary', 'func': ':call emmet#anchorizeURL(1)<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_anchorizesummary_key', 'key': 'A', 'plug': 'emmet-anchorize-summary', 'func': ':call emmet#anchorizeURL(1)<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_mergelines_key', 'key': 'm', 'plug': 'emmet-merge-lines', 'func': ':call emmet#mergeLines()<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_mergelines_key', 'key': 'm', 'plug': 'emmet-merge-lines', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#mergeLines()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_mergelines_key', 'key': 'm', 'plug': 'emmet-merge-lines', 'func': ':call emmet#mergeLines()<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'}, \ {'mode': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'},
\] \]

View File

@@ -1,5 +1,6 @@
" {{{ " {{{
let s:sfile = expand('<sfile>') let s:sfile = expand('<sfile>')
let s:logging = 0
function! s:reload(d) function! s:reload(d)
exe 'so' a:d.'/plugin/emmet.vim' exe 'so' a:d.'/plugin/emmet.vim'
@@ -8,22 +9,32 @@ function! s:reload(d)
endfor endfor
endfunction endfunction
function! s:logn(msg)
echon a:msg
call writefile([a:msg, ''], "test.log", "ab")
endfunction
function! s:log(msg)
echo a:msg
call writefile(split(a:msg, "\n"), "test.log", "ab")
endfunction
function! s:show_type(type) function! s:show_type(type)
echohl Search | echon '[' a:type "]\n" | echohl None echohl Search | call s:log('['.a:type.']') | echohl None
echo "\r" echo "\r"
endfunction endfunction
function! s:show_category(category) function! s:show_category(category)
echohl MatchParen | echon '[' a:category "]\n" | echohl None echohl MatchParen | call s:log('['.a:category.']') | echohl None
echo "\r" echo "\r"
endfunction endfunction
function! s:show_pass(pass) function! s:show_pass(pass)
echohl Title | echo 'pass'.a:pass."\n" | echohl None echohl Title | call s:log('pass '.substitute(a:pass, '\s', '', 'g')) | echohl None
endfunction endfunction
function! s:show_done() function! s:show_done()
echohl IncSearch | echo 'done' | echohl None echohl IncSearch | call s:log('done') | echohl None
endfunction endfunction
function! s:escape(str) function! s:escape(str)
@@ -36,37 +47,39 @@ endfunction
function! s:show_title(no, title) function! s:show_title(no, title)
let title = s:escape(a:title) let title = s:escape(a:title)
let width = &columns - 23 let width = &columns - 23
echohl MoreMsg | echon "\rtesting #".printf('%03d', a:no) echon "\r"
echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... ' echohl MoreMsg | call s:logn('testing #'.printf('%03d', a:no))
echohl None | call s:logn(': '.(len(title) < width ? (title.' '.repeat('.', width-len(title)+1)) : strpart(title, 0, width+2)).'... ')
endfunction endfunction
function! s:show_skip(no, title) function! s:show_skip(no, title)
let title = s:escape(a:title) let title = s:escape(a:title)
let width = &columns - 23 let width = &columns - 23
echohl WarningMsg | echon "\rskipped #".printf('%03d', a:no) echon "\r"
echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... ' echohl WarningMsg | call s:logn('skipped #'.printf('%03d', a:no))
echohl None | call s:logn(': '.(len(title) < width ? (title.' '.repeat('.', width-len(title)+1)) : strpart(title, 0, width+2)).'... ')
echo '' echo ''
endfunction endfunction
function! s:show_ok() function! s:show_ok()
echohl Title | echon "ok\n" | echohl None echohl Title | call s:logn('ok') | echohl None
echo '' echo ''
endfunction endfunction
function! s:show_ng(no, expect, got) function! s:show_ng(no, expect, got)
echohl WarningMsg | echon "ng\n" | echohl None echohl WarningMsg | call s:logn('ng') | echohl None
echohl ErrorMsg | echo 'failed test #'.a:no | echohl None echohl ErrorMsg | call s:log('failed test #'.a:no) | echohl None
set more set more
echohl WarningMsg | echo printf('expect(%d):', len(a:expect)) | echohl None echohl WarningMsg | call s:log(printf('expect(%d):', len(a:expect))) | echohl None
echo join(split(a:expect, "\n", 1), "|\n") echo join(split(a:expect, "\n", 1), "|\n")
echohl WarningMsg | echo printf('got(%d):', len(a:got)) | echohl None echohl WarningMsg | call s:log(printf('got(%d):', len(a:got))) | echohl None
echo join(split(a:got, "\n", 1), "|\n") call s:log(join(split(a:got, "\n", 1), "|\n"))
let cs = split(a:expect, '\zs') let cs = split(a:expect, '\zs')
for c in range(len(cs)) for c in range(len(cs))
if c < len(a:got) if c < len(a:got)
if a:expect[c] != a:got[c] if a:expect[c] != a:got[c]
echohl WarningMsg | echo 'differ at:' | echohl None echohl WarningMsg | call s:log('differ at:') | echohl None
echo a:expect[c :-1] call s:log(a:expect[c :-1])
break break
endif endif
endif endif
@@ -91,6 +104,7 @@ function! s:test(...)
let start = reltime() let start = reltime()
for n in range(len(tests)) for n in range(len(tests))
if len(index) > 0 && n != index | continue | endif if len(index) > 0 && n != index | continue | endif
if has_key(tests[n], 'ignore') && tests[n].ignore | continue | endif
let query = tests[n].query let query = tests[n].query
let options = has_key(tests[n], 'options') ? tests[n].options : {} let options = has_key(tests[n], 'options') ? tests[n].options : {}
let result = tests[n].result let result = tests[n].result
@@ -108,6 +122,7 @@ function! s:test(...)
if stridx(query, '$$$$') != -1 if stridx(query, '$$$$') != -1
silent! 1new silent! 1new
silent! exe 'setlocal ft='.testgroup.type silent! exe 'setlocal ft='.testgroup.type
EmmetInstall
silent! let key = matchstr(query, '.*\$\$\$\$\zs.*\ze\$\$\$\$') silent! let key = matchstr(query, '.*\$\$\$\$\zs.*\ze\$\$\$\$')
if len(key) > 0 if len(key) > 0
exe printf('let key = "%s"', key) exe printf('let key = "%s"', key)
@@ -154,8 +169,9 @@ function! s:test(...)
endfor endfor
endfunction endfunction
function! s:do_tests(...) function! s:do_tests(bang, ...)
try try
let s:logging = a:bang
if exists('g:user_emmet_settings') if exists('g:user_emmet_settings')
let s:old_user_emmet_settings = g:user_emmet_settings let s:old_user_emmet_settings = g:user_emmet_settings
endif endif
@@ -165,13 +181,22 @@ function! s:do_tests(...)
let &more = 0 let &more = 0
call call('s:test', a:000) call call('s:test', a:000)
call s:show_done() call s:show_done()
if a:bang == '!'
qall!
endif
catch catch
echohl ErrorMsg | echomsg v:exception | echohl None echohl ErrorMsg | echomsg v:exception | echohl None
if a:bang == '!'
cquit!
endif
finally finally
let &more=oldmore let &more=oldmore
if exists('s:old_user_emmet_settings') if exists('s:old_user_emmet_settings')
let g:user_emmet_settings = s:old_user_emmet_settings let g:user_emmet_settings = s:old_user_emmet_settings
endif endif
if exists('s:old_user_emmet_install_global')
let g:user_emmet_install_global = s:old_user_emmet_install_global
endif
endtry endtry
endfunction endfunction
@@ -189,7 +214,7 @@ function! s:emmet_unittest_complete(arglead, cmdline, cmdpos)
return [] return []
endfunction endfunction
command! -nargs=* -complete=customlist,<SID>emmet_unittest_complete EmmetUnitTest call s:do_tests(<f-args>) command! -bang -nargs=* -complete=customlist,<SID>emmet_unittest_complete EmmetUnitTest call s:do_tests("<bang>", <f-args>)
if s:sfile == expand('%:p') if s:sfile == expand('%:p')
EmmetUnitTest EmmetUnitTest
endif endif
@@ -297,11 +322,11 @@ finish
}, },
{ {
'query': "blockquote>b>i<<b", 'query': "blockquote>b>i<<b",
'result': "<blockquote><b><i></i></b></blockquote>\n<b></b>\n", 'result': "<blockquote>\n\t<b><i></i></b>\n</blockquote>\n<b></b>\n",
}, },
{ {
'query': "blockquote>b>i^^b", 'query': "blockquote>b>i^^b",
'result': "<blockquote><b><i></i></b></blockquote>\n<b></b>\n", 'result': "<blockquote>\n\t<b><i></i></b>\n</blockquote>\n<b></b>\n",
}, },
{ {
'query': "a[href=foo][class=bar]", 'query': "a[href=foo][class=bar]",
@@ -332,19 +357,19 @@ finish
'result': "<table>\n\t<tr>\n\t\t<td id=\"foo\" class=\"name\"></td>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n</table>\n", 'result': "<table>\n\t<tr>\n\t\t<td id=\"foo\" class=\"name\"></td>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n</table>\n",
}, },
{ {
'query': "div#header + div#footer", 'query': "div#header+div#footer",
'result': "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n", 'result': "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n",
}, },
{ {
'query': "#header + div#footer", 'query': "#header+div#footer",
'result': "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n", 'result': "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n",
}, },
{ {
'query': "#header > ul > li < p{Footer}", 'query': "#header>ul>li<p{Footer}",
'result': "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n", 'result': "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n",
}, },
{ {
'query': "#header > ul > li ^ p{Footer}", 'query': "#header>ul>li^p{Footer}",
'result': "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n", 'result': "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n",
}, },
{ {
@@ -535,6 +560,14 @@ finish
'query': "<small>a$$$$</small>", 'query': "<small>a$$$$</small>",
'result': "<small><a href=\"\"></a></small>", 'result': "<small><a href=\"\"></a></small>",
}, },
{
'query': "form.search-form._wide>input.-query-string+input:s.-btn_large|bem",
'result': "<form class=\"search-form search-form_wide\" action=\"\">\n\t<input class=\"search-form__query-string\" type=\"\">\n\t<input class=\"search-form__btn search-form__btn_large\" type=\"submit\" value=\"\">\n</form>\n",
},
{
'query': "form>fieldset>legend+(label>input[type=\"checkbox\"])*3",
'result': "<form action=\"\">\n\t<fieldset>\n\t\t<legend></legend>\n\t\t<label for=\"\"><input type=\"checkbox\"></label>\n\t\t<label for=\"\"><input type=\"checkbox\"></label>\n\t\t<label for=\"\"><input type=\"checkbox\"></label>\n\t</fieldset>\n</form>\n",
},
], ],
}, },
{ {
@@ -542,12 +575,20 @@ finish
'tests': [ 'tests': [
{ {
'query': "<div>\n\t<span>$$$$\\<c-y>j$$$$</span>\n</div>", 'query': "<div>\n\t<span>$$$$\\<c-y>j$$$$</span>\n</div>",
'result': "<div>\n\t<span/>\n</div>", 'result': "<div>\n\t<span />\n</div>",
}, },
{ {
'query': "<div>\n\t<span$$$$\\<c-y>j$$$$/>\n</div>", 'query': "<div>\n\t<span$$$$\\<c-y>j$$$$/>\n</div>",
'result': "<div>\n\t<span></span>\n</div>", 'result': "<div>\n\t<span></span>\n</div>",
}, },
{
'query': "<div onclick=\"javascript:console.log(Date.now() % 1000 > 500)\">test$$$$\\<c-y>j$$$$/>\n</div>",
'result': "<div onclick=\"javascript:console.log(Date.now() % 1000 > 500)\" />",
},
{
'query': "<div>\n\t<some-tag$$$$\\<c-y>j$$$$/>\n</div>",
'result': "<div>\n\t<some-tag></some-tag>\n</div>",
},
], ],
}, },
{ {
@@ -642,6 +683,15 @@ finish
}, },
], ],
}, },
{
'name': 'base value',
'tests': [
{
'query': "ul>li#id$@0*3",
'result': "<ul>\n\t<li id=\"id0\"></li>\n\t<li id=\"id1\"></li>\n\t<li id=\"id2\"></li>\n</ul>\n",
},
],
},
], ],
'dummy': "}}}"}, 'dummy': "}}}"},
{ 'test-css': '{{{', { 'test-css': '{{{',
@@ -688,7 +738,7 @@ finish
}, },
{ {
'query': "{-bdrs20$$$$}", 'query': "{-bdrs20$$$$}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;}", 'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}",
}, },
{ {
'query': "{lg(top,#fff,#000)$$$$}", 'query': "{lg(top,#fff,#000)$$$$}",
@@ -795,7 +845,7 @@ finish
], ],
}, },
{ {
'name': 'expand abbreviation', 'name': 'split join',
'tests': [ 'tests': [
{ {
'query': "%a foo\n bar$$$$\\<c-y>j$$$$", 'query': "%a foo\n bar$$$$\\<c-y>j$$$$",
@@ -976,7 +1026,7 @@ finish
}, },
{ {
'query': "{-bdrs20$$$$}", 'query': "{-bdrs20$$$$}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;}", 'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}",
}, },
{ {
'query': "{lg(top,#fff,#000)$$$$}", 'query': "{lg(top,#fff,#000)$$$$}",
@@ -1010,5 +1060,67 @@ finish
}, },
], ],
'dummy': "}}}"}, 'dummy': "}}}"},
{ 'test-jade': "{{{",
'type': 'jade',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "!!!$$$$\\<c-y>,$$$$",
'result': "doctype html\n\n",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "span.my-span",
},
],
},
],
'dummy': "}}}"},
{ 'test-pug': "{{{",
'type': 'pug',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "!!!$$$$\\<c-y>,$$$$",
'result': "doctype html\n\n",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "span.my-span",
},
{
'query': "input$$$$\\<c-y>,text$$$$",
'result': "input(type=\"text\")",
},
],
},
],
'dummy': "}}}"},
{ 'test-jsx': "{{{",
'type': 'javascript.jsx',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "img$$$$\\<c-y>,$$$$",
'result': "<img src=\"\" alt=\"\" />",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "<span className=\"my-span\"></span>",
},
{
'query': "function() { return span.my-span$$$$\\<c-y>,$$$$; }",
'result': "function() { return <span className=\"my-span\"></span>; }",
},
],
},
],
'dummy': "}}}"},
] ]
" vim:set et fdm=marker: " vim:set et fdm=marker: