Definir la ventana señalada por "otra ventana"

10

En emacs, más a menudo de lo que me gusta, termino con 4 ventanas o más.

Usaré ese ejemplo:

+--------|-----------+
|        |           |
|   1    |   2       |
|        |           |
+--------+-----------+
|    3   |     4     |
|        +-----------+
|        |     5     |
+--------+-----------+

Muchas funciones pueden actuar other-window(generalmente la misma ventana señalada por C-x o). Especialmente útiles son scroll-other-window. Sin embargo, cuando se abren 4 o más ventanas, other windowes poco probable que sea la que quiero.

¿Hay una manera fácil de administrar la configuración other-windowsin cambiar el diseño de la ventana / búfer? Por supuesto, es factible usando un montón de C-x 4 by, C-bpero no quiero cambiar el diseño. Por ejemplo:

  • si edita en la ventana 4 en la imagen de arriba, ¿hay una manera fácil de configurar C-M-vpara desplazar la ventana 1 ?
  • O simplemente, suponga que el foco en la ventana 3 , ¿cómo establecer other-windowque apunte a la ventana 2 ?
Lompik
fuente

Respuestas:

7

Si leo su pregunta correctamente, está interesado principalmente en operar los buffers que se muestran en otras ventanas rápidamente (al tiempo que conserva el diseño de la ventana actual).

Cambiar la ventana que other-windowseñala es una forma de lograrlo, pero me gustaría sugerir un flujo de trabajo alternativo:

A diferencia other-window, le ace-windowpermite saltar rápidamente a una ventana específica : cuando llama ace-window, muestra un número único en cada ventana. Para saltar a una ventana específica, simplemente escriba el número correspondiente. Si solo tiene dos ventanas, pone el punto en la otra ventana sin pedirle que escriba un número. Este screencast muestra el cambio a otra ventana, desplazándolo y volviendo a la ventana original:

Demostración de ace-window

Si se unen ace-windowa C-x o, usted no tiene que memorizar una clave adicional de unión, y se sentirá como usted está utilizando una versión sobrealimentada other-window.

Además, si toca escribir y / o prefiere no mover los dedos demasiado lejos de la fila de inicio, puede dar instrucciones ace-windowpara "numerar" ventanas usando letras en lugar de números (ver más abajo).

ace-windowestá disponible en MELPA . Después de instalarlo a través de M-x package-install RET ace-window RET, puede poner lo siguiente en su archivo init para configurarlo como se describe arriba:

(global-set-key (kbd "C-x o") 'ace-window)
(setq aw-keys '(?a ?b ?c ?d ?e ?f ?g ?h ?i))
itsjeyd
fuente
Gracias por la demostración, he visto este paquete en otros sitios y me preguntaba cómo funciona. De hecho, puedo cambiar la ventana fácilmente ya que me he obligado M-1 M-2 ..a seleccionar la ventana número 1, 2 usando el window-numberpaquete
Lompik
1

Según una revisión rápida de la fuente other-window, parece que en realidad depende de la ventana devuelta por next-window, que se define en c. Lamentablemente scroll-other-windowtambién se define en c, y presumiblemente llama a la siguiente ventana desde allí. No creo que sea fácil anular eso.

Sin embargo, switch-to-buffer-other-windowparece usar pop-to-buffer, por lo que puede tener algo de suerte allí.

dgtized
fuente
1

No hay una manera fácil de manipular la lista de ventanas, por lo que el resultado devuelto other-windowes más o menos fijo. Esto no es algo malo en sí mismo, ya que permite la coherencia al navegar por Windows. Con respecto a los dos escenarios que describió, con algunos elisp o macros puede adaptarse a su flujo de trabajo.

si está editando en la ventana 4 en la imagen de arriba, ¿hay una manera fácil de configurar CMv para desplazar la ventana 1?

Puede usar un fragmento simple como el siguiente para usar other-windowla cantidad adecuada de veces, desplazarse hacia abajo y volver a la ventana original.

 (defun my-scroll-down-other-window (&optional arg)
 "Like `scroll-other-window' but takes a prefix argument 
 that indicates which window to scroll."
  (interactive "p")
  (save-selected-window
    (other-window arg)
    (scroll-down)))

Puede pasar un argumento de prefijo para especificar qué ventana desplazarse. Como puede deducir, utiliza el mecanismo incorporado other-windowpara omitir la argcantidad de ventanas antes de desplazarse. El save-selected-windowenfoque asegura que volverá a la ventana original. La documentación de other-windowpuede proporcionar más información sobre cómo modificar este fragmento para adaptarlo a su comportamiento.

O simplemente, suponga que el foco en la ventana 3, ¿cómo establecer other-windowque apunte a la ventana 2?

Nuevamente use un prefix-argcomo en C-3 C-x ocuando llame other-window. El número real que se proporcionará variará según el orden en que los divida y no cambiará mientras no cree nuevas ventanas. Alternativamente, puede usar paquetes convenientes como window-numbero ace-windowdesde MELPA para cambiar rápidamente las ventanas seleccionadas.

Vamsi
fuente
bien, no hay manera fácil de manipular la lista de ventanas. Me cuesta mucho usar prefijos. Siente que agrega otra tecla inalcanzable y ralentiza las cosas
Lompik
Para eso están las macros / combinaciones de teclas del teclado. Si esta es una parte regular de su flujo de trabajo, puede definir fácilmente una asignación de teclas basada en un mapa de prefijos, por ejemplo, <f7> npara desplazarse por la enésima ventana. Cree enlaces de teclas temporales con macros de teclado.
Vamsi