¿Cómo escribir verticalmente?

22

Digamos que quiero producir el siguiente texto en mi documento:

%
%            Not Important
%    O ------------------------->
%    |
%  S |
%  o |
%  m |
%  e |
%    |
%  M |
%  s |
%  g |
%    |
%    V

¿Hay alguna forma fácil de escribir el "Some Msg" verticalmente como se indica arriba sin tener que insertar manualmente cada carácter en cada línea?

Allan Hasegawa
fuente
55
Podrías escribir tu texto normalmente, y luego :s/./% \0\r/agregar las %nuevas líneas ... Sin embargo, no es una gran solución ...
Martin Tournoij
Buena solución, funciona un poco. Lo usaré por ahora, gracias.
Allan Hasegawa

Respuestas:

16

Una solución realmente buena probablemente requeriría más trabajo, pero "no está mal" no es muy difícil de lograr.

Idea

Todo lo que necesitamos es mover una línea hacia abajo después de cada personaje, ¡así que hagamos eso mediante InsertCharPreel comando automático!

Código

Póngalo .vimrco mejor aún en algún archivo del plugin/directorio.

" enters insert mode to write vertically
function! VertStart()
    augroup Vert
        autocmd!
        " handles each entered character and moves cursor down
        autocmd InsertCharPre * call feedkeys("\<left>\<down>", 'n')
        autocmd InsertLeave * call VertEnd()
    augroup END

    inoremap <BS> <Up><Del>
    startinsert
endfunction

" cleans up on leaving insert mode
function! VertEnd()
    iunmap <BS>
    augroup Vert
        autocmd!
    augroup END
endfunction

" command to start writing vertically
command! Vert call VertStart()

Uso

Ingrese el :Vertcomando para comenzar a escribir verticalmente. Al salir del modo de inserción, se desactiva automáticamente este "modo". Por supuesto, puede asignarlo a un acceso directo si necesita usar este comando con frecuencia.

Problemas conocidos

  1. La escritura vertical no se deshabilitará si sale del modo de inserción a través de Ctrl-C(esto es el resultado de Ctrl-Cimplementarse de una manera ligeramente extraña con respecto al InsertLeaveevento, que no se dispara; por lo tanto, usar la tecla requiere tener cuidado).
xaizek
fuente
1
Una refutación al problema conocido n. ° 1: no debe salir del modo Insertar con <C-C>.
tommcdo
@tommcdo, no, pero si está allí, alguien lo usa. En realidad, es útil para evitar la expansión de abreviaturas, me pregunto por qué InsertLeaveno se activa esta tecla.
xaizek
1
Supongo que me refiero a promover una tendencia de rechazo <C-C>como una buena manera de salir del modo Insertar. La forma en que lo mencionaste podría implicar que a veces es un buen método. Es como decir "Advertencia: su documento no se guardará si cierra Microsoft Word desconectando su computadora".
tommcdo
@tommcdo No pensé que pudiera sonar de esta manera. Se agregó una nota sobre <C-C>el motivo del problema. No conozco otro método para dejar el modo de inserción que suprima la expansión de abreviaturas como lo <C-C>hace, si no existe, es útil al menos como parte de un mapeo como inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek
No había considerado las abreviaturas, ese es un buen punto. Incluso encontré algunos lugares en la ayuda que describen <C-C>como salir del modo Insertar sin ampliar las abreviaturas, y no se menciona cómo no desencadena InsertLeaveeventos. Ahora tengo curiosidad por saber si hay una forma integrada de hacerlo, pero por ahora su mapeo es una gran idea.
Tommcdo
4

Puede escribir como de costumbre y luego convertir el texto horizontal actual en vertical utilizando la sustitución en Vim de la siguiente manera (se aplica a la línea actual):

:s/\(.\)/\1\r/g

O un método mucho más fácil de recordar es ejecutar uno de los siguientes comandos (para todas las líneas):

:%!fold -w1
:%!grep -o .

Para solicitar solo la línea actual o más líneas, preceda con V, expanda el área para más líneas si es necesario, y ejecute arriba (pero sin %).

Para PowerShell en Windows, verifique la sustitución de pliegue .

Para definir la asignación de teclas simple (por ejemplo F2), intente lo siguiente:

:nnoremap <F2> V:!fold -w1<CR>

Luego escriba algo y presione F2para que el texto sea vertical, así de simple.


Otra alternativa es configurar el ajuste automático de palabras, p. Ej.

:set tw=1 " textwidth
:set formatoptions+=t

Eso ajustará automáticamente el texto tan cerca de 1 carácter como lo permita el espacio en blanco. La desventaja es que cada letra debe ir seguida de espacio (por lo que es casi lo mismo que presionaría)Enter

kenorb
fuente
1
En lugar de :s/\(.\)/\1\r/geso, podría usar el :s/./\0\r/gque es funcionalmente idéntico.
Comodín el
1

Me parece que las macros son una forma increíble de hacer cosas inusuales si estás interesado en hacerlo no más de una vez en una luna azul. Digamos que tienes la siguiente tabla:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    V

Y digamos que desea reemplazar Some Msgcon Other Message. En primer lugar, ampliemos la tabla para el carácter adicional (línea antes de la última yy5p:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

La macro que se me ocurrirá se encargará de convertir el texto de horizontal a vertical mientras reemplaza el texto anterior. Comience escribiendo el texto en la primera ubicación (el cursor está al final de Other Message):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  SOther Message |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Grabe la siguiente macro:

  • qq: comienza a grabar la macro llamada q
  • ^: ir al comienzo de la línea
  • 3l: ir a la columna donde se colocará el texto
  • x: borra el antiguo personaje
  • l: moverse hacia la derecha, dejando un carácter del mensaje en lugar del antiguo carácter:
  • v: ir al modo visual
  • f|: Salta a |
  • 2h: retroceder dos personajes
  • d: selección de corte
  • j: mover hacia abajo
  • P: pegar antes del cursor
  • q: terminar de grabar la macro

En este punto tienes:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  other Message | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Repita la macro la cantidad suficiente de veces (es decir, la cantidad de caracteres, pero no necesita saberlo de antemano. Simplemente subestime y continúe una vez que vea cuán cerca estaba su estimación). Así que vamos a ir con 10@q. Usted obtiene:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%   ge |
%    |
%    |
%    V

Ok, uno más ( @q):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%  g |
%   e |
%    |
%    V

Tu cursor está ahora en el último e. La macro no funciona bien con la última letra (puede intentar con @qy luego u(deshacer) para obtener resultados insatisfactorios). Simplemente ajústelo usted mismo ( Xpara retroceder).

Shahbaz
fuente
Muy agradable. Las macros son el camino a seguir en vim. Mi intento rápido fue esencialmente el mismo que el tuyo; qq03lxldt|i ^[jPxq@q
Comodín el
@Wildcard, ¿puedo hacer un voto positivo?
Shahbaz
1
¡Decir ah! Se me pasó por la cabeza; Pensé que tenía. :)
Comodín del