📚 Termux 无 Root 学习开发系列
当前进度:阶段一 · 4/28
阶段一:环境搭建与终端基础
01 Termux 简介与安装
02 包管理与终端基础
03 共享存储与文件管理
04 Vim/Neovim 与 tmux 终端工作流(当前篇 · 上)
05 Vim/Neovim 与 tmux 终端工作流(下):tmux 多窗口工作流
阶段二至九共 24 篇,后续持续更新

04 Vim/Neovim 终端编辑器(上):从零配置你的代码编辑器

难度:入门→进阶 | 前置:02 包管理与终端基础
读完本篇你将能:在 Termux 上安装并配置 Neovim 编辑器,掌握 Vim 四大模式的核心操作,编写 init.lua 个性化配置,使用 lazy.nvim 管理插件,并在终端中高效编辑代码文件。
📑 本文目录
01Neovim vs Vim:为什么选 Neovim
02安装 Neovim 与初次启动
03Vim 四大模式详解
04基础操作:移动、编辑、保存退出
05init.lua 配置入门
06lazy.nvim 插件管理器
07常用插件推荐与安装
08实用技巧:分屏、查找替换、宏录制
09分级练习

前三篇文章里,你已经学会用 Termux 管理软件包、操作文件、整理 Downloads 目录。但当你想在手机上写代码时,nano 和 cat 的编辑能力显然不够用。你需要一个真正的代码编辑器——而这正是 Neovim 的舞台。

Neovim vs Vim:为什么选 Neovim

Vim 是 1991 年诞生的文本编辑器,四十年来一直是终端编辑的事实标准。Neovim 是 Vim 的现代化分支(fork),2014 年从 Vim 8.0 代码库分离,核心改进包括:内置 Lua 脚本引擎(告别 slow VimScript)、异步任务支持(插件不再卡顿)、LSP 原生集成(代码补全、跳转定义),以及活跃的插件生态。

特性 Vim Neovim
脚本语言 VimScript(慢) Lua + VimScript
异步任务 有限支持 原生异步
LSP 集成 需插件桥接 内置 vim.lsp
配置文件 .vimrc init.lua / init.vim
插件生态 兼容 Neovim 插件 Lua 插件为主,新生态

在 Termux 中,Neovim 和 Vim 都可以通过 pkg 安装,但 Neovim 的 Lua 配置更简洁、插件加载更快、社区活跃度更高。本系列全程使用 Neovim(命令为 nvim),Vim 用户可以无缝迁移——所有模式操作完全一致。

💡 小贴士
Neovim 的配置文件路径是 ~/.config/nvim/init.lua,而不是 Vim 的 ~/.vimrc。如果你之前用过 Vim,配置需要重新编写,不能直接复用。

安装 Neovim 与初次启动

了解了 Neovim 的优势后,让我们把它装到手机上。安装命令只需一行:

Shell
pkg install neovim

安装完成后验证版本:

Shell
nvim --version

预期输出(截至 2026 年 8 月,Termux 中 Neovim 版本为 0.12.3,上游最新稳定版为 0.12.4):

Output
NVIM v0.12.3
Build type: Release
LuaJIT 2.1.1757316358
# Termux 专用构建,功能完整

直接输入 nvim 不带参数即可打开一个空白编辑界面。此时你会看到一个几乎全黑的屏幕——别慌,这就是 Vim 系编辑器的标志性外观。按下 :q 然后回车可以退出。

用 Neovim 打开一个已有文件试试:

Shell
nvim ~/storage/downloads/organize.sh

如果你跟着第 03 篇做了 Downloads 自动整理脚本,现在可以用 Neovim 打开它来编辑了。

Vim 四大模式详解

Vim 最让新手困惑的就是"模式"概念。普通编辑器里你敲键盘就出字,但 Vim 不行——它有四种工作模式,按键在不同模式下含义完全不同。打个比方:普通编辑器是一支笔,按下就写;Vim 是一把瑞士军刀,同一个按钮在不同模式下是刀、是锯、是螺丝刀。

普通模式
→
插入模式
→
命令模式
→
可视模式

四种模式的核心用途:

• 普通模式(Normal):默认模式,按键是命令而非文字。h 左移、j 下移、k 上移、l 右移。dd 删除整行,yy 复制整行,p 粘贴
• 插入模式(Insert):按 i 进入,此时键盘行为和普通编辑器一样,敲什么输什么。按 Esc 退回普通模式
• 命令模式(Command):在普通模式下按 : 进入,底部出现输入栏。用于保存 :w、退出 :q、查找替换 :s/old/new/g
• 可视模式(Visual):按 v(字符选择)或 V(整行选择)进入,用移动键选中文本后可批量操作

Termux 软键盘上没有 Esc 键,但 Termux 提供了快捷键栏:屏幕键盘上方有一排可自定义的按键,默认包含 ESC、CTRL、ALT、TAB 等按键。也可以连续按两次 j 快速退回普通模式(需在配置中启用)。

基础操作:移动、编辑、保存退出

