1

Я играю с zsh, чтобы изменить время модификации изображения в соответствии с атрибутом exif «Date /Time Original».

Для этого я делаю одну команду:

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 (как я могу это сделать, когда я нажимаю символ 'v' в режиме управления zsh vi), перечислив команду истории и выбрав одну из них, и она будет вставлена в строку ниже.

2 ответа2

2

Существует zsh-cmd-architect, созданный специально для того, что вы описываете. Он отображает текущую команду, позволяет перемещать ее блоки влево и вправо, а также отображает историю поиска, из которой вы можете выбирать блоки команд.

0

Вы используете zsh в режиме vi.

Чтобы решить вашу проблему, мы разделим проблему на две части

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 который расширяется до: вызывать ShowHistoryMatching, добавляете ("pattern") к нему и нажимаете Enter, и результаты открываются в окне выше. , Оттуда вы можете легко скопировать нужную строку в ваше второе окно.

C-w,q закрывает окно C-w,j переходит в окно ниже.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .