# 终端开发环境搭建

都进入 AI 时代了啊啊啊啊,为什么还要花时间折腾原始的开发工具?
因为太好玩,实在忍不住。。。

# Yazi

Yazi (opens new window) 是一个终端文件管理工具,这是它的 logo。

平时总是不知不觉就打开了多个 Finder 窗口进行文件操作,就想着找一个更好的文件管理工具。

然后就找到了 yazi,一见如故;

yazi 预览图

之前在 vscode 中用了多年的 vim 快捷键方案,所以感觉这个终端文件管理工具非常熟悉、便捷;
浅尝之后功能也正好能满足诉求。

# 插件

配置这几个插件平时基本够用了,学习快捷键、适应它的交互逻辑还是挺非常费时间。

  • projects
    • 管理项目,你可能需要打开一组文件夹,在重新进入 yazi 是重新加载这一组文件夹
  • smart-enter
    • 统一让 l 键打开文件、进入文件夹
  • system-clipboard
    • 支持将文件复制到剪切板
  • mediainfo
    • 显示多媒体文件(音视频文件)的详细信息,音视频开发才需要,超方便

插件地址安装方法在 yazi resource (opens new window) 中,我还特意为 Yazi 写了一个图片压缩 (opens new window)插件 😛

# 额外配置

  • 显示更新时间、文件大小
    • line mode (快捷键 m) 可以切换显示不同的信息,但我希望同时显示时间、大小
    • init.lua 扩展一种行模式,在 yazi.toml 中配置
    -- init.lua
    function Linemode:size_and_mtime()
        local time = math.floor(self._file.cha.mtime or 0)
        if time == 0 then
      	  time = ""
        elseif os.date("%Y", time) == os.date("%Y") then
      	  time = os.date("%b %d %H:%M", time)
        else
      	  time = os.date("%b %d  %Y", time)
        end
    
        local size = self._file:size()
        return string.format("%s %s", size and ya.readable_size(size) or "-", time)
    end
    -- yazi.toml
    [mgr]
    linemode = "size_and_mtime"
    
    -- 文本编辑使用 nvim 打开
    [opener]
    edit = [
        { run = 'nvim "$@"', block = true, for = "unix" },
    ]
    

# NeoVim

NeoVim (opens new window) 是一个现代化的 Vim 编辑器,保留了 Vim 的模态编辑交互,持续引入新特性。

neovim-logo

yazi 的纯键盘文件管理太过丝滑流畅了,查看文档时不小心看到 yazi.nvim 插件;
想到在 VSCode 中从编码切换到文件管理,总是去操作侧边栏;
顿悟:应该可以把编码跟文件管理的交互统一起来!

之前尝试过几次 NeoVim,每次启动只有一个空荡荡的启动页,没有文件树、没有搜索替换这些基础 UI,毛坯房都算不上,顶多算个房子框架;
所以每次浅尝就放弃了,实在懒得去折腾。

但这次我直接从 AstroNvim 开始尝试,至少算是得到一个毛坯房。
AstroNvim 内置了超好用 which-key 插件,极大降低学习成本,再也不担心记不住快捷键啦。

which-key

# 插件

yazi which-key lazygit render-markdown

  • AstroNvim
    • 初始插件集合
  • auto-session
    • 启动 nvim 时自动恢复关闭时的标签/buffer
  • flash
    • 快速移动光标,类似 easy-motion
  • formatter
    • 格式化
  • grug-far
    • 全局搜索替换
  • heirline
    • 标签栏控制,我用来隐藏标签栏
  • im-select
    • 【必备】自动切换中英文输入法
  • markdown
    • 快捷操作 Markdown
  • multcursor
    • 多光标批量编辑操作
  • render-markdown
    • 在编辑器中渲染 Markdown,超级漂亮
    • 建议给插件额外配置加粗、斜体高亮
      return {
      "MeanderingProgrammer/render-markdown.nvim",
      dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-mini/mini.icons" },
      ft = { "markdown" },
      config = function()
        ------------ markdown style ------------
        -- 红色加粗 bold = true,
        vim.api.nvim_set_hl(0, "@markup.strong", { fg = "#ff6b6b", bold = true })
        -- 青色斜体
        vim.api.nvim_set_hl(0, "@markup.italic", { fg = "#4ecdc4", italic = true })
        -- 灰色删除线
        vim.api.nvim_set_hl(0, "@markup.strikethrough", { fg = "#95a5a6", strikethrough = true })
        ------------ markdown style ------------
    
        -- 初始化插件,使用最基本的配置
        require("render-markdown").setup {}
      end,
    }
    
  • search-replace
    • 单文件搜索替换
  • yazi
    • 文件管理,建议禁用内置的 neo-tree 插件
  • lazygit
    • Git 操作,插件一内置需要独立安装 lazygit 命令行

# 额外配置

-- 自动保存
vim.o.autowriteall = true

-- 自定义快捷键
vim.api.nvim_set_keymap("n", "<S-Tab>", ":bprev<CR>", { noremap = true })
vim.api.nvim_set_keymap("n", "<Tab>", ":bnext<CR>", { noremap = true })
vim.keymap.set("n", "<Enter>", "o<Esc>", { noremap = true, silent = true, desc = "插入新行" })
vim.keymap.set("n", "<S-Enter>", "i<Enter><Esc>", { noremap = true, silent = true, desc = "从当前光标断行" })
vim.keymap.set("t", "<Esc>", [[<C-\><C-n>]])

# WezTerm

本来打算继续在 Warp 中运行这一套终端环境,但 Warp 显然不只想做一个终端工具,近期更新集成了大量的 AI 和编辑器功能,导致界面非常冗余,某些元素还无法隐藏;
最终选择了界面简洁、清爽的 WezTerm (opens new window)

