Ah a dream come true. Finally I figured out how to remap the up and down cursor motion keys (one set anyway - p and n) to be the beloved vi keys. This means that if there was something that j or k did, they don’t do it anymore. J was "jump" - I don’t know what that was so I probably won’t miss it. I don’t think that k did much of anything. This is the source code that needed to be edited to get all this to work well.

In mailpart.c look at lines marked x-→'j or k':

mailpart.c
/* cxe- Check out the P and N which I remap to vi keys. Yea! */
static struct key att_index_keys[] =
       {HELP_MENU,
        OTHER_MENU,
        {"<",NULL,{MC_EXIT,2,{'<',','}},KS_EXITMODE},
        {">","[View]",{MC_VIEW_ATCH,5,{'v','>','.',ctrl('M'),ctrl('J')}},
          KS_VIEW},
x-->'k' {"P", "PrevAttch",{MC_PREVITEM,4,{'p',ctrl('B'),'k',KEY_UP}},
          KS_PREVMSG},
        {"N", "NextAtch",
x-->'j'  {MC_NEXTITEM, 5, {'n','\t',ctrl('F'),'j', KEY_DOWN}},
         KS_NEXTMSG},
/* Lots more..... */

And there is this from pine.h:

pine.h
/* cxe- I took this out and replaced it with what follows-
#define PREVMSG_MENU    {"P", "PrevMsg", \
                         {MC_PREVITEM, 1, {'p'}}, \
                         KS_PREVMSG}
#define NEXTMSG_MENU    {"N", "NextMsg", \
                         {MC_NEXTITEM, 1, {'n'}}, \
                         KS_NEXTMSG}
*/
#define PREVMSG_MENU    {"P", "PrevMsg", \
                         {MC_PREVITEM, 2, {'p','k'}}, \
                         KS_PREVMSG}
#define NEXTMSG_MENU    {"N", "NextMsg", \
                         {MC_NEXTITEM, 2, {'n','j'}}, \
                         KS_NEXTMSG}