Как выделить прямоугольную область в режиме визуального блока (Ctrl+v) в пустом файле (vim)?

Я могу легко выбрать прямоугольную область в файле, если эта область содержит текст или пробелы (или что-нибудь). Я делаю это с помощью режима визуального блока и клавиш движения. Но когда я пытаюсь создать такую ​​область в новом файле (или любом файле без текста), я не могу. Есть ли способ "расширить" эту область, например, автоматически заполняя ее пробелами? Или я иду в неправильном направлении?

Причина, по которой я хочу это:

Я создаю новый файл с помощью vim, а затем хотел бы создать блок комментариев, похожий на этот:

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

Я могу сделать это поверх существующего текста, используя клавиши Ctrl + V+движения, а затем R #, чтобы создать область, заполненную фунтами. Затем аналогично вырезать внутренний прямоугольник с пробелами.

Как я могу использовать эту технику в новом файле?

Благодарю.

4 ответа

Решение

Помимо (очень хорошего) ответа Брайана Расмуссена, единственный способ, которым я знаю, сделать почти точно то, что вы просите, - это использовать virtualedit Режим. Это не позволит вам редактировать несуществующие строки, но позволит вам редактировать за пределами существующих строк. Поэтому, чтобы превратить текущую строку в загрузку символов #, вы можете сделать это:

:set virtualedit=all
v50lr#

Чтобы создать блок 50х5, вы можете создать 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 (например, ~/.vim/plugins в Unix)

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

так далее...

Если вы хотите создать подобный блок в новом файле, вы можете сделать что-то вроде 50i#EscY5P

Таким образом, 50 раз вставьте #, а затем вставьте текущую строку и вставьте 5 раз. Это даст вам блок 50x5 #.

Конечно, вы все равно должны сделать, что бы вы ни делали, чтобы получить от блока #s до комментария в вашем посте.

В принятом ответе упоминается использование

:set virtualedit=all

Однако затем вы включаете virtualedit во всех режимах, что может не соответствовать вашему желанию. На самом деле есть также возможность включить его в режиме редактирования блоков:

:set virtualedit=block

Это то, что я положил в свой VIMRC

Я не думаю, что есть какой-то, чтобы выбрать текст, которого нет, но простое решение было бы "затравить" его чем-то вроде 76a yy4p... так нарисуйте 76 пробелов, а затем скопируйте строку 4 раза.

Другие вопросы по тегам