사용자가 ctrl+c를 누를 때 명령을 실행하는 방법은 무엇입니까?

사용자가 ctrl+c를 누를 때 명령을 실행하는 방법은 무엇입니까?

사용자는 텍스트를 선택하고 Ctrl+C를 누릅니다. command이 작업 후에 어떻게 자동으로 실행할 수 있나요?

다음 솔루션이 필요합니다.

  1. 클립보드 상태에 대한 알림/확인 방법
  2. 알림/확인 후 명령이 자동으로 실행됩니다.

나는 모른다.

답변1

X11 클립보드를 모니터링할 수 있습니다. 이것은 콘솔 복사 및 붙여넣기, tmux 또는 기타 기능이 아닌 X11에서만 작동합니다. 따라서 이식성이 의심스러울 수 있으며 필요에 따라 세 개의 클립보드를 모두 모니터링해야 할 수도 있습니다.

    // 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

관련 정보