Импортировать предыдущие команды в отредактированную команду

Импортировать предыдущие команды в отредактированную команду

Я экспериментирую с 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, как в первом фрагменте.

У меня такой вопрос: как, находясь в интерактивном режиме zsh vi, получить доступ к первому фрагменту в истории, не теряя при этом содержимое текущей команды?

Я бы представил себе редактирование текущей команды в vi (как я могу сделать, нажав символ «v» в режиме управления zsh vi), получение списка команд истории, выбор одной из них, и она будет вставлена ​​в строку ниже.

решение1

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

решение2

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

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

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

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

Связанный контент