👊

Dockerを使ったコンテナ環境での開発にVimで立ち向かう

2020/12/06に公開

この記事はVim Advent Calendar 2020の6日目の記事です
昨日は@uhyoさんのVim ネタプラグイン集でした
見たことのないプラグインばかり紹介されていて面白かったですね

今年は業務の方でマイクロサービスアーキテクチャを導入したこともあり、Dockerをよく使った年でした
この記事はVimを使ったDocker環境での開発奮闘記です

Docker開発環境でのVim利用

Docker開発環境でのVim利用はいくつか方法があると思うのですが、
自分はシンプルに立ち上げたコンテナにVim と vimrc をインストールして、コンテナのシェルからVimを起動し、ファイルを編集しています
ネットの海に漂うDocker環境での開発についての記事には、ボリュームをホストマシンにマウントし、ホストマシンのエディタでコードを編集する方法を紹介するものが多いですが、この方法にはファイルアクセス速度等の許容できない部分があったのでやめました

ちなみに、 VSCode の場合だと Remote Container という拡張機能を使うことで、ホストマシンからコンテナ内のファイルに簡単にリモートアクセスできるので便利です
ホストマシンにボリュームをマウントする必要もありません
エディタにそこまでこだわりが無い人はこれ使った方が幸せになれると思います…


VSCodeのドキュメントより引用

Dockerのシェルへのアクセス

Dockerコンテナのシェルへのアクセスは、

docker exec -it コンテナ名 bash

のようなコマンドで可能なのですが、毎回コンテナ名を手動で入力するのが面倒でした

これはホストマシンのfishに以下の関数を定義してやることで、解消しました

function docker-exec
  set name (docker ps --format "{{.Names}}" | fzf)
  docker exec -it $name $argv
end

これを使うことでコンテナ名をfzfによる検索でとってきてシェルにアクセスできます

ここでVimを起動します

DockerのVim <- ホストマシン のコピ-ペースト

Docker上のVimにホストマシンのクリップボードの内容をペーストしようとすると、文字が消えたり改行部分のインデントが大きくなったりと色々めちゃくちゃな状態でペーストされてしまいます

これは :set paste:r!cat を使うことで回避することができます

ssh越しのvimにクリップボードからペーストする方法

Vimや周辺ツールのインストール

コンテナ毎にVimとその他周辺ツールを入れる必要があったので、扱うマイクロサービスが増えたりすると、毎回手動でそれらをインストールをする必要がありました

これはとても面倒だったので、shellscript を書いて全て自動化しました
書いた shellscript は github に上げているので、コンテナのシェルからコマンド一つ実行することでインストールが始まります

リポジトリ: https://github.com/uji/dotfiles

git clone https://github.com/uji/dotfiles.git ~/dotfiles && sh ~/dotfiles/install-linux.sh && source ~/.bashrc

さらに、Vim プラグインの削減や置き換えを行い、周辺ツールを最小限にしました
ランタイムのインストールをなくすために、dein.vim を minpac.vim に、coc.nvim を vim-lspにと、Vim scriptのみで書かれたプラグインを使うように利用するプラグインを乗り換えました

LSPは mattn/vim-lsp-settingsを使って、言語ごとに適宜インストールするようにしています
このプラグインは、去年の Vim Advent Calendar で作者ご本人より紹介記事が投稿されています

vim-lsp の導入コストを下げるプラグイン vim-lsp-settings を書いた。

改善したい点

新しめのバージョンのVimを使いたいがために、Vimをインストールする際にソースコードからビルドしています
これがなかなか時間がかかるので、ビルドしたものをどこか置いておくなどしようかなと考えてます
何か良い方法あれば教えてください

他にもこの記事で触れた部分で「これはこうした方が良い」とかあれば教えてもらえると助かります

明日は@imokurityさんの記事です

Discussion