Wie schreibe ich vertikal?

22

Nehmen wir an, ich möchte den folgenden Text in meinem Dokument erstellen:

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

Gibt es eine einfache Möglichkeit, das "Some Msg" vertikal wie oben zu schreiben, ohne jedes Zeichen manuell in jede Zeile einfügen zu müssen?

Allan Hasegawa
quelle
5
Sie könnten Ihren Text wie gewohnt schreiben und dann :s/./% \0\r/die %Zeilen und Zeilenumbrüche hinzufügen ... Keine großartige Lösung ...
Martin Tournoij
Schöne Lösung, es funktioniert irgendwie. Ich werde es jetzt benutzen, danke.
Allan Hasegawa

Antworten:

16

Eine wirklich gute Lösung würde wahrscheinlich mehr Arbeit erfordern, aber "nicht schlecht" ist nicht sehr schwer zu erreichen.

Idee

Alles, was wir brauchen, ist, nach jedem Zeichen eine Zeile nach unten zu rücken, also machen wir das einfach per InsertCharPreAuto-Befehl!

Code

Legen Sie es in .vimrcoder besser noch in eine Datei unter plugin/Verzeichnis.

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

Verwendung

:VertBefehl eingeben , um vertikal zu schreiben. Wenn Sie den Einfügemodus verlassen, wird dieser "Modus" automatisch deaktiviert. Natürlich können Sie es einer Verknüpfung zuordnen, wenn Sie diesen Befehl häufig verwenden müssen.

Bekannte Probleme

  1. Vertikales Schreiben wird nicht deaktiviert, wenn Sie den Einfügemodus über verlassen Ctrl-C(dies ist das Ergebnis Ctrl-Ceiner etwas seltsamen Implementierung in Bezug auf ein InsertLeaveEreignis, das nicht ausgelöst wird; daher erfordert die Verwendung der Taste eine sorgfältige Vorgehensweise ).
xaizek
quelle
1
Ein Hinweis auf das bekannte Problem Nr. 1: Sie sollten den Einfügemodus nicht mit verlassen <C-C>.
tommcdo
@tommcdo, ich nicht, aber wenn es da ist, benutzt es jemand. Es ist tatsächlich nützlich, Abkürzungserweiterungen zu vermeiden. Ich frage mich, warum InsertLeavefür diese Taste keine Auslösung erfolgt.
Xaizek
1
Ich schätze, ich möchte einen Trend zur Ablehnung fördern <C-C>, um den Einfügemodus zu beenden. Die Art und Weise, wie Sie es erwähnt haben, könnte bedeuten, dass es manchmal eine gute Methode ist. Es ist so, als würde man sagen: "Warnung: Ihr Dokument wird nicht gespeichert, wenn Sie Microsoft Word schließen, indem Sie den Computer vom Computer trennen."
tommcdo
@tommcdo Hätte nicht gedacht, dass es so klingen könnte. Hinweis hinzugefügt, <C-C>dass dies der Grund für das Problem ist. Mir ist keine andere Methode bekannt, um den Einfügemodus zu verlassen und die Abkürzungserweiterung zu unterdrücken. <C-C>Wenn dies nicht der Fall ist, ist dies zumindest im Rahmen einer Zuordnung wie z inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
Xaizek
Ich hatte Abkürzungen nicht berücksichtigt, das ist ein guter Punkt. Ich habe sogar einige Stellen in der Hilfe gefunden, die beschreiben, <C-C>wie man den Einfügemodus verlässt, ohne die Abkürzungen zu erweitern, und es wird nicht erwähnt, wie dadurch keine InsertLeaveEreignisse ausgelöst werden. Ich bin jetzt neugierig, ob es eine integrierte Möglichkeit gibt, dies zu tun, aber im Moment ist Ihr Mapping eine großartige Idee.
tommcdo
4

Sie können wie gewohnt tippen und dann den aktuellen horizontalen Text in vertikalen Text konvertieren, indem Sie die Ersetzung in Vim wie folgt verwenden (gilt für die aktuelle Zeile):

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

