Ответ 1
Нажмите V после команды выбора, которую вы публикуете, чтобы преобразовать выделение в выбор строки, и он выберет объявление функции:
V 2 a B V
В PHP, если у меня есть такая функция, как:
function test($b) {
var $a = 0;
while ($a < b) {
$a += 3;
}
return $a;
}
и курсор находится в строке $a += 3
, можно ли быстро выбрать целую функцию?
"v2aB" будет выбирать все, включая фигурные скобки функции, но не объявление function test($b)
Нажмите V после команды выбора, которую вы публикуете, чтобы преобразовать выделение в выбор строки, и он выберет объявление функции:
V 2 a B V
Прошло много времени с тех пор, как этот вопрос был задан и ответил, но я добавлю свой собственный ответ, потому что он тот, который я искал, и никто из других не работает точно так же, как этот:
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
. Во всяком случае, это ближе всего к тому, что я хотел, поэтому это версия, которую я использую.
Здесь отображение, похоже, работает очень хорошо, независимо от уровня гнездования.
:map t ? function <CR>f{vaBV
Вот еще один метод, который будет работать, если вы включили фальсификацию на уровне функции: z
c
v
Это закрывает текущую складку и выбирает ее, но оставляет ее закрытой. Если вы хотите, чтобы он оставался открытым: z
c
v
$
Если у вас включена блокировка блочного уровня, вам придется закрыться дважды, так как вы находитесь внутри цикла while, поэтому: 2
z
c
v
Чтобы включить свертывание класса PHP/функции: let php_folding = 1
простой способ
nmap vaf va}V
Мне это нравится
nmap vaf [{?function<CR>:nohl<CR>vf{]}
if '{находится в новой строке
nmap vaF [{?function<CR>:nohl<CR>v/{<CR>]}
Еще один способ. Это должно выбрать полное определение функции независимо от позиции вашего курсора в определении, а не только в строке $a += 3
.
Используйте это в нормальном режиме (<CR>
означает нажмите клавишу ввода)
?func<CR>V/{%
Объяснение каждой части:
?func
искать назад для слова "func" (идея состоит в том, чтобы перейти к первой строке определения функции)V
перейти в режим визуальной линии./{
поиск вперед для открытой фигурной скобки (я не использовал f{
, потому что открывающая скобка может находиться в отдельной строке)%
перейти к соответствующей скобе