I find all this very confusing, counter-intuitive and irritating.
Essa é a sua opinião; Implementei um REPL interativo para uma linguagem de programação na qual cada linha da história não só pode ser editada, mas tem seu próprio histórico de desfazer independente. Assim, embora possa existir um comando que nunca tenha sido executado, você pode voltar para lá com a seta para cima e desfazê-lo de volta ao original.
No entanto, assim como no Bash essa edição do histórico só é salva no histórico quando você sai da linha modificada. Não, se você editar a linha e, em seguida, reenviá-la como um novo comando sem nunca ter navegado para longe dela! Nesse caso especial, as edições não são salvas no histórico, porque estão sendo salvas como uma nova entrada de histórico.
Há uma rima e uma razão para isso!
-
Seria claramente contra-intuitivo e irritante não poder editar uma linha histórica antes de enviá-la como um novo comando.
-
Seria contra-intuitivo e irritante simplesmente perder suas edições para uma linha de histórico se você sair dela para ver outra linha.
Uma possível solução pode ser a seguinte: quando o usuário edita uma linha do histórico, salve-a em uma área temporária que represente a nova linha a ser enviada (e não atualize o histórico). No entanto:
-
Isso ainda seria contra-intuitivo e irritante. O usuário não poderá editar uma linha, pressionar a seta para cima duas vezes para ver uma linha anterior e, em seguida, a seta para baixo duas vezes para retornar à edição. O usuário então veria a linha original não editada e teria que navegar até a frente do histórico para encontrar a nova versão da linha no buffer de edição atual ("zero histórico").
-
E se o usuário fizer duas edições em duas linhas de histórico diferentes? Seria irritante ter a edição mais recente menos criticada pelos mais recentes.
A única maneira de ter um histórico imutável no qual você pode fazer várias edições temporárias ao mesmo tempo e enviá-las como novos comandos em qualquer ordem provavelmente seria difícil de apresentar no paradigma da IU atual sem ser confuso. Esse "paradigma atual da interface do usuário" é que toda a área de trabalho (histórico mais nova entrada) é mapeada para uma única janela de edição na tela, com qualquer sinal visual sobre onde o usuário está e qualquer indicação de estado.
Provavelmente precisaríamos de um indicador de posição (algum pequeno número indicando ao usuário onde eles estão no espaço do histórico), um indicador de se essa linha do histórico contém modificações temporárias; uma maneira de alternar entre ver as modificações ou a linha subjacente inalterada; uma maneira de tornar as modificações permanentes (fazer histórico de mutação); uma maneira de descartar as modificações para uma linha ou intervalo de linhas ou todas as linhas, etc.