%
% Not Important
% O ------------------------->
% |
% S |
% o |
% m |
% e |
% |
% M |
% s |
% g |
% |
% V
是否有任何简单的方法可以像上面那样垂直编写“ Some Msg”,而无需手动插入每行中的每个字符?
#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
我想我的意思是要促进一种拒绝
–tommcdo
15年3月1日在13:04
@tommcdo没想到这样听起来。添加了有关
–xaizek
2015年3月1日下午13:37
我没有考虑过缩写,这是一个好主意。我什至在帮助中找到了一些描述
–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
评论
您可以像往常一样编写文本,然后执行:s /./% \ 0 \ r /以添加%和换行符...虽然不是一个很好的解决方案,但是...不错的解决方案,有点用。暂时将使用它,谢谢。