![將先前的命令匯入到編輯的命令中](https://rvso.com/image/1481857/%E5%B0%87%E5%85%88%E5%89%8D%E7%9A%84%E5%91%BD%E4%BB%A4%E5%8C%AF%E5%85%A5%E5%88%B0%E7%B7%A8%E8%BC%AF%E7%9A%84%E5%91%BD%E4%BB%A4%E4%B8%AD.png)
我正在使用 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
轉到下面的視窗。