Cómo intercambiar los búferes en 2 windows emacs


98

Estoy usando emacs y encuentro que a veces tengo 2 archivos separados en 2 ventanas.

Por ejemplo: abro 1 archivo usando C-x C-f file1.c RET

y dividí el marco en dos ventanas: C-x 3

Luego abro otro archivo C-x C-f file2.c RET

Entonces tengo 2 archivos:

ventana 1 (izquierda) file1.c

ventana 2 (derecha) file2.c

Me pregunto si hay alguna combinación de teclas para intercambiar los archivos. Normalmente me gusta trabajar en la ventana izquierda cuando tengo 2 ventanas. Sé que puedo hacer fácilmente C-x opara mover el cursor a la ventana derecha.

Sin embargo, me pregunto si puedo intercambiar los archivos para que file2.cestén en la ventana izquierda y file1.cen la ventana derecha.


Esto también funciona (probado en emacs24): Transposición dos buffers Parece similar a Bahbar respuesta
nephewtom

Respuestas:


88

Yo uso buffer-move para esto. Ahora, si está trabajando en el búfer del lado izquierdo, llamar a 'buf-move-right' lo intercambiará con el de la derecha. Supongo que esto es lo que quieres.


Esta solución es perfecta y los comentarios son muy claros, solo asegúrese de leerlos :)
Martin Clarke

