Cómo alternar entre dos ubicaciones en un búfer

38

A veces me encuentro alternando frecuentemente entre dos funciones que estoy editando conjuntamente. En estas situaciones, es tedioso y doloroso seguir haciendo un C-s <functionname>cambio a la otra función y luego encontrar el lugar exacto que estaba editando anteriormente.

¿Cómo configuro marcadores y luego salto hacia adelante y hacia atrás entre dos ubicaciones en el búfer con facilidad?

Vedaad Shakib
fuente
3
Lo estás haciendo mal. Debe tener una vista dividida vertical para que pueda ver ambas funciones al mismo tiempo.
CaptainCodeman
8
No estoy de acuerdo con que OP esté "haciéndolo mal". Si bien una ventana dividida sería útil, OP todavía necesitará saltar de un lado a otro entre las ventanas al editar ambas funciones. Además de eso, la pregunta es más general que el caso de uso específico: OP quiere poder saltar rápidamente a diferentes ubicaciones en un búfer. Muchas de las respuestas a continuación ofrecen varias formas útiles de hacerlo.
Dan
@Dan Eso es genial, y estoy de acuerdo contigo, pero mi respuesta no tiene la intención de resolver su problema, solo señalar que hay una forma alternativa.
CaptainCodeman
44
@CaptainCodeman, está bien, aunque la respuesta de T. Vernon a continuación proporciona la alternativa de ventana dividida. Trate mi comentario como una solicitud más general de lenguaje proactivo en las publicaciones.
Dan
1
@ Capitán Código Tiene toda la razón. No sabía que emacs admitía una vista dividida vertical. Como tal, he aceptado la respuesta que detalla el uso de estas vistas divididas verticales.
Vedaad Shakib

Respuestas:

20

Ventanas Emacs

C-x 2abrirá otra ventana (= dividir el marco) debajo de la actual, adjunta al mismo búfer. Puede mover el punto en cualquier ventana sin afectar a la otra.

Puede moverse de una ventana a otra usando C-x o. La biblioteca de movimiento de viento incorporada proporciona algunas funciones que facilitan la navegación entre ventanas.

Si este método le conviene, es posible que también desee echar un vistazo a los buffers indirectos .

ingrese la descripción de la imagen aquí

T. Verron
fuente
Tal vez debería agregar algunas líneas más sobre el uso de búferes indirectos: realmente es más útil (y un poco más complejo) que usar solo otra ventana.
ffevotte
@Francesco Entiendo a qué te refieres ahora (con la otra respuesta sobre buffers indirectos), de hecho, esa también es una opción muy fácil de usar. Ese no es el uso que tenía en mente: mi uso de buffers indirectos no reemplaza el uso de una ventana diferente, pero permite cambiar la vista con estrechamiento, por ejemplo. Agregaré algunas palabras a la respuesta cuando encuentre el tiempo.
T. Verron
56

Registros:

C-xrSPCcorre point-to-register
C-xrjcorrejump-to-register

Escriba cualquier carácter para especificar un registro cuando se le solicite. 1

Marcadores:

C-xrmcorre bookmark-set
C-xrbcorrebookmark-jump

Marca anillo:

C-SPCC-SPCempuja la posición actual al anillo de marca (sin dejarlo activo).
C-uC-SPCaparece el anillo de marca, saltando a la posición anterior. Puede usar esto repetidamente para navegar por todo el anillo.

Tenga en cuenta que algunos comandos (especialmente los que pueden desplazarlo a una distancia desconocida o arbitraria de su ubicación original) empujarán automáticamente al anillo de marca para que pueda usar C-uC-SPCpara regresar después. Esto incluye isearch, así que después de usar C-spara ir a algún lugar, puede volver a saltar fácilmente.

Punto de cambio y marca:

Y como comenta Tu Do, C-xC-xcorre , lo exchange-point-and-markcual es muy útil para saltar entre dos ubicaciones. También activa la marca / región, pero puede usar C-SPCpara borrar el resaltado.


1 Si está aprovechando la funcionalidad de registro en elisp, use algún símbolo no conflictivo para el nombre, en lugar de un carácter, para que no pueda entrar en conflicto con los registros configurados interactivamente (a menos, por supuesto, que desee hacer ese).

phils
fuente
2
También debe agregar C-x C-x, ya que puede saltar de un lado a otro entre dos posiciones. C-u C-SPCaparece el anillo de marca y ejecutar nuevamente moverá el punto a otra parte.
Tu Do
18

Además de la respuesta de phils, hay algunas opciones más:

  • helm-all-mark-rings : le permite ver el contenido de los anillos de marcas locales y globales en una interfaz amigable, para que siempre pueda volver a donde estaba. Puedes empujar marca con C-SPC C-SPC. Manifestación:

timón-todos-marca-anillos

  • helm-semantic-or-imenu : enumera todas las definiciones disponibles en el archivo actual. Si el cursor está dentro de una definición, al activar el resaltador preselecciona esa definición.

  • sr-speedbar : un navegador de archivos que enumera sus definiciones en cada archivo. Es similar al árbol de esquema en IDE.

