如何垂直书写?


22

可以说我想在文档中生成以下文本:

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

是否有任何简单的方法可以像上述那样垂直书写“某些消息”,而不必在每行中手动插入每个字符?


5
您可以:s/./% \0\r/%
像平常一样

不错的解决方案,有点用。暂时将使用它,谢谢。
长谷川艾伦2015年

Answers:


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'3

@tommcdo,我不知道,但是如果有人在使用它。避免缩写扩展实际上很有用,我想知道为什么InsertLeave没有为此键触发。
xaizek 2015年

1
我想我的意思是要促进一种拒绝趋势,<C-C>这是退出插入模式的好方法。您提到的方式可能暗示它有时是个好方法。这就像在说:“注意:如果通过拔出计算机来关闭Microsoft Word,则不会保存您的文档。”
tommcdo'3

@tommcdo认为听起来可能不是这样。添加了有关<C-C>成为问题原因的注释。我不知道有什么方法可以像其他方法一样保留插入模式来抑制缩写扩展<C-C>,如果没有的话,它至少可用作映射的一部分,例如inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>
xaizek 2015年

我没有考虑缩写,这是一个好主意。我什至在帮助中找到了一些地方,描述<C-C>为在不扩展缩写的情况下退出插入模式,也没有提到它不会触发InsertLeave事件的方式。我现在很好奇是否有内置的方法可以执行此操作,但是现在您的映射是个好主意。
tommcdo'3

4

您可以像往常一样键入,然后通过在Vim中使用以下替换将当前水平文本转换为垂直文本(适用于当前行):

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

或者更容易记住的方法是执行以下命令之一(针对所有行):

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

要仅适用于当前行或更多行,请在之前加上V,如果需要,可将区域扩大到更多行,然后在上方执行(但不要执行%)。

对于Windows上的PowerShell,请检查fold的替代项

要定义简单的键映射(例如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功能相同的。
2015年

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 MsgOther 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
2015年

@Wildcard,我可以投票吗?
Shahbaz

1
哈!我忘了; 我以为我有。:)
通配符
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.