Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

map <c-j:i> editText run="auto,forward,line" #386

Closed
bommbo opened this issue Jul 8, 2021 · 23 comments
Closed

map <c-j:i> editText run="auto,forward,line" #386

bommbo opened this issue Jul 8, 2021 · 23 comments

Comments

@bommbo
Copy link

bommbo commented Jul 8, 2021

非常抱歉,我不是很懂这个的含义?我想请教一下,这个的意思是编辑的时候,光标下到下一行?还是搜索框中autocomplete部分向下选择?

@gdh1995
Copy link
Owner

gdh1995 commented Jul 8, 2021

光标向下一行。auto 表示如果当前选择了一段文字,就把选区往下扩/缩一行,否则就是移动光标;forward表示向右/向下(目前没测试过对”自右向左的语言“的支持,暂只考虑自左向右);line表示距离是一行。

auto 可以换成 modifyextend,分别对应 https://developer.mozilla.org/en-US/docs/Web/API/Selection/modifyhttps://developer.mozilla.org/en-US/docs/Web/API/Selection/extend

auto 还可以换成 exec ( https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand ), collapse ( https://developer.mozilla.org/en-US/docs/Web/API/Selection/collapse ) 和 replace ( https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setRangeText ).

第一个逗号后边的是命令参数。多条命令的话需要每个命令都是 3 个单词长,比如 replace,name,new-name,auto,forward,line .

移动搜索框的话需要模拟键盘按键的上下键,目前没做这个功能。

@bommbo
Copy link
Author

bommbo commented Jul 8, 2021

光标向下一行。auto 表示如果当前选择了一段文字,就把选区往下扩/缩一行,否则就是移动光标;forward表示向右/向下(目前没测试过对”自右向左的语言“的支持,暂只考虑自左向右);line表示距离是一行。

auto 可以换成 modifyextend,分别对应 https://developer.mozilla.org/en-US/docs/Web/API/Selection/modifyhttps://developer.mozilla.org/en-US/docs/Web/API/Selection/extend

auto 还可以换成 exec ( https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand ), collapse ( https://developer.mozilla.org/en-US/docs/Web/API/Selection/collapse ) 和 replace ( https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setRangeText ).

第一个逗号后边的是命令参数。多条命令的话需要每个命令都是 3 个单词长,比如 replace,name,new-name,auto,forward,line .

移动搜索框的话需要模拟键盘按键的上下键,目前没做这个功能。

好的,感谢解答,因为我看到https://github.com/Miaonster/InputCtrlN,这个项目是支持模拟键盘上下键的,但是支持的不是很好,谷歌油管还可以。国内的网站就大多不行了。我还以为你这个可能是这个功能呢,非常感谢解答。

@gdh1995
Copy link
Owner

gdh1995 commented Jul 8, 2021 via email

@bommbo
Copy link
Author

bommbo commented Jul 8, 2021

还可以这样???大佬。那我提两个小建议。第一个搜索框能模拟上下键吗?第二个微博更新后,“展开“ ”收起“ 无法选中了,能增加选中吗?谢谢。

@gdh1995
Copy link
Owner

gdh1995 commented Jul 9, 2021

第二个设计上可以,不过 v1.90.2 有bug。

设计上用法是:

env weibo host="https://weibo.com/"
map f runKey expect="weibo:<v-weibo_f>" keys="<v-f>"
map <v-f> LinkHints.activate
map <v-weibo_f> LinkHints.activate clickable=".expand,.collapse"

v1.90.2的 bug 会导致 expect 的检查被反过来执行,详见 #366 (comment) ,最新代码已经修了这个问题,测试版本在 #366 (comment)

@gdh1995
Copy link
Owner

gdh1995 commented Aug 17, 2021

Hello, v1.92 has been published on Firefox and Chrome stores, and you may take a try.

V1.92 修复了 runKey 的一些问题,还增加了快捷写法: https://github.com/gdh1995/vimium-c/wiki/Auto-run-a-tree-of-commands

模拟上下键这个在开发中。

gdh1995 added a commit that referenced this issue Aug 18, 2021
@bommbo
Copy link
Author

bommbo commented Aug 19, 2021

Hello, v1.92 has been published on Firefox and Chrome stores, and you may take a try.

V1.92 修复了 runKey 的一些问题,还增加了快捷写法: https://github.com/gdh1995/vimium-c/wiki/Auto-run-a-tree-of-commands

模拟上下键这个在开发中。

微博上测试结果良好。那个快捷键的需求我暂时没有,我测试了下,满好用的。

@bommbo
Copy link
Author

bommbo commented Aug 19, 2021

其实模拟上下键这个想法是因为我发现linux下有emacs输入。不管是终端下的zsh vim emacs firefox chromium还是rime。都能使用emacs 相关的快捷键,比方说ctrl+h 代表删除,ctrl+n ctrl+p 代表上下选择,而且chromium本来是有相关配置的,但是统统失效了。大神如果把这个恢复了,我的手真的舒服很多。

@gdh1995
Copy link
Owner

gdh1995 commented Aug 19, 2021

参考 https://github.com/gdh1995/vimium-c/wiki/Map-a-key-to-different-commands-on-different-websites ,就是根据当前键盘焦点下的元素不同,调用 editText 来执行 document.execCommand 或者 scrollSelect 命令。但是 搜索引擎的这类搜索建议都是自己画的,而不是标准 <select>元素,所以不能用 scrollSelect ,需要等下一版 v1.92.2 里的 dispatchEvent 自己编触发流程。

补充: 像你说的删除、移动光标,这些在Chrome里 execCommand 都能做到,只要是键盘焦点在标准的文本框里就行。但是有的富文本编辑器就不一定了,execCommand 肯定不行,而dispatchEvent模拟事件也不一定被某些网站接受。所以最省事的办法是,你找个软件,在整个图形界面环境的级别里设置快捷键映射,比如什么什么映射到向下方向键。

另外,v1.92.2 正在被审核,一般过几天就能用了。

@bommbo
Copy link
Author

bommbo commented Aug 19, 2021

参考 https://github.com/gdh1995/vimium-c/wiki/Map-a-key-to-different-commands-on-different-websites ,就是根据当前键盘焦点下的元素不同,调用 editText 来执行 document.execCommand 或者 scrollSelect 命令。但是 搜索引擎的这类搜索建议都是自己画的,而不是标准 <select>元素,所以不能用 scrollSelect ,需要等下一版 v1.92.2 里的 dispatchEvent 自己编触发流程。

补充: 像你说的删除、移动光标,这些在Chrome里 execCommand 都能做到,只要是键盘焦点在标准的文本框里就行。但是有的富文本编辑器就不一定了,execCommand 肯定不行,而dispatchEvent模拟事件也不一定被某些网站接受。所以最省事的办法是,你找个软件,在整个图形界面环境的级别里设置快捷键映射,比如什么什么映射到向下方向键。

另外,v1.92.2 正在被审核,一般过几天就能用了。

我映射过阅读器类的,当时觉得用起来比较统一,但现在我只想保障常用的几个软件用起来舒服就好,像qutebrowser,这个浏览器就是能够在文本框内用ctrl+n ctrl+p 代替上下选择,甚至像b站上的漫画区,它甚至可以直接用 h l 键 直接代替 左右键。我不想用特别复杂的配置了,有合适的就用,没合适的就算,也没这方面技术。

@gdh1995
Copy link
Owner

gdh1995 commented Aug 27, 2021

v1.92.3 开始支持模拟键盘事件,v1.92.4 改进了语法,Firefox上已经可以用了:

env select element="select"
env textarea element="textarea"
env gs host=":https://www.google.com/search"
map <c-j:i> runKey expect="textarea:j1,select:j2,gs:ad+-ad" keys="jf"
map <c-k:i> runKey expect="textarea:-j1,select:-j2,gs:au+-au" keys="-jf"
map <v-j1> editText run="auto,count,line"
map <v-j2> scrollSelect
map <v-ad> dispatchEvent type="keydown" key="ArrowDown" code="ArrowDown" \
  keyCode=40 which=40
map <v-au> dispatchEvent type="keydown" key="ArrowUp" code="ArrowUp" \
  keyCode=38 which=38
map <v-jf> editText run="auto,count,character"

要注意的是,上述映射规则要求没有映射过 j1, j2, ad, au, jf 这类键,如果你映射过,那expect里就会触发你的映射,而不是把j1视为<v-j1>的缩写。

env gs用来判断是否在Google搜索结果页面,也可以写成 ^ 开头的正则表达式来判断多种搜索结果。

envelement 参数只支持 ID、classList、tagName 三个属性,按CSS语法拼起来就行,暂不支持其它 attributes。

@bommbo
Copy link
Author

bommbo commented Sep 3, 2021

有例子吗?我这正则表达式写得稀烂。比方说说百度,谷歌,b站 这三个要搜索的话,要写成什么样式的?

@gdh1995
Copy link
Owner

gdh1995 commented Sep 3, 2021

那就直接用|吧,比如 host="^https://(www\\.baidu\\.com/s|www\\.google\\.com/search|search\\.bilibili\\.com/)\\b"

@bommbo
Copy link
Author

bommbo commented Sep 3, 2021

我照着抄都没用??但是单个网址就没事

@gdh1995
Copy link
Owner

gdh1995 commented Sep 3, 2021 via email

@bommbo
Copy link
Author

bommbo commented Sep 3, 2021

谢谢哈,这个功能我期待了好久

@bommbo
Copy link
Author

bommbo commented Sep 4, 2021

我觉得这个问题可以关闭了,我今天试了一下或运算,证明这个设计非常好。env gs host= "https://www.baidu.com" || "https://www.google.com/" || "https://www.bilibili.com/" 这样就可以了。

@gdh1995
Copy link
Owner

gdh1995 commented Sep 4, 2021 via email

@bommbo
Copy link
Author

bommbo commented Sep 4, 2021

我测试了微博,百度,谷歌

@gdh1995
Copy link
Owner

gdh1995 commented Sep 4, 2021

上边那个正则是我忘了在github的markdown这一层做转义,被吞了反斜杠。正确写法是要两个反斜杠一起写:

env gs host="^https://(www\\.baidu\\.com/s|www\\.google\\.com/search|search\\.bilibili\\.com/)\\b"

@bommbo
Copy link
Author

bommbo commented Sep 4, 2021

测试可以使用

@gdh1995
Copy link
Owner

gdh1995 commented Sep 4, 2021

|| 这个绝对是从来没支持过,但是如果把你写的看成一个“正则”,那它会匹配“任意空的子字符串”,也就是匹配任意字符串,于是这个env会始终匹配上。相当于放弃了在 input 里执行<v-jf>的需求。

看起来好像也挺合理的,单行文本框里模拟向下多数时候就是要滚行。

@bommbo
Copy link
Author

bommbo commented Sep 5, 2021

我觉得支持也不错,写起来还挺简单的,多谢大佬开发这个功能,那我就关闭这个问题了。

@bommbo bommbo closed this as completed Sep 5, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants