使用 Tmux 和 Neovim 打造终极终端开发环境

2026/03/24 Tools 共 5731 字,约 17 分钟

💡 这是一篇实战的终端环境配置指南,用好这两个工具效率翻倍

为什么是 Tmux + Neovim?

  • Tmux — 终端多路复用,分屏、会话、后台运行
  • Neovim — 现代 Vim,功能扩展强,Lua 配置
  • 组合起来 — 一个终端窗口搞定所有事

一、Tmux 入门

安装

# macOS
brew install tmux

# Ubuntu/Debian
sudo apt install tmux

# CentOS
sudo yum install tmux

# Windows WSL
sudo apt install tmux

核心概念

概念说明
Session会话,一组窗口的集合
Window窗口,相当于一个标签页
Pane面板,一个窗口里的分屏

基本操作

# 启动
tmux

# 快捷键前缀 Ctrl+b(之后简写为 C-b)
# C-b ?   # 查看所有快捷键

# 窗口操作
C-b c      # 创建新窗口
C-b n      # 下一个窗口
C-b p      # 上一个窗口
C-b 数字   # 跳到第 N 个窗口
C-b w      # 列出所有窗口
C-b ,      # 重命名窗口

# 面板操作
C-b %      # 左右分屏
C-b "      # 上下分屏
C-b 方向键  # 切换面板
C-b o      # 切换到下一个面板
C-b x      # 关闭面板
C-b z      # 当前面板最大化/还原
C-b C-方向键  # 调整面板大小

# 会话操作
C-b d      # 断开当前会话(后台运行)
tmux ls    # 列出所有会话
tmux attach -t 0   # 重新连接会话 0
tmux new -s work   # 新建名为 work 的会话

二、Tmux 配置文件

# ~/.tmux.conf

# 鼠标支持
set -g mouse on

# 鼠标选择复制(需要 mouse on)
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel

# 重新加载配置
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

# 从 1 开始编号(更习惯)
set -g base-index 1
setw -g pane-base-index 1

# 更短的延迟
set -sg escape-time 0

# 主题:状态栏
set -g status-bg black
set -g status-fg white
set -g status-left-length 40
set -g status-left "#[fg=green]#S #[fg=white]|"
set -g status-right "#[fg=cyan]%Y-%m-%d %H:%M"

# 当前窗口高亮
setw -g window-status-current-bg yellow
setw -g window-status-current-fg black

# 分隔线
set -g pane-border-style fg=colour235
set -g pane-active-border-style fg=colour240

# 消息样式
set -g message-style bg=yellow
set -g message-style fg=black

加载配置:

tmux source-file ~/.tmux.conf

三、Tmux 实战技巧

会话管理

# 命名会话
tmux new -s project1

# 分离并重命名
# 在 tmux 内:C-b D,然后选要分离的客户端

# 快速切换会话
# 安装 tmux-resurrect(插件)
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

# 自动保存和恢复
set -g @continuum-restore 'on'
set -g @continuum-save '15'  # 每 15 分钟保存

常用脚本

#!/bin/bash
# 启动开发环境

SESSION="dev"

# 如果会话已存在,连接它
tmux has-session -t $SESSION 2>/dev/null
if [ $? -eq 0 ]; then
    echo "Session $SESSION exists, attaching..."
    tmux attach -t $SESSION
    exit
fi

# 创建新会话
tmux new-session -d -s $SESSION -n editor

# 第一个窗口:Neovim
tmux send-keys 'cd ~/projects/myapp' C-m
tmux send-keys 'nvim .' C-m

# 第二个窗口:服务器
tmux new-window -n server -t $SESSION
tmux send-keys 'cd ~/projects/myapp' C-m
tmux send-keys 'npm run dev' C-m

# 第三个窗口:数据库
tmux new-window -n db -t $SESSION
tmux send-keys 'mysql -u root -p' C-m

# 第四个窗口:日志
tmux new-window -n logs -t $SESSION
tmux send-keys 'cd ~/projects/myapp && tail -f logs/app.log' C-m

# 切换到第一个窗口
tmux select-window -t $SESSION:editor

# 连接
tmux attach -t $SESSION

四、Neovim 安装与配置

安装

# macOS
brew install neovim

# Ubuntu
sudo apt install neovim

# Windows WSL
sudo apt install neovim

# 检查版本(需要 0.8+)
nvim --version

配置文件位置

# Neovim 配置目录
~/.config/nvim/
├── init.lua          # 主配置
├── lua/
│   └── user/         # 自定义模块
├── plugin/           # 插件目录
└── init.vim          # 兼容模式(可选)

init.lua 基础配置

-- ~/.config/nvim/init.lua

-- 基本设置
vim.opt.number = true          -- 行号
vim.opt.relativenumber = true  -- 相对行号
vim.opt.cursorline = true      -- 高亮当前行
vim.opt.signcolumn = "yes"     -- 侧边栏显示符号
vim.opt.wrap = false           -- 不自动换行
vim.opt.swapfile = false        -- 不生成 swap 文件
vim.opt.backup = false          -- 不备份
vim.opt.writebackup = false

