yassinebridi/serpl · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈
[!WARNING] 本项目需要维护者,如果您感兴趣,请通过
github@yasbr.com与我联系
Serpl
serpl 是一个终端用户界面(TUI)应用程序,允许用户在整个文件夹中搜索和替换关键词,类似于 VS Code 中可用的功能。
https://github.com/yassinebridi/serpl/assets/18403595/348506704-73336074-bfaf-4a9a-849c-bd4aa4e24afc
目录
- Features
- Installation
- Usage
- Panes
- Quick Hints
- Neovim Integration using toggleterm
- Helix Integration
- License
- Contributing
- Acknowledgements
- Similar Projects
功能
- 在整个项目文件夹中搜索关键词,支持大小写敏感、AST Grep 等选项。
- 替换关键词,支持保留大小写、AST Grep 等选项。
- 交互式预览搜索结果。
- 键盘导航以实现高效的工作流程。
- 可配置按键绑定和搜索模式。
安装与更新
前提条件
步骤
- Install the application using Cargo:
cargo install serpl
- If you want to install the application with the AST Grep functionality, you can use the following command:
cargo install serpl --features ast_grep
- Run the application:
serpl
二进制文件
请查看 releases 页面以获取最新的二进制文件。
特定操作系统的安装
酿造
serpl 可以使用 Homebrew 安装:
brew install serpl
Arch Linux
pacman -S serpl
Nix/NixOS
serpl 自 24.11 起已包含在 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 + d | 退出 |
Ctrl + b | 帮助 |
Tab | 在标签页之间切换 |
Backtab | 切换到上一个标签页 |
Ctrl + o | 对所有文件执行替换 |
r | 对选定的文件或行执行替换 |
Ctrl + n | 切换搜索和替换模式 |
Enter | 执行搜索(用于大型文件夹) |
g / Left / h | 跳转到列表顶部 |
G / Right / l | 跳转到列表底部 |
j / Down | 移动到下一项 |
k / Up | 移动到上一项 |
/ | 搜索结果列表 |
d | 删除选定的文件或行 |
Esc | 退出当前窗格或对话框 |
Enter(在对话框中) / y | 确认操作 |
Esc(在对话框中) / n | 取消操作 |
h, l, Tab (in dialogs) | 导航对话框选项 |
配置
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 搜索出现位置。
[!TIP] 如果当前目录相当大,您必须点击
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" },
},
}
Helix 集成
你可以添加如下按键绑定,以便在 Helix 中打开 Serpl:
[keys.normal.ret]
t = [":write-all", ":insert-output serpl >/dev/tty", ":redraw", ":reload-all"]
许可证
本项目采用 MIT 许可证。详见 LICENSE 文件。
贡献
(进行中)
致谢
- 本项目受 VS Code 的搜索和替换功能启发。
- 本项目基于出色的 ratatui.rs 库构建,并基于其 Component Template 开发。
- 感谢 ripgrep 项目提供搜索功能。
- 感谢 ast-grep 项目提供 AST Grep 功能。
类似项目
- repgrep: 一个用于 ripgrep 的交互式替换工具,可轻松在命令行中跨文件查找和替换。