Выбор полного определения функции в Vim
Я пробовал Vim для любой работы по редактированию текста почти неделю. Я хочу узнать самый быстрый способ выбора определения функции C.
Например, если у меня есть такая функция:
void helloworlds( int num )
{
int n;
for ( n = 0; n < num; ++n ) {
printf( "Hello World!\n" );
}
}
Как я могу удалить все определение, включая имя функции?
Ответы
Ответ 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][