Как переместить блок кода в VIM

Допустим, у меня есть следующий блок кода:

int main(void)
{
    return 0;
}

int abc(void)
{
    printf("First line\n");
    printf("Druhy radek\n");
    printf("tuna fish\n");
}

... и я хочу переместить содержимое функции abc в функцию main. Я пытался использовать visual selection, но когда я выбираю эти три строки и вставляю их, это происходит:

int main(void)
{
    return 0;
    printf("First line\n"); }
    printf("Druhy radek\n");
    printf("tuna fish\n");  int justAregularFunction(void)
{

Вместо этого я хочу создать пробел в основной функции для удаленного блока текста и затем вставить его. Я пытался использовать ]p вместо обычного p для вставки текста, но это не сработало.

Решение будет использовать d2j удалить три строки, а затем я могу вставить блок, как я хотел. Но это не очень полезно, когда у вас есть код с большим количеством строк. Также команды :set paste а также :set nopaste не помогло Я изучаю VIM и не имею опыта работы с vi, так что, возможно, я что-то упустил. Vim tutor было очень полезно, но это объясняло только перемещение отдельных строк. Также я нашел много материала о перемещении строк в vim здесь при переполнении стека, но все помогло. Я хотел бы иметь что-то вроде >><< для перемещения текста, но по вертикали.

Второе, что я не могу понять, это как удалить текст и пробел в визуальном выделении. Когда я выбираю текст и пытаюсь удалить его, он оставляет пустое место. Button D удаляет только текст без пробела, а также X делает то же самое (и другие варианты со смещением и контролем). Опять же, использование d числа j поможет, но я хочу добиться этого в visual Выбрать.

Надеюсь, это не совсем глупый вопрос, но я действительно не нашел способа сделать это. Спасибо за вашу помощь.

2 ответа

Решение

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

Если вы хотите переместить линии, обязательно начните выделение линий с Shift + V; вы увидите -- VISUAL LINE -- индикация в строке состояния внизу. В вашем примере это будет (с курсором в любом месте на printf("First line... часть) Vjjd, Конечно, при таком небольшом количестве строк легче пропустить визуальный выбор и использовать счетчик: 3dd,

И за

Как только вы правильно поняли основы (пробовали ли вы vimtutorтакже посмотрите на отличную встроенную :helpили множество учебных пособий по Vim в Интернете, особенно http://vimcasts.org/), есть несколько способов улучшить этот рабочий процесс: текстовые объекты, плагины, которые могут выбирать тела функций или строки с отступами и т. д.

С курсором printf("First line\n");Я бы выделил блок кода с помощью v{motion} затем :move это просто под return 0; линия.

vjj
:m?ret<CR>

Без визуального отбора:

d2j
?ret<CR>
p

Только для команды:

:,+2m?ret<CR>

или же

С курсором return 0;:

:9,10m.

Ну, есть миллион способов...

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