Edición de bloques * en vivo * en Emacs o Vim


9

jEdit admite la edición en bloque, pero Emacs y Vim parecen tener serios problemas de usabilidad sobre el mismo tema. Si alguien pudiera completar las incógnitas aquí, sería mucho más llevadero usar cualquiera de los editores:

  • Selección rectangular real : cuando la selección en pantalla es un rectángulo, no una selección lineal que luego se usa para calcular una región como parece limitada Emacs.
    • jEdit: Mantenga presionado Ctrly seleccione.
    • Vim: haga clic Ctrl-vy seleccione.
    • Emacs: Desconocido ; Parece que es necesario un complemento de más de 400 líneas .
  • Edición rectangular en vivo : vea cómo se verá el resultado en todas las líneas a medida que edita después de una selección de bloque.
    • jEdit: Simplemente comience a escribir, y verá el resultado final a medida que avanza.
    • Vim: haga clic Shift-iy escriba. Mostrará el resultado final solo en la primera línea hasta que presione Escpara salir del modo de inserción. Se desconoce si hay alguna forma de ver el resultado en todas las líneas de inmediato.
    • Emacs: Desconocido ; parece que la única forma es C-x r tconfigurar el texto para que se complete después de presionar Ret.
  • Iniciar y finalizar la selección en posiciones fuera del texto : por ejemplo, me gustaría eliminar los N primeros caracteres de cada línea, pero la primera y la última línea contienen menos de N caracteres.
  • Pegar bloque en línea : pegue el bloque copiado como si estuviera pegando varias líneas, como en, empuje el texto que ya está allí hacia abajo , no hacia la derecha.
    • jEdit: el valor predeterminado. Para pegar un bloque como bloque, primero debe hacer otra selección de bloque.
    • Vim: OEscVp.
    • Emacs: Desconocido .

La funcionalidad general de selección de bloques de Emacs se puede encontrar en el cua-modecomplemento .


Aparentemente, el modo de edición de columnas de Emacs puede hacer algún tipo de edición de rectángulo en vivo: youtube.com/watch?v=k-6BVjlBSVo
Tom

Solo una observación sobre el "plugin" de más de 400 líneas de emacs. Un complemento algo similar para gedit, llamado edición múltiple, tiene más de 1000 líneas de código python. Para mí, el pugin es muy útil (cómo sobreviví sin él), el tamaño es académico ... y si el emacs funciona como se anuncia, estaría más que feliz de usarlo, pero recibí un error de carga cuando lo ejecuté "command-line-normalize-file-name: Args fuera de rango:" ", 1" :( ... Es justo lo que estaba buscando también ...
Peter.O

44
Para aquellos que no han usado jEdit, explique su terminología. No entiendo qué significa "en vivo" aquí, qué es "edición rectangular en vivo" o qué significa "pegar bloque en línea".
Gilles 'SO- deja de ser malvado'

Respuestas:


7

Puedo responder por Vim, pero no por Emacs.

Iniciar y finalizar selección en posiciones fuera del texto:

:set virtualedit=blockhabilitará el comportamiento que deseas. Puede soltar los dos puntos iniciales y agregarlos a su .vimrc si lo desea. Para más información, :help 'virtualedit'desde Vim.

Pegar bloque en línea:

Si solo presionas pen el modo Comando, Vim insertará el bloque, empujando los caracteres a la derecha en cada línea. Si selecciona otro bloque y presiona p, Vim reemplazará ese bloque con el bloque pegado.

Puede pegar un bloque "en línea" con la secuencia de teclas en modo comando OEscVp. Esto inserta una línea sobre la línea actual ( O Esc), la selecciona en sentido de línea ( V) y luego la pega ( p). Podría acortar esto a (por ejemplo) ypcon un mapeo como :nmap yp O<Esc>Vp- escriba eso literalmente; use cinco pulsaciones de teclas en <Esc>lugar de presionar la tecla Escape.


Buen consejo sobre virtualedit; Tengo que probar eso. Sobre el pegado en línea, consulte la pregunta actualizada para obtener una descripción de la funcionalidad esperada.
l0b0

He actualizado mi respuesta con un método para pegar bloques en línea.
Jander

5

Por ejemplo, me gustaría eliminar los N primeros caracteres de cada línea, pero la primera y la última línea contienen menos de N caracteres.

Emacs: comience la selección en la primera línea y simplemente agregue el número faltante de caracteres (por ejemplo, espacios) a la última línea y luego use kill-rectangle

Alternativamente, vea artist-modeo picture-modeque le permiten moverse libremente en la ventana independientemente de las longitudes de línea.

Pegar bloque en línea

Emacs: Primero guarde el bloque con kill-rectangle o guardándolo en un registro, luego vaya al punto de inserción, use delete-rectangle y luego inserte el rectángulo guardado.

Parece que es necesario un complemento de más de 400 líneas

En el caso de Emacs, ¿por qué es un problema? Se puede compilar un complemento y la filosofía de emacs es que no se pone todo en el núcleo, sino que se usan complementos para ampliar el editor.


4

Hay 'cua-mode' que viene con Emacsen 22.1 y posterior, o siga el enlace para descargar versiones anteriores de Emacs. Hay un video corto que presenta la funcionalidad.

Para los comandos generales de rectángulo, intente leer el manual , que proporciona una introducción fácil.


emacs se cua-modeve bien! 1 .. No pude encontrar el video que usted ha mencionado, ver de Tom enlace en los comentarios inmediatamente debajo de la pregunta, para un enlace a un (diferente?) Sobre el vídeo ...
Peter.O

@Ooops ofrecidos, error de cortar / pegar, corregido.
Trey Jackson

0

En vim, la forma típica de eliminar los primeros n caracteres es hacer algo como :%s/.\{0,6\}//.

%hará todo el documento; puede reemplazar eso con una selección o con las líneas reales que le interesan. El scomando es para "sustituto". Reemplazará una expresión regular con lo que le dé, y solo coincidirá una vez en cada línea a menos que agregue una opción específica. El /es un delimitador: puede ser cualquier carácter, pero /generalmente se usa a menos que sea ventajoso usar otra cosa (para que no tenga que escapar /en el resto del comando). El argumento después del primer delimitador es una expresión regular que se utilizará para encontrar cadenas coincidentes en su selección. El argumento después del segundo delimitador es con qué se reemplazará la coincidencia.

Entonces, este comando dice encontrar 0 a 6 instancias de cualquier carácter y reemplazarlas con nada.


No es lo que pedí.
l0b0

¿Pero crees que no es útil para otros que encuentran esta pregunta? Creo que sí, y por eso lo puse aquí.
Shawn J. Goff
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.