- 技術 💻
補完とは?コード補完・Tab補完・データの補完を動かして比較
結論
補完(ほかん)とは、足りない部分を補って完全にすることです。IT では「書きかけのコードやコマンドの続きを候補から埋める」ことと、「データの抜け(欠損値)を推定した値で埋める」ことの2つの意味でよく使います。どちらも「欠けたところを埋める」点は同じですが、埋める材料と、間違えたときの影響がまったく違います。
この記事でわかること
- ふだんの「補完」と、コード補完・Tab 補完・データの補完・入力補完の意味の違い
- bash の complete・compgen、LSP のコード補完、pandas の fillna と interpolate を実際に動かした出力
- Tab 補完が効かない・補完した値がずれる、などのエラー原文と直し方
「補完」は、ビジネス文書では「両者は互いに補完し合う関係」のように、足りないところを補い合う意味で使われます。プログラミングの世界に入ると、同じ言葉が「Tab キーを押すとファイル名の続きが出る」「エディタが候補を出す」「欠けた測定値を埋める」と、場面ごとに別の機能を指すようになります。この記事は、その場面ごとの意味を1つずつ、実際に動かした画面とコードで見ていく入口の記事です。
flowchart LR
A[補完] --> B[入力の補完]
A --> C[データの補完]
B --> D[コード補完]
B --> E[Tab 補完]
B --> F[入力欄]
C --> G[固定値]
C --> H[推定値]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| 補完とは(意味) | 足りない部分を補って完全にすること | 補完とは(ふだんの意味とITでの意味) |
| 補完と補間の違い | 補完は欠けを埋める全般、補間は点と点の間を計算で求めること | 補完と補間の違い |
| コード補完とは | エディタが入力中のコードの続きを候補として出す機能 | コード補完とは(LSPの仕組み) |
| VS Code で補完を出すキー | Windows・Linux は Ctrl+Space、Mac は Control+Space | VS Codeのコード補完とAIのインライン候補 |
| Tab 補完とは | シェルで Tab キーを押すとコマンド名やファイル名の続きが埋まる機能 | シェルのTab補完とは |
| Tab 補完が効かない | bash-completion が読み込まれていない、sh で動いている、など | OS別:Tab補完が効かないとき |
| 欠損値の補完(pandas) | 固定値は fillna、前後の値は ffill・bfill、推定は interpolate | データの補完とは |
| 入力補完(autocomplete) | HTML の autocomplete 属性でブラウザの自動入力の種類を指定する | 入力補完(HTMLのautocomplete属性) |
確認環境:Ubuntu 24.04.5 LTS の上で、GNU bash 5.2.21 を設定ファイルなしで起動し、tmux 3.4 から実際に Tab キーを送って画面を取得しました(Tab 補完の結果は実行した画面の写しです)。bash-completion 2.11-8 は apt-get download した .deb を作業用のフォルダに展開して読み込み、システムにはインストールしていません。コード補完は python-lsp-server 1.15.0(jedi 0.20.1、作業用の venv)を起動し、自作のクライアントから LSP の textDocument/completion を送って応答と所要時間を測りました。Python 3.13.18 の対話モードの補完、git 2.43.0 のブランチ名の補完、pandas 3.0.5・NumPy 2.5.3・SciPy 1.18.1 での欠損値の補完、Chromium 153.0.8010.12(Playwright 1.63.0)で 127.0.0.1 の自分のページを開いた autocomplete 属性の確認も、すべてこの環境で実行しています。VS Code・GitHub Copilot・PowerShell・Homebrew・zsh は手元で動かしていないため、それぞれの公式ドキュメントで確かめた範囲だけを書きました。図は mermaid で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「補完とは?コード補完・Tab補完・データの補完を動かして比較」
補完とは(ふだんの意味とITでの意味)
この節では、「補完」という言葉がふだんの日本語と IT・プログラミングでそれぞれ何を指すのかが分かります。
補完は「補う」と「完全にする」を合わせた言葉で、欠けている部分を埋めて全体をそろえることを指します。 英語では文脈により completion(入力の補完)、complement(互いに補い合う)、imputation(欠損値の補完)と訳し分けます。IT でいちばん多いのは completion の意味で、入力の途中までを見て残りを埋める機能です。
同じ「補完」でも、場面ごとに埋める材料と結果の確かさが違います。検索して話がかみ合わないときは、たいていこの表のどの行の話かがずれています。
| 場面 | 補完が指すもの | 具体例 | 埋める材料 |
|---|---|---|---|
| ふだんの日本語 | 足りないところを補い合う | 「営業と開発が互いに補完する」 | 相手の得意分野 |
| コード補完(エディタ) | 書きかけのコードの続きを候補で出す | name.up → upper() |
型・定義・ライブラリの情報 |
| Tab 補完(シェル) | コマンド名・ファイル名・引数の続きを埋める | cat rep → cat report_2026.txt |
実在するファイル・登録された候補 |
| 入力補完(ブラウザ・スマホ) | 保存済みの住所・メール・予測変換を出す | メール欄に以前入力したアドレス | 過去の入力・保存した情報 |
| データの補完(分析) | 欠損値を推定値や固定値で埋める | 抜けた日の気温を前後の日から計算 | 前後の値・平均・モデル |
| 文字列補間(プログラム) | 文字列の中に変数の値を埋め込む | f"hello {name}" |
変数の値 |
入力の補完とデータの補完の違い
表の上半分(コード・シェル・入力欄)と下半分(データ)は、性質が大きく違います。
入力の補完(completion)
候補は実在するものから選ぶ
採用するかは人が決める(Tab・Enter)
間違えてもその場で気づける
データの補完(imputation)
値は計算で作った推定値
プログラムが一度に何千行も埋める
間違いが集計や学習結果に紛れて残る
入力の補完は「打つ手間を減らす道具」で、データの補完は「分析の前提を変える処理」です。後者は方法を選び間違えると、集計結果の平均が4ポイント下がるような大きなずれになります(データの補完の節で実測します)。
補完と補間の違い(文字列補間・データの補間)
この節では、読みが同じ「補完」と「補間」の使い分けと、プログラミングでよく見る「文字列補間」の意味が分かります。
補間(ほかん)は、分かっている点と点の「間」の値を計算で求めることです。 英語の interpolation の訳語で、数学・画像処理・アニメーションで使います。一方の補完は欠けを埋めること全般を指す、より広い言葉です。データ分析では、欠損値を前後の値から直線で埋める処理を「線形補間」とも「補完」とも呼ぶため、両方の表記が混在しています。
| 言葉 | 英語 | 意味 | よく出る場面 |
|---|---|---|---|
| 補完 | completion・complement・imputation | 欠けた部分を埋めて完全にする | コード補完・Tab 補完・欠損値の補完 |
| 補間 | interpolation | 既知の点の間の値を計算で求める | 線形補間・画像の拡大・アニメーションの中割り |
| 外挿 | extrapolation | 既知の範囲の外側の値を推定する | 最後の測定値より先の予測 |
| 文字列補間 | string interpolation | 文字列の中に式の値を埋め込む | f-string・テンプレートリテラル |
文字列補間は「補完」と書かれることがありますが、英語が interpolation なので「補間」が正しい表記です。3つの言語で同じことをすると、次のようになりました。
$ python3 -c "name='RJC'; print(f'hello {name}')"
hello RJC
$ node -e 'const name="RJC"; console.log(`hello ${name}`)'
hello RJC
$ name=RJC; echo "hello ${name}"
hello RJC
迷ったときの使い分け
- 入力の続きを出す機能:「補完」(コード補完・入力補完)。「補間」とは書かない。
- 2点の間を計算で埋める:「補間」(線形補間・スプライン補間)。pandas の
interpolateはこちら。 - 欠損値を何らかの方法で埋める処理の総称:「補完」(欠損値補完)。中身が線形補間なら「線形補間で補完した」と書くと誤解がない。
コード補完とは(LSPの仕組みを実際に呼び出す)
この節では、エディタのコード補完がどこから候補を持ってくるのかを、言語サーバーに実際に問い合わせた結果で理解できます。
コード補完とは、エディタが入力中のコードを解析し、続きに書けるメソッド名・変数名・キーワードを候補として出す機能です。 VS Code では IntelliSense、JetBrains 系では Code Completion と呼びます。今のエディタの多くは、補完の計算をエディタ本体ではなく「言語サーバー」という別のプロセスに任せ、LSP(Language Server Protocol)という共通の約束ごとで問い合わせます。
エディタがファイルの中身を送る
開いたときに textDocument/didOpen、書き換えるたびに didChange で、最新の本文を言語サーバーに渡す。
「.」を打つと補完を問い合わせる
カーソルの行と列を付けて textDocument/completion を送る。Ctrl+Space でも同じ問い合わせになる。
サーバーが型を解析して候補を返す
変数の型、import したライブラリ、クラスの定義をたどり、書ける名前の一覧を JSON で返す。
エディタが一覧を表示し、人が選ぶ
Tab か Enter で採用すると、insertText の文字が挿入される。
言語サーバーに直接問い合わせた結果
Python の言語サーバー python-lsp-server を起動し、エディタの代わりに自作の小さなクライアントから問い合わせました。送ったのは次の JSON です(行と列は0から数えます)。
{"jsonrpc": "2.0", "id": 2, "method": "textDocument/completion",
"params": {"textDocument": {"uri": "file:///dev/shm/t184/lsp/app.py"},
"position": {"line": 1, "character": 7}}}
ファイルの中身は name = "rjc" と name.up の2行です。サーバーは、name が文字列であることを解析して、次の候補を返しました。
try1: 1 items, 1704 ms
try2: 1 items, 89 ms
{
"label": "upper()",
"kind": 3,
"sortText": "aupper",
"insertText": "upper",
"data": {
"doc_uri": "file:///dev/shm/t184/lsp/app.py"
}
}
画面に出る文字(label)は upper() ですが、実際に挿入される文字(insertText)は upper です。kind の 3 は LSP の仕様で Function(関数)を表し、エディタはこの番号でアイコンを切り替えます。自作のクラスで試すと、属性とメソッドが混ざって26個返りました。
try1: 26 items, 418 ms
email | 6 |
greet() | 3 |
name | 6 |
__annotations__ | 6 |
__class__ | 10 |
__delattr__(name) | 3 |
kind 6 は Variable(変数)、10 は Property です。self.email = email と書いただけの属性も候補に出ており、言語サーバーがコードを読んで型を推定していることが分かります。
エディタを開いた直後に補完が出るまで少し待たされるのは、この初回の解析のためです。2回目以降は100ミリ秒前後で返りました。
同じコードでも補完が出ない場合
import pandas as pd のあとに df.fill と書いて問い合わせると、最初は候補が0個でした。
try1: 0 items, 348 ms
try2: 0 items, 3 ms
原因は、言語サーバーが動いている venv に pandas が入っていなかったことです。言語サーバーの設定で pandas が入った Python(/usr/bin/python3)を指定し直すと、候補が返りました。
try1: 1 items, 2332 ms
fillna(value, axis, inplace, limit) | 3 |
コード補完が出ないときは、エディタが見ている Python(インタープリター)と、ライブラリを入れた Python が同じかを最初に確かめます。 VS Code では「Python: Select Interpreter」がこの設定にあたります。
対話モード(REPL)の補完
Python の対話モードでも Tab で補完できます。json.lo まで打って Tab を2回押した画面です。
>>> import json
>>> json.load
json.load( json.loads(
1回目の Tab で共通部分の load まで埋まり、2回目で候補が並びました。この補完は標準ライブラリの rlcompleter が行っており、プログラムから呼ぶと同じ候補が得られます。
import rlcompleter, json
c = rlcompleter.Completer({'json': json})
print([c.complete('json.du', i) for i in range(3)])
# ['json.dump(', 'json.dumps(', None]
VS Codeのコード補完とAIのインライン候補
この節では、VS Code で補完を出す・選ぶ・止めるための操作と設定、AI による候補との違いが分かります。
VS Code の公式ドキュメントでは、IntelliSense はコード補完・パラメーター情報・クイック情報・メンバー一覧をまとめた呼び名とされています。 JavaScript・TypeScript・JSON・HTML・CSS・SCSS・Less は最初から対応し、それ以外の言語は拡張機能を入れるまで「ファイル内の単語」による補完だけになります。
| やりたいこと | Windows・Linux | Mac |
|---|---|---|
| 補完の候補を出す | Ctrl+Space | Control+Space |
| 候補を採用する | Tab または Enter | Tab または Enter |
| AI のインライン候補を採用する | Tab | Tab |
| AI の候補を1単語だけ採用する | Ctrl+→ | Command+→ |
| 候補を閉じる | Esc | Esc |
ほかのショートカットは、関連記事「VSCodeショートカット一覧|Win/Mac対応130項目とAI操作・変更方法」で扱っています。
補完の動きを変える設定
公式ドキュメントに載っている主な設定と既定値です。settings.json に書くと変えられます。
| 設定名 | 既定値 | 変えるとどうなるか |
|---|---|---|
editor.quickSuggestions |
コードは true、コメント・文字列は false | 文字列の中でも候補を出したいときに strings を true にする |
editor.acceptSuggestionOnEnter |
"on" | "smart" で文字が変わるときだけ Enter で採用、"off" で Enter は改行だけ |
editor.tabCompletion |
"off" | "on" で候補一覧を出さずに Tab で補完する |
editor.suggestSelection |
"first" | "recentlyUsed" で最近使った候補を先頭で選ぶ |
editor.snippetSuggestions |
"inline" | "top" でスニペットを上に、"none" で出さない |
editor.wordBasedSuggestions |
"matchingDocuments" | 単語による補完の対象を変える |
Enter で候補が勝手に入って改行できない、というつまずきは、editor.acceptSuggestionOnEnter を "smart" か "off" にすると収まります。
従来の補完とAIの補完の違い
GitHub Copilot などの AI は、カーソルの後ろに薄い文字(ゴーストテキスト)で数行分の候補を出します。VS Code の公式ドキュメントでは、Tab で採用、Esc で閉じる操作になっています。従来の補完とは、候補の作り方が根本的に違います。
言語サーバーの補完
型と定義から「書ける名前」を一覧にする
存在しないメソッドは出ない
ネットワークに出ずに動く
AI のインライン候補
前後のコードから「書きそうな続き」を生成する
それらしいが存在しない関数を書くことがある
多くはクラウドのモデルに送って生成する
AI の候補は、言語サーバーの補完のように「存在するものから選ぶ」仕組みではありません。採用したあとに型チェックやテストで確かめる前提で使います。Copilot の操作と設定は、関連記事「GitHub Copilotの使い方|ショートカット・コマンド一覧と設定」で扱っています。ターミナルで動くエディタで LSP の補完を設定する方法は、関連記事「Neovimとは|インストール・init.lua設定・lazy.nvim・LSP入門」で扱っています。
シェルのTab補完とは(bashの操作と complete・compgen)
この節では、ターミナルで Tab キーを押したときに何が起きているのかを、bash の実際の画面と complete・compgen の出力で理解できます。
Tab 補完とは、シェルでコマンド名・ファイル名・オプションの途中まで打って Tab キーを押すと、残りが自動で埋まる機能です。 打ち間違いが減り、長いファイル名を正確に入力できます。bash では Readline というライブラリが入力を受け持ち、Tab を押すと bash に「この単語の候補は何か」を尋ねます。
Tab を1回押す・2回押す
設定ファイルを読まない素の bash で、tmux から実際に Tab を送った画面です。フォルダには readme.md・report_2026.txt・src/ があります。
$ ech[Tab] → $ echo
$ cat rep[Tab] → $ cat report_2026.txt
$ cd s[Tab] → $ cd src/
$ ls r[Tab] → $ ls re
$ ls re[Tab][Tab]
readme.md report_2026.txt
候補が1つ
Tab 1回で最後まで埋まる。ファイルなら後ろに空白、フォルダなら / が付く。
echo・report_2026.txt
候補が複数
Tab 1回で共通部分(re)まで埋まり、そこで止まる。
ls r → ls re
もう1回 Tab
2回目で候補の一覧が出る。続きを1文字打って再び Tab を押す。
Tab Tab で一覧
候補なし
何も起きない(端末によってはベルが鳴る)。綴りかフォルダを疑う。
反応がないのも情報
git のサブコマンドが補完されない理由
同じ素の bash で git che や git checkout fe を Tab で補完しようとすると、何も起きませんでした。
$ git che[Tab] → $ git che (変化なし)
$ git checkout fe[Tab] → $ git checkout fe(変化なし)
$ git c[Tab][Tab] → (一覧も出ない)
素の bash が知っているのは「1語目はコマンド名、2語目以降はファイル名」という決まりだけです。git のサブコマンドやブランチ名の候補は、bash-completion というパッケージの補完の定義を読み込んで初めて出ます。展開した bash-completion 2.11 を読み込んでから同じ操作をすると、次のように変わりました。
$ git checkout fe[Tab]
$ git checkout feature/login
$ git checkout f[Tab][Tab]
feature/login fix/typo
$ git c[Tab][Tab]
checkout cherry-pick clang-format clean commit
cherry citool clang-format-18 clone config
ブランチ名 feature/login は、ファイルとしてはフォルダに無い名前です。git の補完の定義がリポジトリの中を調べて候補にしています。git che だけは checkout・cherry・cherry-pick の3つに当たるため、1回の Tab では埋まりませんでした。
complete:コマンドごとの補完の定義
bash は、コマンド名ごとに「どう補完するか」の定義(compspec)を持っています。complete -p で一覧を、complete -p 名前 で1つを表示できます。
素の bash
$ complete -p | wc -l
0
bash-completion を読み込んだ直後
$ complete -p | wc -l
139
$ complete -p git
bash: complete: git: no completion specification
git で一度 Tab を押したあと
$ complete -p | wc -l
148
$ complete -p git
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git
読み込んだ直後は git の定義がまだ無く、最初に Tab を押した瞬間に読み込まれました。bash-completion は741個のコマンドの定義を持っていますが、起動時にすべては読まず、使ったコマンドの分だけをあとから読む作りです。-F __git_wrap__git_main は「候補は __git_wrap__git_main という関数に計算させる」という意味です。
compgen:候補だけを取り出して確かめる
compgen は、Tab を押したときに出る候補を画面に出力するだけのコマンドです。補完の定義を作るときの部品にもなります。
$ compgen -W "start stop status restart" -- st
start
stop
status
$ compgen -c gre
gregorio
grep
gresource
$ compgen -f re
readme.md
report_2026.txt
$ compgen -d
src
.git
$ compgen -A variable BASH_V
BASH_VERSINFO
BASH_VERSION
| オプション | 候補になるもの | 使う場面 |
|---|---|---|
-W "語の並び" |
指定した単語の一覧 | サブコマンドや決まった値 |
-c |
コマンド名(PATH・関数・エイリアス・組み込み) | 1語目 |
-f・-d |
ファイル名・フォルダ名 | 引数がパスのとき |
-A variable |
シェル変数の名前 | 変数名を受け取る自作コマンド |
-X "パターン" |
パターンに合う候補を除く(! で反転) | 拡張子で絞る |
-F 関数(complete 側) |
関数が COMPREPLY に入れた候補 | 状況で候補を変える |
bash の help complete には、-D(定義の無いコマンドの既定)・-E(空の行での補完)・-I(1語目の補完)の順に適用されることも書かれています。bash の設定ファイルの書き方そのものは、関連記事「Linux alias設定と.bashrcの書き方|おすすめエイリアス50選」で扱っています。
自作コマンドにTab補完を付ける
この節では、自分で作ったスクリプトや関数に、サブコマンドやオプションの Tab 補完を付ける方法が分かります。
いちばん簡単なのは complete -W で候補の単語を並べる方法で、状況によって候補を変えたいときは complete -F で関数を登録します。 例として、deploy start --env prod のように使う自作コマンドに補完を付けます。
拡張子で絞る1行の補完
引数に .txt ファイルだけを受け取るコマンドなら、1行で書けます。
$ complete -f -X '!*.txt' showtxt
$ complete -p showtxt
complete -f -X '!*.txt' showtxt
$ compgen -f -X '!*.txt' ""
report_2026.txt
-X '!*.txt' は「*.txt に合わないものを除く」という意味で、readme.md と src は候補から外れました。
関数で候補を切り替える
1つ前の単語を見て、候補を切り替える関数です。COMP_WORDS は入力中の行を単語に分けた配列、COMP_CWORD はカーソルがある単語の番号、COMPREPLY は関数が候補を入れて返す配列です。
_deploy() {
local cur prev
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
case $prev in
deploy) COMPREPLY=( $(compgen -W "start stop status rollback" -- "$cur") ) ;;
--env) COMPREPLY=( $(compgen -W "dev staging prod" -- "$cur") ) ;;
*) COMPREPLY=( $(compgen -W "--env --dry-run --help" -- "$cur") ) ;;
esac
}
complete -F _deploy deploy
このファイルを読み込んだ bash で、tmux から Tab を送った画面です。
$ deploy [Tab][Tab]
rollback start status stop
$ deploy ro[Tab]
$ deploy rollback
$ deploy start --env [Tab][Tab]
dev prod staging
$ deploy start --env p[Tab]
$ deploy start --env prod
$ deploy start -[Tab]
$ deploy start --
$ DEPLOY st[Tab]
$ DEPLOY st (大文字のコマンド名には定義が無いので変化なし)
関数を1つのファイルに書く
例:~/.local/share/bash-completion/completions/deploy。bash-completion はこの場所をコマンド名で探し、使うときに読み込む。
compgen で候補を確かめる
Tab を押す前に compgen -W "..." -- st で、出したい候補が出るかを確かめる。
新しいシェルで Tab を押す
開き直すか source で読み込み、complete -p deploy で登録を確かめる。
OS別:Tab補完が効かないときの設定(Linux・Mac・Windows)
この節では、Linux・Mac・Windows それぞれで Tab 補完を有効にする方法と、効かないときの症状別の直し方が分かります。
Linux(Ubuntu・Debian)
Ubuntu の /etc/bash.bashrc には、bash-completion を読み込む行がコメントアウトされた状態で入っています。手元で確かめると、次の行でした。
$ grep -n completion /etc/bash.bashrc
42:# enable bash completion in interactive shells
44:# if [ -f /usr/share/bash-completion/bash_completion ]; then
45:# . /usr/share/bash-completion/bash_completion
通常のユーザーは、新しく作られる ~/.bashrc の中で読み込まれます。この環境のように bash-completion パッケージ自体が入っていないと、読み込む先のファイルが無いため、git のサブコマンドなどが補完されません。
sudo apt install bash-completion
# ~/.bashrc に次が無ければ追加する
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
fi
Mac(zsh・bash)
今の macOS のターミナルの既定のシェルは zsh です。zsh の公式マニュアルでは、補完の仕組みは compinit を読み込んで呼ぶことで有効になると書かれています。
# ~/.zshrc
autoload -U compinit
compinit
Homebrew で入れた bash を使う場合は、Homebrew の bash-completion@2(2026年10月29日時点で 2.18.0、bash 4.2 以上が対象)を入れ、案内に従って ~/.bash_profile に次の行を書きます。
[[ -r "$HOMEBREW_PREFIX/etc/profile.d/bash_completion.sh" ]] && . "$HOMEBREW_PREFIX/etc/profile.d/bash_completion.sh"
Windows(PowerShell)
Microsoft Learn の about_Tab_Expansion では、PowerShell ではコマンド名・パラメーター名・引数の値・ファイルパスを Tab で補完でき、Tab を繰り返し押すと候補が順に切り替わると説明されています。PSReadLine の Ctrl+Space を押すと、候補が一覧(メニュー)で表示されます。
PS> Get-Con<Tab>
PS> Get-Content
bash は「共通部分まで埋めて一覧を出す」、PowerShell は「1つずつ順番に切り替える」という違いがあります。PowerShell 7.0 からは、列挙型の値や ValidateSet の値も補完されます。
症状→原因→直し方
| 症状 | 主な原因 | 直し方 |
|---|---|---|
| ファイル名は補完されるが git のサブコマンドが出ない | bash-completion が入っていない・読み込まれていない | パッケージを入れ、~/.bashrc で読み込む |
| Tab を押すとタブ文字が入る・何も起きない | sh(dash)など補完の無いシェルで動いている | echo $0 でシェルを確かめ、bash か zsh を使う |
| 大文字と小文字が違うと補完されない | Readline の既定は大文字小文字を区別する | ~/.inputrc に set completion-ignore-case on |
| Tab を2回押さないと一覧が出ない | Readline の既定の動き | ~/.inputrc に set show-all-if-ambiguous on |
| 自作の補完でファイル名の空白が分かれる | COMPREPLY に入れるときに空白で分割された | IFS を改行にし、-o filenames を付ける |
| _init_completion: command not found | bash-completion 本体を読まずに個別の定義だけ読み込んだ | 先に bash_completion 本体を読み込む |
~/.inputrc の2行は、作業用の inputrc を作って INPUTRC で指定した bash で確かめました。ls RE で Tab を1回押すだけで、小文字のファイルが一覧で出ました。
$ printf 'set completion-ignore-case on\nset show-all-if-ambiguous on\n' > inputrc
$ ls RE[Tab]
readme.md report_2026.txt
$ cat REP[Tab]
$ cat report_2026.txt
データの補完とは(pandasのfillnaとinterpolateの違い)
この節では、データ分析でいう「欠損値の補完」の方法と、pandas の fillna・ffill・bfill・interpolate の結果の違いが分かります。
データの補完とは、測定の抜けや未入力で空になった値(欠損値、pandas では NaN)を、何らかの値で埋めることです。 空のままだと平均や合計の計算、機械学習のモデルに渡せない場面があるため、埋めるか、その行を除くかを決める必要があります。埋め方は大きく「固定値で埋める」「前後の値をそのまま使う」「前後から計算で推定する」の3つです。
同じデータを6通りで補完した結果
日付がところどころ飛んでいる気温のデータ(10月5日と7〜9日は測定なし)に、欠損を4つ入れて6通りで補完しました。
import pandas as pd, numpy as np
s = pd.Series([10.0, np.nan, np.nan, 16.0, np.nan, 20.0, np.nan],
index=pd.to_datetime(['2026-10-01','2026-10-02','2026-10-03','2026-10-04',
'2026-10-06','2026-10-10','2026-10-11']), name='temp')
df = pd.DataFrame({'元': s,
'fillna(0)': s.fillna(0), 'fillna(mean)': s.fillna(s.mean()),
'ffill': s.ffill(), 'bfill': s.bfill(),
'linear': s.interpolate(), 'time': s.interpolate(method='time')})
print(df.to_string())
元 fillna(0) fillna(mean) ffill bfill linear time
2026-10-01 10.0 10.0 10.000000 10.0 10.0 10.0 10.000000
2026-10-02 NaN 0.0 15.333333 10.0 16.0 12.0 12.000000
2026-10-03 NaN 0.0 15.333333 10.0 16.0 14.0 14.000000
2026-10-04 16.0 16.0 16.000000 16.0 16.0 16.0 16.000000
2026-10-06 NaN 0.0 15.333333 16.0 20.0 18.0 17.333333
2026-10-10 20.0 20.0 20.000000 20.0 20.0 20.0 20.000000
2026-10-11 NaN 0.0 15.333333 20.0 NaN 20.0 20.000000
1linear は日付を見ない
10月6日を、4日(16)と10日(20)のちょうど真ん中の 18 にした。行の並びを等間隔として扱うため。
2time は日付の間隔を見る
4日から10日までの6日のうち2日目なので 16+4×2/6=17.33。日付が飛ぶデータでは time が自然。
3末尾の扱いが違う
bfill は後ろに値が無いので NaN のまま。linear と time は最後の値 20 をそのまま延ばした。
最後の行は、前後に挟まれていない「外側」の欠損です。interpolate の既定(limit_direction が forward)は最後の値で埋めますが、これは推定というより値を延ばしただけです。公式ドキュメントにある limit_area='inside' を付けると、両側に値がある欠損だけを埋められます。
元 ffill(limit=1) linear inside linear both
0 10.0 10.0 10.0 10.0
1 NaN 10.0 12.0 12.0
2 NaN NaN 14.0 14.0
3 16.0 16.0 16.0 16.0
4 NaN 16.0 18.0 18.0
5 20.0 20.0 20.0 20.0
6 NaN 20.0 NaN 20.0
ffill(limit=1) は連続した欠損の1つ目だけを埋め、2つ目は NaN のまま残しました。長い抜けを同じ値で塗りつぶさないための指定です。
主な補完方法の一覧
| 書き方 | 埋める値 | 向くデータ | 注意点 |
|---|---|---|---|
fillna(0) |
決めた固定値 | 「無い=0件」と言える件数・金額 | 測定値に使うと平均が大きく下がる |
fillna(s.mean()) |
平均値(中央値も可) | 順番に意味の無い表データ | ばらつきが小さく見える |
ffill() |
直前の値 | 変わるまで同じ値が続く状態・設定 | 長い抜けが平らになる |
bfill() |
直後の値 | 先頭の欠損を埋める補助 | 未来の値を使うので予測には使えない |
interpolate() |
前後を直線で結んだ値 | 等間隔に並んだ連続量 | 日付の間隔は見ない |
interpolate(method='time') |
日時の間隔に比例した値 | 日時が飛ぶ測定データ | DatetimeIndex が要る |
interpolate(method='cubic') など |
曲線で結んだ値 | なめらかに変わる量 | SciPy が要る・端で振れることがある |
pandas の公式ドキュメントでは、nearest・quadratic・cubic・polynomial などは SciPy の interp1d に、spline は UnivariateSpline に渡されると説明されています。polynomial と spline は order(次数)の指定が必須です。pandas のほかの操作は、関連記事「pandasの使い方 逆引き81選|pandas 3.0の実行結果つき」で扱っています。
補完方法で誤差はどれだけ変わるか(実測)
この節では、補完方法の選び方で結果がどれだけ変わるのかを、正解の分かっているデータで測った数値で確かめられます。
答えが分かっているデータから値をわざと抜き、各方法で埋めた値と本当の値のずれ(RMSE:二乗平均平方根誤差)を比べました。 データは1時間ごとの気温を模した14日分(336点)で、1日周期で上下する波に小さな揺れを加えています。抜く量はどちらも63点(約19%)で、ばらばらに抜いた場合と、6時間の塊で抜いた場合を比べました。
| 補完方法 | RMSE(ばらばらに欠損) | RMSE(6時間の塊で欠損) | 全体の平均(真は 20.02) |
|---|---|---|---|
| fillna(0) | 20.68 | 20.80 | 16.23 |
| fillna(平均) | 4.27 | 4.69 | 19.97 |
| ffill | 1.75 | 4.05 | 19.94 |
| interpolate(linear) | 0.69 | 2.06 | 19.98 |
| interpolate(time) | 0.69 | 2.06 | 19.98 |
| interpolate(cubic) | 0.92 | 1.47 | 19.97 |
読み取れることは3つです。1つ目に、測定値を0で埋めると平均が3.8度も下がり、集計結果そのものが変わりました。2つ目に、欠損がばらばらなら線形補間がいちばん小さい誤差でした。3つ目に、6時間の塊で抜けると ffill の誤差は2.3倍に増え、山や谷を通る区間を曲線で結ぶ cubic が逆転しました。どの方法が良いかはデータの形と欠損の並び方で変わるため、正解の分かる部分で一度試してから決めるのが確実です。
import pandas as pd, numpy as np
rng = np.random.default_rng(29)
idx = pd.date_range('2026-10-01', periods=24*14, freq='h')
true = pd.Series(20 + 6*np.sin(2*np.pi*np.arange(len(idx))/24)
+ rng.normal(0, 0.5, len(idx)), index=idx)
s = true.copy()
m = rng.random(len(s)) < 0.2 # 約2割をわざと抜く
s[m] = np.nan
filled = s.interpolate(limit_direction='both')
rmse = np.sqrt(((filled[m] - true[m])**2).mean())
print(f'{rmse:.2f}')
補完する前に確かめること
- 1欠損の数と場所を数えるs.isna().sum() で件数、連続している長さも見る。塊の欠損は推定が難しい
- 2なぜ欠けたかを考える機械の停止・入力漏れ・「該当なし」の意味の空欄では、埋め方が違う
- 3補完したことを記録する補完前の欠損の位置を別の列(is_imputed など)に残すと、あとで除外して比べられる
- 4未来の値を使っていないか予測モデルの学習で bfill や両側の補間を使うと、その時点で知りえない値が混ざる
入力補完(HTMLのautocomplete属性とdatalist)
この節では、Web フォームでブラウザが名前やメールアドレスを自動で入れる「入力補完」を、HTML の autocomplete 属性でどう指定するかが分かります。
autocomplete 属性は、その入力欄に「何の情報が入るか」をブラウザに伝える属性です。 MDN では、on は自動入力を許可、off は許可しない指定とされ、email・postal-code・new-password のような値で種類を細かく伝えられます。127.0.0.1 に置いた自分のページを Chromium 153 で開き、属性と JavaScript から見える値(input.autocomplete)を比べました。
<form id="f1" action="/send" method="post">
<label>メール <input type="email" name="email" autocomplete="email"></label>
<label>郵便番号 <input name="zip" autocomplete="shipping postal-code"></label>
<label>新しいパスワード <input type="password" name="pw" autocomplete="new-password"></label>
<label>確認コード <input name="otp" inputmode="numeric" autocomplete="one-time-code"></label>
<label>誤記 <input name="bad" autocomplete="mail"></label>
</form>
id 属性の値 input.autocomplete
name 'name' 'name'
email 'email' 'email'
zip 'shipping postal-code' 'shipping postal-code'
pw 'new-password' 'new-password'
otp 'one-time-code' 'one-time-code'
q 'off' 'off'
bad 'mail' '' ← 仕様に無い値は空になる
none (属性なし) ''
inherit (属性なし・form が off)''
override 'on'(form が off) 'on'
autocomplete="mail" のような綴り違いは、エラーにならずに空として扱われました。画面上は何も起きないため気づきにくい間違いです。form 要素に autocomplete="off" を付けても子の input 側の値は空のままで、input に on を書くとそちらが優先されます。
datalist で候補を出す
ブラウザに保存された情報ではなく、ページ側で用意した候補を出したいときは datalist を使います。
<label>都道府県 <input name="pref" list="prefs" autocomplete="off"></label>
<datalist id="prefs">
<option value="東京都"><option value="神奈川県"><option value="千葉県">
</datalist>
Chromium のアクセシビリティツリーを取り出すと、ふつうの入力欄が textbox なのに対し、list を付けた欄は combobox になり、autocomplete: 'list'・hasPopup: 'listbox' が付いていました。スクリーンリーダーにも「候補の一覧がある入力欄」として伝わります。
textbox メール {'invalid': 'false', 'focusable': True, 'editable': 'plaintext', ...}
combobox 都道府県 {'invalid': 'false', 'focusable': True, 'editable': 'plaintext',
'autocomplete': 'list', 'hasPopup': 'listbox', ...}
autocomplete="off" が効かない場面
ログイン欄の自動入力を止めたいとき
autocomplete="off" を付ける。MDN によると、多くのブラウザはログイン欄ではこの指定を無視してパスワードマネージャーを動かすcurrent-password、登録・変更は new-password と正しく書き分ける。ブラウザが強いパスワードの提案や誤入力の防止をしやすくなるoff は CAPTCHA やワンタイムの値など、保存に意味が無い欄に限る
MDN では、正しい autocomplete の値を付けることが WCAG 2.2 の達成基準 1.3.5「入力目的の特定」(レベル AA)を満たすことにもつながると説明されています。入力の手間を減らすことは、手や指の操作が難しい人や、記憶の負担を減らしたい人にとっても意味があります。input の種類ごとの違いは、関連記事「HTML input type 一覧|全22種の用途・値の形式・検証結果の早見表」で扱っています。
よくあるエラー・つまずき(原文と直し方)
この節では、補完まわりで実際に出たエラーの原文と、その原因・直し方が分かります。
| 出た文言・症状 | 場面 | 原因 | 直し方 |
|---|---|---|---|
bash: _init_completion: command not found |
Tab 補完 | bash-completion 本体を読まずに、個別の定義ファイルだけを source した | 本体の bash_completion を先に読み込む |
syntax error near unexpected token `(' |
補完の定義の読み込み | 定義が extglob を前提にしている | 本体経由で読み込む(本体が extglob を有効にする) |
complete: git: no completion specification |
complete -p | 定義がまだ読み込まれていない(使うときに読み込む方式) | 一度 Tab を押すと登録される |
TypeError: NDFrame.fillna() got an unexpected keyword argument 'method' |
pandas 3.0 | fillna の method 引数が削除された | s.ffill()・s.bfill() に書き換える |
TypeError: Cannot interpolate with str dtype |
pandas | 文字列の列に interpolate を使った | 数値の列だけ選ぶか、文字列は fillna・ffill で埋める |
ValueError: You must specify the order of the spline or polynomial. |
pandas | polynomial・spline で order を省いた | interpolate(method='polynomial', order=2) |
ValueError: time-weighted interpolation only works on Series or DataFrames with a DatetimeIndex |
pandas | 日時の index が無いのに method='time' | set_index で日時の列を index にする |
ChainedAssignmentError: A value is being set on a copy ... |
pandas 3.0 | df['a'].fillna(0, inplace=True) は元の表を変えない |
df['a'] = df['a'].fillna(0) |
空白を含むファイル名が分かれる
自作の補完関数で COMPREPLY=( $(compgen -f ...) ) と書くと、my report.txt が2つの候補に分かれました。
$ viewbad my[Tab][Tab]
my report.txt
$ viewgood my[Tab]
$ viewgood my\ report.txt
直した版は、関数の中で local IFS=$'\n' として改行だけで分割し、complete -o filenames で登録しています。空白の前に \ が付き、1つのファイル名として補完されました。
_good() { local IFS=$'\n'; COMPREPLY=( $(compgen -f -- "${COMP_WORDS[COMP_CWORD]}") ); }
complete -o filenames -F _good viewgood
inplace で埋めたはずが埋まっていない
pandas 3.0 では Copy-on-Write が既定になり、列を取り出してから inplace で埋める書き方は元の表を変えません。実行すると警告が出て、表は NaN のままでした。
ChainedAssignmentError: A value is being set on a copy of a DataFrame or Series
through chained assignment using an inplace method.
...
chained inplace df= [1.0, nan, 3.0]
警告文が勧めているとおり、df['a'] = df['a'].fillna(0) と代入し直すか、df.fillna({'a': 0}, inplace=True) のように表に対して呼びます。
補完の種類と方法を選ぶ判断表
この節では、やりたいことから、どの補完を使い、どの方法を選べばよいかが分かります。
| やりたいこと | 使う補完 | 最初に試す方法 |
|---|---|---|
| エディタでメソッド名を思い出したい | コード補完 | Ctrl+Space。出なければインタープリターの設定を確かめる |
| 関数の中身ごと書いてほしい | AI のインライン候補 | Copilot などを有効にし、採用後にテストで確かめる |
| ターミナルで長いファイル名を打ちたい | Tab 補完 | 途中まで打って Tab、複数あれば Tab を2回 |
| git のブランチ名を補完したい | Tab 補完(bash-completion) | bash-completion を入れて読み込む |
| 自作コマンドに補完を付けたい | complete | 固定の候補は -W、状況で変えるなら -F |
| フォームの入力を楽にしたい | 入力補完 | autocomplete 属性に正しい値を書く |
| 測定データの抜けを埋めたい | データの補完 | 日時があれば interpolate(method='time') |
| 件数の空欄を埋めたい | データの補完 | 「無い=0」と言えるときだけ fillna(0) |
欠損値の補完方法を決める順番
- 1空欄に意味がある → 埋めずに別の値として扱う「回答なし」「該当なし」は欠損ではなく1つの選択肢
- 2無い=0 と言える → fillna(0)売上件数・エラー件数など、記録が無いことが0を意味する列
- 3次に変わるまで同じ値が続く → ffill在庫数・設定値・ステータス。limit で延ばす長さを決める
- 4連続して変わる量 → interpolate気温・センサー値。日時が飛ぶなら method='time'、端は limit_area='inside'
- 5順番に意味が無い表 → 平均・中央値、またはモデル補完した印を別の列に残し、補完しない場合と結果を比べる
よくある質問
この節では、補完について検索でよく見かける疑問への短い答えが分かります。
Q. 補完の読み方と英語は?
「ほかん」と読みます。入力の補完は completion、互いに補い合う意味は complement、欠損値の補完は imputation と訳すのが一般的です。
Q. 補完と補間はどちらが正しいですか?
意味で使い分けます。入力の続きを出す機能は「補完」、点と点の間を計算する処理は「補間」です。文字列に変数を埋め込む string interpolation は「文字列補間」と書きます。
Q. コード補完とオートコンプリートは同じですか?
ほぼ同じ意味で使われます。オートコンプリートは入力の続きを自動で出す機能全般の呼び名で、エディタの中で型やライブラリをもとに候補を出すものを特にコード補完と呼ぶことが多いです。
Q. VS Code で補完が出なくなりました。
公式ドキュメントでは、まず VS Code の再起動(言語サービスが止まっている場合がある)を挙げています。Python なら、選んでいるインタープリターにライブラリが入っているかを確かめます。この記事の実験でも、ライブラリの無い環境を見ていた言語サーバーは候補を0個返しました。
Q. Tab 補完は zsh と bash で違いますか?
どちらも Tab で補完できますが、設定の仕組みが違います。bash は complete と bash-completion、zsh は compinit で有効にする補完の仕組みを使います。zsh は候補をメニューで選ぶ動きを設定しやすいのが特徴です。
Q. Tab 補完を使うと何が良いのですか?
打つ量が減るだけでなく、実在するファイル名やブランチ名だけが埋まるため、綴りの間違いが減ります。補完されないこと自体が「その名前は無い」という手がかりにもなります。
Q. 欠損値はいつも補完したほうがよいですか?
いいえ。欠損が少なく偏りも無ければ、その行を除く(dropna)ほうが素直な場合があります。補完は値を作り出す処理なので、どの方法で何件埋めたかを記録し、補完しない場合と結果を比べられるようにしておくと安全です。
Q. fillna と interpolate の違いは?
fillna は指定した値(0・平均など)で埋め、interpolate は前後の値から計算した推定値で埋めます。前後の値をそのまま写す ffill・bfill は、pandas 3.0 では fillna の引数ではなく独立したメソッドです。
Q. autocomplete="off" にすればブラウザは何も保存しませんか?
保証されません。MDN によると、多くのブラウザはログイン欄ではこの指定を無視します。止める目的よりも、正しい値を書いて正しく補完させる目的で使う属性です。
Q. スマホの予測変換を消したいときは?
端末の日本語入力(キーボード)の設定で、学習した候補を消す項目があります。手順は OS や入力ソフトの公式ヘルプで確かめるのが確実です。Web ページの autocomplete 属性とは別の仕組みです。
まとめ
- 補完とは、足りない部分を補って完全にすること。 IT では「入力の続きを埋める」と「データの欠損を埋める」の2系統がある。
- コード補完は言語サーバーが型を解析して候補を返す仕組み。 初回は1〜2秒、2回目以降は約0.1秒。出ないときはインタープリターの設定を疑う。
- bash の Tab 補完は、素のままではコマンド名とファイル名だけ。 git のサブコマンドやブランチ名は bash-completion の定義で補完され、自作コマンドには complete -W・-F で付けられる。
- データの補完は方法で結果が変わる。 測定値を0で埋めると平均が3.8度下がり、塊の欠損では ffill の誤差が2.3倍になった。日時が飛ぶなら interpolate(method='time')。
- 入力補完は autocomplete 属性に正しい値を書く。 綴り違いは黙って空になり、ログイン欄の off は無視されることがある。
参考・出典
確認日はいずれも 2026年10月29日です。
- Visual Studio Code「IntelliSense」:https://code.visualstudio.com/docs/editing/intellisense
- Visual Studio Code「Inline suggestions from GitHub Copilot in VS Code」:https://code.visualstudio.com/docs/copilot/ai-powered-suggestions
- Microsoft「Language Server Protocol Specification」:https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/
- python-lsp-server(GitHub):https://github.com/python-lsp/python-lsp-server
- Python ドキュメント「rlcompleter --- GNU readline向け補完関数」:https://docs.python.org/ja/3/library/rlcompleter.html
- GNU「Bash Reference Manual」8.6 Programmable Completion:https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html
- bash-completion(GitHub):https://github.com/scop/bash-completion
- Homebrew Formulae「bash-completion@2」:https://formulae.brew.sh/formula/bash-completion@2
- zsh「Completion System」:https://zsh.sourceforge.io/Doc/Release/Completion-System.html
- Microsoft Learn「about_Tab_Expansion」:https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_tab_expansion
- pandas「pandas.DataFrame.interpolate」:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.interpolate.html
- pandas「pandas.DataFrame.fillna」:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.fillna.html
- pandas「Copy-on-Write (CoW)」:https://pandas.pydata.org/docs/user_guide/copy_on_write.html
- MDN「HTML 属性: autocomplete」:https://developer.mozilla.org/ja/docs/Web/HTML/Reference/Attributes/autocomplete
- MDN「<datalist>: HTML データリスト要素」:https://developer.mozilla.org/ja/docs/Web/HTML/Reference/Elements/datalist
- W3C「Understanding Success Criterion 1.3.5: Identify Input Purpose」:https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「補完とは?コード補完・Tab補完・データの補完を動かして比較」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。