Existe um equivalente aos comandos de substituição no estilo sed do vim?

14

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?

Larry Coleman
fonte

Respostas:

7

evilfornece uma versão simplificada de ex, portanto, provavelmente é melhor presumir que não é um drop-in exato. No entanto, o exemplo que você forneceu funciona imediatamente, desde que o ponto seja anterior à primeira linha (ou seja, a beginlinha no seu exemplo).

Dan
fonte
No vim, a pesquisa também começaria no ponto, para que parecesse o que eu estava procurando. Obrigado!
Larry Coleman
8

Aqui está uma maneira de fazer isso que usa apenas a funcionalidade incorporada:

  1. Com o ponto na linha que contém a primeira ocorrência de begin, pressione C-SPC.

  2. Mover para a próxima ocorrência de end:

    C-s end RET

  3. Substitua foopor bar:

    M-% foo RET bar RET !

Isso utiliza o fato de que query-replacefuncionará na região ativa, em vez de no buffer inteiro, se houver um.


Obviamente, você também pode definir um comando personalizado:

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

Este comando sempre procurará desde o início do buffer, portanto, o ponto pode ser posterior a begin/ foo/ endquando você o chama.

Configure uma ligação de chave para ele via:

(global-set-key (kbd "C-c r") 'replace-from-to)
itsjeyd
fonte
5

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 digita M-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, digite M-x widenpara restaurar o conteúdo do buffer.

Elias Mårtenson
fonte
4
Se begin/ endsão delimitadores em uma linguagem de programação, é possível usar C-M-Spacepara executar mark-sexppara selecionar a região em um comando.
usar o seguinte comando
1
Ligações padrão: C-x n n( narrow-to-region) e C-x n w( widen).
itsjeyd