Подтвердить что ты не робот

Выбор полного определения функции в Vim

Я пробовал Vim для любой работы по редактированию текста почти неделю. Я хочу узнать самый быстрый способ выбора определения функции C.

Например, если у меня есть такая функция:

void helloworlds( int num )
{
    int n;
    for ( n = 0; n < num; ++n ) {
        printf( "Hello World!\n" );
    }
}

Как я могу удалить все определение, включая имя функции?

4b9b3361

Ответ 1

Как это принято в Vim, существует множество способов!

Обратите внимание, что первые два решения зависят от отсутствия пустых строк.

  • Если ваш курсор находится в строке с именем функции, попробуйте d }. Он удалит все для следующего блока (т.е. Тела вашей функции).

  • Внутри самого тела функции d a p удалит "абзац".

  • Вы можете удалить фигурный скоб с d a }. (Если вам нравится этот синтаксис, я рекомендую Tim Pope фантастически surround.vim, который добавляет больше возможностей с похожим ощущением).

  • Вы также можете попробовать использовать регулярные выражения для удаления, пока следующая левая с отступом закрывающая фигурная скобка: d / ^ } Enter

  • ] ] и [ [ перейти к следующей/предыдущей фигурной скобке первого столбца (эквивалентно использованию / и ? с этим регулярным выражением, упомянутым выше. d, и вы получаете тот же эффект. В дополнение к Python-mode эти переопределены, что означает именно то, что вы ищете: переход от функции к функции.

Как удалить весь блок, заголовок включен

Если вы используете заголовок/имя или строку перед блоком, d a } должен выполнить трюк.

Если вы находитесь под блоком, вы также можете использовать удобную функцию "смещения" для поиска Vim. d ? ^ { ? - 1 будет удаляться назад до одной строки перед первым вхождением фигурной скобки первого столбца. Эта команда немного сложна для ввода. Возможно, вы можете сделать ярлык <leader> из него.

Плагины

Я не делаю много программистов на V в Vim, но наверняка есть плагины, которые помогут в этом. Попробуйте Vim Scripts или их зеркало в GitHub.

Ответ 2

Чтобы удалить целую функцию, включая ее определение, например:

function tick() {
        // ... 
}
  • Перейдите к строке с именем функции.
  • Переместите курсор к открывающей скобке, f{, или просто $.
  • Нажмите V%d (визуальная строка, перейдите к соответствующей паре, удалите)

Если ваши функции выглядят так:

function tick() 
{
        // ... 
}
  • Перейдите к строке с именем функции.
  • Нажмите J (присоединитесь к текущей строке с строкой ниже. Это также помещает ваш курсор на последний символ в результирующей строке {, только тот, который нам нужен для следующей команды.)
  • Нажмите V%d (визуальная строка, перейдите к соответствующей паре, удалите.)

или

  • Перейдите к строке с именем функции.
  • Нажмите V[Down]%d (визуальная строка, переместите одну строку вниз, перейдите к соответствующей паре, удалите.)

Ответ 3

Вы можете использовать этот ярлык, чтобы удалить не только функцию, но также линии между фигурными фигурными скобками, то есть код между операторами if-else, while, for loops и т.д.

Нажмите Shitf + v [появится в визуальном режиме] при запуске/окончании фигурной фигурной скобки.

Затем нажмите ] +} i.e ] + Shitf]. Если вы находитесь в начале скобки.

Затем нажмите [+ { i.e [+ Shitf [). Если вы находитесь в концевой скобке.

Затем DEL, чтобы удалить выбранные строки.

Ответ 4

Используйте этот простой способ

   1.Go to the function definition 
   2.dd  - delete function definition 
   3.d    -start delete operation 
   4.shift+5(%) - delete the lines between { to }

Ответ 5

Если вы хотите установить плагины, vim-textobj-function предоставит вам vif для Visual select Inside Function и vaf для Visual select A Function.

daf удалит функцию, строку с подписью и тело функции ({})

Текстовый объект, определенный этим плагином, является более конкретным, и он не полагается на то, что тело функции является непрерывным блоком текста или { помещается в первый символ в строке.

Недостаток в том, что вы зависите от внешнего плагина.

Ответ 6

Самый простой и самый прямой способ заключается в следующем (работает в любом месте внутри функции):

v   enter visual mode
{   move to first brace in function (may have to press more than once)
o   exchange cursor from top to bottom of selection
}   extend selection to bottom of function
d   delete selected text

Полная последовательность команд будет v{o}d. Обратите внимание, что вы можете выполнять другие операции, кроме удаления, таким же образом. Например, чтобы скопировать функцию, используйте y (yank) вместо d.

Ответ 7

Если ваша функция разделена пустыми строками, просто введите:

dip

что означает "удалить внутренний абзац".

Ответ 8

не визуальный способ:

d/^}/e

... удалить, выполнив поиск } в строке beining, включая его для удаления.

без /e (не упоминается в вышеприведенных ответах), решение является неполным.

с /e - поиск идет до конца совпадения, поэтому включается закрывающая скобка, и команда хорошо подходит для yanking:

y/^}/e

Ответ 9

Другой способ - перейти к строке начала вашей функции и нажать: Vj% (или V%%, если ваш стиль помещает открытую фигурку в ту же строку). Это переводит вас в режим Visual-Line, и процент переводит вас в подходящую закрывающую фигуру. Во втором стиле первый% переносит вас в открывающую фигуру на выбранной линии, а второй - на подходящую закрывающую фигуру.

Также работает для круглых скобок, скобок, многострочных комментариев в стиле C и препроцессорных директив.

Подробнее см. в руководстве.

Ответ 10

Предварительное условие: быть где-то внутри функции. Перейти к предыдущей закрывающей фигурной скобке в первой строке, используя

[]

Затем удалите до следующей закрывающей фигурной скобки в первой строке, используя

d][