283 Commits
emmet ... wip

Author SHA1 Message Date
mattn
26954b92cd Fixes tests 2014-12-17 17:26:49 +09:00
mattn
47b54c2e5e Fixes against errors/warnings in vint 2014-12-17 17:26:10 +09:00
mattn
edf74342b5 Merge branch 'master' into wip 2014-12-17 16:09:57 +09:00
mattn
cd09765a83 use_selection = 0 in default 2014-12-17 16:09:20 +09:00
mattn
5bfcf0abfd wip 2014-12-17 03:59:40 +09:00
mattn
1c1c511896 Update css abbreviations 2014-12-17 03:31:12 +09:00
mattn
0e08b66e6c Replace all 2014-12-17 03:14:59 +09:00
mattn
62b3accc20 Check maprg too 2014-12-16 19:09:02 +09:00
mattn
9ac3339942 WIP: implement selection 2014-12-16 19:08:49 +09:00
mattn
2a8f0e094d lang/charset should be in variables of configuration 2014-12-11 14:27:46 +09:00
mattn
2b4eea8775 hasmapto should be used to check key-mapping instead of plug-mapping 2014-12-09 18:00:01 +09:00
mattn
76499f48b8 Remove badge 2014-12-08 20:33:45 +09:00
mattn
0d63cc76aa Merge pull request #235 from kashiro/issues234
add link:import for webcomponents #234
2014-11-27 01:48:28 +09:00
mattn
8b703a0a00 Fixes errors on lint. #236 2014-11-06 20:02:36 +09:00
mattn
4b17969f5a Markdown 2014-11-05 19:36:29 +09:00
tomoyuki kashiro
3e668b3523 add link:import for webcomponents #234 2014-11-03 17:43:09 +09:00
mattn
485abffe6c Add test to expand dn to 'display: none' for css 2014-10-09 09:47:40 +09:00
mattn
4d78123db9 Find snippet more fuzzy. Close #212 2014-10-09 09:45:47 +09:00
mattn
920904c53b Version bump up 2014-09-03 09:13:16 +09:00
mattn
a3418eb419 Merge branch 'master' of github.com:mattn/emmet-vim 2014-09-02 18:35:06 +09:00
mattn
070800e31d Support 's' filter. Close #231 2014-09-02 18:33:26 +09:00
mattn
e9b90c7f90 Merge pull request #230 from UncleBill/master
use two dollars to escape $
2014-08-31 14:48:54 +09:00
UncleBill
def1f1aead escape $ 2014-08-29 22:16:14 +08:00
mattn
55c704bc3a fl should be expanded float:left; in css. close #225 2014-08-08 18:49:35 +09:00
mattn
591bfc99dc Fix tests 2014-08-06 16:07:42 +09:00
mattn
d51cb7141f Merge pull request #223 from sheoak/master
Sass not working properly with sass extension
2014-08-06 15:59:27 +09:00
mattn
c0175decd3 Fix attribute parse 2014-08-06 15:57:59 +09:00
mattn
bd5f03bb24 Fix #224 2014-08-06 15:42:04 +09:00
sheoak
105bea22b8 Merge branch 'master' of https://github.com/mattn/emmet-vim 2014-08-04 15:07:09 +02:00
sheoak
f1a34ccaa3 Fixes issue #211 - sass not working properly because expecting braces instead of tabs 2014-08-04 15:05:40 +02:00
mattn
39d8f88ccd Remove debug code 2014-08-04 12:21:02 +09:00
mattn
bd6060ba91 Workaround for sass, fixes #222 2014-08-04 11:46:54 +09:00
mattn
a61cb0c138 Merge pull request #221 from mvz/fix-vundle-instructions
Fix Vundle instructions
2014-07-24 20:17:26 +09:00
Matijs van Zuijlen
92fa2e568f Fix Vundle instructions
- Fix syntax to work in .vimrc
- The Bundle command is being renamed to Plugin (although Bundle still
  works for now)
2014-07-24 08:13:18 +02:00
mattn
2b94508a46 div[foo bar] should be expanded into <div foo="" bar=""></div>. close #218 2014-07-18 20:29:28 +09:00
mattn
dcf247fb5c Fix test 2014-07-18 20:15:22 +09:00
mattn
3874d6210d Merge branch 'master' of github.com:mattn/emmet-vim 2014-07-18 20:14:55 +09:00
mattn
23aea8c21a Revert 08eb534c42, because test is failing 2014-07-18 20:14:08 +09:00
mattn
00536daaf6 Merge pull request #217 from conraddecker/master
Changed 'parenthesis' setting to 'attribute_style' setting
2014-07-18 17:27:31 +09:00
mattn
0f45689b81 Set attributes. fix #218 2014-07-18 13:13:54 +09:00
mattn
beeb159626 Merge pull request #219 from typoon/master
Small fix related to VIM Tip #436
2014-07-18 12:59:16 +09:00
gilgamesh
08eb534c42 Small fix related to VIM Tip #436
http://vim.wikia.com/wiki/Recover_from_accidental_Ctrl-U

Suppose you do the following:

div.foo.bar.baz<c-y>,

This will be expanded to <div clas="foo bar baz"></div>

Then you realize that you wanted yyy instead of baz. You press ESC and
u and notice that you don't have your original string in the undo log
(div.foo.bar.baz).

This patch fixes this behaviour.
2014-07-17 16:47:41 -03:00
Conrad Decker
437cd92004 Changed 'parenthesis' setting to 'attribute_style' setting to allow for choice between 'hash' and 'html'
Updated output to correctly display html-style attributes or hash-style attributes. 'attribute_style' setting defaults to hash but can be updated by the user to use html style attributes
2014-07-17 09:40:35 -04:00
mattn
761adcc4be Fix typo 2014-07-17 09:35:04 +09:00
mattn
ca6296fb7f parenthesis for haml #216 2014-07-17 09:23:28 +09:00
mattn
96903b0913 Merge pull request #215 from shaabhishek/master
Added meta viewport tag
2014-06-28 23:47:44 +09:00
abhishek
949b8c26b7 Added meta viewport tag 2014-06-28 15:36:26 +09:00
mattn
320bb97cb4 Merge pull request #213 from sevko/master
Document g:user_emmet_leader_key's trailing ','.
2014-06-25 13:56:16 +09:00
Severyn Kozak
23bb8c0175 Document g:user_emmet_leader_key's trailing ','.
README.mkd, doc/emmet.txt
	-Add some text to clarify that any keymap specified with
	`g:user_emmet_leader_key` must be followed by a `,`.