-- 缩进
vim.opt.tabstop = 4            -- Tab 4 空格
vim.opt.shiftwidth = 4         -- 缩进 4 空格
vim.opt.expandtab = true       -- Tab 转空格
vim.opt.smartindent = true    -- 智能缩进

-- 搜索
vim.opt.hlsearch = true        -- 高亮搜索
vim.opt.incsearch = true       -- 增量搜索
vim.opt.ignorecase = true      -- 忽略大小写
vim.opt.smartcase = true        -- 智能大小写

-- 外观
vim.opt.termguicolors = true   -- 真彩色
vim.opt.background = "dark"    -- 暗色主题
vim.opt.showmode = false        -- 底部不显示模式

-- 性能
vim.opt.updatetime = 50         -- 更快的更新(让 cursorhold 事件更频繁)
vim.opt.timeoutlen = 300        -- 更快超时

-- 快捷键
vim.g.mapleader = " "
vim.keymap.set("n", "<leader>w", ":w<CR>")           -- 保存
vim.keymap.set("n", "<leader>q", ":q<CR>")            -- 退出
vim.keymap.set("n", "<leader>s", ":w<CR>:source %<CR>") -- 保存并重载配置

-- 快速移动(Vim 风格)
vim.keymap.set("n", "J", "mzJ`z")  -- J 合并行但保持光标位置
vim.keymap.set("n", "<C-d>", "<C-d>zz")  -- 上下滚动居中
vim.keymap.set("n", "<C-u>", "<C-u>zz")

-- 分屏
vim.keymap.set("n", "sv", ":vsplit<CR>")   -- 左右分
vim.keymap.set("n", "sh", ":split<CR>")     -- 上下分
vim.keymap.set("n", "sc", "<C-w>c")        -- 关闭当前
vim.keymap.set("n", "so", "<C-w>o")        -- 只保留当前

-- 分屏移动
vim.keymap.set("n", "<leader>h", "<C-w>h")
vim.keymap.set("n", "<leader>j", "<C-w>j")
vim.keymap.set("n", "<leader>k", "<C-w>k")
vim.keymap.set("n", "<leader>l", "<C-w>l")

-- Terminal 模式
vim.keymap.set("n", "<leader>t", ":split | terminal<CR>")
vim.keymap.set("t", "<Esc>", "<C-\\><C-n>")

五、插件管理:Lazy.nvim

安装

# 安装 lazy.nvim
git clone --filter=blob:none https://github.com/folke/lazy.nvim.git --depth 1 ~/.local/share/nvim/site/pack/lazy/start/lazy.nvim

配置插件

-- ~/.config/nvim/init.lua 末尾添加

require("lazy").setup({
    -- 主题
    { "folke/tokyonight.nvim" },

    -- 状态栏
    { "nvim-lualine/lualine.nvim" },

    -- 文件树
    { "nvim-tree/nvim-tree.lua" },

    -- 语法高亮
    { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" },

    -- LSP
    { "neovim/nvim-lspconfig" },
    { "williamboman/mason.nvim" },

    -- 自动补全
    { "hrsh7th/nvim-cmp" },
    { "hrsh7th/cmp-nvim-lsp" },
    { "L3MON4D3/LuaSnip" },

    -- 模糊搜索
    { "nvim-telescope/telescope.nvim" },

    -- 注释
    { "numToStr/Comment.nvim" },
})

主题配置

-- ~/.config/nvim/lua/user/colorscheme.lua
require("tokyonight").setup({
    style = "night",
    transparent = false,
})

vim.cmd("colorscheme tokyonight")

LSP 配置

-- ~/.config/nvim/lua/user/lsp.lua
local lsp = require("lspconfig")

-- Python
lsp.pyright.setup({})

-- TypeScript
lsp.tsserver.setup({})

-- Go
lsp.gopls.setup({})

-- Rust
lsp.rust_analyzer.setup({})

-- 显示 LSP 图标
require("lspkind").init({})

-- 快捷键
vim.keymap.set("n", "gd", vim.lsp.buf.definition)
vim.keymap.set("n", "K", vim.lsp.buf.hover)
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename)
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action)

六、Tmux + Neovim 联动

配置 Neovim 内嵌终端

-- ~/.config/nvim/lua/user/terminal.lua

vim.keymap.set("n", "<C-t>", ":split | resize 10 | terminal<CR>")
vim.keymap.set("t", "<Esc>", "<C-\\><C-n>")

分屏同步

让所有面板同步输入相同命令:

# 在 tmux.conf 中
bind e set synchronize-panes \; display "Sync: $(if [[ $(tmux show-options -w synchronize-panes) == *on ]]; then echo ON; else echo OFF; fi)"

七、懒人配置包

不想自己配?用现成的:

发行版说明
LazyVimNeovim 完整发行版
AstroVimAstroNVIM,快速上手
NvChad现代化 Vim 配置

直接用 LazyVim:

# 安装 LazyVim Starter
git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git
nvim

总结

工具核心功能学会后收益
Tmux分屏、会话、后台运行终端效率翻倍
Neovim强大的文本编辑代码写到手抽筋
组合终端 + 编辑器一体化一个窗口搞定所有事

建议:先单独用一周,熟悉基本操作后再组合使用。


作者:牛马便利店一号店员

文档信息

Search

    Table of Contents