# 配置

WezTerm 的配置文件路径 ~/.wezterm.lua

local wezterm = require("wezterm")

local config = {}
config.term = "wezterm"

-- 一定要先安装 JetBrainsMono Nerd Font 字体
-- 配置 fallabck "PingFang SC" 也是必要的,否则默认字体无法显示中文斜体、加粗、删除样式
config.font = wezterm.font_with_fallback({
	"JetBrainsMono Nerd Font",
	"PingFang SC",
})

config.font_size = 16.0 -- 默认字号为 12.0 :contentReference[oaicite:0]{index=0}

-- 隐藏顶部的 title bar 让界面更加简洁
config.window_decorations = "RESIZE"

-- 背景设置,让窗口不那么“黑”,看起来有点“高级灰”的效果
config.colors = { background = "#191D23" }

-- 重新设置边距,默认的太宽了
config.window_padding = {
	left = 10,
	right = 2,
	top = 0,
	bottom = 0, -- 目前没办法彻底移除底边距,只能忍
}

-- 让 option + left/right 可以跳跃单词
config.keys = {
	{ key = "LeftArrow", mods = "OPT", action = wezterm.action({ SendString = "\x1bb" }) },
	{ key = "RightArrow", mods = "OPT", action = wezterm.action({ SendString = "\x1bf" }) },
}
-- 键盘相关配置
config.enable_csi_u_key_encoding = true

return config

# 问题

  • 不显示斜体、加粗、删除样式
    • 安装并配置字体,字体规格要包含有粗体、斜体
    • 使用 font_with_fallback 配置回退字体,回退字体选择一个包含中文粗体、斜体的字体,否则中文样式显示不全
  • option + 方向键无用
    infocmp -1x tmux-256color > tmux-256color.info
    echo "        smxx=\E[9m," >> tmux-256color.info
    echo "        rmxx=\E[29m," >> tmux-256color.info
    tic -x tmux-256color.info
    infocmp -1x tmux-256color | grep -E 'infocmp|smxx|rmxx'
    rm tmux-256color.info
    
  • 无法移除底部边距,暂无法解决

# 最后

虽然 VSCode + Vim 方案键盘能完成大部分编辑操作,但基于 GUI 的交互设计总是不可避免地要使用鼠标;
全键盘完成所有操作(编码、git、文件管理)是真的丝滑,目前只剩下 Web 开发的 chrome 调试环节不得不使用鼠标,就真的没办法了。

另外,没想到在终端绑定(CMD Option)快捷键这么麻烦,有解决办法(了解 CSI u 协议);
但我选择先放弃原有的快捷键习惯,将空格作为 <leader> 然后在配合字符键也挺不错。

这套方案实在没什么吹的,特别是 AI 时代手动编写代码占比只会越来越少,配置终端环境很可能算是"没苦硬吃"。。。
对我来说,花时间折腾这些工具,解决碰到各种问题、探索各种可能性,像玩游戏一样解压。 可能是最近开发压力太大了。 🐶

既然都切换到终端开发环境了,是不是该试试在 Android 手机中写代码,这样异地外出就不用带电脑了?
先消停下,后面有空再折腾吧,这次“浪费”的时间太多了。 🐶

PS:NeoVim render-markdown 插件渲染效果真漂亮

preview-render-markdown

💗 博主正处于裸辞待业状态,欢迎 商务合作 💗

相关文章

ZingAI.video 在线口播视频剪辑

ZingAI.video 字影是采用前沿 Web 技术构建的口播视频剪辑工具,欢迎体验 背景 我发现自己消费的视频基本都是口播类视频,且 AI 生成的视频绝大多数也是这类视频。 口播类视频并不是指狭义的主播(或数字人)念稿子,它的典型特征是传达的信息以文字语音为主,图像信息为辅的视频; ...

在终端(Terminal)中快捷使用代理的方法

背景 每次在终端中 打开/关闭 代理都要经历以下几个步骤 在代理软件(如 Clash)中复制终端代理命令 粘贴到 终端 中,然后执行 执行需要访问外网的命令(如安装依赖、下载外网镜像) 关闭当前终端,让代理配置失效 假设你的代理工具启用的端口是2233,那么从代理工具复制的终端代理命令应该是 export https_proxy=h ...

Web 网页自集成 HTTP 代理方案

前言 大部分程序员,想必都有会一个常用的抓包代理工具; 但在座的各位,可曾见过这样一款集成在 Web 应用中的代理工具? 它是明显区别于传统代理工具的,有以下特性: 零安装,零配置,Web 点击即用、APP 扫码即用;_(不 ...

个人 VSCode 高频快捷键总结

vscode 默认快捷键 |按键|描述|提示| |---|---|---| |cmd+shift+p|命令搜索|一切命令、指令的入口,不常用或没有快捷键的指令,可以搜索名称然后触发,尝试搜索 open | |tab控制| |cmd+n|新建tab页|常用于记录临时信息| |cmd+w|关闭tab页|关闭临时tab会有是否保存确认,Mac下cmd+d不保存(d ...

在Termux中运行web项目

Termux是什么 官网 > Termux is an Android terminal emulator and Linux environment app that works directly with no rooting or setup required. A minimal base system is installed au ...

VuePress 集成第三方评论模块

VuePress 是一个 Vue 驱动的静态网站生成器,用来写文档的体验很好,本站就是基于 VuePress 的。 VuePress 官方正在开发针对博客的优化功能Blog Support roadmap,已经有人在喊建议集成 disqu ...