Uma das coisas que sinto falta do vim é poder digitar um comando de substituição que funcione em várias linhas, por exemplo:
:/begin/,/end/s/foo/bar/g
O comando acima substitui "foo" por "bar" começando com a primeira linha que contém "begin" e terminando com a próxima linha depois que contém "end".
Existe uma maneira de fazer algo semelhante no emacs?
regular-expressions
replace
evil
vim-emulation
Larry Coleman
fonte
fonte
Aqui está uma maneira de fazer isso que usa apenas a funcionalidade incorporada:
Com o ponto na linha que contém a primeira ocorrência de
begin
, pressione C-SPC.Mover para a próxima ocorrência de
end
:C-s
end
RETSubstitua
foo
porbar
:M-%
foo
RETbar
RET !Isso utiliza o fato de que
query-replace
funcionará na região ativa, em vez de no buffer inteiro, se houver um.Obviamente, você também pode definir um comando personalizado:
Este comando sempre procurará desde o início do buffer, portanto, o ponto pode ser posterior a
begin
/foo
/end
quando você o chama.Configure uma ligação de chave para ele via:
fonte
Em geral, isso é algo que você usaria
narrow-to-region
.Você move o cursor (por exemplo, pesquisando) para o início da região e pressiona
C-SPC
, depois move para o final da região e digitaM-x narrow-to-region
. Agora você pode emitir qualquer pesquisa e substituir os comandos que desejar e eles serão aplicados apenas à parte reduzida do buffer. Quando terminar, digiteM-x widen
para restaurar o conteúdo do buffer.fonte
begin
/end
são delimitadores em uma linguagem de programação, é possível usarC-M-Space
para executarmark-sexp
para selecionar a região em um comando.C-x n n
(narrow-to-region
) eC-x n w
(widen
).