2014-06-25 00:23:20 -04:00
mattn
39a5ba0eca Add test for #210 2014-06-06 13:50:23 +09:00
mattn
ef3f51ba44 Parse as css 2014-06-06 13:50:23 +09:00
mattn
da9283aa5c Don't handle @i for @i {} 2014-06-06 13:50:22 +09:00
mattn
7ac6a8acb8 Fix tests 2014-06-06 13:50:21 +09:00
mattn
ef27d24df0 Fix #210 2014-06-06 13:50:21 +09:00
mattn
c49d4567dc Fix default attributes 2014-06-06 13:50:20 +09:00
mattn
7711bf1f15 Merge pull request #209 from deepflame/master
change shortcut description
2014-05-26 10:36:03 +09:00
Andreas Böhrnsen
fe38681354 maybe this is better 2014-05-26 00:31:05 +08:00
Andreas Böhrnsen
5d73777a65 small update to docs to make shortcut clearer 2014-05-26 00:28:12 +08:00
mattn
3ccd466123 Fix #207 2014-05-19 15:13:34 +09:00
mattn
018a97523a Merge pull request #205 from richardscollin/patch-1
Typo in doc
2014-05-14 11:59:47 +09:00
Collin Richards
b3c346c54d Typo in doc
Changed two closing li tags to div tags.
2014-05-13 22:53:28 -04:00
mattn
fbd353387b Add c# for expanding color: ; 2014-05-07 10:09:37 +09:00
mattn
e185c13171 s/7/8/ 2014-05-07 10:05:47 +09:00
mattn
e18077e991 Fixed #203 2014-05-01 13:41:40 +09:00
mattn
ff1aaf88a9 Fixes behavior of removeTag 2014-04-14 09:38:12 +09:00
mattn
2b6f37f470 Fix balance tag 2014-04-14 09:20:02 +09:00
mattn
74055488de Try more candidates. 2014-04-13 01:12:12 +09:00
mattn
6adab8a234 Use indent getting from configuration, Fix #201 2014-04-03 01:36:28 +09:00
mattn
19961fc270 Fix #199 2014-03-28 22:13:51 +09:00
mattn
ed36e194e5 Wrap what you see when leader contains {$#} 2014-03-28 22:00:01 +09:00
mattn
5916ad27fa update doc 2014-03-27 09:25:00 +09:00
mattn
b00cf4d33f Update doc 2014-03-27 09:06:15 +09:00
mattn
0511be8ac5 Merge pull request #198 from ctruett/master
Edited line 110 of autoload/emmet.vim to fix intelligent expansion. It w...
2014-03-26 10:58:50 +09:00
Christopher Truett
e8169335a5 Edited line 103 of autoload/emmet.vim to fix intelligent expansion. It was trying to call a non-existant command. 2014-03-25 20:03:32 -04:00
mattn
6577e0e687 Guard attributes 2014-03-16 00:05:57 +09:00
mattn
2f0bd7d02e Add test for #195 2014-03-15 22:50:29 +09:00
mattn
56634e7f80 Fixes #195 2014-03-15 22:47:52 +09:00
mattn
ef3b75e877 comment_type 2014-03-14 13:51:27 +09:00
mattn
43e940a660 Fix doc 2014-03-12 17:41:54 +09:00
mattn
7005655302 Fix typo 2014-03-12 17:08:06 +09:00
mattn
d894c67aa9 remove \<right> 2014-03-11 21:41:17 +09:00
mattn
7268e203b8 upper case 2014-03-11 21:07:53 +09:00
mattn
cd23a38f2b <!DOCTYPE> should be contains last \n 2014-03-11 21:07:07 +09:00
mattn
9480824c0f Find snippet recursibly 2014-03-11 17:18:17 +09:00
mattn
464291244a Remove debug message 2014-03-11 17:17:29 +09:00
mattn
c087cff8ff Add test for update tag 2014-03-11 17:16:58 +09:00
mattn
6d2c6a1de4 Add test for RGBa syntax 2014-03-11 17:07:22 +09:00
mattn
fef441fa71 New emmet feature: RGBa syntax 2014-03-11 17:01:31 +09:00
mattn
cd808a5fe5 New emmet feature: update tag 2014-03-11 16:39:35 +09:00
mattn
9b80875e07 bump up version 2014-03-10 11:19:02 +09:00
mattn
52545221f6 Save/restore cursor position for removing $cursor$. related issue #162 2014-03-10 11:13:39 +09:00
mattn
72610878e4 Use dash 2014-03-06 09:09:57 +09:00
mattn
7f0521f094 Use dash 2014-03-06 09:08:50 +09:00
mattn
fb11bd8b28 Add test 2014-02-13 17:21:38 +09:00
mattn
7aa1ff965a script[jquery.js] 2014-02-13 17:20:46 +09:00
mattn
49cb1c2884 Fix default attributes 2014-02-13 17:15:59 +09:00
mattn
19395caea7 Fix default attribute 2014-02-13 17:01:59 +09:00
mattn
ba56b91719 unlet Val 2014-02-13 16:48:27 +09:00
mattn
dc8b589cd0 Take two arguments for lg(xx,xx) 2014-02-13 16:46:08 +09:00
mattn
2f1e60f4fe Add default attributes(emmet v1.1beta) 2014-02-13 16:32:20 +09:00
mattn
381dd35018 Improve cursor position after expanding for sass 2014-02-12 20:53:22 +09:00
mattn
d9481c235b Fix sass indentation 2014-02-12 20:47:26 +09:00
mattn
6cd20746ad Fixes indentation bug. Closes #189 2014-02-12 20:25:03 +09:00
mattn
554e0c02f5 Look Content-Type for ^YA. closes #188 2014-02-05 18:41:20 +09:00
mattn
afb2086306 Merge pull request #181 from josephjaber/patch-1
Fix Vundle installation link in README.md
2013-12-19 15:45:13 -08:00
Joseph Jaber
8989b0a49c Fix Vundle installation link in README.md
Fix markdown in Vundle installation section that caused the link to be formatted incorrectly.
2013-12-19 11:47:16 -05:00
mattn
ddbbe81d09 Update README, related issue #148 2013-12-13 20:25:26 +09:00
mattn
2e365c9573 Fixes #139 2013-12-13 20:22:59 +09:00
mattn
576679e023 Merge pull request #179 from qp123asd/master
Add less support,and fix scss typo.
2013-12-12 15:56:49 -08:00
weirongxu
936d5c6c2f Add less support,and fix scss typo. 2013-12-13 02:29:52 +08:00
mattn
df3e61ba69 Fixes #178 2013-12-06 20:31:43 +09:00
mattn
934feeb55f Add bem filter: http://docs.emmet.io/filters/bem/ 2013-12-06 17:06:14 +09:00
mattn
fee5b34b5f ... 2013-11-29 21:07:53 +09:00
mattn
262777309f Customizable quote char 2013-11-29 20:13:26 +09:00
mattn
d2d6a9f385 Merge pull request #166 from zytron/filetype_detection
Changed emmet#getFileType() to do basetype checking on &ft parts
2013-11-29 01:17:22 -08:00
mattn
8aeb24fa77 Fix name of function 2013-11-28 09:44:15 +09:00
mattn
2ecc25f727 Fixes #173 2013-11-28 09:39:26 +09:00
mattn
47f27f8c3d Fixies #172 2013-11-26 16:22:37 +09:00
mattn
e990cebbae Workaround 2013-11-26 12:49:45 +09:00
mattn
48373cbf0a Ooooos 2013-11-26 12:37:47 +09:00
mattn
d6ab310cc9 Fixes rendering type 2013-11-26 09:58:41 +09:00
mattn
fb096ac4d4 Support boolean attributes, related issue #170 2013-11-25 01:36:12 +09:00
mattn
8c1e42340d Closes popup if displayed 2013-11-22 14:50:56 +09:00
mattn
f3e6cc72a3 version bump up 2013-11-21 15:05:08 +09:00
mattn
5a37a6ef26 Closes popup 2013-11-21 12:46:11 +09:00
Bill Hau
59239b05bb Changed emmet#getFileType() to do basetype checking on &ft parts instead of empty type var 2013-11-15 20:15:41 +09:00
mattn
135fb40b27 Merge pull request #169 from minimul/readme-pathogen-update
Pathogen defacto standard is to use 'git clone'. Moreover, the 'unzip /p...
2013-11-14 15:58:52 -08:00
Christian
55eb236bd8 Revert back to https:// url type as this is Github's recommended type. See http://stackoverflow.com/questions/11041729/why-does-github-recommend-https-over-ssh 2013-11-14 15:31:16 -05:00
Christian
e058f514a5 Pathogen defacto standard is to use 'git clone'. Moreover, the 'unzip /path/to/emmet-vim.zip' command does not work because a parent directory (e.g. emmit-vim) needs to be created within the ~/.vim/bundle dir for vim to pickup the plugin correctly. Lastly, use the SSH url as it is the cloning default standard. 2013-11-13 16:59:58 -05:00
mattn
55c0875505 Merge pull request #167 from mattkatz/patch-1
Adding instructions for using Vundle
2013-11-06 19:22:14 -08:00
mattkatz
d60db48777 Adding instructions for using Vundle
Vundle is like pathogen but just an eeeensy bit better.
2013-11-06 19:17:00 -05:00
mattn
b8569d50f4 map keys for the buffer. related issue #163 2013-11-01 18:06:30 +09:00
Bill Hau
b5ea573744 Changed emmet#getFileType() to do basetype checking on &ft parts instead of empty type var 2013-10-31 13:52:52 +00:00
mattn
313a58d55c Remove all quotes. related issue #155 2013-10-31 08:42:29 +09:00
mattn
3c5eb601fb Add !!! 2013-10-29 22:41:33 +09:00
mattn
f82d715caa Possible to specify !!! 2013-10-29 22:18:15 +09:00
mattn
ac79b721c5 Add 'c' for comment 2013-10-29 22:09:06 +09:00
mattn
a765fe7b82 imageSize for css. related issue #155 2013-10-25 22:57:42 +09:00
mattn
036b37fb64 Added test for #164 2013-10-22 13:24:50 +09:00
mattn
c9b8c2edcb Fixes item number in group. Closes #164 2013-10-22 13:21:32 +09:00
mattn
57de05e041 Update README 2013-10-22 12:02:00 +09:00
mattn
ea1b779868 s/ExpandWord/expandWord/g
s/CompleteTag/completeTag/g
Ready for next/prev item
2013-10-22 12:00:04 +09:00
mattn
ed7ab5fd49 user_emmet_install_global to off to install as global 2013-10-22 11:59:42 +09:00
mattn
c588b72fc1 Merge pull request #160 from eugene-p/master
lorem did not pick up count always defaulting to 30
2013-10-17 17:26:45 -07:00
Yauheni(Eugene) Patsiomkin
c78a2ff435 lorem did not pick up count always defaulting to 30 2013-10-17 15:41:42 -06:00
mattn
6baf3c1210 Expand | just for snippets 2013-10-15 10:21:24 +09:00
mattn
c1691caa6a Fixes tests 2013-10-15 10:21:05 +09:00
mattn
4c371b5fa6 Added emmet#expandAbbrIntelligent() to you to do:
imap <expr> <tab> emmet#expandAbbrIntelligent("\<tab>")
2013-10-15 09:26:25 +09:00
mattn
32a1dac905 Added emmet#isExapandable(). related issue #156 2013-10-15 09:13:07 +09:00
mattn
ef2cd77d40 Fixes parsing brackets. closes #157 2013-10-14 22:11:34 +09:00
mattn
0f2a0ed1e8 Fixes test 2013-10-14 22:11:26 +09:00
mattn
89dd2b7e71 Badge 2013-10-02 11:28:08 +09:00
mattn
6a06f58a5e Remove annoying type="text/css" from link:css and link:print snippet. Closes #152 2013-10-01 09:31:40 +09:00
mattn
445ca239ad Remove debug comment 2013-09-26 09:59:47 +09:00
mattn
bd4c1bfaef Expand paren when type is css 2013-09-26 09:57:06 +09:00
mattn
f8095a65dd Expand paren 2013-09-25 22:56:34 +09:00
mattn
9c17334509 Get image paths that is relative location from the current buffer. Related issue #150 2013-09-19 02:03:00 +09:00
mattn
9475526c1f Possible to disable definition of :Emmet command. Closes #147 2013-09-10 19:42:21 +09:00
mattn
5d90a2c83d Restore cursor position on insert-mode 2013-09-09 21:19:38 +09:00
mattn
a5313498d7 No need to capture submatches 2013-09-02 16:32:15 +09:00
mattn
8f1775cf02 <html lang="ja></html> can't toggle comment 2013-08-27 19:34:08 +09:00
mattn
44af2e417d Fixes toggle comment. <meta charset="utf-8"> make it hang 2013-08-27 12:41:59 +09:00
mattn
fcf0f567be Use i_CTRL-R= instead of <esc>a 2013-08-25 23:53:36 +09:00
mattn
ebba5bf1e2 Fuzzy search 2013-08-25 01:30:21 +09:00
mattn
e8e9877cfc Fixes tests 2013-08-22 20:32:01 +09:00
mattn
9d7a3d4a44 Add new option g:emmet_docroot to specify map of document root.
let emmet_docroot = {
\  'c:/dev/vim-jp.github.com/': 'http://vim-jp.org/',
\  'c:/dev/mattn/': 'http://mattn.kaoriya.net/',
\}

When getting image size of '/path/to/file.jpg' and current html file is
'c:/dev/mattn/foo/bar/index.html', the image file will be treated as:

  http://mattn.kaoriya.net/path/to/file.jpg
2013-08-22 20:12:49 +09:00
mattn
13994cc066 html5ish 2013-08-22 19:55:53 +09:00
mattn
afd55ad70c Check foldclosed 2013-08-22 19:44:51 +09:00
mattn
056b49c2bd Fixes basedirect/basevalue ex: ul>li.item$@-*5 Should be count down from 5 to 1. 2013-08-20 09:44:29 +09:00
mattn
f2fc51391c Updated docs 2013-08-19 11:07:19 +09:00
mattn
b2561af319 Possible to specify base value. Related issue #144 2013-08-19 11:07:19 +09:00
mattn
6016cf6bdd Merge pull request #141 from drakmail/patch-1
Add basic github-flavored markdown syntax highlighting to README.mkd
2013-08-14 10:47:04 -07:00
mattn
61360ddfdc Add fuzzy search for css. Fixes #142 2013-08-14 13:04:59 +09:00
Alexander
4ab27087f9 Backticks for code blocks 2013-08-13 17:29:29 +04:00
Alexander
6ad2017568 Add basic github-flavored markdown syntax highlighting to README.mkd 2013-08-13 17:19:22 +04:00
mattn
49d2c8280f version bump up 2013-08-13 21:29:01 +09:00
mattn
58c9a51322 Add note for <plug> mapping 2013-08-13 21:18:31 +09:00
mattn
f7a8cce3d5 Unity <plug> mapping names 2013-08-13 21:18:16 +09:00
mattn
a726fe44c8 Merge pull request #137 from DeaR/fix-duplicate-key
Fix duplicate key.
2013-08-13 04:44:44 -07:00
mattn
286869545f Shouldn't be a leading spaces 2013-08-13 20:42:25 +09:00
mattn
5dc6c1a001 Include feature of #129 2013-08-13 20:42:01 +09:00
mattn
57a2ca0e2f Add test for sass indentation bug 2013-08-13 20:21:37 +09:00
mattn
888fdb6699 Fixes sass indentation 2013-08-13 20:16:23 +09:00
mattn
9be8926559 Fixes wrong tests for sass 2013-08-13 18:59:31 +09:00
mattn
8f088c9f73 Add emmet#getFilter() 2013-08-13 18:59:13 +09:00
mattn
c257e09d69 Fixes extends of filter. sass filter doesn't extend css's one 2013-08-13 18:44:42 +09:00
mattn
f18cb41f93 Merge branch 'master' of github.com:mattn/emmet-vim 2013-08-12 22:39:15 +09:00
mattn
40c4b1e0b8 Fixes test 2013-08-12 22:38:45 +09:00
mattn
f1cbe2545f identity can treat URL 2013-08-12 22:38:05 +09:00
mattn
018cab0adc Merge pull request #139 from mikewadsten/master
Fix numbering on nested multiplication
2013-08-12 06:28:53 -07:00
Mike Wadsten
2a5684bac4 Fix numbering on nested multiplication
If an element is being multiplied, its number should reflect the repeating of that element, not the group it belongs in.

----
Example case:

Input: .outer$*3>.inner$*2

Expected output:
<div class="outer1">
  <!-- two DIVs: .inner1, .inner2 -->
</div>
<div class="outer2">
  <!-- two DIVs: .inner1, .inner2 -->
</div>
<div class="outer3">
  <!-- two DIVs: .inner1, .inner2 -->
</div>

Observed output:
<div class="outer1">
  <!-- two DIVs: .inner1, .inner2 -->
</div>
<div class="outer2">
  <!-- two DIVs: .inner2, .inner2 -->
</div>
<div class="outer3">
  <!-- two DIVs: .inner3, .inner3 -->
</div>
2013-08-12 22:28:29 +09:00
mattn
cb869edec4 Add test for #140 2013-08-12 22:27:13 +09:00
mattn
222c509447 Fixes #140 2013-08-12 22:18:11 +09:00
Mike Wadsten
cca5dedd69 Fix numbering on nested multiplication
If an element is being multiplied, its number should reflect the repeating of that element, not the group it belongs in.

----
Example case:

Input: .outer$*3>.inner$*2

Expected output:
<div class="outer1">
  <!-- two DIVs: .inner1, .inner2 -->
</div>
<div class="outer2">
  <!-- two DIVs: .inner1, .inner2 -->
</div>
<div class="outer3">
  <!-- two DIVs: .inner1, .inner2 -->
</div>

Observed output:
<div class="outer1">
  <!-- two DIVs: .inner1, .inner2 -->
</div>
<div class="outer2">
  <!-- two DIVs: .inner2, .inner2 -->
</div>
<div class="outer3">
  <!-- two DIVs: .inner3, .inner3 -->
</div>
2013-08-09 22:45:42 -05:00
mattn
9791571ff4 Remove default html indentation 2013-08-09 13:06:48 +09:00
DeaR
b9bd4738dc Fix duplicate key. 2013-08-08 18:04:25 +09:00
mattn
6d924eb310 Remove div element for snippets 2013-08-08 12:31:51 +09:00
mattn
e1fecdc77b version bump up 2013-08-08 12:31:46 +09:00
mattn
db7c3bebc8 Merge pull request #135 from joedicastro/master
Fixes #133
2013-08-07 18:32:10 -07:00
joe di castro
7fb711c257 Fixes #133 2013-08-07 18:57:19 +02:00
mattn
455f6f5760 Fixes #131 #134 2013-08-08 00:47:56 +09:00
mattn
fd7c37d618 rename 2013-08-06 20:00:30 +09:00
mattn
43d5656dca Rename to Emmet.vim! 2013-08-06 19:49:59 +09:00
mattn
5d54856b49 Keep 0, no adding px unit when expanding b0 2013-06-28 09:55:15 +09:00
mattn
0b37e09e5e Fix typo 2013-06-17 16:32:05 +09:00
mattn
53e8b80dfd Fixes links to blogs. Closes #125 2013-06-14 15:12:53 +09:00
mattn
32bb75081c Add doc for lorem+ipsum 2013-06-10 21:18:18 +09:00
mattn
a98478d7dc Add test for #124 2013-06-10 21:08:14 +09:00
mattn
e7460ef2ec Should be all ${cursor} in the tokens for m0+bgi+p0. The value is not decided with token, value should be empty. 2013-06-10 21:01:53 +09:00
mattn
daaa9450a6 bg++bg+ 2013-06-10 20:42:00 +09:00
mattn
4221cd94ed Version guard 2013-06-10 20:24:29 +09:00
mattn
8cc33aedf4 Add tests for sass 2013-06-10 19:37:17 +09:00
mattn
32c9eaf0c6 Don't use workaround. remove last ; correctly. Fixes #124 2013-06-10 19:36:17 +09:00
mattn
917a9d4bb3 Should be non-space in default 2013-06-10 19:35:27 +09:00
mattn
ae7d014738 Add last comma 2013-06-10 19:34:36 +09:00
mattn
6619d5078e lorem for japanese 2013-06-06 18:24:15 +09:00
mattn
8e515a11c2 Add custom_expand 2013-06-06 17:32:10 +09:00
mattn
30d304ff1f Add user-defined dollar expression (Merged tang3w's awesome commits) 2013-06-06 12:17:42 +09:00
mattn
ca95069268 Fix typo 2013-06-03 22:29:26 +09:00
mattn
857ecdb813 Fix typo 2013-06-03 22:27:41 +09:00
mattn
aabea8343f Oops 2013-06-03 12:13:25 +09:00
mattn
64b64e6bf8 Lorem Ipsum 2013-06-03 12:06:12 +09:00
mattn
dd16ce3b0b Merge pull request #123 from shlomif/master
Grammar corrections.
2013-05-15 17:00:13 -07:00
Shlomi Fish
1d6a0917dc Correct grammar in the tutorial. 2013-05-15 19:03:50 +03:00
mattn
6dfd49a31f Merge pull request #122 from shlomif/master
Remove trailing space + Grammar Corrections.
2013-05-15 06:30:54 -07:00
Shlomi Fish
f128d1013b [README] Correct some grammar problems. 2013-05-15 16:25:19 +03:00
Shlomi Fish
3b8f3ac778 Remove trailing space. 2013-05-15 16:18:25 +03:00
mattn
b162859ca8 Fix indentation 2013-05-08 10:17:22 +09:00
mattn
62c6622153 Fix attributes missing 2013-05-08 10:17:12 +09:00
mattn
4757aae967 Use meta charset. This may occur some problem. For example charset=Windows-31J won't work correctly. 2013-05-08 09:28:33 +09:00
mattn
6a68c46d88 Fix lost attributes. Close #121 2013-05-08 09:27:37 +09:00
mattn
8499af4c47 Fixed typo 2013-04-24 21:30:35 +09:00
mattn
03c6771311 Merge pull request #120 from crazymaster/master
Fixed typo.
2013-04-24 05:24:58 -07:00
crazymaster
dad1eb19c3 Fixed typo. 2013-04-24 21:20:33 +09:00
mattn
9239eed295 Add test for #98 2013-04-24 20:44:06 +09:00
mattn
6fd2031fa2 Fixed #98 pass to indent to html#toString() 2013-04-24 20:43:15 +09:00
mattn
7c1f881014 Remove blank line 2013-04-23 09:49:52 +09:00
mattn
fb7829ca4b Add test for #118 2013-04-23 09:49:03 +09:00
mattn
bc262ed52b Use group_itemno or itemno that greating. close #118 2013-04-23 09:46:04 +09:00
mattn
25aeb9d1c3 Add test 2013-04-19 13:24:05 +09:00
mattn
1f041e7dd3 Unique attribute names. close #119 2013-04-19 13:22:06 +09:00
mattn
6d07bd9752 Separate rendering type and filetype 2013-04-09 19:18:41 +09:00
mattn
857809e676 Fix guessing filetype 2013-04-09 18:55:21 +09:00
mattn
2aba8dde8b Fix balance tag. close #107 2013-04-09 18:45:18 +09:00
mattn
286788ae88 Add tests 2013-04-09 18:19:03 +09:00
mattn
dc199ba273 Fix $# expands 2013-04-09 18:14:39 +09:00
mattn
f5bb76ba39 Expands $# as content. close #116 2013-04-09 18:05:28 +09:00
mattn
4825e6b6c9 Fix order of attributes. close #117 2013-04-09 10:39:31 +09:00
mattn
f08061ec20 Fix imageSize 2013-04-06 22:58:20 +09:00
mattn
bc5903d69c Fix attrs_order 2013-04-06 22:41:08 +09:00
mattn
f1daca4fa5 Fix parse image size 2013-04-06 22:40:19 +09:00
mattn
7f674cd356 Fix tests 2013-04-06 22:33:23 +09:00
mattn
f86c34fbe8 Fix parseTag 2013-04-06 22:31:53 +09:00
mattn
39a9986627 Fix toggleComment 2013-04-06 22:16:23 +09:00
mattn
c0e0451489 Fix tests 2013-04-06 22:00:46 +09:00
mattn
77e2bd3c4e Add default attributes 2013-04-06 22:00:38 +09:00
mattn
62f0a02346 ditto 2013-04-06 21:44:27 +09:00
mattn
f99392847f Fix checking attributs 2013-04-06 21:41:23 +09:00
mattn
24eaace730 Avoid to duplicate attributes 2013-04-06 21:39:53 +09:00
mattn
7aecdc809d Merge pull request #114 from mgrubb/keep-attribute-order
Keep defined order of HTML attributes
2013-04-06 05:37:49 -07:00
Michael Grubb
594ca8e767 Added list to keep order of added attributes
Preloads this list with 'id' and 'class' to always sort those first
As attributes are parsed, append the names to the list.
Change toString function to loop over attribute list instead of keys.
2013-04-06 00:04:37 -05:00
mattn
6a84397073 Merge pull request #113 from avinash/master
The zencoding folder also needs to be copied to ~/.vim/autoload
2013-03-27 02:13:09 -07:00
Avinash Meetoo
e5ff2df906 The zencoding folder also needs to be copied to ~/.vim/autoload 2013-03-27 13:08:34 +04:00
mattn
59c2fb6647 Check bundled type at the first 2013-03-26 12:48:02 +09:00
mattn
82c09728d7 Fix checking type for expanding abbreviation. Also move types htmldjango/drupal into default settings. 2013-03-26 12:43:43 +09:00
mattn
0e4fe62138 Merge pull request #106 from Poltergeist/master
Added less support
2013-02-19 17:47:40 -08:00
Philipp Hinrichsen
73386514ea added less support 2013-02-18 13:20:19 +01:00
mattn
dc65299159 add zencoding_use_identify to disable. default is 1. 2013-02-13 09:02:43 +09:00
mattn
77c863af95 Merge pull request #104 from dpino/fast-image-size
Use command 'identify' (if supported) to get the size of a local image
2013-02-12 15:52:50 -08:00
Diego Pino
760d00cb89 Use function 'executable' to check if command 'identify' is available 2013-02-08 22:38:11 +01:00
Diego Pino
c088101cb7 Use command 'identify' to retrieve the size of a local image
* Command 'identify' is provived by ImageMagick
2013-02-07 18:32:59 +01:00
mattn
8c072f6a3b fix typo. 2013-01-22 14:14:28 +09:00
mattn
7aee52d710 Merge pull request #101 from snowmantw/patch-1
Update doc/zencoding.txt
2013-01-21 20:46:20 -08:00
mattn
8734406ab6 Merge pull request #100 from snowmantw/master
Optional ZenCoding functions in different modes.
2013-01-21 20:46:03 -08:00
Greg Weng
0d4bc41f03 Update doc/zencoding.txt 2013-01-22 12:42:41 +08:00
Greg Weng
8862640291 Update README.mkd 2013-01-22 11:23:25 +08:00
Greg Weng
97b753223e Update README.mkd 2013-01-22 11:22:53 +08:00
Greg Weng
2d3a46238b Optional zencoding functions in different modes. 2013-01-22 11:18:44 +08:00
Greg Weng
ab1be77b86 Update README.mkd 2013-01-22 11:15:29 +08:00
mattn
27350c3672 fix guessing utf-8 2013-01-11 09:51:32 +09:00
mattn
8c108ad27d use lower case 'html' for <DOCTYPE HTML> 2013-01-07 12:07:05 +09:00
mattn
f6c5a8c717 fix balance inward. 2012-12-04 10:51:32 +09:00
mattn
ac43ff8cd9 remove semi-colon in sass. 2012-11-06 20:22:47 +09:00
24 changed files with 4384 additions and 3005 deletions

2
.gitmodules vendored
View File

@@ -1,4 +1,4 @@
[submodule "docs"]
path = docs
url = git@github.com:mattn/zencoding-vim.git
url = https://github.com/mattn/emmet-vim
branch = gh-pages

View File

@@ -1,11 +1,11 @@
all : zencoding-vim.zip
all : emmet-vim.zip
remove-zip:
-rm doc/tags
-rm zencoding-vim.zip
-rm emmet-vim.zip
zencoding-vim.zip: remove-zip
zip -r zencoding-vim.zip autoload plugin doc
emmet-vim.zip: remove-zip
zip -r emmet-vim.zip autoload plugin doc
release: zencoding-vim.zip
vimup update-script zencoding.vim
release: emmet-vim.zip
vimup update-script emmet.vim

View File

@@ -1,93 +1,147 @@
# ZenCoding-vim
# Emmet-vim
[zencoding-vim](http://mattn.github.com/zencoding-vim) is vim script support for expanding abbreviation like zen-coding(emmet).
[emmet-vim](http://mattn.github.com/emmet-vim) is a vim plug-in
which provides support for expanding abbreviations similar to
[emmet](http://emmet.io/).
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/mattn/emmet-vim/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
## Installation
[Download zip file](http://www.vim.org/scripts/script.php?script_id=2981):
cd ~/.vim
unzip zencoding-vim.zip
unzip emmet-vim.zip
If you install pathogen.vim:
To install using pathogen.vim:
cd ~/.vim/bundle # or make directory
unzip /path/to/zencoding-vim.zip
cd ~/.vim/bundle
git clone https://github.com/mattn/emmet-vim.git
If you get source from repository:
To install using [Vundle](https://github.com/gmarik/vundle):
cd ~/.vim/bundle # or make directory
git clone http://github.com/mattn/zencoding-vim.git
" add this line to your .vimrc file
Plugin 'mattn/emmet-vim'
To checkout the source from repository:
cd ~/.vim/bundle
git clone https://github.com/mattn/emmet-vim.git
or:
git clone http://github.com/mattn/zencoding-vim.git
cd zencoding-vim
cp plugin/zencoding.vim ~/.vim/plugin/
cp autoload/zencoding.vim ~/.vim/autoload/
git clone https://github.com/mattn/emmet-vim.git
cd emmet-vim
cp plugin/emmet.vim ~/.vim/plugin/
cp autoload/emmet.vim ~/.vim/autoload/
cp -a autoload/emmet ~/.vim/autoload/
## Quick Tutorial
Open or create New File:
Open or create a New File:
vim index.html
Type ("_" is the cursor position):
Type ("\_" is the cursor position):
html:5_
Then type "<c-y>," (Ctrl + y + ','), you should see:
Then type `<c-y>,` (<kbd>Ctrl</kbd><kbd>y</kbd><kbd>,</kbd>), and you should see:
<!DOCTYPE HTML>
<html lang="en">
<head>
```html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</head>
<body>
_
</body>
</html>
</body>
</html>
```
[More Tutorials](https://raw.github.com/mattn/zencoding-vim/master/TUTORIAL)
[More Tutorials](https://raw.github.com/mattn/emmet-vim/master/TUTORIAL)
## Enable in different mode
If you don't want to enable emmet in all modes,
you can use set these options in `vimrc`:
```vim
let g:user_emmet_mode='n' "only enable normal mode functions.
let g:user_emmet_mode='inv' "enable all functions, which is equal to
let g:user_emmet_mode='a' "enable all function in all mode.
```
## Enable just for html/css
```vim
let g:user_emmet_install_global = 0
autocmd FileType html,css EmmetInstall
```
## Redefine trigger key
To remap the default `<C-Y>` leader:
```vim
let g:user_emmet_leader_key='<C-Z>'
```
Note that the trailing `,` still needs to be entered, so the new keymap would be `<C-Z>,`.
## Adding custom snippets
If you have installed the [web-api](https://github.com/mattn/webapi-vim) for **emmet-vim** you can also add your own snippets using a custom **snippets.json** file.
Once you have installed the [web-api](https://github.com/mattn/webapi-vim) add this line to your **.vimrc**:
```
let g:user_emmet_settings = webapi#json#decode(join(readfile(expand('~/.snippets_custom.json')), "\n"))
```
You can change the **path** to your **snippets_custom.json** according to your preferences.
[Here](http://docs.emmet.io/customization/snippets/) you can find instructions about creating your customized **snippets.json** file.
## Project Authors
[Yasuhiro Matsumoto](http://mattn.kaoriya.net/)
## Links
### Emmet official site:
* <http://emmet.io/>
### zen-coding official site:
> <http://code.google.com/p/zen-coding/>
* <http://code.google.com/p/zen-coding/>
### zencoding.vim:
### emmet.vim:
> <http://mattn.github.com/zencoding-vim>
* <http://mattn.github.com/emmet-vim>
### development repository:
> <https://github.com/mattn/zencoding-vim>
* <https://github.com/mattn/emmet-vim>
### my blog posts about zencoding-vim:
> <http://mattn.kaoriya.net/software/vim/20100222103327.htm>
* <http://mattn.kaoriya.net/software/vim/20100222103327.htm>
> <http://mattn.kaoriya.net/software/vim/20100306021632.htm>
* <http://mattn.kaoriya.net/software/vim/20100306021632.htm>
### japanese blog posts about zencoding-vim:
### Japanese blog posts about zencoding-vim:
> <http://d.hatena.ne.jp/idesaku/20100424/1272092255>
* <http://d.hatena.ne.jp/idesaku/20100424/1272092255>
> <http://d.hatena.ne.jp/griefworker/20110118/vim_zen_coding>
* <http://d.hatena.ne.jp/griefworker/20110118/vim_zen_coding>
> <http://d.hatena.ne.jp/sakurako_s/20110126/1295988873>
* <http://d.hatena.ne.jp/sakurako_s/20110126/1295988873>
> <http://looxu.blogspot.jp/2010/02/zencodingvimhtml.html>
* <http://looxu.blogspot.jp/2010/02/zencodingvimhtml.html>
### tutorial traslated in chinese:
### A Chinese translation of the tutorial:
> <http://www.zfanw.com/blog/zencoding-vim-tutorial-chinese.html>
* <http://www.zfanw.com/blog/zencoding-vim-tutorial-chinese.html>

View File

@@ -1,10 +1,10 @@
Tutorial of zencoding.vim
Tutorial for Emmet.vim
mattn <mattn.jp@gmail.com>
1. Expand Abbreviation
1. Expand an Abbreviation
Type abbreviation as 'div>p#foo$*3>a' and type '<c-y>,'.
Type the abbreviation as 'div>p#foo$*3>a' and type '<c-y>,'.
---------------------
<div>
<p id="foo1">
@@ -19,7 +19,7 @@ Tutorial of zencoding.vim
</div>
---------------------
2. Wrap with Abbreviation
2. Wrap with an Abbreviation
Write as below.
---------------------
@@ -27,8 +27,8 @@ Tutorial of zencoding.vim
test2
test3
---------------------
Then do visual select(line wize) and type '<c-y>,'.
If you request 'Tag:', then type 'ul>li*'.
Then do visual select(line wise) and type '<c-y>,'.
Once you get to the 'Tag:' prompt, type 'ul>li*'.
---------------------
<ul>
<li>test1</li>
@@ -37,7 +37,7 @@ Tutorial of zencoding.vim
</ul>
---------------------
If you type tag as 'blockquote', then you'll see as following.
If you type a tag, such as 'blockquote', then you'll see the following:
---------------------
<blockquote>
test1
@@ -46,25 +46,25 @@ Tutorial of zencoding.vim
</blockquote>
---------------------
3. Balance Tag Inward
3. Balance a Tag Inward
type '<c-y>d' in insert mode.
4. Balance Tag Outward
4. Balance a Tag Outward
type '<c-y>D' in insert mode.
5. Go to Next Edit Point
5. Go to the Next Edit Point
type '<c-y>n' in insert mode.
6. Go to Previous Edit Point
6. Go to the Previous Edit Point
type '<c-y>N' in insert mode.
7. Update <img> Size
7. Update an <img>s Size
Move cursor to img tag.
Move cursor to the img tag.
---------------------
<img src="foo.png" />
---------------------
@@ -75,7 +75,7 @@ Tutorial of zencoding.vim
8. Merge Lines
select the lines included '<li>'
select the lines, which include '<li>'
---------------------
<ul>
<li class="list1"></li>
@@ -83,14 +83,14 @@ Tutorial of zencoding.vim
<li class="list3"></li>
</ul>
---------------------
and type '<c-y>m'
and then type '<c-y>m'
---------------------
<ul>
<li class="list1"></li><li class="list2"></li><li class="list3"></li>
</ul>
---------------------
9. Remove Tag
9. Remove a Tag
Move cursor in block
---------------------
@@ -112,7 +112,7 @@ Tutorial of zencoding.vim
10. Split/Join Tag
Move cursor in block
Move the cursor inside block
---------------------
<div class="foo">
cursor is here
@@ -123,7 +123,7 @@ Tutorial of zencoding.vim
<div class="foo"/>
---------------------
And type '<c-y>j' in there again.
And then type '<c-y>j' in there again.
---------------------
<div class="foo">
</div>
@@ -131,7 +131,7 @@ Tutorial of zencoding.vim
11. Toggle Comment
Move cursor to block
Move cursor inside the block
---------------------
<div>
hello world
@@ -150,7 +150,7 @@ Tutorial of zencoding.vim
</div>
---------------------
12. Make anchor from URL
12. Make an anchor from a URL
Move cursor to URL
---------------------
@@ -161,9 +161,9 @@ Tutorial of zencoding.vim
<a href="http://www.google.com/">Google</a>
---------------------
13. Make quoted text from URL
13. Make some quoted text from a URL
Move cursor to URL
Move cursor to the URL
---------------------
http://github.com/
---------------------
@@ -176,28 +176,28 @@ Tutorial of zencoding.vim
</blockquote>
---------------------
14. Installing zencoding.vim for language you using.
14. Installing emmet.vim for the language you are using:
# cd ~/.vim
# unzip zencoding-vim.zip
# unzip emmet-vim.zip
or if you install pathogen.vim:
Or if you are using pathogen.vim:
# cd ~/.vim/bundle # or make directory
# unzip /path/to/zencoding-vim.zip
# unzip /path/to/emmet-vim.zip
if you get sources from repository:
Or if you get the sources from the repository:
# cd ~/.vim/bundle # or make directory
# git clone http://github.com/mattn/zencoding-vim.git
# git clone http://github.com/mattn/emmet-vim.git
15. Enable zencoding.vim for language you using.
15. Enable emmet.vim for the language you using.
You can customize the behavior of language you using.
You can customize the behavior of the languages you are using.
---------------------
# cat >> ~/.vimrc
let g:user_zen_settings = {
let g:user_emmet_settings = {
\ 'php' : {
\ 'extends' : 'html',
\ 'filters' : 'c',

1871
autoload/emmet.vim Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,11 @@
let s:exists = {}
function zencoding#lang#exists(type)
function! emmet#lang#exists(type) abort
if len(a:type) == 0
return 0
elseif has_key(s:exists, a:type)
return s:exists[a:type]
endif
let s:exists[a:type] = len(globpath(&rtp, 'autoload/zencoding/lang/'.a:type.'.vim')) > 0
let s:exists[a:type] = len(globpath(&rtp, 'autoload/emmet/lang/'.a:type.'.vim')) > 0
return s:exists[a:type]
endfunction

330
autoload/emmet/lang/css.vim Normal file
View File

@@ -0,0 +1,330 @@
function! emmet#lang#css#findTokens(str) abort
return substitute(substitute(a:str, '^.*[;{]\s*', '', ''), '}\s*$', '', '')
endfunction
function! emmet#lang#css#parseIntoTree(abbr, type) abort
let abbr = a:abbr
let type = a:type
let prefix = 0
let value = ''
let indent = emmet#getIndentation(type)
let aliases = emmet#getResource(type, 'aliases', {})
let snippets = emmet#getResource(type, 'snippets', {})
let use_pipe_for_cursor = emmet#getResource(type, 'use_pipe_for_cursor', 1)
let root = emmet#newNode()
" emmet
let tokens = split(abbr, '+\ze[^+)!]')
let block = emmet#util#searchRegion('{', '}')
if abbr !~# '^@' && emmet#getBaseType(type) ==# 'css' && type !=# 'sass' && block[0] ==# [0,0] && block[1] ==# [0,0]
let current = emmet#newNode()
let current.snippet = abbr . " {\n" . indent . "${cursor}\n}"
let current.name = ''
call add(root.child, deepcopy(current))
else
for n in range(len(tokens))
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.-]\+[pe]\{0,1}-\{0,1}\|-auto\)*\)$')
if len(prop)
let token = substitute(prop[1], '^(\(.*\))', '\1', '')
if token =~# '^-'
let prefix = 1
let token = token[1:]
endif
let value = ''
for v in split(prop[2], '\d\zs-')
if len(value) > 0
let value .= ' '
endif
if token =~# '^[z]'
" TODO
let value .= substitute(v, '[^0-9.]*$', '', '')
elseif v =~# 'p$'
let value .= substitute(v, 'p$', '%', '')
elseif v =~# 'e$'
let value .= substitute(v, 'e$', 'em', '')
elseif v =~# '\.'
let value .= v . 'em'
elseif v ==# 'auto'
let value .= v
elseif v ==# '0'
let value .= '0'
else
let value .= v . 'px'
endif
endfor
endif
let tag_name = token
if tag_name =~# '.!$'
let tag_name = tag_name[:-2]
let important = 1
else
let important = 0
endif
" make default node
let current = emmet#newNode()
let current.important = important
let current.name = tag_name
" aliases
if has_key(aliases, tag_name)
let current.name = aliases[tag_name]
endif
" snippets
if !empty(snippets)
let snippet_name = tag_name
if !has_key(snippets, snippet_name)
let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-\)')
let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(vv) > 0
let snippet_name = vv[0]
else
let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-*\)')
let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(vv) == 0
let pat = '^' . join(split(tag_name, '\zs'), '[^:]\{-}')
let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(vv) == 0
let pat = '^' . join(split(tag_name, '\zs'), '.\{-}')
let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
endif
endif
let minl = -1
for vk in vv
let vvs = snippets[vk]
if minl == -1 || len(vvs) < minl
let snippet_name = vk
let minl = len(vvs)
endif
endfor
endif
endif
if has_key(snippets, snippet_name)
let snippet = snippets[snippet_name]
if use_pipe_for_cursor
let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif
let lines = split(snippet, "\n")
call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let current.snippet = join(lines, "\n")
let current.name = ''
let current.snippet = substitute(current.snippet, ';', value . ';', '')
if use_pipe_for_cursor && len(value) > 0
let current.snippet = substitute(current.snippet, '\${cursor}', '', 'g')
endif
if n < len(tokens) - 1
let current.snippet .= "\n"
endif
endif
endif
let current.pos = 0
let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$')
if len(lg) == 0
let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*)$')
if len(lg)
let [lg[1], lg[2], lg[3]] = ['linear', lg[1], lg[2]]
endif
endif
if len(lg)
let current.name = ''
let current.snippet = printf("background-image:-webkit-gradient(%s, 0 0, 0 100%, from(%s), to(%s));\n", lg[1], lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image:-webkit-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image:-moz-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image:-o-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image:linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
elseif prefix
let snippet = current.snippet
let current.snippet = '-webkit-' . snippet . "\n"
call add(root.child, deepcopy(current))
let current.snippet = '-moz-' . snippet . "\n"
call add(root.child, deepcopy(current))
let current.snippet = snippet
call add(root.child, current)
elseif token =~# '^c#\([0-9a-fA-F]\{3}\|[0-9a-fA-F]\{6}\)\(\.[0-9]\+\)\?'
let cs = split(token, '\.')
let current.name = ''
let [r,g,b] = [0,0,0]
if len(cs[0]) == 5
let rgb = matchlist(cs[0], 'c#\(.\)\(.\)\(.\)')
let r = eval('0x'.rgb[1].rgb[1])
let g = eval('0x'.rgb[2].rgb[2])
let b = eval('0x'.rgb[3].rgb[3])
elseif len(cs[0]) == 8
let rgb = matchlist(cs[0], 'c#\(..\)\(..\)\(..\)')
let r = eval('0x'.rgb[1])
let g = eval('0x'.rgb[2])
let b = eval('0x'.rgb[3])
endif
if len(cs) == 1
let current.snippet = printf('color:rgb(%d, %d, %d);', r, g, b)
else
let current.snippet = printf('color:rgb(%d, %d, %d, %s);', r, g, b, string(str2float('0.'.cs[1])))
endif
call add(root.child, current)
elseif token =~# '^c#'
let current.name = ''
let current.snippet = 'color:\${cursor};'
call add(root.child, current)
else
call add(root.child, current)
endif
endfor
endif
return root
endfunction
function! emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent) abort
let current = a:current
let value = current.value[1:-2]
if emmet#useFilter(a:filters, 'fc')
let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1: \2', 'g')
else
let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1:\2', 'g')
endif
if current.important
let value = substitute(value, ';', ' !important;', '')
endif
return value
endfunction
function! emmet#lang#css#imageSize() abort
let img_region = emmet#util#searchRegion('{', '}')
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 [width, height] = emmet#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let indent = emmet#getIndentation('css')
if content =~# '.*\<width\s*:[^;]*;.*'
let content = substitute(content, '\<width\s*:[^;]*;', 'width: ' . width . 'px;', '')
else
let content = substitute(content, '}', indent . 'width: ' . width . "px;\n}", '')
endif
if content =~# '.*\<height\s*:[^;]*;.*'
let content = substitute(content, '\<height\s*:[^;]*;', 'height: ' . height . 'px;', '')
else
let content = substitute(content, '}', indent . 'height: ' . height . "px;\n}", '')
endif
call emmet#util#setContent(img_region, content)
endfunction
function! emmet#lang#css#encodeImage() abort
endfunction
function! emmet#lang#css#parseTag(tag) abort
return {}
endfunction
function! emmet#lang#css#toggleComment() abort
let line = getline('.')
let mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$'
if line =~# '{\s*$'
let block = emmet#util#searchRegion('/\*', '\*/\zs')
if emmet#util#regionIsValid(block)
let content = emmet#util#getContent(block)
let content = substitute(content, '/\*\s\(.*\)\s\*/', '\1', '')
call emmet#util#setContent(block, content)
else
let node = expand('<cword>')
if len(node)
exe "normal ciw\<c-r>='/* '.node.' */'\<cr>"
endif
endif
else
if line =~# mx
let space = substitute(matchstr(line, mx), mx, '\1', '')
let line = substitute(matchstr(line, mx), mx, '\2', '')
let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g')
else
let mx = '^\(\s*\)\(.*\)\s*$'
let line = substitute(line, mx, '\1/* \2 */', '')
endif
call setline('.', line)
endif
endfunction
function! emmet#lang#css#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = emmet#util#getcurpos()
endif
let block = emmet#util#getVisualBlock()
if !emmet#util#regionIsValid(block)
if a:flag > 0
let block = emmet#util#searchRegion('^', ';')
if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(block)
return
endif
endif
else
if a:flag > 0
let content = emmet#util#getContent(block)
if content !~# '^{.*}$'
let block = emmet#util#searchRegion('{', '}')
if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(block)
return
endif
endif
else
let pos = searchpos('.*;', 'nW')
if pos[0] != 0
call setpos('.', [0, pos[0], pos[1], 0])
let block = emmet#util#searchRegion('^', ';')
if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(block)
return
endif
endif
endif
endif
if a:flag == -2 || a:flag == 2
silent! exe 'normal! gv'
else
call setpos('.', curpos)
endif
endfunction
function! emmet#lang#css#moveNextPrevItem(flag) abort
return emmet#lang#css#moveNextPrev(a:flag)
endfunction
function! emmet#lang#css#moveNextPrev(flag) abort
let pos = search('""\|()\|\(:\s*\zs$\)', a:flag ? 'Wbp' : 'Wp')
if pos == 2
startinsert!
else
silent! normal! l
startinsert
endif
endfunction
function! emmet#lang#css#splitJoinTag() abort
" nothing to do
endfunction
function! emmet#lang#css#removeTag() abort
" nothing to do
endfunction

View File

@@ -1,24 +1,23 @@
function! zencoding#lang#haml#findTokens(str)
return zencoding#lang#html#findTokens(a:str)
function! emmet#lang#haml#findTokens(str) abort
return emmet#lang#html#findTokens(a:str)
endfunction
function! zencoding#lang#haml#parseIntoTree(abbr, type)
return zencoding#lang#html#parseIntoTree(a:abbr, a:type)
function! emmet#lang#haml#parseIntoTree(abbr, type) abort
return emmet#lang#html#parseIntoTree(a:abbr, a:type)
endfunction
function! zencoding#lang#haml#toString(settings, current, type, inline, filters, itemno, indent)
function! emmet#lang#haml#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 = a:indent
let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1)
let str = ""
let indent = emmet#getIndentation(type)
let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let attribute_style = emmet#getResource('haml', 'attribute_style', 'hash')
let str = ''
let comment_indent = ''
let comment = ''
let current_name = current.name
if dollar_expr
let current_name = substitute(current.name, '\$$', itemno+1, '')
@@ -26,30 +25,55 @@ function! zencoding#lang#haml#toString(settings, current, type, inline, filters,
if len(current.name) > 0
let str .= '%' . current_name
let tmp = ''
for attr in keys(current.attr)
let val = current.attr[attr]
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]
if type(Val) == 2 && Val == function('emmet#types#true')
if attribute_style ==# 'hash'
let tmp .= ' :' . attr . ' => true'
elseif attribute_style ==# 'html'
let tmp .= attr . '=true'
end
else
if dollar_expr
while val =~ '\$\([^#{]\|$\)'
let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
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 str .= '#' . val
elseif attr == 'class' && len(valtmp) > 0
let str .= '.' . substitute(val, ' ', '.', 'g')
let valtmp = substitute(Val, '\${cursor}', '', '')
if attr ==# 'id' && len(valtmp) > 0
let str .= '#' . Val
elseif attr ==# 'class' && len(valtmp) > 0
let str .= '.' . substitute(Val, ' ', '.', 'g')
else
if len(tmp) > 0 | let tmp .= ',' | endif
let val = substitute(val, '\${cursor}', '', '')
let tmp .= ' :' . attr . ' => "' . val . '"'
if len(tmp) > 0
if attribute_style ==# 'hash'
let tmp .= ','
elseif attribute_style ==# 'html'
let tmp .= ' '
endif
endif
let Val = substitute(Val, '\${cursor}', '', '')
if attribute_style ==# 'hash'
let tmp .= ' :' . attr . ' => "' . Val . '"'
elseif attribute_style ==# 'html'
let tmp .= attr . '="' . Val . '"'
end
endif
endif
endfor
if len(tmp)
if attribute_style ==# 'hash'
let str .= '{' . tmp . ' }'
elseif attribute_style ==# 'html'
let str .= '(' . tmp . ')'
end
endif
if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 && len(current.value) == 0
let str .= "/"
let str .= '/'
endif
let inner = ''
@@ -59,13 +83,14 @@ function! zencoding#lang#haml#toString(settings, current, type, inline, filters,
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')
endif
let lines = split(text, "\n")
if len(lines) == 1
let str .= " " . text
let str .= ' ' . text
else
for line in lines
let str .= "\n" . indent . line . " |"
let str .= "\n" . indent . line . ' |'
endfor
endif
elseif len(current.child) == 0
@@ -80,18 +105,18 @@ function! zencoding#lang#haml#toString(settings, current, type, inline, filters,
endif
let lines = split(text, "\n")
if len(lines) == 1
let str .= " " . text
let str .= ' ' . text
else
for line in lines
let str .= "\n" . indent . line . " |"
let str .= "\n" . indent . line . ' |'
endfor
endif
elseif len(current.child) > 0
for child in current.child
let inner .= zencoding#toString(child, type, inline, filters, itemno)
let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor
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 .= "\n" . indent . inner
endif
else
@@ -106,75 +131,78 @@ function! zencoding#lang#haml#toString(settings, current, type, inline, filters,
return str
endfunction
function! zencoding#lang#haml#imageSize()
function! emmet#lang#haml#imageSize() abort
let line = getline('.')
let current = zencoding#lang#haml#parseTag(line)
let current = emmet#lang#haml#parseTag(line)
if empty(current) || !has_key(current.attr, 'src')
return
endif
let fn = current.attr.src
if fn =~ '^\s*$'
if fn =~# '^\s*$'
return
elseif fn !~ '^\(/\|http\)'
elseif fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let [width, height] = zencoding#util#getImageSize(fn)
let [width, height] = emmet#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let current.attr.width = width
let current.attr.height = height
let haml = zencoding#toString(current, 'haml', 1)
call setline('.', substitute(matchstr(line, '^\s*') . haml, "\n", "", "g"))
let current.attrs_order += ['width', 'height']
let haml = emmet#toString(current, 'haml', 1)
let haml = substitute(haml, '\${cursor}', '', '')
call setline('.', substitute(matchstr(line, '^\s*') . haml, "\n", '', 'g'))
endfunction
function! zencoding#lang#haml#encodeImage()
function! emmet#lang#haml#encodeImage() abort
endfunction
function! zencoding#lang#haml#parseTag(tag)
let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0 }
function! emmet#lang#haml#parseTag(tag) abort
let current = emmet#newNode()
let mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)'
let match = matchstr(a:tag, mx)
let current.name = substitute(match, mx, '\1', 'i')
let attrs = substitute(match, mx, '\2', 'i')
let current.name = substitute(match, mx, '\1', '')
let attrs = substitute(match, mx, '\2', '')
let mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(attrs) > 0
let match = matchstr(attrs, mx)
if len(match) == 0
if len(match) ==# 0
break
endif
let attr_match = matchlist(match, mx)
let name = attr_match[1]
let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let current.attr[name] = value
let current.attrs_order += [name]
let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile
return current
endfunction
function! zencoding#lang#haml#toggleComment()
function! emmet#lang#haml#toggleComment() abort
let line = getline('.')
let space = matchstr(line, '^\s*')
if line =~ '^\s*-#'
if line =~# '^\s*-#'
call setline('.', space . matchstr(line[len(space)+2:], '^\s*\zs.*'))
elseif line =~ '^\s*%[a-z]'
elseif line =~# '^\s*%[a-z]'
call setline('.', space . '-# ' . line[len(space):])
endif
endfunction
function! zencoding#lang#haml#balanceTag(flag) range
let block = zencoding#util#getVisualBlock()
function! emmet#lang#haml#balanceTag(flag) range abort
let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = getpos('.')
let curpos = emmet#util#getcurpos()
endif
let n = curpos[1]
let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0
if a:flag == 1 || !zencoding#util#regionIsValid(block)
if a:flag == 1 || !emmet#util#regionIsValid(block)
let n = line('.')
else
while n > 0
@@ -228,7 +256,11 @@ function! zencoding#lang#haml#balanceTag(flag) range
endif
endfunction
function! zencoding#lang#haml#moveNextPrev(flag)
function! emmet#lang#haml#moveNextPrevItem(flag) abort
return emmet#lang#haml#moveNextPrev(a:flag)
endfunction
function! emmet#lang#haml#moveNextPrev(flag) abort
let pos = search('""', a:flag ? 'Wb' : 'W')
if pos != 0
silent! normal! l
@@ -236,11 +268,11 @@ function! zencoding#lang#haml#moveNextPrev(flag)
endif
endfunction
function! zencoding#lang#haml#splitJoinTag()
function! emmet#lang#haml#splitJoinTag() abort
let n = line('.')
let sml = len(matchstr(getline(n), '^\s*%[a-z]'))
while n > 0
if getline(n) =~ '^\s*\ze%[a-z]'
if getline(n) =~# '^\s*\ze%[a-z]'
if len(matchstr(getline(n), '^\s*%[a-z]')) < sml
break
endif
@@ -255,13 +287,13 @@ function! zencoding#lang#haml#splitJoinTag()
if l <= ml
break
endif
exe n "delete"
exe n 'delete'
endwhile
call setpos('.', [0, sn, 1, 0])
else
let tag = matchstr(getline(sn), '^\s*%\zs\(\w\+\)')
let spaces = matchstr(getline(sn), '^\s*')
let settings = zencoding#getSettings()
let settings = emmet#getSettings()
if stridx(','.settings.html.inline_elements.',', ','.tag.',') == -1
call append(sn, spaces . ' ')
call setpos('.', [0, sn+1, 1, 0])
@@ -276,11 +308,11 @@ function! zencoding#lang#haml#splitJoinTag()
endwhile
endfunction
function! zencoding#lang#haml#removeTag()
function! emmet#lang#haml#removeTag() abort
let n = line('.')
let ml = 0
while n > 0
if getline(n) =~ '^\s*\ze[a-z]'
if getline(n) =~# '^\s*\ze[a-z]'
let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
break
endif
@@ -296,8 +328,8 @@ function! zencoding#lang#haml#removeTag()
let n += 1
endwhile
if sn == n
exe "delete"
exe 'delete'
else
exe sn "," (n-1) "delete"
exe sn ',' (n-1) 'delete'
endif
endfunction

View File

@@ -0,0 +1,847 @@
let s:mx = '\([+>]\|[<^]\+\)\{-}\s*'
\ .'\((*\)\{-}\s*'
\ .'\([@#.]\{-}[a-zA-Z_\!][a-zA-Z0-9:_\!\-$]*\|{\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}*[ \t\r\n}]*\|\[[^\]]\+\]\)'
\ .'\('
\ .'\%('
\ .'\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)'
\ .'\|\%(\[\%("[^"]*"\|[^"\]]*\)\+\]\)'
\ .'\|\%(\.{[{}a-zA-Z0-9_\-\$]\+\|\.[a-zA-Z0-9_\-\$]\+\)'
\ .'\)*'
\ .'\)'
\ .'\%(\({\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}\+\)\)\{0,1}'
\ .'\%(\(@-\{0,1}[0-9]*\)\{0,1}\*\([0-9]\+\)\)\{0,1}'
\ .'\(\%()\%(\(@-\{0,1}[0-9]*\)\{0,1}\*[0-9]\+\)\{0,1}\)*\)'
function! emmet#lang#html#findTokens(str) abort
let str = a:str
let [pos, last_pos] = [0, 0]
while 1
let tag = matchstr(str, '<[a-zA-Z].\{-}>', pos)
if len(tag) == 0
break
endif
let pos = stridx(str, tag, pos) + len(tag)
endwhile
let last_pos = pos
while len(str) > 0
let token = matchstr(str, s:mx, pos)
if token ==# ''
break
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)
endwhile
let str = a:str[last_pos :-1]
if str =~# '^\w\+="[^"]*$'
return ''
endif
return str
endfunction
function! emmet#lang#html#parseIntoTree(abbr, type) abort
let abbr = a:abbr
let type = a:type
let settings = emmet#getSettings()
if !has_key(settings, type)
let type = 'html'
endif
if len(type) == 0 | let type = 'html' | endif
let settings = emmet#getSettings()
let indent = emmet#getIndentation(type)
" try 'foo' to (foo-x)
let rabbr = emmet#getExpandos(type, abbr)
if rabbr == abbr
" try 'foo+(' to (foo-x)
let rabbr = substitute(abbr, '\%(+\|^\)\([a-zA-Z][a-zA-Z0-9+]\+\)+\([(){}>]\|$\)', '\="(".emmet#getExpandos(type, submatch(1)).")".submatch(2)', 'i')
endif
let abbr = rabbr
let root = emmet#newNode()
let parent = root
let last = root
let pos = []
while len(abbr)
" parse line
let match = matchstr(abbr, s:mx)
let str = substitute(match, s:mx, '\0', 'ig')
let operator = substitute(match, s:mx, '\1', 'ig')
let block_start = substitute(match, s:mx, '\2', 'ig')
let tag_name = substitute(match, s:mx, '\3', 'ig')
let attributes = substitute(match, s:mx, '\4', 'ig')
let value = substitute(match, s:mx, '\5', 'ig')
let basevalue = substitute(match, s:mx, '\6', 'ig')
let multiplier = 0 + substitute(match, s:mx, '\7', 'ig')
let block_end = substitute(match, s:mx, '\8', 'ig')
let important = 0
if len(str) == 0
break
endif
if tag_name =~# '^#'
let attributes = tag_name . attributes
let tag_name = 'div'
endif
if tag_name =~# '[^!]!$'
let tag_name = tag_name[:-2]
let important = 1
endif
if tag_name =~# '^\.'
let attributes = tag_name . attributes
let tag_name = 'div'
endif
if tag_name =~# '^\[.*\]$'
let attributes = tag_name . attributes
let tag_name = 'div'
endif
let basedirect = basevalue[1] ==# '-' ? -1 : 1
let basevalue = 0 + abs(basevalue[1:])
if multiplier <= 0 | let multiplier = 1 | endif
" make default node
let current = emmet#newNode()
let current.name = tag_name
let current.important = important
" aliases
let aliases = emmet#getResource(type, 'aliases', {})
if has_key(aliases, tag_name)
let current.name = aliases[tag_name]
endif
let use_pipe_for_cursor = emmet#getResource(type, 'use_pipe_for_cursor', 1)
" snippets
let snippets = emmet#getResource(type, 'snippets', {})
if !empty(snippets)
let snippet_name = tag_name
if has_key(snippets, snippet_name)
let snippet = snippet_name
while has_key(snippets, snippet)
let snippet = snippets[snippet]
endwhile
if use_pipe_for_cursor
let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif
let lines = split(snippet, "\n", 1)
call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let current.snippet = join(lines, "\n")
let current.name = ''
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)
if tag_name =~# k
let current.snippet = '${' . tag_name . '}'
let current.name = ''
break
endif
endfor
" default_attributes
let default_attributes = emmet#getResource(type, 'default_attributes', {})
if !empty(default_attributes)
for pat in [current.name, tag_name]
if has_key(default_attributes, pat)
if type(default_attributes[pat]) == 4
let a = default_attributes[pat]
let current.attrs_order += keys(a)
if use_pipe_for_cursor
for k in keys(a)
let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}'
endfor
else
for k in keys(a)
let current.attr[k] = a[k]
endfor
endif
else
for a in default_attributes[pat]
let current.attrs_order += keys(a)
if use_pipe_for_cursor
for k in keys(a)
let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}'
endfor
else
for k in keys(a)
let current.attr[k] = a[k]
endfor
endif
endfor
endif
if has_key(settings.html.default_attributes, current.name)
let current.name = substitute(current.name, ':.*$', '', '')
endif
break
endif
endfor
endif
" parse attributes
if len(attributes)
let attr = attributes
while len(attr)
let item = matchstr(attr, '\(\%(\%(#[{}a-zA-Z0-9_\-\$]\+\)\|\%(\[\%("[^"]*"\|[^"\]]*\)\+\]\)\|\%(\.[{}a-zA-Z0-9_\-\$]\+\)*\)\)')
if g:emmet_debug > 1
echomsg 'attr=' . item
endif
if len(item) == 0
break
endif
if item[0] ==# '#'
let current.attr.id = item[1:]
endif
if item[0] ==# '.'
let current.attr.class = substitute(item[1:], '\.', ' ', 'g')
endif
if item[0] ==# '['
let atts = item[1:-2]
if matchstr(atts, '^\s*\zs[0-9a-zA-Z-:]\+\(="[^"]*"\|=''[^'']*''\|=[^ ''"]\+\)') ==# ''
let ks = []
if has_key(default_attributes, current.name)
let dfa = default_attributes[current.name]
let ks = type(dfa) == 3 ? keys(dfa[0]) : keys(dfa)
endif
if len(ks) == 0 && has_key(default_attributes, current.name . ':src')
let ks = keys(default_attributes[current.name . ':src'])
endif
if len(ks) > 0
let current.attr[ks[0]] = atts
else
let current.attr[atts] = ''
endif
else
while len(atts)
let amat = matchstr(atts, '^\s*\zs\([0-9a-zA-Z-:]\+\%(="[^"]*"\|=''[^'']*''\|=[^ ''"]\+\|[^ ''"\]]*\)\{0,1}\)')
if len(amat) == 0
break
endif
let key = split(amat, '=')[0]
let Val = amat[len(key)+1:]
if key =~# '\.$' && Val ==# ''
let key = key[:-2]
unlet Val
let Val = function('emmet#types#true')
elseif Val =~# '^["'']'
let Val = Val[1:-2]
endif
let current.attr[key] = Val
if index(current.attrs_order, key) == -1
let current.attrs_order += [key]
endif
let atts = atts[stridx(atts, amat) + len(amat):]
unlet Val
endwhile
endif
endif
let attr = substitute(strpart(attr, len(item)), '^\s*', '', '')
endwhile
endif
" parse text
if tag_name =~# '^{.*}$'
let current.name = ''
let current.value = tag_name
else
let current.value = value
endif
let current.basedirect = basedirect
let current.basevalue = basevalue
let current.multiplier = multiplier
" parse step inside/outside
if !empty(last)
if operator =~# '>'
unlet! parent
let parent = last
let current.parent = last
let current.pos = last.pos + 1
else
let current.parent = parent
let current.pos = last.pos
endif
else
let current.parent = parent
let current.pos = 1
endif
if operator =~# '[<^]'
for c in range(len(operator))
let tmp = parent.parent
if empty(tmp)
break
endif
let parent = tmp
let current.parent = tmp
endfor
endif
call add(parent.child, current)
let last = current
" parse block
if block_start =~# '('
if operator =~# '>'
let last.pos += 1
endif
for n in range(len(block_start))
let pos += [last.pos]
endfor
endif
if block_end =~# ')'
for n in split(substitute(substitute(block_end, ' ', '', 'g'), ')', ',),', 'g'), ',')
if n ==# ')'
if len(pos) > 0 && last.pos >= pos[-1]
for c in range(last.pos - pos[-1])
let tmp = parent.parent
if !has_key(tmp, 'parent')
break
endif
let parent = tmp
endfor
if len(pos) > 0
call remove(pos, -1)
endif
let last = parent
let last.pos += 1
endif
elseif len(n)
let cl = last.child
let cls = []
for c in range(n[1:])
for cc in cl
if cc.multiplier > 1
let cc.basedirect = c + 1
else
let cc.basevalue = c + 1
endif
endfor
let cls += deepcopy(cl)
endfor
let last.child = cls
endif
endfor
endif
let abbr = abbr[stridx(abbr, match) + len(match):]
if g:emmet_debug > 1
echomsg 'str='.str
echomsg 'block_start='.block_start
echomsg 'tag_name='.tag_name
echomsg 'operator='.operator
echomsg 'attributes='.attributes
echomsg 'value='.value
echomsg 'basevalue='.basevalue
echomsg 'multiplier='.multiplier
echomsg 'block_end='.block_end
echomsg 'abbr='.abbr
echomsg 'pos='.string(pos)
echomsg '---'
endif
endwhile
return root
endfunction
function! s:dollar_add(base,no) abort
if a:base > 0
return a:base + a:no - 1
elseif a:base < 0
return a:base - a:no + 1
else
return a:no
endif
endfunction
function! emmet#lang#html#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 = a:indent
let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let q = emmet#getResource(type, 'quote_char', '"')
let ct = emmet#getResource(type, 'comment_type', 'both')
if emmet#useFilter(filters, 'haml')
return emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent)
endif
if emmet#useFilter(filters, 'slim')
return emmet#lang#slim#toString(settings, current, type, inline, filters, itemno, indent)
endif
let comment = ''
let current_name = current.name
if dollar_expr
let current_name = substitute(current_name, '\$$', itemno+1, '')
endif
let str = ''
if len(current_name) == 0
let text = current.value[1:-2]
if dollar_expr
" TODO: regexp engine specified
let nr = itemno + 1
if exists('&regexpengine')
let text = substitute(text, '\%#=1\%(\\\)\@\<!\(\$\+\)\(@-\?[0-9]\+\)\{0,1}\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d",s:dollar_add(submatch(2)[1:],nr)).submatch(3)', 'g')
else
let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\(@-\?[0-9]\+\)\{0,1}\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d",s:dollar_add(submatch(2)[1:],nr).submatch(3)', 'g')
endif
let text = substitute(text, '\${nr}', "\n", 'g')
let text = substitute(text, '\\\$', '$', 'g')
endif
return text
endif
if len(current_name) > 0
let str .= '<' . current_name
endif
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]
if type(Val) == 2 && Val == function('emmet#types#true')
unlet Val
let Val = 'true'
if g:emmet_html5
let str .= ' ' . attr
else
let str .= ' ' . attr . '=' . q . attr . q
endif
if emmet#useFilter(filters, 'c')
if attr ==# 'id' | let comment .= '#' . Val | endif
if attr ==# 'class' | let comment .= '.' . Val | endif
endif
else
if dollar_expr
while Val =~# '\$\([^#{]\|$\)'
" TODO: regexp engine specified
if exists('&regexpengine')
let Val = substitute(Val, '\%#=1\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
else
let Val = substitute(Val, '\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endif
endwhile
let attr = substitute(attr, '\$$', itemno+1, '')
endif
if attr ==# 'class' && emmet#useFilter(filters, 'bem')
let vals = split(Val, '\s\+')
let Val = ''
let lead = ''
for _val in vals
if len(Val) > 0
let Val .= ' '
endif
if _val =~# '^\a_'
let lead = _val[0]
let Val .= lead . ' ' . _val
elseif _val =~# '^_'
if len(lead) == 0
let pattr = current.parent.attr
if has_key(pattr, 'class')
let lead = pattr['class']
endif
endif
let Val .= lead . ' ' . lead . _val
else
let Val .= _val
endif
endfor
endif
let str .= ' ' . attr . '=' . q . Val . q
if emmet#useFilter(filters, 'c')
if attr ==# 'id' | let comment .= '#' . Val | endif
if attr ==# 'class' | let comment .= '.' . Val | endif
endif
endif
unlet Val
endfor
if len(comment) > 0 && ct ==# 'both'
let str = '<!-- ' . comment . " -->\n" . str
endif
if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1
let str .= settings.html.empty_element_suffix
else
let str .= '>'
let text = current.value[1:-2]
if dollar_expr
" TODO: regexp engine specified
let nr = itemno + 1
if exists('&regexpengine')
let text = substitute(text, '\%#=1\%(\\\)\@\<!\(\$\+\)\(@-\?[0-9]\+\)\{0,1}\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d",s:dollar_add(submatch(2)[1:],nr)).submatch(3)', 'g')
else
let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\(@-\?[0-9]\+\)\{0,1}\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d",s:dollar_add(submatch(2)[1:],nr)).submatch(3)', 'g')
endif
let text = substitute(text, '\${nr}', "\n", 'g')
let text = substitute(text, '\\\$', '$', 'g')
let str = substitute(str, '\("\zs$#\ze"\|\s\zs\$#"\|"\$#\ze\s\)', text, 'g')
endif
let str .= text
let nc = len(current.child)
let dr = 0
if nc > 0
for n in range(nc)
let child = current.child[n]
if child.multiplier > 1
let str .= "\n" . indent
let dr = 1
elseif len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1
if nc > 1 || (len(child.name) > 0 && stridx(','.settings.html.inline_elements.',', ','.child.name.',') == -1)
let str .= "\n" . indent
let dr = 1
elseif current.multiplier == 1 && nc == 1 && len(child.name) == 0
let str .= "\n" . indent
let dr = 1
endif
endif
let inner = emmet#toString(child, type, 0, filters, itemno, indent)
let inner = substitute(inner, "^\n", '', 'g')
let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let str .= inner
endfor
else
let str .= '${cursor}'
endif
if dr
let str .= "\n"
endif
let str .= '</' . current_name . '>'
endif
if len(comment) > 0
if ct ==# 'lastonly'
let str .= '<!-- ' . comment . ' -->'
else
let str .= "\n<!-- /" . comment . ' -->'
endif
endif
if len(current_name) > 0 && current.multiplier > 0 || stridx(','.settings.html.block_elements.',', ','.current_name.',') != -1
let str .= "\n"
endif
return str
endfunction
function! emmet#lang#html#imageSize() abort
let img_region = emmet#util#searchRegion('<img\s', '>')
if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return
endif
let content = emmet#util#getContent(img_region)
if content !~# '^<img[^><]\+>$'
return
endif
let current = emmet#lang#html#parseTag(content)
if empty(current) || !has_key(current.attr, 'src')
return
endif
let fn = current.attr.src
if fn =~# '^\s*$'
return
elseif fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let [width, height] = emmet#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let current.attr.width = width
let current.attr.height = height
let current.attrs_order += ['width', 'height']
let html = substitute(emmet#toString(current, 'html', 1), '\n', '', '')
let html = substitute(html, '\${cursor}', '', '')
call emmet#util#setContent(img_region, html)
endfunction
function! emmet#lang#html#encodeImage() abort
let img_region = emmet#util#searchRegion('<img\s', '>')
if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return
endif
let content = emmet#util#getContent(img_region)
if content !~# '^<img[^><]\+>$'
return
endif
let current = emmet#lang#html#parseTag(content)
if empty(current) || !has_key(current.attr, 'src')
return
endif
let fn = current.attr.src
if fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let [width, height] = emmet#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let current.attr.width = width
let current.attr.height = height
let html = emmet#toString(current, 'html', 1)
call emmet#util#setContent(img_region, html)
endfunction
function! emmet#lang#html#parseTag(tag) abort
let current = emmet#newNode()
let mx = '<\([a-zA-Z][a-zA-Z0-9]*\)\(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\(/\{0,1}\)>'
let match = matchstr(a:tag, mx)
let current.name = substitute(match, mx, '\1', 'i')
let attrs = substitute(match, mx, '\2', 'i')
let mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(attrs) > 0
let match = matchstr(attrs, mx)
if len(match) == 0
break
endif
let attr_match = matchlist(match, mx)
let name = attr_match[1]
let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let current.attr[name] = value
let current.attrs_order += [name]
let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile
return current
endfunction
function! emmet#lang#html#toggleComment() abort
let orgpos = emmet#util#getcurpos()
let curpos = emmet#util#getcurpos()
let mx = '<\%#[^>]*>'
while 1
let block = emmet#util#searchRegion('<!--', '-->')
if emmet#util#regionIsValid(block)
let block[1][1] += 2
let content = emmet#util#getContent(block)
let content = substitute(content, '^<!--\s\(.*\)\s-->$', '\1', '')
call emmet#util#setContent(block, content)
silent! call setpos('.', orgpos)
return
endif
let block = emmet#util#searchRegion('<[^>]', '>')
if !emmet#util#regionIsValid(block)
let pos1 = searchpos('<', 'bcW')
if pos1[0] == 0 && pos1[1] == 0
return
endif
let curpos = emmet#util#getcurpos()
continue
endif
let pos1 = block[0]
let pos2 = block[1]
let content = emmet#util#getContent(block)
let tag_name = matchstr(content, '^<\zs/\{0,1}[^ \r\n>]\+')
if tag_name[0] ==# '/'
call setpos('.', [0, pos1[0], pos1[1], 0])
let pos2 = searchpairpos('<'. tag_name[1:] . '\>[^>]*>', '', '</' . tag_name[1:] . '>', 'bnW')
let pos1 = searchpos('>', 'cneW')
let block = [pos2, pos1]
elseif tag_name =~# '/$'
if !emmet#util#pointInRegion(orgpos[1:2], block)
" it's broken tree
call setpos('.', orgpos)
let block = emmet#util#searchRegion('>', '<')
let content = '><!-- ' . emmet#util#getContent(block)[1:-2] . ' --><'
call emmet#util#setContent(block, content)
silent! call setpos('.', orgpos)
return
endif
else
call setpos('.', [0, pos2[0], pos2[1], 0])
let pos3 = searchpairpos('<'. tag_name . '\>[^>]*>', '', '</' . tag_name . '>', 'nW')
if pos3 == [0, 0]
let block = [pos1, pos2]
else
call setpos('.', [0, pos3[0], pos3[1], 0])
let pos2 = searchpos('>', 'neW')
let block = [pos1, pos2]
endif
endif
if !emmet#util#regionIsValid(block)
silent! call setpos('.', orgpos)
return
endif
if emmet#util#pointInRegion(curpos[1:2], block)
let content = '<!-- ' . emmet#util#getContent(block) . ' -->'
call emmet#util#setContent(block, content)
silent! call setpos('.', orgpos)
return
endif
endwhile
endfunction
function! emmet#lang#html#balanceTag(flag) range abort
let vblock = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = emmet#util#getcurpos()
endif
let settings = emmet#getSettings()
if a:flag > 0
let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*'
let last = curpos[1:2]
while 1
let pos1 = searchpos(mx, 'bW')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
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
let block = [pos1, pos2]
if pos1[0] == 0 && pos1[1] == 0
break
endif
if emmet#util#pointInRegion(last, block) && emmet#util#regionIsValid(block)
call emmet#util#selectRegion(block)
return
endif
if pos1 == last
break
endif
let last = pos1
endwhile
else
let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
while 1
let pos1 = searchpos(mx, 'W')
if pos1 == curpos[1:2]
let pos1 = searchpos(mx . '\zs', 'W')
let pos2 = searchpos('.\ze<', 'W')
let block = [pos1, pos2]
if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(block)
return
endif
endif
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
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
let block = [pos1, pos2]
if pos1[0] == 0 && pos1[1] == 0
break
endif
if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(block)
return
endif
endwhile
endif
if a:flag == -2 || a:flag == 2
silent! exe 'normal! gv'
else
call setpos('.', curpos)
endif
endfunction
function! emmet#lang#html#moveNextPrevItem(flag) abort
silent! exe "normal \<esc>"
let mx = '\%([0-9a-zA-Z-:]\+\%(="[^"]*"\|=''[^'']*''\|[^ ''">\]]*\)\{0,1}\)'
let pos = searchpos('\s'.mx.'\zs', '')
if pos != [0,0]
call feedkeys('v?\s\zs'.mx."\<cr>", '')
endif
endfunction
function! emmet#lang#html#moveNextPrev(flag) abort
let pos = search('\%(</\w\+\)\@<!\zs><\/\|\(""\)\|^\(\s*\)$', a:flag ? 'Wpb' : 'Wp')
if pos == 3
startinsert!
elseif pos != 0
silent! normal! l
startinsert
endif
endfunction
function! emmet#lang#html#splitJoinTag() abort
let curpos = emmet#util#getcurpos()
while 1
let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
let pos1 = searchpos(mx, 'bcnW')
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 block = [pos1, [pos1[0], pos1[1] + len(content) - 1]]
if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block)
let content = content[:-3] . '></' . tag_name . '>'
call emmet#util#setContent(block, content)
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
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 = searchpos('</' . tag_name[1:] . '>', 'cneW')
else
let pos2 = searchpos('</' . tag_name . '>', 'cneW')
endif
let block = [pos1, pos2]
let content = emmet#util#getContent(block)
if emmet#util#pointInRegion(curpos[1:2], block) && content[1:] !~# '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>'
let content = matchstr(content, mx)[:-2] . '/>'
call emmet#util#setContent(block, content)
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
if block[0][0] > 0
call setpos('.', [0, block[0][0]-1, block[0][1], 0])
else
call setpos('.', curpos)
return
endif
endif
endif
endwhile
endfunction
function! emmet#lang#html#removeTag() abort
let curpos = emmet#util#getcurpos()
while 1
let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*'
let pos1 = searchpos(mx, 'bcnW')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
let tag_name = matchstr(content, '^<\zs/\{0,1}[a-zA-Z0-9:_\-]*')
let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]]
if content[-2:] ==# '/>' && emmet#util#cursorInRegion(block)
call emmet#util#setContent(block, '')
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
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 = searchpos('</' . tag_name[1:] . '>', 'cneW')
else
let pos2 = searchpos('</' . tag_name . '>', 'cneW')
endif
let block = [pos1, pos2]
let content = emmet#util#getContent(block)
if emmet#util#pointInRegion(curpos[1:2], block) && content[1:] !~# '^<' . tag_name . '[^a-zA-Z0-9]'
call emmet#util#setContent(block, '')
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
if block[0][0] > 0
call setpos('.', [0, block[0][0]-1, block[0][1], 0])
else
call setpos('.', curpos)
return
endif
endif
endif
endwhile
endfunction

