¿Cómo hacer seleccionar la columna y luego editar en GNU Emacs?

15

He estado usando ViM, TextMate y GNU Emacs por años.

Por ejemplo, aquí está el texto que quiero editar

foo
foo
foo

Y aquí está el resultado del texto que quiero tener

bar foo
bar foo
bar foo

Cuando estoy en Vim, puedo hacer "Ctrl v" en la primera línea y la primera columna, luego presionar "2 j", luego presionar "i", luego escribir "bar", listo.

Cuando estoy en Textmate, puedo presionar "Opción de comando de Apple" mientras selecciono hacia abajo (con el mouse), luego escribir "bar", listo.

Pero cuando estoy en GNU Emacs 23.1, no sé cómo hacerlo. : ((

Busqué en EmacsWiki y busqué en Google pero no obtuve la solución. Guíame si conoces mi solución. Estaría agradecido por eso.

Arie
fuente
@Trey Jackson y @humble coffee, resueltos, ¡muchas gracias!
Arie el

Respuestas:

16

Se me ocurren dos opciones. El primero son los rectángulos (como se menciona en otra respuesta). Las instrucciones explícitas para eso son:

  1. ir a la primera línea, primera columna
  2. C-SPC
  3. Ir a la última línea (primera columna)
  4. C-x r t bar SPC RET

Otra opción, que proporciona muy buenos comandos de edición de rectángulos / columnas es el modo CUA . Aquí hay una publicación de blog (divulgación: mi blog) que describe cómo usarla. Para ver el poder del modo CUA, vale la pena ver este video de tres minutos .

Integro el modo CUA con lo siguiente (porque prefiero no tener el modo de marca transitoria):

(setq cua-enable-cua-keys nil)
(setq cua-highlight-region-shift-only t) ;; no transient mark mode
(setq cua-toggle-set-mark nil) ;; original set-mark behavior, i.e. no transient-mark-mode
(cua-mode)
Trey Jackson
fuente
11

En Emacs-24.4, el soporte base para rectángulos se ha mejorado un poco, por lo que en lugar de usar C-SPCseguido de C-x r t, puede hacer lo siguiente:

C-x SPC
down down
C-t bar RET

Una de las ventajas de este C-SPCmétodo en comparación con el método es que obtendrá información visual sobre el rectángulo que está seleccionando. Por supuesto, el cua-modemétodo también funciona (y funciona de manera similar).

Stefan
fuente
Lamentablemente, me parece que las mejoras no son suficientes: cua-modetenía más razón ... Solo por mencionar una cosa: en cua-mode, mientras un rectángulo está resaltado, puedo escribir y agregar texto. En el actual "soporte base" de emacs incorporado, el resaltado desaparece (la selección está "cancelada") y la entrada se inserta en el punto del cursor. Esto es contrario a la intuición y no es lo que generalmente quiero (y me acostumbro a cómo cua-modehacerlo)
ShinTakezou
@ShinTakezou: si bien el contador de modo de marca de rectángulo es intuitivo, el contador de comportamiento de cua es intuitivo. Afortunadamente, puedes elegir. Si prefiere el soporte de cua, puede habilitar cua-mode o (si solo desea su soporte de rectángulo) (global-set-key [?\C-x ?\s] 'cua-rectangle-mark-mode).
Stefan
de hecho es lo que hago: apegarme a cua-mode. Funciona como: resaltar una columna, escribir texto, listo. De lo contrario: resalte una columna, diga que desea agregar texto, escriba texto en minibúfer (no lo verá aparecer en el búfer mientras escribe ...), ... listo. Verá más tarde un error tipográfico en el último carácter ... en cua-mode, puedo verlo mientras escribo, eliminarlo (no deshacer todo el inserto), repensar, insertar otro carácter ... y el rectángulo se mantiene resaltado como necesito, por cierto, y puedo reducirlo, agrandarlo, escribir un poco más de texto o "cortar" ese nuevo rectángulo ... así que, para mí, es más intuitivo y cómodo.
ShinTakezou
Me alegro de que te guste ;-)
Stefan
Por cierto, en Emacs-25, la C-toperación de reordenamiento no CUA (también conocido como C-x r t) también le muestra una vista previa del texto recién insertado a medida que lo escribe.
Stefan
2

En emacs este tipo de columnas se denominan 'rectángulos'. Así que esta es la página de documentación pertinente.

Todos estos comandos requieren que la región contenga el rectángulo en el que está operando. Por lo tanto, debe establecer la marca en el carácter superior izquierdo del rectángulo y extender la región hasta el carácter inferior derecho del rectángulo. El comando que está buscando es el M-x string-insert-rectangleque le solicita que inserte la cadena.

nedned
fuente
1

Respuesta más corta: Habilite el modo rectángulo CUA a través de C-RET.

Entonces, para su caso, sería

  1. Vaya a la primera línea, primera columna y presione C-RETpara ingresar al modo CUA
  2. Vaya a la última línea, primera columna y simplemente escriba barSPC
  3. Salga del modo CUA mediante ESCo CG

Vea la respuesta de @Trey para una solución más elaborada y enlaces a CUA.

Martín
fuente
2
Sí, tengo muy poca reputación para comentar. No quiero repetir su respuesta, pero agregaré más información del documento de CUA.
Martin
0

Puede usar replace-regexp para esto:

  1. establezca la marca en la última línea -> C SPC y vaya a la última línea
  2. escriba Mx replace-regexp RET en minibúfer (tengo un enlace de teclas para este Mr)
  3. Dar ^ RET
  4. escriba bar y presione RET

Esto agregará una barra al comienzo de la línea.

Neelesh
fuente