osfans / trime

同文安卓輸入法平臺3.x/Android-rime/Rime Input Method Engine for Android
http://osfans.github.io/trime/
GNU General Public License v3.0
3.09k stars 372 forks source link

能否提供ctrl lock和alt lock? #688

Open Schezuk opened 2 years ago

Schezuk commented 2 years ago

输入法的ctrl组合键只能预设,无法通过按ctrl再按对应字母或者同时按下输入,请问能否提供这样的lock? 另外shift_R没有对应的名称和功能,请问是什么原因?

zhin2929 commented 2 years ago

shift_R 好像是电脑键盘上的右边shift键

Schezuk commented 2 years ago

shift_R 好像是电脑键盘上的右边shift键

我是说没反应,没label,不知道默认绑定了什么

iovxw commented 2 years ago

https://github.com/iovxw/my-trime/commit/20e03f7cf7e504446bdf4d520da43bddd9e183de

功能键的 lock 我这里有个实现了一半的,但是是破坏性变动,不兼容现在的配置文件

如果我找到了保持兼容性实现方式可能会 PR 过来

iovxw commented 2 years ago

关于破坏性变动的原因:

这是一个设计上的问题,首先要说明一下现在 trime 对于按键锁定的实现

现在的 trime 的按键有一个特殊的 shift_lock 字段,它可以且仅可以应用于 Shift 键

然后它有几个值

这个设计的问题是:

  1. 仅能用于 Shift(也是这个 issue 提出的问题)
  2. 它对于触发锁定的操作是特殊处理的,和普通按键不走一套逻辑
    • 比如一个按键长按后触发的行为应该是通过 long_click 定义的,和它的 long 冲突,减少了可维护性和增加了学习成本(用户可能搞不清楚这个长按操作是哪里定义的)
  3. 没有无锁定模式
    • 比如用户按下 Shift,就只是想发送一个 Shift 键给程序,不是要按什么组合键

如果要解决问题 1,最好同时解决问题 2 3,不然以后可能需要引入额外的破坏性变更


所以上面的实现新加了一个 lock 替换 shift_lock,去掉了锁定方式的控制

将原有的定义:

Shift_L: {label: Shift, send: Shift_L, shift_lock: long}

切分成了:

Shift_L: {label: Shift, send: Shift_L, lock: false}
CapsLock: {label: Caps, send: Shift_L, lock: true}

然后一个单按锁定一次,长按一直锁定的 Shift 键的实现变成了这样:

{click: Shift_L, long_click: CapsLock}

但这里也有一个问题,要完全模拟 ascii_long 的显示与行为,需要一些“花招”

比如通过使用 ascii,可以实现一个行为近似,但样式不同的 ascii_long

{ascii: Shift_L, click: CapsLock, long_click: CapsLock}

这是英文下的效果:

image

这是中文的:

image

有两个 Caps

要想隐藏只能定义一个 label 为空的 CapsLock (或许本来就应该这样定义?)

InvisibleCapsLock: {label: "", send: Shift_L, lock: true}
{ascii: Shift_L, click: CapsLock, long_click: InvisibleCapsLock}

以及在中文模式下,long_click 的行为和 click 重复,虽然不会有操作上的区别,但强迫症还是蛮难受的


然后是问题 3

现在 trime 对于一个键是否可以锁定,是先判断这是哪个键,再判断锁定的模式

比如 tongwenfeng 里对 Shift_L 的定义里没有规定 shift_lock,但它仍然会锁定

如果把 ctrl 和 alt 加入可以锁定键的列表内,会和现在 ctl alt 键的行为冲突,造成另一个破坏性变动

我觉得比较合适的设计是根据按键是否有 lock 或者 shift_lock 字段来决定是否启用锁定,如果没有那就当它是一个普通按键

但这也是一个破坏性变动


最后要做的选择就是:

  1. 是否使用问题 2 的解决方案?还是像现在 shift_lock 这样,增加 ctrl_lockalt_lock
  2. 是否使用问题 3 的解决方案?还是针对 ctrl alt 默认行为做特殊处理,保持兼容性
Lak4CYUT commented 2 years ago

@iovxw 跟我想解決的問題很像,但我想做到的不是大小寫,而是如同真實鍵盤一樣的 shift (輸出副標),畢竟長按實在不是比較習慣的操作。不過我目前也找不到好的辨法來做到這件事....尤其是在 ASCII 模式下,能做的事情又更少了..

Freed-Wu commented 1 year ago

然后一个单按锁定一次,长按一直锁定的 Shift 键的实现

有没有可能像谷歌输入法一样,单按锁定一次Shift, 快速按2次一直锁定(CapsLock)?

controlledentropy commented 1 year ago

然后一个单按锁定一次,长按一直锁定的 Shift 键的实现

有没有可能像谷歌输入法一样,单按锁定一次Shift, 快速按2次一直锁定(CapsLock)?

现在甚至完全没有把双击操作提上日程,感觉开发基本已经实质性停滞了。