¿Cómo seleccionar o resaltar un bloque en Emacs?

84

Quiero seleccionar o resaltar un bloque en emacs sin usar el mouse pero hacerlo desde el teclado como el modo visual de vim. ¿Cuál es la forma más sencilla de hacer esto desde un teclado?

falla del sistema
fuente
2
CMhmark-defun
barra inclinada final

Respuestas:

66

Eche un vistazo a region-rectangle en emacs.

En resumen, comienza la selección como de costumbre con Control- Space, luego mata la región con Control- x r ky pega (o tira ) el bloque eliminado con Control- x r y.

Marko
fuente
11
Eso no mata regiones, mata rectángulos, que es muy diferente de lo que hace el modo visual de vim, en mi experiencia.
Allen
2
¿Cómo es diferente?
Ken Williams
73

Si entiendo la pregunta correctamente, originalmente no se trata de regiones rectangulares.

C-Spc pone una marca en la posición actual.

Donde sea que esté el cursor después, el texto entre la última marca y la posición actual está "seleccionado" (puede resaltar esto activando transient-mark-mode, pero esto también significará que las marcas deben eliminarse cuando no desee resaltar).

Puede operar en esa región con comandos como:

C-w. . Mata a la región. Esto elimina y pone la región en el círculo de la muerte.
C-y. . Tirón. Esto inserta el último fragmento del anillo de muerte.
M-y. . Anillo de muerte de ciclo. Inmediatamente después C-y, esto reemplaza la parte arrancada por los otros fragmentos en el anillo de muerte.
M-w. . Guarde la región en el anillo de muerte. Me gusta C-w, pero no elimina.

Este es solo el uso básico. Las marcas también tienen otros usos. Recomiendo el tutorial ( C-h t).

Svante
fuente
6
Vale la pena señalar que C-s C-rse utilizan comúnmente en este contexto para ir a buscar el final / inicio de la región. (Especialmente útil en una macro.)
ocodo
Bueno, son muy buenos comandos, pero ... ¿Cómo seleccionar la región marcada? Después de todo, todavía lo necesito, es decir, para sangrar el código entre marcas.
Hi-Angel
La región entre la última marca y el punto actual (que es donde está el cursor) es la región seleccionada. Solo corre M-x indent-region.
Svante
@Svante No, no está seleccionado. Aunque el indent-regionfunciona bien, pero el c-indent-line-or-region(el que está vinculado a la tecla de tabulación ) no lo es. La última función no funciona en las regiones marcadas , sino en las seleccionadas , es decir, la región que está resaltada como si la hubiera seleccionado con el mouse.
Hi-Angel
2
@YagamyLight Ah, puedes hacer eso golpeando C-Spcdos veces donde pusiste la marca. Eso activa el modo transient-mark-mode temporalmente (hasta que cancele (con C-g)). Luego mueva el punto para ver aparecer la región seleccionada.
Svante
32

Emacs 24.4 ahora tiene modo de marca de rectángulo. Espacio Cx para invocarlo.

Christopher M. Hobbs
fuente
1
¿Cómo mueves el bloque rectangular?
Stryker
10

Aunque C-SPCes una forma común de comenzar a marcar algo desde donde sea que esté su punto, a menudo hay formas más rápidas / fáciles que no implican moverse explícitamente a los puntos de inicio / finalización ...

Atajos de selección incorporados

  • M-h- un medio importante para marcar un párrafo . Un "párrafo" a menudo significa un bloque de código.

  • C-M-hy C-M-@- para marcar sexps y defuns , respectivamente. Esto funciona para varios idiomas, no solo ceceo.

  • Mantenga presionada la tecla Mayús , otra forma elegante de resaltar durante el movimiento. Por ejemplo, M-S-fselecciona reenviar una palabra completa. Esto es shift-select-mode, y está habilitado por defecto en Emacs 24+. En algunos teclados (que no son chiclet), debería poder mantener presionado C-S-con un solo meñique.

Puede presionar cualquiera de estos repetidamente para aumentar la selección.

(NOTA: utilícelo con C-gfrecuencia para cancelar el marcado mientras experimenta).

Complementos

Hay algunos paquetes de complementos que mejoran la selección de regiones y cosas. Todos se combinan muy bien y se adaptan a diferentes casos de uso. ¡Úsalos todos!

  • Expandir región : Expandir región aumenta la región seleccionada en unidades semánticas. Simplemente siga presionando la tecla hasta que seleccione lo que desea. C-=es un enlace recomendado para ello. Golpéelo varias veces para obtener lo que necesita.

  • Easy-Kill : useM-wy un mnemotécnico para seleccionar diferentes tipos de cosas, como palabras, sexps, listas, etc.

  • Zop-to-Char : como zap-to-char , pero proporciona una buena selección y otras acciones basadas en menús.

  • diff-hl : resalta las regiones modificadas no confirmadas. Utilicediff-hl-mark-hunkpara seleccionar / marcar un trozo.

Micah Elliott
fuente
7

Utilice Control- Spacepara establecer una marca y mover el cursor.

El transient-mark-moderesaltará las selecciones para usted. M- x transient-mark-mode.

Puede configurar Emacs para habilitar este modo por defecto usando una personalización. M- x customize-option RET transient-mark-mode.

remvee
fuente
1

... y en caso de que esté utilizando Ubuntu y C-spcno funcione para usted: debe borrar la combinación de teclas del "siguiente método de entrada" de IBus, como en

ejecute ibus-setupy cambie el enlace de teclas para el "siguiente método de entrada" a otra cosa (o elimínelo por completo haciendo clic en el botón "..." y luego en el botón "Eliminar").

Cita extraída de la respuesta a una pregunta SO.

serv-inc
fuente
0

Para expandir la respuesta de Edin Salkovic, si usa el modo CUA, puede usar para comenzar una selección de bloque visual. Hay muchos atajos para controlar la selección de bloques descritos en la documentación de CUA .

Jérôme Pouiller
fuente
-1

Con Emacs 25, simplemente presione C- Spacey luego mueva el cursor donde desee resaltar / seleccionar la región de texto que le interese. Después de eso, es posible que necesite estos comandos:

  • C- wpara cortar.
  • M- wpara copiar.
  • C- ypara pegar.
Billal Begueradj
fuente