![Импортировать предыдущие команды в отредактированную команду](https://rvso.com/image/1481857/%D0%98%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B8%D0%B5%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20%D0%B2%20%D0%BE%D1%82%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%83%D1%8E%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83.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 о некорректном значении аргумента и т. д.
Теперь последняя команда второго фрагмента не работает, потому что мне нужно сделать замену 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
переходит в окно ниже.