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?

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)


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)

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 )


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


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)

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)

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.


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 )


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!


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.


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

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"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.