Emacs, cambia a la ventana anterior

93

En Emacs, C-x ome lleva a la siguiente ventana.

¿Qué macro de teclado me lleva a la ventana anterior en Emacs?

Roger CS Wernersson
fuente

Respuestas:

88

Eso seria C-- C-x o

En otras palabras, C-x ocon un argumento de -1. Puede especificar cuántas ventanas mover insertando un argumento numérico entre C-uy el comando, como en C-u 2 C-x o. ( C--es un atajo para C-u - 1)

JB.
fuente
Y puede usar C-x zpara repetir el último comando para cambiar rápidamente las ventanas.
Ivan Huang
105

También puede intentar usar windmove, que le permite navegar a la ventana de su elección en función de la geometría. Tengo lo siguiente en mi archivo .emacs para cambiar las ventanas usando la tecla de flecha Cx.

(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)
Nate
fuente
11
Tenga en cuenta que la llamada (windmove-default-keybindings)vincula estas funciones a SHIFT + arriba / abajo / izquierda / derecha, lo que creo que es más conveniente que sus C-xvinculaciones (que entran en conflicto con las vinculaciones predeterminadas también útiles para previous-buffery next-buffer. Lkahtz: la (kbd)función le permite especificar claves en notación de cadena en la sintaxis más legible que también usa Emacs cuando usa C-h ko C-h cpara describir un enlace.
phils
4
No apruebo el uso de las teclas de flecha. Pero voté a favor de la amabilidad de todos modos. : presumido:
Bjorn
2
@phils SHIFT + <keys> se entromete con la selección de shift que está habilitada por defecto desde Emacs 23 (shift-selection-mode).
legends2k
2
legends2k: Verdadero; aunque también puede pasar un argumento a windmove-default-keybindingspara especificar un modificador diferente para usar junto con las teclas de flecha; por lo que esa función aún puede ser útil para las personas que utilizan el modo de selección de turno.
phils
1
@phils De acuerdo, meta parece ser una buena alternativa; como se ve en Emacs Wiki .
legends2k
30

Personalmente prefiero usar window-number.el

Para seleccionar una ventana diferente, use Ctrl- x, Ctrl-j n

Donde n es el número de la ventana, la línea de modelo de cada ventana muestra su número, como se muestra en la captura de pantalla.

Simplemente descargue window-number.el , colóquelo en su ruta de carga de emacs y use lo siguiente en su.emacs

 (autoload 'window-number-mode "window-number"
   "A global minor mode that enables selection of windows according to
 numbers with the C-x C-j prefix.  Another mode,
 `window-number-meta-mode' enables the use of the M- prefix."
   t)

Hay otro modo similar llamado switch-window.elque le da números grandes en las ventanas ... (al presionar el número se cambia la ventana y se revierte la pantalla).


(fuente: tapoueh.org )

ocodo
fuente
2
Bien, pero sugeriría no vincular algo C-x C-j, ya que ese es el enlace predeterminado para dired-jumpsi usted (require 'dired-x). (Vea M-x customize-group RET dired-keys RETsi desea anular eso.)
phils
1
Después de publicar esto, decidí switch-window.elintentarlo, usa en su C-x olugar, y cuando solo hay dos ventanas activas, simplemente selecciona la otra ventana. Creo que es más sabio volver a unirse C-x opara hacer el window-numbertruco, tienes razón dired-jump. Personalmente, hago menos cambios de ventana y C-x bme uso , pero tener la mejora C-x oes bastante agradable.
ocodo
wow increíble tema de Emacs en la primera captura de pantalla. ¿Cómo puedo obtenerlo?
semente
@semente en mi página relacionada con Emacs jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo
1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Creo que este es probablemente uno de los dos temas. - por cierto. Para una línea de modo genial, pruebe gist.github.com/jasonm23/8554119
ocodo
13

Si trabaja mucho con varias ventanas emacs (> 3) y querrá guardar algunas pulsaciones de teclas, agregue esto a su archivo de inicio y estará mejor:

(defun frame-bck()
  (interactive)
  (other-window-or-frame -1)
)
(define-key (current-global-map) (kbd "M-o") 'other-window-or-frame)
(define-key (current-global-map) (kbd "M-O") 'frame-bck)

Ahora solo recorre rápidamente las ventanas con Mo

octi
fuente
1
Esta es exactamente la solución que necesitaba. Todo lo que quería era que el comando de cambio de ventana fuera una sola pulsación de tecla repetida. ¡Gracias! Tuve que cambiar otra-ventana-o-marco a otra-ventana para que funcione, FYI. Estoy en Emacs 24.2.1.
Geoff
Creo que estos enlaces son muy buenos (especialmente cuando tienes más de 2 ventanas), gracias. Como se dijo también sombrero para cambiar para other-windowque funcione.
dolzenko
11

Aquí hay algunas respuestas muy buenas y completas, pero para responder la pregunta de manera minimalista:

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

 (define-key global-map (kbd "C-x p") 'prev-window)
bnzmnzhnz
fuente
2
No sé desde cuándo, pero emacs ya se ha previous-windowincorporado.
Arne
@Arne No es una función invocable, por M-xlo que debería tener un propósito diferente.
Ivan Huang
4

Basado en la idea de @Nate pero ligeramente modificada para admitir el ciclo hacia atrás entre ventanas

;; Windows Cycling
(defun windmove-up-cycle()
  (interactive)
  (condition-case nil (windmove-up)
    (error (condition-case nil (windmove-down)
         (error (condition-case nil (windmove-right) (error (condition-case nil (windmove-left) (error (windmove-up))))))))))

(defun windmove-down-cycle()
  (interactive)
  (condition-case nil (windmove-down)
    (error (condition-case nil (windmove-up)
         (error (condition-case nil (windmove-left) (error (condition-case nil (windmove-right) (error (windmove-down))))))))))

(defun windmove-right-cycle()
  (interactive)
  (condition-case nil (windmove-right)
    (error (condition-case nil (windmove-left)
         (error (condition-case nil (windmove-up) (error (condition-case nil (windmove-down) (error (windmove-right))))))))))

(defun windmove-left-cycle()
  (interactive)
  (condition-case nil (windmove-left)
    (error (condition-case nil (windmove-right)
         (error (condition-case nil (windmove-down) (error (condition-case nil (windmove-up) (error (windmove-left))))))))))

(global-set-key (kbd "C-x <up>") 'windmove-up-cycle)
(global-set-key (kbd "C-x <down>") 'windmove-down-cycle)
(global-set-key (kbd "C-x <right>") 'windmove-right-cycle)
(global-set-key (kbd "C-x <left>") 'windmove-left-cycle)
Troydm
fuente
4

Solo para agregar a la respuesta de @Nate, @aspirin y @ Troydm, encuentro que esta es una adición muy útil si decide vincular los comandos de windmove a cualquier combinación de teclas que elija:

(setq windmove-wrap-around t)

Con la configuración predeterminada, obtendrá un error cuando intente moverse a una ventana que no existe, lo que se vuelve un poco molesto después de un tiempo. Sin embargo, cuando se establece windmove-wrap-around, al intentar moverse fuera de la parte inferior del marco, por ejemplo, se seleccionará la ventana superior del marco. Este puede ser un comportamiento más intuitivo para usted.

Hal
fuente
4

M-ny M-ptiene más sentido para mí, ya que son análogos a C-n( next-line ) y C-p( previous-line ):

(define-key global-map (kbd "M-p") 'previous-multiframe-window)
(define-key global-map (kbd "M-n") 'other-window)

(inspirado por esto y aquello )

tshepang
fuente
He votado a favor y he usado esta configuración. El problema es que M-ny M-pya se usan en terminales (gdb, python, ielm, etc.) por lo que tendrás que volver a cambiar a otro método para saltar fuera del búfer del terminal.
mihai
¿Para qué se utilizan en esos entornos?
tshepang
Ese es el mejor que he visto por el momento, no va en contra de otras cosas y funciona a las mil maravillas. ¡Gracias!
aurelien
2

En referencia a la respuesta de Nate, reemplacé el arrow keyspara usar el tradicional ppara ir up, npara ir down, fpara ir righty bpara ir left. También reemplacé la tecla Ctrlcon, Superya que C-p, C-n, C-f and C-bson las teclas de movimiento predeterminadas. Esta combinación con le Mpermite saltar caracteres y líneas en lugar de pasar uno por uno después de cada pulsación de tecla. Por lo tanto, Superkey consideró la mejor opción para mantener una combinación de teclas fácil. Además, ¡ahora ya no tienes que quitar la mano de la línea de casa!

(global-set-key (kbd "s-p") `windmove-up)
(global-set-key (kbd "s-n") `windmove-down)
(global-set-key (kbd "s-f") `windmove-right)
(global-set-key (kbd "s-b") `windmove-left)

¡Espero eso ayude!

Indradhanush Gupta
fuente
2
(global-unset-key (kbd "M-j"))
(global-unset-key (kbd "M-k"))
(global-set-key (kbd "M-j") (lambda () (interactive) (other-window 1)))
(global-set-key (kbd "M-k") (lambda () (interactive) (other-window -1)))

altjy altkrecorrerá los búferes visibles. Hacia adelante y hacia atrás, para ser exactos.

sjas
fuente
Mk es un atajo bastante útil. alguna otra alternativa?
A_P
1

Ya existe un paquete que le permite cambiar de ventana usando M-. consulte este sitio web . Agregue esto a su archivo de inicio:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt
aspirina
fuente
0
(global-set-key (kbd "C-x a") 'ace-swap-window)  
(global-set-key (kbd "C-x q") 'ace-select-window)

download ace-window from the melpa repo if you don't know how to do that
put this in your .emacs file if you don't have one create it 

(package-initialize)                                                                                                                                                                     

(require 'package)                                                                                                                                                                       
(add-to-list 'package-archives '("melpa" , "http://melpa.org/packages/"))                                                                                                                

(package-initialize) 

then "m-x list-packages"
usuario9618991
fuente