View File

@@ -0,0 +1,47 @@
function! emmet#lang#less#findTokens(str) abort
return emmet#lang#html#findTokens(a:str)
endfunction
function! emmet#lang#less#parseIntoTree(abbr, type) abort
return emmet#lang#scss#parseIntoTree(a:abbr, a:type)
endfunction
function! emmet#lang#less#toString(settings, current, type, inline, filters, itemno, indent) abort
return emmet#lang#scss#toString(a:settings, a:current, a:type, a:inline, a:filters, a:itemno, a:indent)
endfunction
function! emmet#lang#less#imageSize() abort
call emmet#lang#css#imageSize()
endfunction
function! emmet#lang#less#encodeImage() abort
return emmet#lang#css#encodeImage()
endfunction
function! emmet#lang#less#parseTag(tag) abort
return emmet#lang#css#parseTag(a:tag)
endfunction
function! emmet#lang#less#toggleComment() abort
call emmet#lang#css#toggleComment()
endfunction
function! emmet#lang#less#balanceTag(flag) range abort
call emmet#lang#scss#balanceTag(a:flag)
endfunction
function! emmet#lang#less#moveNextPrevItem(flag) abort
return emmet#lang#less#moveNextPrev(a:flag)
endfunction
function! emmet#lang#less#moveNextPrev(flag) abort
call emmet#lang#scss#moveNextPrev(a:flag)
endfunction
function! emmet#lang#less#splitJoinTag() abort
call emmet#lang#css#splitJoinTag()
endfunction
function! emmet#lang#less#removeTag() abort
call emmet#lang#css#removeTag()
endfunction

