zsh zle 如何防止变量 CURSOR 在运行时被任意修改?
How zsh zle prevent variable CURSOR to be modified arbitrarily in runtime?
如the document所说,zle变量CURSOR只能在[0, $#BUFFER]
.
范围内
测试代码(放入.zshrc,^[OP
为F1):
testCursor() {
echo "\nOriginal C: $CURSOR"
BUFFER="a"
echo "Change Buffer: $CURSOR"
CURSOR=$((CURSOR+10))
echo "Force edit: $CURSOR"
CURSOR=100
echo "Force assign: $CURSOR"
}
zle -N testCursor
bindkey '^[OP' testCursor
CURSOR
在运行时满足它的范围定义,zsh-zle 是如何实现的?
CURSOR
值在Zsh的源代码中处理,用C编程语言实现:https://github.com/zsh-users/zsh/blob/3c93497eb701d8f220bc32d38e1f12bfb534c390/Src/Zle/zle_params.c#L266
您无法在 Zsh shell 代码中声明类似约束的变量。
但是,您可以为其编写一个数学函数:
# Declare a global integer.
typeset -gi TEST=0
# -H makes these hidden, that is, not listed automatically.
typeset -gHi _TEST_MIN=0 _TEST_MAX=10
# Load `min` and `max` functions.
autoload -Uz zmathfunc && zmathfunc
set_test() {
(( TEST = min(max(,$_TEST_MIN),$_TEST_MAX) ))
}
get_test() {
return $(( min(max($TEST,$_TEST_MIN),$_TEST_MAX) ))
}
# Declare `set_test` as a math function accepting exactly one numeric argument.
functions -M set_test 1
# Declare `get_test` as a math function accepting exactly zero arguments.
functions -M get_test 0
然后您可以在算术语句中使用它们,语法如下:
❯ print $(( get_test() ))
0
❯ (( set_test(100) ))
❯ print $(( get_test() ))
10
但在其他情况下,语法如下:
❯ set_test -1
❯ get_test; print $?
0
如the document所说,zle变量CURSOR只能在[0, $#BUFFER]
.
测试代码(放入.zshrc,^[OP
为F1):
testCursor() {
echo "\nOriginal C: $CURSOR"
BUFFER="a"
echo "Change Buffer: $CURSOR"
CURSOR=$((CURSOR+10))
echo "Force edit: $CURSOR"
CURSOR=100
echo "Force assign: $CURSOR"
}
zle -N testCursor
bindkey '^[OP' testCursor
CURSOR
在运行时满足它的范围定义,zsh-zle 是如何实现的?
CURSOR
值在Zsh的源代码中处理,用C编程语言实现:https://github.com/zsh-users/zsh/blob/3c93497eb701d8f220bc32d38e1f12bfb534c390/Src/Zle/zle_params.c#L266
您无法在 Zsh shell 代码中声明类似约束的变量。
但是,您可以为其编写一个数学函数:
# Declare a global integer.
typeset -gi TEST=0
# -H makes these hidden, that is, not listed automatically.
typeset -gHi _TEST_MIN=0 _TEST_MAX=10
# Load `min` and `max` functions.
autoload -Uz zmathfunc && zmathfunc
set_test() {
(( TEST = min(max(,$_TEST_MIN),$_TEST_MAX) ))
}
get_test() {
return $(( min(max($TEST,$_TEST_MIN),$_TEST_MAX) ))
}
# Declare `set_test` as a math function accepting exactly one numeric argument.
functions -M set_test 1
# Declare `get_test` as a math function accepting exactly zero arguments.
functions -M get_test 0
然后您可以在算术语句中使用它们,语法如下:
❯ print $(( get_test() ))
0
❯ (( set_test(100) ))
❯ print $(( get_test() ))
10
但在其他情况下,语法如下:
❯ set_test -1
❯ get_test; print $?
0