项目使用了ishell,而要求能在数据量较大时,能分页显示,ishell自带ShowPaged函数可以分页显示,但是我想做到识别当前终端软件窗口的长宽大小,再判断是否需要进行分页显示。
根据查找资料,了解到,Linux下支持通过 $LINES 和 $COLUMNS 获取高宽;
[root@ ~]# echo $COLUMNS
80
[root@ ~]# echo $LINES
24
windows下是用mode con | find “Columns”,可能是汉字,如下:
C:\Users\hp>mode con
设备状态 CON:
---------
行: 9001
列: 120
键盘速度: 31
键盘延迟: 1
代码页: 936
因此考虑去获取Linux下的环境变量,使用os.Getenv获取。但是,
package main
import (
"fmt"
"os"
)
func main() {
var JAVAHOME string
JAVAHOME = os.Getenv("JAVA_HOME")
fmt.Println(JAVAHOME)
var LINES string
LINES = os.Getenv("LINES")
fmt.Println(LINES)
var COLUMNS string
COLUMNS = os.Getenv("COLUMNS")
fmt.Println(COLUMNS)
var GOROOT string
GOROOT = os.Getenv("GOROOT")
fmt.Println(GOROOT)
}
但是os.Getenv获取失败了,全都是空值,但是PATH能获取到值,原来必须要export了的变量才行(具体原因何在暂时没有细究)。另外,os.Getenv配套的函数是os.Setenv,用于自定义环境变量,因此一般是先os.Setenv再os.Getenv。
遂,考虑他法。
搜来搜去,看到最多的就是下面使用Syscall获取窗口大小的方法。
以下代码为简化版本。
package main
import (
"fmt"
"syscall"
"unsafe"
)
type window struct {
Row uint16
Col uint16
}
func terminalWindowSize() (window, error) {
win := window{0, 0}
res, _, err := syscall.Syscall(syscall.SYS_IOCTL,
uintptr(syscall.Stdin),
uintptr(syscall.TIOCGWINSZ), //此参数,不同的操作系统可能不一样,例如:TIOCGWINSZ_OSX
uintptr(unsafe.Pointer(&win)),
)
if int(res) == -1 {
return window{0, 0}, err
}
return win, nil
}
func main() {
res := getPageOfNum()
fmt.Println(res)
}
参考链接:
- ishell
https://github.com/abiosoft/ishell
- Golang在linux系统上获取terminal终端的宽度
https://www.jianshu.com/p/40b699dde53d
- 怎样读取windows和linux终端宽度?
https://studygolang.com/topics/4265/comment/12193
- Golang通过使用GetSystemMetrics获取系统的分辨率
https://www.perfcode.com/p/1544.html