Comment écrire verticalement?

22

Disons que je veux produire le texte suivant dans mon document:

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

Existe-t-il un moyen simple d'écrire verticalement "certains messages" comme ci-dessus sans avoir à insérer manuellement chaque caractère dans chaque ligne?

Allan Hasegawa
la source
5
Vous pouvez écrire votre texte comme d'habitude, puis faire :s/./% \0\r/pour ajouter le %et les nouvelles lignes ... Pas une bonne solution, cependant ...
Martin Tournoij
Belle solution, ça marche un peu. Je vais l'utiliser pour l'instant, merci.
Allan Hasegawa

Réponses:

16

Une très bonne solution nécessiterait probablement un peu plus de travail, mais "pas mal" n'est pas très difficile à réaliser.

Idée

Tout ce dont nous avons besoin est de déplacer une ligne vers le bas après chaque caractère, alors faisons-le via InsertCharPrela commande automatique!

Code

Mettez-le .vimrcou mieux encore dans un fichier du plugin/répertoire.

" 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()

Usage

Entrez la :Vertcommande pour commencer à écrire verticalement. Quitter le mode insertion désactive automatiquement ce "mode". Bien sûr, vous pouvez le mapper à un raccourci si vous devez souvent utiliser cette commande.

Problèmes connus

  1. L'écriture verticale ne sera pas désactivée si vous quittez le mode d'insertion via Ctrl-C(ceci est le résultat d' Ctrl-Cune implémentation d'une manière légèrement étrange en ce qui concerne l' InsertLeaveévénement, qui n'est pas déclenché; donc l'utilisation de la touche nécessite d'être prudent).
xaizek
la source
1
Une réfutation du problème n ° 1 connu: vous ne devez pas quitter le mode Insertion avec <C-C>.
tommcdo
@tommcdo, je ne le fais pas, mais s'il est là, quelqu'un l'utilise. C'est en fait utile pour éviter l'expansion des abréviations, je me demande pourquoi InsertLeaven'est pas déclenché pour cette clé.
xaizek
1
Je suppose que je veux promouvoir une tendance de rejet <C-C>comme un bon moyen de quitter le mode Insertion. La façon dont vous l'avez mentionné pourrait impliquer que c'est parfois une bonne méthode. C'est un peu comme dire "Attention: votre document ne sera pas enregistré si vous fermez Microsoft Word en débranchant votre ordinateur."
tommcdo
@tommcdo Je ne pensais pas que cela pourrait sonner de cette façon. Ajout d'une note sur <C-C>l'origine du problème. Je ne suis pas au courant d'une autre méthode pour laisser le mode d'insertion supprimer l'expansion des abréviations comme le <C-C>fait, s'il n'y en a pas, c'est utile au moins dans le cadre d'un mappage comme inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek
Je n'avais pas considéré les abréviations, c'est un bon point. J'ai même trouvé des endroits dans l'aide qui décrivent le fait <C-C>de quitter le mode Insertion sans développer les abréviations, et il n'y a aucune mention de la façon dont cela ne déclenche pas d' InsertLeaveévénements. Je suis maintenant curieux de savoir s'il existe un moyen intégré de le faire, mais pour l'instant votre cartographie est une excellente idée.
tommcdo
4

Vous pouvez taper comme d'habitude, puis convertir le texte horizontal actuel en vertical en utilisant la substitution dans Vim comme suit (s'applique à la ligne actuelle):

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

Ou bien, la méthode la plus facile à retenir consiste à exécuter l'une des commandes suivantes (pour toutes les lignes):

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

Pour appliquer uniquement à la ligne actuelle ou à plusieurs lignes, faites précéder de V, développez la zone pour plus de lignes si nécessaire et exécutez ci-dessus (mais sans %).

Pour PowerShell sous Windows, vérifiez la substitution pour fold .

Pour définir un mappage de clé simple (par exemple F2), essayez ce qui suit:

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

Tapez ensuite quelque chose et appuyez sur F2pour rendre le texte vertical, aussi simple que cela.


Une autre alternative consiste à définir un habillage automatique des mots, par exemple

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

Cela encapsulera automatiquement le texte aussi près que 1 caractère que l'espace blanc le permet. L'inconvénient est que chaque lettre doit être suivie d'un espace (c'est donc presque la même chose que vous appuieriez surEnter

kenorb
la source
1
Plutôt que :s/\(.\)/\1\r/g, vous pouvez simplement utiliser :s/./\0\r/gce qui est fonctionnellement identique.
Wildcard
1

Je trouve que les macros sont un excellent moyen de faire des choses inhabituelles si vous êtes intéressé à le faire pas plus d'une fois dans une lune bleue. Disons que vous avez le tableau suivant:

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

Et disons que vous souhaitez remplacer Some Msgpar Other Message. Tout d'abord, étendons la table pour le caractère supplémentaire (ligne avant-dernière 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 je vais proposer va prendre soin de convertir le texte de l'horizontale en verticale tout en remplaçant l'ancien texte. Commencez par taper le texte au premier emplacement (le curseur est à la fin 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

Enregistrez la macro suivante:

  • qq: démarrer l'enregistrement de la macro nommée q
  • ^: aller au début de la ligne
  • 3l: passer à la colonne où le texte va être placé
  • x: supprimer l'ancien caractère
  • l: déplacez-vous vers la droite, en laissant un caractère du message à la place de l'ancien caractère:
  • v: passer en mode visuel
  • f|: sauter à |
  • 2h: reculer de deux caractères
  • d: sélection de coupe
  • j: descendre
  • P: coller avant le curseur
  • q: terminer l'enregistrement de la macro

À ce stade, vous avez:

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

Répétez la macro suffisamment de fois (c'est-à-dire le nombre de caractères, mais vous n'avez pas besoin de le savoir à l'avance. Il suffit de sous-estimer et de continuer une fois que vous voyez à quel point votre estimation était proche). Alors allons-y 10@q. Vous recevez:

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

Votre curseur est maintenant sur le dernier e. La macro ne fonctionne pas bien avec la dernière lettre (vous pouvez essayer avec @qpuis u(annuler) pour des résultats insatisfaisants). Réglez-le simplement vous-même ( Xpour le retour arrière).

Shahbaz
la source
Très agréable. Les macros sont la voie à suivre dans vim. Ma tentative rapide était essentiellement la même que la vôtre; qq03lxldt|i ^[jPxq@q
Wildcard
@Wildcard, je peux voter pour?
Shahbaz
1
Ha! J'ai glissé mon esprit; Je pensais l'avoir fait. :)
Wildcard