emacs: ¿Cómo usar el anillo de marcas?

Cuando hago un C-u C-SPC, emacs me lleva a "donde estaba antes". Subsecuente C-u C-SPC las prensas vuelven a los lugares anteriores. Eso es muy bueno, y lo uso mucho.

Pero algo siempre me molestó: la única marca que falta en el anillo de marcas es donde-invoqué-esto-en-el-primer-lugar! Es como dejar migas de pan detrás de ti, y luego decir "¡Vaya! puede estar perdido, voy a volver y comprobar", luego volver ¡sin dejar una miga de pan donde estás ahora mismo!

Intenté aconsejar a la función, pero por mi vida no puedo simular programáticamente un C-SPC C-SPC.

  • ¿Cómo puedo "ver" (eco, mensaje, seguimiento, etc.) lo que hace una combinación de teclas, como "Ch k" pero para secuencias de teclas repetidas, como C-SPC C-SPC ? Esto es lo que dice el manual de este último (énfasis mío)

C-SPC ejecuta el comando set-mark-command, que es una función Lisp compilada interactiva en `simple.el'.

Está vinculado a C-@, C-SPC.

(establecer-marcar-comando ARG)

Establezca la marca donde está el punto o salte a la marca. Establecer la marca también altera la región, que es el texto entre el punto y la marca; este es el equivalente más cercano en Emacs a lo que algunos editores llaman la "selección".

Sin argumento de prefijo, establezca la marca en el puntoy empuje la posición de la marca antigua en el anillo de marca local. También inserte la marca anterior en el anillo de marca global, si la marca anterior se estableció en otro búfer.

Pero cuando trato de usarlo (de forma no interactiva) "Sin argumento de prefijo" para "establecer la marca en el punto", aparece un error del depurador "número incorrecto de argumentos"...? (Me doy cuenta de la diferencia entre un argumento y un argumento de prefijo).

Estaría bien incluso con una respuesta filosófica y no práctica. Solo quiero entender cuál es la idea aquí.

preguntado el 27 de julio de 12 a las 14:07

Algunas personas pueden sentirse ofendidas por el uso de la palabra 'buggered' donde los usuarios cuidadosos del inglés habrían escrito 'bugged'. A mí me divirtió mucho pensar en las prácticas humanas del anillo de marca. -

Ooh... Punto tomado. Nunca me di cuenta de la diferencia, gracias! Dios, ahora pienso en todo el tiempo que usé esto en correos electrónicos corporativos pensando que era una expresión linda y refrescante... Brrr -

4 Respuestas

(push-mark) parece estar haciendo lo que quiere.

Respondido 27 Jul 12, 14:07

pareces tener razon..! Entonces, si pudiera "Ch k RET C-SPC C-SPC", ¿es eso lo que diría emacs? ¿Como puedo estar seguro? ¿Cómo es que emacs no hace eco de la combinación de teclas como lo hace para decir "guardar algunos búferes" (si ingresa eso manualmente, obtiene un agradable "Puede ejecutar el comando 'guardar algunos búferes' con Cx s") ? Y finalmente, la esencia de mi pregunta: ¿Cómo puedo emitir una sola "marca de presión" (si esto es realmente lo que hace C-SPC C-SPC) antes de lo que sea que haga Cu C-SPC? - yPhil

@PhilippeCM IIRC, C-SPC C-SPC literalmente solo llama a la función dos veces en rápida sucesión, los resultados de eso son efectos secundarios. Es decir, estoy bastante seguro de que podrías golpear C-SPC, espera un poco y vuelve a hacerlo con el mismo efecto. - jdd

Lo que hice fue abrir la ayuda de la función. set-mark-command. Luego busqué en la definición de la función para ver qué parte de la función estaba jugando con la marca. Como dijo @jeremiahd, C-SPC C-SPC no es una combinación de teclas. Está llamando dos veces con la misma combinación de teclas. Si miras la definición de la función verás que pasa. La primera vez que lo llama, establece la marca en el punto. La segunda vez ve que marca y punto coinciden y por lo tanto lo desactiva. - Nicolás Dudebout

Bien, esto es lo que hice

(defun px-push-mark-once-and-back ()
    "Mark current point (`push-mark') and `set-mark-command' (C-u C-SPC) away."
    (interactive)
    (let ((current-prefix-arg '(4))) ; C-u
        (if (not (eq last-command 'px-push-mark-once-and-back))
                (progn
                    (push-mark)
                    (call-interactively 'set-mark-command))
            (call-interactively 'set-mark-command))))

(global-set-key (kbd "<s-left>") 'px-push-mark-once-and-back)

Respondido 27 Jul 12, 18:07

Ahora bien, si tan solo pudiera hacerlo para avanzar en el anillo de marca... stackoverflow.com/questions/3393834/… no ofrece ninguna solución de trabajo, por cierto - yPhil

El enlace citado ofrece una solución funcional si lo lee detenidamente. - evento_jr

even_jr, esta "solución" no aborda el problema a la mano: evalúe los dos consejos en el enlace, luego visite un búfer, luego mueva el punto a una ubicación de referencia en el archivo usando solo las teclas de flecha. A continuación, utilice los consejos para recorrer el anillo de marcas. Vas a nunca volver a la primera ubicación. Mi punto. - yPhil

Ok, agregué dos respuestas relevantes de esto pregunta en un paquete pequeño aquí.

Te permite usar C-- C-SPC para avanzar en la marca-anillo.

Respondido 29 Jul 12, 18:07

El problema no es la dirección del movimiento; ver mi comentario de arriba. - yPhil

Probablemente no deberías usar set-mark or set-mark-command de forma no interactiva. Dentro de elisp, simplemente guarde el punto (o cualquier ubicación) en una variable con un buen nombre.

También, trabaja para C-h i m emacs m mark.

No soy un gurú de Emacs, apenas lo uso. Sin embargo, sé que he visto el comportamiento que desea antes.

Respondido 27 Jul 12, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.