Почему эта команда Vim не выполняется должным образом?

Я пытаюсь написать простую панель управления для 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 

это, кажется, ничего не делает.

Чего мне здесь не хватает.

Связано: stackoverflow.com/questions/62372653/…

Friedrich 22.04.2024 08:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

:normal :center не работает, потому что : не является командой обычного режима, а переключает из обычного режима в командную строку.

ИМХО, весь подход неправильный (недостаточно энергичный). Вам не нужно делать VG, чтобы выделить весь текст. На самом деле вам вообще не нужно выделять текст. Вместо этого запустите :center по ряду строк. Вы хотите центрировать весь текст? Это :%center% в качестве спецификатора диапазона означает 1,$, т. е. от 1-й строки до последней.

Вы хотите центрировать от текущей строки до конца? Это :.,$center

Внутри функции вам не нужно добавлять : в начало (внутри функции каждая строка является Ex-командой), поэтому команда для центрирования всего текста становится просто %center. Вот и все, :normal или VG не нужны!

Да, это сработало. Большое спасибо. Просто ради любопытства, как бы вы выполнили center после обычного! внутри функции?

Liam Bunyan 21.04.2024 22:07

Ну а я нет, избегаю :normal, насколько это возможно. :put вместо :normal p и так далее. Практически для всего есть команды Ex-режима. В крайнем случае я бы запускал :normal VG и :center в функции отдельно, а не внутри одной :normal команды.

phd 21.04.2024 22:17

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