1. Qiita
  2. 投稿
  3. Vim

Dockerfile の INSTRUCTION を自動で大文字で入力する

  • 30
    いいね
  • 0
    コメント

この記事は 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 です。

ftplugin/dockerfile.vim
function! s:head(str)
  let col = col('.')
  let head = matchstr(getline('.'), '\c^\s*\%(ONBUILD\s\+\)\?')
  let col -= len(head)
  if col - 2 < len(a:str)
    return toupper(a:str)
  endif
  return a:str
endfunction

for s:instruction in [
\   'from',
\   'maintainer',
\   'run',
\   'cmd',
\   'label',
\   'expose',
\   'env',
\   'add',
\   'copy',
\   'entrypoint',
\   'volume',
\   'user',
\   'workdir',
\   'arg',
\   'onbuild',
\   'stopsignal',
\   'healthcheck',
\   'shell',
\ ]
  execute 'inoreabbrev <buffer> <expr>'
  \ s:instruction
  \ printf('<SID>head(%s)', string(s:instruction))
endfor

Vim には短縮入力(:help abbreviations)という機能があり、一定のルール内で入力を矯正する設定を作ることができます。
この設定では、各行の行頭で入力したものが小文字の INSTRUCTION だった場合に、それを自動で大文字にしています。ついでに ONBUILD の後の INSTRUCTION にも対応しています。

dockerfile.gif

Happy Vim and Docker Life!