vimのCloudFormation用snippetをgithubのawsdocsからaws-cfn-snippet経由で生成取得してみる
CloudFormationのテンプレートスニペットをvimで補完させるため、aws-cfn-snippetを導入してみました。
一部処理にて筆者のzsh環境では正常に動作せず、幾つかの手直しを行いました。aws-cfn-snippetの紹介と手直しを行った箇所について、vimでのsnippet補完導入からaws-cfn-snippetのインストールも含め、順を追って説明します。
aws-cfn-snippetとは
awsdocs/aws-cloudformation-user-guideから取得したdocsを利用して、vim用のCloudFormation用snippetを生成更新するライブラリです。今後vim plugin化も予定されているとのことです。
lunarxlark/aws-cfn-snippet.vim Qiita: CloudFormationのvim snippetを作ってみた
snippet補完の導入
Shougo/neosnippet.vimのInstallationに従ってプラグインを導入し、Configurationの内容をvimrcへ追記します。
aws-cfn-snippetの導入
現時点ではsnippetを指定ディレクトリに個別コピーする形になります。
% git clone git@github.com:lunarxlark/aws-cfn-snippet.vim.git % cp aws-cfn-snippet.vim/snippets/*.snip ~/.vim/bundle/vim-snippets/snippets/
make-cfn-snippet.shでの更新
筆者環境で動作するように変更した内容になります。また、awsdocs/aws-cloudformation-user-guideのsubmodule化も合わせて行っています。
サブモジュール化
ディレクトリ内に丸ごとgit cloneをする仕組みになっていましたが、ディレクトリ移動せずに
git submodule foreach git pull origin master
で済ませてしまいたい為の変更です。
% cd aws-cfn-snippet.vim % rm -rf aws-cloudformation-user-guide % git rm aws-cloudformation-user-guide % git add submodule git@github.com:awsdocs/aws-cloudformation-user-guide.git aws-cloudformation-user-guide
make-cfn-snippet.shの変更
大筋として以下の通りになります。
- submoduleの更新取得を追加
- bashのuppercase/lowercaseが動作しなかったため、awkのtoupperに代替
- aws-cloudformation-user-guide.gitのclone関連処理を削除
- 処理が正常なのか確認したかったため、処理中のファイル名を出力させた
- 生成後にsnippetsディレクトリへコピー
なお、sedによる整形処理には手を加えていません。
#!/bin/bash home=$(cd $(dirname $0);pwd) git submodule foreach git pull origin master aws_cfn_doc_repo=${home}/aws-cloudformation-user-guide aws_cfn_doc_dir=${aws_cfn_doc_repo}/doc_source cd ${aws_cfn_doc_dir} for file_type in yaml json do # initialize snip=${home}/snippets/${file_type}.snip if [ -e "${snip}" ];then rm ${snip}; fi large_file_type=$(echo $file_type | awk '{ str = toupper($1); print str }') # AWS Resource snippets echo "### AWS Resource snippets" >> ${snip} for FILE in `grep -r "^### ${large_file_type}" ${aws_cfn_doc_dir} | awk -F: '{ print $1 }' | sort -u` do echo $FILE echo "snippet " `sed -n 1P $FILE | sed -e "s/^# //g" -e "s/<a .*//g" -e "s/ /::/g"` >> ${snip} start=$(expr $(sed -ne '/^### '${large_file_type}'/,$p' $FILE | grep -n "\`\`\`" | awk -F: 'NR==1 { print $1}') + 1) end=$(expr $(sed -ne '/^### '${large_file_type}'/,$p' $FILE | grep -n "\`\`\`" | awk -F: 'NR==2 { print $1}') - 1) sed -ne '/^### '${large_file_type}'/,$p' $FILE | \ sed -ne "${start},${end}p" | \ sed -e "s/^/ /g" | \ sed -e "s/([^)]*)//g" | \ sed -e "s/\[//g" -e "s/\]//g" >> ${snip} echo "" >> ${snip} echo "" >> ${snip} done # Resource Properties snippets echo "### Resource Properties snippets" >> ${snip} for FILE in `grep "^### ${large_file_type}" aws-properties-* | awk -F: '{ print $1 }' | sort -u` do echo -n "snippet " >> ${snip} echo -n `sed -n 1P $FILE | sed -e "s/^# //g" -e "s/<a .*//g" -e "s/.* //g"` >> ${snip} echo $FILE | sed -e "s/aws-properties//g" -e "s/.md//g" >> ${snip} start=$(expr $(sed -ne '/^### '${large_file_type}'/,$p' $FILE | grep -n "\`\`\`" | awk -F: 'NR==1 { print $1}') + 1) end=$(expr $(sed -ne '/^### '${large_file_type}'/,$p' $FILE | grep -n "\`\`\`" | awk -F: 'NR==2 { print $1}') - 1) sed -ne '/^### '${large_file_type}'/,$p' $FILE | \ sed -ne "${start},${end}p" | \ sed -e "s/^/ /g" | \ sed -e "s/([^)]*)//g" | \ sed -e "s/\[//g" -e "s/\]//g" >> ${snip} echo "" >> ${snip} echo "" >> ${snip} done done cat << EOS >> ${home}/snippets/yaml.snip snippet AWSTemplateFormatVersion AWSTemplateFormatVersion: "2010-09-09" Description: A sample template Resources: MyEC2Instance: # inline comment Type: "AWS::EC2::Instance" ... EOS # refact sed -i -e "s/ $//g" ${home}/snippets/*.snip echo "Copy to vim-snippets" cp ${home}/snippets/*.snip ~/.vim/bundle/vim-snippets/snippets/
make-cfn-snippet.shの実行
sedでのillegal byte sequence対策で、実行前にexportします。
% export LANG=C; sh make-cfn-snippet.sh
まとめ
実行環境に依存するとは思いますが、エラーが発生した場合の参考になれれば幸いです。
各種エディタにおける補完
CloudFormationのsnippet補完は各種エディタにおいても、以下のようにアドオン等導入することにより可能になります。CloudFormationでの作業時には大きなサポートになってくれると思います。