Прошло много времени с тех пор, как на этот вопрос был задан и дан ответ, но я добавлю свой собственный ответ, потому что это тот, который я искал, и ни один из остальных не работает точно так же, как этот:
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
. В любом случае, это самое близкое, что я мог получить к тому, что хотел, так что это версия, которую я использую.