この記事は Vim 駅伝 の
2024/10/04 の記事です。 前回の記事は yuys13 さんによる、 2024/10/02
の「Neovimが入れ子になるのを防ぐ 」という記事でした。
次回は 2024/10/07 に投稿される予定です。
この記事はなに?
mikoto2000/devcontainer.vim:
VSCode Dev Container の Vim 版。 VSCode 向けに作成された
devcontainer.json とは別に、後付け設定ファイルを追加するだけで Vim
による Dev Container 開発が可能になることを目指しています。 の
Getting Started として書かれた記事です。
リンクの通り、 VSCode 向けに作成された devcontainer.json
をそのまま使い、 Vim による Dev container
開発ができるようにするためのツールです。
前提
今回は、 Windows 上の WSL2 上の Ubuntu 24.04 で試すが、 Linux
であれば同様に実行できるはず…。
また、 Windows + Docker Desktop
の環境でも(マウントのパスを変えれば)実行可能なはず…
OS: Windows 11 Pro 23H2 ビルド 22631.4037
WSL2: Ubuntu: 24.04
docker
コマンドと docker compose
コマンドが利用可能であること
ゼロからコンテナを作る場合
手順概要
devcontainer.vim templates apply
コマンドで、 Dev
container の設定ひな形を生成する
必要に応じて「1.」で作成した devcontainer.json
を修正
devcontainer.vim config -g > .devcontainer/devcontainer.vim.json
で devcontainer.vim
の設定ひな形を生成する
必要に応じて
--home <ユーザーのホームディレクトリ>
でホームディレクトリとする場所を変更
必要に応じて「3.」で作成した devcontainer.vim.json
を修正
devcontainer.vim start .
を実行すると、コンテナ上で Vim
が立ち上がる
コンテナ上の Vim で開発を行う
Go 言語の環境を構築する
1.
devcontainer.vim templates apply
コマンドで、 Dev container
の設定ひな形を生成する
devcontainer.vim templates apply .
コマンドを実行すると、以下のようにどんな環境を構築するかの選択肢が出てくる。
$ devcontainer.vim templates apply .
Search: █
? Select Template:
▸ Alpine
Anaconda ( Python 3)
Anaconda ( Python 3) & PostgreSQL
C++
↓ C++ & MariaDB
この状態で Go
と入力し、 Go
にカーソルを合わせてエンターキーを押下する。
(ここで表示される環境は、 Available Dev Container
Templates でリストされている)
$ devcontainer.vim templates apply .
✔ Go
/home/mikoto/.cache/devcontainer.vim/bin/devcontainer aleady exist, use this.
run devcontainer: ` /home/mikoto/.cache/devcontainer.vim/bin/devcontainer templates apply --template-id ghcr.io/devcontainers/templates/go:4.0.0 --workspace-folder .`
[2024-09-29T11:01:54.691Z] @devcontainers/cli 0.68.0. Node.js v21.7.1. linux 5.15.153.1-microsoft-standard-WSL2 x64.
[2024-09-29T11:01:56.961Z] Files to omit: 'devcontainer-template.json, README.md, NOTES.md'
{ "files" :[ "./.devcontainer/devcontainer.json" , "./.github/dependabot.yml" ]}
そうすると、 .devcontainer/devcontainer.json
と、
.github/dependabot.yml
が生成される。
(今回の開発環境構築に関係ないので、 dependabot.yml
は無視する)
次のように、イメージ:
mcr.microsoft.com/devcontainers/go:1-1.22-bookworm
を使用する定義がされている。
$ cat .devcontainer/devcontainer.json
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/go
{
"name" : "Go" ,
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image" : "mcr.microsoft.com/devcontainers/go:1-1.22-bookworm"
// Features to add to the dev container. More info: https://containers.dev/features.
// "features" : {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts" : [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand" : "go version" ,
// Configure tool-specific properties.
// "customizations" : {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser" : "root"
}
2.
必要に応じて「1.」で作成した devcontainer.json
を修正
今回は必要が無いので修正しない。
いつもの開発であれば、気になるのでコメントを削除したりしている。
3.
devcontainer.vim config -g > .devcontainer/devcontainer.vim.json
で devcontainer.vim
の設定ひな形を生成する
devcontainer.vim config -g
で、「devcontainer.vim
用の設定ファイルひな形」が生成できるので、これを使って
.devcontainer/devcontainer.vim.json
を生成する。
次のように、 Vim や開発に必要な定義のひな形が生成される。
$ devcontainer.vim config -g > .devcontainer/devcontainer.vim.json
$ cat .devcontainer/devcontainer.vim.json
{
"remoteEnv" : {
"EDITOR" : "~/squashfs-root/AppRun" ,
"PAGER" : "sed -r 's/ \\ x1B \\ [[0-9;]*[mGKH]//g' | ~/squashfs-root/AppRun -R -" ,
"LESSCHARSET" : "utf-8" ,
"SHELL" : "bash" ,
"TERM" : "xterm-256color" ,
// If use WSLG
// "DISPLAY" : " ${localEnv : DISPLAY} " ,
// "WAYLAND_DISPLAY" : " ${localEnv : WAYLAND_DISPLAY} " ,
// "XDG_RUNTIME_DIR" : " ${localEnv : XDG_RUNTIME_DIR} " ,
// "PULSE_SERVER" : " ${localEnv : PULSE_SERVER} " ,
},
// devcontainer/cli はまだ forwardPorts に対応していないため、
// 必要に応じて forwardPorts の定義を appPort に転記する。
// ※ コンテナ側で Listen する際は、 ` 127.0.0.1 ` ** ではなく** ` 0.0.0.0 ` で Listen すること。
// "appPort" : [
// ],
"mounts" : [
{
"type" : "bind" ,
"source" : " ${localEnv : HOME} /.vim" ,
"target" : "/home/vscode/.vim"
},
{
"type" : "bind" ,
"source" : " ${localEnv : HOME} /.gitconfig" ,
"target" : "/home/vscode/.gitconfig"
},
{
"type" : "bind" ,
"source" : " ${localEnv : HOME} /.ssh" ,
"target" : "/home/vscode/.ssh"
},
// If use host's bashrc
//{
// "type": "bind",
// "source": "${localEnv:HOME}/.bashrc",
// "target": "/home/vscode/.bashrc"
//},
// If use WSLG
//{
// "type": "bind",
// "source": "/tmp/.X11-unix",
// "target": "/tmp/.X11-unix"
//},
//{
// "type": "bind",
// "source": "/mnt/wslg",
// "target": "/mnt/wslg"
//},
],
//"features": {
// "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {},
// "ghcr.io/devcontainers/features/docker-in-docker:2": {}
//}
}
4.
必要に応じて「3.」で作成した devcontainer.vim.json
を修正
今回は必要ないため修正しない。
GUI 開発なら WSLG 向けのコメントを外したり、サーバー開発なら
appPort
の定義を追加したりする。
(私の場合、サーバー開発なら docker-compose.yml
を作ってしまうので、この定義の出番はあまりない)
5.
devcontainer.vim start .
を実行すると、コンテナ上で Vim
が立ち上がる
次のコマンドを入力すると、ターミナルで Vim が立ち上がります。
docker run
で bash
の代わりに
vim
を立ち上げた感じですね。
ただし、 Vim
に必要な定義はバインドマウントでマウントされているため、いつも使っている
CUI 版 Vim と同じ使い心地で使えます。
6. コンテナ上の Vim
で開発を行う
main.go
を実装し、ターミナルを立ち上げ、
go run main.go
で Go プログラムが実行できる。
package main
import "fmt"
func main() {
fmt. Println( "Hello, World!" );
}
:terminal
して go run main.go
を実行する。
$ go run main.go
Hello, World!
大抵の LSP は自身の言語で書かれているので、 prabirshrestha/vim-lsp:
async language server protocol plugin for vim and neovim と mattn/vim-lsp-settings:
Auto configurations for Language Server for vim-lsp
以上。
参考資料