將先前的命令匯入到編輯的命令中

將先前的命令匯入到編輯的命令中

我正在使用 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 訊息的文件,其中包含不正確的 arribute 值等。

現在第二個片段的最後一個命令不起作用,因為我需要像第一個片段一樣進行 sed 替換。

我的問題是:在 zsh vi 互動模式下,如何存取歷史記錄中的第一個片段,而不遺失目前命令的內容?

我想像在 vi 中編輯當前命令(就像在 zsh vi 控制模式下按“v”字元時可以做到的那樣),列出歷史命令並選擇其中之一,它將粘貼到下面的行中。

答案1

zsh-cmd-架構師專門為執行您所描述的操作而創建。它顯示您當前的命令,允許左右移動它的區塊,並且還顯示可搜尋的歷史記錄,您可以從中選擇命令區塊。

答案2

您正在 vi 模式下使用 zsh。

為了解決您的問題,我們將問題分為兩部分

1. 部分 - 列印與模式相符的命令歷史記錄行

為此,我們創建一個文件,~/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 總 vi 編輯器中編輯當前命令時,您按下該命令,:ch該命令擴展為:call ShowHistoryMatching 並向其添加(“模式”),然後按Enter 鍵,結果將在上面的視窗中打開。從那裡您可以輕鬆地將所需的行複製到第二個視窗。

C-w,q關閉視窗 C-w,j轉到下面的視窗。

相關內容