Tu Do
fuente
9

Además de los registros y los marcadores (vea la respuesta de @ phils sobre ambos y mi otro, Icicles responde sobre los marcadores), los marcadores , particularmente los marcadores automáticos o temporales, pueden ser útiles para esto. Necesita la biblioteca Bookmark + para estos tipos de marcadores especiales.

  • Un marcador automático es uno que no necesita nombrar. Es rápido crear y eliminar: solo presione una tecla. La misma clave crea o elimina un marcador en el punto. (De forma predeterminada, esto está obligado a C-x p RET, pero, por supuesto, puede usar cualquier tecla).

  • Los marcadores automáticos son, como los marcadores en general, persistentes. Pero opcionalmente puede hacer que se eliminen automáticamente.

  • También puede crear marcadores temporales o hacer que los marcadores existentes sean temporales. Puede, por ejemplo, elegir que los marcadores automáticos sean temporales automáticamente.

  • Usted puede rápidamente ciclo de entre un conjunto dado de marcadores. Por ejemplo, para alternar entre marcadores automáticos, use comandos bmkp-next-autonamed-bookmark-repeaty bmkp-previous-autonamed-bookmark-repeat(vincularlos a teclas).

  • Puede resaltar ubicaciones marcadas de diferentes maneras, por lo que es fácil detectarlas.

Dibujó
fuente
7

Con respecto a los amortiguadores indirectos mencionados en la respuesta aceptada ...

M-x clone-indirect-buffercreará un buffer indirecto para el buffer actual. El nombre del nuevo búfer tendrá '<2>' agregado (o un número mayor si ya tiene nombres de búfer duplicados). El nuevo búfer se abre en una nueva ventana. Puede volver a una sola ventana usando C-x 0o C-x 1.

Con M-x winner-modeusted puede cambiar fácilmente entre las dos ubicaciones. C-c <left>/ M-x winner-undoy C-c <right>/ M-x winner-redocambia entre configuraciones de ventana. En este caso, las configuraciones serán posiciones en los dos búferes que visualizan el único archivo.

Nota: las funciones winner-undoy winner-redofuncionan en una lista de configuraciones. Si se cambia la configuración, por ejemplo, el punto de movimiento, la configuración actual se convierte en el encabezado de la lista y winner-redono es válida, en este caso winner-undovolverá a la posición anterior.

Para la situación del OP esto lleva al siguiente proceso;

  1. Activa el modo ganador M-x winner-mode
  2. Visite el archivo (nombre de archivo: File1.txt, nombre del búfer: File1.txt)
  3. M-x clone-indirect-buffer (nuevo nombre de búfer indirecto: File1.txt <2>)
  4. Convertir la ventana actual en la única ventana C-x 1
  5. Encuentre la primera ubicación de edición, realice cambios.
  6. Cambie al archivo de visita del búfer original C-x b(el valor predeterminado será el búfer original a menos que se haya cambiado a otro búfer desde el paso 3). Esto crea una nueva configuración para que el ganador vuelva a cambiar.
  7. Encuentre una ubicación de edición alternativa, realice cambios.

Un cambio a la ubicación de edición anterior (configuración de la ventana) depende de si se realiza un cambio en la configuración de la ventana entre los cambios;

  • Si se realiza un cambio, cambie usando C-c <left>/ M-x winner-undo.
  • Si no se realiza ningún cambio, cambie usando C-c <left>/ M-x winner-undopara atrás y C-c <right>/ M-x winner-redopara adelante.

Un cambio es cualquier cosa que no sea otro winner-undoo winner-redo.

usuario2542
fuente
3

si usa evil-mode, la capa vim, entonces C-oy C-ifuncionará igual.

Ejecutan los comandos evil-jump-backward/ forward. C-osalta a la posición anterior en la lista de saltos, que se establece automáticamente (las marcas se establecen en los comandos de movimiento). C-iva en reversa. También podemos usar TABdespués de un en C-olugar de C-i. Por lo tanto, el uso de ambas funciones lo llevará de un lado a otro en su búfer actual.

Si desea que esta característica sea de buffers cruzados, consulte evil-jumpers: http://melpa.org/#/evil-jumper

«
Evil-jumper es un complemento para el modo malvado que reemplaza la implementación de la lista de salto de modo que se asemeja más al comportamiento de Vim. Específicamente, saltará a través de los límites del búfer y revivirá los búferes muertos si es necesario. La lista de salto también se puede guardar en un archivo y restaurar entre sesiones. »»

Nota: lo aprendí en este wiki

Ehvince
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
Dan
1
Oh, y con ese comentario automatizado, en realidad quiero decir que la respuesta parece ser un comentario sobre otra respuesta. Si pretendía que esto fuera una respuesta en sí misma, ¿podría ampliar un poco sobre qué C-oy qué C-ihacer?
Dan
Tienes razón ! hecho.
Ehvince
2

