可以说我想在文档中生成以下文本:
%
% Not Important
% O ------------------------->
% |
% S |
% o |
% m |
% e |
% |
% M |
% s |
% g |
% |
% V
是否有任何简单的方法可以像上述那样垂直书写“某些消息”,而不必在每行中手动插入每个字符?
可以说我想在文档中生成以下文本:
%
% Not Important
% O ------------------------->
% |
% S |
% o |
% m |
% e |
% |
% M |
% s |
% g |
% |
% V
是否有任何简单的方法可以像上述那样垂直书写“某些消息”,而不必在每行中手动插入每个字符?
Answers:
真正好的解决方案可能需要更多的工作,但是“不错”并不是很难实现的。
我们需要做的就是在每个字符后向下移动一行,所以让我们通过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
命令开始垂直书写。离开插入模式会自动禁用此“模式”。当然,如果需要经常使用此命令,则可以将其映射到快捷方式。
InsertLeave
不会触发;因此,使用该键时要格外小心)。<C-C>
。
InsertLeave
没有为此键触发。
<C-C>
这是退出插入模式的好方法。您提到的方式可能暗示它有时是个好方法。这就像在说:“注意:如果通过拔出计算机来关闭Microsoft Word,则不会保存您的文档。”
<C-C>
成为问题原因的注释。我不知道有什么方法可以像其他方法一样保留插入模式来抑制缩写扩展<C-C>
,如果没有的话,它至少可用作映射的一部分,例如inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>
。
<C-C>
为在不扩展缩写的情况下退出插入模式,也没有提到它不会触发InsertLeave
事件的方式。我现在很好奇是否有内置的方法可以执行此操作,但是现在您的映射是个好主意。
您可以像往常一样键入,然后通过在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
:s/\(.\)/\1\r/g
,您可以只使用:s/./\0\r/g
功能相同的。
我发现,如果您有兴趣在蓝色月亮中最多进行一次宏操作,那么宏是一种执行异常操作的绝妙方法。假设您有下表:
%
% 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
退格)。
qq03lxldt|i ^[jPxq@q
:s/./% \0\r/
%