Zsh班次选择


5

如何使用shift来选择命令行的一部分(就像许多文本编辑器一样)?


外壳通常没有此功能。如果它可用,它可能更有可能由终端提供,但我不熟悉任何这样做。
丹尼斯威廉姆森

2
@Dennis Williamson令人惊讶的是,我对SO也有同样的评论。这是错的。Zsh在ZLE中实现选择(尽管有标记)。事实上命令行编辑几乎与终端无关......
Ugo

你问过使用班次。你没有问过如何一般地选择文本。
丹尼斯威廉姆森

Answers:


4

一种方法是

  1. 定义激活移位的动作键上的标记的新小部件,
  2. 重新定义所有操作小部件以在该区域上操作(如果有的话),和
  3. 重新定义所有默认动作窗口小部件以停用标记。

这是一个概念证明(for xterm),适用于:

  • Shift-Left并且Shift-Right:分别开始向左/右选择,
  • LeftRight:取消选择并分别向左/向右移动,
  • Delete:删除选择,如果有,否则光标下的字符。

通常的免责声明适用(可能有其他更好的方式,你的猫可能会吃你的烤面包机等)。

bindkey -e

function zle-line-init {
    marking=0
}
zle -N zle-line-init

function select-char-right {
    if (( $marking != 1 )) 
    then
        marking=1
        zle set-mark-command
    fi
    zle .forward-char
}
zle -N select-char-right

function select-char-left {
    if (( $marking != 1 )) 
    then
        marking=1
        zle set-mark-command
    fi
    zle .backward-char
}
zle -N select-char-left

function forward-char {
    if (( $marking == 1 ))
    then
        marking=0
        NUMERIC=-1 zle set-mark-command
    fi
    zle .forward-char
}
zle -N forward-char

function backward-char {
    if (( $marking == 1 ))
    then
        marking=0
        NUMERIC=-1 zle set-mark-command
    fi
    zle .backward-char
}
zle -N backward-char

function delete-char {
    if (( $marking == 1 ))
    then
        zle kill-region
        marking=0
    else
        zle .delete-char
    fi
}
zle -N delete-char

bindkey '^[[1;2D' select-char-left   # assuming xterm
bindkey '^[[1;2C' select-char-right  # assuming xterm

它是zle定制的一个很好的例子。在互联网上不常见。
Ugo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.