掌握了模式概念后,我们来实际操作。下面用 Neovim 创建一个新文件,完成"输入文本 → 移动光标 → 编辑 → 保存退出"的完整流程。

第一步:创建文件并输入内容

Shell
nvim ~/hello.py

此时进入普通模式。按 i 进入插入模式,输入以下内容:

Python
print("Hello, Termux!")
name = input("你的名字: ")
print(f"欢迎, {name}!")

第二步:移动光标

按 Esc 回到普通模式,然后练习移动:

按键 功能 手机端提示
h j k l 左 下 上 右移动 也可用方向键
w / b 下一个/上一个单词开头 快速跳转利器
0 / $ 行首 / 行末 比方向键快得多
gg / G 文件开头 / 末尾 长文件必备
:42 跳转到第 42 行 精确行号跳转

第三步:编辑操作

按键 功能
i 在光标前进入插入模式
a 在光标后进入插入模式
o 在下方新开一行并进入插入模式
dd 删除整行(剪切到寄存器)
yy 复制整行
p 粘贴
u 撤销
Ctrl+r 重做(恢复撤销)

第四步:保存与退出

在普通模式下按 : 进入命令模式:

Neovim 命令
# 保存
:w
# 退出
:q
# 保存并退出
:wq
# 强制退出不保存
:q!
⚠️ 常见错误
在插入模式下输入 :wq 保存退出 — 插入模式下 :wq 会被当作普通文字插入到文件中
✓ 正确:先按 Esc 回到普通模式,再输入 :wq 回车

init.lua 配置入门

每次打开 Neovim 都是黑底白字、没有行号、Tab 是 8 个空格——这种原始体验劝退了很多新手。通过编写 init.lua 配置文件,你可以让编辑器变成顺手趁手的工具。

首先创建配置目录和文件:

Shell
mkdir -p ~/.config/nvim
nvim ~/.config/nvim/init.lua

输入以下基础配置。按 i 进入插入模式,粘贴后按 Esc 再 :wq 保存:

Lua (~/.config/nvim/init.lua)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 行号设置
vim.opt.number = true
vim.opt.relativenumber = true
 
-- 缩进设置
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.expandtab = true
 
-- 搜索设置
vim.opt.hlsearch = true
vim.opt.ignorecase = true
 
-- 配色方案
vim.cmd("colorscheme habamax")

保存后重新打开 Neovim,你会看到行号出现了、Tab 变成 4 个空格、搜索结果高亮显示。Neovim 0.12 内置了 habamax、blue、slate 等配色方案,无需安装额外插件即可使用。

💡 小贴士
Neovim 0.12 移除了经典的"Press ENTER to continue"提示,启动后直接进入编辑界面,体验更流畅。同时终端模拟器经过全面重构,性能和稳定性显著提升。

lazy.nvim 插件管理器

Neovim 裸装只有基础编辑功能。要获得代码高亮、自动补全、文件搜索等现代编辑器能力,需要安装插件。以前用 Vim 时插件管理是个痛点,packer.nvim 已停止维护,现在社区首选是 lazy.nvim——一个用 Lua 编写的现代插件管理器,支持延迟加载、自动更新、依赖管理,当前已迭代到 11.x 版本。

在 init.lua 中追加以下引导代码(接在之前的配置后面):

Lua (lazy.nvim 引导)
1
2
3
4
5
6
7
8
9
10
11
12
13
-- 设置 leader 键为空格
vim.g.mapleader = " "
 
-- lazy.nvim 引导代码
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git", "clone", "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable", lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

这段代码会在 Neovim 首次启动时自动从 GitHub 克隆 lazy.nvim 到本地缓存目录。需要先安装 git:

Shell
pkg install git

引导代码后面紧跟插件列表。lazy.nvim 用一个 Lua table 定义所有插件:

Lua (插件声明)
1
2
3
4
5
6
7
8
9
require("lazy").setup({
  -- 插件列表写在这里
  { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" },
  { "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim" } },
  { "hrsh7th/nvim-cmp" },
  { "hrsh7th/cmp-buffer" },
  { "hrsh7th/cmp-nvim-lsp" },
  -- 更多插件...
})

保存后重启 Neovim,lazy.nvim 会自动下载并安装所有列出的插件。安装过程中底部会显示进度条,完成后即可使用。

进入 Neovim 后输入 :Lazy 可以打开 lazy.nvim 管理面板,查看已安装插件、手动更新、同步配置等:

Neovim 命令
# 打开 lazy.nvim 管理面板
:Lazy
# 更新所有插件
:Lazy update
# 清理未使用的插件
:Lazy clean

常用插件推荐与安装

插件声明写好后,需要在每个插件后面追加 config 函数来配置行为。下面是三个核心插件的完整配置:

nvim-treesitter:语法高亮增强

Treesitter 是一个解析器生成工具,能将代码解析成语法树,实现比正则高亮更精准的语法着色。它还支持代码折叠、增量选择等功能。

Lua (treesitter 配置)
1
2
3
4
5
6
7
8
9
10
{
  "nvim-treesitter/nvim-treesitter",
  build = ":TSUpdate",
  config = function()
    require("nvim-treesitter.configs").setup({
      ensure_installed = { "python", "lua", "bash", "json" },
      highlight = { enable = true },
    })
  end
},

