ユーザーがctrl + cを押したときにコマンドを実行する方法は?

ユーザーがctrl + cを押したときにコマンドを実行する方法は?

ユーザーはテキストを選択してCtrl + Cを押します。commandこの操作の後、どのように自動的に実行できますか?

次の解決策が必要です。

  1. クリップボードの状態に関する通知/確認方法
  2. 通知/確認後、コマンドは自動的に実行されます。

わかりません。

ベストアンサー1

X11クリップボードを監視できます。これは、コンソールのコピーと貼り付け、tmux、またはその他の機能ではなく、X11でのみ機能します。したがって、移植性が疑わしい場合があり、必要に応じて3つのクリップボードをすべて監視する必要があるかもしれません。

    // whenclipchange.c

    // Run something when a X11 clipboard changes. Note that PRIMARY tends
    // to be the traditional default, while certain software instead uses
    // CLIPBOARD for I don't know what incompatible reason. There is also
    // SECONDARY to make your life more interesting.
    #define WHATCLIP "PRIMARY"
    
    #include <sys/wait.h>
    
    #include <assert.h>
    #include <err.h>
    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #include <X11/Xlib.h>
    #include <X11/extensions/Xfixes.h>
    
    void WatchSelection(Display *display, Window window, const char *bufname,
                        char *argv[]);
    
    int
    main(int argc, char *argv[])
    {
    #ifdef __OpenBSD__
        if (pledge("exec inet proc rpath stdio unix", NULL) == -1)
            err(1, "pledge failed");
    #endif
    
        if (argc < 2) err(1, "need a command to run");
        argv++; // skip past command name of this program
    
        Display *display    = XOpenDisplay(NULL);
        unsigned long color = BlackPixel(display, DefaultScreen(display));
        Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),
                                            0, 0, 1, 1, 0, color, color);
        WatchSelection(display, window, WHATCLIP, argv);
        /* NOTREACHED */
        XDestroyWindow(display, window);
        XCloseDisplay(display);
        exit(EXIT_FAILURE);
    }
    
    void
    WatchSelection(Display *display, Window window, const char *bufname,
                   char *argv[])
    {
        int event_base, error_base;
        XEvent event;
        Atom bufid = XInternAtom(display, bufname, False);
    
        assert(XFixesQueryExtension(display, &event_base, &error_base));
        XFixesSelectSelectionInput(display, DefaultRootWindow(display), bufid,
                                   XFixesSetSelectionOwnerNotifyMask);
        while (1) {
            XNextEvent(display, &event);
            if (event.type == event_base + XFixesSelectionNotify &&
                ((XFixesSelectionNotifyEvent *) &event)->selection ==
                  bufid) {
                pid_t pid = fork();
                if (pid < 0) err(1, "fork failed");
                if (pid) {
                    // NOTE this will block until the
                    // command finishes... so it might miss
                    // clipboard events?
                    int status;
                    wait(&status);
                } else {
                    execvp(*argv, argv);
                    exit(EXIT_FAILURE);
                }
            }
        }
    }

次のようにコンパイルして実行します。

$ cc -std=c99 -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lXft -lXfixes -o whenclipchange whenclipchange.c
$ ./whenclipchange echo clipboard changed

おすすめ記事