Slackjeff Wiki

Juntando bits aprendemos juntos

Ferramentas do usuário

Ferramentas do site


utils:ed

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anteriorRevisão anterior
Próxima revisão
Revisão anterior
utils:ed [2025/01/19 16:21] – [Abrindo e trocando de arquivos] ajuste tipográfico hrcerqutils:ed [2025/08/09 19:21] (atual) – [Abrindo e trocando de arquivos] formatação monoespaçada hrcerq
Linha 39: Linha 39:
   * **Dispensa combinações de teclas**   * **Dispensa combinações de teclas**
  
-Por ser um editor multimodal, não é preciso utilizar combinações de teclas usando **Ctrl** **Alt**. O texto não se confunde com os comandos, pois eles são isolados em modos de edição diferentes. Como bônus, os comandos são curtos (apenas um caractere), possivelmente acompanhados de endereços (linhas a editar) e parâmetros. Mais detalhes sobre essa estrutura de comandos serão detalhados adiante.+Por ser um editor multimodal, não é preciso utilizar combinações de teclas usando ''Ctrl'' ''Alt''. O texto não se confunde com os comandos, pois eles são isolados em modos de edição diferentes. Como bônus, os comandos são curtos (apenas um caractere), possivelmente acompanhados de endereços (linhas a editar) e parâmetros. Mais detalhes sobre essa estrutura de comandos serão detalhados adiante.
  
   * **Não possui dependências**   * **Não possui dependências**
  
