Я думаю, вы можете комбинировать git blame
и git merge-base
, чтобы получить нужную информацию:
git blame -n $(git merge-base A B).. -- file | grep -v "^^" | grep "$PATTERN"
Это находит общего предка между A и B, затем запускает git blame
на file
, игнорируя все, что старше общего предка (нотация ..
указывает git blame
просматривать ревизии, начинающиеся с предка и заканчивая текущей головкой ). -n
добавляет номера строк в вывод. Затем grep -v "^^"
удаляет все строки, которые не изменились со времени общего предка, и, наконец, grep "$PATTERN"
ищет шаблон только среди строк, которые изменились. Поскольку git blame
в обратном режиме без -показывает только те строки, которые в данный момент находятся в файле, результаты будут включать только добавленные или измененные строки, что точно эквивалентно вашему фильтру ^\+
.
Создайте пакетный файл, например:
@echo off
D:
chdir D:\cygwin64\bin
set A=%1
bash --login -c "/usr/bin/echo $(cygpath $A)"
pause
В корневом каталоге Cygwin
должен присутствовать Cygwin.bat
, который будет использоваться как основание.
Поместите ссылку на батник в папку SendTo
Теперь, когда я отправляю изображение из папки «Изображения», У меня в новом окне CMD:
/cygdrive/c/Users/Marco/Pictures/img250.jpg
Drücken Sie eine beliebige Taste...
Последнее — Press any key
на немецком языке.
Отсюда вы можете изменить пакет для запуска любой программы cygwin, которую вы хотите.
Если вы планируете использовать X-сервер, вероятно, лучше иметь уже запущенный Xwin-сервер из-за возможных проблем с синхронизацией при выполнении.
Проблема с решением Мацери заключается в том, что оно работает только для самых разумных имен файлов. Пробел в имени файла уже нарушает его.
Помните, что если C:\book 1.pdf
— документ, который нужно открыть, мы хотим получить строку, в которой на стороне bash экранирование правильное -вот так:
"/usr/bin/zathura \"$(cygpath 'C:\book 1.pdf')\""
Но Windows передает путь к документу в качестве аргумента пакетному -сценарию двумя разными способами:
Из-за очень сложных правил перехода в пакетном языке, возможно, лучше использовать множество промежуточных переменных для построения строки; иначе сойдешь с ума.
Мы можем использовать:
^
экранирует "
. Но только в строках без кавычек, см. здесь !
set x=%x:"=%
— это замена "
ничем в строке переменной x
.
Одинарная кавычка '
является обычным символом, и ее не нужно экранировать.
Итак, следующий пакетный файл выполняет эту работу:
@echo off
C:
cd C:\cygwin64\bin
set pdfpath=%1
set pdfpath=%pdfpath:"=%
set cygpart=$(cygpath '%pdfpath%')
set fullcmd=/usr/bin/zathura \^"%cygpart%\^"
bash -l -c "%fullcmd%"
pause
Там может быть какое-то странное имя файла, которое все еще ломает его. Но, по крайней мере, это работает для всех нормальных имен файлов, включая те, которые содержат пробелы, круглые скобки и квадратные скобки.