Come scrivere in verticale?


22

Diciamo che voglio produrre il seguente testo nel mio documento:

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

Esiste un modo semplice per scrivere "Some Msg" verticalmente come sopra senza dover inserire manualmente ogni carattere in ogni riga?


5
Potresti scrivere il tuo testo come di consueto, e poi fare :s/./% \0\r/per aggiungere il %e newline ... Non un'ottima soluzione, però ...
Martin Tournoij,

Bella soluzione, funziona un po '. Lo useremo per ora, grazie.
Allan Hasegawa,

Risposte:


16

Una soluzione davvero buona richiederebbe probabilmente un po 'più di lavoro, ma "non male" non è molto difficile da ottenere.

Idea

Tutto ciò di cui abbiamo bisogno è di spostare una riga in basso dopo ogni personaggio, quindi facciamolo tramite il InsertCharPrecomando automatico!

Codice

Mettilo in .vimrco meglio ancora in qualche file nella plugin/directory.

" 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

Immettere il :Vertcomando per iniziare a scrivere in verticale. Lasciare la modalità di inserimento disabilita automaticamente questa "modalità". Naturalmente, è possibile mapparlo su un collegamento se è necessario utilizzare questo comando spesso.

problemi conosciuti

  1. La scrittura verticale non sarà disabilitata se si lascia la modalità di inserimento via Ctrl-C(questo è il risultato di Ctrl-Cessere implementato in un modo leggermente strano rispetto InsertLeaveall'evento, che non viene attivato ; quindi l'uso del tasto richiede di essere attenti).

1
Una confutazione al problema n. 1 noto: non dovresti lasciare la modalità di inserimento con <C-C>.
tommcdo

@tommcdo, non lo so, ma se è lì, qualcuno lo usa. In realtà è utile per evitare l'espansione delle abbreviazioni, mi chiedo perché InsertLeavenon sia attivato per questa chiave.
xaizek

1
Suppongo che intendo promuovere una tendenza al rifiuto <C-C>come un buon modo per uscire dalla modalità Inserisci. Il modo in cui hai accennato potrebbe implicare che a volte è un buon metodo. È un po 'come dire "Avvertenza: il tuo documento non verrà salvato se chiudi Microsoft Word scollegando il computer".
tommcdo,

@tommcdo Non pensavo potesse sembrare così. Aggiunta una nota <C-C>sull'essere la ragione del problema. Non sono a conoscenza di un altro metodo per lasciare la modalità di inserimento che sopprime l'espansione delle abbreviazioni così come <C-C>, se non c'è, è utile almeno come parte di una mappatura come inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek,

Non avevo considerato le abbreviazioni, questo è un buon punto. Ho anche trovato alcuni punti nella guida che descrivono <C-C>come uscire dalla modalità Inserisci senza espandere le abbreviazioni e non si fa menzione di come non si attivano gli InsertLeaveeventi. Ora sono curioso di sapere se esiste un modo integrato per farlo, ma per ora la tua mappatura è un'ottima idea.
tommcdo,

4

Puoi digitare come al solito e quindi convertire il testo orizzontale corrente in verticale usando la sostituzione in Vim come segue (si applica alla riga corrente):

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

O molto più facile da ricordare è eseguire uno dei seguenti comandi (per tutte le righe):

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

Per applicare solo per la linea corrente o più linee, precedere con V, espandere l'area per più linee se necessario ed eseguire sopra (ma senza %).

Per PowerShell su Windows, controlla la sostituzione per piega .

Per definire la mappatura semplice dei tasti (ad es. F2), Prova quanto segue:

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

Quindi digita qualcosa e premi F2per rendere il testo verticale, semplice.


Un'altra alternativa è quella di impostare il ritorno a capo automatico, ad es

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

Ciò avvolgerà automaticamente il testo vicino a 1 carattere come consente lo spazio bianco. Lo svantaggio è che ogni lettera deve essere seguita dallo spazio (quindi è quasi uguale a come si premeEnter


1
Piuttosto che :s/\(.\)/\1\r/g, potresti semplicemente usare :s/./\0\r/gche è funzionalmente identico.
Wildcard il

1

Trovo che le macro siano un modo fantastico per fare cose insolite se sei interessato a farlo non più di una volta in una luna blu. Supponiamo che tu abbia la seguente tabella:

%
%            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

E diciamo che si desidera sostituire Some Msgcon Other Message. Prima di tutto, estendiamo la tabella per il carattere extra (riga prima dell'ultima 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 che mi verrà in mente si occuperà di convertire il testo da orizzontale a verticale mentre sostituisce il vecchio testo. Inizia digitando il testo nella prima posizione (il cursore si trova alla fine di 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

Registra la seguente macro:

  • qq: avvia la registrazione della macro denominata q
  • ^: vai all'inizio della riga
  • 3l: passa alla colonna in cui verrà inserito il testo
  • x: elimina il vecchio carattere
  • l: sposta a destra, lasciando un carattere dal messaggio al posto del vecchio personaggio:
  • v: vai in modalità visiva
  • f|: salta a |
  • 2h: torna indietro di due caratteri
  • d: taglia la selezione
  • j: abbassati
  • P: incolla prima del cursore
  • q: termina la registrazione della macro

A questo punto hai:

%
%            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

Ripeti il ​​numero di macro abbastanza volte (ad es. Il numero di caratteri, ma non è necessario conoscerlo in anticipo. Basta sottovalutare e continuare una volta che vedi quanto è vicina la stima). Quindi andiamo con 10@q. Ottieni:

%
%            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, un altro ( @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

Il cursore è ora sull'ultimo e. La macro non funziona bene con l'ultima lettera (puoi provare con @qe poi u(annullare) per risultati insoddisfacenti). Basta regolarlo da soli ( Xper il backspace).


Molto bella. Le macro sono la strada da percorrere in vim. Il mio rapido tentativo fu essenzialmente lo stesso del tuo; qq03lxldt|i ^[jPxq@q
Wildcard il

@Wildcard, posso non votare?
Shahbaz,

1
Ha! Mi è scappato di mente; Pensavo di averlo fatto. :)
Wildcard il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.