首页 > golang 如何接收快捷键方式?

golang 如何接收快捷键方式?

想到这样一个需求:
在一个终端命令(如Linux服务器)程序进行中,想监听用户的快捷键,应对快捷键做一些动作.现在我可以对ctrl+c这种信号做一些判断,包括kill -10 这些信号做处理.但是否有办法接收更多的快捷方式.

如: 在一个多并发的程序进行中,监听用户的ctrl+p,就可以wait,暂停当前的过程,并且再通过询问,或者快捷键再决定是继续或者退出.

是否有好的办法,或者hacker的方式满足需求也行,先多谢!!!

PS: google到的是说跟terminal有很大关系,而且widnows的不好弄.
但我还是想两者都能支持,或者说接收两次ctrl+c才算是结束,一次是询问是否还有继续,如果继续就恢复,如果不继续就执行退出的相关操作. 不知道这个方式是否可行.(多线程的方式)
https://groups.google.com/forum/#!topic/golang-nuts/EyHBO-K_p8c


给一个极度 hack 的方案,不推荐真的这么做,但是是可以 work 的。主要做法就是用 stty 改变 /dev/tty 的设置,让程序可以立即读到 tty 的每一个字符的输入,同时禁用屏幕回显。

package main

import (
    "os"
    "os/exec"
    "fmt"
)                                                                                                                                                                                 

func main() {
    // set tty input buffer to 1 char and disable echo.
    // HACK: exec command twice to make sure it will work on both mac and linux.
    exec.Command("/bin/stty", "-f", "/dev/tty", "-icanon", "min", "1", "-echo").Run()
    exec.Command("/bin/stty", "-F", "/dev/tty", "-icanon", "min", "1", "-echo").Run()

    // read input directly from tty.
    f, e := os.Open("/dev/tty")

    if e != nil {
        panic("cannot open /dev/tty. error: " + e.Error())
    }   

    // a deadloop reading tty to demo concept.
    var buf [1]byte

    for {
        n, e := f.Read(buf[:])

        if e != nil || n == 0 { 
            break
        }   

        fmt.Printf("Got input: 0x%x\n", buf[0])
    }   
}

P.S. 执行完这个程序后记得手动执行 stty echo,要不然,嘿嘿〜

【热门文章】
【热门文章】