2012-07-27 28 views
12

Quiero realizar la misma acción que uno haciendo clic en C-Space + moviendo las teclas de flecha, pero en elisp.Programáticamente seleccionando una región

Error al encontrar la función correcta (si simplemente se agruparon lógicamente en espacios de nombres o de alguna manera etiquetados ...). ¿Cuál es?

Respuesta

15

Puede traducir combinaciones de teclas para usar elisp C-h k clave.

Observará que la función elisp para establecer la marca set-mark-command, toma un argumento no opcional. Emacs usa la función especial interactive para permitir que las funciones elisp se escriban naturalmente con argumentos. Esto les permite ser genéricos y fáciles de reutilizar en otros programas elisp, mientras que aún es posible invocar directamente desde una tecla. También tiene algunas de las C-u lógica de prefijo incorporada.

En el caso de set-mark-command, su primera función es (interactive "P"), lo que significa que el prefijo se pasa como un argumento cuando se llama desde el teclado. Se puede simular esto directamente en elisp con:

(set-mark-command nil) 

Por ejemplo, para seleccionar la línea actual en elisp:

(defun my-select-current-line() 
    (interactive) 
    (move-beginning-of-line nil) 
    (set-mark-command nil) 
    (move-end-of-line nil) 
    (setq deactivate-mark nil)) 

Nota usted tiene que decirle a Emacs que dejar la marca activa al final o de lo contrario la región no permanecerá resaltada (aunque el punto y la marca estarán donde los dejó).

+0

Si configuro el punto al final de una línea y luego ejecuto '(set-mark-command 0)', el punto se mueve pero no la marca, por lo tanto, no se selecciona nada. ¿Qué me estoy perdiendo? Gracias. – vemv

+0

Establezca la marca al comienzo de la región, luego mueva el punto hasta el final. Además, el arg en realidad debería ser 'nil' en lugar de cero. He actualizado mi respuesta con un ejemplo. – ataylor

+0

La funcionalidad funciona (¡gracias!) No recibo comentarios visuales, es decir, 'deactivate-mark' no parece marcar la diferencia. No es importante para mi propósito particular de todos modos. – vemv

1

La región es la parte del almacenamiento intermedio entre point y mark.

+0

Supongo que tengo que usar 'set-mark' a continuación. Pero, ¿cuál es el tipo esperado de su argumento POS? – vemv

4

Debe usar push-marca en Emacs Lisp código, de la siguiente manera:

(defun mark-n (n) 
    "Programmtically mark the next N lines" 
    (interactive "nNum lines to mark: ") 
    (push-mark) 
    (next-line n)) 
3

Sólo en caso de que esta información adicional es de utilidad para alguien más, he encontrado lo siguiente:

  • En cuanto a movimiento de programa, vea Moving Point
  • (point) y (mark) recupere sus posiciones respectivas, entonces uno puede hacer (set-mark (+ 5 (mark))), por ejemplo.
Cuestiones relacionadas