Add terraform, closes #163

This commit is contained in:
Adam Stankiewicz
2017-02-02 21:44:42 +01:00
parent e685e4b431
commit 39036a553f
6 changed files with 755 additions and 0 deletions

View File

@@ -106,6 +106,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin, ftdetect) - [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin, ftdetect)
- [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin, ftdetect) - [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin, ftdetect)
- [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax, ftdetect) - [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax, ftdetect)
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, ftdetect, ftplugin)
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin, ftdetect) - [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin, ftdetect)
- [thrift](https://github.com/solarnz/thrift.vim) (syntax, ftdetect) - [thrift](https://github.com/solarnz/thrift.vim) (syntax, ftdetect)
- [tmux](https://github.com/keith/tmux.vim) (syntax, ftplugin, ftdetect) - [tmux](https://github.com/keith/tmux.vim) (syntax, ftplugin, ftdetect)

View File

@@ -0,0 +1,21 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
if !exists('g:terraform_align')
let g:terraform_align = 0
endif
if g:terraform_align && exists(':Tabularize')
inoremap <buffer> <silent> = =<Esc>:call <SID>terraformalign()<CR>a
function! s:terraformalign()
let p = '^.*=[^>]*$'
if exists(':Tabularize') && getline('.') =~# '^.*=' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
let column = strlen(substitute(getline('.')[0:col('.')],'[^=]','','g'))
let position = strlen(matchstr(getline('.')[0:col('.')],'.*=\s*\zs.*'))
Tabularize/=/l1
normal! 0
call search(repeat('[^=]*=',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
endif
endfunction
endif
endif

1
build
View File

@@ -179,6 +179,7 @@ PACKS="
stylus:wavded/vim-stylus stylus:wavded/vim-stylus
swift:keith/swift.vim swift:keith/swift.vim
systemd:kurayama/systemd-vim-syntax systemd:kurayama/systemd-vim-syntax
terraform:hashivim/vim-terraform
textile:timcharper/textile.vim textile:timcharper/textile.vim
thrift:solarnz/thrift.vim thrift:solarnz/thrift.vim
tmux:keith/tmux.vim tmux:keith/tmux.vim

View File

@@ -925,6 +925,15 @@ au BufNewFile,BufRead *.timer set filetype=systemd
endif endif
" ftdetect/terraform.vim
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
au BufRead,BufNewFile *.tf setlocal filetype=terraform
au BufRead,BufNewFile *.tfvars setlocal filetype=terraform
au BufRead,BufNewFile *.tfstate setlocal filetype=javascript
endif
" ftdetect/textile.vim " ftdetect/textile.vim
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'textile') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'textile') == -1

48
indent/terraform.vim Normal file
View File

@@ -0,0 +1,48 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal nolisp
setlocal autoindent
setlocal indentexpr=TerraformIndent(v:lnum)
setlocal indentkeys+=<:>,0=},0=)
if exists("*TerraformIndent")
finish
endif
function! TerraformIndent(lnum)
" previous non-blank line
let prevlnum = prevnonblank(a:lnum-1)
" beginning of file?
if prevlnum == 0
return 0
endif
" previous line without comments
let prevline = substitute(getline(prevlnum), '//.*$', '', '')
let previndent = indent(prevlnum)
let thisindent = previndent
" block open?
if prevline =~ '[\[{]\s*$'
let thisindent += &sw
endif
" current line without comments
let thisline = substitute(getline(a:lnum), '//.*$', '', '')
" block close?
if thisline =~ '^\s*[\]}]'
let thisindent -= &sw
endif
return thisindent
endfunction
endif

675
syntax/terraform.vim Normal file
View File