3
Si solo desea intercambiar ventanas (independientemente de la seleccionada), puede usar lo siguiente(defun win-swap () "Swap windows using buffer-move.el" (interactive) (if (null (windmove-find-other-window 'right)) (buf-move-left) (buf-move-right)))
mefiX

buffer-move no funcionó para mí con el diseño de solo dos ventanas, pero win-swapfuncionó bien, ¡gracias!
dolzenko

1
Dentro de esa fuente de buffer-movimiento verá un comentario sobre las asignaciones de suma importancia para C-S-upque buf-move-upetc
Miqueas Elliott

34

La biblioteca de transposición de marcos proporciona un conjunto bastante completo de funciones para voltear o rotar las disposiciones de las ventanas en marcos.

M-x flop-frame RET hace lo que necesita esta pregunta en particular.

Los siguientes diagramas son del comentario en la biblioteca (y su página EmacsWiki):

transpose-frame  Swap x-direction and y-direction

       +------------+------------+      +----------------+--------+
       |            |     B      |      |        A       |        |
       |     A      +------------+      |                |        |
       |            |     C      |  =>  +--------+-------+   D    |
       +------------+------------+      |   B    |   C   |        |
       |            D            |      |        |       |        |
       +-------------------------+      +--------+-------+--------+

flip-frame  Flip vertically

       +------------+------------+      +------------+------------+
       |            |     B      |      |            D            |
       |     A      +------------+      +------------+------------+
       |            |     C      |  =>  |            |     C      |
       +------------+------------+      |     A      +------------+
       |            D            |      |            |     B      |
       +-------------------------+      +------------+------------+

flop-frame  Flop horizontally

       +------------+------------+      +------------+------------+
       |            |     B      |      |     B      |            |
       |     A      +------------+      +------------+     A      |
       |            |     C      |  =>  |     C      |            |
       +------------+------------+      +------------+------------+
       |            D            |      |            D            |
       +-------------------------+      +-------------------------+

rotate-frame  Rotate 180 degrees

       +------------+------------+      +-------------------------+
       |            |     B      |      |            D            |
       |     A      +------------+      +------------+------------+
       |            |     C      |  =>  |     C      |            |
       +------------+------------+      +------------+     A      |
       |            D            |      |     B      |            |
       +-------------------------+      +------------+------------+

rotate-frame-clockwise  Rotate 90 degrees clockwise

       +------------+------------+      +-------+-----------------+
       |            |     B      |      |       |        A        |
       |     A      +------------+      |       |                 |
       |            |     C      |  =>  |   D   +--------+--------+
       +------------+------------+      |       |   B    |   C    |
       |            D            |      |       |        |        |
       +-------------------------+      +-------+--------+--------+

rotate-frame-anti-clockwise  Rotate 90 degrees anti-clockwise

       +------------+------------+      +--------+--------+-------+
       |            |     B      |      |   B    |   C    |       |
       |     A      +------------+      |        |        |       |
       |            |     C      |  =>  +--------+--------+   D   |
       +------------+------------+      |        A        |       |
       |            D            |      |                 |       |
       +-------------------------+      +-----------------+-------+

2
flop-framefunciona solo cuando la división entre las ventanas es vertical, para la división horizontal que necesita flip-frame. Sin embargo, rotate-framefunciona de forma independiente; un comando para intercambiar los búferes entre dos ventanas, sin importar la orientación dividida :)
legends2k

33

En el archivo de NOTICIAS de Emacs 26.1 hay la siguiente entrada:

+++
*** New command 'window-swap-states' swaps the states of two live
windows.

¿Cuál parece ofrecer una funcionalidad similar crux-transpose-windowspero también puede hacer algunas transposiciones de altura / ancho?


Si, esto funciona. Tengo Emacs> 26.1. M-x window-swap-statesintercambió los búferes entre las dos ventanas.
Samrat Debroy

15

Si está usando Prelude , puede usar C-c s( prelude-swap-windows). De la documentación de Prelude:

C-c sejecuta el comando crux-swap-windows(que se encuentra en prelude-mode-map), que es un alias para crux-transpose-windowsen crux.el .


el preludio parece un bocado (y no está empaquetado en ninguna parte - curl | sh= ¿wtf?), pero Crux seguro que se ve bien y hace un montón de cosas que hice por mi cuenta en primer lugar.
anarcat

Sé lo que curl | shes, lo que estoy diciendo es: es malvado.
anarcat

11

No tengo conocimiento de ninguna función incorporada que haga esto.

Sin embargo, no parece demasiado difícil conseguir algo de elisp para hacerlo. Sin embargo, el diablo está en los detalles.

(defun swap-buffers-in-windows ()
  "Put the buffer from the selected window in next window, and vice versa"
  (interactive)
  (let* ((this (selected-window))
     (other (next-window))
     (this-buffer (window-buffer this))
     (other-buffer (window-buffer other)))
    (set-window-buffer other this-buffer)
    (set-window-buffer this other-buffer)
    )
  )

En particular, es posible que esto no esté haciendo lo que desea con respecto a dónde termina el símbolo de intercalación. Sin embargo, primero tendrías que decir lo que quieras: p


Copié y pegué este código, y parece que no hace nada.

Oh, lo siento, hace algo, cambia las partes superior e inferior de la ventana de Emacs. Esperaba que cambiara los marcos.

Okay. Me estas confundiendo. mencionaste Cx 3. Esto es para crear 2 ventanas emacs, no 2 marcos emacs. ¿Estás usando marcos o ventanas? ¿Cómo llamas ventanas y cómo llamas marcos?
Bahbar

Además, no hablaste de las partes superior e inferior. ¿Muestra más de 2 búferes a la vez?
Bahbar

No soy la persona que hizo la pregunta, solo soy un intruso. Nunca había usado Cx 3 antes de ver esta pregunta, pero como usted dice, divide la ventana de Emacs, en lugar de crear un nuevo marco.

1

Si tiene preludio, puede usar ace-window con S-w. Desde allí, puede hacer muchas cosas enumeradas en sus documentos. .

También puede comenzar llamando a ace-window y luego decidir cambiar la acción para eliminar o intercambiar, etc. De forma predeterminada, los enlaces son:

x - eliminar ventana

m - ventana de intercambio (mover)

c - ventana dividida equitativamente, ya sea vertical u horizontalmente

v - ventana dividida verticalmente

b - ventana dividida horizontalmente

n - seleccione la ventana anterior

...

Entonces seria S-w m


Para los usuarios de Spacemacs, ace-swap-windowestá destinado a SPC w M. Esta funcionalidad está disponible de forma predeterminada.
Claudio

0

El siguiente fragmento de código puede cambiar de búfer.

(defun ab/switch-buffer-each-other (arg)
  "switch current buffer with other window buffer 
   right-2-left and up-2-down"
  (interactive "p")
  (cond
   ((windmove-find-other-window 'right) (buf-move-right))
   ((windmove-find-other-window 'left) (buf-move-left))
   ((windmove-find-other-window 'up) (buf-move-up))
   ((windmove-find-other-window 'down) (buf-move-down)))
(message "switch buffer done"))

-1

Me las ingeniaría para abrir el archivo # 2 en la ubicación deseada, es decir, después de presionar cx 3, mueva el cursor con cx o antes de navegar al segundo archivo.

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.