首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zsh zle如何防止变量游标在运行时被任意修改?

zsh zle如何防止变量游标在运行时被任意修改?
EN

Stack Overflow用户
提问于 2020-08-25 13:30:52
回答 1查看 78关注 0票数 1

正如the document所说,zle变量游标只能在[0, $#BUFFER]范围内。

测试代码(放入.zshrc,^[OP为F1):

代码语言:javascript
复制
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是如何实现的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-08 21:45:01

Zsh值是在CURSOR的源代码中处理的,源代码是用C编程语言https://github.com/zsh-users/zsh/blob/3c93497eb701d8f220bc32d38e1f12bfb534c390/Src/Zle/zle_params.c#L266实现的

您无法在Zsh shell代码中声明类似的约束变量。

但是,您可以为它编写一个数学函数:

代码语言:javascript
复制
# 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($1,$_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

然后,您可以使用以下语法在算术语句中使用这些语句:

代码语言:javascript
复制
❯ print $(( get_test() ))
0

❯ (( set_test(100) ))

❯ print $(( get_test() ))
10

但也可以在其他上下文中使用此语法:

代码语言:javascript
复制
❯ set_test -1

❯ get_test; print $?
0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63572571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档