Separar la flecha hacia arriba para el historial local y global de ZSH

25

Es posible que...

  • Incremente el historial de shell ZSH local (las acciones solo ocurrieron en ese indicador)

  • Aumente el historial global de ZSH (el historial compartido está activado): predeterminado lo que sucede cuando presiona la flecha ARRIBA cuando el historial compartido está activado

... por separado.

Por ejemplo, uno podría vincular CTRL + para el historial global, normal para el historial local. Al mismo tiempo, tiene sentido utilizar el historial global para una búsqueda de historial hacia atrás (es decir, CTRL+ R).

Esto podría acelerar algunas operaciones de shell, ya que algunas operaciones son específicas de esa ventana de shell y desea volver a ellas.

Mikko Ohtamaa
fuente

Respuestas:

25

Copia y pega esto en tu .zshrc:

Los cursores están usando la historia local:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

Si necesita también combinaciones de teclas ( CTRL+ cursores) para recorrer el historial global, agregue también esto a su .zshrc:

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

Para que esto funcione, la opción SHARE_HISTORY (ver 16.2.4 Historial ) debe estar habilitada. Ejecute setopty verifique si "sharehistory" aparece en la lista. Si no agrega setopt sharehistorya su .zshrc. Entonces uno puede usar set-local-history como lo hicimos anteriormente. La documentación dice:

De forma predeterminada, los comandos de movimiento del historial visitan las líneas importadas, así como las líneas locales, pero puede activarlo y desactivarlo con el enlace zle set-local-history. También es posible crear un widget zle que hará que algunos comandos ignoren los comandos importados, y algunos los incluyan.

Tenga en cuenta que, de manera predeterminada, se utiliza el historial global (y todas las funciones terminan con "zle set-local-history 0", es decir, el historial local está desactivado). Por lo tanto, presionar CTRL+ Rbuscará el historial global de forma predeterminada (lo que tiene sentido en la mayoría de los casos).

Esto es bastante similar a la solución de @mpy, pero está listo para copiar y pegar. Sobrescribe las teclas del cursor hacia arriba y hacia abajo. Usé esta entrada de la lista de correo .

Ver también:

lumbric
fuente
1
En zsh 5.0.2 recibo un error que no puede vincularse a una secuencia de teclas vacía. Incluso si lo reemplazo con las teclas de otra respuesta a continuación, tanto arriba / abajo como Ctrl + arriba / abajo solo pasan por la historia global. ¿Algo que estoy haciendo mal aquí?
rjh
1
@rjh: Pruebe esto: en un editor como vim, elimine el ${key[Up]}. Luego (en modo de edición), escriba Ctrl + V seguido de la flecha hacia arriba. Esto debería insertar el código clave correcto. Haga lo mismo para la flecha hacia abajo.
robinst
Utilicé este método y funciona, pero perdí la capacidad de buscar en el historial escribiendo la parte inicial de un comando y luego Flecha arriba. Pasa por todos los comandos como Bash, así que tengo que evitar usar Ctrl+R.
Melebius
5

Puede configurar un widget zle especial para mostrar solo elementos del historial local:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

Suponiendo que está vinculado a up-line-or-history(creo que es el predeterminado), puede vincular este widget a otro golpe de tecla, como CTRL+ :

 bindkey "^[Oa" only-local-history

Si esto funciona probablemente depende de su terminal. Por encima de la línea funciona en URxvt/Screen. Con xtermlo que necesitarás

 bindkey "^[[1;5A" only-local-history

para CTRL+ .

Otra variante podría ser

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

por lo tanto, si tiene habilitado el historial local, puede echar un vistazo al global o viceversa.

mpy
fuente
4

La respuesta de @ lumbic funcionó para mí solo con algunos cambios:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

Este código hace que el historial global sea el predeterminado y utiliza la flecha CTRL para el historial local.

Nota: Yo uso zsh 5.0.2 junto con oh-my-zsh.

Arnuschky
fuente
Esto parece lo contrario de lo que OP solicitó: Ctrl+arrowspara la historia local.
Melebius
1

He estado probando las opciones enumeradas en otras respuestas aquí, pero no estaba contento con ellas. Los widgets 1 up-history o up-line-or-historyno incluyen la búsqueda de inicio y el widget 1 up-line-or-beginning-search parece no funcionar bien cuando se modifica la preferencia del historial local mientras se usa. 2

Entonces llegué a la siguiente configuración. Habilita las Ctrlflechas + para explorar el historial global, las Altflechas + para explorar solo el historial local (similar a Bash) y las flechas independientes para usar la búsqueda inteligente de inicio (predeterminada en Oh My Zsh ).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1 Sus downcontrapartes también están implícitas.

2 El principio utilizado para buscar se redefine después de alterar las preferencias del historial local, por lo que todo el primer comando encontrado se usa como el principio que se buscará en la segunda búsqueda.

Melebio
fuente
1

Basado en las diversas respuestas aquí, pude hacer una versión condensada:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

Esta versión será sobrescribir los existentes up-line-or-historyy down-line-or-historywidgets con nuevos widgets definidos por el usuario. Este widget habilita el historial local y luego llamará a los widgets originales , que están disponibles bajo los .nombres prefijados. Consulte la documentación del widget zle para más detalles.

Esto significa que puede mantener cualquier combinación de teclas existente. Por lo tanto, puede evitar tener que averiguar cuál es la secuencia de escape para escribir una flecha hacia arriba en su terminal actual.

Martin Geisler
fuente
-1
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

La respuesta anterior funcionó para mí.

Referencia: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys

maddy10
fuente
¿Podría explicar cómo esto distingue la historia local y la global? En mi humilde opinión, su código no hace eso en absoluto. Además, esto parece estar configurado en Oh My Zsh .
Melebius