View File

@@ -1,16 +1,12 @@
function! zencoding#lang#sass#findTokens(str)
return zencoding#lang#html#findTokens(a:str)
function! emmet#lang#sass#findTokens(str) abort
return emmet#lang#css#findTokens(a:str)
endfunction
function! zencoding#lang#sass#parseIntoTree(abbr, type)
if a:abbr =~ '>'
return zencoding#lang#html#parseIntoTree(a:abbr, a:type)
else
return zencoding#lang#css#parseIntoTree(a:abbr, a:type)
endif
function! emmet#lang#sass#parseIntoTree(abbr, type) abort
return emmet#lang#html#parseIntoTree(a:abbr, a:type)
endfunction
function! zencoding#lang#sass#toString(settings, current, type, inline, filters, itemno, indent)
function! emmet#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) abort
let settings = a:settings
let current = a:current
let type = a:type
@@ -18,7 +14,7 @@ function! zencoding#lang#sass#toString(settings, current, type, inline, filters,
let filters = a:filters
let itemno = a:itemno
let indent = a:indent
let str = ""
let str = ''
let current_name = current.name
let current_name = substitute(current.name, '\$$', itemno+1, '')
@@ -27,13 +23,13 @@ function! zencoding#lang#sass#toString(settings, current, type, inline, filters,
let tmp = ''
for attr in keys(current.attr)
let val = current.attr[attr]
while val =~ '\$\([^#{]\|$\)'
while val =~# '\$\([^#{]\|$\)'
let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile
let attr = substitute(attr, '\$$', itemno+1, '')
if attr == 'id'
if attr ==# 'id'
let str .= '#' . val
elseif attr == 'class'
elseif attr ==# 'class'
let str .= '.' . val
else
let tmp .= attr . ': ' . val
@@ -50,43 +46,46 @@ function! zencoding#lang#sass#toString(settings, current, type, inline, filters,
let inner = ''
for child in current.child
let inner .= zencoding#toString(child, type, inline, filters, itemno)
let tmp = emmet#toString(child, type, inline, filters, itemno, indent)
let tmp = substitute(tmp, "\n", "\n" . escape(indent, '\'), 'g')
let tmp = substitute(tmp, "\n" . escape(indent, '\') . '$', '${cursor}\n', 'g')
let inner .= tmp
endfor
let inner = substitute(inner, "\n", "\n" . indent, 'g')
let inner = substitute(inner, "\n" . indent . "$", "", 'g')
if len(inner) > 0
let str .= indent . inner
endif
else
let text = zencoding#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
let text = substitute(text, '\s*;$', '', '')
let text = emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
let text = substitute(text, '\s*;\ze\(\${[^}]\+}\)\?\(\n\|$\)', '', 'g')
return text
endif
return str
endfunction
function! zencoding#lang#sass#imageSize()
function! emmet#lang#sass#imageSize() abort
endfunction
function! zencoding#lang#sass#encodeImage()
function! emmet#lang#sass#encodeImage() abort
endfunction
function! zencoding#lang#sass#parseTag(tag)
function! emmet#lang#sass#parseTag(tag) abort
endfunction
function! zencoding#lang#sass#toggleComment()
function! emmet#lang#sass#toggleComment() abort
endfunction
function! zencoding#lang#sass#balanceTag(flag) range
let block = zencoding#util#getVisualBlock()
function! emmet#lang#sass#balanceTag(flag) range abort
let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = getpos('.')
let curpos = emmet#util#getcurpos()
endif
let n = curpos[1]
let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0
if a:flag == 1 || !zencoding#util#regionIsValid(block)
if a:flag == 1 || !emmet#util#regionIsValid(block)
let n = line('.')
else
while n > 0
@@ -140,7 +139,11 @@ function! zencoding#lang#sass#balanceTag(flag) range
endif
endfunction
function! zencoding#lang#sass#moveNextPrev(flag)
function! emmet#lang#sass#moveNextPrevItem(flag) abort
return emmet#lang#sass#moveNextPrev(a:flag)
endfunction
function! emmet#lang#sass#moveNextPrev(flag) abort
let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp')
if pos == 2
startinsert!
@@ -150,8 +153,8 @@ function! zencoding#lang#sass#moveNextPrev(flag)
endif
endfunction
function! zencoding#lang#sass#splitJoinTag()
function! emmet#lang#sass#splitJoinTag() abort
endfunction
function! zencoding#lang#sass#removeTag()
function! emmet#lang#sass#removeTag() abort
endfunction

View File

@@ -1,16 +1,16 @@
function! zencoding#lang#scss#findTokens(str)
return zencoding#lang#html#findTokens(a:str)
function! emmet#lang#scss#findTokens(str) abort
return emmet#lang#css#findTokens(a:str)
endfunction
function! zencoding#lang#scss#parseIntoTree(abbr, type)
if a:abbr =~ '>'
return zencoding#lang#html#parseIntoTree(a:abbr, a:type)
function! emmet#lang#scss#parseIntoTree(abbr, type) abort
if a:abbr =~# '>'
return emmet#lang#html#parseIntoTree(a:abbr, a:type)
else
return zencoding#lang#css#parseIntoTree(a:abbr, a:type)
return emmet#lang#css#parseIntoTree(a:abbr, a:type)
endif
endfunction
function! zencoding#lang#scss#toString(settings, current, type, inline, filters, itemno, indent)
function! emmet#lang#scss#toString(settings, current, type, inline, filters, itemno, indent) abort
let settings = a:settings
let current = a:current
let type = a:type
@@ -18,22 +18,21 @@ function! zencoding#lang#scss#toString(settings, current, type, inline, filters,
let filters = a:filters
let itemno = a:itemno
let indent = a:indent
let str = ""
let str = ''
let current_name = current.name
let current_name = substitute(current.name, '\$$', itemno+1, '')
if len(current.name) > 0
let str .= current_name
let tmp = ''
for attr in keys(current.attr)
let val = current.attr[attr]
while val =~ '\$\([^#{]\|$\)'
while val =~# '\$\([^#{]\|$\)'
let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile
let attr = substitute(attr, '\$$', itemno+1, '')
if attr == 'id'
if attr ==# 'id'
let str .= '#' . val
elseif attr == 'class'
elseif attr ==# 'class'
let str .= '.' . val
else
let tmp .= attr . ': ' . val . ';'
@@ -50,39 +49,39 @@ function! zencoding#lang#scss#toString(settings, current, type, inline, filters,
let inner = ''
for child in current.child
let inner .= zencoding#toString(child, type, inline, filters, itemno)
let inner .= emmet#toString(child, type, inline, filters, itemno)
endfor
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"
else
return zencoding#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
return emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
endif
return str
endfunction
function! zencoding#lang#scss#imageSize()
call zencoding#lang#css#imageSize()
function! emmet#lang#scss#imageSize() abort
call emmet#lang#css#imageSize()
endfunction
function! zencoding#lang#scss#encodeImage()
return zencoding#lang#css#encodeImage()
function! emmet#lang#scss#encodeImage() abort
return emmet#lang#css#encodeImage()
endfunction
function! zencoding#lang#scss#parseTag(tag)
return zencoding#lang#css#parseTag(a:tag)
function! emmet#lang#scss#parseTag(tag) abort
return emmet#lang#css#parseTag(a:tag)
endfunction
function! zencoding#lang#scss#toggleComment()
call zencoding#lang#css#toggleComment()
function! emmet#lang#scss#toggleComment() abort
call emmet#lang#css#toggleComment()
endfunction
function! zencoding#lang#scss#balanceTag(flag) range
function! emmet#lang#scss#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
call setpos('.', curpos)
else
let curpos = getpos('.')
let curpos = emmet#util#getcurpos()
endif
if a:flag < 0
let ret = searchpair('}', '', '.\zs{')
@@ -90,33 +89,37 @@ function! zencoding#lang#scss#balanceTag(flag) range
let ret = searchpair('{', '', '}', 'bW')
endif
if ret > 0
let pos1 = getpos('.')[1:2]
let pos1 = emmet#util#getcurpos()[1:2]
if a:flag < 0
let pos2 = searchpairpos('{', '', '}')
else
let pos2 = searchpairpos('{', '', '}')
endif
let block = [pos1, pos2]
if zencoding#util#regionIsValid(block)
call zencoding#util#selectRegion(block)
if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(block)
return
endif
endif
if a:flag == -2 || a:flag == 2
silent! exe "normal! gv"
silent! exe 'normal! gv'
else
call setpos('.', curpos)
endif
endfunction
function! zencoding#lang#scss#moveNextPrev(flag)
call zencoding#lang#css#moveNextPrev(a:flag)
function! emmet#lang#scss#moveNextPrevItem(flag) abort
return emmet#lang#scss#moveNextPrev(a:flag)
endfunction
function! zencoding#lang#scss#splitJoinTag()
call zencoding#lang#css#splitJoinTag()
function! emmet#lang#scss#moveNextPrev(flag) abort
call emmet#lang#css#moveNextPrev(a:flag)
endfunction
function! zencoding#lang#scss#removeTag()
call zencoding#lang#ss#removeTag()
function! emmet#lang#scss#splitJoinTag() abort
call emmet#lang#css#splitJoinTag()
endfunction
function! emmet#lang#scss#removeTag() abort
call emmet#lang#css#removeTag()
endfunction

View File

@@ -1,39 +1,43 @@
function! zencoding#lang#slim#findTokens(str)
return zencoding#lang#html#findTokens(a:str)
function! emmet#lang#slim#findTokens(str) abort
return emmet#lang#html#findTokens(a:str)
endfunction
function! zencoding#lang#slim#parseIntoTree(abbr, type)
return zencoding#lang#html#parseIntoTree(a:abbr, a:type)
function! emmet#lang#slim#parseIntoTree(abbr, type) abort
return emmet#lang#html#parseIntoTree(a:abbr, a:type)
endfunction
function! zencoding#lang#slim#toString(settings, current, type, inline, filters, itemno, indent)
let settings = a:settings
function! emmet#lang#slim#toString(settings, current, type, inline, filters, itemno, indent) abort
let current = a:current
let type = a:type
let inline = a:inline
let filters = a:filters
let itemno = a:itemno
let indent = a:indent
let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1)
let str = ""
let indent = emmet#getIndentation(type)
let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let str = ''
let comment_indent = ''
let comment = ''
let current_name = current.name
if dollar_expr
let current_name = substitute(current.name, '\$$', itemno+1, '')
endif
if len(current.name) > 0
let str .= current_name
for attr in keys(current.attr)
let val = current.attr[attr]
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]
if type(Val) == 2 && Val == function('emmet#types#true')
let str .= ' ' . attr . '=true'
else
if dollar_expr
while val =~ '\$\([^#{]\|$\)'
let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
while Val =~# '\$\([^#{]\|$\)'
let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile
endif
let attr = substitute(attr, '\$$', itemno+1, '')
let str .= ' ' . attr . '="' . val . '"'
let str .= ' ' . attr . '="' . Val . '"'
endif
endfor
let inner = ''
@@ -44,9 +48,10 @@ function! zencoding#lang#slim#toString(settings, current, type, inline, filters,
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')
endif
for line in split(text, "\n")
let str .= indent . "| " . line . "\n"
let str .= indent . '| ' . line . "\n"
endfor
elseif len(current.child) == 0
let str .= '${cursor}'
@@ -60,14 +65,14 @@ function! zencoding#lang#slim#toString(settings, current, type, inline, filters,
let text = substitute(text, '\\\$', '$', 'g')
endif
for line in split(text, "\n")
let str .= indent . "| " . line . "\n"
let str .= indent . '| ' . line . "\n"
endfor
elseif len(current.child) > 0
for child in current.child
let inner .= zencoding#toString(child, type, inline, filters, itemno)
let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor
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 .= "\n" . indent . inner
endif
else
@@ -78,44 +83,46 @@ function! zencoding#lang#slim#toString(settings, current, type, inline, filters,
let str = substitute(str, '\\\$', '$', 'g')
endif
endif
if str !~ "\n$"
if str !~# "\n$"
let str .= "\n"
endif
return str
endfunction
function! zencoding#lang#slim#imageSize()
function! emmet#lang#slim#imageSize() abort
let line = getline('.')
let current = zencoding#lang#slim#parseTag(line)
let current = emmet#lang#slim#parseTag(line)
if empty(current) || !has_key(current.attr, 'src')
return
endif
let fn = current.attr.src
if fn =~ '^\s*$'
if fn =~# '^\s*$'
return
elseif fn !~ '^\(/\|http\)'
elseif fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let [width, height] = zencoding#util#getImageSize(fn)
let [width, height] = emmet#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let current.attr.width = width
let current.attr.height = height
let slim = zencoding#toString(current, 'slim', 1)
call setline('.', substitute(matchstr(line, '^\s*') . slim, "\n", "", "g"))
let current.attrs_order += ['width', 'height']
let slim = emmet#toString(current, 'slim', 1)
let slim = substitute(slim, '\${cursor}', '', '')
call setline('.', substitute(matchstr(line, '^\s*') . slim, "\n", '', 'g'))
endfunction
function! zencoding#lang#slim#encodeImage()
function! emmet#lang#slim#encodeImage() abort
endfunction
function! zencoding#lang#slim#parseTag(tag)
let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0 }
function! emmet#lang#slim#parseTag(tag) abort
let current = emmet#newNode()
let mx = '\([a-zA-Z][a-zA-Z0-9]*\)\s\+\(.*\)'
let match = matchstr(a:tag, mx)
let current.name = substitute(match, mx, '\1', 'i')
let attrs = substitute(match, mx, '\2', 'i')
let current.name = substitute(match, mx, '\1', '')
let attrs = substitute(match, mx, '\2', '')
let mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(attrs) > 0
let match = matchstr(attrs, mx)
@@ -126,33 +133,34 @@ function! zencoding#lang#slim#parseTag(tag)
let name = attr_match[1]
let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let current.attr[name] = value
let current.attrs_order += [name]
let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile
return current
endfunction
function! zencoding#lang#slim#toggleComment()
function! emmet#lang#slim#toggleComment() abort
let line = getline('.')
let space = matchstr(line, '^\s*')
if line =~ '^\s*/'
if line =~# '^\s*/'
call setline('.', space . line[len(space)+1:])
elseif line =~ '^\s*[a-z]'
elseif line =~# '^\s*[a-z]'
call setline('.', space . '/' . line[len(space):])
endif
endfunction
function! zencoding#lang#slim#balanceTag(flag) range
let block = zencoding#util#getVisualBlock()
function! emmet#lang#slim#balanceTag(flag) range abort
let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = getpos('.')
let curpos = emmet#util#getcurpos()
endif
let n = curpos[1]
let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0
if a:flag == 1 || !zencoding#util#regionIsValid(block)
if a:flag == 1 || !emmet#util#regionIsValid(block)
let n = line('.')
else
while n > 0
@@ -206,7 +214,11 @@ function! zencoding#lang#slim#balanceTag(flag) range
endif
endfunction
function! zencoding#lang#slim#moveNextPrev(flag)
function! emmet#lang#slim#moveNextPrevItem(flag) abort
return emmet#lang#slim#moveNextPrev(a:flag)
endfunction
function! emmet#lang#slim#moveNextPrev(flag) abort
let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp')
if pos == 2
startinsert!
@@ -216,18 +228,18 @@ function! zencoding#lang#slim#moveNextPrev(flag)
endif
endfunction
function! zencoding#lang#slim#splitJoinTag()
function! emmet#lang#slim#splitJoinTag() abort
let n = line('.')
while n > 0
if getline(n) =~ '^\s*\ze[a-z]'
if getline(n) =~# '^\s*\ze[a-z]'
let sn = n
let n += 1
if getline(n) =~ '^\s*|'
if getline(n) =~# '^\s*|'
while n <= line('$')
if getline(n) !~ '^\s*|'
if getline(n) !~# '^\s*|'
break
endif
exe n "delete"
exe n 'delete'
endwhile
call setpos('.', [0, sn, 1, 0])
else
@@ -242,11 +254,11 @@ function! zencoding#lang#slim#splitJoinTag()
endwhile
endfunction
function! zencoding#lang#slim#removeTag()
function! emmet#lang#slim#removeTag() abort
let n = line('.')
let ml = 0
while n > 0
if getline(n) =~ '^\s*\ze[a-z]'
if getline(n) =~# '^\s*\ze[a-z]'
let ml = len(matchstr(getline(n), '^\s*[a-z]'))
break
endif
@@ -262,8 +274,8 @@ function! zencoding#lang#slim#removeTag()
let n += 1
endwhile
if sn == n
exe "delete"
exe 'delete'
else
exe sn "," (n-1) "delete"
exe sn ',' (n-1) 'delete'
endif
endfunction

View File

@@ -0,0 +1,65 @@
function! emmet#lorem#en#expand(command) abort
let wcount = matchstr(a:command, '\(\d*\)$')
let wcount = wcount > 0 ? wcount : 30
let common = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit']
let words = ['exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet',
\ 'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi',
\ 'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi',
\ 'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos',
\ 'facilis', 'neque', 'nihil', 'expedita', 'vitae', 'vero', 'ipsum',
\ 'nisi', 'animi', 'cumque', 'pariatur', 'velit', 'modi', 'natus',
\ 'iusto', 'eaque', 'sequi', 'illo', 'sed', 'ex', 'et', 'voluptatibus',
\ 'tempora', 'veritatis', 'ratione', 'assumenda', 'incidunt', 'nostrum',
\ 'placeat', 'aliquid', 'fuga', 'provident', 'praesentium', 'rem',
\ 'necessitatibus', 'suscipit', 'adipisci', 'quidem', 'possimus',
\ 'voluptas', 'debitis', 'sint', 'accusantium', 'unde', 'sapiente',
\ 'voluptate', 'qui', 'aspernatur', 'laudantium', 'soluta', 'amet',
\ 'quo', 'aliquam', 'saepe', 'culpa', 'libero', 'ipsa', 'dicta',
\ 'reiciendis', 'nesciunt', 'doloribus', 'autem', 'impedit', 'minima',
\ 'maiores', 'repudiandae', 'ipsam', 'obcaecati', 'ullam', 'enim',
\ 'totam', 'delectus', 'ducimus', 'quis', 'voluptates', 'dolores',
\ 'molestiae', 'harum', 'dolorem', 'quia', 'voluptatem', 'molestias',
\ 'magni', 'distinctio', 'omnis', 'illum', 'dolorum', 'voluptatum', 'ea',
\ 'quas', 'quam', 'corporis', 'quae', 'blanditiis', 'atque', 'deserunt',
\ 'laboriosam', 'earum', 'consequuntur', 'hic', 'cupiditate',
\ 'quibusdam', 'accusamus', 'ut', 'rerum', 'error', 'minus', 'eius',
\ 'ab', 'ad', 'nemo', 'fugit', 'officia', 'at', 'in', 'id', 'quos',
\ 'reprehenderit', 'numquam', 'iste', 'fugiat', 'sit', 'inventore',
\ 'beatae', 'repellendus', 'magnam', 'recusandae', 'quod', 'explicabo',
\ 'doloremque', 'aperiam', 'consequatur', 'asperiores', 'commodi',
\ 'optio', 'dolor', 'labore', 'temporibus', 'repellat', 'veniam',
\ 'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique',
\ 'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere',
\ 'maxime', 'corrupti']
let ret = []
let sentence = 0
for i in range(wcount)
let arr = common
if sentence > 0
let arr += words
endif
let r = emmet#util#rand()
let word = arr[r % len(arr)]
if sentence == 0
let word = substitute(word, '^.', '\U&', '')
endif
let sentence += 1
call add(ret, word)
if (sentence > 5 && emmet#util#rand() < 10000) || i == wcount - 1
if i == wcount - 1
let endc = '?!...'[emmet#util#rand() % 5]
call add(ret, endc)
else
let endc = '?!,...'[emmet#util#rand() % 6]
call add(ret, endc . ' ')
endif
if endc !=# ','
let sentence = 0
endif
else
call add(ret, ' ')
endif
endfor
return join(ret, '')
endfunction

View File

@@ -0,0 +1,27 @@
scriptencoding utf-8
function! emmet#lorem#ja#expand(command) abort
let wcount = matchstr(a:command, '^\%(lorem\|lipsum\)\(\d*\)}$', '\1', '')
let wcount = wcount > 0 ? wcount : 30
let url = "http://www.aozora.gr.jp/cards/000081/files/470_15407.html"
let content = emmet#util#cache(url)
if len(content) == 0
let content = emmet#util#getContentFromURL(url)
let content = matchstr(content, '<div[^>]*>\zs.\{-}</div>')
let content = substitute(content, '[ \r]', '', 'g')
let content = substitute(content, '<br[^>]*>', "\n", 'g')
let content = substitute(content, '<[^>]\+>', '', 'g')
let content = join(filter(split(content, "\n"), 'len(v:val)>0'), "\n")
call emmet#util#cache(url, content)
endif
let content = substitute(content, "、\n", "、", "g")
let clines = split(content, '\n')
let lines = filter(clines, 'len(substitute(v:val,".",".","g"))<=wcount')
if len(lines) == 0
let lines = clines
endif
let r = emmet#util#rand()
return lines[r % len(lines)]
endfunction

View File

@@ -11,10 +11,10 @@
" --------------------
" begin::end
" --------------------
function! zencoding#util#deleteContent(region)
function! emmet#util#deleteContent(region) abort
let lines = getline(a:region[0][0], a:region[1][0])
call setpos('.', [0, a:region[0][0], a:region[0][1], 0])
silent! exe "delete ".(a:region[1][0] - a:region[0][0])
silent! exe 'delete '.(a:region[1][0] - a:region[0][0])
call setline(line('.'), lines[0][:a:region[0][1]-2] . lines[-1][a:region[1][1]])
endfunction
@@ -36,11 +36,11 @@ endfunction
" bar
" baz:end
" --------------------
function! zencoding#util#setContent(region, content)
function! emmet#util#setContent(region, content) abort
let newlines = split(a:content, '\n', 1)
let oldlines = getline(a:region[0][0], a:region[1][0])
call setpos('.', [0, a:region[0][0], a:region[0][1], 0])
silent! exe "delete ".(a:region[1][0] - a:region[0][0])
silent! exe 'delete '.(a:region[1][0] - a:region[0][0])
if len(newlines) == 0
let tmp = ''
if a:region[0][1] > 1
@@ -72,7 +72,7 @@ endfunction
" select_region : select region
" this function make a selection of region
function! zencoding#util#selectRegion(region)
function! emmet#util#selectRegion(region) abort
call setpos('.', [0, a:region[1][0], a:region[1][1], 0])
normal! v
call setpos('.', [0, a:region[0][0], a:region[0][1], 0])
@@ -80,8 +80,8 @@ endfunction
" point_in_region : check point is in the region
" this function return 0 or 1
function! zencoding#util#pointInRegion(point, region)
if !zencoding#util#regionIsValid(a:region) | return 0 | endif
function! emmet#util#pointInRegion(point, region) abort
if !emmet#util#regionIsValid(a:region) | return 0 | endif
if a:region[0][0] > a:point[0] | return 0 | endif
if a:region[1][0] < a:point[0] | return 0 | endif
if a:region[0][0] == a:point[0] && a:region[0][1] > a:point[1] | return 0 | endif
@@ -91,29 +91,34 @@ endfunction
" cursor_in_region : check cursor is in the region
" this function return 0 or 1
function! zencoding#util#cursorInRegion(region)
if !zencoding#util#regionIsValid(a:region) | return 0 | endif
let cur = getpos('.')[1:2]
return zencoding#util#pointInRegion(cur, a:region)
function! emmet#util#cursorInRegion(region) abort
if !emmet#util#regionIsValid(a:region) | return 0 | endif
let cur = emmet#util#getcurpos()[1:2]
return emmet#util#pointInRegion(cur, a:region)
endfunction
" region_is_valid : check region is valid
" this function return 0 or 1
function! zencoding#util#regionIsValid(region)
function! emmet#util#regionIsValid(region) abort
if a:region[0][0] == 0 || a:region[1][0] == 0 | return 0 | endif
return 1
endfunction
" search_region : make region from pattern which is composing start/end
" this function return array of position
function! zencoding#util#searchRegion(start, end)
return [searchpairpos(a:start, '', a:end, 'bcnW'), searchpairpos(a:start, '\%#', a:end, 'nW')]
function! emmet#util#searchRegion(start, end) abort
let b = searchpairpos(a:start, '', a:end, 'bcnW')
if b == [0, 0]
return [searchpairpos(a:start, '', a:end, 'bnW'), searchpairpos(a:start, '\%#', a:end, 'nW')]
else
return [b, searchpairpos(a:start, '', a:end. '', 'nW')]
endif
endfunction
" get_content : get content in region
" this function return string in region
function! zencoding#util#getContent(region)
if !zencoding#util#regionIsValid(a:region)
function! emmet#util#getContent(region) abort
if !emmet#util#regionIsValid(a:region)
return ''
endif
let lines = getline(a:region[0][0], a:region[1][0])
@@ -128,31 +133,58 @@ endfunction
" region_in_region : check region is in the region
" this function return 0 or 1
function! zencoding#util#regionInRegion(outer, inner)
if !zencoding#util#regionIsValid(a:inner) || !zencoding#util#regionIsValid(a:outer)
function! emmet#util#regionInRegion(outer, inner) abort
if !emmet#util#regionIsValid(a:inner) || !emmet#util#regionIsValid(a:outer)
return 0
endif
return zencoding#util#pointInRegion(a:inner[0], a:outer) && zencoding#util#pointInRegion(a:inner[1], a:outer)
return emmet#util#pointInRegion(a:inner[0], a:outer) && emmet#util#pointInRegion(a:inner[1], a:outer)
endfunction
" get_visualblock : get region of visual block
" this function return region of visual block
function! zencoding#util#getVisualBlock()
function! emmet#util#getVisualBlock() abort
return [[line("'<"), col("'<")], [line("'>"), col("'>")]]
endfunction
"==============================================================================
" html utils
"==============================================================================
function! zencoding#util#getContentFromURL(url)
let res = system(printf("%s %s", g:zencoding_curl_command, shellescape(substitute(a:url, '#.*', '', ''))))
let s1 = len(split(res, '?'))
let utf8 = iconv(res, 'utf-8', &encoding)
function! emmet#util#getContentFromURL(url) abort
let res = system(printf('%s -i %s', g:emmet_curl_command, shellescape(substitute(a:url, '#.*', '', ''))))
while res =~# '^HTTP/1.\d 3' || res =~# '^HTTP/1\.\d 200 Connection established' || res =~# '^HTTP/1\.\d 100 Continue'
let pos = stridx(res, "\r\n\r\n")
if pos != -1
let res = strpart(res, pos+4)
else
let pos = stridx(res, "\n\n")
let res = strpart(res, pos+2)
endif
endwhile
let pos = stridx(res, "\r\n\r\n")
if pos != -1
let content = strpart(res, pos+4)
else
let pos = stridx(res, "\n\n")
let content = strpart(res, pos+2)
endif
let header = res[:pos-1]
let charset = matchstr(content, '<meta[^>]\+content=["''][^;"'']\+;\s*charset=\zs[^;"'']\+\ze["''][^>]*>')
if len(charset) == 0
let charset = matchstr(content, '<meta\s\+charset=["'']\?\zs[^"'']\+\ze["'']\?[^>]*>')
endif
if len(charset) == 0
let charset = matchstr(header, '\nContent-Type:.* charset=[''"]\?\zs[^''";\n]\+\ze')
endif
if len(charset) == 0
let s1 = len(split(content, '?'))
let utf8 = iconv(content, 'utf-8', &encoding)
let s2 = len(split(utf8, '?'))
return s2 > s1 * 2 ? utf8 : res
return (s2 == s1 || s2 >= s1 * 2) ? utf8 : content
endif
return iconv(content, charset, &encoding)
endfunction
function! zencoding#util#getTextFromHTML(buf)
function! emmet#util#getTextFromHTML(buf) abort
let threshold_len = 100
let threshold_per = 0.1
let buf = a:buf
@@ -170,7 +202,7 @@ function! zencoding#util#getTextFromHTML(buf)
let str = substitute(str, '&gt;', '>', 'g')
let str = substitute(str, '&lt;', '<', 'g')
let str = substitute(str, '&quot;', '"', 'g')
let str = substitute(str, '&apos;', "'", 'g')
let str = substitute(str, '&apos;', '''', 'g')
let str = substitute(str, '&nbsp;', ' ', 'g')
let str = substitute(str, '&yen;', '\&#65509;', 'g')
let str = substitute(str, '&amp;', '\&', 'g')
@@ -189,38 +221,60 @@ function! zencoding#util#getTextFromHTML(buf)
return res
endfunction
function! zencoding#util#getImageSize(fn)
function! emmet#util#getImageSize(fn) abort
let fn = a:fn
if emmet#util#isImageMagickInstalled()
return emmet#util#imageSizeWithImageMagick(fn)
endif
if filereadable(fn)
let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g')
else
let hex = substitute(system(g:zencoding_curl_command.' "'.fn.'" | xxd -p'), '\n', '', 'g')
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 [width, height] = [-1, -1]
if hex =~ '^89504e470d0a1a0a'
if hex =~# '^89504e470d0a1a0a'
let width = eval('0x'.hex[32:39])
let height = eval('0x'.hex[40:47])
endif
if hex =~ '^ffd8'
if hex =~# '^ffd8'
let pos = 4
while pos < len(hex)
let bs = hex[pos+0:pos+3]
let pos += 4
if bs == 'ffc0' || bs == 'ffc2'
if bs ==# 'ffc0' || bs ==# 'ffc2'
let pos += 6
let height = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])
let pos += 4
let width = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])
break
elseif bs =~ 'ffd[9a]'
elseif bs =~# 'ffd[9a]'
break
elseif bs =~ 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)'
elseif bs =~# 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)'
let pos += (eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])) * 2
endif
endwhile
endif
if hex =~ '^47494638'
if hex =~# '^47494638'
let width = eval('0x'.hex[14:15].hex[12:13])
let height = eval('0x'.hex[18:19].hex[16:17])
endif
@@ -228,3 +282,68 @@ function! zencoding#util#getImageSize(fn)
return [width, height]
endfunction
function! emmet#util#imageSizeWithImageMagick(fn) abort
let img_info = system('identify -format "%wx%h" "'.a:fn.'"')
let img_size = split(substitute(img_info, '\n', '', ''), 'x')
if len(img_size) != 2
return [-1, -1]
endif
return img_size
endfunction
function! emmet#util#isImageMagickInstalled() abort
if !get(s:, 'emmet_use_identify', 1)
return 0
endif
return executable('identify')
endfunction
function! emmet#util#unique(arr) abort
let m = {}
let r = []
for i in a:arr
if !has_key(m, i)
let m[i] = 1
call add(r, i)
endif
endfor
return r
endfunction
let s:seed = localtime()
function! emmet#util#srand(seed) abort
let s:seed = a:seed
endfunction
function! emmet#util#rand() abort
let s:seed = s:seed * 214013 + 2531011
return (s:seed < 0 ? s:seed - 0x80000000 : s:seed) / 0x10000 % 0x8000
endfunction
function! emmet#util#cache(name, ...) abort
let content = get(a:000, 0, '')
let dir = expand('~/.emmet/cache')
if !isdirectory(dir)
call mkdir(dir, 'p', 0700)
endif
let file = dir . '/' . substitute(a:name, '\W', '_', 'g')
if len(content) == 0
if !filereadable(file)
return ''
endif
return join(readfile(file), "\n")
endif
call writefile(split(content, "\n"), file)
endfunction
function! emmet#util#getcurpos() abort
let pos = getpos('.')
if mode(0) ==# 'i' && pos[2] > 0
let pos[2] -=1
endif
return pos
endfunction
function! emmet#util#closePopup() abort
return pumvisible() ? "\<c-e>" : ''
endfunction

File diff suppressed because it is too large Load Diff

View File

@@ -1,228 +0,0 @@
function! zencoding#lang#css#findTokens(str)
return substitute(a:str, '^.*[;{]\s*', '', '')
endfunction
function! zencoding#lang#css#parseIntoTree(abbr, type)
let abbr = a:abbr
let type = a:type
let prefix = 0
let value = ''
let settings = zencoding#getSettings()
let indent = zencoding#getIndentation(type)
let root = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0 }
" emmet
let tokens = split(abbr, '+\ze[^)!]')
for n in range(len(tokens))
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.-]\+[pe]\{0,1}-\{0,1}\|-auto\)*\)$')
if len(prop)
let token = substitute(prop[1], '^(\(.*\))', '\1', '')
if token =~ '^-'
let prefix = 1
let token = token[1:]
endif
let value = ''
for v in split(prop[2], '\d\zs-')
if len(value) > 0
let value .= ' '
endif
if token =~ '^[z]'
" TODO
let value .= substitute(v, '[^0-9.]*$', '', '')
elseif v =~ 'p$'
let value .= substitute(v, 'p$', '%', '')
elseif v =~ 'e$'
let value .= substitute(v, 'e$', 'em', '')
elseif v =~ '\.'
let value .= v . 'em'
elseif v == 'auto'
let value .= v
else
let value .= v . 'px'
endif
endfor
endif
let tag_name = token
if tag_name =~ '.!$'
let tag_name = tag_name[:-2]
let important = 1
else
let important = 0
endif
" make default node
let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': important }
let current.name = tag_name
" aliases
let aliases = zencoding#getResource(type, 'aliases', {})
if has_key(aliases, tag_name)
let current.name = aliases[tag_name]
endif
let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1)
" snippets
let snippets = zencoding#getResource(type, 'snippets', {})
if !empty(snippets) && has_key(snippets, tag_name)
let snippet = snippets[tag_name]
if use_pipe_for_cursor
let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif
let lines = split(snippet, "\n")
call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let current.snippet = join(lines, "\n")
let current.name = ''
let current.snippet = substitute(current.snippet, ';', value . ';', '')
if use_pipe_for_cursor && len(value) > 0 && stridx(value, '${cursor}') == -1
let current.snippet = substitute(current.snippet, '${cursor}', '', 'g') . '${cursor}'
endif
if n < len(tokens) - 1
let current.snippet .= "\n"
endif
endif
let current.pos = 0
let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\w\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$')
if len(lg)
let current.name = ''
let current.snippet = printf("background-image: -webkit-gradient(%s, 0 0, 0 100%, from(%s), to(%s));\n", lg[1], lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image: -webkit-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image: -moz-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image: -o-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
let current.snippet = printf("background-image: linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(root.child, deepcopy(current))
elseif prefix
let snippet = current.snippet
let current.snippet = '-webkit-' . snippet . "\n"
call add(root.child, deepcopy(current))
let current.snippet = '-moz-' . snippet . "\n"
call add(root.child, deepcopy(current))
let current.snippet = snippet
call add(root.child, current)
else
call add(root.child, current)
endif
endfor
return root
endfunction
function! zencoding#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
let current = a:current
let value = current.value[1:-2]
if zencoding#useFilter(a:filters, 'fc')
let value = substitute(value, '\([^:]\+\):\([^;]*;\)', '\1: \2', 'g')
else
let value = substitute(value, '\([^:]\+\):\([^;]*;\)', '\1:\2', 'g')
endif
if current.important
let value = substitute(value, ';', ' !important;', '')
endif
return value
endfunction
function! zencoding#lang#css#imageSize()
endfunction
function! zencoding#lang#css#encodeImage()
endfunction
function! zencoding#lang#css#parseTag(tag)
return {}
endfunction
function! zencoding#lang#css#toggleComment()
let line = getline('.')
let mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$'
if line =~ '{\s*$'
let block = zencoding#util#searchRegion('/\*', '\*/\zs')
if zencoding#util#regionIsValid(block)
let content = zencoding#util#getContent(block)
let content = substitute(content, '/\*\s\(.*\)\s\*/', '\1', '')
call zencoding#util#setContent(block, content)
else
let node = expand('<cword>')
if len(node)
exe "normal ciw\<c-r>='/* '.node.' */'\<cr>"
endif
endif
else
if line =~ mx
let space = substitute(matchstr(line, mx), mx, '\1', '')
let line = substitute(matchstr(line, mx), mx, '\2', '')
let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g')
else
let mx = '^\(\s*\)\(.*\)\s*$'
let line = substitute(line, mx, '\1/* \2 */', '')
endif
call setline('.', line)
endif
endfunction
function! zencoding#lang#css#balanceTag(flag) range
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = getpos('.')
endif
let block = zencoding#util#getVisualBlock()
if !zencoding#util#regionIsValid(block)
if a:flag > 0
let block = zencoding#util#searchRegion('^', ';')
if zencoding#util#regionIsValid(block)
call zencoding#util#selectRegion(block)
return
endif
endif
else
if a:flag > 0
let content = zencoding#util#getContent(block)
if content !~ '^{.*}$'
let block = zencoding#util#searchRegion('{', '}')
if zencoding#util#regionIsValid(block)
call zencoding#util#selectRegion(block)
return
endif
endif
else
let pos = searchpos('.*;', 'nW')
if pos[0] != 0
call setpos('.', [0, pos[0], pos[1], 0])
let block = zencoding#util#searchRegion('^', ';')
if zencoding#util#regionIsValid(block)
call zencoding#util#selectRegion(block)
return
endif
endif
endif
endif
if a:flag == -2 || a:flag == 2
silent! exe "normal! gv"
else
call setpos('.', curpos)
endif
endfunction
function! zencoding#lang#css#moveNextPrev(flag)
let pos = search('""\|()\|\(:\s*\zs$\)', a:flag ? 'Wbp' : 'Wp')
if pos == 2
startinsert!
else
silent! normal! l
startinsert
endif
endfunction
function! zencoding#lang#css#splitJoinTag()
" nothing to do
endfunction
function! zencoding#lang#css#removeTag()
" nothing to do
endfunction

View File

@@ -1,673 +0,0 @@
let s:mx = '\([+>]\|[<^]\+\)\{-}\s*'
\ .'\((*\)\{-}\s*'
\ .'\([@#.]\{-}[a-zA-Z\!][a-zA-Z0-9:_\!\-$]*\|{\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}[ \t\r\n}]*\)'
\ .'\('
\ .'\%('
\ .'\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)'
\ .'\|\%(\[[^\]]\+\]\)'
\ .'\|\%(\.{[{}a-zA-Z0-9_\-\$]\+\|\.[a-zA-Z0-9_\-\$]\+\)'
\ .'\)*'
\ .'\)'
\ .'\%(\({\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}\)\)\{0,1}'
\ .'\%(\*\([0-9]\+\)\)\{0,1}'
\ .'\(\%()\%(\*[0-9]\+\)\{0,1}\)*\)'
function! zencoding#lang#html#findTokens(str)
let str = a:str
let [pos, last_pos] = [0, 0]
while 1
let tag = matchstr(str, '<[a-zA-Z].\{-}>', pos)
if len(tag) == 0
break
endif
let pos = stridx(str, tag, pos) + len(tag)
endwhile
let last_pos = pos
while len(str) > 0
let token = matchstr(str, s:mx, pos)
if token == ''
break
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)
endwhile
return a:str[last_pos :-1]
endfunction
function! zencoding#lang#html#parseIntoTree(abbr, type)
let abbr = a:abbr
let type = a:type
let settings = zencoding#getSettings()
if !has_key(settings, type)
let type = 'html'
endif
if len(type) == 0 | let type = 'html' | endif
let settings = zencoding#getSettings()
let indent = zencoding#getIndentation(type)
" try 'foo' to (foo-x)
let rabbr = zencoding#getExpandos(type, abbr)
if rabbr == abbr
" try 'foo+(' to (foo-x)
let rabbr = substitute(abbr, '\%(+\|^\)\([a-zA-Z][a-zA-Z0-9+]\+\)+\([(){}>]\|$\)', '\="(".zencoding#getExpandos(type, submatch(1)).")".submatch(2)', 'i')
endif
let abbr = rabbr
let root = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0 }
let parent = root
let last = root
let pos = []
while len(abbr)
" parse line
let match = matchstr(abbr, s:mx)
let str = substitute(match, s:mx, '\0', 'ig')
let operator = substitute(match, s:mx, '\1', 'ig')
let block_start = substitute(match, s:mx, '\2', 'ig')
let tag_name = substitute(match, s:mx, '\3', 'ig')
let attributes = substitute(match, s:mx, '\4', 'ig')
let value = substitute(match, s:mx, '\5', 'ig')
let multiplier = 0 + substitute(match, s:mx, '\6', 'ig')
let block_end = substitute(match, s:mx, '\7', 'ig')
let important = 0
if len(str) == 0
break
endif
if tag_name =~ '^#'
let attributes = tag_name . attributes
let tag_name = 'div'
endif
if tag_name =~ '.!$'
let tag_name = tag_name[:-2]
let important = 1
endif
if tag_name =~ '^\.'
let attributes = tag_name . attributes
let tag_name = 'div'
endif
if multiplier <= 0 | let multiplier = 1 | endif
" make default node
let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0 }
let current.name = tag_name
let current.important = important
" aliases
let aliases = zencoding#getResource(type, 'aliases', {})
if has_key(aliases, tag_name)
let current.name = aliases[tag_name]
endif
let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1)
" snippets
let snippets = zencoding#getResource(type, 'snippets', {})
if !empty(snippets) && has_key(snippets, tag_name)
let snippet = snippets[tag_name]
if use_pipe_for_cursor
let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif
let lines = split(snippet, "\n")
call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let current.snippet = join(lines, "\n")
let current.name = ''
endif
" default_attributes
let default_attributes = zencoding#getResource(type, 'default_attributes', {})
if !empty(default_attributes)
for pat in [current.name, tag_name]
if has_key(default_attributes, pat)
if type(default_attributes[pat]) == 4
let a = default_attributes[pat]
if use_pipe_for_cursor
for k in keys(a)
let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}'
endfor
else
for k in keys(a)
let current.attr[k] = a[k]
endfor
endif
else
for a in default_attributes[pat]
if use_pipe_for_cursor
for k in keys(a)
let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}'
endfor
else
for k in keys(a)
let current.attr[k] = a[k]
endfor
endif
endfor
endif
if has_key(settings.html.default_attributes, current.name)
let current.name = substitute(current.name, ':.*$', '', '')
endif
break
endif
endfor
endif
" parse attributes
if len(attributes)
let attr = attributes
while len(attr)
let item = matchstr(attr, '\(\%(\%(#[{}a-zA-Z0-9_\-\$]\+\)\|\%(\[[^\]]\+\]\)\|\%(\.[{}a-zA-Z0-9_\-\$]\+\)*\)\)')
if len(item) == 0
break
endif
if item[0] == '#'
let current.attr.id = item[1:]
endif
if item[0] == '.'
let current.attr.class = substitute(item[1:], '\.', ' ', 'g')
endif
if item[0] == '['
let atts = item[1:-2]
while len(atts)
let amat = matchstr(atts, '\(\w\+\%(="[^"]*"\|=''[^'']*''\|[^ ''"\]]*\)\{0,1}\)')
if len(amat) == 0
break
endif
let key = split(amat, '=')[0]
let val = amat[len(key)+1:]
if val =~ '^["'']'
let val = val[1:-2]
endif
let current.attr[key] = val
let atts = atts[stridx(atts, amat) + len(amat):]
endwhile
endif
let attr = substitute(strpart(attr, len(item)), '^\s*', '', '')
endwhile
endif
" parse text
if tag_name =~ '^{.*}$'
let current.name = ''
let current.value = tag_name
else
let current.value = value
endif
let current.multiplier = multiplier
" parse step inside/outside
if !empty(last)
if operator =~ '>'
unlet! parent
let parent = last
let current.parent = last
let current.pos = last.pos + 1
else
let current.parent = parent
let current.pos = last.pos
endif
else
let current.parent = parent
let current.pos = 1
endif
if operator =~ '[<^]'
for c in range(len(operator))
let tmp = parent.parent
if empty(tmp)
break
endif
let parent = tmp
let current.parent = tmp
endfor
endif
call add(parent.child, current)
let last = current
" parse block
if block_start =~ '('
if operator =~ '>'
let last.pos += 1
endif
for n in range(len(block_start))
let pos += [last.pos]
endfor
endif
if block_end =~ ')'
for n in split(substitute(substitute(block_end, ' ', '', 'g'), ')', ',),', 'g'), ',')
if n == ')'
if len(pos) > 0 && last.pos >= pos[-1]
for c in range(last.pos - pos[-1])
let tmp = parent.parent
if !has_key(tmp, 'parent')
break
endif
let parent = tmp
endfor
if len(pos) > 0
call remove(pos, -1)
endif
let last = parent
let last.pos += 1
endif
elseif len(n)
let cl = last.child
let cls = []
for c in range(n[1:])
let cls += cl
endfor
let last.child = cls
endif
endfor
endif
let abbr = abbr[stridx(abbr, match) + len(match):]
if g:zencoding_debug > 1
echomsg "str=".str
echomsg "block_start=".block_start
echomsg "tag_name=".tag_name
echomsg "operator=".operator
echomsg "attributes=".attributes
echomsg "value=".value
echomsg "multiplier=".multiplier
echomsg "block_end=".block_end
echomsg "abbr=".abbr
echomsg "pos=".string(pos)
echomsg "---"
endif
endwhile
return root
endfunction
function! zencoding#lang#html#toString(settings, current, type, inline, filters, itemno, indent)
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 = a:indent
let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1)
if zencoding#useFilter(filters, 'haml')
return zencoding#lang#haml#toString(settings, current, type, inline, filters, itemno, indent)
endif
if zencoding#useFilter(filters, 'slim')
return zencoding#lang#slim#toString(settings, current, type, inline, filters, itemno, indent)
endif
let comment = ''
let current_name = current.name
if dollar_expr
let current_name = substitute(current_name, '\$$', itemno+1, '')
endif
let str = ''
if len(current_name) == 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')
endif
return text
endif
if len(current_name) > 0
let str .= '<' . current_name
for attr in keys(current.attr)
let val = current.attr[attr]
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 str .= ' ' . attr . '="' . val . '"'
if zencoding#useFilter(filters, 'c')
if attr == 'id' | let comment .= '#' . val | endif
if attr == 'class' | let comment .= '.' . val | endif
endif
endfor
if len(comment) > 0
let str = "<!-- " . comment . " -->\n" . str
endif
if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1
let str .= settings.html.empty_element_suffix
else
let str .= ">"
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')
endif
let str .= text
let nc = len(current.child)
let dr = 0
if nc > 0
for n in range(nc)
let child = current.child[n]
if child.multiplier > 1
let str .= "\n" . indent
let dr = 1
elseif len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1
if nc > 1 || (len(child.name) > 0 && stridx(','.settings.html.inline_elements.',', ','.child.name.',') == -1)
let str .= "\n" . indent
let dr = 1
elseif current.multiplier == 1 && nc == 1 && len(child.name) == 0
echo current.multiplier
let str .= "\n" . indent
let dr = 1
endif
endif
let inner = zencoding#toString(child, type, 0, filters, itemno)
let inner = substitute(inner, "^\n", "", 'g')
let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let str .= inner
endfor
else
let str .= '${cursor}'
endif
if dr
let str .= "\n"
endif
let str .= "</" . current_name . ">"
endif
if len(comment) > 0
let str .= "\n<!-- /" . comment . " -->"
endif
if len(current_name) > 0 && current.multiplier > 0 || stridx(','.settings.html.block_elements.',', ','.current_name.',') != -1
let str .= "\n"
endif
return str
endfunction
function! zencoding#lang#html#imageSize()
let img_region = zencoding#util#searchRegion('<img\s', '>')
if !zencoding#util#regionIsValid(img_region) || !zencoding#util#cursorInRegion(img_region)
return
endif
let content = zencoding#util#getContent(img_region)
if content !~ '^<img[^><]\+>$'
return
endif
let current = zencoding#lang#html#parseTag(content)
if empty(current) || !has_key(current.attr, 'src')
return
endif
let fn = current.attr.src
if fn =~ '^\s*$'
return
elseif fn !~ '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let [width, height] = zencoding#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let current.attr.width = width
let current.attr.height = height
let html = substitute(zencoding#toString(current, 'html', 1), '\n', '', '')
call zencoding#util#setContent(img_region, html)
endfunction
function! zencoding#lang#html#encodeImage()
let img_region = zencoding#util#searchRegion('<img\s', '>')
if !zencoding#util#regionIsValid(img_region) || !zencoding#util#cursorInRegion(img_region)
return
endif
let content = zencoding#util#getContent(img_region)
if content !~ '^<img[^><]\+>$'
return
endif
let current = zencoding#lang#html#parseTag(content)
if empty(current) || !has_key(current.attr, 'src')
return
endif
let fn = current.attr.src
if fn !~ '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
let [width, height] = zencoding#util#getImageSize(fn)
if width == -1 && height == -1
return
endif
let current.attr.width = width
let current.attr.height = height
let html = zencoding#toString(current, 'html', 1)
call zencoding#util#setContent(img_region, html)
endfunction
function! zencoding#lang#html#parseTag(tag)
let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0 }
let mx = '<\([a-zA-Z][a-zA-Z0-9]*\)\(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\(/\{0,1}\)>'
let match = matchstr(a:tag, mx)
let current.name = substitute(match, mx, '\1', 'i')
let attrs = substitute(match, mx, '\2', 'i')
let mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(attrs) > 0
let match = matchstr(attrs, mx)
if len(match) == 0
break
endif
let attr_match = matchlist(match, mx)
let name = attr_match[1]
let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let current.attr[name] = value
let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile
return current
endfunction
function! zencoding#lang#html#toggleComment()
let orgpos = getpos('.')
let curpos = getpos('.')
let mx = '<\%#[^>]*>'
while 1
let block = zencoding#util#searchRegion('<!--', '-->')
if zencoding#util#regionIsValid(block)
let block[1][1] += 2
let content = zencoding#util#getContent(block)
let content = substitute(content, '^<!--\s\(.*\)\s-->$', '\1', '')
call zencoding#util#setContent(block, content)
silent! call setpos('.', orgpos)
return
endif
let block = zencoding#util#searchRegion('<[^>]', '>')
if !zencoding#util#regionIsValid(block)
let pos1 = searchpos('<', 'bcW')
if pos1[0] == 0 && pos1[1] == 0
return
endif
let curpos = getpos('.')
continue
endif
let pos1 = block[0]
let pos2 = block[1]
let content = zencoding#util#getContent(block)
let tag_name = matchstr(content, '^<\zs/\{0,1}[^ \r\n>]\+')
if tag_name[0] == '/'
call setpos('.', [0, pos1[0], pos1[1], 0])
let pos2 = searchpairpos('<'. tag_name[1:] . '>', '', '</' . tag_name[1:] . '>', 'bnW')
let pos1 = searchpos('>', 'cneW')
let block = [pos2, pos1]
elseif tag_name =~ '/$'
if !zencoding#util#pointInRegion(orgpos[1:2], block)
" it's broken tree
call setpos('.', orgpos)
let block = zencoding#util#searchRegion('>', '<')
let content = '><!-- ' . zencoding#util#getContent(block)[1:-2] . ' --><'
call zencoding#util#setContent(block, content)
silent! call setpos('.', orgpos)
return
endif
else
call setpos('.', [0, pos2[0], pos2[1], 0])
let pos2 = searchpairpos('<'. tag_name . '>', '', '</' . tag_name . '>', 'nW')
call setpos('.', [0, pos2[0], pos2[1], 0])
let pos2 = searchpos('>', 'cneW')
let block = [pos1, pos2]
endif
if !zencoding#util#regionIsValid(block)
silent! call setpos('.', orgpos)
return
endif
if zencoding#util#pointInRegion(curpos[1:2], block)
let content = '<!-- ' . zencoding#util#getContent(block) . ' -->'
call zencoding#util#setContent(block, content)
silent! call setpos('.', orgpos)
return
endif
endwhile
endfunction
function! zencoding#lang#html#balanceTag(flag) range
let vblock = zencoding#util#getVisualBlock()
if a:flag == -2 || a:flag == 2
let curpos = [0, line("'<"), col("'<"), 0]
else
let curpos = getpos('.')
endif
let settings = zencoding#getSettings()
if a:flag > 0
while 1
let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
let pos1 = searchpos(mx, 'bW')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
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
let block = [pos1, pos2]
if pos1[0] == 0 && pos1[1] == 0
break
endif
if zencoding#util#pointInRegion(curpos[1:2], block) && zencoding#util#regionIsValid(block)
call zencoding#util#selectRegion(block)
return
endif
endwhile
else
while 1
let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
let pos1 = searchpos(mx, 'W')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
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
let block = [pos1, pos2]
if pos1[0] == 0 && pos1[1] == 0
break
endif
if zencoding#util#regionIsValid(block)
call zencoding#util#selectRegion(block)
return
endif
endwhile
endif
if a:flag == -2 || a:flag == 2
silent! exe "normal! gv"
else
call setpos('.', curpos)
endif
endfunction
function! zencoding#lang#html#moveNextPrev(flag)
let pos = search('\%(</\w\+\)\@<!\zs><\/\|\(""\)\|^\(\s*\)$', a:flag ? 'Wpb' : 'Wp')
if pos == 3
startinsert!
elseif pos != 0
silent! normal! l
startinsert
endif
endfunction
function! zencoding#lang#html#splitJoinTag()
let curpos = getpos('.')
while 1
let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
let pos1 = searchpos(mx, 'bcnW')
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 block = [pos1, [pos1[0], pos1[1] + len(content) - 1]]
if content[-2:] == '/>' && zencoding#util#cursorInRegion(block)
let content = content[:-3] . "></" . tag_name . '>'
call zencoding#util#setContent(block, content)
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
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 = searchpos('</' . tag_name[1:] . '>', 'cneW')
else
let pos2 = searchpos('</' . tag_name . '>', 'cneW')
endif
let block = [pos1, pos2]
let content = zencoding#util#getContent(block)
if zencoding#util#pointInRegion(curpos[1:2], block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>'
let content = matchstr(content, mx)[:-2] . '/>'
call zencoding#util#setContent(block, content)
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
if block[0][0] > 0
call setpos('.', [0, block[0][0]-1, block[0][1], 0])
else
call setpos('.', curpos)
return
endif
endif
endif
endwhile
endfunction
function! zencoding#lang#html#removeTag()
let curpos = getpos('.')
while 1
let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>'
let pos1 = searchpos(mx, 'bcnW')
let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx)
let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z0-9:_\-]*\).*$', '\1', '')
let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]]
if content[-2:] == '/>' && zencoding#util#cursorInRegion(block)
call zencoding#util#setContent(block, '')
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
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 = searchpos('</' . tag_name[1:] . '>', 'cneW')
else
let pos2 = searchpos('</' . tag_name . '>', 'cneW')
endif
let block = [pos1, pos2]
let content = zencoding#util#getContent(block)
if zencoding#util#pointInRegion(curpos[1:2], block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>'
call zencoding#util#setContent(block, '')
call setpos('.', [0, block[0][0], block[0][1], 0])
return
else
if block[0][0] > 0
call setpos('.', [0, block[0][0]-1, block[0][1], 0])
else
call setpos('.', curpos)
return
endif
endif
endif
endwhile
endfunction

View File

@@ -1,47 +1,48 @@
*zencoding.txt* ZenCoding for Vim
*emmet.txt* Emmet for Vim
-------------------------------------------------------
ZenCoding: vim plugins for HTML and CSS hi-speed coding
Emmet: vim plugins for HTML and CSS hi-speed coding
-------------------------------------------------------
Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
WebSite: http://mattn.kaoriya.net/
Repository: http://github.com/mattn/zencoding-vim
Site: http://mattn.github.com/zencoding-vim
Repository: http://github.com/mattn/emmet-vim
Site: http://mattn.github.com/emmet-vim
License: BSD style license
==============================================================================
CONTENTS *zencoding-contents*
CONTENTS *emmet-contents*
Introduction |zencoding-introduction|
Install |zencoding-install|
Tutorial |zencoding-tutorial|
1. Expand Abbreviation |zencoding-expandabbr|
2. Wrap with Abbreviation |zencoding-wrap-wtih-abbreviation|
3. Balance Tag Inward |zencoding-balance-tag-inward|
4. Balance Tag Outward |zencoding-balance-tag-outward|
5. Go to Next Edit Point |zencoding-goto-next-point| |<C-Y>n|
6. Go to Previous Edit Point |zencoding-goto-previous-point|
7. Update <img> Size |zencoding-update-image-size|
8. Merge Lines |zencoding-merge-lines|
9. Remove Tag |zencoding-remove-tag|
10. Split/Join Tag |zencoding-split-join-tag|
11. Toggle Comment |zencoding-toggle-comment|
12. Make anchor from URL |zencoding-make-anchor-url|
13. Make quoted text from URL |zencoding-quoted-text-url|
14. Code Pretty |zencoding-code-pretty|
Customize |zencoding-customize|
1. Key Mappings |zencoding-customize-keymappings|
2. Indent Size |zencoding-indent-size|
3. Define Tag's Behavior |zencoding-define-tags-behavior|
4. Complete Tag |zencoding-complete-tag|
Links |zencoding-links|
ToDo |zencoding-todo|
Introduction |emmet-introduction|
Install |emmet-install|
Tutorial |emmet-tutorial|
1. Expand Abbreviation |emmet-expandabbr|
2. Wrap with Abbreviation |emmet-wrap-with-abbreviation|
3. Balance Tag Inward |emmet-balance-tag-inward|
4. Balance Tag Outward |emmet-balance-tag-outward|
5. Go to Next Edit Point |emmet-goto-next-point| |<C-Y>n|
6. Go to Previous Edit Point |emmet-goto-previous-point|
7. Update <img> Size |emmet-update-image-size|
8. Merge Lines |emmet-merge-lines|
9. Remove Tag |emmet-remove-tag|
10. Split/Join Tag |emmet-split-join-tag|
11. Toggle Comment |emmet-toggle-comment|
12. Make anchor from URL |emmet-make-anchor-url|
13. Make quoted text from URL |emmet-quoted-text-url|
14. Code Pretty |emmet-code-pretty|
15. Lorem Ipsum |emmet-lorem-ipsum|
Customize |emmet-customize|
1. Key Mappings |emmet-customize-keymappings|
2. Indent Size |emmet-indent-size|
3. Define Tag's Behavior |emmet-define-tags-behavior|
4. Complete Tag |emmet-complete-tag|
Links |emmet-links|
ToDo |emmet-todo|
==============================================================================
INTRODUCTION *zencoding-introduction* *zencoding*
INTRODUCTION *emmet-introduction* *emmet*
|ZenCoding| is an editor plugin for high-speed HTML, XML, XSL (or any other
|Emmet| is an editor plugin for high-speed HTML, XML, XSL (or any other
structured code format) coding and editing. The core of this plugin is a
powerful abbreviation engine which allows you to expand expressions?similar to
CSS selectors?into HTML code:
@@ -61,15 +62,15 @@ CSS selectors?into HTML code:
</ul>
</div>
<
Read more about current Zen Coding syntax
http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn
Read more about current Emmet syntax
http://docs.emmet.io/abbreviations/
Abbreviation engine has a modular structure which allows you to expand
abbreviations into different languages. Zen Coding currently supports CSS,
abbreviations into different languages. Emmet currently supports CSS,
HTML, XML/XSL and HAML, Slim languages via filters.
==============================================================================
INSTALL *zencoding-install*
INSTALL *emmet-install*
Install the distributed files into Vim runtime directory which is usually
~/.vim/, or $HOME/vimfiles on Windows.
@@ -78,13 +79,13 @@ If you install pathogen that provided from Tim Pope, you should extract the
file into 'bundle' directory.
==============================================================================
TUTORIAL *zencoding-tutorial*
TUTORIAL *emmet-tutorial*
If you are seeing this file as :help, then you can't edit this file.
You should copy this section and create new buffer, paste and write as
'zencoding-tutor.txt'. Formally, open the file to start tutorial.
'emmet-tutor.txt'. Formally, open the file to start tutorial.
1. Expand Abbreviation *zencoding-expandabbr* *<C-Y>,*
1. Expand Abbreviation *emmet-expandabbr* *<C-Y>,*
Type abbreviation as 'div>p#foo$*3>a' and type |<C-Y>,|.
>
@@ -100,7 +101,7 @@ You should copy this section and create new buffer, paste and write as
</p>
</div>
<
2. Wrap with Abbreviation *zencoding-wrap-wtih-abbreviation* *v_<C-Y>,*
2. Wrap with Abbreviation *emmet-wrap-with-abbreviation* *v_<C-Y>,*
Write as below.
>
@@ -108,7 +109,7 @@ You should copy this section and create new buffer, paste and write as
test2
test3
<
Then do visual select(line wize) and type |<C-Y>,|.
Then do visual select(line wise) and type |<C-Y>,|.
If you request 'Tag:', then type 'ul>li*'.
>
<ul>
@@ -125,7 +126,7 @@ You should copy this section and create new buffer, paste and write as
test3
</blockquote>
<
3. Balance Tag Inward *zencoding-balance-tag-inward* *<C-Y>d*
3. Balance Tag Inward *emmet-balance-tag-inward* *<C-Y>d*
To select inward of ul tag, type |<C-Y>d| in insert mode.
>
@@ -138,7 +139,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 first of <li>, it select <li class="list1"></li>.
4. Balance Tag Outward *zencoding-balance-tag-outward* *<C-Y>D*
4. Balance Tag Outward *emmet-balance-tag-outward* *<C-Y>D*
To select outward of ul tag, insert mode, type <C-Y>D in insert mode.
>
@@ -152,28 +153,28 @@ You should copy this section and create new buffer, paste and write as
letter of </ul>.
If cursor is at first of <li>, it select <li class="list1"></li>.
5. Go to Next Edit Point *zencoding-goto-next-point* *<C-Y>n*
5. 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.
>
* <div id="foo" class="">foo</div>
<div id="bar" class="bar"></li>
<div id="bar" class="bar"></div>
<
If cursor is at '*', |<C-Y>n| move a cursor into attribute value of div
specified id as 'foo'. And type again |<C-Y>n| move a cursor into inner of
div specified id as 'bar'.
6. Go to Previous Edit Point *zencoding-goto-previous-point* *<C-Y>N*
6. 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.
>
<div id="foo" class="">foo</div>
<div id="bar" class="bar"></li> *
<div id="bar" class="bar"></div> *
<
If cursor is at '*', |<C-Y>N| move a cursor into div specified id as 'bar'.
And type again |<C-Y>N| move a cursor into attribute value of 'foo'.
7. Update <img> Size *zencoding-update-image-size* *<C-Y>i*
7. Update <img> Size *emmet-update-image-size* *<C-Y>i*
To expand or update size of image, type |<C-Y>i| on img tag
>
@@ -187,7 +188,7 @@ You should copy this section and create new buffer, paste and write as
>
<img src="foo-48.png" width="32" height="48" />
<
8. Merge Lines *zencoding-merge-lines*
8. Merge Lines *emmet-merge-lines*
To join multi line text like following, type |J|.
>
@@ -204,7 +205,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>
</ul>
<
9. Remove Tag *zencoding-remove-tag* *<C-Y>k*
9. Remove Tag *emmet-remove-tag* *<C-Y>k*
To remove tag in the block, type |<C-Y>k|.
>
@@ -220,7 +221,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.
10. Split/Join Tag *zencoding-split-join-tag* *<C-Y>j*
10. Split/Join Tag *emmet-split-join-tag* *<C-Y>j*
To join block, type |<C-Y>j|.
>
@@ -228,7 +229,7 @@ You should copy this section and create new buffer, paste and write as
cursor is here
</div>
<
Type |<C-Y>j| in insert mode. then,
Type |<C-Y>j| in insert mode. Then,
>
<div class="foo"/>
<
@@ -237,7 +238,7 @@ You should copy this section and create new buffer, paste and write as
<div class="foo">
</div>
<
11. Toggle Comment *zencoding-toggle-comment* *<C-Y>/*
11. Toggle Comment *emmet-toggle-comment* *<C-Y>/*
Move cursor to block
>
@@ -257,7 +258,7 @@ You should copy this section and create new buffer, paste and write as
hello world
</div>
<
12. Make anchor from URL *zencoding-make-anchor-url* *<C-Y>a*
12. Make anchor from URL *emmet-make-anchor-url* *<C-Y>a*
Move cursor to URL
>
@@ -267,7 +268,7 @@ You should copy this section and create new buffer, paste and write as
>
<a href="http://www.google.com/">Google</a>
<
13. Make quoted text from URL *zencoding-quoted-text-url* *<C-Y>A*
13. Make quoted text from URL *emmet-quoted-text-url* *<C-Y>A*
Move cursor to URL
>
@@ -281,7 +282,7 @@ You should copy this section and create new buffer, paste and write as
<cite>http://github.com/</cite>
</blockquote>
<
14. Code Pretty *zencoding-code-pretty* *<C-Y>c*
14. Code Pretty *emmet-code-pretty* *<C-Y>c*
Select code block, for example select following code from "int main()".
>
@@ -293,42 +294,90 @@ You should copy this section and create new buffer, paste and write as
<
Type |<C-Y>c|
>
<p>Writing in C language</p>
<span class="Type">int</span>&nbsp;main() {<br />
&nbsp;&nbsp;puts(<span class="Constant">&quot;hello world&quot;</span>);<br />
}<br />
<
==============================================================================
CUSTOMIZE *zencoding-customize*
15. Lorem Ipsum *emmet-lorem-ipsum*
1. Key Mapping *zencoding-customize-keymappings*
To insert dummy text.
>
lorem
<
Type |<C-Y>,|
>
<div>Adipisicing asperiores deleniti ipsum fuga deserunt perferendis
molestiae sunt excepturi aut quo nihil! Optio accusantium corporis molestiae
deserunt ab, veritatis commodi. Eius nobis ab deserunt magni iure quo
laboriosam laboriosam.</div>
<
For japanese user, put like follow into your g:user_emmet_settings:
>
let g:user_emmet_settings = {
...
\ 'custom_expands1' : {
\ '^\%(lorem\|lipsum\)\(\d*\)$' : function('emmet#lorem#ja#expand'),
\ },
...
<
You will get japanese dummy text.
>
==============================================================================
CUSTOMIZE *emmet-customize*
1. Key Mapping *emmet-customize-keymappings*
To specify leading key for expanding or balance tag, or for all,
Add this line in your vimrc: >
>
let g:user_zen_leader_key = '<c-y>'
let g:user_emmet_leader_key = '<c-y>'
<
Or if you prefer to map for each actions, then you set each variables.
Note that a trailing ',' must be entered, so the resultant keymap is
'<c-y>,'.
'user_zen_expandabbr_key'
'user_zen_expandword_key'
'user_zen_balancetaginward_key'
'user_zen_balancetagoutward_key'
'user_zen_next_key'
'user_zen_prev_key'
'user_zen_imagesize_key'
'user_zen_togglecomment_key'
'user_zen_splitjointag_key'
'user_zen_removetag_key'
'user_zen_anchorizeurl_key'
'user_zen_anchorizesummary_key'
If you prefer to map for each actions, then you set each variables.
2. Indent Size *zencoding-indent-size*
'user_emmet_expandabbr_key'
'user_emmet_expandword_key'
'user_emmet_balancetaginward_key'
'user_emmet_balancetagoutward_key'
'user_emmet_next_key'
'user_emmet_prev_key'
'user_emmet_imagesize_key'
'user_emmet_togglecomment_key'
'user_emmet_splitjointag_key'
'user_emmet_removetag_key'
'user_emmet_anchorizeurl_key'
'user_emmet_anchorizesummary_key'
Or if you want to use <plug> mappings
emmet-expand-abbr
emmet-expand-word
emmet-balance-tag-inward
emmet-balance-tag-outward
emmet-move-next
emmet-move-prev
emmet-image-size
emmet-toggle-comment
emmet-split-join-tag
emmet-remove-tag
emmet-anchorize-url
emmet-anchorize-summary
emmet-merge-lines
emmet-code-pretty
So you can make the mapping affected only for a filetype you want.
>
autocmd FileType css imap <tab> <plug>(emmet-expand-abbr)
<
2. Indent Size *emmet-indent-size*
To change indent size of html, add this code in your vimrc.
>
let g:user_zen_settings = {
let g:user_emmet_settings = {
\ 'html' : {
\ 'indentation' : ' '
\ },
@@ -336,17 +385,17 @@ CUSTOMIZE *zencoding-customize*
<
If you prefer to change global indent size then add this.
>
let g:user_zen_settings = {
let g:user_emmet_settings = {
\ 'indentation' : ' '
\}
<
3. Define Tag's Behavior *zencoding-define-tags-behavior*
3. Define Tag's Behavior *emmet-define-tags-behavior*
zencoding.vim can change behavior of expanding abbreviation for each
filetypes as |Dictionary|. for details, see official site of zencoding.
Emmet.vim can change behavior of expanding abbreviation for each
filetypes as |Dictionary|. For details, see official site of Emmet.
for example, vimmer can add following.
>
let g:user_zen_settings = {
let g:user_emmet_settings = {
\ 'lang' : 'ja',
\ 'html' : {
\ 'filters' : 'html',
@@ -371,8 +420,8 @@ CUSTOMIZE *zencoding-customize*
\ },
\ 'javascript' : {
\ 'snippets' : {
\ 'jq' : "$(function() {\n\t${cursor}${child}\n});",
\ 'jq:each' : "$.each(arr, function(index, item)\n\t${child}\n});",
\ 'jq' : "\\$(function() {\n\t${cursor}${child}\n});",
\ 'jq:each' : "\\$.each(arr, function(index, item)\n\t${child}\n});",
\ 'fn' : "(function() {\n\t${cursor}\n})();",
\ 'tm' : "setTimeout(function() {\n\t${cursor}\n}, 100);",
\ },
@@ -387,14 +436,46 @@ CUSTOMIZE *zencoding-customize*
\ },
\}
<
4. Complete Tag *zencoding-complete-tag*
4. Complete Tag *emmet-complete-tag*
If you want to complete tags using |omnifunc| then add this.
>
let g:use_zen_complete_tag = 1
let g:use_emmet_complete_tag = 1
<
5. Enable functions in different mode
If you want to use Emmet only in some modes, set an mode option:
let g:user_emmet_mode='n' "only enable normal mode functions, or
let g:user_emmet_mode='inv' "enable all functions, which is equal to
let g:user_emmet_mode='a' "enable all function in all mode.
6. Adding custom snippets
If you have installed the |webapi|(https://github.com/mattn/webapi-vim) for
|emmet| you can also add your own snippets using a custom "snippets.json" file.
Once you have installed the |webapi| add this line to your 'vimrc':
>
let g:user_emmet_settings = webapi#json#decode(
\ join(readfile(expand('~/.snippets_custom.json')), "\n"))
<
You can change the path to your snippets_custom.json according to your
preferences.
See http://docs.emmet.io/customization/snippets/
You can find instructions about creating your customized snippets.json file.
==============================================================================
LINKS *zencoding-links*
LINKS *emmet-links*
Emmet official site:
http://emmet.io/
zen-coding official site:
http://code.google.com/p/zen-coding/
zen-coding official site:
http://code.google.com/p/zen-coding/
@@ -409,21 +490,21 @@ my blog posts about zencoding-vim:
http://mattn.kaoriya.net/software/vim/20100222103327.htm
http://mattn.kaoriya.net/software/vim/20100306021632.htm
japanese blog posts about zencoding-vim:
Japanese blog posts about zencoding-vim:
http://d.hatena.ne.jp/idesaku/20100424/1272092255
http://d.hatena.ne.jp/griefworker/20110118/vim_zen_coding
http://d.hatena.ne.jp/sakurako_s/20110126/1295988873
http://looxu.blogspot.jp/2010/02/zencodingvimhtml.html
tutorial traslated in chinese:
tutorial translated in Chinese:
http://www.zfanw.com/blog/zencoding-vim-tutorial-chinese.html
==============================================================================
TODO *zencoding-todo*
TODO *emmet-todo*
* wrapping inline selected.
* more documents.
* more contributor.
* more time to improve zencodig.vim.
* more time to improve emmet.vim.
==============================================================================
vim:tw=78:ts=8:ft=help:norl:noet:fen:fdl=0:

View File

@@ -1,21 +1,21 @@
script_name: ZenCoding.vim
script_name: Emmet.vim
script_id: '2981'
script_type: utility
script_package: zencoding-vim.zip
script_version: '0.80'
script_package: emmet-vim.zip
script_version: '0.85'
required_vim_version: '7.0'
summary: vim plugins for HTML and CSS hi-speed coding.
detailed_description: |
This is vim script support expanding abbreviation like zen-coding.
ref: http://code.google.com/p/zen-coding/
This is vim script support expanding abbreviation like emmet.
ref: http://emmet.io/
There is a movie using zencoding.vim
ref: http://mattn.github.com/zencoding-vim
There is a movie using emmet.vim
ref: http://mattn.github.com/emmet-vim
Source Repository.
ref: http://github.com/mattn/zencoding-vim
ref: http://github.com/mattn/emmet-vim
Type abbreviation
+-------------------------------------
@@ -52,18 +52,18 @@ detailed_description: |
Tutorial:
http://github.com/mattn/zencoding-vim/raw/master/TUTORIAL
http://github.com/mattn/emmet-vim/raw/master/TUTORIAL
How work this:
http://mattn.github.com/zencoding-vim
http://mattn.github.com/emmet-vim
Tips:
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_zen_settings = {
let g:user_emmet_settings = {
\ 'indentation' : ' ',
\ 'perl' : {
\ 'aliases' : {
@@ -76,28 +76,38 @@ detailed_description: |
\ }
\}
let g:user_zen_expandabbr_key = '<c-e>'
let g:user_emmet_expandabbr_key = '<c-e>'
let g:use_zen_complete_tag = 1
let g:use_emmet_complete_tag = 1
You can set language attribute in html using zen_settings['lang'].
You can set language attribute in html using emmet_settings['lang'].
install_details: |
# cd ~/.vim
# unzip zencoding-vim.zip
# unzip emmet-vim.zip
or if you install pathogen.vim:
# cd ~/.vim/bundle # or make directory
# unzip /path/to/zencoding-vim.zip
# unzip /path/to/emmet-vim.zip
if you get sources from repository:
# cd ~/.vim/bundle # or make directory
# git clone http://github.com/mattn/zencoding-vim.git
# git clone http://github.com/mattn/emmet-vim.git
versions:
- '0.85': |
This is an upgrade for Emmet.vim: lot of bug fixes.
- '0.84': |
This is an upgrade for Emmet.vim: lot of bug fixes. fix bug that interpose insert completion plugins.
- '0.83': |
This is an upgrade for Emmet.vim: lot of bug fixes.
- '0.82': |
This is an upgrade for Emmet.vim: many bug fixes.
- '0.81': |
Release of Emmet.vim: renamed from ZenCoding.vim.
- '0.80': |
This is an upgrade for ZenCoding.vim: add emmet features.
- '0.74': |

166
plugin/emmet.vim Normal file
View File

@@ -0,0 +1,166 @@
"=============================================================================
" File: emmet.vim
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
" Last Change: 17-Dec-2014.
" Version: 0.85
" WebPage: http://github.com/mattn/emmet-vim
" Description: vim plugins for HTML and CSS hi-speed coding.
" SeeAlso: http://emmet.io/
" Usage:
"
" This is vim script support expanding abbreviation like emmet.
" ref: http://emmet.io/
"
" Type abbreviation
" +-------------------------------------
" | html:5_
" +-------------------------------------
" "_" is a cursor position. and type "<c-y>," (Ctrl+y and Comma)
" NOTE: Don't worry about key map. you can change it easily.
" +-------------------------------------
" | <!DOCTYPE HTML>
" | <html lang="en">
" | <head>
" | <title></title>
" | <meta charset="UTF-8">
" | </head>
" | <body>
" | _
" | </body>
" | </html>
" +-------------------------------------
" Type following
" +-------------------------------------
" | div#foo$*2>div.bar
" +-------------------------------------
" And type "<c-y>,"
" +-------------------------------------
" |<div id="foo1">
" | <div class="bar">_</div>
" |</div>
" |<div id="foo2">
" | <div class="bar"></div>
" |</div>
" +-------------------------------------
"
" Tips:
"
" You can customize behavior of expanding with overriding config.
" This configuration will be marged at loading plugin.
"
" let g:user_emmet_settings = {
" \ 'indentation' : ' ',
" \ 'perl' : {
" \ 'aliases' : {
" \ 'req' : 'require '
" \ },
" \ 'snippets' : {
" \ 'use' : "use strict\nuse warnings\n\n",
" \ 'warn' : "warn \"|\";",
" \ }
" \ }
" \}
"
" You can set language attribute in html using 'emmet_settings.lang'.
"
" GetLatestVimScripts: 2981 1 :AutoInstall: emmet.vim
" script type: plugin
if &compatible || v:version < 702 || (exists('g:loaded_emmet_vim') && g:loaded_emmet_vim)
finish
endif
let g:loaded_emmet_vim = 1
let s:save_cpo = &cpoptions
set cpoptions&vim
if !exists('g:emmet_html5')
let g:emmet_html5 = 1
endif
if !exists('g:emmet_docroot')
let g:emmet_docroot = {}
endif
if !exists('g:emmet_debug')
let g:emmet_debug = 0
endif
if !exists('g:emmet_curl_command')
let g:emmet_curl_command = 'curl -s -L -A Mozilla/5.0'
endif
if exists('g:user_emmet_complete_tag') && g:user_emmet_complete_tag
setlocal omnifunc=emmet#completeTag
endif
if !exists('g:user_emmet_leader_key')
let g:user_emmet_leader_key = '<c-y>'
endif
function! s:install_plugin(mode, buffer)
let buffer = a:buffer ? '<buffer>' : ''
let items = [
\ {'mode': 'i', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#expandAbbr(0,"")<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(3,"")<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(2,"")<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_expandword_key', 'key': ';', 'plug': 'emmet-expand-word', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#expandAbbr(1,"")<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_expandword_key', 'key': ';', 'plug': 'emmet-expand-word', 'func': ':call emmet#expandAbbr(1,"")<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_update_tag', 'key': 'u', 'plug': 'emmet-update-tag', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=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': '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': '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': 'v', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': ':call emmet#balanceTag(-2)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': '<esc>: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': 'n', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': ':call emmet#moveNextPrev(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': 'n', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': ':call emmet#imageSize()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toogle-comment', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#toggleComment()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toogle-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': 'n', 'var': 'user_emmet_splitjointag_key', 'key': 'j', 'plug': 'emmet-split-join-tag', 'func': ':call emmet#splitJoinTag()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_removetag_key', 'key': 'k', 'plug': 'emmet-remove-tag', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#removeTag()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_removetag_key', 'key': 'k', 'plug': 'emmet-remove-tag', 'func': ':call emmet#removeTag()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_anchorizeurl_key', 'key': 'a', 'plug': 'emmet-anchorize-url', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=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': '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': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'},
\]
for item in items
if a:mode !=# 'a' && stridx(a:mode, item.mode) == -1
continue
endif
exe item.mode . 'noremap '. buffer .' <plug>(' . item.plug . ') ' . item.func
if exists('g:' . item.var)
let key = eval('g:' . item.var)
else
let key = g:user_emmet_leader_key . item.key
endif
if !hasmapto('<plug>(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode))
exe item.mode . 'map ' . buffer . ' <unique> ' . key . ' <plug>(' . item.plug . ')'
endif
endfor
endfunction
command! -nargs=0 EmmetInstall call <SID>install_plugin(get(g:, 'user_emmet_mode', 'a'), 1)
if get(g:, 'user_emmet_install_global', 1)
call s:install_plugin(get(g:, 'user_emmet_mode', 'a'), 0)
endif
if get(g:, 'user_emmet_install_command', 1)
command! -nargs=1 Emmet call emmet#expandAbbr(4, <q-args>)
endif
let &cpoptions = s:save_cpo
unlet s:save_cpo
" vim:set et:

View File

@@ -1,149 +0,0 @@
"=============================================================================
" File: zencoding.vim
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
" Last Change: 02-Nov-2012.
" Version: 0.80
" WebPage: http://github.com/mattn/zencoding-vim
" Description: vim plugins for HTML and CSS hi-speed coding.
" SeeAlso: http://code.google.com/p/zen-coding/
" Usage:
"
" This is vim script support expanding abbreviation like zen-coding.
" ref: http://code.google.com/p/zen-coding/
"
" Type abbreviation
" +-------------------------------------
" | html:5_
" +-------------------------------------
" "_" is a cursor position. and type "<c-y>," (Ctrl+y and Comma)
" NOTE: Don't worry about key map. you can change it easily.
" +-------------------------------------
" | <!DOCTYPE HTML>
" | <html lang="en">
" | <head>
" | <title></title>
" | <meta charset="UTF-8">
" | </head>
" | <body>
" | _
" | </body>
" | </html>
" +-------------------------------------
" Type following
" +-------------------------------------
" | div#foo$*2>div.bar
" +-------------------------------------
" And type "<c-y>,"
" +-------------------------------------
" |<div id="foo1">
" | <div class="bar">_</div>
" |</div>
" |<div id="foo2">
" | <div class="bar"></div>
" |</div>
" +-------------------------------------
"
" Tips:
"
" You can customize behavior of expanding with overriding config.
" This configuration will be marged at loading plugin.
"
" let g:user_zen_settings = {
" \ 'indentation' : ' ',
" \ 'perl' : {
" \ 'aliases' : {
" \ 'req' : 'require '
" \ },
" \ 'snippets' : {
" \ 'use' : "use strict\nuse warnings\n\n",
" \ 'warn' : "warn \"|\";",
" \ }
" \ }
" \}
"
" You can set language attribute in html using 'zen_settings.lang'.
"
" GetLatestVimScripts: 2981 1 :AutoInstall: zencoding.vim
" script type: plugin
if &cp || (exists('g:loaded_zencoding_vim') && g:loaded_zencoding_vim)
finish
endif
let g:loaded_zencoding_vim = 1
let s:save_cpo = &cpo
set cpo&vim
if !exists('g:zencoding_debug')
let g:zencoding_debug = 0
endif
if !exists('g:zencoding_curl_command')
let g:zencoding_curl_command = 'curl -s -L -A Mozilla/5.0'
endif
if exists('g:use_zen_complete_tag') && g:use_zen_complete_tag
setlocal omnifunc=zencoding#CompleteTag
endif
if !exists('g:user_zen_leader_key')
let g:user_zen_leader_key = '<c-y>'
endif
function! s:install_plugin()
for item in [
\ {'mode': 'i', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandAbbr', 'func': '<c-g>u<esc>:call zencoding#expandAbbr(0,"")<cr>a'},
\ {'mode': 'v', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandVisual', 'func': ':call zencoding#expandAbbr(2,"")<cr>'},
\ {'mode': 'n', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandNormal', 'func': ':call zencoding#expandAbbr(3,"")<cr>'},
\ {'mode': 'i', 'var': 'user_zen_expandword_key', 'key': ';', 'plug': 'ZenCodingExpandWord', 'func': '<c-g>u<esc>:call zencoding#expandAbbr(1,"")<cr>a'},
\ {'mode': 'n', 'var': 'user_zen_expandword_key', 'key': ',', 'plug': 'ZenCodingExpandWord', 'func': ':call zencoding#expandAbbr(1,"")<cr>'},
\ {'mode': 'i', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardInsert', 'func': '<esc>:call zencoding#balanceTag(1)<cr>'},
\ {'mode': 'n', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardNormal', 'func': ':call zencoding#balanceTag(1)<cr>'},
\ {'mode': 'v', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardVisual', 'func': ':call zencoding#balanceTag(2)<cr>'},
\ {'mode': 'i', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardInsert', 'func': '<esc>:call zencoding#balanceTag(-1)<cr>'},
\ {'mode': 'n', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardNormal', 'func': ':call zencoding#balanceTag(-1)<cr>'},
\ {'mode': 'v', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardVisual', 'func': ':call zencoding#balanceTag(-2)<cr>'},
\ {'mode': 'i', 'var': 'user_zen_next_key', 'key': 'n', 'plug': 'ZenCodingNext', 'func': '<esc>:call zencoding#moveNextPrev(0)<cr>'},
\ {'mode': 'n', 'var': 'user_zen_next_key', 'key': 'n', 'plug': 'ZenCodingNext', 'func': ':call zencoding#moveNextPrev(0)<cr>'},
\ {'mode': 'i', 'var': 'user_zen_prev_key', 'key': 'N', 'plug': 'ZenCodingPrev', 'func': '<esc>:call zencoding#moveNextPrev(1)<cr>'},
\ {'mode': 'n', 'var': 'user_zen_prev_key', 'key': 'N', 'plug': 'ZenCodingPrev', 'func': ':call zencoding#moveNextPrev(1)<cr>'},
\ {'mode': 'i', 'var': 'user_zen_imagesize_key', 'key': 'i', 'plug': 'ZenCodingImageSize', 'func': '<esc>:call zencoding#imageSize()<cr>a'},
\ {'mode': 'n', 'var': 'user_zen_imagesize_key', 'key': 'i', 'plug': 'ZenCodingImageSize', 'func': ':call zencoding#imageSize()<cr>'},
\ {'mode': 'i', 'var': 'user_zen_togglecomment_key', 'key': '/', 'plug': 'ZenCodingToggleComment', 'func': '<esc>:call zencoding#toggleComment()<cr>a'},
\ {'mode': 'n', 'var': 'user_zen_togglecomment_key', 'key': '/', 'plug': 'ZenCodingToggleComment', 'func': ':call zencoding#toggleComment()<cr>'},
\ {'mode': 'v', 'var': 'user_zen_mergelines_key', 'key': 'm', 'plug': 'ZenCodingMergeLines', 'func': ':call zencoding#mergeLines()<cr>'},
\ {'mode': 'i', 'var': 'user_zen_splitjointag_key', 'key': 'j', 'plug': 'ZenCodingSplitJoinTagInsert', 'func': '<esc>:call zencoding#splitJoinTag()<cr>'},
\ {'mode': 'n', 'var': 'user_zen_splitjointag_key', 'key': 'j', 'plug': 'ZenCodingSplitJoinTagNormal', 'func': ':call zencoding#splitJoinTag()<cr>'},
\ {'mode': 'i', 'var': 'user_zen_removetag_key', 'key': 'k', 'plug': 'ZenCodingRemoveTag', 'func': '<esc>:call zencoding#removeTag()<cr>a'},
\ {'mode': 'n', 'var': 'user_zen_removetag_key', 'key': 'k', 'plug': 'ZenCodingRemoveTag', 'func': ':call zencoding#removeTag()<cr>'},
\ {'mode': 'i', 'var': 'user_zen_anchorizeurl_key', 'key': 'a', 'plug': 'ZenCodingAnchorizeURL', 'func': '<esc>:call zencoding#anchorizeURL(0)<cr>a'},
\ {'mode': 'n', 'var': 'user_zen_anchorizeurl_key', 'key': 'a', 'plug': 'ZenCodingAnchorizeURL', 'func': ':call zencoding#anchorizeURL(0)<cr>'},
\ {'mode': 'i', 'var': 'user_zen_anchorizesummary_key', 'key': 'A', 'plug': 'ZenCodingAnchorizeSummary', 'func': '<esc>:call zencoding#anchorizeURL(1)<cr>a'},
\ {'mode': 'n', 'var': 'user_zen_anchorizesummary_key', 'key': 'A', 'plug': 'ZenCodingAnchorizeSummary', 'func': ':call zencoding#anchorizeURL(1)<cr>'},
\ {'mode': 'v', 'var': 'user_zen_codepretty_key', 'key': 'c', 'plug': 'ZenCodingCodePretty', 'func': ':call zencoding#codePretty()<cr>'},
\]
if !hasmapto('<plug>'.item.plug, item.mode)
exe item.mode . 'noremap <plug>' . item.plug . ' ' . item.func
endif
if !exists('g:' . item.var)
endif
if exists('g:' . item.var)
let key = eval('g:' . item.var)
else
let key = g:user_zen_leader_key . item.key
endif
if len(maparg(key, item.mode)) == 0
exe item.mode . 'map <unique> ' . key . ' <plug>' . item.plug
endif
endfor
endfunction
call s:install_plugin()
delfunction s:install_plugin
command! -nargs=1 Zen call zencoding#expandAbbr(4, <q-args>)
let &cpo = s:save_cpo
unlet s:save_cpo
" vim:set et:

View File

@@ -1,28 +1,29 @@
" {{{
let s:sfile = expand('<sfile>')
function! s:reload(d)
exe "so" a:d."/plugin/zencoding.vim"
exe 'so' a:d.'/plugin/emmet.vim'
for f in split(globpath(a:d, 'autoload/**/*.vim'), "\n")
silent! exe "so" f
silent! exe 'so' f
endfor
endfunction
function! s:show_type(type)
echohl Search | echon "[" a:type "]\n" | echohl None
echohl Search | echon '[' a:type "]\n" | echohl None
echo "\r"
endfunction
function! s:show_category(category)
echohl MatchParen | echon "[" a:category "]\n" | echohl None
echohl MatchParen | echon '[' a:category "]\n" | echohl None
echo "\r"
endfunction
function! s:show_pass(pass)
echohl Title | echo "pass".a:pass."\n" | echohl None
echohl Title | echo 'pass'.a:pass."\n" | echohl None
endfunction
function! s:show_done()
echohl IncSearch | echo "done" | echohl None
echohl IncSearch | echo 'done' | echohl None
endfunction
function! s:escape(str)
@@ -35,43 +36,43 @@ endfunction
function! s:show_title(no, title)
let title = s:escape(a:title)
let width = &columns - 23
echohl MoreMsg | echon "\rtesting #".printf("%03d", a:no)
echohl None | echon ": " . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
echohl MoreMsg | echon "\rtesting #".printf('%03d', a:no)
echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
endfunction
function! s:show_skip(no, title)
let title = s:escape(a:title)
let width = &columns - 23
echohl WarningMsg | echon "\rskipped #".printf("%03d", a:no)
echohl None | echon ": " . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
echo ""
echohl WarningMsg | echon "\rskipped #".printf('%03d', a:no)
echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
echo ''
endfunction
function! s:show_ok()
echohl Title | echon "ok\n" | echohl None
echo ""
echo ''
endfunction
function! s:show_ng(no, expect, got)
echohl WarningMsg | echon "ng\n" | echohl None
echohl ErrorMsg | echo "failed test #".a:no | echohl None
echohl ErrorMsg | echo 'failed test #'.a:no | echohl None
set more
echohl WarningMsg | echo printf("expect(%d):", len(a:expect)) | echohl None
echohl WarningMsg | echo printf('expect(%d):', len(a:expect)) | echohl None
echo join(split(a:expect, "\n", 1), "|\n")
echohl WarningMsg | echo printf("got(%d):", len(a:got)) | echohl None
echohl WarningMsg | echo printf('got(%d):', len(a:got)) | echohl None
echo join(split(a:got, "\n", 1), "|\n")
let cs = split(a:expect, '\zs')
for c in range(len(cs))
if c < len(a:got)
if a:expect[c] != a:got[c]
echohl WarningMsg | echo "differ at:" | echohl None
echohl WarningMsg | echo 'differ at:' | echohl None
echo a:expect[c :-1]
break
endif
endif
endfor
echo ""
throw "stop"
echo ''
throw 'stop'
endfunction
function! s:test(...)
@@ -91,14 +92,22 @@ function! s:test(...)
for n in range(len(tests))
if len(index) > 0 && n != index | continue | endif
let query = tests[n].query
let options = has_key(tests[n], 'options') ? tests[n].options : {}
let result = tests[n].result
if has_key(tests[n], 'skip') && tests[n].skip != 0
call s:show_skip(n+1, query)
continue
endif
let oldoptions = {}
for opt in keys(options)
if has_key(g:, opt)
let oldoptions[opt] = get(g:, opt)
endif
let g:[opt] = options[opt]
endfor
if stridx(query, '$$$$') != -1
silent! 1new
silent! exe "setlocal ft=".testgroup.type
silent! exe 'setlocal ft='.testgroup.type
silent! let key = matchstr(query, '.*\$\$\$\$\zs.*\ze\$\$\$\$')
if len(key) > 0
exe printf('let key = "%s"', key)
@@ -117,8 +126,15 @@ function! s:test(...)
call s:show_title(n+1, query)
else
call s:show_title(n+1, query)
unlet! res | let res = zencoding#ExpandWord(query, testgroup.type, 0)
unlet! res | let res = emmet#expandWord(query, testgroup.type, 0)
endif
for opt in keys(options)
if has_key(oldoptions, opt)
let g:[opt] = oldoptions[opt]
else
call remove(g:, opt)
endif
endfor
if stridx(result, '$$$$') != -1
if res ==# result
call s:show_ok()
@@ -140,10 +156,10 @@ endfunction
function! s:do_tests(...)
try
if exists('g:user_zen_settings')
let s:old_user_zen_settings = g:user_zen_settings
let g:user_zen_settings = { 'indentation': "\t" }
if exists('g:user_emmet_settings')
let s:old_user_emmet_settings = g:user_emmet_settings
endif
let g:user_emmet_settings = {'variables': {'indentation': "\t", 'use_selection': 1}}
let oldmore = &more
call s:reload(fnamemodify(s:sfile, ':h'))
let &more = 0
@@ -153,13 +169,13 @@ function! s:do_tests(...)
echohl ErrorMsg | echomsg v:exception | echohl None
finally
let &more=oldmore
if exists('g:user_zen_settings')
let g:user_zen_settings = s:old_user_zen_settings
if exists('s:old_user_emmet_settings')
let g:user_emmet_settings = s:old_user_emmet_settings
endif
endtry
endfunction
function! g:zencoding_unittest_complete(arglead, cmdline, cmdpos)
function! s:emmet_unittest_complete(arglead, cmdline, cmdpos)
let args = split(a:cmdline, '\s\+', 1)
let testgroups = eval(join(filter(split(substitute(join(readfile(s:sfile), "\n"), '.*\nfinish\n', '', ''), '\n', 1), "v:val !~ '^\"'")))
try
@@ -173,14 +189,15 @@ function! g:zencoding_unittest_complete(arglead, cmdline, cmdpos)
return []
endfunction
command! -nargs=* -complete=customlist,g:zencoding_unittest_complete ZenCodingUnitTest call s:do_tests(<f-args>)
command! -nargs=* -complete=customlist,<SID>emmet_unittest_complete EmmetUnitTest call s:do_tests(<f-args>)
if s:sfile == expand('%:p')
ZenCodingUnitTest
EmmetUnitTest
endif
" }}}
finish
[
{
{ 'test-html': "{{{",
'type': "html",
'categories': [
{
@@ -212,7 +229,7 @@ finish
},
{
'query': "div#wrapper.box.current[title=TITLE rel]",
'result': "<div id=\"wrapper\" rel=\"\" class=\"box current\" title=\"TITLE\"></div>\n",
'result': "<div id=\"wrapper\" class=\"box current\" title=\"TITLE\" rel=\"\"></div>\n",
},
{
'query': "div#main+div#sub",
@@ -248,15 +265,15 @@ finish
},
{
'query': "a[href=http://www.google.com/].foo#hoge",
'result': "<a id=\"hoge\" href=\"http://www.google.com/\" class=\"foo\"></a>\n",
'result': "<a id=\"hoge\" class=\"foo\" href=\"http://www.google.com/\"></a>\n",
},
{
'query': "a[href=http://www.google.com/]{Google}",
'result': "<a href=\"http://www.google.com/\">Google</a>\n",
},
{
'query': "{ZenCoding}",
'result': "ZenCoding",
'query': "{Emmet}",
'result': "Emmet",
},
{
'query': "a+b",
@@ -288,15 +305,15 @@ finish
},
{
'query': "a[href=foo][class=bar]",
'result': "<a href=\"foo\" class=\"bar\"></a>\n",
'result': "<a class=\"bar\" href=\"foo\"></a>\n",
},
{
'query': "a[a=b][b=c=d][e]{foo}*2",
'result': "<a a=\"b\" b=\"c=d\" e=\"\" href=\"\">foo</a>\n<a a=\"b\" b=\"c=d\" e=\"\" href=\"\">foo</a>\n",
'result': "<a href=\"e\" a=\"b\" b=\"c=d\">foo</a>\n<a href=\"e\" a=\"b\" b=\"c=d\">foo</a>\n",
},
{
'query': "a[a=b][b=c=d][e]*2{foo}",
'result': "<a a=\"b\" b=\"c=d\" e=\"\" href=\"\"></a>\n<a a=\"b\" b=\"c=d\" e=\"\" href=\"\"></a>\nfoo",
'result': "<a href=\"e\" a=\"b\" b=\"c=d\"></a>\n<a href=\"e\" a=\"b\" b=\"c=d\"></a>\nfoo",
},
{
'query': "a*2{foo}a",
@@ -402,13 +419,17 @@ finish
'query': "div>div#page>p.title+p|c",
'result': "<div>\n\t<!-- #page -->\n\t<div id=\"page\">\n\t\t<!-- .title -->\n\t\t<p class=\"title\"></p>\n\t\t<!-- /.title -->\n\t\t<p></p>\n\t</div>\n\t<!-- /#page -->\n</div>\n",
},
{
'query': "kbd*2|s",
'result': "<kbd></kbd><kbd></kbd>",
},
{
'query': "link:css",
'result': "<link media=\"all\" rel=\"stylesheet\" href=\"style.css\" type=\"text/css\" />\n",
'result': "<link rel=\"stylesheet\" href=\"style.css\" media=\"all\">\n",
},
{
'query': "a[title=\"Hello', world\" rel]",
'result': "<a rel=\"\" href=\"\" title=\"Hello', world\"></a>\n",
'result': "<a href=\"\" title=\"Hello', world\" rel=\"\"></a>\n",
},
{
'query': "div>a#foo{bar}",
@@ -460,7 +481,7 @@ finish
},
{
'query': "(div>(label+input))+div",
'result': "<div>\n\t<label for=\"\"></label>\n\t<input type=\"\" />\n</div>\n<div></div>\n",
'result': "<div>\n\t<label for=\"\"></label>\n\t<input type=\"\">\n</div>\n<div></div>\n",
},
{
'query': "test1\ntest2\ntest3$$$$\\<esc>ggVG\\<c-y>,ul>li>span*>a\\<cr>$$$$",
@@ -468,12 +489,16 @@ finish
},
{
'query': "test1\ntest2\ntest3$$$$\\<esc>ggVG\\<c-y>,input[type=input value=$#]*\\<cr>$$$$",
'result': "<input type=\"input\" value=\"test1\" />\n<input type=\"input\" value=\"test2\" />\n<input type=\"input\" value=\"test3\" />",
'result': "<input type=\"input\" value=\"test1\">\n<input type=\"input\" value=\"test2\">\n<input type=\"input\" value=\"test3\">",
},
{
'query': "div#id-$*5>div#id2-$",
'result': "<div id=\"id-1\">\n\t<div id=\"id2-1\"></div>\n</div>\n<div id=\"id-2\">\n\t<div id=\"id2-2\"></div>\n</div>\n<div id=\"id-3\">\n\t<div id=\"id2-3\"></div>\n</div>\n<div id=\"id-4\">\n\t<div id=\"id2-4\"></div>\n</div>\n<div id=\"id-5\">\n\t<div id=\"id2-5\"></div>\n</div>\n",
},
{
'query': ".foo>[bar=2]>.baz",
'result': "<div class=\"foo\">\n\t<div bar=\"2\">\n\t\t<div class=\"baz\"></div>\n\t</div>\n</div>\n",
},
{
'query': "{test case $ }*3",
'result': "test case 1 test case 2 test case 3 ",
@@ -490,6 +515,22 @@ finish
'query': "{test case $$$ }*3",
'result': "test case 001 test case 002 test case 003 ",
},
{
'query': "a[title=$#]{foo}",
'result': "<a href=\"\" title=\"foo\">foo</a>\n",
},
{
'query': "span.item$*2>{item $}",
'result': "<span class=\"item1\">item 1</span>\n<span class=\"item2\">item 2</span>\n",
},
{
'query': "\t<div class=\"footer_nav\">\n\t\t<a href=\"#\">nav link</a>\n\t</div>$$$$\\<esc>ggVG\\<c-y>,div\\<cr>$$$$",
'result': "\t<div>\n\t\t<div class=\"footer_nav\">\n\t\t\t<a href=\"#\">nav link</a>\n\t\t</div>\n\t</div>",
},
{
'query': "<small>a$$$$</small>",
'result': "<small><a href=\"\"></a></small>",
},
],
},
{
@@ -523,11 +564,15 @@ finish
'tests': [
{
'query': "img[src=http://mattn.kaoriya.net/images/logo.png]$$$$\\<c-y>,\\<c-y>i$$$$",
'result': "<img src=\"http://mattn.kaoriya.net/images/logo.png\" alt=\"\" width=\"96\" height=\"96\" />",
'result': "<img src=\"http://mattn.kaoriya.net/images/logo.png\" alt=\"\" width=\"113\" height=\"113\">",
},
{
'query': "img[src=/logo.png]$$$$\\<c-y>,\\<c-y>i$$$$",
'result': "<img src=\"/logo.png\" alt=\"\" />",
'result': "<img src=\"/logo.png\" alt=\"\">",
},
{
'query': "img[src=http://mattn.kaoriya.net/images/logo.png width=foo height=bar]$$$$\\<c-y>,\\<c-y>i$$$$",
'result': "<img src=\"http://mattn.kaoriya.net/images/logo.png\" alt=\"\" width=\"113\" height=\"113\">",
},
],
},
@@ -540,91 +585,160 @@ finish
},
],
},
{
'name': 'contains dash in attributes',
'tests': [
{
'query': "div[foo-bar=\"baz\"]",
'result': "<div foo-bar=\"baz\"></div>\n",
},
],
},
{
},
{
'name': 'default attributes',
'tests': [
{
'query': "p.title>a[/hoge/]",
'result': "<p class=\"title\"><a href=\"/hoge/\"></a></p>\n",
},
{
'query': "script[jquery.js]",
'result': "<script src=\"jquery.js\"></script>\n",
},
],
},
{
'name': 'multiple group',
'tests': [
{
'query': ".outer$*3>.inner$*2",
'result': "<div class=\"outer1\">\n\t<div class=\"inner1\"></div>\n\t<div class=\"inner2\"></div>\n</div>\n<div class=\"outer2\">\n\t<div class=\"inner1\"></div>\n\t<div class=\"inner2\"></div>\n</div>\n<div class=\"outer3\">\n\t<div class=\"inner1\"></div>\n\t<div class=\"inner2\"></div>\n</div>\n",
},
],
},
{
'name': 'group itemno',
'tests': [
{
'query': "dl>(dt{$}+dd)*3",
'result': "<dl>\n\t<dt>1</dt>\n\t<dd></dd>\n\t<dt>2</dt>\n\t<dd></dd>\n\t<dt>3</dt>\n\t<dd></dd>\n</dl>\n",
},
{
'query': "(div[attr=$]*3)*3",
'result': "<div attr=\"1\"></div>\n<div attr=\"2\"></div>\n<div attr=\"3\"></div>\n<div attr=\"1\"></div>\n<div attr=\"2\"></div>\n<div attr=\"3\"></div>\n<div attr=\"1\"></div>\n<div attr=\"2\"></div>\n<div attr=\"3\"></div>\n",
},
],
},
{
'name': 'update tag',
'tests': [
{
'query': "<h$$$$\\<c-y>u.global\\<cr>$$$$3></h3>",
'result': "<h3 class=\"global\"></h3>",
},
],
},
],
'dummy': "}}}"},
{ 'test-css': '{{{',
'type': 'css',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "@i",
'result': "@import url();",
'query': "{fs:n$$$$}",
'result': "{font-style: normal;}",
},
{
'query': "fs:n",
'result': "font-style: normal;",
'query': "{fl:l|fc$$$$}",
'result': "{float: left;}",
},
{
'query': "fl:l|fc",
'result': "float: left;",
'query': "{bg+$$$$}",
'result': "{background: $$$$#fff url() 0 0 no-repeat;}",
},
{
'query': "bg+$$$$",
'result': "background: #FFF url($$$$) 0 0 no-repeat;",
'query': "{bg+!$$$$}",
'result': "{background: $$$$#fff url() 0 0 no-repeat !important;}",
},
{
'query': "bg+!$$$$",
'result': "background: #FFF url($$$$) 0 0 no-repeat !important;",
'query': "{m$$$$}",
'result': "{margin: $$$$;}",
},
{
'query': "m$$$$",
'result': "margin: $$$$;",
'query': "{m0.1p$$$$}",
'result': "{margin: 0.1%;}",
},
{
'query': "m0.1p$$$$",
'result': "margin: 0.1%;",
'query': "{m1.0$$$$}",
'result': "{margin: 1.0em;}",
},
{
'query': "m1.0$$$$",
'result': "margin: 1.0em;",
'query': "{m2$$$$}",
'result': "{margin: 2px;}",
},
{
'query': "m2$$$$",
'result': "margin: 2px;",
'query': "{bdrs10$$$$}",
'result': "{border-radius: 10px;}",
},
{
'query': "bdrs10$$$$",
'result': "border-radius: 10px;",
'query': "{-bdrs20$$$$}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;}",
},
{
'query': "-bdrs20$$$$",
'result': "-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;",
'query': "{lg(top,#fff,#000)$$$$}",
'result': "{background-image: -webkit-gradient(top, 0 0, 0 100, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n}",
},
{
'query': "lg(top,#fff,#000)$$$$",
'result': "background-image: -webkit-gradient(top, 0 0, 0 100, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n",
'query': "{m10-5-0$$$$}",
'result': "{margin: 10px 5px 0;}",
},
{
'query': "m10-5-0$$$$",
'result': "margin: 10px 5px 0px;",
'query': "{m-10--5$$$$}",
'result': "{margin: -10px -5px;}",
},
{
'query': "m-10--5$$$$",
'result': "margin: -10px -5px;",
'query': "{m10-auto$$$$}",
'result': "{margin: 10px auto;}",
},
{
'query': "m10-auto$$$$",
'result': "margin: 10px auto;",
'query': "{w100p$$$$}",
'result': "{width: 100%;}",
},
{
'query': "w100p$$$$",
'result': "width: 100%;",
'query': "{h50e$$$$}",
'result': "{height: 50em;}",
},
{
'query': "h50e$$$$",
'result': "height: 50em;",
'query': "{(bg+)+c$$$$}",
'result': "{background: $$$$#fff url() 0 0 no-repeat;\ncolor: #000;}",
},
{
'query': "(bg+)+c$$$$",
'result': "background: #FFF url($$$$) 0 0 no-repeat;\ncolor: #000;",
'query': "{m0+bgi+bg++p0$$$$}",
'result': "{margin: 0;\nbackground-image: url($$$$);\nbackground: #fff url() 0 0 no-repeat;\npadding: 0;}",
},
{
'query': "{borle$$$$}",
'result': "{border-left: $$$$;}",
},
{
'query': "{c#dba$$$$}",
'result': "{color: rgb(221, 187, 170);}",
},
{
'query': "{c#dba.7$$$$}",
'result': "{color: rgb(221, 187, 170, 0.7);}",
},
{
'query': "{dn$$$$}",
'result': "{display: none;}",
},
],
},
],
},
{
'dummy': "}}}"},
{ 'test-haml': '{{{',
'type': 'haml',
'categories': [
{
@@ -646,6 +760,10 @@ finish
'query': ".content{Hello!}|haml",
'result': "%div.content Hello!\n",
},
{
'query': "a[title=$#]{foo}",
'result': "%a{ :href => \"\", :title => \"foo\" } foo\n",
},
],
},
{
@@ -675,8 +793,8 @@ finish
],
},
],
},
{
'dummy': "}}}"},
{ 'test-slim': "{{{",
'type': 'slim',
'categories': [
{
@@ -684,11 +802,11 @@ finish
'tests': [
{
'query': "div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}",
'result': "div\n p\n ul id=\"foo\"\n li foo=\"bar\" bar=\"baz\" class=\"bar1\"\n | baz\n li foo=\"bar\" bar=\"baz\" class=\"bar2\"\n | baz\n li foo=\"bar\" bar=\"baz\" class=\"bar3\"\n | baz\n",
'result': "div\n p\n ul id=\"foo\"\n li class=\"bar1\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar2\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar3\" foo=\"bar\" bar=\"baz\"\n | baz\n",
},
{
'query': "div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}|slim",
'result': "div\n p\n ul id=\"foo\"\n li foo=\"bar\" bar=\"baz\" class=\"bar1\"\n | baz\n li foo=\"bar\" bar=\"baz\" class=\"bar2\"\n | baz\n li foo=\"bar\" bar=\"baz\" class=\"bar3\"\n | baz\n",
'result': "div\n p\n ul id=\"foo\"\n li class=\"bar1\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar2\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar3\" foo=\"bar\" bar=\"baz\"\n | baz\n",
},
{
'query': "a*3|slim",
@@ -698,6 +816,10 @@ finish
'query': ".content{Hello!}|slim",
'result': "div class=\"content\"\n | Hello!\n",
},
{
'query': "a[title=$#]{foo}",
'result': "a href=\"\" title=\"foo\"\n | foo\n",
},
],
},
{
@@ -727,8 +849,8 @@ finish
],
},
],
},
{
'dummy': "}}}"},
{ 'test-xsl': "{{{",
'type': 'xsl',
'categories': [
{
@@ -740,13 +862,13 @@ finish
},
{
'query': "ap>wp",
'result': "<xsl:apply-templates select=\"\" mode=\"\">\n\t<xsl:with-param select=\"\" name=\"\"></xsl:with-param>\n</xsl:apply-templates>\n",
'result': "<xsl:apply-templates select=\"\" mode=\"\">\n\t<xsl:with-param name=\"\" select=\"\"></xsl:with-param>\n</xsl:apply-templates>\n",
},
],
},
],
},
{
'dummy': "}}}"},
{ 'test-xsd': "{{{",
'type': 'xsd',
'categories': [
{
@@ -754,13 +876,13 @@ finish
'tests': [
{
'query': "xsd:w3c",
'result': "<?xml version=\"1.0\"?>\n<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\t<xsd:element name=\"\" type=\"\"/>\n</xsd:schema>",
'result': "<?xml version=\"1.0\"?>\n<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\t<xsd:element name=\"\" type=\"\"/>\n</xsd:schema>\n",
},
],
},
],
},
{
'dummy': "}}}"},
{ 'test-mustache': "{{{",
'type': 'mustache',
'categories': [
{
@@ -777,6 +899,88 @@ finish
],
},
],
},
'dummy': "}}}"},
{ 'test-sass': "{{{",
'type': 'scss',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "@i$$$$",
'result': "@import url();",
},
{
'query': "{fs:n$$$$}",
'result': "{font-style: normal;}",
},
{
'query': "{fl:l|fc$$$$}",
'result': "{float: left;}",
},
{
'query': "{bg+$$$$}",
'result': "{background: $$$$#fff url() 0 0 no-repeat;}",
},
{
'query': "{bg+!$$$$}",
'result': "{background: $$$$#fff url() 0 0 no-repeat !important;}",
},
{
'query': "{m$$$$}",
'result': "{margin: $$$$;}",
},
{
'query': "{m0.1p$$$$}",
'result': "{margin: 0.1%;}",
},
{
'query': "{m1.0$$$$}",
'result': "{margin: 1.0em;}",
},
{
'query': "{m2$$$$}",
'result': "{margin: 2px;}",
},
{
'query': "{bdrs10$$$$}",
'result': "{border-radius: 10px;}",
},
{
'query': "{-bdrs20$$$$}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;}",
},
{
'query': "{lg(top,#fff,#000)$$$$}",
'result': "{background-image: -webkit-gradient(top, 0 0, 0 100, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n}",
},
{
'query': "{m10-5-0$$$$}",
'result': "{margin: 10px 5px 0;}",
},
{
'query': "{m-10--5$$$$}",
'result': "{margin: -10px -5px;}",
},
{
'query': "{m10-auto$$$$}",
'result': "{margin: 10px auto;}",
},
{
'query': "{w100p$$$$}",
'result': "{width: 100%;}",
},
{
'query': "{h50e$$$$}",
'result': "{height: 50em;}",
},
{
'query': "{(bg+)+c$$$$}",
'result': "{background: $$$$#fff url() 0 0 no-repeat;\ncolor: #000;}",
},
],
},
],
'dummy': "}}}"},
]
" vim:set et:
" vim:set et fdm=marker: