将先前的命令导入到编辑的命令中

将先前的命令导入到编辑的命令中

我正在使用 zsh 根据“原始日期/时间”exif 属性更改图像修改时间。

为此我执行一个命令:

PDATE=$(exiftool -p '$DateTimeOriginal' $PIC | sed 's/[: ]//g') touch -t $(echo $PDATE | sed 's/\(..$\)/\.\1/') $PIC

我收到了一些带有错误“原始日期/时间”值的图像,因此这些图像未被处理。

所以我正在努力从图像文件名中获取日期,我得到了

for i in `grep -E -o 'IMG\S+jpg' logfile`; do 
dte=$(echo $i  | grep -E -o '20.{13}' | tr -d '_'); 
touch -t $dte $i; 
done

其中 logfile 是包含不正确属性值等的 exiftool 消息的文件。

现在第二个代码片段的最后一个命令不起作用,因为我需要像第一个代码片段那样进行 sed 替换。

我的问题是:在 zsh vi 交互模式下,如何才能访问历史记录中的第一个代码片段,而不丢失当前命令的内容?

我想象在 vi 中编辑当前命令(当我在 zsh vi 控制模式下按下“v”字符时就可以做到这一点),列出历史命令并选择其中一个,它将被粘贴在下面的行中。

答案1

zsh-cmd-建筑师专门为执行您描述的操作而创建。它显示您当前的命令,允许左右移动命令块,还显示可搜索的历史记录,您可以从中选择命令块。

答案2

您正在使用 vi 模式下的 zsh。

为了解决您的问题,我们将问题分为两部分

1. part - 打印与模式匹配的命令历史记录行

为此,我们创建一个~/bin/history-print-regexp.sh 包含以下内容的文件:

#!/bin/zsh
# command 'regular-expression' number-of-lines(counting from the end of the file)
nmbr=15
if [ "$#" -eq 2 ]; then
    nmbr=$2
fi
if [ "$#" -eq 0 ]; then
    echo "You need at least one argument"
    echo "Usage command regexp outputlinesCount"
fi
#tac - reverse print , grep -E - use extended regexp, cut -d ';' use ; as delimiter
#and print second field (-f 2), uniq -u print only unique lines
tac  ~/.histfile | grep -E $1 |  cut -d ';' -f 2 | uniq -u | head -n $nmbr

现在我们需要让它与你当前的命令一起工作。为此,我们这样做:

在 zsh vi 正常模式下,按v两次按钮,vi 窗口就会打开。

在您的 ~/.vimrc 文件中放入这个函数

function! ShowHistoryMatching(pattern)
10new
exe 'r!' . "history-print-regexp.sh " . a:pattern
call cursor(1,1)
endfunction

:cnoremap ch call ShowHistoryMatching

此脚本的使用方法是,在 zsh total vi 编辑器中编辑当前命令时,按下:ch扩展为 :call ShowHistoryMatching 的命令,然后向其中添加 ("pattern") 并按 Enter,结果就会在上面的窗口中打开。从那里,您可以轻松地将所需的行复制到第二个窗口。

C-w,q关闭窗口 C-w,j并转到下面的窗口。

相关内容