Я пытаюсь написать простую панель управления для vim. Когда я пытаюсь центрировать текст, это не работает. Если я ввожу каждую команду вручную, она работает. Но когда я использую его в команде, это не работает. Вот код. Моя проблема - это линия
normal! VG:center.
function! DoSomethingIfNoArgs()
if argc()
return
endif
" Start a new buffer ...
enew
" ... and set some options for it
setlocal
\ textwidth=174
\ bufhidden=wipe
\ buflisted
\ nocursorcolumn
\ nocursorline
\ nolist
\ nonumber
\ norelativenumber
\ noswapfile
" Now we can just write to the buffer, whatever you want.
call append('.', ["",
\"",
\"",
\"",
\" | |",
\" | ████ ██████ █████ ██ |",
\" | ███████████ █████ |",
\" | █████████ ███████████████████ ███ ███████████ |",
\" | █████████ ███ █████████████ █████ ██████████████ |",
\" | █████████ ██████████ █████████ █████ █████ ████ █████ |",
\" | ███████████ ███ ███ █████████ █████ █████ ████ █████ |",
\" | ██████ █████████████████████ ████ █████ █████ ████ ██████ |",
\" ",
\" ",
\" "])
normal! VG:center<cr>
" No modifications to this buffer
setlocal nomodifiable nomodified
" When we go to insert mode start a new buffer, and start insert
nnoremap <buffer><silent> e :enew<CR>
nnoremap <buffer><silent> i :enew <bar> startinsert<CR>
nnoremap <buffer><silent> o :enew <bar> startinsert<CR>
endfunction
autocmd VimEnter * call DoSomethingIfNoArgs()
Если я наберу VG, чтобы выделить текст, а затем :center. Все работает.
Но если я использую
:normal! VG:center
это, кажется, ничего не делает.
Чего мне здесь не хватает.
:normal :center
не работает, потому что :
не является командой обычного режима, а переключает из обычного режима в командную строку.
ИМХО, весь подход неправильный (недостаточно энергичный). Вам не нужно делать VG
, чтобы выделить весь текст. На самом деле вам вообще не нужно выделять текст. Вместо этого запустите :center
по ряду строк. Вы хотите центрировать весь текст? Это :%center
— %
в качестве спецификатора диапазона означает 1,$
, т. е. от 1-й строки до последней.
Вы хотите центрировать от текущей строки до конца? Это :.,$center
Внутри функции вам не нужно добавлять :
в начало (внутри функции каждая строка является Ex-командой), поэтому команда для центрирования всего текста становится просто %center
. Вот и все, :normal
или VG
не нужны!
Да, это сработало. Большое спасибо. Просто ради любопытства, как бы вы выполнили center после обычного! внутри функции?
Ну а я нет, избегаю :normal
, насколько это возможно. :put
вместо :normal p
и так далее. Практически для всего есть команды Ex-режима. В крайнем случае я бы запускал :normal VG
и :center
в функции отдельно, а не внутри одной :normal
команды.
Связано: stackoverflow.com/questions/62372653/…