@@ -0,0 +1,675 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
" Forked from Larry Gilbert's syntax file
" github.com/L2G/vim-syntax-terraform
if exists("b:current_syntax")
finish
endif
syn case match
syn keyword terraSection connection output provider variable data terraform
syn keyword terraValueBool true false on off yes no
""" data
syn keyword terraDataTypeBI
\ archive_file
\ atlas_artifact
\ aws_acm_certificate
\ aws_alb
\ aws_alb_listener
\ aws_ami
\ aws_availability_zone
\ aws_availability_zones
\ aws_billing_service_account
\ aws_caller_identity
\ aws_cloudformation_stack
\ aws_ebs_snapshot
\ aws_ebs_volume
\ aws_ecs_container_definition
\ aws_eip
\ aws_elb_service_account
\ aws_iam_account_alias
\ aws_iam_policy_document
\ aws_iam_server_certificate
\ aws_ip_ranges
\ aws_prefix_list
\ aws_redshift_service_account
\ aws_region
\ aws_route53_zone
\ aws_route_table
\ aws_s3_bucket_object
\ aws_security_group
\ aws_subnet
\ aws_vpc
\ aws_vpc_endpoint_service
\ aws_vpc_peering_connection
\ azurerm_client_config
\ consul_keys
\ docker_registry_image
\ external
\ fastly_ip_ranges
\ google_iam_policy
\ newrelic_application
\ null_data_source
\ opsgenie_user
\ pagerduty_user
\ pagerduty_vendor
\ scaleway_bootscript
\ scaleway_image
\ template_cloudinit_config
\ template_file
\ terraform_remote_state
""" end data sources
""" resource
syn keyword terraResourceTypeBI
\ arukas_container
\ atlas_artifact
\ aws_alb
\ aws_alb_listener
\ aws_alb_listener_rule
\ aws_alb_target_group
\ aws_alb_target_group_attachment
\ aws_ami
\ aws_ami_copy
\ aws_ami_from_instance
\ aws_ami_launch_permission
\ aws_api_gateway_account
\ aws_api_gateway_api_key
\ aws_api_gateway_authorizer
\ aws_api_gateway_base_path_mapping
\ aws_api_gateway_client_certificate
\ aws_api_gateway_deployment
\ aws_api_gateway_domain_name
\ aws_api_gateway_integration
\ aws_api_gateway_integration_response
\ aws_api_gateway_method
\ aws_api_gateway_method_response
\ aws_api_gateway_model
\ aws_api_gateway_resource
\ aws_api_gateway_rest_api
\ aws_app_cookie_stickiness_policy
\ aws_appautoscaling_policy
\ aws_appautoscaling_target
\ aws_autoscaling_attachment
\ aws_autoscaling_group
\ aws_autoscaling_lifecycle_hook
\ aws_autoscaling_notification
\ aws_autoscaling_policy
\ aws_autoscaling_schedule
\ aws_cloudformation_stack
\ aws_cloudfront_distribution
\ aws_cloudfront_origin_access_identity
\ aws_cloudtrail
\ aws_cloudwatch_event_rule
\ aws_cloudwatch_event_target
\ aws_cloudwatch_log_group
\ aws_cloudwatch_log_metric_filter
\ aws_cloudwatch_log_stream
\ aws_cloudwatch_log_subscription_filter
\ aws_cloudwatch_metric_alarm
\ aws_codecommit_repository
\ aws_codecommit_trigger
\ aws_codedeploy_app
\ aws_codedeploy_deployment_config
\ aws_codedeploy_deployment_group
\ aws_customer_gateway
\ aws_db_event_subscription
\ aws_db_instance
\ aws_db_option_group
\ aws_db_parameter_group
\ aws_db_security_group
\ aws_db_subnet_group
\ aws_default_network_acl
\ aws_default_route_table
\ aws_default_security_group
\ aws_directory_service_directory
\ aws_dynamodb_table
\ aws_ebs_snapshot
\ aws_ebs_volume
\ aws_ecr_repository
\ aws_ecr_repository_policy
\ aws_ecs_cluster
\ aws_ecs_service
\ aws_ecs_task_definition
\ aws_efs_file_system
\ aws_efs_mount_target
\ aws_eip
\ aws_eip_association
\ aws_elastic_beanstalk_application
\ aws_elastic_beanstalk_configuration_template
\ aws_elastic_beanstalk_environment
\ aws_elasticache_cluster
\ aws_elasticache_parameter_group
\ aws_elasticache_replication_group
\ aws_elasticache_security_group
\ aws_elasticache_subnet_group
\ aws_elasticsearch_domain
\ aws_elastictranscoder_pipeline
\ aws_elastictranscoder_preset
\ aws_elb
\ aws_elb_attachment
\ aws_emr_cluster
\ aws_emr_instance_group
\ aws_flow_log
\ aws_glacier_vault
\ aws_iam_access_key
\ aws_iam_account_password_policy
\ aws_iam_group
\ aws_iam_group_membership
\ aws_iam_group_policy
\ aws_iam_group_policy_attachment
\ aws_iam_instance_profile
\ aws_iam_policy
\ aws_iam_policy_attachment
\ aws_iam_role
\ aws_iam_role_policy
\ aws_iam_role_policy_attachment
\ aws_iam_saml_provider
\ aws_iam_server_certificate
\ aws_iam_user
\ aws_iam_user_login_profile
\ aws_iam_user_policy
\ aws_iam_user_policy_attachment
\ aws_iam_user_ssh_key
\ aws_instance
\ aws_internet_gateway
\ aws_key_pair
\ aws_kinesis_firehose_delivery_stream
\ aws_kinesis_stream
\ aws_kms_alias
\ aws_kms_key
\ aws_lambda_alias
\ aws_lambda_event_source_mapping
\ aws_lambda_function
\ aws_lambda_permission
\ aws_launch_configuration
\ aws_lb_cookie_stickiness_policy
\ aws_lb_ssl_negotiation_policy
\ aws_lightsail_domain
\ aws_lightsail_instance
\ aws_lightsail_key_pair
\ aws_load_balancer_backend_server_policy
\ aws_load_balancer_listener_policy
\ aws_load_balancer_policy
\ aws_main_route_table_association
\ aws_nat_gateway
\ aws_network_acl
\ aws_network_acl_rule
\ aws_network_interface
\ aws_opsworks_application
\ aws_opsworks_custom_layer
\ aws_opsworks_ganglia_layer
\ aws_opsworks_haproxy_layer
\ aws_opsworks_instance
\ aws_opsworks_java_app_layer
\ aws_opsworks_memcached_layer
\ aws_opsworks_mysql_layer
\ aws_opsworks_nodejs_app_layer
\ aws_opsworks_permission
\ aws_opsworks_php_app_layer
\ aws_opsworks_rails_app_layer
\ aws_opsworks_rds_db_instance
\ aws_opsworks_stack
\ aws_opsworks_static_web_layer
\ aws_opsworks_user_profile
\ aws_placement_group
\ aws_proxy_protocol_policy
\ aws_rds_cluster
\ aws_rds_cluster_instance
\ aws_rds_cluster_parameter_group
\ aws_redshift_cluster
\ aws_redshift_parameter_group
\ aws_redshift_security_group
\ aws_redshift_subnet_group
\ aws_route
\ aws_route53_delegation_set
\ aws_route53_health_check
\ aws_route53_record
\ aws_route53_zone
\ aws_route53_zone_association
\ aws_route_table
\ aws_route_table_association
\ aws_s3_bucket
\ aws_s3_bucket_notification
\ aws_s3_bucket_object
\ aws_s3_bucket_policy
\ aws_security_group
\ aws_security_group_rule
\ aws_ses_active_receipt_rule_set
\ aws_ses_configuration_set
\ aws_ses_event_destination
\ aws_ses_receipt_filter
\ aws_ses_receipt_rule
\ aws_ses_receipt_rule_set
\ aws_simpledb_domain
\ aws_snapshot_create_volume_permission
\ aws_sns_topic
\ aws_sns_topic_policy
\ aws_sns_topic_subscription
\ aws_spot_datafeed_subscription
\ aws_spot_fleet_request
\ aws_spot_instance_request
\ aws_sqs_queue
\ aws_sqs_queue_policy
\ aws_ssm_activation
\ aws_ssm_association
\ aws_ssm_document
\ aws_subnet
\ aws_volume_attachment
\ aws_vpc
\ aws_vpc_dhcp_options
\ aws_vpc_dhcp_options_association
\ aws_vpc_endpoint
\ aws_vpc_endpoint_route_table_association
\ aws_vpc_peering_connection
\ aws_vpn_connection
\ aws_vpn_connection_route
\ aws_vpn_gateway
\ aws_vpn_gateway_attachment
\ aws_waf_byte_match_set
\ aws_waf_ipset
\ aws_waf_rule
\ aws_waf_size_constraint_set
\ aws_waf_sql_injection_match_set
\ aws_waf_web_acl
\ aws_waf_xss_match_set
\ azure_affinity_group
\ azure_data_disk
\ azure_dns_server
\ azure_hosted_service
\ azure_instance
\ azure_local_network_connection
\ azure_security_group
\ azure_security_group_rule
\ azure_sql_database_server
\ azure_sql_database_server_firewall_rule
\ azure_sql_database_service
\ azure_storage_blob
\ azure_storage_container
\ azure_storage_queue
\ azure_storage_service
\ azure_virtual_network
\ azurerm_availability_set
\ azurerm_cdn_endpoint
\ azurerm_cdn_profile
\ azurerm_container_registry
\ azurerm_dns_a_record
\ azurerm_dns_aaaa_record
\ azurerm_dns_cname_record
\ azurerm_dns_mx_record
\ azurerm_dns_ns_record
\ azurerm_dns_srv_record
\ azurerm_dns_txt_record
\ azurerm_dns_zone
\ azurerm_eventhub
\ azurerm_eventhub_authorization_rule
\ azurerm_eventhub_consumer_group
\ azurerm_eventhub_namespace
\ azurerm_key_vault
\ azurerm_lb
\ azurerm_lb_backend_address_pool
\ azurerm_lb_nat_pool
\ azurerm_lb_nat_rule
\ azurerm_lb_probe
\ azurerm_lb_rule
\ azurerm_local_network_gateway
\ azurerm_network_interface
\ azurerm_network_security_group
\ azurerm_network_security_rule
\ azurerm_public_ip
\ azurerm_redis_cache
\ azurerm_resource_group
\ azurerm_route
\ azurerm_route_table
\ azurerm_search_service
\ azurerm_servicebus_namespace
\ azurerm_servicebus_subscription
\ azurerm_servicebus_topic
\ azurerm_sql_database
\ azurerm_sql_firewall_rule
\ azurerm_sql_server
\ azurerm_storage_account
\ azurerm_storage_blob
\ azurerm_storage_container
\ azurerm_storage_queue
\ azurerm_storage_share
\ azurerm_storage_table
\ azurerm_subnet
\ azurerm_template_deployment
\ azurerm_traffic_manager_endpoint
\ azurerm_traffic_manager_profile
\ azurerm_virtual_machine
\ azurerm_virtual_machine_extension
\ azurerm_virtual_machine_scale_set
\ azurerm_virtual_network
\ azurerm_virtual_network_peering
\ bitbucket_default_reviewers
\ bitbucket_hook
\ bitbucket_repository
\ chef_acl
\ chef_client
\ chef_cookbook
\ chef_data_bag
\ chef_data_bag_item
\ chef_environment
\ chef_node
\ chef_role
\ clc_group
\ clc_load_balancer
\ clc_load_balancer_pool
\ clc_public_ip
\ clc_server
\ cloudflare_record
\ cloudstack_affinity_group
\ cloudstack_disk
\ cloudstack_egress_firewall
\ cloudstack_firewall
\ cloudstack_instance
\ cloudstack_ipaddress
\ cloudstack_loadbalancer_rule
\ cloudstack_network
\ cloudstack_network_acl
\ cloudstack_network_acl_rule
\ cloudstack_nic
\ cloudstack_port_forward
\ cloudstack_private_gateway
\ cloudstack_secondary_ipaddress
\ cloudstack_security_group
\ cloudstack_security_group_rule
\ cloudstack_ssh_keypair
\ cloudstack_static_nat
\ cloudstack_static_route
\ cloudstack_template
\ cloudstack_vpc
\ cloudstack_vpn_connection
\ cloudstack_vpn_customer_gateway
\ cloudstack_vpn_gateway
\ cobbler_distro
\ cobbler_kickstart_file
\ cobbler_profile
\ cobbler_snippet
\ cobbler_system
\ consul_agent_service
\ consul_catalog_entry
\ consul_key_prefix
\ consul_keys
\ consul_node
\ consul_prepared_query
\ consul_service
\ datadog_monitor
\ datadog_timeboard
\ digitalocean_domain
\ digitalocean_droplet
\ digitalocean_floating_ip
\ digitalocean_record
\ digitalocean_ssh_key
\ digitalocean_tag
\ digitalocean_volume
\ dme_record
\ dnsimple_record
\ docker_container
\ docker_image
\ docker_network
\ docker_volume
\ dyn_record
\ fastly_service_v1
\ github_issue_label
\ github_membership
\ github_repository
\ github_repository_collaborator
\ github_team
\ github_team_membership
\ github_team_repository
\ google_compute_address
\ google_compute_autoscaler
\ google_compute_backend_service
\ google_compute_disk
\ google_compute_firewall
\ google_compute_forwarding_rule
\ google_compute_global_address
\ google_compute_global_forwarding_rule
\ google_compute_health_check
\ google_compute_http_health_check
\ google_compute_https_health_check
\ google_compute_image
\ google_compute_instance
\ google_compute_instance_group
\ google_compute_instance_group_manager
\ google_compute_instance_template
\ google_compute_network
\ google_compute_project_metadata
\ google_compute_region_backend_service
\ google_compute_route
\ google_compute_ssl_certificate
\ google_compute_subnetwork
\ google_compute_target_http_proxy
\ google_compute_target_https_proxy
\ google_compute_target_pool
\ google_compute_url_map
\ google_compute_vpn_gateway
\ google_compute_vpn_tunnel
\ google_container_cluster
\ google_dns_managed_zone
\ google_dns_record_set
\ google_project
\ google_pubsub_subscription
\ google_pubsub_topic
\ google_service_account
\ google_sql_database
\ google_sql_database_instance
\ google_sql_user
\ google_storage_bucket
\ google_storage_bucket_acl
\ google_storage_bucket_object
\ google_storage_object_acl
\ heroku_addon
\ heroku_app
\ heroku_cert
\ heroku_domain
\ heroku_drain
\ icinga2_checkcommand
\ icinga2_host
\ icinga2_hostgroup
\ icinga2_service
\ ignition_config
\ ignition_disk
\ ignition_file
\ ignition_filesystem
\ ignition_group
\ ignition_networkd_unit
\ ignition_raid
\ ignition_systemd_unit
\ ignition_user
\ influxdb_continuous_query
\ influxdb_database
\ influxdb_user
\ librato_alert
\ librato_service
\ librato_space
\ librato_space_chart
\ logentries_log
\ logentries_logset
\ mailgun_domain
\ mysql_database
\ mysql_grant
\ mysql_user
\ newrelic_alert_channel
\ newrelic_alert_condition
\ newrelic_alert_policy
\ newrelic_alert_policy_channel
\ nomad_job
\ null_resource
\ openstack_blockstorage_volume_attach_v2
\ openstack_blockstorage_volume_v1
\ openstack_blockstorage_volume_v2
\ openstack_compute_floatingip_v2
\ openstack_compute_instance_v2
\ openstack_compute_keypair_v2
\ openstack_compute_secgroup_v2
\ openstack_compute_servergroup_v2
\ openstack_compute_volume_attach_v2
\ openstack_fw_firewall_v1
\ openstack_fw_policy_v1
\ openstack_fw_rule_v1
\ openstack_lb_listener_v2
\ openstack_lb_loadbalancer_v2
\ openstack_lb_member_v1
\ openstack_lb_member_v2
\ openstack_lb_monitor_v1
\ openstack_lb_monitor_v2
\ openstack_lb_pool_v1
\ openstack_lb_pool_v2
\ openstack_lb_vip_v1
\ openstack_networking_floatingip_v2
\ openstack_networking_network_v2
\ openstack_networking_port_v2
\ openstack_networking_router_interface_v2
\ openstack_networking_router_route_v2
\ openstack_networking_router_v2
\ openstack_networking_secgroup_rule_v2
\ openstack_networking_secgroup_v2
\ openstack_networking_subnet_v2
\ openstack_objectstorage_container_v1
\ opsgenie_team
\ opsgenie_user
\ packet_device
\ packet_project
\ packet_ssh_key
\ packet_volume
\ pagerduty_escalation_policy
\ pagerduty_schedule
\ pagerduty_service
\ pagerduty_service_integration
\ pagerduty_team
\ pagerduty_user
\ postgresql_database
\ postgresql_extension
\ postgresql_role
\ postgresql_schema
\ powerdns_record
\ rabbitmq_binding
\ rabbitmq_exchange
\ rabbitmq_permissions
\ rabbitmq_policy
\ rabbitmq_queue
\ rabbitmq_user
\ rabbitmq_vhost
\ rancher_environment
\ rancher_registration_token
\ rancher_registry
\ rancher_registry_credential
\ rancher_stack
\ random_id
\ random_shuffle
\ rundeck_job
\ rundeck_private_key
\ rundeck_project
\ rundeck_public_key
\ scaleway_ip
\ scaleway_security_group
\ scaleway_security_group_rule
\ scaleway_server
\ scaleway_volume
\ scaleway_volume_attachment
\ softlayer_ssh_key
\ softlayer_virtual_guest
\ statuscake_test
\ tls_cert_request
\ tls_locally_signed_cert
\ tls_private_key
\ tls_self_signed_cert
\ triton_fabric
\ triton_firewall_rule
\ triton_key
\ triton_machine
\ triton_vlan
\ ultradns_dirpool
\ ultradns_probe_http
\ ultradns_probe_ping
\ ultradns_record
\ ultradns_tcpool
\ vcd_dnat
\ vcd_firewall_rules
\ vcd_network
\ vcd_snat
\ vcd_vapp
\ vsphere_file
\ vsphere_folder
\ vsphere_virtual_disk
\ vsphere_virtual_machine
""" end resources
syn keyword terraTodo contained TODO FIXME XXX BUG
syn cluster terraCommentGroup contains=terraTodo
syn region terraComment start="/\*" end="\*/" contains=@terraCommentGroup,@Spell
syn region terraComment start="#" end="$" contains=@terraCommentGroup,@Spell
syn region terraComment start="//" end="$" contains=@terraCommentGroup,@Spell
syn match terraResource /\<resource\>/ nextgroup=terraResourceTypeStr skipwhite
syn region terraResourceTypeStr start=/"/ end=/"/ contains=terraResourceTypeBI
\ nextgroup=terraResourceName skipwhite
syn region terraResourceName start=/"/ end=/"/
\ nextgroup=terraResourceBlock skipwhite
syn match terraData /\<data\>/ nextgroup=terraDataTypeStr skipwhite
syn region terraDataTypeStr start=/"/ end=/"/ contains=terraDataTypeBI
\ nextgroup=terraDataName skipwhite
syn region terraDataName start=/"/ end=/"/
\ nextgroup=terraDataBlock skipwhite
""" provider
syn match terraProvider /\<provider\>/ nextgroup=terraProviderName skipwhite
syn region terraProviderName start=/"/ end=/"/ nextgroup=terraProviderBlock skipwhite
""" provisioner
syn match terraProvisioner /\<provisioner\>/ nextgroup=terraProvisionerName skipwhite
syn region terraProvisionerName start=/"/ end=/"/ nextgroup=terraProvisionerBlock skipwhite
""" module
syn match terraModule /\<module\>/ nextgroup=terraModuleName skipwhite
syn region terraModuleName start=/"/ end=/"/ nextgroup=terraModuleBlock skipwhite
""" misc.
syn match terraValueDec "\<[0-9]\+\([kKmMgG]b\?\)\?\>"
syn match terraValueHexaDec "\<0x[0-9a-f]\+\([kKmMgG]b\?\)\?\>"
syn match terraBraces "[{}\[\]]"
""" skip \" in strings.
""" we may also want to pass \\" into a function to escape quotes.
syn region terraValueString start=/"/ skip=/\\\+"/ end=/"/ contains=terraStringInterp
syn region terraStringInterp matchgroup=terraBrackets start=/\${/ end=/}/ contains=terraValueFunction contained
"" TODO match keywords here, not a-z+
syn region terraValueFunction matchgroup=terraBrackets start=/[a-z]\+(/ end=/)/ contains=terraValueString,terraValueFunction contained
hi def link terraComment Comment
hi def link terraTodo Todo
hi def link terraBrackets Operator
hi def link terraProvider Structure
hi def link terraBraces Delimiter
hi def link terraProviderName String
hi def link terraResource Structure
hi def link terraResourceName String
hi def link terraResourceTypeBI Tag
hi def link terraResourceTypeStr String
hi def link terraData Structure
hi def link terraDataName String
hi def link terraDataTypeBI Tag
hi def link terraDataTypeStr String
hi def link terraSection Structure
hi def link terraStringInterp Identifier
hi def link terraValueBool Boolean
hi def link terraValueDec Number
hi def link terraValueHexaDec Number
hi def link terraValueString String
hi def link terraProvisioner Structure
hi def link terraProvisionerName String
hi def link terraModule Structure
hi def link terraModuleName String
hi def link terraValueFunction Identifier
let b:current_syntax = "terraform"
endif