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

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


是否有任何简单的方法可以像上面那样垂直编写“ Some Msg”,而无需手动插入每行中的每个字符?

评论

您可以像往常一样编写文本,然后执行:s /./% \ 0 \ r /以添加%和换行符...虽然不是一个很好的解决方案,但是...

不错的解决方案,有点用。暂时将使用它,谢谢。

#1 楼

真正好的解决方案可能需要更多的工作,但是“不错”并不是很难实现。

想法

我们只需要移动一个在每个字符后排成一行,所以让我们通过InsertCharPre自动命令执行
吧!目录。

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


用法

输入.vimrc命令开始垂直书写。离开插入模式
自动禁用此“模式”。当然,如果需要经常使用此命令,可以将其映射到快捷方式。

已知问题


垂直书写不会如果您通过
Ctrl-C退出插入模式,则将其禁用(这是由于Ctrl-C对于plugin/事件以一种略微奇怪的方式实现的,该事件未触发;因此使用该键要求输入一个小心)。


评论


对已知问题#1的反驳:不应将保留为插入模式。

–tommcdo
2015年3月1日在12:49

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

–xaizek
2015年3月1日12:56



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

–tommcdo
15年3月1日在13:04

@tommcdo没想到这样听起来。添加了有关作为问题原因的说明。我不知道有什么方法可以像一样保留插入模式来抑制缩写扩展,如果没有,至少在像inoremap :doautocmd InsertLeave < cr>。

–xaizek
2015年3月1日下午13:37

我没有考虑过缩写,这是一个好主意。我什至在帮助中找到了一些描述的地方,这些地方在不扩展缩写的情况下退出了插入模式,并且没有提及它如何不会触发InsertLeave事件。我现在很想知道是否有内置的方法,但是就目前而言,映射是个好主意。

–tommcdo
2015年3月1日13:51

#2 楼

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

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


Remember方法是执行以下命令之一(针对所有行):

:%!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键几乎相同

评论


而不是:s / \(。\)/ \ 1 \ r / g,您可以只使用功能上相同的:s /./ \ 0 \ r / g。

–通配符
15年10月13日在18:13

#3 楼

我发现,如果您有兴趣在蓝色月亮中最多进行一次宏操作,那么宏是一种执行异常操作的绝妙方法。假设您有下表:

%
%            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。首先,让我们扩展表的多余字符(最后一行之前的行:

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


我要提出的宏将要处理在替换旧文本的同时将文本从水平方向转换为垂直方向,首先在第一个位置键入文本(光标位于yy5p的末尾):

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


记录以下宏:



Other Message:开始记录名为qq的宏


q:转到行的开头

^:移至要放置文本的列

3l:删除旧字符

x:向右移动,从替换旧字符的消息:

l:进入可视模式

v:跳转到f|


|:移动返回两个字符

2h:剪切选择

d:向下移动

j:在光标之前粘贴

P:终止记录宏

此时,您具有:

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


重复该宏足够的次数(即,字符数),但是您不必事先知道它。只是低估了,请在看到估计值接近时继续操作。因此,让我们来看看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


还可以再一次(10@q):最后一个@q。宏不能与最后一个字母配合使用(您可以尝试使用e,然后尝试@q(撤消),以得到不满意的结果)。只需自己调整即可(退格键u)。

评论


非常好。宏是进入vim的方式。我的快速尝试与您的尝试基本相同。 qq03lxldt | i ^ [jPxq @ q

–通配符
15-10-13在18:23



@Wildcard,我可以投票吗?

– Shahbaz
2015年10月14日下午4:21

哈!我忘了;我以为我有。 :)

–通配符
2015年10月14日在4:32