serpl
é um aplicativo de interface de usuário de terminal (TUI) que permite aos usuários pesquisar e substituir palavras-chave em uma pasta inteira, semelhante à funcionalidade disponível no VS Code.
cargo install serpl
cargo install serpl --features ast_grep
serpl
Verifique a página de lançamentos para os binários mais recentes.
serpl
pode ser instalado usando Homebrew:
brew install serpl
serpl
pode ser instalado a partir dos repositórios oficiais usando pacman
:
pacman -S serpl
serpl
está incluído no nixpkgs desde 24.11 e pode ser instalado via Nix de diferentes maneiras:
Em configurações autônomas do Nix :
nix profile install nixpkgs#serpl
No NixOS (via configuration.nix
ou similar):
{ pkgs , ... } : {
environment . systemPackages = [ pkgs . serpl ] ;
}
No Home-Manager :
{ pkgs , ... } : {
home . packages = [ pkgs . serpl ] ;
}
serpl
serpl --project-root /path/to/project
As combinações de teclas padrão podem ser personalizadas por meio do arquivo config.json
.
Combinação de teclas | Ação |
---|---|
Ctrl + c | Desistir |
Ctrl + b | Ajuda |
Tab | Alternar entre guias |
Backtab | Alternar para guias anteriores |
Ctrl + o | Substituição de processo para todos os arquivos |
r | Substituição de processo para arquivo ou linha selecionada |
Ctrl + n | Alternar modos de pesquisa e substituição |
Enter | Executar pesquisa (para pastas grandes) |
g / Left / h | Ir para o topo da lista |
G / Right / l | Ir para o final da lista |
j / Down | Passar para o próximo item |
k / Up | Mover para o item anterior |
/ | Lista de resultados de pesquisa |
d | Excluir arquivo ou linha selecionada |
Esc | Sair do painel ou caixa de diálogo atual |
Enter (nas caixas de diálogo) / y | Confirmar ação |
Esc (em caixas de diálogo) / n | Cancelar ação |
h , l , Tab (em caixas de diálogo) | Navegar pelas opções de diálogo |
serpl
usa um arquivo de configuração para gerenciar combinações de teclas e outras configurações. Por padrão, o caminho para o arquivo de configuração pode ser encontrado executando serpl --version
. Você pode usar vários formatos de arquivo para a configuração, como JSON, JSON5, YAML, TOML ou INI.
{
"keybindings" : {
"<Ctrl-d>" : " Quit " ,
"<Ctrl-c>" : " Quit " ,
"<Tab>" : " LoopOverTabs " ,
"<Backtab>" : " BackLoopOverTabs " ,
"<Ctrl-o>" : " ProcessReplace " ,
"<Ctrl-b>" : " ShowHelp "
}
}
{
keybindings : {
"<Ctrl-d>" : "Quit" ,
"<Ctrl-c>" : "Quit" ,
"<Tab>" : "LoopOverTabs" ,
"<Backtab>" : "BackLoopOverTabs" ,
"<Ctrl-o>" : "ProcessReplace" ,
"<Ctrl-b>" : "ShowHelp" ,
} ,
}
keybindings :
" <Ctrl-d> " : " Quit "
" <Ctrl-c> " : " Quit "
" <Tab> " : " LoopOverTabs "
" <Backtab> " : " BackLoopOverTabs "
" <Ctrl-o> " : " ProcessReplace "
" <Ctrl-b> " : " ShowHelp "
[ keybindings ]
"<Ctrl-d>" = " Quit "
"<Ctrl-c>" = " Quit "
"<Tab>" = " LoopOverTabs "
"<Backtab>" = " BackLoopOverTabs "
"<Ctrl-o>" = " ProcessReplace "
"<Ctrl-b>" = " ShowHelp "
[keybindings]
<Ctrl-d> = Quit
<Ctrl-c> = Quit
<Tab> = LoopOverTabs
<Backtab> = BackLoopOverTabs
<Ctrl-o> = ProcessReplace
<Ctrl-b> = ShowHelp
Você pode personalizar as combinações de teclas modificando o arquivo de configuração no formato de sua preferência.
Dica
Se o diretório atual for consideravelmente grande, você deverá clicar em Enter
para iniciar a pesquisa.
/
.Ctrl + b
para exibir a caixa de diálogo de ajuda.Ctrl + o
para processar a substituição de todos os arquivos.r
para processar a substituição do arquivo ou linha selecionado.Ctrl + n
para alternar entre os modos de pesquisa e substituição.g
, G
, j
e k
para navegar pelos resultados da pesquisa.d
para excluir o arquivo ou linha selecionada. Confira o plugin toggleterm.nvim para Neovim, que fornece um terminal que pode ser alternado com uma ligação de tecla. Ou você pode usar a seguinte configuração, se estiver usando 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 " },
},
}
Este projeto está licenciado sob a licença MIT. Consulte o arquivo LICENSE para obter detalhes.
(WIP)