内蔵ターミナルの起動
:terminal(省略形 :term)コマンドで、現在のウィンドウにシェルを開きます。
デフォルトシェル(zsh / bash)が起動します。
:term ← 省略形
:split | term ← 横分割してターミナルを開く
:vsplit | term ← 縦分割してターミナルを開く
:term python3 ← 特定のコマンドを直接実行
ターミナルモードの操作
ターミナルを開くと Neovim は ターミナルモード という特殊な状態になります。 このモードでは通常のVimコマンドは使えません。シェルにキー入力が渡されます。
モード切り替えのキー
| キー | 動作 |
|---|---|
| i または a | ターミナルモードへ入る(シェルの操作ができるようになる) |
| Ctrl-\ Ctrl-n | ターミナルモードを抜けてNormalモードへ(ターミナルバッファ内) |
| Ctrl-\ Ctrl-o | Normalモードで1コマンドだけ実行してターミナルモードへ戻る |
Ctrl-\ Ctrl-n を必ず覚える
ターミナルモードから抜けるには Ctrl-\、Ctrl-n の2ステップが必要です。
Esc はデフォルトでは使えません(後述のキーマップで設定可能)。
ターミナルバッファの基本的な流れ
:split | term
2. 自動でターミナルモードになる(またはiを押す)
$ git status
On branch main...
3. Normalモードに戻って別ウィンドウへ移動
Ctrl-\ Ctrl-n ← ターミナルモードを抜ける
Ctrl-k ← 上のウィンドウ(エディタ)へ移動
ウィンドウ分割でターミナルを並べる
Neovim のウィンドウ分割機能を使えば、編集中のファイルとターミナルを並べて表示できます。 縦分割・横分割の組み合わせで自分好みのレイアウトを作りましょう。
分割コマンド
| コマンド | 動作 |
|---|---|
| :split | 横分割(上下に並べる) |
| :vsplit | 縦分割(左右に並べる) |
| :sp | term | 横分割してターミナルを開く |
| :vs | term | 縦分割してターミナルを開く |
| Ctrl-w h/j/k/l | 左・下・上・右のウィンドウへ移動 |
| Ctrl-w = | 全ウィンドウを均等なサイズに |
| Ctrl-w _ | 現在のウィンドウを最大化(高さ) |
| Ctrl-w | | 現在のウィンドウを最大化(幅) |
| :close | 現在のウィンドウを閉じる |
| :only | 現在のウィンドウだけ残して他を閉じる |
ターミナルウィンドウのリサイズ
ウィンドウのサイズはキーマップか :resize コマンドで調整できます。
| コマンド / キー | 動作 |
|---|---|
| :resize 20 | 横分割ウィンドウの高さを20行に |
| :resize +5 | 高さを5行増やす |
| :vertical resize 80 | 縦分割ウィンドウの幅を80列に |
| Ctrl-w + | 高さを1行増やす |
| Ctrl-w - | 高さを1行減らす |
| Ctrl-w > | 幅を1列増やす |
| Ctrl-w < | 幅を1列減らす |
map("n", "<leader>th", ":resize 15<CR>") のように、
ターミナルを小さくする / 大きくするキーを設定しておくと便利です。
toggleterm.nvim — おすすめプラグイン
toggleterm.nvim は、 キー1つでターミナルをトグル(開閉)できるプラグインです。 フローティングウィンドウ・分割・タブなど表示スタイルを選べます。
{
"akinsho/toggleterm.nvim",
version = "*",
opts = {
size = function(term)
if term.direction == "horizontal" then
return 15 -- 横分割時の高さ(行数)
elseif term.direction == "vertical" then
return vim.o.columns * 0.4 -- 縦分割時の幅(40%)
end
end,
open_mapping = [[<C-\>]], -- Ctrl+\ でトグル
direction = "horizontal", -- "horizontal" | "vertical" | "float"
shade_terminals = true,
shading_factor = 2,
start_in_insert = true,
persist_size = true,
float_opts = {
border = "curved",
winblend = 3,
},
},
}
toggleterm の主な機能
| 操作 | 動作 |
|---|---|
| Ctrl-\ | ターミナルのトグル(開く / 閉じる) |
| :TermSelect | 複数のターミナルを選択して切り替え |
| :ToggleTerm direction=float | フローティングウィンドウで開く |
| :ToggleTerm direction=tab | 新しいタブとして開く |
| 1<C-\> | 1番のターミナルをトグル |
| 2<C-\> | 2番のターミナルをトグル(複数管理) |
Neovim とターミナル間のテキストコピー
ターミナルの出力をエディタに取り込んだり、エディタのテキストをターミナルに貼り付けたりする操作を整理します。
ターミナルの出力をエディタにコピーする
Ctrl-\ Ctrl-n ← ターミナルモードを抜ける
V ← 行選択モードへ
3j ← 3行選択
y ← ヤンク(コピー)
Ctrl-k ← 上のウィンドウ(エディタ)へ移動
p ← 貼り付け
方法②:システムクリップボードを使う(clipboard=unnamedplus 設定済みの場合)
マウスで選択してターミナルウィンドウにコピー → Neovim で p
エディタのテキストをターミナルに渡す
:!python3 % ← 現在のファイルを Python で実行
:!bash % ← 現在のシェルスクリプトを実行
方法②:選択範囲をシェルに渡す
V ← 行を選択
:!sh ← 選択行をシェルで実行して結果を表示
ターミナル用キーマップ設定例
デフォルトのターミナル操作は少し不便なので、キーマップを設定して快適にします。 以下は実用的な設定例です。
local map = vim.keymap.set -- Esc でターミナルモードを抜ける(便利な設定) map("t", "<Esc><Esc>", "<C-\\><C-n>", { desc = "ターミナルモードを抜ける" }) -- ターミナルモードでもウィンドウ移動できるように map("t", "<C-h>", "<C-\\><C-n><C-w>h", { desc = "左ウィンドウへ" }) map("t", "<C-j>", "<C-\\><C-n><C-w>j", { desc = "下ウィンドウへ" }) map("t", "<C-k>", "<C-\\><C-n><C-w>k", { desc = "上ウィンドウへ" }) map("t", "<C-l>", "<C-\\><C-n><C-w>l", { desc = "右ウィンドウへ" }) -- ターミナルを素早く開くショートカット map("n", "<leader>th", "<cmd>split | term<CR>", { desc = "横分割でターミナルを開く" }) map("n", "<leader>tv", "<cmd>vsplit | term<CR>", { desc = "縦分割でターミナルを開く" }) -- ターミナルウィンドウをすばやくリサイズ map("n", "<leader>ts", "<cmd>resize 15<CR>", { desc = "ターミナルを小さく(15行)" }) map("n", "<leader>tl", "<cmd>resize 30<CR>", { desc = "ターミナルを大きく(30行)" })
<Esc><Esc> 設定の意図
Esc を2回に設定しているのは、シェルで Esc を使う操作(bash の vi モードなど)と
競合しないようにするためです。1回 Esc でシェルの vi モードに入り、
もう1回でNeovimのNormalモードへ戻る、という使い方ができます。
ターミナル内での cat・画像表示
Neovim の内蔵ターミナルは通常のシェルと同じように動作するため、 ファイルの内容確認や画像のプレビューも可能です。
ターミナルでよく使う確認コマンド
$ ls -la ← ファイル一覧
$ git log --oneline -10 ← 最新10件のコミットを確認
$ python3 script.py ← スクリプトを実行
$ npm run dev ← 開発サーバーを起動
$ make ← ビルドを実行
ターミナルの出力をバッファに取り込む
コマンドの出力をそのままバッファに取り込む方法もあります。
:r !コマンド でコマンドの実行結果を現在のカーソル位置に挿入できます。
:r !ls src/ ← src/ のファイル一覧を挿入
:r !cat error.log ← ログファイルの内容を挿入
:r !python3 calc.py ← スクリプトの出力を挿入
実用的なターミナル活用フロー
フロー①:コードを書きながらテストを実行する
:vs | term ← 右側にターミナルを開く
2. ターミナルでテストを起動しておく
$ pytest -f tests/ ← ファイル変更を監視して自動テスト
3. Ctrl-k で左のエディタに戻り、コードを編集して保存
4. 右のターミナルにテスト結果が自動で表示される
フロー②:Git 操作とコード編集を同時に行う
<leader>th ← カスタムキーマップで開く
:resize 15
2. 下のターミナルで git log を確認しながら上で編集
$ git diff HEAD ← 変更差分を確認
$ git add -p ← ハンクごとにステージング
$ git commit -m "fix" ← コミット