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

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

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

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

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

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

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

Спасибо.

Ответы [ 4 ]

5 голосов
/ 08 сентября 2010

Помимо (очень хорошего) ответа Брайана Расмуссена, единственный известный мне способ сделать почти именно то, что вы просите, - это использовать режим 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

и т.д ...

4 голосов
/ 08 сентября 2010

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

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

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

1 голос
/ 25 октября 2016

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

:set virtualedit=all

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

:set virtualedit=block

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

0 голосов
/ 08 сентября 2010

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

...