nin*_*alj 32
xterm终端仿真器定义了一些控制序列以进行鼠标跟踪,您可以在文档ctlseqs中的鼠标跟踪部分中了解有关它们的更多信息,以便进行xterm分发.如果你安装了xterm,你可能会有一个副本或类似的路径./usr/share/doc/xterm/ctlseqs.txt.gz
在X Window系统上运行的大多数终端仿真器(例如:Konsole,gnome-terminal,eterm,...)至少了解其中一些控制序列.如果你想直接在Linux的一个虚拟终端上使用它们,你可能需要运行它们gpm(8).
有几个控制序列可用于启用和禁用鼠标移动报告:
控制序列CSI ? number h用于启用和CSI ? number l禁用.CSI是或者是ESC [角色0x9b.所以,您可以按如下方式使用它们:
echo -e "\e[?1000h"
Run Code Online (Sandbox Code Playgroud)
然后,您将按下按钮获得一堆字符,请参阅ctlseqs或console_codes(4)了解详细信息.然后,您可以禁用鼠标跟踪:
echo -e "\e[?1000l"
Run Code Online (Sandbox Code Playgroud)
不幸的是,以前的鼠标报告模式只能处理最多223(255 - 32)的坐标,或者在某些情况下95(127 - 32).因此,有一些新的开关可以更改报告鼠标坐标的格式:
应用程序的一个好策略是启用鼠标报告,然后(可选地请求urxvt 1015模式然后)请求SGR 1006模式.应用程序应处理新旧鼠标报告响应,以继续处理终端仿真器而不支持新模式.
有关新报告模式的更多信息,请访问:
NVR*_*VRM 12
基于这里给出的宝贵信息,并经过一些挖掘。
我们可以捕捉鼠标按下和释放、滚轮移动和侧面、中间点击(滚轮点击)和位置。没有右键。
以下只是php中的一个例子,作为cli使用。它隐藏了终端上打印的动作,并在退出时正确设置。
它足够冗长,可以适应任何能够读取STDIN并打印到STDOUT 的编程语言,所以肯定是一个很大的列表!
#!/usr/bin/php
<?php
system("stty -icanon"); // Enable shell input
system("stty -echo"); // Disable characters printing
echo "\e[?1003h\e[?1015h\e[?1006h"; // Mouse trap all, urxvt, SGR1006
function shutdown(){ // Cleaning before quiting
echo "\e[?1000l"; // Disable mouse trap
system("stty echo"); // Enable back characters printing
exit; // Cleaned, quit
}
register_shutdown_function("shutdown"); // Handle regular END of script
declare(ticks = 1); // Allow posix signal handling
pcntl_signal(SIGINT,"shutdown"); // Catch SIGINT (CTRL+C)
$KEY = "";
while ($KEY = fread(STDIN,16)) {
$e = explode(";",explode("<",$KEY)[1]);
if ($e[0] === "0" && substr($e[2],-1) === "M"){
echo "BUTTON DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "0" && substr($e[2],-1) === "m"){
echo "BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "64"){
echo "WHEEL SCROLL UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "65"){
echo "WHEEL SCROLL DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "1" && substr($e[2],-1) === "M"){
echo "WHEEL BUTTON DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "1" && substr($e[2],-1) === "m"){
echo "WHEEL BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "35"){
echo "MOUSE MOVE, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
}
Run Code Online (Sandbox Code Playgroud)
我制作了一个脚本来使命令行光标在鼠标单击时移动:
可以在这里找到:https : //github.com/tinmarino/mouse_xterm/blob/master/mouse.sh
Xterm 具有鼠标跟踪功能
echo -e "\e[?1000;1006;1015h" # Enable tracking
echo -e "\e[?1000;1006;1015l" # Disable tracking
Run Code Online (Sandbox Code Playgroud)
\e[<0;3;21M和一个释放\e[<0;3;21。2x(从左)和22y(从上) 在哪里\e[<64;3;21M\e[<65;3;21MC-v启用鼠标跟踪后按以查看Readline 可以触发 bash 回调
bind -x '"\e[<64;": mouse_void_cb' # Cannot be put in .inputrc
bind '"\C-h" : "$(date) \e\C-e\ef\ef\ef\ef\ef"' #Can be put in .inputrc
Run Code Online (Sandbox Code Playgroud)
Readline 可以调用多个函数
# Mouse cursor to begining-of-line before calling click callback
bind '"\C-98" : beginning-of-line'
bind -x '"\C-99" : mouse_0_cb'
bind '"\e[<0;": "\C-98\C-99"'
Run Code Online (Sandbox Code Playgroud)
Readline 回调可以使用READLINE_POINT环境变量更改光标(点)位置
bind -x '"\C-h" : xterm_test'
function xterm_test {
echo "line is $READLINE_LINE and point $READLINE_POINT"
READLINE_POINT=24 # The cursor position (0 for begining of command)
READLINE_LINE='coco' # The command line current content
}
Run Code Online (Sandbox Code Playgroud)
bash 不知道任何有关鼠标或鼠标点击的信息。默认情况下没有光标或类似的东西。
您可以安装“通用鼠标服务器”。看看这个: http: //www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html 例如,在控制台内使用复制和粘贴。也许您可以使用这些工具来处理您的 bash 脚本。
...但是:bash-shell 没有本机鼠标支持
| 归档时间: |
|
| 查看次数: |
18249 次 |
| 最近记录: |