首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zsh zle shift选择

Zsh zle shift选择
EN

Stack Overflow用户
提问于 2011-03-23 23:46:54
回答 2查看 6.6K关注 0票数 16

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

EN

回答 2

Stack Overflow用户

发布于 2015-06-18 02:17:02

在斯蒂芬近3年前的出色回答的基础上,我添加了更多的绑定,以使行为(几乎)与所有Windows的标准键盘行为完全一致:

使用导航键(箭头、home、end)而不使用shift

  • Backspace和selection

  • Selection时,将清除Del删除选择。使用Ctrl+Shift+Left/Ctrl+Shift+Right

  • Shift+HomeShift+End时,激活的删除将扩展到下一个/上一个单词。将选择分别扩展到行首和行尾。Ctrl+Shift+HomeCtrl+Shift+End也是这样做的。

两件事并不完全相同:

与窗口不同,

  • 将选定内容扩展到下一个单词时会包含尾随空格。这是可以修复的,但我不会感到困扰。当存在活动选择时,
  • 键入不会删除它,而是用您键入的字符替换它。这似乎需要更多的工作来重新映射整个键盘。对我来说不值得这么麻烦。

请注意,默认的mintty行为是绑定Shift+EndShift+Home以访问回滚缓冲区。这取代了zsh配置;密钥永远不会被传递。为了使这些功能正常工作,您需要在/etc/minttyrc~/.minttyrc中配置不同的键(或禁用回滚)。参见“用于滚动的修饰符”here --最简单的解决方案是设置ScrollMod=2将其绑定到Alt而不是Shift

所以所有的东西:

~/.minttyrc

代码语言:javascript
复制
ScrollMod=2

~/.zshrc

代码语言:javascript
复制
r-delregion() {
  if ((REGION_ACTIVE)) then
     zle kill-region
  else 
    local widget_name=$1
    shift
    zle $widget_name -- $@
  fi
}

r-deselect() {
  ((REGION_ACTIVE = 0))
  local widget_name=$1
  shift
  zle $widget_name -- $@
}

r-select() {
  ((REGION_ACTIVE)) || zle set-mark-command
  local widget_name=$1
  shift
  zle $widget_name -- $@
}

for key     kcap   seq        mode   widget (
    sleft   kLFT   $'\e[1;2D' select   backward-char
    sright  kRIT   $'\e[1;2C' select   forward-char
    sup     kri    $'\e[1;2A' select   up-line-or-history
    sdown   kind   $'\e[1;2B' select   down-line-or-history

    send    kEND   $'\E[1;2F' select   end-of-line
    send2   x      $'\E[4;2~' select   end-of-line

    shome   kHOM   $'\E[1;2H' select   beginning-of-line
    shome2  x      $'\E[1;2~' select   beginning-of-line

    left    kcub1  $'\EOD'    deselect backward-char
    right   kcuf1  $'\EOC'    deselect forward-char

    end     kend   $'\EOF'    deselect end-of-line
    end2    x      $'\E4~'    deselect end-of-line

    home    khome  $'\EOH'    deselect beginning-of-line
    home2   x      $'\E1~'    deselect beginning-of-line

    csleft  x      $'\E[1;6D' select   backward-word
    csright x      $'\E[1;6C' select   forward-word
    csend   x      $'\E[1;6F' select   end-of-line
    cshome  x      $'\E[1;6H' select   beginning-of-line

    cleft   x      $'\E[1;5D' deselect backward-word
    cright  x      $'\E[1;5C' deselect forward-word

    del     kdch1   $'\E[3~'  delregion delete-char
    bs      x       $'^?'     delregion backward-delete-char

  ) {
  eval "key-$key() {
    r-$mode $widget \$@
  }"
  zle -N key-$key
  bindkey ${terminfo[$kcap]-$seq} key-$key
}

这篇文章涵盖了我使用过的几种不同键盘配置的键码。

注意: "key“列中的值没有任何意义,它们只是用来为zle构建一个命名引用。它们可能是任何东西。重要的是seqmodewidget列。

注意2:你几乎可以绑定任何你想要的键,你只需要在你的控制台模拟器中使用的键代码。打开常规控制台(不运行zsh),然后键入、Ctrl+V、,然后输入所需的密钥。它应该发出代码。^[的意思是\E

票数 30
EN

Stack Overflow用户

发布于 2021-09-20 03:07:49

感谢你的回答,我安心地做了我的脚本,用键盘选择和复制。

如果有人想过滤出更干净的东西,我会很感激的。

它是~/.zshrc文件的一部分,并将其放入主用户文件夹。

代码语言:javascript
复制
alias pbcopy="xclip -selection clipboard"

shift-arrow() {


((REGION_ACTIVE)) || zle set-mark-command 
  zle $1
}
for key  kcap seq        widget (
    left  LFT $'\e[1;2D' backward-char
    right RIT $'\e[1;2C' forward-char
    up    ri  $'\e[1;2A' up-line-or-history
    down  ind $'\e[1;2B' down-line-or-history
    super sup $'\ec' widget::copy-selection
  ) {
  functions[shift-$key]="shift-arrow $widget"
  zle -N shift-$key
  bindkey ${terminfo[k$kcap]-$seq} shift-$key
}
 
zle -N widget::copy-selection


# copy selected terminal text to clipboard
function widget::copy-selection {
    if ((REGION_ACTIVE)); then
        zle copy-region-as-kill
            printf "%s" $CUTBUFFER | pbcopy
    fi
}

我使用de windows+c按钮复制选定的字符。我正在使用ubuntu 20.04和配置的键盘选项来使用像meta一样的win按钮!在此之后,在终结器的首选项中,我将粘贴快捷方式更改为windows+v,jts,因为我认为它像control+x和COntrol+v那样更快

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

https://stackoverflow.com/questions/5407916

复制
相关文章

相似问题

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