3

如果该区域包含文本或空格(或任何内容),我可以轻松地在文件中选择一个矩形区域。我用视觉块模式和动作键来做到这一点。但是当我尝试在新文件(或任何没有文本的文件)中创建这样的区域时,我不能。有没有办法通过自动填充空格来“扩展”这个区域?还是我走错了方向?

我想要这个的原因:

我用 vim 创建了一个新文件,然后想创建一个类似这样的注释块:

##############################################
#                                            #
#  My comment goes here                      #
#                                            #
##############################################

我可以使用Ctrl+v+对现有文本执行此操作motion keys,然后r#创建一个充满磅的区域。然后类似地用空格切出内部矩形。

如何在新文件上使用此技术?

谢谢。

4

4 回答 4

5

除了 Brian Rasmussen 的(非常好的)答案之外,我所知道的几乎完全符合您要求的唯一方法是使用virtualedit模式。这不会让您在不存在的行上进行编辑,但它会让您在现有行的末尾进行编辑。因此,要将当前行变成 # 符号的负载,您可以这样做:

:set virtualedit=all
v50lr#

要制作一个 50x5 的块,您可以创建 4 个新的空白行,然后执行相同操作:

:set virtualedit=all
4o<ESC>
<C-V>4k50lr#

(其中<C-V>表示按Ctrl+V<ESC>表示按Esc)。

我相信有一些适用于各种文件类型的插件可以更容易地创建这样的评论块,但我不确定哪个是最好的。

你可以这样做:

50i#<ESC>yyo#<ESC>48a<SPACE><ESC>a#<ENTER>#<SPACE><SPACE>My comment goes here<ESC>:exe<SPACE>'normal'<SPACE>(49-getpos('.')[2]).'a<SPACE>'<ENTER>a#<ENTER>#<ESC>48a<SPACE><ESC>a#<ESC>p

但也许那只是我傻!:help如果你有兴趣(是你的朋友),我会把它作为一个练习让读者弄清楚那里发生了什么。

作为一个稍微严肃一点的替代方案怎么样:在你的 vimrc 或 vim 运行时文件夹的 plugins 目录中的文件中添加以下内容(例如,Unix 上的 ~/.vim/plugins )

nmap <F4> :InsertCommentBlock<CR>
command! InsertCommentBlock call InsertCommentBlock()
function! InsertCommentBlock()
    let linelength = 50
    let linelist = []

    call add(linelist, repeat('#', linelength))
    call add(linelist, '#' . repeat(' ', linelength-2) . '#')
    let comment = input('Please enter a comment: ')
    call add(linelist, '#  ' . comment . repeat(' ', linelength - (4+len(comment))) . '#')
    call add(linelist, '#' . repeat(' ', linelength-2) . '#')
    call add(linelist, repeat('#', linelength))

    call append(line('.'), linelist)
endfunction

看:

:help function
:help 'virtualedit'
:help command
:help nmap
:help repeat()
:help append()
:help add()
:help getpos()
:help :exe

ETC...

于 2010-09-08T13:23:55.043 回答
4

如果您想在新文件中创建这样的块,您可以执行类似的操作50i#EscY5P

所以它是插入 # 50 次,然后是 yank 当前行并放置 5 次。这将为您提供一个 50x5 的 # 块。

当然,您仍然需要做任何事情,以从#s 块到您帖子中的评论。

于 2010-09-08T11:57:41.203 回答
1

接受的答案提到使用

:set virtualedit=all

但是,然后您在所有模式下启用 virtualedit,这可能不是您想要的。实际上还有一个选项可以在块编辑模式下启用它:

:set virtualedit=block

这就是我放在我的 vimrc 中的

于 2016-10-25T13:50:12.227 回答
0

我不认为有任何选择不存在的文本,但简单的解决方案是用类似的东西“播种”它76a yy4p......所以画76个空格,然后再复制第4行。

于 2010-09-08T11:58:50.783 回答