
Problema
Estoy usando oh-my-zsh y Antigen para administrar mi Zsh.
A veces ingreso accidentalmente un comando incorrecto o fallido en Zsh y es muy molesto cuando elComplemento zsh-autosuggestionslanza estos comandos.
Por ejemplo, digamos que escribí
gut status
en lugar de git status
.
Ahora, cuando intento volver a escribir el comando correcto, una vez que escribí g
, el complemento de autosugestión aparecerá, gut status
ya que es la coincidencia más cercana en la historia reciente. ¡Pero ese es un comando fallido!
Lo que yoLo que quiero hacer es evitar que estos comandos fallidos "contaminen" mi historial.por lo que el complemento de autosugestión no los sugerirá.
Que he hecho
He buscado esto y la coincidencia más cercana para mantener fuera las entradas del historial es configurar HIST_IGNORE_SPACE, o métodos para ignorar comandos específicos o eliminar comandos manualmente después de ingresarlos. Veresteyeste. Pero como señaló @Adaephon 52, esto sucededespuésla escritura está hecha.
Lo que estoy considerando hacer
Lo que tengo en mente ahora es escribir una función que se active cada vez que se ingresa un comando fallido en Zsh para eliminar la última entrada del historial. Sin embargo, no estoy lo suficientemente familiarizado con Zsh como para saber si este tipo de desencadenante existe o cómo hacerlo.
Nota sobre la solución aceptada.
Para aquellos interesados en este problema, la solución aceptada funciona en el sentido de que los comandos fallidos no se almacenan en el archivo histórico. fc -l
o history
lo confirma.
Sin embargo, parece que el complemento zsh-autosuggestions está haciendo lo suyo.localalmacenamiento en caché de algún tipo (o está generando sugerencias usando otro mecanismo), por lo que aún sugerirá los comandos fallidos, perosólo si la sesión no ha terminado. Cuando el usuario inicia una nueva instancia del shell, cuando presumiblemente el complemento tiene que cargar el historial almacenado en caché, ya no sugiere los comandos fallidos (a menos que los ingrese nuevamente, por supuesto).
La solución propuesta es técnicamente correcta ya que formulé (erróneamente) mi pregunta de tal manera que solo requiere una respuesta que impida que Zsh almacene los comandos fallidos y la solución aceptada lo hace (aunque de manera limitada; consulte el enlace en la solución para detalles).
Cualquiera que esté familiarizado con los scripts de shell (yo no) y lo suficientemente motivado puede consultar elscript zsh-autosuggestions.
Respuesta1
Bart Schäferpropuso el siguiente enfoquea la misma pregunta sobre elusuarios de zshlista de correo:
zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
Esta función se ejecuta antes de que la línea de comando se escriba en el historial. Si devuelve 1, la línea de comando actual no se agrega al archivo de historial ni a la pila de historial local. Sin embargo, la verificación si el comando activará unComando no encontradoEl error cubre sólo casos simples. Por ejemplo, esta línea estará en el historial:
echo foo; echooo bar
Pero funciona bien para tu ejemplo.
gut status
Tenga en cuenta que aparecerá el comando incorrecto UP-ARROW
(¡para que pueda corregirlo!), pero no está en la pila del historial; Comprobar con fc -l
.
Una posible extensión de esta función básica es tener en cuenta la configuración de variables de entorno en la línea de comando, por ejemplo, me gusta DEBUG=1 ./some_prog
. Aquí las funciones verifican si una palabra en la línea de comando contiene un signo igual y, de ser así, verifica que la siguiente palabra sea un comando válido:
zshaddhistory() {
local j=1
while ([[ ${${(z)1}[$j]} == *=* ]]) {
((j++))
}
whence ${${(z)1}[$j]} >| /dev/null || return 1
}
Respuesta2
El comando incorporado fc
permite editar su historial. En caso de que haya escrito mal, por ejemplo, el comando anterior, puede ingresar lo siguiente:
$ fc -e nano -1
Puede reemplazar nano
con el comando de su editor preferido. También puede configurar la EDITOR
variable (parámetro) en su configuración de zsh. (Ver página SO de referencia)
Debe guardar el archivo (el creado en una carpeta temporal del sistema, por fc). Después de eso, terminará con las líneas editadas. Enter
lo ejecutará o puede presionar Ctrl+C
para finalizar la edición.
Para obtener más detalles, consulte la documentación de zsh:Zsh: editar historial
En caso de que quieras editar todo el historial
$ fc -W; nano "$HISTFILE"; fc -R
...nuevamente reemplaza nano si lo deseas
Simplemente escribe el historial, incluido el caché, y luego abre el archivo con un editor.
Tenga en cuenta quezshConoce tres tipos de historia:
- Interno: comandos que ingresaste desde el inicio de sesión
- Local: el que está disponible dentro del shell activo - [HISTFILE + Internal]
- "Global": depende, pero digamos que es el archivo configurado en HISTFILE
Tenga en cuenta que en caso de que se comparta su archivo histórico (SHARE_HISTORY
) y tiene más de un shell zsh abierto con el usuario en cuestión, entonces será mejor que ejecute el fc -W
comando en esos shells primero. Una vez que haya terminado con la edición, ejecute fc -R
. De lo contrario, los comandos ingresados dentro de esos shells no se almacenarán y luego no se reconocerán su edición manual del archivo HISTFILE
.
Respuesta3
No estoy seguro de cómo lo ejecuta omz, pero tanto en bash como en zsh normal, el prefijo con un espacio lo mantiene fuera de .history y, en adelante, también fuera de autocompletar/sugerir.
es decir
<space>ll -ahZ /home/%USER