AIを使うようになってから発想が止まらない泉のようになってしまった。これができたら、あれができたら、あれとこれの関係は、あれをするならどっち。あれをしたいからアイデア出しから。などなど。で、AIにスクリプトを書かせたりするんだが、AIのミスもあったり、自分のミスがあったり、まぁ、時間泥棒。はっきり言って。スクリプトなんて、いつ動くかわからないやつだと、後で突然メンテナンスをすることに。一応は、lintをかけるようにはしているのだが、やらない時も。
もう一つ、過去にNYに88日間飛ばされていたことがあるのだが、とある製品のインストーラーの開発をしてて、なぜか日本語版だけさっぱり動かない(後で、英語版しか動いていないことが発覚)。スクリプトのエラーを直しては突破、直しては突破していたのだが、なんでデベロッパー連中は、バグを混入させるんだろうか?と会議で話題になった。とある人が自分のコンソールを覗いたとき、「こいつのviは色が付いているぞ!」「えっ、設定してなかったの」「知らなかったヨォ」、現地のすべてのマシンに自分のvimrcが投入されることになった。(実は、この手の作業が延々と続き、一度、ナイアガラの滝か、メキシコに行って、90日をリセットするので、会社が旅行手配するかもという話にもなった。)
つまり、viをどれだけちゃんと使っているかで仕事の能率は違う。それにしても、当時のプロジェクト、自分はイタリア人の開発のトップと仲が険悪だったし、ドイツのリーダーは一部の虚偽の報告を知らなかったことを詰められて泣いちゃうしとんでもねぇプロジェクトだったなぁ。当時のその製品のインストーラー、ほぼ自分が作ったと言っても過言じゃなかった。
閑話休題
エディタでやってくれも良くない、IDEみたいに。viにそんな機能があるらしい。
🧩 1. 環境前提
Ubuntu 22.04 / 24.04
Vim標準パッケージ(vim-noxまたはvim)がインストールされている前提。
RHEL系だと面倒の様子。
🛠️ 2. 必要パッケージのインストール
# — Install base linters —
sudo apt -y install vim-nox yamllint jq flake8 shellcheck shfmt
# — Optional linters (Go) —
ARCH=”$(dpkg –print-architecture 2>/dev/null || true)”
case “$ARCH” in
amd64) PARCH=”x86_64″ ;;
arm64) PARCH=”arm64″ ;;
*)
echo “Unsupported architecture: $ARCH”
exit 1
;;
esac
# golangci-lint (Go linter)
VERSION=2.5.0
curl -OL https://github.com/golangci/golangci-lint/releases/download/v$VERSION/golangci-lint-${VERSION}-linux-${ARCH}.deb
sudo dpkg -i golangci-lint-${VERSION}-linux-${ARCH}.deb
rm golangci-lint-${VERSION}-linux-${ARCH}.deb
ちなみに、lintは、あのlintの意味です。
🧠 3. Vim設定 (~/.vimrc)
” ===========================================================
” Vim + ALE Configuration (minimal & cross-language)
” ===========================================================
” — Encoding —
set encoding=utf-8
set fileencoding=utf-8
set fileformats=unix,dos,mac
” — Enable plugins & syntax —
filetype plugin indent on
syntax on
” — Basic UI —
set number
set relativenumber
set cursorline
set showmatch
set laststatus=2
colorscheme slate
” — Search —
set ignorecase
set smartcase
set incsearch
set hlsearch
set wrapscan
” — Indentation —
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
set smartindent
” — ALE setup —
if isdirectory(‘/usr/share/vim-ale’)
\ || isdirectory(‘/usr/share/nvim/site/pack/dist-bundle/opt/vim-ale’)
\ || filereadable(‘/usr/share/vim/vimfiles/autoload/ale.vim’)
packadd! ale
autocmd BufRead,BufNewFile * ALEEnable
let g:ale_linters = {
\ ‘python’: [‘flake8’],
\ ‘sh’: [‘shellcheck’],
\ ‘yaml’: [‘yamllint’],
\ ‘json’: [‘jq’],
\ ‘go’: [‘golangci-lint’],
\}
let g:ale_fixers = { ‘sh’: [‘shfmt’] }
let g:ale_fix_on_save = 1
let g:ale_sign_column_always = 1
let g:ale_echo_cursor = 1
let g:ale_statusline_format = [‘E%d’, ‘W%d’, ‘OK’]
else
autocmd VimEnter * echo “[WARN] vim-ale not found, skipping ALE setup”
endif
これで設定完了
✅ 4. 動作確認
Vimを起動し、:ALEInfo を実行して次のように出ればOK。
Enabled Linters: [‘flake8’, ‘shellcheck’, ‘yamllint’, ‘jq’]
Enabled Fixers: [‘shfmt’]
💣 5. サンプルエラーファイル集
以下を任意のファイル名で保存して開けば、ALEの動作を確認できます。エラーが含まれているファイルを開くデモ。
🐍 error.py
def hello()
print(“Hello world”)

(flake8 により「SyntaxError: expected ‘:’」が検出される)
🐚 error.sh
#!/bin/bash
if [ “$USER” = “root” ]
echo “Hello root”

(shellcheck により「missing ‘then’」などが検出される)
🧾 error.yaml
server:
host: localhost
port: “eighty”
– invalid_indent: true

(yamllint により「syntax error: mapping values are not allowed」など)
🧮 error.json
{
“name”: “test”,
“age”: 30,
“items”: [1, 2, 3,
}

(jq により「parse error: Expected another key-value pair」)
🐹 main.go
まず、サンプルプロジェクトを作る
mkdir -p ~/go_ale_demo && cd ~/go_ale_demo
go mod init example.com/demo
package main
import “fmt”
func main() {
fmt.Println(“Hello World”)
unused := 42
}

(golangci-lint により「declared but not used」)
🎉 6. まとめ
機能
|
使用パッケージ
|
---|---|
Python Lint
|
flake8
|
Shell Lint / Format
|
shellcheck, shfmt
|
YAML
|
yamllint
|
JSON
|
jq
|
Go
|
golangci-lint
|
これだけで、何も設定していないVimが強力なIDE並みの静的解析環境になります。あとで、lintにかけなくてもいいとは。人生、知らないことがあるとたくさん損するなぁ。