Visual Studio tiene esta característica agradable donde puedes poner el punto en algo, presionar C-f3
y ambos encontrarán la próxima instancia de la cosa debajo del punto y lo recordarán. Luego puede presionar f3
para encontrar la siguiente instancia y S-f3
buscar esa misma cosa, pero al revés.
Puedo hacer lo mismo en Emacs usando algo de elisp que escribí. (Es voluminoso y estoy seguro de que es malo, así que lo omitiré).
Lo que me gustaría hacer es permitir una funcionalidad similar para, por ejemplo, f2
, f3
, f4
, y f5
. Por lo tanto, presionar C-f2
busca la cosa debajo del punto al guardar esa cosa en una variable / matriz de asociación / símbolo en algún lugar, presionar C-f3
una cosa diferente hace que emacs guarde esa segunda cosa para guardarla en una variable distinta, y así puedo buscar para lo primero presionando f2
en el futuro, y puedo buscar la segunda presionando f3
en el futuro.
Me encantaría crear una sola función para Control-X, otra para X simple y una tercera para Shift-X, pero no estoy seguro de cómo abordar esto.
¿Es mejor tener que hacer que la función solicite la tecla actual presionada (a la this-single-command-keys
), o encontrar una manera de pasar un parámetro a la función interactiva ( sin preguntar al usuario, ya que ya presionó una tecla)?
¿Cómo se pasa información adicional a una función interactiva?
fuente
C-u
; o, al pedirle al usuario que ingrese una selección del minibúfer, o pedirle al usuario que elija una clave en particular; por ejemplo, presione 1 para foo, presione 2 para bar, presione 3 para baz. [Alrededor del 90% de toda la pregunta es interesante , pero no relevante para la última pregunta / respuesta (en mi opinión). La segunda a la última pregunta busca una opinión .]Respuestas:
Puede vincular un comando a varias secuencias de teclas y acceder a la secuencia de teclas de llamada dentro del comando con
this-command-keys
. Eso se demuestra con el siguiente código. Existe el mismo comandomy-command
está ligado indirectamente a las secuencias de teclasF9
,C-c a
, yC-c b
. De este modo, "indirectamente" significa que hay una envoltura delgadamy-command-wrapper
. Ese contenedor se usa como comando interactivo y se mantiene muy simple. No debe ser instrumentadoedebug-defun
porque el valor de retorno dethis-command-keys
en la sesión de depuración no tiene sentido.El código de ejemplo muestra cómo puede mantener historias separadas para las secuencias de teclas de llamada separadas.
Si llama a las secuencias de teclas la primera vez, o con el prefijo arg, o con shift-modifier, puede cambiar el valor del argumento para que, de lo
my-command
contrario, se use el último valor del argumento del historial.fuente
Miremos esto lógicamente: desea tener comandos casi idénticos vinculados a
C-f2
yC-f3
. La única diferencia entre estos comandos es si almacenan la cosa en cuestión en laf2
memoria o en laf3
memoria. Entonces, o necesita construir diferentes comandos, o necesita tener un solo comando cuyo comportamiento depende de la clave a la que está vinculado.Puede vincular una clave a un comando que se construye en el momento en que crea el enlace. El argumento de comando para
define-key
y amigos no tiene que ser un nombre de comando en forma de símbolo, puede ser una expresión lambda.Esto funciona, pero no es muy agradable. Por ejemplo, los comandos de ayuda y los historiales de comandos no le mostrarán un nombre de comando.
Puede colocar la mayor parte del código en una función y definir pequeñas funciones de contenedor. Para evitar repetir mucho código, haga que una función o macro genere las funciones del contenedor.
Alternativamente, puede definir un solo comando para cada funcionalidad (primera búsqueda, repetir hacia adelante, repetir hacia atrás). Esto es un poco menos flexible (por ejemplo, no puede volver a vincular `search-thing-at-point-f2 a H-ssi lo desea), pero es mucho menos detallado.
Un comando puede encontrar qué tecla lo invocó. La forma más fácil para usted es usar la variable
last-command-event
.No creo que su interfaz propuesta sea una adición particularmente útil a Emacs. La búsqueda incorporada básica de Emacs tiene formas fáciles de buscar la cosa en el punto y repetir búsquedas pasadas.
C-s
para comenzar una búsqueda interactiva .C-w
para la palabra,C-e
para el resto de la línea,C-y
para el último texto copiado, etc.C-s
nuevamente.M-p
yM-n
.fuente
Al abordar su caso de uso original en lugar de la pregunta de programación de Elisp, el paquete
highlight-symbol
hace lo que desea. He sido un usuario feliz por muchos años.http://nschum.de/src/emacs/highlight-symbol/
De la descripción del paquete:
fuente