この記事は Akatsuki Advent Calendar 2016の 2 日目、および Vim Advent Calendar 2016 (その2)の 2 日目、および Docker2 Advent Calendar 2016の 2 日目の記事です。
Dockerfile 書いてますか? 私はいつも Vim で書いています。
さて、Dockerfile の INSTRUCTION、いわゆる FROM
とか RUN
とかのアレですが、大文字小文字は区別しないとしつつも、大文字で書くことが推奨されています。
https://docs.docker.com/engine/reference/builder/#/format
The instruction is not case-sensitive. However, convention is for them to be UPPERCASE to distinguish them from arguments more easily.
しかし、毎回大文字で入力するのは面倒ですね。というわけで自動で大文字になるような設定をします。
自動で大文字にする設定
最新の Vim (少なくとも Vim 8.0 以降) では、Dockerfile
は自動で filetype dockefile として認識されます。そこで、dockerfile 向けの ftplugin の設定を作りました。
以下のファイルを、Vim の runtimepath 以下に置きます。Windows の場合は ~/vimfiles/ftplugin/dockerfile.vim
、それ以外の環境の場合は ~/.vim/ftplugin/dockerfile.vim
です。
function!s:head(str)letcol=col('.')let head = matchstr(getline('.'),'\c^\s*\%(ONBUILD\s\+\)\?')letcol-= len(head)ifcol-2< len(a:str)return toupper(a:str)endifreturna:str
endfunctionfors:instruction in [
\ 'from',
\ 'maintainer',
\ 'run',
\ 'cmd',
\ 'label',
\ 'expose',
\ 'env',
\ 'add',
\ 'copy',
\ 'entrypoint',
\ 'volume',
\ 'user',
\ 'workdir',
\ 'arg',
\ 'onbuild',
\ 'stopsignal',
\ 'arg',
\ 'healthcheck',
\ 'shell',
\ ]
execute 'inoreabbrev <buffer> <expr>'
\ s:instruction
\ printf('<SID>head(%s)', string(s:instruction))endfor
Vim には短縮入力(:help abbreviations)という機能があり、一定のルール内で入力を矯正する設定を作ることができます。
この設定では、各行の行頭で入力したものが小文字の INSTRUCTION だった場合に、それを自動で大文字にしています。ついでに ONBUILD
の後の INSTRUCTION にも対応しています。
Happy Vim and Docker Life!