Как выделить прямоугольную область в режиме визуального блока (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 раза.