├── .gitignore ├── .vscode └── launch.json ├── LICENSE.md ├── README.md ├── ansible.configuration.json ├── images └── ansible.png ├── package.json ├── syntaxes ├── ansible-advanced.tmLanguage └── ansible.tmLanguage ├── tests └── tests.yaml └── vsc-extension-quickstart.md /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that launches the extension inside a new window 2 | { 3 | "version": "0.1.0", 4 | "configurations": [ 5 | { 6 | "name": "Launch Extension", 7 | "type": "extensionHost", 8 | "request": "launch", 9 | "runtimeExecutable": "${execPath}", 10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}" ] 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Adam Hamsik 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ansible Syntax Highlighting Extension 2 | 3 | - `Ansible`: It's based on the [original Ansible Sublime-text package](https://github.com/clifford-github/sublime-ansible) with my own fixes. 4 | - `Ansible (advanced)` : It's based on YAML language of 2015 FichteFoll with modifications to support : 5 | - Jinja language 6 | - Jinja expressions for ansible conditions (`when`, `changed_when`, `failed_when`, `check_mode`) 7 | - Some YAML block scalar 8 | 9 | ## Setup File associations 10 | 11 | Settings for VScode to automatically assign Ansible syntax to files. 12 | 13 | ``` 14 | "files.associations": { 15 | "**/defaults/**/*": "ansible", 16 | "**/tasks/**/*.yml" : "ansible", 17 | "**/handler/*.yml" : "ansible", 18 | "**/*_vars/**/*.yml" : "ansible", 19 | "**/roles/**/*.yml" : "ansible", 20 | "**/playbooks/**/*.yml" : "ansible", 21 | "**/*ansible*/**/*.yml" : "ansible", 22 | "**/vars/**/*.yml": "ansible", 23 | "**/inventory/*/*": "ansible" 24 | } 25 | ``` 26 | -------------------------------------------------------------------------------- /ansible.configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": "#" 4 | }, 5 | "brackets": [ 6 | ["{", "}"], 7 | ["[", "]"], 8 | ["(", ")"] 9 | ], 10 | "surroundingPairs": [ 11 | ["{", "}"], 12 | ["[", "]"], 13 | ["(", ")"], 14 | ["\"", "\""], 15 | ["'", "'"] 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /images/ansible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haad/vs-language-ansible/9d712ab348f7b101ae77d407cb2e238378d89e4b/images/ansible.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ansible", 3 | "displayName": "language-Ansible", 4 | "description": "Ansible syntax highlighting support", 5 | "version": "0.2.7", 6 | "publisher": "haaaad", 7 | "engines": { 8 | "vscode": "^1.0.0" 9 | }, 10 | "keywords": [ 11 | "ansible" 12 | ], 13 | "categories": [ 14 | "Languages" 15 | ], 16 | "license": "MIT", 17 | "icon": "images/ansible.png", 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/haad/vs-language-ansible.git" 21 | }, 22 | "bugs": { 23 | "url": "https://github.com/haad/vs-language-ansible/issues" 24 | }, 25 | "contributes": { 26 | "languages": [ 27 | { 28 | "id": "ansible", 29 | "aliases": [ 30 | "Ansible", 31 | "ansible" 32 | ], 33 | "extensions": [ 34 | "ansible" 35 | ], 36 | "configuration": "./ansible.configuration.json" 37 | }, 38 | { 39 | "id": "ansible-advanced", 40 | "aliases": [ 41 | "Ansible (advanced)", 42 | "ansible (advanced)", 43 | "Ansible", 44 | "ansible" 45 | ], 46 | "extensions": [ 47 | "ansible-advanced" 48 | ], 49 | "configuration": "./ansible.configuration.json" 50 | } 51 | ], 52 | "grammars": [ 53 | { 54 | "language": "ansible", 55 | "scopeName": "source.ansible", 56 | "path": "./syntaxes/ansible.tmLanguage" 57 | }, 58 | { 59 | "language": "ansible-advanced", 60 | "scopeName": "source.ansible-advanced", 61 | "path": "./syntaxes/ansible-advanced.tmLanguage" 62 | } 63 | ] 64 | } 65 | } -------------------------------------------------------------------------------- /syntaxes/ansible-advanced.tmLanguage: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | fileTypes 6 | 7 | firstLineMatch 8 | ^%YAML( ?1.\d+)? 9 | keyEquivalent 10 | ^~Y 11 | name 12 | Ansible (advanced) 13 | patterns 14 | 15 | 16 | include 17 | #comment 18 | 19 | 20 | include 21 | #property 22 | 23 | 24 | include 25 | #directive 26 | 27 | 28 | match 29 | ^--- 30 | name 31 | entity.other.document.begin.ansible-advanced 32 | 33 | 34 | match 35 | ^\.{3} 36 | name 37 | entity.other.document.end.ansible-advanced 38 | 39 | 40 | include 41 | #conditions 42 | 43 | 44 | include 45 | #node 46 | 47 | 48 | repository 49 | 50 | block-collection 51 | 52 | patterns 53 | 54 | 55 | include 56 | #block-sequence 57 | 58 | 59 | include 60 | #block-mapping 61 | 62 | 63 | 64 | block-mapping 65 | 66 | patterns 67 | 68 | 69 | include 70 | #block-pair 71 | 72 | 73 | 74 | block-node 75 | 76 | patterns 77 | 78 | 79 | include 80 | #prototype 81 | 82 | 83 | include 84 | #block-scalar 85 | 86 | 87 | include 88 | #block-collection 89 | 90 | 91 | include 92 | #flow-scalar-plain-out 93 | 94 | 95 | include 96 | #flow-node 97 | 98 | 99 | 100 | block-pair 101 | 102 | patterns 103 | 104 | 105 | begin 106 | \? 107 | beginCaptures 108 | 109 | 1 110 | 111 | name 112 | punctuation.definition.key-value.begin.ansible-advanced 113 | 114 | 115 | end 116 | (?=\?)|^ *(:)|(:) 117 | endCaptures 118 | 119 | 1 120 | 121 | name 122 | punctuation.separator.key-value.mapping.ansible-advanced 123 | 124 | 2 125 | 126 | name 127 | invalid.illegal.expected-newline.ansible-advanced 128 | 129 | 130 | name 131 | meta.block-mapping.ansible-advanced 132 | patterns 133 | 134 | 135 | include 136 | #block-node 137 | 138 | 139 | 140 | 141 | begin 142 | (?x) 143 | (?= 144 | (?x: 145 | [^\s[-?:,\[\]{}#>*!|&'"%@`]] 146 | | [?:-] \S 147 | ) 148 | ( 149 | [^\s:] 150 | | : \S 151 | | \s+ (?![#\s]) 152 | )* 153 | \s* 154 | : 155 | (\s|$) 156 | ) 157 | 158 | end 159 | (?x) 160 | (?= 161 | \s* $ 162 | | \s+ \# 163 | | \s* : (\s|$) 164 | ) 165 | 166 | patterns 167 | 168 | 169 | include 170 | #flow-scalar-plain-out-implicit-type 171 | 172 | 173 | begin 174 | (?x) 175 | [^\s[-?:,\[\]{}#&*!|>'"%@`]] 176 | | [?:-] (?=\S) 177 | beginCaptures 178 | 179 | 0 180 | 181 | name 182 | keyword.other.ansible-advanced 183 | 184 | 185 | contentName 186 | keyword.other.ansible-advanced 187 | end 188 | (?x) 189 | (?= 190 | \s* $ 191 | | \s+ \# 192 | | \s* : (\s|$) 193 | ) 194 | 195 | name 196 | string.unquoted.plain.out.ansible-advanced 197 | 198 | 199 | 200 | 201 | match 202 | :(?=\s|$) 203 | name 204 | punctuation.separator.key-value.mapping.ansible-advanced 205 | 206 | 207 | 208 | block-scalar 209 | 210 | begin 211 | (\s*)(?:(?:-\s+)?(\S+):\s+|-\s+)(?:(\|)|(>))([1-9])?([-+])?(.*\n?) 212 | beginCaptures 213 | 214 | 2 215 | 216 | name 217 | keyword.ansible-advanced 218 | 219 | 3 220 | 221 | name 222 | punctuation.definition.block.scalar.literal.ansible-advanced 223 | 224 | 4 225 | 226 | name 227 | punctuation.definition.block.scalar.folded.ansible-advanced 228 | 229 | 5 230 | 231 | name 232 | constant.numeric.indentation-indicator.ansible-advanced 233 | 234 | 6 235 | 236 | name 237 | support.other.chomping-indicator.ansible-advanced 238 | 239 | 7 240 | 241 | patterns 242 | 243 | 244 | include 245 | #comment 246 | 247 | 248 | match 249 | .+ 250 | name 251 | invalid.illegal.expected-comment-or-newline.ansible-advanced 252 | 253 | 254 | 255 | 256 | contentName 257 | string.unquoted.block.ansible-advanced 258 | end 259 | ^(?!\1\s+\S|$) 260 | patterns 261 | 262 | 263 | include 264 | #specials 265 | 266 | 267 | 268 | block-sequence 269 | 270 | match 271 | (-)( |\t|$) 272 | name 273 | punctuation.definition.block.sequence.item.ansible-advanced 274 | 275 | comment 276 | 277 | begin 278 | (?:(^[ \t]*)|[ \t]+)(?=#\p{Print}*$) 279 | beginCaptures 280 | 281 | 1 282 | 283 | name 284 | punctuation.whitespace.comment.leading.ansible-advanced 285 | 286 | 287 | end 288 | (?!\G) 289 | patterns 290 | 291 | 292 | begin 293 | # 294 | beginCaptures 295 | 296 | 0 297 | 298 | name 299 | punctuation.definition.comment.ansible-advanced 300 | 301 | 302 | end 303 | \n 304 | name 305 | comment.line.number-sign.ansible-advanced 306 | 307 | 308 | 309 | conditions 310 | 311 | patterns 312 | 313 | 314 | begin 315 | \b((?:changed_|failed_)?when|check_mode)\b\s*:(?! [|>]|\s*$)(\s+["'])? 316 | beginCaptures 317 | 318 | 1 319 | 320 | name 321 | keyword.other.special-method.ansible-advanced 322 | 323 | 324 | end 325 | (?:["'])?$ 326 | patterns 327 | 328 | 329 | include 330 | source.jinja#expression 331 | 332 | 333 | 334 | 335 | begin 336 | (\s*)(?:(?:-\s+)?((?:changed_|failed_)?when|check_mode):\s+|-\s+)(?:(\|)|(>))([1-9])?([-+])?(.*\n?) 337 | beginCaptures 338 | 339 | 2 340 | 341 | name 342 | keyword.other.special-method.ansible-advanced 343 | 344 | 3 345 | 346 | name 347 | punctuation.definition.block.scalar.literal.ansible-advanced 348 | 349 | 4 350 | 351 | name 352 | punctuation.definition.block.scalar.folded.ansible-advanced 353 | 354 | 5 355 | 356 | name 357 | constant.numeric.indentation-indicator.ansible-advanced 358 | 359 | 6 360 | 361 | name 362 | support.other.chomping-indicator.ansible-advanced 363 | 364 | 7 365 | 366 | patterns 367 | 368 | 369 | include 370 | #comment 371 | 372 | 373 | match 374 | .+ 375 | name 376 | invalid.illegal.expected-comment-or-newline.ansible-advanced 377 | 378 | 379 | 380 | 381 | contentName 382 | string.unquoted.block.ansible-advanced 383 | end 384 | ^(?!\1\s+\S|$) 385 | patterns 386 | 387 | 388 | include 389 | source.jinja#expression 390 | 391 | 392 | 393 | 394 | begin 395 | ^(\s*)(?:(?:-\s+)?((?:changed_|failed_)?when|check_mode)):$ 396 | beginCaptures 397 | 398 | 2 399 | 400 | name 401 | keyword.other.special-method.ansible-advanced 402 | 403 | 404 | end 405 | ^(?!\1\s+-\s+\S|$) 406 | patterns 407 | 408 | 409 | begin 410 | (?:["'])(.*)(?=["']\s*?$) 411 | beginCaptures 412 | 413 | 1 414 | 415 | patterns 416 | 417 | 418 | include 419 | source.jinja#expression 420 | 421 | 422 | 423 | 424 | end 425 | $ 426 | 427 | 428 | include 429 | source.jinja#expression 430 | 431 | 432 | 433 | 434 | 435 | directive 436 | 437 | begin 438 | ^% 439 | beginCaptures 440 | 441 | 0 442 | 443 | name 444 | punctuation.definition.directive.begin.ansible-advanced 445 | 446 | 447 | end 448 | (?=$|[ \t]+($|#)) 449 | name 450 | meta.directive.ansible-advanced 451 | patterns 452 | 453 | 454 | captures 455 | 456 | 1 457 | 458 | name 459 | keyword.other.directive.ansible-advanced.ansible-advanced 460 | 461 | 2 462 | 463 | name 464 | constant.numeric.ansible-advanced-version.ansible-advanced 465 | 466 | 467 | match 468 | \G(YAML)[ \t]+(\d+\.\d+) 469 | 470 | 471 | captures 472 | 473 | 1 474 | 475 | name 476 | keyword.other.directive.tag.ansible-advanced 477 | 478 | 2 479 | 480 | name 481 | storage.type.tag-handle.ansible-advanced 482 | 483 | 3 484 | 485 | name 486 | support.type.tag-prefix.ansible-advanced 487 | 488 | 489 | match 490 | (?x) \G (TAG) (?:[ \t]+ 491 | ((?:!(?:[0-9A-Za-z\-]*!)?)) 492 | (?:[ \t]+ ( 493 | ! (?x: %\p{XDigit}{2} | [0-9A-Za-z\-#;/?:@&=+$,_.!~*'()\[\]] )* 494 | | (?![,!\[\]{}]) (?x: %\p{XDigit}{2} | [0-9A-Za-z\-#;/?:@&=+$,_.!~*'()\[\]] )+ 495 | ) 496 | )? 497 | )? 498 | 499 | 500 | 501 | captures 502 | 503 | 1 504 | 505 | name 506 | support.other.directive.reserved.ansible-advanced 507 | 508 | 2 509 | 510 | name 511 | string.unquoted.directive-name.ansible-advanced 512 | 513 | 3 514 | 515 | name 516 | string.unquoted.directive-parameter.ansible-advanced 517 | 518 | 519 | match 520 | (?x) \G (\w+) (?:[ \t]+ (\w+) (?:[ \t]+ (\w+))? )? 521 | 522 | 523 | match 524 | \S+ 525 | name 526 | invalid.illegal.unrecognized.ansible-advanced 527 | 528 | 529 | 530 | flow-alias 531 | 532 | captures 533 | 534 | 1 535 | 536 | name 537 | keyword.control.flow.alias.ansible-advanced 538 | 539 | 2 540 | 541 | name 542 | punctuation.definition.alias.ansible-advanced 543 | 544 | 3 545 | 546 | name 547 | keyword.other.alias.ansible-advanced 548 | 549 | 4 550 | 551 | name 552 | invalid.illegal.character.anchor.ansible-advanced 553 | 554 | 555 | match 556 | ((\*))([^\s\[\]/{/},]+)([^\s\]},]\S*)? 557 | 558 | flow-collection 559 | 560 | patterns 561 | 562 | 563 | include 564 | #flow-sequence 565 | 566 | 567 | include 568 | #flow-mapping 569 | 570 | 571 | 572 | flow-mapping 573 | 574 | begin 575 | \{ 576 | beginCaptures 577 | 578 | 0 579 | 580 | name 581 | punctuation.definition.mapping.begin.ansible-advanced 582 | 583 | 584 | end 585 | \} 586 | endCaptures 587 | 588 | 0 589 | 590 | name 591 | punctuation.definition.mapping.end.ansible-advanced 592 | 593 | 594 | name 595 | meta.flow-mapping.ansible-advanced 596 | patterns 597 | 598 | 599 | include 600 | #prototype 601 | 602 | 603 | match 604 | , 605 | name 606 | punctuation.separator.mapping.ansible-advanced 607 | 608 | 609 | include 610 | #flow-pair 611 | 612 | 613 | 614 | flow-node 615 | 616 | patterns 617 | 618 | 619 | include 620 | #prototype 621 | 622 | 623 | include 624 | #flow-alias 625 | 626 | 627 | include 628 | #flow-collection 629 | 630 | 631 | include 632 | #flow-scalar 633 | 634 | 635 | 636 | flow-pair 637 | 638 | patterns 639 | 640 | 641 | begin 642 | \? 643 | beginCaptures 644 | 645 | 0 646 | 647 | name 648 | punctuation.definition.key-value.begin.ansible-advanced 649 | 650 | 651 | end 652 | (?=[},\]]) 653 | name 654 | meta.flow-pair.explicit.ansible-advanced 655 | patterns 656 | 657 | 658 | include 659 | #prototype 660 | 661 | 662 | include 663 | #flow-pair 664 | 665 | 666 | include 667 | #flow-node 668 | 669 | 670 | begin 671 | :(?=\s|$|[\[\]{},]) 672 | beginCaptures 673 | 674 | 0 675 | 676 | name 677 | punctuation.separator.key-value.mapping.ansible-advanced 678 | 679 | 680 | end 681 | (?=[},\]]) 682 | patterns 683 | 684 | 685 | include 686 | #flow-value 687 | 688 | 689 | 690 | 691 | 692 | 693 | begin 694 | (?x) 695 | (?= 696 | (?x: 697 | [^\s[-?:,\[\]{}#&*!|>'"%@`]] 698 | | [?:-] \S 699 | ) 700 | ( 701 | [^\s:] 702 | | : \S 703 | | \s+ (?![#\s]) 704 | )* 705 | \s* 706 | : 707 | (\s|$) 708 | ) 709 | end 710 | (?x) 711 | (?= 712 | \s* $ 713 | | \s+ \# 714 | | \s* : (\s|$) 715 | ) 716 | name 717 | meta.flow-pair.key.ansible-advanced 718 | patterns 719 | 720 | 721 | include 722 | #flow-scalar-plain-in-implicit-type 723 | 724 | 725 | begin 726 | (?x) 727 | [^\s[-?:,\[\]{}#&*!|>'"%@`]] 728 | | [?:-] [^\s[\[\]{},]] 729 | 730 | beginCaptures 731 | 732 | 0 733 | 734 | name 735 | keyword.other.ansible-advanced 736 | 737 | 738 | contentName 739 | keyword.other.ansible-advanced 740 | end 741 | (?x) 742 | (?= 743 | \s* $ 744 | | \s+ \# 745 | | \s* : (\s|$) 746 | | \s* : [\[\]{},] 747 | | \s* [\[\]{},] 748 | ) 749 | 750 | name 751 | string.unquoted.plain.in.ansible-advanced 752 | 753 | 754 | 755 | 756 | include 757 | #flow-node 758 | 759 | 760 | begin 761 | :(?=\s|$|[\[\]{},]) 762 | captures 763 | 764 | 0 765 | 766 | name 767 | punctuation.separator.key-value.mapping.ansible-advanced 768 | 769 | 770 | end 771 | (?=[},\]]) 772 | name 773 | meta.flow-pair.ansible-advanced 774 | patterns 775 | 776 | 777 | include 778 | #flow-value 779 | 780 | 781 | 782 | 783 | 784 | flow-scalar 785 | 786 | patterns 787 | 788 | 789 | include 790 | #flow-scalar-double-quoted 791 | 792 | 793 | include 794 | #flow-scalar-single-quoted 795 | 796 | 797 | include 798 | #flow-scalar-plain-in 799 | 800 | 801 | 802 | flow-scalar-double-quoted 803 | 804 | begin 805 | " 806 | beginCaptures 807 | 808 | 0 809 | 810 | name 811 | punctuation.definition.string.begin.ansible-advanced 812 | 813 | 814 | end 815 | " 816 | endCaptures 817 | 818 | 0 819 | 820 | name 821 | punctuation.definition.string.end.ansible-advanced 822 | 823 | 824 | name 825 | string.quoted.double.ansible-advanced 826 | patterns 827 | 828 | 829 | match 830 | \\([0abtnvfre "/\\N_Lp]|x\d\d|u\d{4}|U\d{8}) 831 | name 832 | constant.character.escape.ansible-advanced 833 | 834 | 835 | match 836 | \\\n 837 | name 838 | constant.character.escape.double-quoted.newline.ansible-advanced 839 | 840 | 841 | include 842 | #specials 843 | 844 | 845 | 846 | flow-scalar-plain-in 847 | 848 | patterns 849 | 850 | 851 | include 852 | #flow-scalar-plain-in-implicit-type 853 | 854 | 855 | begin 856 | (?x) 857 | [^\s[-?:,\[\]{}#&*!|>'"%@`]] 858 | | [?:-] [^\s[\[\]{},]] 859 | end 860 | (?x) 861 | (?= 862 | \s* $ 863 | | \s+ \# 864 | | \s* : (\s|$) 865 | | \s* : [\[\]{},] 866 | | \s* [\[\]{},] 867 | ) 868 | 869 | name 870 | string.unquoted.plain.in.ansible-advanced 871 | 872 | 873 | 874 | flow-scalar-plain-in-implicit-type 875 | 876 | patterns 877 | 878 | 879 | captures 880 | 881 | 1 882 | 883 | name 884 | constant.language.null.ansible-advanced 885 | 886 | 2 887 | 888 | name 889 | constant.language.boolean.ansible-advanced 890 | 891 | 3 892 | 893 | name 894 | constant.numeric.integer.ansible-advanced 895 | 896 | 4 897 | 898 | name 899 | constant.numeric.float.ansible-advanced 900 | 901 | 5 902 | 903 | name 904 | constant.other.timestamp.ansible-advanced 905 | 906 | 6 907 | 908 | name 909 | constant.language.value.ansible-advanced 910 | 911 | 7 912 | 913 | name 914 | constant.language.merge.ansible-advanced 915 | 916 | 917 | match 918 | (?x) 919 | (?x: 920 | (null|Null|NULL|~) 921 | | (y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF) 922 | | ( 923 | (?: 924 | [-+]? 0b [0-1_]+ # (base 2) 925 | | [-+]? 0 [0-7_]+ # (base 8) 926 | | [-+]? (?: 0|[1-9][0-9_]*) # (base 10) 927 | | [-+]? 0x [0-9a-fA-F_]+ # (base 16) 928 | | [-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+ # (base 60) 929 | ) 930 | ) 931 | | ( 932 | (?x: 933 | [-+]? (?: [0-9] [0-9_]*)? \. [0-9.]* (?: [eE] [-+] [0-9]+)? # (base 10) 934 | | [-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ \. [0-9_]* # (base 60) 935 | | [-+]? \. (?: inf|Inf|INF) # (infinity) 936 | | \. (?: nan|NaN|NAN) # (not a number) 937 | ) 938 | ) 939 | | ( 940 | (?x: 941 | \d{4} - \d{2} - \d{2} # (y-m-d) 942 | | \d{4} # (year) 943 | - \d{1,2} # (month) 944 | - \d{1,2} # (day) 945 | (?: [Tt] | [ \t]+) \d{1,2} # (hour) 946 | : \d{2} # (minute) 947 | : \d{2} # (second) 948 | (?: \.\d*)? # (fraction) 949 | (?: 950 | (?:[ \t]*) Z 951 | | [-+] \d{1,2} (?: :\d{1,2})? 952 | )? # (time zone) 953 | ) 954 | ) 955 | | (=) 956 | | (<<) 957 | ) 958 | (?: 959 | (?= 960 | \s* $ 961 | | \s+ \# 962 | | \s* : (\s|$) 963 | | \s* : [\[\]{},] 964 | | \s* [\[\]{},] 965 | ) 966 | ) 967 | 968 | 969 | 970 | 971 | flow-scalar-plain-out 972 | 973 | patterns 974 | 975 | 976 | include 977 | #flow-scalar-plain-out-implicit-type 978 | 979 | 980 | begin 981 | (?x) 982 | (?=[^\s[-?:,\[\]{}#&*!|>'"%@`]]) 983 | | [?:-] (?=\S) 984 | 985 | end 986 | (?x) 987 | (?= 988 | \s* $ 989 | | \s+ \# 990 | | \s* : (\s|$) 991 | ) 992 | 993 | name 994 | string.unquoted.plain.out.ansible-advanced 995 | patterns 996 | 997 | 998 | include 999 | #specials 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | flow-scalar-plain-out-implicit-type 1006 | 1007 | patterns 1008 | 1009 | 1010 | captures 1011 | 1012 | 1 1013 | 1014 | name 1015 | constant.language.null.ansible-advanced 1016 | 1017 | 2 1018 | 1019 | name 1020 | constant.language.boolean.ansible-advanced 1021 | 1022 | 3 1023 | 1024 | name 1025 | constant.numeric.integer.ansible-advanced 1026 | 1027 | 4 1028 | 1029 | name 1030 | constant.numeric.float.ansible-advanced 1031 | 1032 | 5 1033 | 1034 | name 1035 | constant.other.timestamp.ansible-advanced 1036 | 1037 | 6 1038 | 1039 | name 1040 | constant.language.value.ansible-advanced 1041 | 1042 | 7 1043 | 1044 | name 1045 | constant.language.merge.ansible-advanced 1046 | 1047 | 1048 | match 1049 | (?x) 1050 | (?x: 1051 | (null|Null|NULL|~) 1052 | | (y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF) 1053 | | ( 1054 | (?: 1055 | [-+]? 0b [0-1_]+ # (base 2) 1056 | | [-+]? 0 [0-7_]+ # (base 8) 1057 | | [-+]? (?: 0|[1-9][0-9_]*) # (base 10) 1058 | | [-+]? 0x [0-9a-fA-F_]+ # (base 16) 1059 | | [-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+ # (base 60) 1060 | ) 1061 | ) 1062 | | ( 1063 | (?x: 1064 | [-+]? (?: [0-9] [0-9_]*)? \. [0-9.]* (?: [eE] [-+] [0-9]+)? # (base 10) 1065 | | [-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ \. [0-9_]* # (base 60) 1066 | | [-+]? \. (?: inf|Inf|INF) # (infinity) 1067 | | \. (?: nan|NaN|NAN) # (not a number) 1068 | ) 1069 | ) 1070 | | ( 1071 | (?x: 1072 | \d{4} - \d{2} - \d{2} # (y-m-d) 1073 | | \d{4} # (year) 1074 | - \d{1,2} # (month) 1075 | - \d{1,2} # (day) 1076 | (?: [Tt] | [ \t]+) \d{1,2} # (hour) 1077 | : \d{2} # (minute) 1078 | : \d{2} # (second) 1079 | (?: \.\d*)? # (fraction) 1080 | (?: 1081 | (?:[ \t]*) Z 1082 | | [-+] \d{1,2} (?: :\d{1,2})? 1083 | )? # (time zone) 1084 | ) 1085 | ) 1086 | | (=) 1087 | | (<<) 1088 | ) 1089 | (?x: 1090 | (?= 1091 | \s* $ 1092 | | \s+ \# 1093 | | \s* : (\s|$) 1094 | ) 1095 | ) 1096 | 1097 | 1098 | 1099 | 1100 | flow-scalar-single-quoted 1101 | 1102 | begin 1103 | ' 1104 | beginCaptures 1105 | 1106 | 0 1107 | 1108 | name 1109 | punctuation.definition.string.begin.ansible-advanced 1110 | 1111 | 1112 | end 1113 | '(?!') 1114 | endCaptures 1115 | 1116 | 0 1117 | 1118 | name 1119 | punctuation.definition.string.end.ansible-advanced 1120 | 1121 | 1122 | name 1123 | string.quoted.single.ansible-advanced 1124 | patterns 1125 | 1126 | 1127 | match 1128 | '' 1129 | name 1130 | constant.character.escape.single-quoted.ansible-advanced 1131 | 1132 | 1133 | include 1134 | #specials 1135 | 1136 | 1137 | 1138 | flow-sequence 1139 | 1140 | begin 1141 | \[ 1142 | beginCaptures 1143 | 1144 | 0 1145 | 1146 | name 1147 | punctuation.definition.sequence.begin.ansible-advanced 1148 | 1149 | 1150 | end 1151 | \] 1152 | endCaptures 1153 | 1154 | 0 1155 | 1156 | name 1157 | punctuation.definition.sequence.end.ansible-advanced 1158 | 1159 | 1160 | name 1161 | meta.flow-sequence.ansible-advanced 1162 | patterns 1163 | 1164 | 1165 | include 1166 | #prototype 1167 | 1168 | 1169 | match 1170 | , 1171 | name 1172 | punctuation.separator.sequence.ansible-advanced 1173 | 1174 | 1175 | include 1176 | #flow-pair 1177 | 1178 | 1179 | include 1180 | #flow-node 1181 | 1182 | 1183 | 1184 | flow-value 1185 | 1186 | patterns 1187 | 1188 | 1189 | begin 1190 | \G(?![},\]]) 1191 | end 1192 | (?=[},\]]) 1193 | name 1194 | meta.flow-pair.value.ansible-advanced 1195 | patterns 1196 | 1197 | 1198 | include 1199 | #flow-node 1200 | 1201 | 1202 | 1203 | 1204 | 1205 | node 1206 | 1207 | patterns 1208 | 1209 | 1210 | include 1211 | #block-node 1212 | 1213 | 1214 | 1215 | property 1216 | 1217 | begin 1218 | (?=!|&) 1219 | end 1220 | (?!\G) 1221 | name 1222 | meta.property.ansible-advanced 1223 | patterns 1224 | 1225 | 1226 | captures 1227 | 1228 | 1 1229 | 1230 | name 1231 | keyword.control.property.anchor.ansible-advanced 1232 | 1233 | 2 1234 | 1235 | name 1236 | punctuation.definition.anchor.ansible-advanced 1237 | 1238 | 3 1239 | 1240 | name 1241 | entity.name.type.anchor.ansible-advanced 1242 | 1243 | 4 1244 | 1245 | name 1246 | invalid.illegal.character.anchor.ansible-advanced 1247 | 1248 | 1249 | match 1250 | \G((&))([^\s\[\]/{/},]+)(\S+)? 1251 | 1252 | 1253 | match 1254 | (?x) \G (?: 1255 | ! < (?: %\p{XDigit}{2} | [0-9A-Za-z\-#;/?:@&=+$,_.!~*'()\[\]] )+ > 1256 | | (?:!(?:[0-9A-Za-z\-]*!)?) (?: %\p{XDigit}{2} | [0-9A-Za-z\-#;/?:@&=+$_.~*'()] )+ 1257 | | ! 1258 | ) (?=\ |\t|$) 1259 | 1260 | name 1261 | storage.type.tag-handle.ansible-advanced 1262 | 1263 | 1264 | match 1265 | \S+ 1266 | name 1267 | invalid.illegal.tag-handle.ansible-advanced 1268 | 1269 | 1270 | 1271 | prototype 1272 | 1273 | patterns 1274 | 1275 | 1276 | include 1277 | #comment 1278 | 1279 | 1280 | include 1281 | #property 1282 | 1283 | 1284 | 1285 | specials 1286 | 1287 | patterns 1288 | 1289 | 1290 | include 1291 | source.jinja 1292 | 1293 | 1294 | captures 1295 | 1296 | 1 1297 | 1298 | name 1299 | entity.other.attribute-name.ansible-advanced-advence 1300 | 1301 | 1302 | match 1303 | ([\w-]+?)= 1304 | 1305 | 1306 | 1307 | 1308 | scopeName 1309 | source.ansible-advanced 1310 | uuid 1311 | 99ac36b1-d3e8-44f3-9933-3d36a95e87ff 1312 | 1313 | 1314 | -------------------------------------------------------------------------------- /syntaxes/ansible.tmLanguage: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | fileTypes 6 | 7 | yml 8 | 9 | name 10 | Ansible 11 | patterns 12 | 13 | 14 | captures 15 | 16 | 1 17 | 18 | name 19 | comment.line.number-sign.ansible 20 | 21 | 2 22 | 23 | name 24 | punctuation.definition.comment.line.ansible 25 | 26 | 27 | match 28 | (?:^ *|\G *)((#).*) 29 | name 30 | comment.line.number-sign.ansible 31 | 32 | 33 | captures 34 | 35 | 2 36 | 37 | name 38 | variable.parameter.ansible 39 | 40 | 41 | match 42 | ^(\[[0-9a-zA-Z_,=-]+(((\:)children)*)\]) 43 | name 44 | string.quoted.double.ansible 45 | 46 | 47 | match 48 | (\{\{ *[^\{\}]+ *\}\})|(\$\{[^\{\}]+\}) 49 | name 50 | storage.type.ansible 51 | 52 | 53 | captures 54 | 55 | 2 56 | 57 | name 58 | keyword.other.ansible 59 | 60 | 3 61 | 62 | name 63 | string.quoted.double.ansible 64 | 65 | 66 | match 67 | (\-) (name\:|include\:) (.*) 68 | name 69 | text 70 | 71 | 72 | captures 73 | 74 | 2 75 | 76 | name 77 | keyword.other.ansible 78 | 79 | 80 | match 81 | (\s*(\w+:))?\s 82 | name 83 | text 84 | 85 | 86 | begin 87 | - { 88 | beginCaptures 89 | 90 | 0 91 | 92 | name 93 | text 94 | 95 | 96 | end 97 | } 98 | endCaptures 99 | 100 | 0 101 | 102 | name 103 | text 104 | 105 | 106 | name 107 | text 108 | patterns 109 | 110 | 111 | match 112 | (role\:)|(tags\:)|(when\:)|(\S+\: ) 113 | name 114 | keyword.other.ansible 115 | 116 | 117 | match 118 | (\{\{ *[^\{\}]+ *\}\})|(\$\{[^\{\}]+\}) 119 | name 120 | storage.type.ansible 121 | 122 | 123 | 124 | 125 | 126 | begin 127 | (\w+)(=)\"? 128 | beginCaptures 129 | 130 | 1 131 | 132 | name 133 | entity.other.attribute-name.ansible 134 | 135 | 2 136 | 137 | name 138 | string.quoted.double.ansible 139 | 140 | 141 | contentName 142 | constant.other.ansible 143 | end 144 | (\"?[,\"=\n -]) 145 | patterns 146 | 147 | 148 | include 149 | $self 150 | 151 | 152 | match 153 | . 154 | name 155 | text 156 | 157 | 158 | 159 | 160 | scopeName 161 | source.ansible 162 | uuid 163 | 787ae642-b4ae-48b1-94e9-f935bec43a8f 164 | 165 | 166 | -------------------------------------------------------------------------------- /tests/tests.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: My Play 3 | hosts: all 4 | become: yes 5 | environment: 6 | http_proxy: "{{ proxy_url }}" 7 | https_proxy: "{{ proxy_url }}" 8 | vars_files: 9 | - ../../vars/defaults.yml 10 | vars: 11 | test: asdada 12 | zookeeper_properties: 13 | - name: /asdasd/dasasd/dasdas/dasd/sadasd/asd/sad 14 | value: asdasd 15 | - name: /asdasd/asdd/addd/dd/dd/d 16 | value: asdasd 17 | - name: /asdasda/asdasd/asdasd 18 | value: "https://{{ dns_name }}.{{ dns_zone }}/" 19 | - name: /adasda/asdasd 20 | value: asdasdasd 21 | - name: /qweqwe 22 | value: asdasdasd 23 | roles: 24 | - role: setup-networking 25 | tags: networking 26 | - { role: common, tags: [ "co", "o" ], var: "http://{{tt}}", a_war: ["{{asd}}", "http://{{123}}", "assd"], when: True } 27 | 28 | - name: My Play 29 | hosts: all 30 | become: yes 31 | roles: 32 | - { role: common, tags: "common", test_var: 123, another_war: 31123, when: True } 33 | 34 | - name: My Play 35 | hosts: all 36 | become: yes 37 | roles: 38 | - 39 | role: common 40 | tags: "common" 41 | test_var: "http://{{test}}" 42 | another_war: 31123 43 | when: True 44 | 45 | - name: My Play 46 | hosts: all 47 | become: yes 48 | roles: 49 | - role: common 50 | tags: 51 | - "common" 52 | - "test" 53 | test_var: "http://toto.com" 54 | another_war: 31123 55 | when: True 56 | tasks: 57 | - include: test.yml 58 | - name: test 59 | apt: name=test state="present" test={{item}} test2="http://{{item}}" 60 | 61 | - apt: name=test 62 | 63 | - meta: flush_handlers 64 | 65 | openstack_identity_region: asdad 66 | openstack_identity_token_expiration: 28800 67 | openstack_identity_admin_url: http://{{ host }}:{{ port }} 68 | openstack_identity_internal_url: http://{{ host }}:{{ port }} 69 | openstack_identity_public_url: http://{{ host }}:{{ port }} 70 | test: 71 | test: 1 72 | test: 2 73 | test: 74 | - var: a 75 | - var: b 76 | - var: c 77 | 78 | openstack_telemetry_internal_url: "http://{{ host }}:{{ port }}" 79 | openstack_telemetry_public_url: "http://{{ host }}:{{ port }}" 80 | openstack_telemetry_admin_url: "http://{{ host }}:{{ port }}" 81 | 82 | ### 83 | # Openstack Swift vars 84 | openstack_objectstorage_port: 8080 85 | openstack_objectstorage_internal_url: "http://{{ host }}:{{ port }}/v1" 86 | openstack_objectstorage_public_url: "http://{{ host }}:{{ port }}/v1" 87 | openstack_objectstorage_admin_url: "http://{{ host }}:{{ port }}" 88 | openstack_objectstorage_device: vdb 89 | openstack_objectstorage_storage_dir: /srv/node/ 90 | openstack_objectstorage_swift_hash_path_suffix: suffix 91 | 92 | vpc_sub_list: [ 93 | { cidr: "{{ vpc_sub_public[0].cidr }}", az: "{{ vpc_sub_public[0].az }}", 94 | qtretre: "{{ vpc_sub_public[0].az }}", 95 | "resource_tags": '{ "Environment": "{{ vpc_env }}", "Stack":"{{ stack_name }}", "Tier": "Public", "Name": "{{ vpc_type }}-{{ vpc_env }} public" }' }, 96 | { "cidr": "{{ vpc_sub_public[1].cidr }}", "az": "{{ vpc_sub_public[1].az }}", 97 | "resource_tags": '{ "Environment": "{{ vpc_env }}", "Stack":"{{ stack_name }}", "Tier": "Public", "Name": "{{ vpc_type }}-{{ vpc_env }} public2" }' }, 98 | { "cidr": "{{ vpc_sub_public[2].cidr }}", "az": "{{ vpc_sub_public[2].az }}", 99 | "resource_tags": '{ "Environment": "{{ vpc_env }}", "Stack":"{{ stack_name }}", "Tier": "Public", "Name": "{{ vpc_type }}-{{ vpc_env }} public3" }' }, 100 | { "cidr": "{{ vpc_sub_priv[0].cidr }}", "az": "{{ vpc_sub_priv[0].az }}", 101 | "resource_tags": '{ "Environment": "{{ vpc_env }}", "Stack":"{{ stack_name }}", "Tier": "Private", "Name": "{{ vpc_type }}-{{ vpc_env }} private" }'}, 102 | { "cidr": "{{ vpc_sub_priv[1].cidr }}", "az": "{{ vpc_sub_priv[1].az }}", 103 | "resource_tags": '{ "Environment": "{{ vpc_env }}", "Stack":"{{ stack_name }}", "Tier": "Private", "Name": "{{ vpc_type }}-{{ vpc_env }} private2" }'}, 104 | { "cidr": "{{ vpc_sub_priv[2].cidr }}", "az": "{{ vpc_sub_priv[2].az }}", 105 | "resource_tags": '{ "Environment": "{{ vpc_env }}", "Stack":"{{ stack_name }}", "Tier": "Private", "Name": "{{ vpc_type }}-{{ vpc_env }} private3" }'} 106 | ] 107 | 108 | # Conditions supported 109 | - name: "Test" 110 | become: yes 111 | become_user: toto 112 | register: result 113 | when: toto in install_user 114 | check_mode: ansible_check_mode 115 | changed_when: no 116 | failed_when: result | failed and not 'already exists' in result.stdout 117 | 118 | - name: "Test" 119 | when: >- 120 | not result | skipped 121 | or result | failed 122 | hosts: all 123 | become: yes 124 | 125 | - name: Test 126 | file: > 127 | name=/etc/toto 128 | state=directory 129 | owner={{test_user}} 130 | 131 | - name: "Test" 132 | when: 133 | - toto is defined 134 | - 'toto' is defined 135 | - "'attention' is present" 136 | - '"attention" is present' 137 | hosts: all 138 | become: yes 139 | 140 | # Handle most of the cases with block scalar 141 | # Workaround insert a blank line 142 | - name: Let's play 143 | vars: 144 | content: >- 145 | This is a multiline example with some {{ 'jinja' }} 146 | 147 | It support line breaking 148 | debug: msg="{{ content }}" 149 | 150 | # Limitations of block scalar (indent=0) 151 | - name: >- 152 | My Play {{ toto }} 153 | hosts: all 154 | become: yes 155 | -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | * This folder contains all of the files necessary for your extension 5 | * `package.json` - this is the manifest file in which you declare your language support and define 6 | the location of the grammar file that has been copied into you extension. 7 | * `syntaxes/ansible.tmLanguage` - this is the Text mate grammar file that is used for tokenization 8 | * `ansible.configuration.json` - this the language configuration, defining the tokens that are used for 9 | comments and brackets. 10 | 11 | ## Get up and running straight away 12 | * Make sure the language configuration settings in `ansible.configuration.json` are accurate 13 | * press `F5` to open a new window with your extension loaded 14 | * create a new file with a file name suffix matching your language 15 | * verify that syntax highlight works and that the language configuration settings are working 16 | 17 | ## Make changes 18 | * you can relaunch the extension from the debug toolbar after making changes to the files listed above 19 | * you can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes 20 | 21 | ## Add more language features 22 | * To add features such as intellisense, hovers and validators check out the VS Code extenders documentation at 23 | https://code.visualstudio.com/docs 24 | 25 | ## Install your extension 26 | * To start using your extension with Visual Studio Code copy it into the /.vscode/extensions folder and restart Code. 27 | * To share your extension with the world, read on https://code.visualstudio.com/docs about publishing an extension. --------------------------------------------------------------------------------