¿Cómo cambiar entre ventanas rápidamente?


91

¿Cómo cambio entre ventanas rápidamente?

A menudo tengo varias ventanas abiertas y necesito cambiar entre ellas. En este momento, solía C-x ollegar al que quiero. ¿Hay un flujo de trabajo más eficiente disponible para esto?


Respuestas:


62

Obviamente prefiero ace-window para esto. Puede cambiar entre ventanas y marcos visibles. Está en MELPA, puedes instalarlo rápidamente. Lo único que queda por hacer es atarlo:

(global-set-key (kbd "C-x o") 'ace-window)

O tal vez use un acorde de tecla más corto, ya que cambiar ventanas es una tarea común:

(global-set-key (kbd "M-p") 'ace-window)

Resumen de ace-window

Es un reemplazo directo para other-window. A diferencia de este último, nunca tiene que llamar ace-windowdos o más veces para seleccionar una ventana: selecciona la ventana que desea en una llamada (posiblemente en varios marcos).

Además de cambiar ventanas, ace-windowpuede hacer más (eliminar o intercambiar ventanas, etc.), vea README .


2
Esto es interesante. Usé ace-windowy luego vi switch-windowque parece hacer más o menos lo mismo, excepto que las letras son más pronunciadas. Parece divertido que tengamos ambos paquetes.
milkypostman

Tienes razón. Solo hay pequeñas diferencias entre ellos. Este es un problema que tenemos que enfrentar cuando tenemos un repositorio con 2000 paquetes. No estaba al tanto switch-windowhasta que me ace-windowpresenté a MELPA.
abo-abo

1
gracias por ace-window, tiene más personalización que otros paquetes, supongo. Aún así, uno podría ser de ayuda en el futuro es un enlace clave para una función que sería similar a la acción de intercambio inteligente, pero se come esa ventana, lo que da como resultado una ventana más grande en el punto y una ventana elegida de menor tamaño (el comido ventana hacia arriba). La relación debe determinarse en este caso como puede ser la mitad, un cuarto o un tercio.
doctorado

44
Por favor considere agregar una descripción. Simplemente dices que te gusta y lo vinculas. Eso hace que esto sea esencialmente una respuesta de solo enlace.
Dibujó

44
¿Cuál es el beneficio de ace-window? ¿Por qué debería usarlo sobre las otras 14 soluciones propuestas en esta página?
Gilles

103

Una forma es usar windmove. Con sus combinaciones de teclas predeterminadas, permite cambiar a la ventana junto a la actualmente activa.

Está construido en Emacs, por lo que no es necesario instalar nada; simplemente actívelo con la siguiente configuración mínima en su archivo init:

(windmove-default-keybindings)

A continuación, puede cambiar a ventanas vecinas utilizando las siguientes teclas (donde la flecha se utiliza de forma intuitiva define la dirección en que se mueve): S-<left>, S-<right>, S-<up>, S-<down>.


Si prefiere usar otro modificador en lugar de shift, puede proporcionarlo como argumento para windmove-default-keybindings. Por ejemplo:

(windmove-default-keybindings 'meta)

o

(windmove-default-keybindings 'control)

Más información en Emacs Wiki .


16
¡Esta debería ser la respuesta aceptada!
Rowman

Dios mío, ¿por qué ningún tutorial menciona las teclas Mayús + flecha para moverse por la ventana? Es mucho mejor que ctrl + o
Didier A.

Diría que algunas de las otras respuestas aquí contienen una configuración de movimiento de viento redundante. Quizás valga la pena actualizar la respuesta para mencionar que la función acepta la tecla modificadora como argumento, por ejemplo, (windmove-default-keybindings 'meta)como se sugiere en EmacsWiki.
metaturso

Esto crea muchos conflictos con otras combinaciones de teclas (o con gestores de ventanas). Prefiero ace-window.
azzamsa

Estoy usando algo similar (me estoy moviendo Shift-arrow) , pero cuando tienes un monitor grande con muchas divisiones, ese movimiento rápidamente se vuelve difícil de manejar. Sería más interesante enumerar de alguna manera ventanas / divisiones. Me gusta ace-window, pero con menos pulsaciones de teclas y un algoritmo obvio para averiguar de inmediato el número que desea.
Hola Ángel,

21

Puede vincularse other-windowa una secuencia de teclas más fácil de escribir.

Por ejemplo, he C-.unido a other-window, y C-,obligado a ir a la ventana anterior.

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

(defun prev-window ()
  (interactive)
  (other-window -1))

Esto es especialmente útil para mover múltiples ventanas; una vez que mantienes presionado Control, solo tienes que presionar un solo botón para pasar a la siguiente ventana. Esto es mucho más fácil que tres pulsaciones de teclas por movimiento.


2
+1 C-x opara other-windowes uno de los pocos competidores sólidos por el título de "peor atajo predeterminado de emacs". Mi solución (similar a zck) fue volver a vincular other windowa una secuencia de teclas (mucho más fácil): lo tengo vinculado C-;(y mi Caps-Lockse intercambia con Ctrllo que todo lo que se necesita es un toque rápido de los meñiques). Por cierto, soy totalmente dependiente de ciertas características de helmy icicles(es decir, no soy "anti-paquetes" ni nada); Solo creo que una solución simple funciona mejor aquí.
Iceman

2
+1 Esta debería ser la respuesta aceptada Y la respuesta más simple también (por desgracia, aún no existe tal cosa en StEx). Funciona fuera de la caja, escala perfectamente, fácil de memorizar. Esto último me pareció especialmente importante en la jungla de Emacs. Después de sobrevivir allí más de 20 años, a veces me encuentro ansiosamente acechando en el desierto vi ...
Andreas Spindler

Simple, fácil de usar, fácil de implementar. Esto necesita más votos.
stewSquared

1
Esto también es lo que hago. Yo uso M-opara other-window. Algunos modos ya tienen M-ode unión, en particular diff-mode, ggtag-modey ibuffer-mode. Debe desenlazarlo manualmente en cada mapa de modo. unbind-keyproporcionado por bind-key.eles muy útil.
Yasushi Shoji

Yo uso M-otambién, y han M-Oobligado a ace-windowpara cuando necesito la energía adicional.
glucas

13

numeración de ventanas.

Asigno la tecla de acceso rápido ", 1", ", 2", ", 3" para cambiar la ventana específica (tenga en cuenta que uso el modo malvado)

además, muestro el número de ventana en la línea de modo en color ROSADO, subrayado.

Es una pista visual que nunca puedes ignorar,

Esa es la forma más rápida de cambiar de ventana.

consulte https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el y https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el para mi configuración.

Sylvain Benner adoptó mi idea en los spacemacs, pero las combinaciones de teclas son diferentes . Entonces, si usa spacemacs, obtiene la solución más rápida de la caja.


2
Sip. Este concepto es genial. Uso el paquete window-numbercon M-<num>para cambiar rápidamente las ventanas en blanco y negro. Concepto similar a este
unperson325680

1
Tenga en cuenta que window-numbering.el está en desuso a favor de winum , que está aquí . FWIW la numeración de ventanas para mí ni siquiera funcionó.
Hola Angel

Podría cambiar a winum pronto. Pero la numeración de ventanas todavía funciona bien en emacs24 / 25/26.
chen bin

10

Sin usar complementos adicionales, puede continuar usándolo C-x ocon un prefijo opcional para omitir esa cantidad de ventanas. Por ejemplo: C-u 1 C-x oirá a la siguiente ventana en el orden (es decir, lo que obtendría con simple C-x o), C-u 2 C-x opasa dos ventanas, C-u 3 C-x opasa tres ventanas, y así sucesivamente.

Un extracto de la other-windowcadena de documentación (la función llamada por C-x o:

COUNT especifica el número de ventanas a omitir, comenzando con la ventana seleccionada, antes de realizar la selección. Si COUNT es positivo, omita COUNT ventanas hacia adelante. Si COUNT es negativo, omita -COUNT ventanas hacia atrás. COUNT zero significa que no omita ninguna ventana, por lo tanto, seleccione la ventana seleccionada. En una llamada interactiva, COUNT es el argumento de prefijo numérico. Regreso nulo.


Cuando tienes varias ventanas, ¿qué orden siguen?
stsquad

El orden es el orden cíclico de la ventana .
Dan

2
hmm "El orden está determinado por un recorrido transversal primero del árbol de la ventana del marco, recuperar las ventanas vivas que son los nodos de las hojas del árbol" no es la descripción más útil para el cerebro humano que trata de adivinar qué ventana está al lado o cuantos saltear Supongo que es por eso que uso ace-window.
stsquad

2
@stsquad: oh, estoy de acuerdo contigo, también me da vueltas la cabeza. Puse esta respuesta aquí en aras de la integridad.
Dan

8

Algunas personas pueden recordar el editor Brief (curiosamente producido por una compañía llamada Underware).

Tenía una buena forma de cambiar entre ventanas visibles. La flecha M movería el cursor a la ventana directamente en línea con la dirección de la tecla de flecha.

Por lo tanto, Me asignan los winmove-left, winmove-right, winmove-upy winmove-downfunciones a M-left, M-right, M-upy M-downlas teclas de la siguiente manera en mi archivo .emacs -

(global-set-key [M-left] 'windmove-left)          ; move to left window
(global-set-key [M-right] 'windmove-right)        ; move to right window
(global-set-key [M-up] 'windmove-up)              ; move to upper window
(global-set-key [M-down] 'windmove-down)          ; move to lower window

Ahora puedo moverme con facilidad entre ventanas, independientemente de lo desordenada que tenga la configuración ... Y puede estar bastante abarrotada con el tamaño de las pantallas hoy en día ...


¿No es más o menos la respuesta de @ Francesco?
Dan

Estoy de acuerdo. No me di cuenta antes de publicar el mío.
user2542

2
¡Una forma mucho más corta de obtener esas combinaciones de teclas es (windmove-default-keybindings 'meta)!
Omar

8

Si usa Icicles, entonces le C-x opermite seleccionar ventanas por nombre (o en bicicleta).

  • Sin prefijo arg, C-x oes el mismo de siempre, a other-windowmenos que el marco tenga solo una ventana, en cuyo caso lo es other-frame.

  • Con un prefijo arg, C-x oes un comando múltiple que le permite navegar entre ventanas o marcos por nombre (o en bicicleta). Navegar entre ventanas usa comandos múltiples icicle-select-window; navegando entre usos de marcos icicle-select-frame.

La navegación que se usa depende del prefijo arg:

  • Argumento de prefijo cero (p C-0. Ej. ): Si el marco seleccionado tiene varias ventanas, esto es icicle-select-window, con ventanas en el mismo marco que los candidatos. De lo contrario (marco de ventana única), esto es icicle-select-frame.

  • C-u: Si el marco seleccionado tiene múltiples ventanas, entonces esta es icicle-select-window, con ventanas de todos los marcos visibles como candidatos. De lo contrario, esto es icicle-select-frame.

  • C-u C-u: icicle-select-window, con ventanas de todos los marcos como candidatos (incluidos los marcos iconificados u ocultos).

Como siempre en Icicles , puede combinar (a) completar , escribir texto para reducir el conjunto de candidatos coincidentes (nombres de ventana o marco, en este caso), con (b) ciclismo (entre candidatos coincidentes).


4

Considere usar un acorde de tecla para saltar rápidamente entre ventanas. Lo encuentro mucho más rápido que alcanzar una tecla modificadora (y menos esfuerzo en mis manos también).

Mi elección de paquete para usar es ace-window, que le permite navegar por múltiples ventanas más fácil que solo other-window.

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

Obviamente para usar esto necesitas key-chordy ace-window, ambos están disponibles en melpa.


2
¿No es más o menos la respuesta de @ abo-abo?
Dan

1
@Dan his no usa key-chord, tenga en cuenta la falta de meta o superkey en el acorde. Si usa ace-window / algo más es un poco irrelevante, el punto era dar una respuesta que no use teclas modificadoras para una operación tan comúnmente utilizada.
Zavior

1
Vi eso, pero planteé la pregunta porque ace-windowestá haciendo el trabajo como en la respuesta de @ abo-abo. Me parece que, en este contexto, la combinación de teclas específica para usar tendría más sentido como un comentario que como una respuesta. Solo mis dos centavos.
Dan

@Dan, en general, la pregunta era sobre cambiar rápidamente las ventanas, y no creo que esta solución se haya presentado todavía. Aclaró un poco la respuesta con respecto a eso.
Zavior

@Zavior plantea un punto importante. La pregunta es acerca de cambiar ventanas rápidamente, para lo cual la forma del enlace es muy importante. Independientemente de la biblioteca que prefiera, key-chordpermite enlazar combinaciones de teclas muy accesibles. El enlace de ejemplo de xoes más rápido que C-x o(profundidad de uno frente a dos). Esta respuesta podría reformularse para enfatizar que la respuesta es ortogonal a las otras respuestas sobre la selección de funciones (y ace-windowes solo una de las muchas opciones que podrían vincularse de la manera descrita). ¡Mantenga esta respuesta como distinta!
ebpa

3

Algunas buenas respuestas aquí, también soy fanático de WinMove, pero lo asocio a C- porque org-mode usa M- para manipular encabezados

(define-key global-map (kbd "C-<up>") 'windmove-up)
(define-key global-map (kbd "C-<down>") 'windmove-down)
(define-key global-map (kbd "C-<left>") 'windmove-left)
(define-key global-map (kbd "C-<right>") 'windmove-right)

Donde se pone realmente bueno es si lo combinas con Hydra . Siguiendo los ejemplos en su wiki , creé mi propio monstruo:

(defhydra hydra-windows ()
  "C-arrow = switch, S-arrow = size, M-arrow = move"
  ("C-<left>" windmove-left nil)
  ("C-<right>" windmove-right nil)
  ("C-<up>" windmove-up nil)
  ("C-<down>" windmove-down nil)
  ("S-<left>" hydra-move-splitter-left nil)
  ("S-<right>" hydra-move-splitter-right  nil)
  ("S-<up>" hydra-move-splitter-up nil)
  ("S-<down>" hydra-move-splitter-down nil)
  ("M-<left>" buf-move-left nil)
  ("M-<right>" buf-move-right nil)
  ("M-<up>" buf-move-up nil)
  ("M-<down>" buf-move-down nil)
  ("p" previous-buffer "prev-buf")
  ("n" next-buffer "next-buf")
  ("1" delete-other-windows "1")
  ("d" delete-window "del")
  ("k" kill-buffer "kill")
  ("s" save-buffer "save")
  ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
  ("r" winner-redo "redo")
  ("b" helm-mini "helm-mini" :exit t)
  ("f" helm-find-files "helm-find" :exit t)
  ("|" (lambda () (interactive) (split-window-right) (windmove-right)))
  ("_" (lambda () (interactive) (split-window-below) (windmove-down)))
  ("q" nil "cancel")
  )

(global-set-key (kbd "M-#") 'hydra-windows/body)

Esto me permite cambiar ventanas, redimensionarlas, mover buffers de una ventana a otra, alternar buffers, eliminar buffers e incluso deshacer configuraciones de ventanas a través del modo ganador, y también integra el timón. Para salir de la hidra, simplemente presione la flecha o alguna otra tecla que no esté en la hidra. Puede encontrar las funciones de "movimiento de hidra" en los ejemplos de hidra. Lo mejor de la hidra es que no tengo que recordar todas esas combinaciones de teclas y es "modesta", así que una vez que esté en la hidra, todo estará disponible como una sola tecla. prensa.


1
Una forma más corta de obtener las combinaciones de teclas que mencionas al principio es (windmove-default-keybindings 'control).
Omar

1

Si lo usa evil-mode, puede usar un prefijo numérico con C-w C-w( evil-window-next) para elegir la ventana que desee. Entonces: 1 C-w C-wselecciona la primera ventana en orden cíclico, 3 C-w C-welige la tercera ventana en orden cíclico, y así sucesivamente.


Parece que debería combinarse con su otra respuesta : es lo mismo, solo con enlaces específicos del mal.
npostavs

1

Ace Jump le permite navegar su puntero a todas las palabras en una pantalla, independientemente de en qué ventana o marco se encuentren, por lo que no es tan diferente de usar Ace Window o Switch Window.

Una ventaja podría ser que al saltar ventanas también puede colocar el puntero con cierta precisión.

Todavía lo encuentro un poco engorroso o distractor, y encuentro que estoy usando windmovemás, porque es muy simple, pero aún así uso Ace Jump cuando he estado leyendo en otra ventana o marco y quiero moverme a un lugar allí.


1

Como de costumbre, hay cientos de formas diferentes de lograr esto. Mi forma preferida es usar NumberedWindows . Luego configuro la siguiente combinación de teclas usando Super y las teclas 1-9.

(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))

Entro en un poco más de detalle sobre este tema exacto con una publicación reciente que puedes leer en Afternoon Coder .


¿Cómo difiere esto de la respuesta de Chen Bin ?
Gilles

Tiene un ejemplo de configuración.
Travis

-1

También puede optar por usar switch-window como un reemplazo visual paraC-x o


1
¿Cuál es el beneficio de switch-window? ¿Por qué debería usarlo sobre las otras 14 soluciones propuestas en esta página?
Gilles

¿Cómo dice que deberías? Emacs tiene que ver con alternativas, personalización y libertad de decisión.
csantosb

2
Eso no es ni aquí ni allá. ¿Por qué alguien elegiría esta alternativa en particular? ¿Por qué uno decidiría usar switch-windowsobre todos los demás?
Gilles