Резервное восстановление текущее повторное действие (.) в VIM

Прежде всего, вы не создаете массив, когда пишете int building = {1,2,3,4 };

Это должно быть int building[] = {1,2,3,4 };

Ошибка компиляции из-за того, что ваш вектор удерживает объект объекта, но вы пытаетесь присвоить ему указатель. В вашем первом методе вы можете оставить векторное хранилище unit *

Ваш второй способ в порядке, но третий - неправильный, деструкторы не называются таким образом, и вам не следует вручную вызывать деструктор, компилятор сделает это за вас, когда выйдет из области видимости цикла for.

По моему мнению, Best действительно зависит от того, каким образом вы хотите использовать свой вектор, самый быстрый и безопасный метод будет вторым методом, он использует распределение стека, и это очень быстро и безопасно. (нет необходимости вручную удалять). Он также дружествен к кешу, поскольку в памяти все последовательно, проход по всем блокам происходит быстро.

Почему программисты на C ++ должны минимизировать использование новых

7
задан Jeremy Smyth 24 June 2009 в 14:24
поделиться

3 ответа

В VIM вы можете создать макрос, который будет выполнять любые правки, которые вы обычно делаете в обычном режиме , не нарушая функциональность redo [.] оборачивая эти правки в пользовательскую : функцию , а затем выполняя эту функцию с помощью клавиши педали : map .

Пример

Лучший способ увидеть это на примере. Предположим, вы хотите добавлять текст гггг в конец текущей строки каждый раз, когда вы нажимаете клавишу F2, но не хотите, чтобы это мешало команде повторения [.] .

Вот как это сделать:

  1. Откройте новое окно vim и выполните следующие команды:

    : fu JL ()
     нормальный айыы
     endfu
    : map : вызвать JL () 
    
  2. Теперь добавьте текст, скажем, xxx , набрав Axxx

  3. Теперь нажмите клавишу [F2] , и вы должны увидеть xxxyyy

  4. Наконец, нажмите клавишу [.] , и вы увидите xxxyyyxxx

Как раз то, что вы хотели!

Почему это работает

Это работает из-за природы способ, которым VIM выполняет команду повтора. VIM отслеживает символы команды по мере ее ввода. Когда вы нажимаете клавишу [.] , он вставляет эти символы обратно в буфер клавиатуры для их повторного выполнения. К сожалению, простой макрос q работает так же - он вставляет символы в буфер и перезаписывает буфер повторного выполнения. Команда : normal также делает это, но при помещении внутрь пользовательской функции мы обходим это ограничение, поскольку код, выполняющий пользовательскую функцию, сохраняет и восстанавливает буфер повторения во время пользовательской функции.

Все это происходит в eval.c и getchar.c в исходном коде VIM. Найдите saveRedobuff , чтобы увидеть, что происходит.

10
ответ дан 6 December 2019 в 10:53
поделиться

Единственным путем я могу думать для выручения Вас: повторно отобразитесь '.' для сохранения истории действий, которые Вы могли затем вспомнить в случае необходимости. Для идей об этих строках посмотрите repeat.vim плагин.

4
ответ дан 6 December 2019 в 10:53
поделиться

Можно записать действие в регистр, который будет использоваться позже. Нажмите q, сопровождаемый регистром (a-z, A-Z, 0-9 или "являются допустимыми идентификаторами регистра), примените желаемую команду/действия и нажатие q для остановки записи. Команда может быть повторно вызвана путем нажатия сопровождаемый регистром.

Для более подробных инструкций посмотрите сложный повторный раздел документации Vim.

Примечание: К сожалению, последовательность qa.qu не сделает точно, что Вы хотите начиная с. команда повторит текущее последнее действие а не последнее действие в то время, когда команда была зарегистрирована.

4
ответ дан 6 December 2019 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: