Borrar PowerShell y conservar el desplazamiento hacia atrás

Borrar PowerShell y conservar el desplazamiento hacia atrás

Al utilizar el clearcomando, la pantalla se borra. Totalmente. Ya no tengo acceso a ninguna de las cosas que antes estaban en la pantalla.

¿Hay alguna manera de "borrar" la pantalla (es decir, hacer que el mensaje vaya a la parte superior de la pantalla) sin borrar todo lo que había en la pantalla? Lo ideal sería "limpiar" la pantalla pero poder desplazarme hacia arriba para ver todo lo demás.

Estoy usando el programa Terminal de Windows y el shell de PowerShell, pero también me gustaría saber la respuesta para la línea de comandos de Windows.

Dije que quería mantener la capacidad de desplazarme hacia arriba; con esto quiero decir que quiero poder ver todo lo que vino antes de presionar el comando "borrar", así que... sí, quiero mantener todo lo que vino. antes, no el historial de comandos.

Respuesta1

PSReadline (el controlador de entrada estándar de PowerShell) tiene la CtrlLtecla de acceso rápido que se encuentra en la mayoría de los shells de Unix, que limpia la pantalla como si obligara a todo el texto a desplazarse hacia afuera (como lo haría el carácter ASCII "Form Feed").

En PS5, aunque todavía borra eldesplegadotexto completo, pero todo lo que ya se haya desplazado hacia atrás permanecerá en el desplazamiento hacia atrás.

Como solución alternativa, puede generar suficientes líneas vacías para empujar todo hacia atrás:

echo ("`n" * $Host.UI.RawUI.WindowSize.Height)

...y luego lleva el cursor hacia arriba:

$e = [char]27
echo "$e[H" # Move cursor to 0;0
echo "$e[J" # Erase down/right

Esto también podría vincularse a una clave usando Set-PSReadlineKeyHandler -ScriptBlock.

Cmd no tiene un equivalente: lee la entrada en modo de línea, y Conhost proporciona solo unos pocos atajos. Sin embargo, aún puede crear un script por lotes (o incluso un alias de Conhost DOSKEY) que generaría las mismas secuencias VT.

Respuesta2

Aunque limpiar la pantalla es unaTerminal(a través de códigos de control de terminal ANSI), la forma en que se envían esos códigos puede ser diferente según el shell. La idea general es que:

  • ESC[2Jborra la pantalla, pero deja el desplazamiento hacia atrás
  • ESC[3Jborra la pantalla, incluido todo el desplazamiento hacia atrás

... donde ESCrepresenta el código de carácter ASCII 27.

Según man clearLinux, el 2Jcódigo era originalmente (en 1999) una extensión de XTerm, que fue recogida por el kernel de Linux en 2011 para el controlador de la consola. Algún tiempo después, Windows Console Host lo recogió y probablemente ha estado en la Terminal de Windows desde su inicio.

Terminal de Windows (para todos los shells)

Terminal de Windows incluye elclearBufferacciónque se puede vincular a cualquier tecla de acceso rápido. Sin embargo, afecta a todos los caparazones.independientemente de qué aplicación se esté ejecutando dentro de él. Por esa razón, recomiendo no usarlo a menos que esté seguro de no presionar accidentalmente la tecla de acceso rápido cuando esté en algo así vi(o peor).

Dicho esto, definitivamente es la forma más sencilla de obtener esta funcionalidad en CMD.

Si desea utilizarlo, la clearBufferacción le permite especificar un clearobjetivo de:

  • screen
  • scrollback
  • all

El uso de la screenopción borrará el contenido actual de la pantalla pero dejará el desplazamiento hacia atrás en su lugar.

Necesitará editar su Terminal de Windows settings.jsondirectamente ya que la interfaz de usuario no tiene una manera de establecer el clearobjetivo:

        {
            "command": 
            {
                "action": "clearBuffer",
                "clear": "screen"
            },
            "keys": ""
        }
Potencia Shell

ParaPotencia Shell, comouser1684 me ganó Ctrl+ Lenvía la secuencia de escape adecuada.

Por otro lado, Clear-Host(alias clear) en PowerShell envía un ESC[3J(borrando también el desplazamiento hacia atrás).

Si tiene memoria muscular para escribir clearen PowerShell, simplemente puede cambiar su definición:

Remove-Item Alias:clear
function clear {
    Write-Output "$([char]27)[2J"
}

Colóquelo en su perfil de PowerShell si desea que sea permanente.

CMD

Es posible, pero complicado, hacer esto también en CMD.

El mayor problema en CMD es imprimir el carácter ESC (ASCII 27). Tenía el "carácter" real pegado aquí, que se transferiría mediante copiar y pegar a CMD, pero se borró la primera vez que hice otra edición en esta publicación. El personaje todavía está allí en el historial de edición (fuente) de esta respuesta, pero busquemos una mejor manera de hacerlo.

DePotencia Shell, use esto para crear unCMDarchivo por lotes:

@"
@echo off
echo $([char]27)[2J
"@ | Out-File -FilePath .\clear.cmd -Encoding ASCII

La ejecución del archivo por lotes resultante clear.cmden CMD debería borrar la pantalla (pero no el desplazamiento hacia atrás).

Si tiene problemas con eso, cualquier forma de imprimir un ASCII 27 seguido de [2Jdebería funcionar. Si tiene PowerShell Core instalado, por ejemplo:

pwsh -c "Write-Output "`e[2J""

Y solo para brindar algunos detalles adicionales sobre uno de sus comentarios:

Eso parece ser el mayor fallo de diseño del mundo o... no sé. Sostengo que probablemente haya al menos una solución alternativa.

Entonces sí, se nos ocurrió una solución alternativa, pero honestamente, no me sorprendería si no lo hubiéramos hecho. Recuerde, Windows Console Host (en el que CMD solía ejecutarse de forma predeterminada) se remonta a Windows 95 (hace 27 años), mucho antes de que XTerm incluso agregara esos códigos.

Y aunque Windows Terminal es mucho más moderno, no creo que CMD (que necesita generar los códigos) haya visto ninguna actualización sustancial desde antes del lanzamiento de PowerShell en 2006.

Realmente, me considero afortunado de tener una solución alternativa ;-).

Subsistema de Windows para Linux
  • Ctrl+ Ltambién funciona desde muchos shells de Linux para enviar un ESC[2J(dejar desplazamiento hacia atrás).
  • clearactuará como en PowerShell, limpiando la pantallayretroceder ( ESC[3J).
  • clear -xdejará el desplazamiento hacia atrás ( ESC[2J)

Respuesta3

Como solución alternativa, en CMD puedes mantener presionado Ctrl↓ (Down arrow)hasta que la pantalla esté vacía. Se desplazará hacia abajo bastante rápido, por lo que es posible que se desplace demasiado. En ese caso, puede presionar Ctrl→ (Right arrow)o comenzar a escribir y la línea de aviso volverá a aparecer. Cualquier cosa que mueva el cursor servirá.

Desafortunadamente, esto no parece funcionar en Powershell.

Respuesta4

Borrar PowerShell y conservar el desplazamiento hacia atrás

Potencia Shell

Solía Get-Command​​buscar cmdlets como Write-Hosto Write-Outputporque parece REALMENTE extraño que esto no sea una característica de PowerShell.

Get-Command -CommandType Cmdlet

no hay uno

información relacionada