Si usa Icicles , puede navegar rápidamente entre los marcadores mark-ringde cada búfer o el global-mark-ring(que tiene un solo marcador en cada búfer).

Para ello, use comandos múltiples C-- C-SPC (para un búfer mark-ring) o C-- C-x C-SPC(para el global-mark-ring). Después de presionar la tecla una vez, usa las teclas de ciclismo Icicles habituales , etc., para moverse entre los marcadores del anillo.

(Las mismas teclas sin un prefijo arg establecen la marca ( set-mark-command) y hacen estallar la marca global ( pop-global-mark), respectivamente, tal como lo hacen en Emacs vanilla.)

El texto de la línea de cada marcador se utiliza como candidato de finalización. A medida que escribe, su entrada de minibúfer reduce los candidatos a los que coinciden (p. Ej., Subcadena o coincidencia de expresiones regulares). Puede alternar rápidamente entre marcadores coincidentes o visitar cualquiera de ellos directamente. Incluso puede cambiar el orden de clasificación ( C-,) para ciclismo.

Dibujó
fuente
2

Una posibilidad mínima pero a menudo útil, cuando solo quiere ver la otra función, es configurar

(setq scroll-preserve-screen-position t)

que lo lleva de vuelta a la posición exacta del cursor inicial al cambiar entre C-vy M-v.

Dieter.Wilhelm
fuente
1

evil-modeimplementa marcadores de estilo Vim . Puede establecer marcadores con ( m, es decir, evil-set-marker) y saltar a la marca con la marca de retroceso `( evil-goto-mark) o a la línea de la marca '( evil-goto-mark-line).

Por lo tanto, puede crear la marca "a" en la primera ubicación con ma, crear la marca "b" en la segunda ubicación con ma, y luego 'asaltar para marcar "a" y 'bsaltar para marcar "b".

Dan
fuente
1

use imenu y el siguiente código

(defvar rimenu-position-pair nil "positions before and after imenu jump")
(add-hook 'imenu-after-jump-hook
          (lambda ()
            (let ((start-point (marker-position (car mark-ring)))
                  (end-point (point)))
              (setq rimenu-position-pair (list start-point end-point)))))

(defun rimenu-jump ()
  "jump to the closest before/after position of latest imenu jump"
  (interactive)
  (when rimenu-position-pair
    (let ((p1 (car rimenu-position-pair))
          (p2 (cadr rimenu-position-pair)))

      ;; jump to the far way point of the rimenu-position-pair
      (if (< (abs (- (point) p1))
             (abs (- (point) p2)))
          (goto-char p2)
          (goto-char p1))
      )))
Chen Bin
fuente
1

Durante los últimos 20 años más o menos, he estado usando estas dos gemas:

(defun ska-point-to-register ()
  "Store cursorposition _fast_ in a register. Use ska-jump-to-register
to jump back to the stored position."
  (interactive)
  (point-to-register 8))

(defun ska-jump-to-register ()
  "Switches between current cursorposition and position
that was stored with ska-point-to-register."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp)))

Los ato a C-. y C-, respectivamente, y usarlos constantemente sin darse cuenta nunca más.

Sí, los registros y marcadores son mucho más flexibles y potentes, pero aún así, este es uno de esos pequeños y rápidos ayudantes que me imposibilitan cambiar a otros editores.

Stefan Kamphausen
fuente
1
Wow, has estado usando esto más tiempo del que he estado vivo.
Vedaad Shakib
Supongo que esto aún no sucederá en el mundo de Node o Visual Studio Code, pero quién sabe ... :-) Me alegra ver que gente joven e inteligente todavía está comprando Emacs. Ah, y aún no tengo 50 años ;-)
Stefan Kamphausen
Esto es bastante asombroso. He estado tratando de encontrar una manera de cambiar entre dos ubicaciones arbitrarias con el modo de marca transitoria habilitado, y esto resuelve muy bien el problema :) Gracias.
PlagueHammer
0

También puede aprovechar las macros, ya que pueden unirse rápidamente a teclas convenientes.

Por ejemplo, grabe un salto a la posición N usando <F3> M-g g N <F4>y asígnelo a la tecla F5 con C-x C-k b <F5>. Luego haga lo mismo con la posición M y F6. De ahora en adelante, simplemente puede alternar F5 y F6 para saltar entre N y M.

Aún más simple, ya que <F4>ejecuta la última macro grabada y <C-u> F4la penúltima, puede omitir el paso de vinculación de teclas y simplemente alternar posiciones usando <F4>y <C-u> F4.


Otra posibilidad bastante radical es crear un buffer indirecto en otra ventana con <C-x> 4 c. Este búfer tiene el mismo contenido pero puede tener una posición de punto diferente. Ahora simplemente alterne entre ventanas con <C-x> ola forma habitual.

memeplex
fuente