Как писать по вертикали?

22

Допустим, я хочу создать следующий текст в моем документе:

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

Есть ли простой способ написать "Some Msg" по вертикали, как указано выше, без необходимости вручную вставлять каждый символ в каждую строку?

Аллан Хасегава
источник
5
Вы могли бы написать свой текст как обычно, а затем сделать, :s/./% \0\r/чтобы добавить %и новые строки ... Хотя это не очень
хорошее
Хорошее решение, оно вроде работает. Буду использовать это сейчас, спасибо.
Аллан Хасегава

Ответы:

16

Действительно хорошее решение, вероятно, потребует дополнительной работы, но «не плохо» не так сложно достичь.

идея

Все, что нам нужно, это переместить одну строку вниз после каждого символа, поэтому давайте сделаем это с помощью InsertCharPreавто-команды!

Код

Поместите его .vimrcили, что еще лучше, в какой-нибудь файл в plugin/каталоге.

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

использование

Введите :Vertкоманду, чтобы начать писать по вертикали. Выход из режима вставки автоматически отключает этот «режим». Конечно, вы можете сопоставить его с ярлыком, если вам нужно часто использовать эту команду.

Известные проблемы

  1. Вертикальная запись не будет отключена, если вы выйдете из режима вставки через Ctrl-C(это результат Ctrl-Cреализации немного странным образом по отношению к InsertLeaveсобытию, которое не запускается; таким образом, использование клавиши требует осторожности).
xaizek
источник
1
Опровержение известной проблемы № 1: Вы не должны выходить из режима вставки с помощью <C-C>.
Tommcdo
@ tommcdo, я не знаю, но если он есть, кто-то его использует. На самом деле полезно избегать расширения аббревиатур, мне интересно, почему InsertLeaveне запускается этот ключ.
xaizek
1
Я полагаю, что я имею в виду продвижение тенденции отклонения <C-C>как хороший способ выйти из режима вставки. То, как вы упомянули это, может означать, что иногда это хороший метод. Это все равно что сказать: «Предостережение: ваш документ не будет сохранен, если вы закроете Microsoft Word, отключив компьютер от сети».
Tommcdo
@ tommcdo Не думал, что это может звучать так. Добавлена ​​заметка о <C-C>причине проблемы. Я не знаю другого способа оставить режим вставки, подавляющий расширение аббревиатур, как <C-C>, если нет, он полезен, по крайней мере, как часть сопоставления типа inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek
Я не рассматривал сокращения, это хороший момент. Я даже нашел некоторые места в справке, которые описывают <C-C>выход из режима вставки без расширения сокращений, и нет никаких упоминаний о том, как он не вызывает InsertLeaveсобытия. Теперь мне любопытно, есть ли встроенный способ сделать это, но сейчас ваше отображение является отличной идеей.
Tommcdo
4

Вы можете набирать как обычно, а затем преобразовать текущий горизонтальный текст в вертикальный, используя подстановку в Vim следующим образом (применяется к текущей строке):

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

Или гораздо проще запомнить метод - выполнить одну из следующих команд (для всех строк):

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

Чтобы применить только к текущей строке или нескольким строкам, предварительно добавьте, при необходимости V, увеличьте область для большего количества строк и выполните выше (но без %).

Для PowerShell в Windows проверьте замену на сгиб .

Чтобы определить простое сопоставление клавиш (например F2), попробуйте следующее:

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

Затем напечатайте что-нибудь и нажмите, F2чтобы сделать текст вертикальным, таким простым.


Другой альтернативой является установка автоматической переноса слов, например

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

Это автоматически обернет текст настолько близко к 1 символу, насколько позволяет пробел. Недостатком является то, что за каждой буквой должен следовать пробел (так что он почти такой же, как вы бы нажималиEnter

kenorb
источник
1
Вместо :s/\(.\)/\1\r/gэтого вы можете просто использовать :s/./\0\r/gфункционально идентичные.
Wildcard
1

Я считаю, что макросы - это отличный способ делать необычные вещи, если вы заинтересованы в том, чтобы делать это не чаще одного раза в голубой луне. Допустим, у вас есть следующая таблица:

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

И скажем, вы хотите заменить Some Msgна Other Message. Прежде всего, давайте расширим таблицу для дополнительного символа (строка перед последним 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

Макрос, который я собираюсь придумать, позаботится о преобразовании текста из горизонтального в вертикальный при замене старого текста. Начните с ввода текста в первом месте (курсор находится в конце 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

Запишите следующий макрос:

  • qq: начать запись макроса с именем q
  • ^: перейти к началу строки
  • 3l: перейти к столбцу, в который будет помещен текст
  • x: удалить старый символ
  • l: двигаться вправо, оставив один символ из сообщения вместо старого:
  • v: перейти в визуальный режим
  • f|: прыгать, чтобы |
  • 2h: сдвинуть назад два символа
  • d: вырезать выбор
  • j: двигаться вниз
  • P: вставить перед курсором
  • q: прекратить запись макроса

На данный момент у вас есть:

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

Повторите макрос достаточно много раз (т. Е. Количество символов, но вам не нужно знать его заранее. Просто недооценивайте и продолжайте, как только увидите, насколько приблизительной была ваша оценка). Итак, поехали 10@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 |
%   ge |
%    |
%    |
%    V

Хорошо, еще один ( @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

Ваш курсор теперь на последнем e. Макрос плохо работает с последней буквой (вы можете попробовать @qи затем u(отменить) для получения неудовлетворительных результатов). Просто настройте его самостоятельно ( Xдля возврата).

Shahbaz
источник
Очень хорошо. Макросы - это путь в VIM. Моя быстрая попытка была практически такой же, как ваша; qq03lxldt|i ^[jPxq@q
Wildcard
@ Уайлдкарт, я могу поднять голос?
Шахбаз
1
Ха! Запамятовал; Я думал, что имел. :)
Подстановочный