Como recuar blocos de código em `ed`?

Como recuar blocos de código em `ed`?

Gosto de usar edpara pequenas edições. Atualmente, apenas pressiono a barra de espaço manualmente para recuar blocos de código no formato ed. Foi assim que os autores do UNIX recuaram seu código ed? Ou há algum atalho que eles usaram que eu não conheço?

Responder1

Eu acho que a maneira mais provável que os "autores do UNIX" pretendiam ter sido a boa e velha abordagem "um trabalho, uma ferramenta": escreva seu código usando ed, use indentdepois para que ele seja recuado corretamente.

Responder2

Por ser um editor de linhas, ednão acompanha o recuo entre as linhas.

Você pode usar e !commandpara chamar um formatador de código externo no arquivo.

Uma sessão de edição típica, onde um programa C simples é criado, editado e recuado, poderia ser assim:

$ rm test.c
$ ed -p'> ' test.c
test.c: No such file or directory
> H
cannot open input file
> i
#include <stdlib.h>

int main(void)
{
/* There is no place else to go.
 * The theatre is closed.
 */

return EXIT_SUCCESS;
}
.
> /void/
int main(void)
> s/void/int argc, char **argv/
> %p
#include <stdlib.h>

int main(int argc, char **argv)
{
/* There is no place else to go.
 * The theatre is closed.
 */

return EXIT_SUCCESS;
}
> w
142
> e !clang-format test.c
158
> %p
#include <stdlib.h>

int main(int argc, char **argv)
{
    /* There is no place else to go.
     * The theatre is closed.
     */

    return EXIT_SUCCESS;
}
> w
158
> q
$

Observe a gravação do arquivo antes e depois de chamar o formatador de código ( clang-formatneste caso). Estamos gravando o arquivo test.ce depois lendo o resultado da execução do comando neste arquivo.

Responder3

Até onde eu sei, ednão possui um comando específico para recuar uma linha. Ele não recua automaticamente e não possui um comando primitivo para adicionar uma quantidade fixa de espaços em branco ao início de uma linha.

No entanto, você pode usar s/^/ /, por exemplo, para adicionar dois espaços ao início de uma linha sem alterá-la.

Aqui está um exemplo de sessão de edição com um programa C simples inserido sem recuo ou espaço entre s #includee main. #antes que um comando introduza um comentário.

$ ed '-p> ' hello_world.c
hello_world.c: No such file or directory
# print the buffer
> ,n
?
# insert text until "." from the beginning of the buffer.
> 0a
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%d\n", 47);
return 0;
}
# print the buffer
> ,n
1   #include <stdio.h>
2   #include <stdlib.h>
3   int main() {
4   printf("%d\n", 47);
5   return 0;
6   }
# indent lines 4 and 5
> 4,5s/^/  /
# print the buffer again, see if it makes sense.
> ,n
1   #include <stdio.h>
2   #include <stdlib.h>
3   int main() {
4     printf("%d\n", 47);
5     return 0;
6   }
# add a blank line after line 2.
> 2a

.
# print the buffer again out of paranoia.
> ,n
1   #include <stdio.h>
2   #include <stdlib.h>
3   
4   int main() {
5     printf("%d\n", 47);
6     return 0;
7   }
# looks good, write and quit.
> wq
# size of file in bytes.
89

informação relacionada