Jak pisać w pionie?

22

Powiedzmy, że chcę utworzyć następujący tekst w moim dokumencie:

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

Czy jest jakiś prosty sposób na napisanie „Some Msg” w pionie, jak powyżej, bez konieczności ręcznego wstawiania każdego znaku w każdym wierszu?

Allan Hasegawa
źródło
5
Możesz napisać tekst w normalny sposób, a następnie :s/./% \0\r/dodać %i nowe wiersze ... Nie jest to jednak świetne rozwiązanie ...
Martin Tournoij
Ładne rozwiązanie, to trochę działa. Na razie będę go używać, dziękuję.
Allan Hasegawa

Odpowiedzi:

16

Naprawdę dobre rozwiązanie prawdopodobnie wymagałoby nieco więcej pracy, ale „niezłe” nie jest bardzo trudne do osiągnięcia.

Pomysł

Wystarczy przesunąć jedną linię w dół po każdej postaci, więc zróbmy to tylko za pomocą InsertCharPreautomatycznego polecenia!

Kod

Umieść go .vimrclub jeszcze lepiej w jakimś pliku w plugin/katalogu.

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

Stosowanie

Wpisz :Vertpolecenie, aby rozpocząć pisanie w pionie. Opuszczenie trybu wstawiania automatycznie wyłącza ten „tryb”. Oczywiście możesz zamapować go na skrót, jeśli często używasz tego polecenia.

Znane problemy

  1. Zapis pionowy nie zostanie wyłączony, jeśli wyjdziesz z trybu wstawiania przez Ctrl-C(jest to wynikiem Ctrl-Cnieco dziwnego zaimplementowania InsertLeavezdarzenia, które nie jest uruchamiane; w związku z tym należy zachować ostrożność przy użyciu klawisza).
xaizek
źródło
1
Obalenie znanego problemu nr 1: Nie powinieneś opuszczać trybu wstawiania <C-C>.
tommcdo
@tommcdo, ja nie, ale jeśli jest, ktoś go używa. Przydaje się unikanie rozwijania skrótów. Zastanawiam się, dlaczego InsertLeavenie jest uruchamiany dla tego klucza.
xaizek
1
Myślę, że mam na celu promowanie trendu odrzucania <C-C>jako dobrego sposobu na wyjście z trybu wstawiania. Sposób, w jaki wspomniałeś, może sugerować, że czasami jest to dobra metoda. To tak jakby powiedzieć „Zastrzeżenie: twój dokument nie zostanie zapisany, jeśli zamkniesz Microsoft Word przez odłączenie komputera”.
tommcdo
@tommcdo Nie sądziłem, że może to zabrzmieć w ten sposób. Dodano notatkę o <C-C>przyczynie problemu. Nie znam innej metody opuszczania trybu wstawiania, która tłumi rozwijanie skrótów, ponieważ <C-C>jeśli nie, jest przydatna przynajmniej jako część odwzorowania inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek
Nie zastanawiałem się nad skrótami, to dobra uwaga. Znalazłem nawet kilka miejsc w pomocy, które opisują <C-C>opuszczanie trybu wstawiania bez rozwijania skrótów i nie ma wzmianki o tym, jak nie wyzwala InsertLeavezdarzeń. Jestem teraz ciekawy, czy istnieje wbudowany sposób, aby to zrobić, ale na razie mapowanie to świetny pomysł.
tommcdo
4

Możesz pisać jak zwykle, a następnie przekonwertować bieżący tekst poziomy na pionowy, używając podstawiania w Vimie w następujący sposób (dotyczy bieżącej linii):

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

Lub znacznie łatwiejszą do zapamiętania metodą jest wykonanie jednego z następujących poleceń (dla wszystkich wierszy):

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

Aby zastosować tylko do bieżącej linii lub większej liczby linii, poprzedzaj ją V, w razie potrzeby rozwiń obszar dla większej liczby linii i wykonaj powyżej (ale bez %).

W przypadku programu PowerShell w systemie Windows sprawdź zastąpienie fold .

Aby zdefiniować proste mapowanie klawiszy (np. F2), Spróbuj wykonać następujące czynności:

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

Następnie wpisz coś i naciśnij, F2aby tekst był pionowy, tak prosty.


Inną alternatywą jest ustawienie automatycznego zawijania słów, np

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

Spowoduje to automatyczne zawinięcie tekstu tak blisko 1 znaku, jak pozwala na to spacja. Wadą jest to, że po każdej literze musi znajdować się spacja (więc jest prawie taka sama, jak w przypadku naciśnięciaEnter

kenorb
źródło
1
Zamiast tego :s/\(.\)/\1\r/gmożesz użyć tego, :s/./\0\r/gktóry jest funkcjonalnie identyczny.
Wildcard
1

Uważam, że makra to świetny sposób na robienie niezwykłych rzeczy, jeśli jesteś zainteresowany zrobieniem tego nie więcej niż raz na niebieskim księżycu. Powiedzmy, że masz następującą tabelę:

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

I powiedzmy, że chcesz zamienić Some Msgz Other Message. Po pierwsze, powiększmy tabelę o dodatkowy znak (wiersz przed ostatnim 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

Makro, które zamierzam wymyślić, zajmie się konwertowaniem tekstu z poziomego na pionowy, zastępując jednocześnie stary tekst. Zacznij od wpisania tekstu w pierwszej lokalizacji (kursor znajduje się na końcu 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

Zapisz następujące makro:

  • qq: rozpocznij rejestrowanie makra o nazwie q
  • ^: przejdź do początku linii
  • 3l: przejdź do kolumny, w której ma zostać umieszczony tekst
  • x: usuń stary znak
  • l: przesuń w prawo, pozostawiając jeden znak z wiadomości zamiast starego znaku:
  • v: przejdź do trybu wizualnego
  • f|: Skocz do |
  • 2h: cofnij dwie postacie
  • d: cięcie zaznaczenia
  • j: padnij
  • P: wklej przed kursorem
  • q: zakończ nagrywanie makra

W tym momencie masz:

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

Powtórz makro tyle razy (tj. Liczbę znaków, ale nie musisz go znać wcześniej. Po prostu nie doceniaj i kontynuuj, gdy zobaczysz, jak blisko była twoja ocena). Więc chodźmy 10@q. Dostajesz:

%
%            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, jeszcze jeden ( @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

Twój kursor jest teraz na ostatnim e. Makro nie działa dobrze z ostatnią literą (możesz spróbować z, @qa następnie u(cofnąć), aby uzyskać niezadowalające wyniki). Po prostu dostosuj to sam ( Xdla backspace).

Shahbaz
źródło
Bardzo dobrze. Makra to droga do działania w vimie. Moja szybka próba była zasadniczo taka sama jak twoja; qq03lxldt|i ^[jPxq@q
Wildcard
@Wildcard, czy mogę upvote?
Shahbaz
1
Ha! Przemknęło mi przez myśl; Myślałem, że tak. :)
Wildcard