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


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події, яка не запускається; тому використання ключа вимагає обережності).

1
Спростування до відомого випуску №1: Ви не повинні залишати режим "Вставка" <C-C>.
tommcdo

@tommcdo, я ні, але якщо він є, хтось його використовує. Насправді корисно уникати розширення абревіатури, мені цікаво, чому InsertLeaveйого не спрацьовує цей ключ.
xaizek

1
Я думаю, я маю на увазі просування тенденції відхилення <C-C>як хорошого способу виходу з режиму Вставка. Те, як ви це згадали, може означати, що іноді це хороший метод. Це неначе сказати "Caveat: ваш документ не буде збережено, якщо ви закриєте 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


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для зворотного простору).


Дуже хороша. Макроси - це спосіб перейти у vim. Моя швидка спроба була по суті такою ж, як і ваша; qq03lxldt|i ^[jPxq@q
Wildcard

@Wildcard, чи можу я викликати небезпеку?
Шахбаз

1
Га! Ковзнув мій погляд; Я думав, що маю. :)
Wildcard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.