telescope:模糊文件搜索

Telescope 是 Neovim 上最强大的模糊搜索工具,可以搜索文件名、文件内容、Git 提交记录等。安装后设置快捷键即可使用。

Lua (telescope 配置)
1
2
3
4
5
6
7
8
9
10
{
  "nvim-telescope/telescope.nvim",
  dependencies = { "nvim-lua/plenary.nvim" },
  config = function()
    local builtin = require("telescope.builtin")
    vim.keymap.set("n", "<leader>ff", builtin.find_files)
    vim.keymap.set("n", "<leader>fg", builtin.live_grep)
    vim.keymap.set("n", "<leader>fb", builtin.buffers)
  end
},

配置含义:在普通模式下按空格 + ff 搜索文件名,空格 + fg 搜索文件内容,空格 + fb 切换已打开的缓冲区。

nvim-cmp:代码自动补全

nvim-cmp 是当前 Neovim 生态中最流行的补全引擎框架,通过加载不同来源(当前缓冲区、LSP、文件路径等)提供智能补全建议。

Lua (nvim-cmp 配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
  "hrsh7th/nvim-cmp",
  dependencies = {
    "hrsh7th/cmp-buffer",
    "hrsh7th/cmp-nvim-lsp",
  },
  config = function()
    local cmp = require("cmp")
    cmp.setup({
      mapping = cmp.mapping.preset.insert({
        ["<CR>"] = cmp.mapping.confirm({ select = true }),
        ["<Tab>"] = cmp.mapping.select_next_item(),
      }),
      sources = cmp.config.sources({
        { name = "nvim_lsp" },
        { name = "buffer" },
      })
    })
  end
},

实用技巧:分屏、查找替换、宏录制

分屏编辑

手机屏幕小,但 Neovim 的分屏功能让你可以同时查看文件的不同部分。在普通模式下:

Neovim 命令
# 水平分屏(上下)
:split
# 垂直分屏(左右)
:vsplit
# 在新分屏中打开另一个文件
:vsplit ~/hello.py
# 在分屏间切换焦点
Ctrl+w 然后按方向键(h/j/k/l)
# 关闭当前分屏
:close

查找替换

查找替换是批量修改代码的利器。语法::s/旧文本/新文本/标志

Neovim 命令
# 当前行替换第一个匹配
:s/old/new/
# 当前行全部替换
:s/old/new/g
# 全文替换
:%s/old/new/g
# 全文替换并确认每个匹配
:%s/old/new/gc

宏录制:批量重复操作

当你需要对多行执行相同的编辑操作时,宏录制比手动重复高效得多。操作步骤:

1 在普通模式下按 qa 开始录制宏到寄存器 a
2 执行你的编辑操作(如 I 行首插入 # 注释符号 Esc)
3 按 q 停止录制
4 移动到下一行,按 @a 播放宏,或 5@a 播放 5 次
💡 小贴士
在 Termux 软键盘上输入 Ctrl+w 的方法:先点屏幕键盘上方快捷栏的 CTRL 键(变色表示激活),再按 w。Ctrl 组合键在 Termux 中都用这种方式输入。
✏️ 动手练习
🟢 基础验证
请完成以下操作:用 Neovim 创建 ~/test.txt,输入三行文字,保存退出后重新打开确认内容存在。
参考解法:nvim ~/test.txt → 按 i → 输入三行文字(每行末尾按回车)→ Esc → :wq → nvim ~/test.txt 确认
🟡 组合应用
请编写一个 init.lua 配置文件,要求包含:行号显示、Tab 设为 2 个空格、设置空格为 leader 键,并添加一个自定义快捷键——在普通模式下按 <leader>w 等价于 :w<CR>(快速保存)。
提示:使用 vim.keymap.set("n", "<leader>w", ":w<CR>", { desc = "Save file" }) 设置快捷键。Leader 键需在 lazy.nvim 引导代码之前设置 vim.g.mapleader = " "。
🔴 开放挑战
使用宏录制功能,将一个 Python 脚本中的所有 print 语句批量改为 logging.info 调用。提示:需要组合使用 / 搜索定位、ciw 修改单词、n 跳到下一个匹配。
方向:先用 /print<CR> 找到第一个 print,录制宏 ciw logging.info → Esc → n,然后用 @a 重复。也可思考::%s/print/logging.info/g 一步到位有什么副作用?
📖 知识回顾
Neovim 安装 四大模式 移动与编辑 init.lua 配置 lazy.nvim 插件管理 treesitter 高亮 telescope 搜索 nvim-cmp 补全 分屏编辑 宏录制
下篇预告
05 Vim/Neovim 与 tmux 终端工作流(下):tmux 多窗口工作流
将学习 tmux 终端复用器,掌握会话/窗口/窗格三层架构,配置 .tmux.conf,并实现 tmux + Neovim 分屏联动——一边写代码一边看运行结果
关注公众号持续获取系列更新