【问题标题】:zsh preexec command modificationzsh preexec 命令修改
【发布时间】:2012-09-25 10:04:14
【问题描述】:

有没有办法修改即将执行的命令? 我想将输出重定向到文件,并在终端上打印。 我发现 ls > file.txt | cat 可以完成这项工作,所以我想将 > file.txt | cat 添加到任何即将执行的命令中。
有没有更好的方法来重定向到文件并打印到终端?我正在尝试制作一个记录器。

【问题讨论】:

  • tee 是这里使用的命令,> file |猫很混乱

标签: zsh zsh-zle


【解决方案1】:

您可以更改执行一行时执行的操作以更改将要执行的命令。这可以通过定义一个函数来完成,然后绑定到 enter 键。

让我们首先定义一个可以添加'> file.txt | 的函数cat' 以任何命令结尾:

function log_and_accept {
    BUFFER="$BUFFER > file.txt | cat"
    zle accept-line
}

下一部分是用您的新功能实际替换默认的输入键行为。我们要替换的默认行为是accept-line 函数,如果我们查看zle documentation,您会看到accept-line 绑定到^J 和^M。

要将此函数绑定到那些字母,您首先需要将其变成一个小部件:

zle -N log_and_accept_widget log_and_accept

然后你可以绑定它,替换旧的行为:

bindkey '^J' log_and_accept_widget
bindkey '^M' log_and_accept_widget

现在您将为您执行的每个命令扩展该命令。每个 cd、ls、vim 等。因此,我建议您定义更多实际打开和关闭它的函数:

function turn_on_logging {
    bindkey '^J' log_and_accept_widget
    bindkey '^M' log_and_accept_widget
}
function turn_off_logging {
    bindkey '^J' accept-line
    bindkey '^M' accept-line
}

zle -N turn_on_logging_widget turn_on_logging
zle -N turn_off_logging_widget turn_off_logging

bindkey '^P' turn_on_logging_widget
bindkey '^O' turn_off_logging_widget

我认为你应该小心这个。在稍微测试之后,我很快就开始不喜欢它了。

【讨论】:

    【解决方案2】:

    有几种方法可以做到这一点,我最喜欢的一种是我在这里找到的这个块http://git.grml.org/?p=grml-etc-core.git;a=blob_plain;f=etc/zsh/zshrc;hb=HEAD

    abk=(
      '...'  '../..'
      '....' '../../..'
      'BG'   '& exit'
      'C'    '| wc -l'
      'G'    '|& grep '${grep_options:+"${grep_options[*]}"}
      'H'    '| head'
      'Hl'   ' --help |& less -r'    #d (Display help in pager)
      'L'    '| less'
      'LL'   '|& less -r'
      'M'    '| most'
      'N'    '&>/dev/null'           #d (No Output)
      'R'    '| tr A-z N-za-m'       #d (ROT13)
      'SL'   '| sort | less'
      'S'    '| sort -u'
      'T'    '| tail'
      'V'    '|& vim -'
      'co'   './configure && make && sudo make install'
      'fc'   '> file.txt | cat'
    )
    
    zleiab() {
      emulate -L zsh
      setopt extendedglob
      local MATCH
    
      if (( NOABBREVIATION > 0 )) ; then
          LBUFFER="${LBUFFER},."
          return 0
      fi
    
      matched_chars='[.-|_a-zA-Z0-9]#'
      LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
      LBUFFER+=${abk[$MATCH]:-$MATCH}
    }
    
    zle -N zleiab && bindkey ",." zleiab
    

    另请注意,我将'fc' '> file.txt | cat' 添加到列表abk

    你在命令后输入fc,然后快速连续点击,.(逗号和句点),zsh 会将fc 替换为> file.txt | cat

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2016-09-07
      • 2016-06-21
      • 2021-01-01
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多