如何在 ST ie simple/suckless 终端上自定义按键绑定?

kla*_*aus 6 keyboard-shortcuts

这是我的相应部分config.h

/* Internal keyboard shortcuts. */
#define MODKEY Mod1Mask
#define TERMMOD (ControlMask|ShiftMask)

static Shortcut shortcuts[] = {
    /* mask                 keysym          function        argument */
    { XK_ANY_MOD,           XK_Break,       sendbreak,      {.i =  0} },
    { ControlMask,          XK_Print,       toggleprinter,  {.i =  0} },
    { ShiftMask,            XK_Print,       printscreen,    {.i =  0} },
    { XK_ANY_MOD,           XK_Print,       printsel,       {.i =  0} },
    { TERMMOD,              XK_Prior,       zoom,           {.f = +1} },
    { TERMMOD,              XK_Next,        zoom,           {.f = -1} },
    { TERMMOD,              XK_Home,        zoomreset,      {.f =  0} },
    { TERMMOD,              XK_C,           clipcopy,       {.i =  0} },
    { TERMMOD,              XK_V,           clippaste,      {.i =  0} },
    { TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
    { TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
};
Run Code Online (Sandbox Code Playgroud)

现在,该专栏的目的是什么argument

小智 4

第四列中的参数地址被传递给第三列中列出的函数。例如,请注意该zoom()函数如何在不同快捷方式的不同参数下列出两次。


Shortcut构成问题中数组的数据类型定义shortcuts[]为由x.c四个成员组成的结构:

typedef struct {
    uint mod;
    KeySym keysym;
    void (*func)(const Arg *);
    const Arg arg;
} Shortcut;
Run Code Online (Sandbox Code Playgroud)

Shortcut, ,的最后一个成员Arg被定义为st.h四个的并集:

typedef union {
    int i;
    uint ui;
    float f;
    const void *v;
} Arg;
Run Code Online (Sandbox Code Playgroud)

使用结构中联合成员的地址调用funcfrom的示例发生在from中,其中指向 a :Shortcutkeypress()x.cbpShortcut

if (ksym == bp->keysym && match(bp->mod, e->state)) {
    bp->func(&(bp->arg));
    ...
Run Code Online (Sandbox Code Playgroud)

利用此设置的具体示例可以在联合中使用zoom()浮动的地方看到。Arg根据您问题中的配置,arg->f在此功能中可以+1-1来增大或缩小字体大小:

void
zoom(const Arg *arg)
{
    Arg larg;

    larg.f = usedfontsize + arg->f;
    zoomabs(&larg);
}
Run Code Online (Sandbox Code Playgroud)