이전 명령을 편집된 명령으로 가져오기

이전 명령을 편집된 명령으로 가져오기

저는 '날짜/시간 원본' EXIF ​​속성에 따라 이미지 수정 시간을 변경하기 위해 zsh를 사용하고 있습니다.

이를 위해 나는 한 가지 명령을 내린다:

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

여기서 로그 파일은 잘못된 값 등의 EXIFtool 메시지가 포함된 파일입니다.

이제 첫 번째 스니펫에서와 같이 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 일반 모드에 있는 동안 버튼을 두 번 누르면 vvi 창이 열립니다.

~/.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으로 확장된 명령을 누르고 여기에 ("패턴")을 추가하고 Enter를 누르면 결과가 위 창에 열립니다. 거기에서 원하는 줄을 두 번째 창에 쉽게 복사할 수 있습니다.

C-w,q창을 닫으면 C-w,j아래 창으로 이동합니다.

관련 정보