Как вы выбираете полное определение функции PHP?

В PHP, если у меня есть такая функция, как:

function test($b) {

  var $a = 0;

  while ($a < b) {
    $a += 3;
  }

  return $a;
}

и курсор находится в строке $a += 3, можно ли быстро выбрать целую функцию?

"v2aB" будет выбирать все, включая фигурные скобки функции, но не объявление function test($b)

Ответ 1

Нажмите V после команды выбора, которую вы публикуете, чтобы преобразовать выделение в выбор строки, и он выберет объявление функции:

V 2 a B V

Ответ 2

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

nnoremap vaf ?func.*\n*\s*{<cr>ma/{<cr>%mb`av`b
vmap af o<esc>kvaf

Первое сопоставление "Визуальная вокруг функции" или vaf вернется к началу определения функции, независимо от того, что { находится в той же строке или следующей, и даже если это лямбда функции и визуально выберите его по-символу для его окончания. Это работает в PHP, Javascript и Go.

Затем пользователь может нажать V, чтобы перейти к режиму выбора линии, если она захочет.

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

function show_video_server(v_server) {
  // this whole function should get selected
  var something = function(){ /* this function gets selected */ };
  //   |   the cursor is here when I type "vaf"
}

В качестве обходного пути я использую второе отображение: vmap af o<esc>kvaf. Это похоже на повторение или расширение отбора. На самом деле это отказ от выбора и переход к линии перед ним, а затем попытка его агана. Если "большая" функция использует несколько лямбда-функций, пользователь должен несколько раз повторить af, чтобы достичь большой.

Обычно vaf достаточно. Иногда требуется vaf af или vaf af af. Во всяком случае, это ближе всего к тому, что я хотел, поэтому это версия, которую я использую.

Ответ 3

Здесь отображение, похоже, работает очень хорошо, независимо от уровня гнездования.

:map t ? function <CR>f{vaBV

Ответ 4

Вот еще один метод, который будет работать, если вы включили фальсификацию на уровне функции: z c v

Это закрывает текущую складку и выбирает ее, но оставляет ее закрытой. Если вы хотите, чтобы он оставался открытым: z c v $

Если у вас включена блокировка блочного уровня, вам придется закрыться дважды, так как вы находитесь внутри цикла while, поэтому: 2 z c v

Чтобы включить свертывание класса PHP/функции: let php_folding = 1

Ответ 5

простой способ

nmap vaf va}V

Мне это нравится

nmap vaf [{?function<CR>:nohl<CR>vf{]}

if '{находится в новой строке

nmap vaF [{?function<CR>:nohl<CR>v/{<CR>]}

Ответ 6

Еще один способ. Это должно выбрать полное определение функции независимо от позиции вашего курсора в определении, а не только в строке $a += 3.

Используйте это в нормальном режиме (<CR> означает нажмите клавишу ввода)

?func<CR>V/{%

Объяснение каждой части:

  • ?func искать назад для слова "func" (идея состоит в том, чтобы перейти к первой строке определения функции)
  • V перейти в режим визуальной линии.
  • /{ поиск вперед для открытой фигурной скобки (я не использовал f{, потому что открывающая скобка может находиться в отдельной строке)
  • % перейти к соответствующей скобе