Crates.io | serpl |
lib.rs | serpl |
version | 0.1.34 |
source | src |
created_at | 2024-06-20 22:50:23.849774 |
updated_at | 2024-07-13 22:57:44.155416 |
description | A simple terminal UI for search and replace, ala VS Code |
homepage | |
repository | https://github.com/yassinebridi/serpl |
max_upload_size | |
id | 1278841 |
size | 234,291 |
serpl
is a terminal user interface (TUI) application that allows users to search and replace keywords in an entire folder, similar to the functionality available in VS Code.
https://github.com/yassinebridi/serpl/assets/18403595/348506704-73336074-bfaf-4a9a-849c-bd4aa4e24afc
cargo install serpl
cargo install serpl --features ast-grep
serpl
Check the releases page for the latest binaries.
serpl
can be installed from the official repositories using pacman
:
pacman -S serpl
serpl
is included in nixpkgs since 24.11, and can be installed via Nix in different ways:
On standalone Nix setups:
nix profile install nixpkgs#serpl
On NixOS (via configuration.nix
or similar):
{pkgs, ...}: {
environment.systemPackages = [pkgs.serpl];
}
On Home-Manager:
{pkgs, ...}: {
home.packages = [pkgs.serpl];
}
serpl
serpl --project-root /path/to/project
Default key bindings can be customized through the config.json
file.
Key Combination | Action |
---|---|
Ctrl + c |
Quit |
Ctrl + b |
Help |
Tab |
Switch between tabs |
Backtab |
Switch to previous tabs |
Ctrl + o |
Process replace |
Ctrl + n |
Toggle search and replace modes |
Enter |
Execute search (for large folders) |
g / Left / h |
Go to top of the list |
G / Right / l |
Go to bottom of the list |
j / Down |
Move to the next item |
k / Up |
Move to the previous item |
d |
Delete selected file or line |
Esc |
Exit the current pane or dialog |
Enter (in dialogs) / y |
Confirm action |
Esc (in dialogs) / n |
Cancel action |
h , l , Tab (in dialogs) |
Navigate dialog options |
serpl
uses a configuration file to manage key bindings and other settings. By default, the path to the configuration file can be found by running serpl --version
. You can use various file formats for the configuration, such as JSON, JSON5, YAML, TOML, or INI.
{
"keybindings": {
"<Ctrl-d>": "Quit",
"<Ctrl-c>": "Quit",
"<Tab>": "LoopOverTabs",
"<Backtab>": "BackLoopOverTabs",
"<Ctrl-o>": "ProcessReplace"
}
}
{
keybindings: {
"<Ctrl-d>": "Quit",
"<Ctrl-c>": "Quit",
"<Tab>": "LoopOverTabs",
"<Backtab>": "BackLoopOverTabs",
"<Ctrl-o>": "ProcessReplace",
},
}
keybindings:
"<Ctrl-d>": "Quit"
"<Ctrl-c>": "Quit"
"<Tab>": "LoopOverTabs"
"<Backtab>": "BackLoopOverTabs"
"<Ctrl-o>": "ProcessReplace"
[keybindings]
"<Ctrl-d>" = "Quit"
"<Ctrl-c>" = "Quit"
"<Tab>" = "LoopOverTabs"
"<Backtab>" = "BackLoopOverTabs"
"<Ctrl-o>" = "ProcessReplace"
[keybindings]
<Ctrl-d> = Quit
<Ctrl-c> = Quit
<Tab> = LoopOverTabs
<Backtab> = BackLoopOverTabs
<Ctrl-o> = ProcessReplace
You can customize the key bindings by modifying the configuration file in the format of your choice.
[!TIP] If current directory is considerebly large, you have to click
Enter
to start the search.
Check out the toggleterm.nvim plugin for Neovim, which provides a terminal that can be toggled with a key binding. Or you can use the following configuration, if you are using 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" },
},
}
This project is licensed under the MIT License. See the LICENSE file for details.
(WIP)