ℹ️
Neovim の内蔵ターミナルとは Neovim はエディタ内にシェルを起動できます。 別のターミナルウィンドウに切り替える必要がなくなるため、 ファイルを編集しながらコマンドを実行するワークフローが格段に効率化します。

内蔵ターミナルの起動

:terminal(省略形 :term)コマンドで、現在のウィンドウにシェルを開きます。 デフォルトシェル(zsh / bash)が起動します。

ターミナルを開くコマンド
:terminal ← 現在のウィンドウにターミナルを開く
:term ← 省略形
:split | term ← 横分割してターミナルを開く
:vsplit | term ← 縦分割してターミナルを開く
:term python3 ← 特定のコマンドを直接実行
NVIMの分割ウィンドウ:左にコードエディタ、右にターミナル

ターミナルモードの操作

ターミナルを開くと Neovim は ターミナルモード という特殊な状態になります。 このモードでは通常のVimコマンドは使えません。シェルにキー入力が渡されます。

モード切り替えのキー

キー動作
i または aターミナルモードへ入る(シェルの操作ができるようになる)
Ctrl-\ Ctrl-nターミナルモードを抜けてNormalモードへ(ターミナルバッファ内)
Ctrl-\ Ctrl-oNormalモードで1コマンドだけ実行してターミナルモードへ戻る
⚠️
Ctrl-\ Ctrl-n を必ず覚える ターミナルモードから抜けるには Ctrl-\Ctrl-n の2ステップが必要です。 Esc はデフォルトでは使えません(後述のキーマップで設定可能)。

ターミナルバッファの基本的な流れ

ターミナル操作フロー
1. Neovim 内でターミナルを開く
: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現在のウィンドウだけ残して他を閉じる
NVIMの分割ウィンドウとターミナル

ターミナルウィンドウのリサイズ

ウィンドウのサイズはキーマップか :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つでターミナルをトグル(開閉)できるプラグインです。 フローティングウィンドウ・分割・タブなど表示スタイルを選べます。

Lua lua/plugins/toggleterm.lua(Lazy.nvim 形式)
{
  "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番のターミナルをトグル(複数管理)
toggleterm.nvim — フローティングターミナル

Neovim とターミナル間のテキストコピー

ターミナルの出力をエディタに取り込んだり、エディタのテキストをターミナルに貼り付けたりする操作を整理します。

ターミナルの出力をエディタにコピーする

ターミナル出力をコピーする手順
方法①:ターミナルバッファのNormalモードで選択
Ctrl-\ Ctrl-n ← ターミナルモードを抜ける
V ← 行選択モードへ
3j ← 3行選択
y ← ヤンク(コピー)
Ctrl-k ← 上のウィンドウ(エディタ)へ移動
p ← 貼り付け

方法②:システムクリップボードを使う(clipboard=unnamedplus 設定済みの場合)
マウスで選択してターミナルウィンドウにコピー → Neovim で p

エディタのテキストをターミナルに渡す

エディタからターミナルへ
方法①:コマンドとして実行する(:! を使う)
:!python3 % ← 現在のファイルを Python で実行
:!bash % ← 現在のシェルスクリプトを実行

方法②:選択範囲をシェルに渡す
V ← 行を選択
:!sh ← 選択行をシェルで実行して結果を表示

ターミナル用キーマップ設定例

デフォルトのターミナル操作は少し不便なので、キーマップを設定して快適にします。 以下は実用的な設定例です。

Lua lua/keymaps.lua — ターミナル関連キーマップ
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 の内蔵ターミナルは通常のシェルと同じように動作するため、 ファイルの内容確認や画像のプレビューも可能です。

ターミナルでよく使う確認コマンド

内蔵ターミナルで使えるコマンド例
$ cat README.md ← ファイルの内容を確認
$ ls -la ← ファイル一覧
$ git log --oneline -10 ← 最新10件のコミットを確認
$ python3 script.py ← スクリプトを実行
$ npm run dev ← 開発サーバーを起動
$ make ← ビルドを実行

ターミナルの出力をバッファに取り込む

コマンドの出力をそのままバッファに取り込む方法もあります。 :r !コマンド でコマンドの実行結果を現在のカーソル位置に挿入できます。

コマンド出力をバッファに挿入
:r !date ← 現在日時をバッファに挿入
:r !ls src/ ← src/ のファイル一覧を挿入
:r !cat error.log ← ログファイルの内容を挿入
:r !python3 calc.py ← スクリプトの出力を挿入
📸 [スクリーンショット予定: nvimターミナルの画面]

実用的なターミナル活用フロー

フロー①:コードを書きながらテストを実行する

コード編集 + テスト実行
1. 縦分割でファイルとターミナルを並べる
:vs | term ← 右側にターミナルを開く

2. ターミナルでテストを起動しておく
$ pytest -f tests/ ← ファイル変更を監視して自動テスト

3. Ctrl-k で左のエディタに戻り、コードを編集して保存
4. 右のターミナルにテスト結果が自動で表示される

フロー②:Git 操作とコード編集を同時に行う

Git + 編集の並行ワーク
1. 横分割でターミナルを下に開く(高さ15行)
<leader>th ← カスタムキーマップで開く
:resize 15

2. 下のターミナルで git log を確認しながら上で編集
$ git diff HEAD ← 変更差分を確認
$ git add -p ← ハンクごとにステージング
$ git commit -m "fix" ← コミット
💡
toggleterm.nvim との組み合わせ toggleterm.nvim を入れると Ctrl-\ 1発でターミナルが開閉でき、 作業の流れを止めません。特に「ちょっとコマンドを打ちたいだけ」という場面で フローティングターミナルが非常に便利です。