編集したコマンドに以前のコマンドをインポートする

編集したコマンドに以前のコマンドをインポートする

私は 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 置換を行う必要があるため、2 番目のスニペットの最後のコマンドは機能しません。

私の質問は、zsh vi 対話モード中に、現在のコマンドのコンテンツを失うことなく、履歴にある最初のスニペットにアクセスするにはどうすればよいでしょうか?

vi で現在のコマンドを編集し (zsh vi 制御モードで 'v' 文字を押すと実行できます)、履歴コマンドを一覧表示してそのうちの 1 つを選択すると、下の行に貼り付けられると思います。

答え1

があるzsh-cmd-アーキテクトあなたが説明したことを実行するためだけに作成されました。現在のコマンドを表示し、そのブロックを左右に移動できます。また、検索可能な履歴も表示され、そこからコマンドのブロックを選択できます。

答え2

zsh を vi モードで使用しています。

あなたの問題を解決するために、問題を2つの部分に分けます

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 通常モードでボタンを 2 回押すと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 キーを押すと、上のウィンドウに結果が開きます。そこから、必要な行を 2 番目のウィンドウに簡単にコピーできます。

C-w,qウィンドウを閉じると C-w,j下のウィンドウに移動します。

関連情報