ITADN
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

目录

  1. Features
  2. Installation
  3. Usage
  4. Panes
  5. Quick Hints
  6. Neovim Integration using toggleterm
  7. Helix Integration
  8. License
  9. Contributing
  10. Acknowledgements
  11. Similar Projects

功能

  • 在整个项目文件夹中搜索关键词,支持大小写敏感、AST Grep 等选项。
  • 替换关键词,支持保留大小写、AST Grep 等选项。
  • 交互式预览搜索结果。
  • 键盘导航以实现高效的工作流程。
  • 可配置按键绑定和搜索模式。

安装与更新

前提条件

  • ripgrep 已安装在您的系统上。
  • (可选)ast-grep 已安装在您的系统上,如果您想使用 AST Grep 功能。

步骤

  1. 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
  1. Run the application:
serpl

二进制文件

请查看 releases 页面以获取最新的二进制文件。

特定操作系统的安装

酿造

serpl 可以使用 Homebrew 安装:

brew install serpl

Arch Linux

serpl 可以从官方仓库使用 pacman 进行安装:

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 键组合在搜索模式和替换模式之间切换。
  • 使用 gGjk 键导航搜索结果。
  • 使用 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 文件。

贡献

(进行中)

致谢

类似项目

  • repgrep: 一个用于 ripgrep 的交互式替换工具,可轻松在命令行中跨文件查找和替换。