如何在空文件(vim)中以可视块模式(Ctrl + v)选择矩形区域?

Val*_*yev 3 vim viemu

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

我想要这个的原因:

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

##############################################
#                                            #
#  My comment goes here                      #
#                                            #
##############################################
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

DrA*_*rAl 5

除了从布赖恩拉斯穆森(非常好)的答案,我知道的唯一的方式做几乎正是你所要求的是使用virtualedit模式.这不允许您在不存在的行上进行编辑,但它可以让您在现有行的末尾进行编辑.因此,要将当前行转换为#符号的负载,您可以这样做:

:set virtualedit=all
v50lr#
Run Code Online (Sandbox Code Playgroud)

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

:set virtualedit=all
4o<ESC>
<C-V>4k50lr#
Run Code Online (Sandbox Code Playgroud)

(这<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
Run Code Online (Sandbox Code Playgroud)

但也许这只是我的愚蠢!如果你感兴趣的话(: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
Run Code Online (Sandbox Code Playgroud)

看到:

:help function
:help 'virtualedit'
:help command
:help nmap
:help repeat()
:help append()
:help add()
:help getpos()
:help :exe
Run Code Online (Sandbox Code Playgroud)

等等...