-Por ser um editor minimalista, o __ed__ não possui outras bibliotecas como dependências (nem mesmo //ncurses// ou //readline//). Ele se basta. Para sistemas minimalistas e hardware com capacidades limitadas, isso é ótimo. Além disso, não possuir dependências significa que não há preocupação com ligação dinâmica, que não é suportada por alguns sistemas operacionais, e que mesmo quando é suportado já envolve algumas preocupações com segurança.+Por ser um editor minimalista, o __ed__ não possui outras bibliotecas como dependências (nem mesmo __ncurses__ ou __readline__). Ele se basta. Para sistemas minimalistas e hardware com capacidades limitadas, isso é ótimo. Além disso, não possuir dependências significa que não há preocupação com ligação dinâmica, que não é suportada por alguns sistemas operacionais, e que mesmo quando é suportado já envolve algumas preocupações com segurança.
  
 Não possuir dependências significa que mesmo em modo monousuário do UNIX ele pode ser utilizado. Não por acaso ele geralmente fica no diretório __/bin__ e não em __/usr/bin__ (em sistemas que ainda levam essa separação a sério). Não possuir dependências significa que mesmo em modo monousuário do UNIX ele pode ser utilizado. Não por acaso ele geralmente fica no diretório __/bin__ e não em __/usr/bin__ (em sistemas que ainda levam essa separação a sério).
Linha 196: Linha 196:
 Muito bem, já vimos os conceitos principais, agora é hora de um pouco de prática. Vamos começar pelo básico que é iniciar e encerrar o editor __ed__. A propósito, não saber encerrar um editor pode causar um certo pânico, então vamos tratar disso logo. Muito bem, já vimos os conceitos principais, agora é hora de um pouco de prática. Vamos começar pelo básico que é iniciar e encerrar o editor __ed__. A propósito, não saber encerrar um editor pode causar um certo pânico, então vamos tratar disso logo.
  
-Para iniciar o editor __ed__, vamos começar com um exemplo simples, sem abrir nenhum arquivo, apenas iniciar o editor com um //buffer// vazio. Você verá uma linha vazia, na qual um comando pode ser inserido. Então você aprenderá o seu primeiro comando agora, o comando **q** (//quit//), que encerra o editor. Nessa linha vazia, digite **q**, e o editor será encerrado.+Para iniciar o editor __ed__, vamos começar com um exemplo simples, sem abrir nenhum arquivo, apenas iniciar o editor com um //buffer// vazio. Você verá uma linha vazia, na qual um comando pode ser inserido. Então você aprenderá o seu primeiro comando agora, o comando ''q'' (//quit//), que encerra o editor. Nessa linha vazia, digite ''q'', e o editor será encerrado.
  
 <code> <code>
Linha 204: Linha 204:
 </code> </code>
  
-Ufa! Agora você já sabe encerrar o editor, quando precisar. Mas vou além: o comando **q** só vai encerrar o editor mesmo se ele não tiver sofrido nenhuma mudança. Se você tiver feito quaisquer alterações no //buffer//, um alerta será emitido e você terá de usar o comando **q** novamente para confirmar que deseja encerrar. Outra opção, se tiver conteúdo não salvo que queira descartar é usar o comando **Q**. Nesse caso nenhum alerta será emitido e ele será prontamente encerrado.+Ufa! Agora você já sabe encerrar o editor, quando precisar. Mas vou além: o comando ''q'' só vai encerrar o editor mesmo se ele não tiver sofrido nenhuma mudança. Se você tiver feito quaisquer alterações no //buffer//, um alerta será emitido e você terá de usar o comando ''q'' novamente para confirmar que deseja encerrar. Outra opção, se tiver conteúdo não salvo que queira descartar é usar o comando ''Q''. Nesse caso nenhum alerta será emitido e ele será prontamente encerrado.
  
-É importante frisar que digitar **Ctrl+c** não encerra o editor. Sinais de interrupção apenas emitem uma mensagem de erro (veremos mais sobre mensagens de erro e alertas depois).+É importante frisar que digitar ''Ctrl'' ''c'' não encerra o editor. Sinais de interrupção apenas emitem uma mensagem de erro (veremos mais sobre mensagens de erro e alertas depois).
  
-Agora, um outro ponto que é importante aprender desde cedo é sobre a configuração e uso de um //prompt//. Como falei antes, ele é um meio de evitar a confusão entre o modo de comandos e o modo de entrada. Para iniciar o editor já com o uso de um //prompt// você deve usar o parâmetro **-p**, como a seguir:+Agora, um outro ponto que é importante aprender desde cedo é sobre a configuração e uso de um //prompt//. Como falei antes, ele é um meio de evitar a confusão entre o modo de comandos e o modo de entrada. Para iniciar o editor já com o uso de um //prompt// você deve usar o parâmetro ''-p'', como a seguir:
  
 <code> <code>
Linha 218: Linha 218:
 Aqui usei um asterisco seguido de espaço, mas fica a seu critério qual texto acha melhor como //prompt//. Desaconselho o uso de interrogação, pois esse sinal já é usado para emitir mensagens de diagnóstico, e também é útil usar um espaço como último caractere do prompt, para não misturar com o comando. Aqui usei um asterisco seguido de espaço, mas fica a seu critério qual texto acha melhor como //prompt//. Desaconselho o uso de interrogação, pois esse sinal já é usado para emitir mensagens de diagnóstico, e também é útil usar um espaço como último caractere do prompt, para não misturar com o comando.
  
-Para não ter que usar esse parâmetro **-p** toda vez que iniciar o __ed__, você pode configurar um //alias// para o ele (dependendo de qual shell utilizar, pode haver variações na forma de fazer isso):+Para não ter que usar esse parâmetro ''-p'' toda vez que iniciar o __ed__, você pode configurar um //alias// para o ele (dependendo de qual shell utilizar, pode haver variações na forma de fazer isso):
  
 <code> <code>
Linha 226: Linha 226:
 Nos exemplos seguintes partirei da premissa de que o //alias// do exemplo acima está configurado. Nos exemplos seguintes partirei da premissa de que o //alias// do exemplo acima está configurado.
  
-Antes de prosseguir, tenho apenas mais um assunto para comentar sobre //prompts//: você pode, a qualquer momento dentro do editor, desabilitar ou reabilitar o //prompt// com o comando **P**:+Antes de prosseguir, tenho apenas mais um assunto para comentar sobre //prompts//: você pode, a qualquer momento dentro do editor, desabilitar ou reabilitar o //prompt// com o comando ''P'':
  
 <code> <code>
Linha 238: Linha 238:
 Para quê desabilitar o //prompt//? Eu realmente não consigo imaginar um bom motivo, mas caso você tenha se esquecido de configurá-lo previamente, e esteja editando um arquivo, pode ser útil lembrar que ele pode ser ativado a qualquer momento.  Para quê desabilitar o //prompt//? Eu realmente não consigo imaginar um bom motivo, mas caso você tenha se esquecido de configurá-lo previamente, e esteja editando um arquivo, pode ser útil lembrar que ele pode ser ativado a qualquer momento. 
  
-Apenas tenha em mente que por padrão o prompt usado é um asterisco (*****) sem um espaço depois, o que visualmente pode causar algum desconforto por misturar o //prompt// ao comando, então é mais interessante configurá-lo antes de iniciar o editor, como apontei antes.+Apenas tenha em mente que por padrão o prompt usado é um asterisco (''*'') sem um espaço depois, o que visualmente pode causar algum desconforto por misturar o //prompt// ao comando, então é mais interessante configurá-lo antes de iniciar o editor, como apontei antes.
 ===== Abrindo e trocando de arquivos ===== ===== Abrindo e trocando de arquivos =====
  
-Já vimos como o editor pode ser aberto e fechado, mas e quanto à seleção dos arquivos que serão editados? Como isso é feito? Existem duas possibilidades: uma é informar o nome de um arquivo logo ao iniciar o editor, portanto na chamada do comando __ed__, passar um arquivo como argumento; outra é abrir o editor com um //buffer// vazio, e em seguida usar o comando **e** para selecionar um arquivo.+Já vimos como o editor pode ser aberto e fechado, mas e quanto à seleção dos arquivos que serão editados? Como isso é feito? Existem duas possibilidades: uma é informar o nome de um arquivo logo ao iniciar o editor, portanto na chamada do comando __ed__, passar um arquivo como argumento; outra é abrir o editor com um //buffer// vazio, e em seguida usar o comando ''e'' para selecionar um arquivo.
  
 A título de exemplo, consideremos um arquivo de texto, contendo o texto: A título de exemplo, consideremos um arquivo de texto, contendo o texto:
Linha 264: Linha 264:
 Logo em seguida o //prompt// aparece, e você pode inserir comandos para ler ou editar o arquivo. Mas calma, ainda chegaremos lá. Por hora, vamos ver mais algumas questões relacionadas ao carregamento do arquivo. Logo em seguida o //prompt// aparece, e você pode inserir comandos para ler ou editar o arquivo. Mas calma, ainda chegaremos lá. Por hora, vamos ver mais algumas questões relacionadas ao carregamento do arquivo.
  
-Digamos que você iniciou o editor com um //buffer// vazio. Você pode então usar o comando **e** para carregar o arquivo. Vejamos:+Digamos que você iniciou o editor com um //buffer// vazio. Você pode então usar o comando ''e'' para carregar o arquivo. Vejamos:
  
 <code> <code>
Linha 279: Linha 279:
 Ao iniciar o editor com um //buffer// vazio, essa informação não existe. Porém, ao iniciar com um arquivo, ou ao carregar um arquivo, como feito nos exemplos anteriores, essa informação é preenchida, com o nome do arquivo carregado (neste exemplo, //poema_ed.txt//). Ao iniciar o editor com um //buffer// vazio, essa informação não existe. Porém, ao iniciar com um arquivo, ou ao carregar um arquivo, como feito nos exemplos anteriores, essa informação é preenchida, com o nome do arquivo carregado (neste exemplo, //poema_ed.txt//).
  
-Para visualizar o nome memorizado, usamos o comando **f**. Um erro será emitido se o nome não estiver preenchido ainda.+Para visualizar o nome memorizado, usamos o comando ''f''. Um erro será emitido se o nome não estiver preenchido ainda.
  
 <code> <code>
Linha 292: Linha 292:
 </code> </code>
  
-O sinal de interrogação nesse caso indica que houve algum erro (deixemos a interpretação disso para depois). Mas note que depois de carregado o arquivo, o nome passou a existir (ficou memorizado). Podemos a qualquer momento usar esse mesmo comando **f** para trocar esse nome. Isso não renomeia o arquivo carregado, apenas sinaliza para o editor __ed__, que no momento de salvar, ele deverá escrever em outro arquivo.+O sinal de interrogação nesse caso indica que houve algum erro (deixemos a interpretação disso para depois). Mas note que depois de carregado o arquivo, o nome passou a existir (ficou memorizado). Podemos a qualquer momento usar esse mesmo comando ''f'' para trocar esse nome. Isso não renomeia o arquivo carregado, apenas sinaliza para o editor __ed__, que no momento de salvar, ele deverá escrever em outro arquivo.
  
 Retomaremos esse assunto quando tratarmos sobre a operação de escrita. Retomaremos esse assunto quando tratarmos sobre a operação de escrita.
  
-Você pode, a qualquer momento, usar o comando **e** para trocar o arquivo carregado no //buffer// (inclusive para um arquivo que ainda não existe, que será criado ao acionar a operação de escrita).+Você pode, a qualquer momento, usar o comando ''e'' para trocar o arquivo carregado no //buffer// (inclusive para um arquivo que ainda não existe, que será criado ao acionar a operação de escrita).
  
 <code> <code>
Linha 316: Linha 316:
 Apenas lembre-se: se houver quaisquer alterações não salvas, um alerta será emitido. Você pode ignorá-lo e reexecutar o comando, para prosseguir, perdendo as alterações. Apenas lembre-se: se houver quaisquer alterações não salvas, um alerta será emitido. Você pode ignorá-lo e reexecutar o comando, para prosseguir, perdendo as alterações.
  
-Caso já tenha certeza de que não quer salvar nada, pode usar o comando **E** no lugar de **e**, para que nenhum alerta seja emitido e o editor imediatamente prossiga com o carregamento do próximo arquivo.+Caso já tenha certeza de que não quer salvar nada, pode usar o comando ''E'' no lugar de ''e'', para que nenhum alerta seja emitido e o editor imediatamente prossiga com o carregamento do próximo arquivo.
  
-Tanto o comando **e** como o comando **E**, quando não recebem nenhum nome de arquivo como parâmetro, apenas recarregam o arquivo no //buffer// (com ou sem a mensagem de alerta, dependendo de qual deles usar). Isto pode ser útil caso queira apenas recarregar o arquivo descartando todas as alterações que fez, desde a última escrita.+Tanto o comando ''e'' como o comando ''E'', quando não recebem nenhum nome de arquivo como parâmetro, apenas recarregam o arquivo no //buffer// (com ou sem a mensagem de alerta, dependendo de qual deles usar). Isto pode ser útil caso queira apenas recarregar o arquivo descartando todas as alterações que fez, desde a última escrita.
  
 <note> <note>
Linha 373: Linha 373:
  
  
-==== Uma nota sobre alertas ==== +<note important> 
- +**Atenção**\\ 
-No __ed__, há uma diferença sutil entre erros e alertas. Os alertas são emitidos quando você pode perder dados do //buffer// por fechar o editor ou carregar algum outro arquivo. Como mostrei no exemplo anterior, se você insistir em uma ação desse tipo, o __ed__ entenderá que você sabe o que está fazendo e não entrará no seu caminho. +\\ 
- +No __ed__, há uma diferença sutil entre erros e alertas. Os alertas são emitidos quando você pode perder dados do //buffer// por fechar o editor ou carregar algum outro arquivo. Como mostrei no exemplo anterior, se você insistir em uma ação desse tipo, o __ed__ entenderá que você sabe o que está fazendo e não entrará no seu caminho.\\ 
-Mas há uma detalhe que pode te pegar de surpresa: depois que o __ed__ emite o alerta de que o //buffer// foi alterado, ele considera que o alerta já foi dado. Se você continuar a editar o //buffer// depois disso e mais tarde resolver fechar o editor, ele não emitirá outro alerta e encerrará. +\\ 
 +Mas há uma detalhe que pode te pegar de surpresa: depois que o __ed__ emite o alerta de que o //buffer// foi alterado, ele considera que o alerta já foi dado. Se você continuar a editar o //buffer// depois disso e mais tarde resolver fechar o editor, ele não emitirá outro alerta e encerrará.\\ 
 +\\
 Portanto, é uma boa prática salvar as modificações feitas logo depois do alerta, caso realmente queira salvar. Mais à frente veremos como modificar um arquivo e como salvar modificações. Quando você salva o conteúdo do //buffer// o __ed__ volta a considerar que precisa te alertar, se houver mais modificações e você tentar executar outra ação que possa ocasionar perda. Portanto, é uma boa prática salvar as modificações feitas logo depois do alerta, caso realmente queira salvar. Mais à frente veremos como modificar um arquivo e como salvar modificações. Quando você salva o conteúdo do //buffer// o __ed__ volta a considerar que precisa te alertar, se houver mais modificações e você tentar executar outra ação que possa ocasionar perda.
 +</note>
 ===== Indo e voltando ===== ===== Indo e voltando =====
  
Linha 1132: Linha 1134:
 Há um limite, porém. Só podemos usar até 9 capturas dessa forma. Não que seja muito confortável abusar desse recurso. Há um limite, porém. Só podemos usar até 9 capturas dessa forma. Não que seja muito confortável abusar desse recurso.
  
-Se no lugar de capturar apenas parte da pesquisa, quiser capturar a pesquisa inteira para reutilizar no texto de substituição, não precisa usar um grupo, pois existe um atalho para essa captura, usando "e comercial" (''&'').+Se no lugar de capturar apenas parte da pesquisa, quiser capturar a pesquisa inteira para reutilizar no texto de substituição, não precisa usar um grupo, pois existe um atalho para essa captura, usando "e comercial" (**&**).
  
 <code> <code>
Linha 1149: Linha 1151:
 ==== Reutilizando pesquisas e substituições ==== ==== Reutilizando pesquisas e substituições ====
  
-Do mesmo modo que usar o endereçamento de pesquisa (''/'') sem informar o termo pesquisado repete a última pesquisa, podemos também reutilizar a última pesquisa feita dentro de um comando de substituição e novos comandos de substituição (ou novas pesquisas também). O que ocorre é que independente de onde você fizer a pesquisa, ela fica salva para reuso posterior.+Do mesmo modo que usar o endereçamento de pesquisa (**/**) sem informar o termo pesquisado repete a última pesquisa, podemos também reutilizar a última pesquisa feita dentro de um comando de substituição e novos comandos de substituição (ou novas pesquisas também). O que ocorre é que independente de onde você fizer a pesquisa, ela fica salva para reuso posterior.
  
 <code> <code>
Linha 1164: Linha 1166:
 </code> </code>
  
-Além da pesquisa, podemos reaproveitar também o último termo substituto utilizado. Para isso, basta usar um sinal de porcentagem (''%'') como termo substituto.+Além da pesquisa, podemos reaproveitar também o último termo substituto utilizado. Para isso, basta usar um sinal de porcentagem (**%**) como termo substituto.
  
  
Linha 1178: Linha 1180:
 Veja que nesse caso reaproveitei as duas coisas: a pesquisa e a substituição. Veja que nesse caso reaproveitei as duas coisas: a pesquisa e a substituição.
  
-Outro ponto importante a destacar sobre o reaproveitamento de pesquisas é que se a pesquisa utilizava grupos de captura (expressões entre ''\('' ''\)''), então as referência a esses grupos também podem ser reaproveitadas na substituição.+Outro ponto importante a destacar sobre o reaproveitamento de pesquisas é que se a pesquisa utilizava grupos de captura (expressões entre **\(** **\)**), então as referência a esses grupos também podem ser reaproveitadas na substituição.
 ===== Desfazendo e refazendo ===== ===== Desfazendo e refazendo =====
  
 Vez ou outra, você pode executar alguma alteração no //buffer// e logo em seguida perceber que não era aquilo que queria. Isso é especialmente comum em comandos de substituição. Basta uma expressão regular mal formulada para substituir o trecho errado, por exemplo. Vez ou outra, você pode executar alguma alteração no //buffer// e logo em seguida perceber que não era aquilo que queria. Isso é especialmente comum em comandos de substituição. Basta uma expressão regular mal formulada para substituir o trecho errado, por exemplo.
  
-Por esse motivo, existe um comando que desfaz a última alteração, o comando ''u''. É sempre bom, depois de aplicar alguma alteração no //buffer// conferir se o resultado é mesmo o esperado. Lembra-se quando falei que você pode anexar comandos de visualização a vários outros comandos? Pois então, para essa finalidade isso é bem útil (especialmente em comandos de substituição).+Por esse motivo, existe um comando que desfaz a última alteração, o comando **u**. É sempre bom, depois de aplicar alguma alteração no //buffer// conferir se o resultado é mesmo o esperado. Lembra-se quando falei que você pode anexar comandos de visualização a vários outros comandos? Pois então, para essa finalidade isso é bem útil (especialmente em comandos de substituição).
  
-O comando ''u'' tem uma particularidade: se você executá-lo de novo (sem ter feito alguma outra alteração no //buffer//), ele refaz a alteração desfeita.+O comando **u** tem uma particularidade: se você executá-lo de novo (sem ter feito alguma outra alteração no //buffer//), ele refaz a alteração desfeita.
  
 <code> <code>
Linha 1201: Linha 1203:
 </code> </code>
  
-Perceba que o comando ''p'' foi usado como sufixo em ''u'' nesse caso, para desfazer e já mostrar o resultado (e depois para refazer e mostrar o resultado).+Perceba que o comando **p** foi usado como sufixo em **u** nesse caso, para desfazer e já mostrar o resultado (e depois para refazer e mostrar o resultado).
  
-Essa forma de funcionar do comando ''u'' pode surpreender usuários acostumados com editores que desfazem várias ações em sequência. No ed, apenas a última alteração pode ser desfeita. Portanto, é bom ter cuidado com as alterações que aplica, salvar o arquivo de tempos em tempos, após alterações importantes, e a depender da criticidade do arquivo, possuir backups.+Essa forma de funcionar do comando **u** pode surpreender usuários acostumados com editores que desfazem várias ações em sequência. No __ed__, apenas a última alteração pode ser desfeita. Portanto, é bom ter cuidado com as alterações que aplica, salvar o arquivo de tempos em tempos, após alterações importantes, e a depender da criticidade do arquivo, possuir //backups//.
  
-Recapitulando, se você fez várias alterações em um //buffer// (carregado a partir de um arquivo), e de repente decide que quer desfazer todas elas, isso é possível. Basta usar o comando ''E'', que recarrega o arquivo no estado inicial. Vejamos um exemplo:+Recapitulando, se você fez várias alterações em um //buffer// (carregado a partir de um arquivo), e de repente decide que quer desfazer todas elas, isso é possível. Basta usar o comando **E**, que recarrega o arquivo no estado inicial. Vejamos um exemplo:
  
 <code> <code>
Linha 1227: Linha 1229:
 </code> </code>
  
-Isso será útil, se você de tempos em tempos salvar as modificações que for fazendo. Dessa forma, poderá sempre retornar ao estado do último salvamento. Mas tenha em mente que usar o comando ''E'' para desfazer tudo não permitirá refazer as alterações depois (como ocorre com ''u'' para uma única alteração).+Isso será útil, se você de tempos em tempos salvar as modificações que for fazendo. Dessa forma, poderá sempre retornar ao estado do último salvamento. Mas tenha em mente que usar o comando **E** para desfazer tudo não permitirá refazer as alterações depois (como ocorre com **u** para uma única alteração).
  
-Se por um lado, você não pode gradualmente desfazer várias alterações, por outro, o comando ''u'' ao menos permite que você compare os resultados antes e depois de aplicar alguma alteração.+Se por um lado, você não pode gradualmente desfazer várias alterações, por outro, o comando **u** ao menos permite que você compare os resultados antes e depois de aplicar alguma alteração.
  
 ===== Deletando ===== ===== Deletando =====
utils/ed.1737303716.txt.gz · Última modificação: (edição externa)