Как вы выбираете полное определение функции PHP? - PullRequest
10 голосов
/ 16 декабря 2009

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

function test($b) {

  var $a = 0;

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

  return $a;
}

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

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

Ответы [ 6 ]

10 голосов
/ 16 декабря 2009

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

v 2 а B V

5 голосов
/ 17 марта 2014

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

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 голосов
/ 16 декабря 2009

Вот отображение, которое, кажется, работает очень хорошо, независимо от уровня вложенности.

:map t ? function <CR>f{vaBV
1 голос
/ 07 марта 2012

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

nmap vaf va}V

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

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

если ‘{’ находится в новой строке

nmap vaF [{?function<CR>:nohl<CR>v/{<CR>]}
1 голос
/ 19 декабря 2009

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

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

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

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

0 голосов
/ 08 октября 2015

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

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

?func<CR>V/{%

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

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