Serpl
serpl
是一个终端用户界面(TUI)应用程序,允许用户在整个文件夹中搜索和替换关键词,功能类似于 VS Code 中的搜索替换功能。
https://github.com/yassinebridi/serpl/assets/18403595/348506704-73336074-bfaf-4a9a-849c-bd4aa4e24afc
目录
功能特点
- 在整个项目文件夹中搜索关键词,支持大小写敏感、AST Grep 等选项。
- 替换关键词,支持保留大小写、AST Grep 等选项。
- 搜索结果的交互式预览。
- 键盘导航以提高工作效率。
- 可配置的键位绑定和搜索模式。
安装和更新
前置条件
安装步骤
- 使用 Cargo 安装应用程序:
cargo install serpl
- 如果想安装包含 AST Grep 功能的应用程序,可以使用以下命令:
cargo install serpl --features ast_grep
- 运行应用程序:
serpl
二进制文件
查看发布页面获取最新的二进制文件。
特定操作系统安装
Brew
可以使用 Homebrew 安装 serpl
:
brew install serpl
Arch Linux
pacman -S serpl
Nix/NixOS
自 24.11 版本起,serpl
已包含在 nixpkgs 中,可以通过 Nix 以不同方式安装:
在独立的 Nix 设置中:
nix profile install nixpkgs#serpl
在 NixOS 中(通过 configuration.nix
或类似文件):
{pkgs, ...}: {
environment.systemPackages = [pkgs.serpl];
}
在 Home-Manager 中:
{pkgs, ...}: {
home.packages = [pkgs.serpl];
}
使用方法
基本命令
- 在当前目录启动应用程序:
serpl
- 启动应用程序并提供项目根路径:
serpl --project-root /path/to/project
键位绑定
默认键位绑定可以通过 config.json
文件自定义。
默认键位绑定
快捷键组合 | 操作 |
---|---|
Ctrl + c | 退出 |
Ctrl + b | 帮助 |
Tab | 在标签页之间切换 |
Backtab | 切换到上一个标签页 |
Ctrl + o | 处理所有文件的替换 |
r | 处理选定文件或行的替换 |
Ctrl + n | 切换搜索和替换模式 |
Enter | 执行搜索(用于大型文件夹) |
g / 左箭头 / h | 转到列表顶部 |
G / 右箭头 / l | 转到列表底部 |
j / 下箭头 | 移动到下一项 |
k / 上箭头 | 移动到上一项 |
/ | 搜索结果列表 |
d | 删除选定的文件或行 |
Esc | 退出当前面板或对话框 |
Enter (在对话框中)/ y | 确认操作 |
Esc (在对话框中)/ n | 取消操作 |
h 、l 、Tab (在对话框中) | 导航对话框选项 |
配置
serpl
使用配置文件来管理快捷键绑定和其他设置。默认情况下,可以通过运行 serpl --version
找到配置文件的路径。您可以使用各种文件格式进行配置,如 JSON、JSON5、YAML、TOML 或 INI。
配置示例
JSON
{
"keybindings": {
"<Ctrl-d>": "Quit",
"<Ctrl-c>": "Quit",
"<Tab>": "LoopOverTabs",
"<Backtab>": "BackLoopOverTabs",
"<Ctrl-o>": "ProcessReplace",
"<Ctrl-b>": "ShowHelp"
}
}
JSON5
{
keybindings: {
"<Ctrl-d>": "Quit",
"<Ctrl-c>": "Quit",
"<Tab>": "LoopOverTabs",
"<Backtab>": "BackLoopOverTabs",
"<Ctrl-o>": "ProcessReplace",
"<Ctrl-b>": "ShowHelp",
},
}
YAML
keybindings:
"<Ctrl-d>": "Quit"
"<Ctrl-c>": "Quit"
"<Tab>": "LoopOverTabs"
"<Backtab>": "BackLoopOverTabs"
"<Ctrl-o>": "ProcessReplace"
"<Ctrl-b>": "ShowHelp"
TOML
[keybindings]
"<Ctrl-d>" = "Quit"
"<Ctrl-c>" = "Quit"
"<Tab>" = "LoopOverTabs"
"<Backtab>" = "BackLoopOverTabs"
"<Ctrl-o>" = "ProcessReplace"
"<Ctrl-b>" = "ShowHelp"
INI
[keybindings]
<Ctrl-d> = Quit
<Ctrl-c> = Quit
<Tab> = LoopOverTabs
<Backtab> = BackLoopOverTabs
<Ctrl-o> = ProcessReplace
<Ctrl-b> = ShowHelp
您可以通过修改所选格式的配置文件来自定义快捷键绑定。
面板
搜索输入
- 用于输入搜索关键词的输入框。
- 切换搜索模式(简单、匹配大小写、匹配整词、匹配大小写整词、正则表达式、AST Grep)。
- 简单:搜索关键词的所有出现。
- 匹配大小写:搜索与关键词大小写相同的出现。
- 匹配整词:搜索与关键词完全匹配的出现。
- 匹配大小写整词:搜索与关键词完全匹配且大小写相同的出现。
- 正则表达式:使用正则表达式搜索出现。
- AST Grep:使用 AST Grep 搜索出现。
[!提示] 如果当前目录相当大,您需要按
Enter
键开始搜索。
替换输入
- 用于输入替换文本的输入框。
- 切换替换模式(简单、保留大小写、AST Grep)。
- 简单:替换关键词的所有出现。
- 保留大小写:替换出现的同时保留关键词的大小写。
- AST Grep:使用 AST Grep 替换出现。
搜索结果面板
- 带有搜索结果的文件列表。
- 选择和查看文件的导航。
- 从搜索结果中删除文件的选项。
- 搜索结果计数和当前文件计数。
- 使用"/"键搜索列表的功能。
预览窗格
- 显示带有高亮搜索结果和上下文的选定文件。
- 在文件内查看不同匹配项的导航。
- 删除包含匹配项的单行的选项。
快速提示
- 使用"Ctrl + b"组合键显示帮助对话框。
- 使用"Ctrl + o"组合键处理所有文件的替换。
- 使用"r"键处理选定文件或行的替换。
- 使用"Ctrl + n"组合键在搜索和替换模式之间切换。
- 使用"g"、"G"、"j"和"k"键浏览搜索结果。
- 使用"d"键删除选定的文件或行。
使用toggleterm集成Neovim
查看 toggleterm.nvim 插件,它为Neovim提供了一个可以通过快捷键切换的终端。 或者,如果你使用 AstroNvim,可以使用以下配置:
return {
"akinsho/toggleterm.nvim",
cmd = { "ToggleTerm", "TermExec" },
dependencies = {
{
"AstroNvim/astrocore",
opts = function(_, opts)
local maps = opts.mappings
local astro = require "astrocore"
maps.n["<Leader>t"] = vim.tbl_get(opts, "_map_sections", "t")
local serpl = {
callback = function()
astro.toggle_term_cmd "serpl"
end,
desc = "ToggleTerm serpl",
}
maps.n["<Leader>sr"] = { serpl.callback, desc = serpl.desc }
maps.n["<Leader>tf"] = { "<Cmd>ToggleTerm direction=float<CR>", desc = "ToggleTerm float" }
maps.n["<Leader>th"] = { "<Cmd>ToggleTerm size=10 direction=horizontal<CR>", desc = "ToggleTerm horizontal split" }
maps.n["<Leader>tv"] = { "<Cmd>ToggleTerm size=80 direction=vertical<CR>", desc = "ToggleTerm vertical split" }
maps.n["<F7>"] = { '<Cmd>execute v:count . "ToggleTerm"<CR>', desc = "Toggle terminal" }
maps.t["<F7>"] = { "<Cmd>ToggleTerm<CR>", desc = "Toggle terminal" }
maps.i["<F7>"] = { "<Esc><Cmd>ToggleTerm<CR>", desc = "Toggle terminal" }
maps.n["<C-'>"] = { '<Cmd>execute v:count . "ToggleTerm"<CR>', desc = "Toggle terminal" }
maps.t["<C-'>"] = { "<Cmd>ToggleTerm<CR>", desc = "Toggle terminal" }
maps.i["<C-'>"] = { "<Esc><Cmd>ToggleTerm<CR>", desc = "Toggle terminal" }
end,
},
},
opts = {
highlights = {
Normal = { link = "Normal" },
NormalNC = { link = "NormalNC" },
NormalFloat = { link = "NormalFloat" },
FloatBorder = { link = "FloatBorder" },
StatusLine = { link = "StatusLine" },
StatusLineNC = { link = "StatusLineNC" },
WinBar = { link = "WinBar" },
WinBarNC = { link = "WinBarNC" },
},
size = 10,
---@param t Terminal
on_create = function(t)
vim.opt_local.foldcolumn = "0"
vim.opt_local.signcolumn = "no"
if t.hidden then
local toggle = function() t:toggle() end
vim.keymap.set({ "n", "t", "i" }, "<C-'>", toggle, { desc = "Toggle terminal", buffer = t.bufnr })
vim.keymap.set({ "n", "t", "i" }, "<F7>", toggle, { desc = "Toggle terminal", buffer = t.bufnr })
end
end,
shading_factor = 2,
direction = "float",
float_opts = { border = "rounded" },
},
}
许可证
本项目采用MIT许可证。详情请见 LICENSE 文件。
贡献
(正在完善中)
致谢
- 本项目受到 VS Code 搜索和替换功能的启发。
- 本项目使用了出色的 ratatui.rs 库构建,并基于其组件模板开发。
- 感谢 ripgrep 项目提供的搜索功能。
- 感谢 ast-grep 项目提供的 AST Grep 功能。
类似项目
- repgrep:一个交互式的 ripgrep 替换工具,可以在命令行上轻松地在文件中查找和替换内容。