Oder viel einfacher zu merkende Methode ist, einen der folgenden Befehle (für alle Zeilen) auszuführen:

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

VWenn Sie nur für die aktuelle Zeile oder mehrere Zeilen gelten möchten, gehen Sie mit vor , erweitern Sie den Bereich für weitere Zeilen, falls erforderlich, und führen Sie die obigen Schritte aus (jedoch ohne %).

Überprüfen Sie für PowerShell unter Windows die Ersetzung für Falz .

F2Versuchen Sie Folgendes, um eine einfache Tastenzuordnung zu definieren :

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

Geben Sie dann etwas ein und drücken Sie F2, um den Text so einfach wie möglich vertikal zu gestalten.


Eine andere Alternative ist das Einstellen des automatischen Zeilenumbruchs, z

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

Dadurch wird der Text automatisch so umbrochen, wie es der Leerraum zulässt. Der Nachteil ist, dass jedem Buchstaben ein Leerzeichen folgen muss (es ist also fast so, als würden Sie drücken)Enter

Kenorb
quelle
1
Anstatt :s/\(.\)/\1\r/gnur das zu verwenden, :s/./\0\r/gwas funktional identisch ist.
Wildcard
1

Ich finde, dass Makros eine großartige Möglichkeit sind, ungewöhnliche Dinge zu tun, wenn Sie daran interessiert sind, dies nur einmal in einem blauen Mond zu tun. Angenommen, Sie haben die folgende Tabelle:

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

Und lassen Sie uns sagen , Sie ersetzen möchten Some Msgmit Other Message. Lassen Sie uns zunächst die Tabelle für das zusätzliche Zeichen erweitern (Zeile vor dem letzten 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

Das Makro, das ich entwickeln werde, wird sich darum kümmern, den Text von horizontal in vertikal zu konvertieren, während der alte Text ersetzt wird. Beginnen Sie, indem Sie den Text an der ersten Stelle eingeben (der Cursor befindet sich am Ende von 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

Zeichnen Sie das folgende Makro auf:

  • qq: Startet die Aufnahme eines Makros mit dem Namen q
  • ^: zum Zeilenanfang gehen
  • 3l: Gehen Sie zu der Spalte, in der der Text platziert werden soll
  • x: löscht das alte Zeichen
  • l: bewege dich nach rechts und lasse ein Zeichen aus der Nachricht anstelle des alten Zeichens:
  • v: In den visuellen Modus wechseln
  • f|: springen zu |
  • 2h: Zwei Zeichen zurück
  • d: Auswahl abschneiden
  • j: sich abwärts bewegen
  • P: Einfügen vor dem Cursor
  • q: Beenden Sie die Aufzeichnung des Makros

Zu diesem Zeitpunkt haben Sie:

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

Wiederholen Sie das Makro so oft, wie Sie es geschätzt haben (dh wie viele Zeichen Sie haben, aber Sie müssen es nicht im Voraus wissen. Unterschätzen Sie es einfach und fahren Sie fort, sobald Sie sehen, wie nah Ihre Schätzung war). Also lass uns mitgehen 10@q. Du erhältst:

%
%            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, noch eine ( @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

Ihr Cursor befindet sich jetzt auf dem letzten e. Das Makro funktioniert mit dem letzten Buchstaben nicht gut (Sie können versuchen, mit @qund dann u(rückgängig) unbefriedigende Ergebnisse zu erzielen). Einfach selbst einstellen ( Xfür Rücktaste).

Shahbaz
quelle
Sehr schön. Makros sind der richtige Weg. Mein schneller Versuch war im Wesentlichen der gleiche wie deiner; qq03lxldt|i ^[jPxq@q
Wildcard
@Wildcard, kann ich upvote?
Shahbaz
1
Ha! Habe ich vergessen; Ich dachte ich hatte. :)
Wildcard