commit 463a18b5ec8e4702ec3a57f8600ee4cf2cf74a2a Author: Victor Risgaard Date: Tue Feb 7 16:14:07 2023 +0100 Configs diff --git a/GIMP/2.10/action-history b/GIMP/2.10/action-history new file mode 100644 index 0000000..e1197fc --- /dev/null +++ b/GIMP/2.10/action-history @@ -0,0 +1,22 @@ +# GIMP action-history + +(history-item "file-open-as-layers" 1) +(history-item "edit-clear" 3) +(history-item "file-export-as" 0) +(history-item "file-quit" 1) +(history-item "file-open" 1) +(history-item "image-new" 3) +(history-item "tools-opacity-decrease-skip" 0) +(history-item "file-save-as" 1) +(history-item "layers-edit" 1) +(history-item "tools-free-select" 0) +(history-item "tools-scale" 0) +(history-item "layers-mask-add" 0) +(history-item "tools-iscissors" 0) +(history-item "tools-cage" 0) +(history-item "tools-dodge-burn" 0) +(history-item "file-save-and-close" 0) +(history-item "select-all" 0) +(history-item "file-export" 1) + +# end of action-history diff --git a/GIMP/2.10/colorrc b/GIMP/2.10/colorrc new file mode 100644 index 0000000..8154f20 --- /dev/null +++ b/GIMP/2.10/colorrc @@ -0,0 +1,26 @@ +# GIMP colorrc +# +# This file holds a list of recently used colors. + +(color-history + (color-rgba 0 0 0 1) + (color-rgba 1 1 1 1) + (color-rgba 1 1 1 6.9151532261950661e-310) + (color-rgba 0 1 0.25339366515837103 1) + (color-rgba 1 0 0 0) + (color-rgba 0 1 0.25490196078431371 6.9347311184141981e-310) + (color-rgba 0 0 0 6.9159840079784323e-310) + (color-rgba 1 0.84313725490196079 0 6.8994728715619521e-310) + (color-rgba 1 0.87058823529411766 0 6.8994728715619521e-310) + (color-rgba 1 0.94901960784313721 0 6.8994728715619521e-310) + (color-rgba 1 0.89411764705882357 0 6.8994728715619521e-310) + (color-rgba 0.070588235294117646 1 0 0) + (color-rgba 0.072398190045249056 1 0 1) + (color-rgba 0.039215686274509803 0.19607843137254902 0.96470588235294119 6.8994728715619521e-310) + (color-rgba 1 0.92307692307692313 0 1) + (color-rgba 1 0 0 1) + (color-rgba 0.58823529411764675 0 1 1) + (color-rgba 0 1 0.0078431372549019607 6.8994728715619521e-310) + (color-rgba 0 0.0078431372549019607 1 6.8994728715619521e-310)) + +# end of colorrc diff --git a/GIMP/2.10/contextrc b/GIMP/2.10/contextrc new file mode 100644 index 0000000..d7f39f5 --- /dev/null +++ b/GIMP/2.10/contextrc @@ -0,0 +1,14 @@ +# GIMP user context + +(tool "gimp-scale-tool") +(paint-info "gimp-paintbrush") +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(mybrush "100% Opaque") +(pattern "Pine") +(gradient "FG to BG (RGB)") +(palette "Color History") +(font "Sans-serif") +(tool-preset "Core Pointer") + +# end of user context diff --git a/GIMP/2.10/controllerrc b/GIMP/2.10/controllerrc new file mode 100644 index 0000000..d1e8c9f --- /dev/null +++ b/GIMP/2.10/controllerrc @@ -0,0 +1,40 @@ +# GIMP controllerrc +# +# This file will be entirely rewritten each time you exit. + +(GimpControllerInfo "Main Mouse Wheel" + (icon-name "gimp-controller-wheel") + (enabled yes) + (debug-events no) + (controller "GimpControllerWheel") + (mapping + (map "scroll-down-shift-primary" "tools-aspect-decrease") + (map "scroll-up-shift-alt" "tools-angle-increase") + (map "scroll-up-alt" "tools-opacity-increase") + (map "scroll-down-shift-alt" "tools-angle-decrease") + (map "scroll-down-primary-alt" "tools-size-decrease") + (map "scroll-up-shift-primary-alt" "tools-spacing-increase") + (map "scroll-down-alt" "tools-opacity-decrease") + (map "scroll-up-primary-alt" "tools-size-increase") + (map "scroll-up-shift-primary" "tools-aspect-increase") + (map "scroll-down-shift-primary-alt" "tools-spacing-decrease"))) +(GimpControllerInfo "Main Keyboard" + (icon-name "gimp-controller-keyboard") + (enabled yes) + (debug-events no) + (controller "GimpControllerKeyboard") + (mapping + (map "cursor-right-alt" "tools-size-increase") + (map "cursor-left-shift" "view-scroll-page-left") + (map "cursor-right-shift" "view-scroll-page-right") + (map "cursor-up-shift" "view-scroll-page-up") + (map "cursor-up-primary" "view-scroll-top-border") + (map "cursor-down-primary" "view-scroll-bottom-border") + (map "cursor-up-alt" "tools-size-increase-skip") + (map "cursor-left-alt" "tools-size-decrease") + (map "cursor-down-shift" "view-scroll-page-down") + (map "cursor-right-primary" "view-scroll-right-border") + (map "cursor-left-primary" "view-scroll-left-border") + (map "cursor-down-alt" "tools-size-decrease-skip"))) + +# end of controllerrc diff --git a/GIMP/2.10/devicerc b/GIMP/2.10/devicerc new file mode 100644 index 0000000..0a51646 --- /dev/null +++ b/GIMP/2.10/devicerc @@ -0,0 +1,180 @@ +# GIMP devicerc + +(GimpDeviceInfo "Core Pointer" + (icon-name "gimp-cursor") + (name "Core Pointer") + (tool-options "GimpTransformGridOptions" + (tool "gimp-scale-tool") + (interpolation linear) + (preview-opacity 0)) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush no) + (use-dynamics no) + (use-mypaint-brush no) + (use-gradient no) + (use-pattern no) + (use-palette no) + (use-font no) + (mode screen) + (axes 2 x y) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) +(GimpDeviceInfo "Logitech USB Receiver Consumer Control" + (name "Logitech USB Receiver Consumer Control") + (tool-options "GimpPaintOptions" + (tool "gimp-paintbrush-tool") + (brush "2. Hardness 050") + (dynamics "Dynamics Off") + (gradient "FG to BG (RGB)") + (palette "Color History") + (brush-size 12) + (brush-hardness 0.5)) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush yes) + (use-dynamics yes) + (use-mypaint-brush no) + (use-gradient yes) + (use-pattern no) + (use-palette yes) + (use-font no) + (mode disabled) + (axes 4 x y pressure xtilt) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) +(GimpDeviceInfo "Logitech USB Receiver Mouse" + (icon-name "gimp-cursor") + (name "Logitech USB Receiver Mouse") + (tool-options "GimpPaintOptions" + (tool "gimp-paintbrush-tool") + (brush "2. Hardness 050") + (dynamics "Dynamics Off") + (gradient "FG to BG (RGB)") + (palette "Color History") + (brush-size 12) + (brush-hardness 0.5)) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush yes) + (use-dynamics yes) + (use-mypaint-brush no) + (use-gradient yes) + (use-pattern no) + (use-palette yes) + (use-font no) + (mode disabled) + (axes 4 x y pressure xtilt) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) +(GimpDeviceInfo "Razer Razer Huntsman Mini" + (name "Razer Razer Huntsman Mini") + (tool-options "GimpCropOptions" + (tool "gimp-crop-tool") + (pattern "Pine")) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush no) + (use-dynamics no) + (use-mypaint-brush no) + (use-gradient no) + (use-pattern yes) + (use-palette no) + (use-font no) + (mode disabled) + (axes 4 x y pressure xtilt) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) +(GimpDeviceInfo "Razer Razer Huntsman Mini Keyboard" + (name "Razer Razer Huntsman Mini Keyboard") + (tool-options "GimpCropOptions" + (tool "gimp-crop-tool") + (pattern "Pine")) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush no) + (use-dynamics no) + (use-mypaint-brush no) + (use-gradient no) + (use-pattern yes) + (use-palette no) + (use-font no) + (mode disabled) + (axes 4 x y pressure xtilt) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) +(GimpDeviceInfo "Virtual core XTEST pointer" + (icon-name "gimp-cursor") + (name "Virtual core XTEST pointer") + (tool-options "GimpCropOptions" + (tool "gimp-crop-tool") + (pattern "Pine")) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush no) + (use-dynamics no) + (use-mypaint-brush no) + (use-gradient no) + (use-pattern yes) + (use-palette no) + (use-font no) + (mode disabled) + (axes 2 x y) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) +(GimpDeviceInfo "Corsair CORSAIR HARPOON RGB PRO Gaming Mouse" + (icon-name "gimp-cursor") + (name "Corsair CORSAIR HARPOON RGB PRO Gaming Mouse") + (tool-options "GimpCropOptions" + (tool "gimp-crop-tool") + (pattern "Pine")) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush no) + (use-dynamics no) + (use-mypaint-brush no) + (use-gradient no) + (use-pattern yes) + (use-palette no) + (use-font no) + (mode disabled) + (axes 4 x y pressure xtilt) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) + +# end of devicerc diff --git a/GIMP/2.10/dockrc b/GIMP/2.10/dockrc new file mode 100644 index 0000000..bb1944b --- /dev/null +++ b/GIMP/2.10/dockrc @@ -0,0 +1,4 @@ +# recently closed docks + + +# end of recently closed docks diff --git a/GIMP/2.10/gimprc b/GIMP/2.10/gimprc new file mode 100644 index 0000000..04645b4 --- /dev/null +++ b/GIMP/2.10/gimprc @@ -0,0 +1,33 @@ +# GIMP gimprc +# +# This is your personal gimprc file. Any variable defined in this file takes +# precedence over the value defined in the system-wide gimprc: +# /etc/gimp/2.0/gimprc +# Most values can be set within GIMP by changing some options in the +# Preferences dialog. + +(import-raw-plug-in "${gimp_plug_in_dir}/plug-ins/file-raw-placeholder/file-raw-placeholder") +(monitor-xresolution 65024) +(monitor-yresolution 36576) +(fill-options + (style solid) + (antialias yes) + (feather no) + (feather-radius 10)) +(stroke-options + (style solid) + (antialias yes) + (feather no) + (feather-radius 10) + (method line) + (width 6) + (unit pixels) + (cap-style butt) + (join-style miter) + (miter-limit 10) + (dash-offset 0) + (dash-info 0) + (emulate-brush-dynamics no)) + + +# end of gimprc diff --git a/GIMP/2.10/internal-data/custom.ggr b/GIMP/2.10/internal-data/custom.ggr new file mode 100644 index 0000000..cb0e1d4 --- /dev/null +++ b/GIMP/2.10/internal-data/custom.ggr @@ -0,0 +1,4 @@ +GIMP Gradient +Name: Custom +1 +0 0.5 1 0 0 0 1 1 1 1 1 0 0 1 3 diff --git a/GIMP/2.10/menurc b/GIMP/2.10/menurc new file mode 100644 index 0000000..c91d0ed --- /dev/null +++ b/GIMP/2.10/menurc @@ -0,0 +1,1311 @@ +; gimp GtkAccelMap rc-file -*- scheme -*- +; this file is an automated accelerator map dump +; +; (gtk_accel_path "/tools/tools-rotate-image-arbitrary" "") +; (gtk_accel_path "/file/file-menu" "") +; (gtk_accel_path "/view/view-show-canvas-boundary" "") +; (gtk_accel_path "/tools/tools-opacity-set-to-default" "") +; (gtk_accel_path "/context/context-background-value-decrease" "") +; (gtk_accel_path "/vectors/vectors-color-tag-brown" "") +; (gtk_accel_path "/tools/tools-opacity-increase-skip" "greater") +; (gtk_accel_path "/tools/tools-vector" "b") +; (gtk_accel_path "/view/view-scroll-left" "") +; (gtk_accel_path "/image/image-convert-u8" "") +; (gtk_accel_path "/tools/tools-airbrush-rate-increase" "") +; (gtk_accel_path "/tools/tools-spacing-set-to-default" "") +; (gtk_accel_path "/view/view-show-statusbar" "") +; (gtk_accel_path "/layers/layers-opacity-transparent" "") +; (gtk_accel_path "/vectors/vectors-color-tag-orange" "") +; (gtk_accel_path "/view/view-zoom-8-1-accel" "KP_4") +; (gtk_accel_path "/context/context-background-value-set" "") +; (gtk_accel_path "/context/context-paint-mode-menu" "") +; (gtk_accel_path "/filters/filters-motion-blur-linear" "") +; (gtk_accel_path "/filters/filters-gegl-graph" "") +; (gtk_accel_path "/context/context-brush-select-set" "") +; (gtk_accel_path "/edit/edit-copy" "c") +; (gtk_accel_path "/context/context-brush-shape-circle" "") +; (gtk_accel_path "/windows/windows-display-0001" "") +; (gtk_accel_path "/vectors/vectors-lock-content" "") +; (gtk_accel_path "/context/context-opacity-opaque" "") +; (gtk_accel_path "/view/view-color-management-menu" "") +; (gtk_accel_path "/filters/filters-spherize" "") +; (gtk_accel_path "/channels/channels-new-last-values" "") +; (gtk_accel_path "/vectors/vectors-merge-visible" "") +; (gtk_accel_path "/plug-in/script-fu-slide" "") +; (gtk_accel_path "/plug-in/plug-in-spheredesigner" "") +; (gtk_accel_path "/filters/filters-curves" "") +; (gtk_accel_path "/channels/channels-lock-position" "") +; (gtk_accel_path "/context/context-brush-menu" "") +; (gtk_accel_path "/context/context-foreground-blue-decrease" "") +; (gtk_accel_path "/context/context-colors-menu" "") +; (gtk_accel_path "/edit/edit-undo-clear" "") +; (gtk_accel_path "/context/context-gradient-select-first" "") +; (gtk_accel_path "/layers/layers-color-tag-brown" "") +; (gtk_accel_path "/plug-in/plug-in-imagemap" "") +; (gtk_accel_path "/filters/filters-recent-menu" "") +; (gtk_accel_path "/plug-in/plug-in-map-object" "") +; (gtk_accel_path "/layers/layers-text-along-vectors" "") +; (gtk_accel_path "/view/view-zoom-revert" "grave") +; (gtk_accel_path "/dialogs/dialogs-symmetry" "") +; (gtk_accel_path "/plug-in/plug-in-script-fu-console" "") +; (gtk_accel_path "/filters/filters-plasma" "") +; (gtk_accel_path "/view/view-color-management-enable" "") +; (gtk_accel_path "/dialogs/dialogs-undo-history" "") +; (gtk_accel_path "/edit/edit-cut" "x") +; (gtk_accel_path "/context/context-foreground-value-increase-skip" "") +; (gtk_accel_path "/plug-in/script-fu-addborder" "") +; (gtk_accel_path "/view/view-display-intent-absolute-colorimetric" "") +; (gtk_accel_path "/context/context-background-red-decrease" "") +; (gtk_accel_path "/tools/tools-airbrush-rate-maximum" "") +; (gtk_accel_path "/vectors/vectors-color-tag-menu" "") +; (gtk_accel_path "/filters/filters-focus-blur" "") +; (gtk_accel_path "/view/view-fullscreen" "F11") +; (gtk_accel_path "/context/context-brush-radius-decrease-skip" "") +; (gtk_accel_path "/dialogs/dialogs-brushes" "b") +; (gtk_accel_path "/tools/tools-spacing-minimum" "") +; (gtk_accel_path "/context/context-foreground-blue-maximum" "") +; (gtk_accel_path "/view/view-zoom-2-1" "2") +; (gtk_accel_path "/view/view-snap-to-vectors" "") +; (gtk_accel_path "/context/context-foreground-red-increase" "") +; (gtk_accel_path "/image/image-properties" "Return") +; (gtk_accel_path "/drawable/drawable-rotate-270" "") +; (gtk_accel_path "/plug-in/script-fu-predator" "") +; (gtk_accel_path "/tools/tools-hardness-increase-percent" "") +; (gtk_accel_path "/view/view-show-grid" "") +; (gtk_accel_path "/plug-in/plug-in-colorify" "") +; (gtk_accel_path "/image/image-color-management-enabled" "") +; (gtk_accel_path "/plug-in/file-bigtiff-save" "") +; (gtk_accel_path "/tools/tools-angle-increase" "") +; (gtk_accel_path "/vectors/vectors-color-tag-violet" "") +; (gtk_accel_path "/context/context-background-saturation-decrease-skip" "") +; (gtk_accel_path "/layers/layers-composite-mode-union" "") +; (gtk_accel_path "/channels/channels-color-tag-blue" "") +; (gtk_accel_path "/windows/windows-dialogs-menu" "") +; (gtk_accel_path "/tools/tools-gegl" "") +; (gtk_accel_path "/tool-options/tool-options-reset" "") +; (gtk_accel_path "/layers/layers-delete" "") +; (gtk_accel_path "/view/view-display-intent-menu" "") +; (gtk_accel_path "/vectors/vectors-edit" "") +; (gtk_accel_path "/filters/filters-illusion" "") +; (gtk_accel_path "/context/context-colormap-foreground-previous" "") +; (gtk_accel_path "/layers/layers-lock-content" "") +; (gtk_accel_path "/file/file-create-menu" "") +; (gtk_accel_path "/tools/tools-spacing-decrease-skip" "") +; (gtk_accel_path "/filters/filters-dropshadow" "") +; (gtk_accel_path "/context/context-background-green-increase" "") +; (gtk_accel_path "/layers/layers-alpha-selection-add" "") +; (gtk_accel_path "/plug-in/script-fu-make-brush-rectangular-feathered" "") +; (gtk_accel_path "/patterns/patterns-delete" "") +; (gtk_accel_path "/context/context-brush-radius-menu" "") +; (gtk_accel_path "/view/view-scroll-page-right" "") +; (gtk_accel_path "/layers/layers-blend-space-menu" "") +; (gtk_accel_path "/dockable/dialogs-histogram" "") +; (gtk_accel_path "/layers/layers-opacity-opaque" "") +; (gtk_accel_path "/context/context-background-saturation-increase" "") +; (gtk_accel_path "/dialogs/dialogs-dynamics-editor" "") +; (gtk_accel_path "/layers/layers-composite-space-menu" "") +; (gtk_accel_path "/file/file-revert" "") +; (gtk_accel_path "/filters/filters-fattal-2002" "") +; (gtk_accel_path "/tools/tools-color-average-radius-set" "") +; (gtk_accel_path "/filters/filters-distorts-menu" "") +; (gtk_accel_path "/tools/tools-fuzzy-select" "u") +; (gtk_accel_path "/documents/documents-reload-previews" "") +; (gtk_accel_path "/debug/debug-show-image-graph" "") +; (gtk_accel_path "/brushes/brushes-show-in-file-manager" "") +; (gtk_accel_path "/context/context-brush-angle-maximum" "") +; (gtk_accel_path "/view/view-zoom-selection" "") +; (gtk_accel_path "/tools/tools-cage" "g") +; (gtk_accel_path "/file/file-open-location" "") +; (gtk_accel_path "/plug-in/plug-in-blur" "") +; (gtk_accel_path "/layers/layers-opacity-decrease" "") +; (gtk_accel_path "/context/context-foreground-hue-decrease-skip" "") +; (gtk_accel_path "/layers/layers-mask-add" "") +; (gtk_accel_path "/filters/filters-diffraction-patterns" "") +; (gtk_accel_path "/image/image-convert-rgb" "") +; (gtk_accel_path "/tools/tools-spacing-decrease-percent" "") +; (gtk_accel_path "/context/context-gradient-select-last" "") +; (gtk_accel_path "/file/file-create-template" "") +; (gtk_accel_path "/vectors/vectors-color-tag-yellow" "") +; (gtk_accel_path "/plug-in/plug-in-emboss" "") +; (gtk_accel_path "/dockable/dockable-view-type-grid" "") +; (gtk_accel_path "/view/view-navigation-window" "") +; (gtk_accel_path "/windows/windows-tabs-position-bottom" "") +; (gtk_accel_path "/context/context-brush-angle-set" "") +; (gtk_accel_path "/documents/documents-raise-or-open" "") +; (gtk_accel_path "/context/context-background-blue-decrease" "") +; (gtk_accel_path "/filters/filters-linear-sinusoid" "") +; (gtk_accel_path "/context/context-foreground-green-set" "") +; (gtk_accel_path "/tools/tools-levels" "") +; (gtk_accel_path "/plug-in/plug-in-script-fu-server" "") +; (gtk_accel_path "/dock/dock-move-to-screen-menu" "") +; (gtk_accel_path "/windows/windows-tabs-position-right" "") +; (gtk_accel_path "/plug-in/script-fu-line-nova" "") +; (gtk_accel_path "/layers/layers-color-tag-blue" "") +; (gtk_accel_path "/dialogs/dialogs-indexed-palette" "") +; (gtk_accel_path "/tools/tools-object-1-set" "") +; (gtk_accel_path "/channels/channels-new" "") +; (gtk_accel_path "/edit/edit-named-paste" "") +; (gtk_accel_path "/tools/tools-hardness-minimum" "") +; (gtk_accel_path "/filters/filters-menu" "") +; (gtk_accel_path "/tools/tools-opacity-set" "") +; (gtk_accel_path "/dockable/dialogs-toolbox" "b") +; (gtk_accel_path "/plug-in/gimp-help-using-fileformats" "") +; (gtk_accel_path "/edit/edit-strong-redo" "y") +; (gtk_accel_path "/filters/filters-alien-map" "") +; (gtk_accel_path "/plug-in/gimp-online-bugs-features" "") +; (gtk_accel_path "/tools/tools-object-2-last" "") +; (gtk_accel_path "/tools/tools-paintbrush-force-set" "") +; (gtk_accel_path "/vectors/vectors-linked" "") +; (gtk_accel_path "/filters/filters-gaussian-blur-selective" "") +; (gtk_accel_path "/filters/filters-unsharp-mask" "") +; (gtk_accel_path "/fonts/fonts-refresh" "") +; (gtk_accel_path "/file/file-open-recent-menu" "") +; (gtk_accel_path "/tools/tools-hardness-decrease" "") +; (gtk_accel_path "/layers/layers-mask-show" "") +; (gtk_accel_path "/view/view-softproof-intent-absolute-colorimetric" "") +; (gtk_accel_path "/brushes/brushes-open-as-image" "") +; (gtk_accel_path "/tools/tools-angle-decrease" "") +; (gtk_accel_path "/layers/layers-merge-layers-last-values" "") +; (gtk_accel_path "/context/context-background-blue-set" "") +; (gtk_accel_path "/tools/tools-opacity-increase-percent" "") +; (gtk_accel_path "/context/context-background-value-decrease-skip" "") +; (gtk_accel_path "/patterns/patterns-new" "") +; (gtk_accel_path "/plug-in/script-fu-spinning-globe" "") +; (gtk_accel_path "/windows/windows-menu" "") +; (gtk_accel_path "/tools/tools-object-1-first" "") +; (gtk_accel_path "/image/image-flip-horizontal" "") +; (gtk_accel_path "/plug-in/plug-in-sharpen" "") +; (gtk_accel_path "/tools/tools-force-decrease-percent" "") +; (gtk_accel_path "/context/context-brush-hardness-set" "") +; (gtk_accel_path "/select/select-stroke-last-values" "") +; (gtk_accel_path "/filters/filters-long-shadow" "") +; (gtk_accel_path "/context/context-brush-radius-increase-percent" "") +; (gtk_accel_path "/plug-in/plug-in-animationoptimize-diff" "") +; (gtk_accel_path "/tools/tools-perspective-clone" "") +; (gtk_accel_path "/image/colors-auto-menu" "") +; (gtk_accel_path "/vectors/vectors-selection-to-vectors-advanced" "") +; (gtk_accel_path "/context/context-background-saturation-decrease" "") +; (gtk_accel_path "/plug-in/script-fu-unsharp-mask" "") +; (gtk_accel_path "/tools/tools-rect-select" "r") +; (gtk_accel_path "/tools/tools-angle-set-to-default" "") +; (gtk_accel_path "/filters/filters-semi-flatten" "") +; (gtk_accel_path "/tools/tools-opacity-maximum" "") +; (gtk_accel_path "/dockable/dockable-tab-style-preview-name" "") +; (gtk_accel_path "/view/view-zoom-in-skip" "") +; (gtk_accel_path "/tools/tools-airbrush-flow-decrease" "") +; (gtk_accel_path "/plug-in/plug-in-dog" "") +; (gtk_accel_path "/debug/debug-mem-profile" "") +; (gtk_accel_path "/channels/channels-visible" "") +; (gtk_accel_path "/edit/edit-paste-as-new-layer" "") +; (gtk_accel_path "/context/context-foreground-hue-maximum" "") +; (gtk_accel_path "/tool-options/tool-options-restore-preset-menu" "") +; (gtk_accel_path "/dockable/dialogs-undo-history" "") +; (gtk_accel_path "/tools/tools-paintbrush-hardness-set" "") +; (gtk_accel_path "/filters/filters-stretch-contrast" "") +; (gtk_accel_path "/filters/filters-color-to-alpha" "") +; (gtk_accel_path "/dockable/dialogs-cursor" "") +; (gtk_accel_path "/context/context-brush-aspect-maximum" "") +; (gtk_accel_path "/dockable/dialogs-templates" "") +; (gtk_accel_path "/plug-in/script-fu-ripply-anim" "") +; (gtk_accel_path "/view/view-show-menubar" "") +; (gtk_accel_path "/filters/filters-web-menu" "") +; (gtk_accel_path "/filters/filters-bloom" "") +; (gtk_accel_path "/filters/filters-exposure" "") +; (gtk_accel_path "/tools/tools-foreground-select-brush-size-set" "") +; (gtk_accel_path "/tools/tools-spacing-increase" "") +; (gtk_accel_path "/context/context-background-hue-decrease-skip" "") +; (gtk_accel_path "/select/select-shrink" "") +; (gtk_accel_path "/view/view-scroll-horizontal" "") +; (gtk_accel_path "/select/select-fill-last-values" "") +; (gtk_accel_path "/image/image-resize-to-selection" "") +; (gtk_accel_path "/plug-in/script-fu-tile-blur" "") +; (gtk_accel_path "/filters/filters-color-temperature" "") +; (gtk_accel_path "/plug-in/script-fu-paste-as-pattern" "") +; (gtk_accel_path "/tools/tools-paintbrush-aspect-ratio-set" "") +; (gtk_accel_path "/plug-in/plug-in-gfig" "") +; (gtk_accel_path "/context/context-foreground-hue-set" "") +; (gtk_accel_path "/tools/tools-gradient" "g") +; (gtk_accel_path "/select/select-none" "a") +; (gtk_accel_path "/edit/edit-named-cut" "") +; (gtk_accel_path "/context/context-palette-select-set" "") +; (gtk_accel_path "/channels/channels-select-next" "") +; (gtk_accel_path "/image/image-precision-menu" "") +; (gtk_accel_path "/layers/layers-mask-menu" "") +; (gtk_accel_path "/layers/layers-alpha-selection-replace" "") +; (gtk_accel_path "/plug-in/gimp-palette-export-php" "") +; (gtk_accel_path "/filters/filters-noise-hsv" "") +; (gtk_accel_path "/filters/filters-noise-simplex" "") +; (gtk_accel_path "/help/help-help" "F1") +; (gtk_accel_path "/context/context-opacity-increase-skip" "") +; (gtk_accel_path "/view/view-padding-color-light-check" "") +; (gtk_accel_path "/context/context-brush-spikes-minimum" "") +; (gtk_accel_path "/plug-in/plug-in-gflare" "") +; (gtk_accel_path "/context/context-brush-aspect-set" "") +; (gtk_accel_path "/plug-in/plug-in-zealouscrop" "") +; (gtk_accel_path "/dockable/dialogs-gradient-editor" "") +; (gtk_accel_path "/tools/tools-color-menu" "") +; (gtk_accel_path "/tools/tools-airbrush-flow-maximum" "") +; (gtk_accel_path "/view/view-flip-horizontally" "") +; (gtk_accel_path "/layers/layers-composite-mode-auto" "") +; (gtk_accel_path "/plug-in/gimp-online-developer-web-site" "") +; (gtk_accel_path "/dockable/dockable-tab-style-name" "") +; (gtk_accel_path "/vectors/vectors-raise-to-top" "") +; (gtk_accel_path "/view/view-scroll-page-left" "") +; (gtk_accel_path "/tools/tools-threshold" "") +; (gtk_accel_path "/filters/filters-threshold" "") +; (gtk_accel_path "/tools/tools-airbrush-flow-set" "") +; (gtk_accel_path "/context/context-brush-spacing-minimum" "") +; (gtk_accel_path "/layers/layers-select-bottom" "End") +; (gtk_accel_path "/dockable/dockable-tab-style-preview" "") +; (gtk_accel_path "/dockable/dialogs-channels" "") +; (gtk_accel_path "/channels/channels-color-tag-none" "") +; (gtk_accel_path "/tools/tools-paintbrush" "p") +; (gtk_accel_path "/vectors/vectors-color-tag-gray" "") +; (gtk_accel_path "/context/context-brush-spacing-increase-skip" "") +; (gtk_accel_path "/vectors/vectors-stroke-last-values" "") +; (gtk_accel_path "/view/view-show-sample-points" "") +; (gtk_accel_path "/documents/documents-remove" "") +; (gtk_accel_path "/filters/filters-antialias" "") +; (gtk_accel_path "/dockable/dockable-preview-size-medium" "") +; (gtk_accel_path "/dockable/dialogs-colors" "") +; (gtk_accel_path "/view/view-show-all" "") +; (gtk_accel_path "/debug/debug-benchmark-projection" "") +; (gtk_accel_path "/context/context-brush-spikes-decrease" "") +; (gtk_accel_path "/filters/filters-noise-hurl" "") +; (gtk_accel_path "/file/file-save-and-close" "") +; (gtk_accel_path "/dialogs/dialogs-document-history" "") +; (gtk_accel_path "/context/context-opacity-set" "") +; (gtk_accel_path "/plug-in/script-fu-blend-anim" "") +; (gtk_accel_path "/view/view-zoom-in" "plus") +; (gtk_accel_path "/plug-in/plug-in-smooth-palette" "") +; (gtk_accel_path "/context/context-swatch-background-set" "") +; (gtk_accel_path "/windows/windows-tab-position" "") +; (gtk_accel_path "/dialogs/dialogs-error-console" "") +; (gtk_accel_path "/view/view-rotate-15" "") +; (gtk_accel_path "/view/view-zoom" "") +; (gtk_accel_path "/view/view-scroll-top-border" "") +; (gtk_accel_path "/layers/layers-new" "n") +; (gtk_accel_path "/plug-in/gimp-palette-export-java" "") +; (gtk_accel_path "/context/context-foreground-blue-increase-skip" "") +; (gtk_accel_path "/plug-in/script-fu-burn-in-anim" "") +; (gtk_accel_path "/tools/tools-paint-menu" "") +; (gtk_accel_path "/plug-in/plug-in-colormap-swap" "") +; (gtk_accel_path "/dockable/dialogs-mypaint-brushes" "") +; (gtk_accel_path "/dockable/dockable-preview-size-menu" "") +; (gtk_accel_path "/image/colors-menu" "") +; (gtk_accel_path "/vectors/vectors-lock-position" "") +; (gtk_accel_path "/vectors/vectors-visible" "") +; (gtk_accel_path "/image/image-flatten" "") +; (gtk_accel_path "/tools/tools-spacing-decrease" "") +; (gtk_accel_path "/filters/filters-dither" "") +; (gtk_accel_path "/plug-in/plug-in-decompose-registered" "") +; (gtk_accel_path "/channels/channels-selection-intersect" "") +; (gtk_accel_path "/plug-in/plug-in-cartoon" "") +; (gtk_accel_path "/view/view-softproof-intent-perceptual" "") +; (gtk_accel_path "/tools/tools-offset" "") +; (gtk_accel_path "/image/image-convert-float" "") +; (gtk_accel_path "/edit/edit-clear" "Delete") +; (gtk_accel_path "/view/view-scroll-down" "") +; (gtk_accel_path "/context/context-foreground-green-increase" "") +; (gtk_accel_path "/image/image-scale" "") +; (gtk_accel_path "/tools/tools-aspect-increase-skip" "") +; (gtk_accel_path "/context/context-colormap-background-previous" "") +; (gtk_accel_path "/image/colors-info-menu" "") +; (gtk_accel_path "/plug-in/plug-in-lic" "") +; (gtk_accel_path "/context/context-background-value-increase" "") +; (gtk_accel_path "/dialogs/dialogs-channels" "") +; (gtk_accel_path "/filters/filters-component-extract" "") +; (gtk_accel_path "/tools/tools-size-maximum" "") +; (gtk_accel_path "/dockable/dialogs-dashboard" "") +; (gtk_accel_path "/vectors/vectors-select-previous" "") +; (gtk_accel_path "/layers/layers-mode-menu" "") +; (gtk_accel_path "/filters/filters-render-nature-menu" "") +; (gtk_accel_path "/layers/layers-color-tag-none" "") +; (gtk_accel_path "/dockable/dialogs-gradients" "g") +; (gtk_accel_path "/tools/tools-heal" "h") +; (gtk_accel_path "/view/view-scroll-right" "") +; (gtk_accel_path "/dialogs/dialogs-cursor" "") +; (gtk_accel_path "/context/context-foreground-saturation-minimum" "") +; (gtk_accel_path "/context/context-background-red-maximum" "") +; (gtk_accel_path "/context/context-brush-spikes-menu" "") +; (gtk_accel_path "/filters/filters-recent-10" "") +; (gtk_accel_path "/plug-in/file-gif-save2" "") +; (gtk_accel_path "/drawable/drawable-flip-horizontal" "") +; (gtk_accel_path "/layers/layers-merge-group" "") +; (gtk_accel_path "/file/file-open" "o") +; (gtk_accel_path "/plug-in/script-fu-font-map" "") +; (gtk_accel_path "/tools/tools-transform-preview-opacity-set" "") +; (gtk_accel_path "/dialogs/dialogs-histogram" "") +; (gtk_accel_path "/filters/filters-lens-blur" "") +; (gtk_accel_path "/view/view-rotate-set-absolute" "") +; (gtk_accel_path "/layers/layers-mask-apply" "") +; (gtk_accel_path "/context/context-brush-radius-increase-less" "") +; (gtk_accel_path "/dialogs/dialogs-brush-editor" "") +; (gtk_accel_path "/context/context-background-saturation-maximum" "") +; (gtk_accel_path "/context/context-foreground-blue-increase" "") +; (gtk_accel_path "/layers/layers-duplicate" "d") +; (gtk_accel_path "/context/context-palette-select-next" "") +; (gtk_accel_path "/context/context-palette-foreground-next-skip" "") +; (gtk_accel_path "/layers/layers-mask-selection-add" "") +; (gtk_accel_path "/tools/tools-dodge-burn" "d") +; (gtk_accel_path "/edit/edit-copy-visible" "c") +; (gtk_accel_path "/brushes/brushes-duplicate" "") +; (gtk_accel_path "/layers/layers-select-previous" "Page_Up") +; (gtk_accel_path "/tools/tools-angle-maximum" "") +; (gtk_accel_path "/dockable/dockable-lock-tab" "") +; (gtk_accel_path "/context/context-foreground-value-minimum" "") +; (gtk_accel_path "/file/file-close-all" "w") +; (gtk_accel_path "/dialogs/dialogs-sample-points" "") +; (gtk_accel_path "/layers/layers-opacity-menu" "") +; (gtk_accel_path "/plug-in/plug-in-metadata-editor" "") +; (gtk_accel_path "/tools/tools-angle-increase-percent" "") +; (gtk_accel_path "/plug-in/script-fu-drop-shadow" "") +; (gtk_accel_path "/filters/filters-render-menu" "") +; (gtk_accel_path "/plug-in/plug-in-jigsaw" "") +; (gtk_accel_path "/dockable/dockable-tab-style-menu" "") +; (gtk_accel_path "/context/context-brush-hardness-decrease-skip" "") +; (gtk_accel_path "/plug-in/file-pdf-load" "") +; (gtk_accel_path "/plug-in/script-fu-guides-from-selection" "") +; (gtk_accel_path "/plug-in/script-fu-selection-to-brush" "") +; (gtk_accel_path "/layers/layers-blend-space-rgb-linear" "") +; (gtk_accel_path "/context/context-background-blue-maximum" "") +; (gtk_accel_path "/tools/tools-zoom" "z") +; (gtk_accel_path "/context/context-swatch-foreground-previous-skip" "") +; (gtk_accel_path "/context/context-background-red-increase" "") +; (gtk_accel_path "/plug-in/plug-in-checkerboard" "") +; (gtk_accel_path "/dockable/dockable-popup" "") +; (gtk_accel_path "/dockable/dockable-preview-size-extra-small" "") +; (gtk_accel_path "/filters/filters-render-clouds-menu" "") +; (gtk_accel_path "/context/context-palette-foreground-first" "") +; (gtk_accel_path "/view/view-zoom-4-1" "3") +; (gtk_accel_path "/channels/channels-duplicate" "") +; (gtk_accel_path "/context/context-brush-aspect-menu" "") +; (gtk_accel_path "/tools/tools-object-2-set" "") +; (gtk_accel_path "/context/context-brush-radius-increase" "") +; (gtk_accel_path "/context/context-swatch-background-next" "") +; (gtk_accel_path "/view/view-display-black-point-compensation" "") +; (gtk_accel_path "/tools/tools-size-decrease" "bracketleft") +; (gtk_accel_path "/dialogs/dialogs-colors" "") +; (gtk_accel_path "/filters/filters-edge" "") +; (gtk_accel_path "/image/image-rotate-180" "") +; (gtk_accel_path "/image/image-new" "n") +; (gtk_accel_path "/tool-options/tool-options-delete-preset-menu" "") +; (gtk_accel_path "/tools/tools-ink-blob-size-set" "") +; (gtk_accel_path "/filters/filters-value-propagate" "") +; (gtk_accel_path "/image/image-color-profile-assign" "") +; (gtk_accel_path "/layers/layers-composite-space-rgb-perceptual" "") +; (gtk_accel_path "/context/context-foreground-green-decrease" "") +; (gtk_accel_path "/layers/layers-scale" "") +; (gtk_accel_path "/layers/layers-transparency-menu" "") +; (gtk_accel_path "/layers/layers-alpha-remove" "") +; (gtk_accel_path "/context/context-pattern-select-set" "") +; (gtk_accel_path "/filters/filters-image-gradient" "") +; (gtk_accel_path "/select/select-all" "a") +; (gtk_accel_path "/plug-in/plug-in-filter-pack" "") +; (gtk_accel_path "/context/context-brush-hardness-maximum" "") +; (gtk_accel_path "/plug-in/plug-in-recompose" "") +; (gtk_accel_path "/view/view-zoom-menu" "") +; (gtk_accel_path "/image/image-convert-u16" "") +; (gtk_accel_path "/filters/filters-kaleidoscope" "") +; (gtk_accel_path "/context/context-colormap-foreground-previous-skip" "") +; (gtk_accel_path "/view/view-snap-to-grid" "") +; (gtk_accel_path "/vectors/vectors-fill" "") +; (gtk_accel_path "/view/view-color-management-reset" "") +; (gtk_accel_path "/context/context-background-green-set" "") +; (gtk_accel_path "/tools/tools-force-maximum" "") +; (gtk_accel_path "/context/context-foreground-saturation-increase" "") +; (gtk_accel_path "/dockable/dialogs-device-status" "") +; (gtk_accel_path "/edit/edit-named-copy" "") +; (gtk_accel_path "/filters/filters-video-degradation" "") +; (gtk_accel_path "/edit/edit-paste-as-new-layer-in-place" "") +; (gtk_accel_path "/layers/layers-resize" "") +; (gtk_accel_path "/layers/layers-blend-space-rgb-perceptual" "") +; (gtk_accel_path "/layers/layers-stack-menu" "") +; (gtk_accel_path "/dockable/dockable-show-button-bar" "") +; (gtk_accel_path "/view/view-zoom-fill" "") +; (gtk_accel_path "/filters/filters-stretch-contrast-hsv" "") +; (gtk_accel_path "/view/view-padding-color-prefs" "") +; (gtk_accel_path "/plug-in/plug-in-depth-merge" "") +; (gtk_accel_path "/tools/tools-opacity-decrease-skip" "less") +; (gtk_accel_path "/plug-in/plug-in-guillotine" "") +; (gtk_accel_path "/windows/windows-tabs-position-left" "") +; (gtk_accel_path "/documents/documents-recreate-preview" "") +; (gtk_accel_path "/layers/layers-opacity-increase" "") +; (gtk_accel_path "/view/view-padding-color-in-show-all" "") +; (gtk_accel_path "/image/colors-tone-mapping-menu" "") +; (gtk_accel_path "/tools/tools-size-set" "") +; (gtk_accel_path "/context/context-brush-angle-increase-skip" "") +; (gtk_accel_path "/dialogs/dialogs-fonts" "") +; (gtk_accel_path "/channels/channels-linked" "") +; (gtk_accel_path "/dockable/dockable-preview-size-gigantic" "") +; (gtk_accel_path "/plug-in/script-fu-difference-clouds" "") +; (gtk_accel_path "/plug-in/plug-in-dbbrowser" "") +; (gtk_accel_path "/context/context-background-hue-set" "") +; (gtk_accel_path "/plug-in/plug-in-align-layers" "") +; (gtk_accel_path "/context/context-background-blue-increase" "") +; (gtk_accel_path "/dockable/dialogs-palettes" "") +; (gtk_accel_path "/filters/filters-hue-chroma" "") +; (gtk_accel_path "/plug-in/plug-in-blinds" "") +; (gtk_accel_path "/dockable/dockable-preview-size-enormous" "") +; (gtk_accel_path "/filters/filters-edge-detect-menu" "") +; (gtk_accel_path "/channels/channels-lock-content" "") +; (gtk_accel_path "/context/context-paint-mode-next" "") +; (gtk_accel_path "/tools/tools-clone" "c") +; (gtk_accel_path "/plug-in/script-fu-make-brush-elliptical-feathered" "") +; (gtk_accel_path "/tools/tools-color-picker" "o") +; (gtk_accel_path "/context/context-background-value-minimum" "") +; (gtk_accel_path "/drawable/drawable-linked" "") +; (gtk_accel_path "/select/select-sharpen" "") +; (gtk_accel_path "/context/context-colormap-foreground-next" "") +; (gtk_accel_path "/view/view-zoom-4-1-accel" "KP_3") +; (gtk_accel_path "/edit/edit-undo" "z") +; (gtk_accel_path "/plug-in/script-fu-paste-as-brush" "") +; (gtk_accel_path "/filters/filters-noise-cie-lch" "") +; (gtk_accel_path "/filters/filters-invert-perceptual" "") +; (gtk_accel_path "/vectors/vectors-selection-replace" "") +; (gtk_accel_path "/file/file-save-a-copy" "") +; (gtk_accel_path "/vectors/vectors-delete" "") +; (gtk_accel_path "/vectors/vectors-color-tag-blue" "") +; (gtk_accel_path "/channels/channels-edit-attributes" "") +; (gtk_accel_path "/tools/tools-transform-3d" "w") +; (gtk_accel_path "/file/file-show-in-file-manager" "f") +; (gtk_accel_path "/context/context-swatch-background-previous-skip" "") +; (gtk_accel_path "/windows/windows-tabs-position-top" "") +; (gtk_accel_path "/context/context-brush-radius-decrease" "") +; (gtk_accel_path "/filters/filters-light-shadow-menu" "") +; (gtk_accel_path "/layers/layers-mode-previous" "") +; (gtk_accel_path "/vectors/vectors-export" "") +; (gtk_accel_path "/tools/tools-hardness-increase" "") +; (gtk_accel_path "/tools/tools-size-increase-percent" "") +; (gtk_accel_path "/view/view-zoom-16-1-accel" "KP_5") +; (gtk_accel_path "/filters/filters-deinterlace" "") +; (gtk_accel_path "/plug-in/plug-in-compose" "") +; (gtk_accel_path "/context/context-colors-swap" "x") +; (gtk_accel_path "/context/context-foreground-value-decrease-skip" "") +; (gtk_accel_path "/drawable/drawable-lock-position" "") +; (gtk_accel_path "/context/context-palette-background-first" "") +; (gtk_accel_path "/select/select-grow" "") +; (gtk_accel_path "/dockable/dockable-tab-style-icon" "") +; (gtk_accel_path "/documents/documents-remove-dangling" "") +; (gtk_accel_path "/filters/filters-recent-09" "") +; (gtk_accel_path "/help/help-context-help" "F1") +; (gtk_accel_path "/dockable/dialogs-images" "") +; (gtk_accel_path "/tools/tools-opacity-decrease-percent" "") +; (gtk_accel_path "/plug-in/plug-in-gimpressionist" "") +; (gtk_accel_path "/filters/filters-recent-08" "") +; (gtk_accel_path "/plug-in/script-fu-selection-rounded-rectangle" "") +; (gtk_accel_path "/plug-in/script-fu-grid-system" "") +; (gtk_accel_path "/dialogs/dialogs-tool-options" "") +; (gtk_accel_path "/context/context-colormap-background-previous-skip" "") +; (gtk_accel_path "/dockable/dialogs-vectors" "") +; (gtk_accel_path "/dockable/dialogs-navigation" "") +; (gtk_accel_path "/context/context-colormap-foreground-first" "") +; (gtk_accel_path "/tools/tools-unified-transform" "t") +; (gtk_accel_path "/view/view-zoom-in-accel" "KP_Add") +; (gtk_accel_path "/dialogs/dialogs-palettes" "") +; (gtk_accel_path "/file/file-quit" "q") +; (gtk_accel_path "/context/context-foreground-saturation-decrease" "") +; (gtk_accel_path "/image/image-menubar" "") +; (gtk_accel_path "/filters/filters-recent-07" "") +; (gtk_accel_path "/plug-in/script-fu-circuit" "") +; (gtk_accel_path "/tools/tools-ellipse-select" "e") +; (gtk_accel_path "/plug-in/script-fu-make-brush-rectangular" "") +; (gtk_accel_path "/filters/filters-invert-linear" "") +; (gtk_accel_path "/plug-in/script-fu-erase-rows" "") +; (gtk_accel_path "/filters/filters-noise-pick" "") +; (gtk_accel_path "/tools/tools-curves" "") +; (gtk_accel_path "/file/file-export-as" "e") +; (gtk_accel_path "/layers/layers-color-tag-red" "") +; (gtk_accel_path "/view/view-scroll-center" "j") +; (gtk_accel_path "/image/image-popup" "") +; (gtk_accel_path "/filters/filters-recent-06" "") +; (gtk_accel_path "/tools/tools-airbrush-flow-increase" "") +; (gtk_accel_path "/dialogs/dialogs-toolbox" "b") +; (gtk_accel_path "/view/view-scroll-bottom-border" "") +; (gtk_accel_path "/plug-in/plug-in-palettemap" "") +; (gtk_accel_path "/plug-in/plug-in-softglow" "") +; (gtk_accel_path "/context/context-pattern-select-previous" "") +; (gtk_accel_path "/edit/edit-menu" "") +; (gtk_accel_path "/filters/filters-recent-05" "") +; (gtk_accel_path "/image/image-color-profile-convert" "") +; (gtk_accel_path "/plug-in/plug-in-wavelet-decompose" "") +; (gtk_accel_path "/context/context-palette-select-last" "") +; (gtk_accel_path "/view/view-scroll-page-down" "") +; (gtk_accel_path "/filters/filters-recent-04" "") +; (gtk_accel_path "/image/image-convert-linear" "") +; (gtk_accel_path "/context/context-foreground-value-increase" "") +; (gtk_accel_path "/view/view-zoom-out-accel" "KP_Subtract") +; (gtk_accel_path "/brushes/brushes-edit" "") +; (gtk_accel_path "/image/image-crop-to-selection" "") +; (gtk_accel_path "/context/context-brush-radius-maximum" "") +; (gtk_accel_path "/filters/filters-oilify" "") +; (gtk_accel_path "/layers/layers-opacity-increase-skip" "") +; (gtk_accel_path "/windows/windows-docks-menu" "") +; (gtk_accel_path "/filters/filters-emboss" "") +; (gtk_accel_path "/dockable/dockable-menu" "") +; (gtk_accel_path "/filters/filters-recent-03" "") +; (gtk_accel_path "/plug-in/plug-in-qbist" "") +; (gtk_accel_path "/layers/layers-lower" "") +; (gtk_accel_path "/tools/tools-align" "q") +; (gtk_accel_path "/context/context-brush-aspect-increase-skip" "") +; (gtk_accel_path "/tools/tools-handle-transform" "l") +; (gtk_accel_path "/layers/layers-new-group" "") +; (gtk_accel_path "/filters/filters-waves" "") +; (gtk_accel_path "/context/context-opacity-menu" "") +; (gtk_accel_path "/filters/filters-recent-02" "") +; (gtk_accel_path "/layers/layers-crop-to-content" "") +; (gtk_accel_path "/filters/filters-whirl-pinch" "") +; (gtk_accel_path "/filters/filters-render-pattern-menu" "") +; (gtk_accel_path "/tools/tools-measure" "m") +; (gtk_accel_path "/dockable/dialogs-tool-presets" "") +; (gtk_accel_path "/tools/tools-aspect-maximum" "") +; (gtk_accel_path "/tools/tools-flip" "f") +; (gtk_accel_path "/tools/tools-airbrush-rate-minimum" "") +; (gtk_accel_path "/help/help-menu" "") +; (gtk_accel_path "/filters/filters-recent-01" "") +; (gtk_accel_path "/image/image-color-profile-save" "") +; (gtk_accel_path "/filters/filters-median-blur" "") +; (gtk_accel_path "/vectors/vectors-paste" "") +; (gtk_accel_path "/context/context-foreground-blue-minimum" "") +; (gtk_accel_path "/filters/filters-apply-canvas" "") +; (gtk_accel_path "/plug-in/file-png-save2" "") +; (gtk_accel_path "/drawable/drawable-levels-stretch" "") +; (gtk_accel_path "/filters/filters-difference-of-gaussians" "") +; (gtk_accel_path "/tools/tools-angle-increase-skip" "") +; (gtk_accel_path "/context/context-swatch-background-last" "") +; (gtk_accel_path "/tools/tools-move" "m") +; (gtk_accel_path "/tools/tools-convolve" "u") +; (gtk_accel_path "/tools/tools-airbrush-flow-increase-skip" "") +; (gtk_accel_path "/context/context-foreground-saturation-increase-skip" "") +; (gtk_accel_path "/channels/channels-color-tag-green" "") +; (gtk_accel_path "/tools/tools-aspect-decrease-percent" "") +; (gtk_accel_path "/plug-in/gimp-help-using-photography" "") +; (gtk_accel_path "/dialogs/dialogs-dashboard" "") +; (gtk_accel_path "/layers/layers-crop-to-selection" "") +; (gtk_accel_path "/layers/layers-mask-selection-subtract" "") +; (gtk_accel_path "/plug-in/script-fu-guides-remove" "") +; (gtk_accel_path "/dialogs/dialogs-palette-editor" "") +; (gtk_accel_path "/filters/filters-channel-mixer" "") +; (gtk_accel_path "/images/images-raise-views" "") +; (gtk_accel_path "/plug-in/script-fu-waves-anim" "") +; (gtk_accel_path "/context/context-foreground-green-maximum" "") +; (gtk_accel_path "/view/view-menu" "") +; (gtk_accel_path "/view/view-dot-for-dot" "") +; (gtk_accel_path "/context/context-gradient-select-set" "") +; (gtk_accel_path "/dockable/dockable-close-tab" "") +; (gtk_accel_path "/dockable/dialogs-dynamics-editor" "") +; (gtk_accel_path "/vectors/vectors-selection-intersect" "") +; (gtk_accel_path "/vectors/vectors-stroke" "") +; (gtk_accel_path "/filters/filters-little-planet" "") +; (gtk_accel_path "/context/context-pattern-menu" "") +; (gtk_accel_path "/view/view-show-rulers" "r") +; (gtk_accel_path "/context/context-brush-spikes-increase" "") +; (gtk_accel_path "/view/view-snap-to-guides" "") +; (gtk_accel_path "/layers/layers-alpha-selection-subtract" "") +; (gtk_accel_path "/channels/channels-select-top" "") +; (gtk_accel_path "/plug-in/script-fu-sota-chrome-it" "") +; (gtk_accel_path "/view/view-move-to-screen-:0.0" "") +; (gtk_accel_path "/plug-in/gimp-palette-export-python" "") +; (gtk_accel_path "/context/context-swatch-foreground-next" "0") +; (gtk_accel_path "/select/selection-popup" "") +; (gtk_accel_path "/brushes/brushes-refresh" "") +; (gtk_accel_path "/edit/edit-paste-into" "") +; (gtk_accel_path "/tools/tools-opacity-decrease" "less") +; (gtk_accel_path "/filters/filters-bayer-matrix" "") +; (gtk_accel_path "/context/context-brush-angle-minimum" "") +; (gtk_accel_path "/tools/tools-aspect-increase" "") +; (gtk_accel_path "/vectors/vectors-selection-to-vectors-short" "") +; (gtk_accel_path "/context/context-brush-spikes-maximum" "") +; (gtk_accel_path "/tools/tools-aspect-set" "") +; (gtk_accel_path "/fonts/fonts-popup" "") +; (gtk_accel_path "/layers/layers-popup" "") +; (gtk_accel_path "/context/context-foreground-green-increase-skip" "") +; (gtk_accel_path "/filters/filters-generic-menu" "") +; (gtk_accel_path "/image/image-resize-to-layers" "") +; (gtk_accel_path "/windows/windows-use-single-window-mode" "") +; (gtk_accel_path "/channels/channels-lower-to-bottom" "") +; (gtk_accel_path "/context/context-colormap-background-first" "") +; (gtk_accel_path "/edit/edit-fill-pattern" "semicolon") +; (gtk_accel_path "/context/context-paint-mode-first" "") +; (gtk_accel_path "/plug-in/script-fu-reverse-layers" "") +; (gtk_accel_path "/dockable/dockable-preview-size-extra-large" "") +; (gtk_accel_path "/dockable/dialogs-indexed-palette" "") +; (gtk_accel_path "/context/context-brush-spikes-set" "") +; (gtk_accel_path "/vectors/vectors-new-last-values" "") +; (gtk_accel_path "/tools/tools-object-2-previous" "") +; (gtk_accel_path "/plug-in/plug-in-retinex" "") +; (gtk_accel_path "/context/context-swatch-foreground-previous" "9") +; (gtk_accel_path "/context/context-foreground-value-decrease" "") +; (gtk_accel_path "/context/context-brush-select-first" "") +; (gtk_accel_path "/context/context-swatch-foreground-next-skip" "") +; (gtk_accel_path "/tools/tools-force-increase-skip" "") +; (gtk_accel_path "/dockable/dockable-detach-tab" "") +; (gtk_accel_path "/image/image-print-size" "") +; (gtk_accel_path "/filters/filters-fractal-trace" "") +; (gtk_accel_path "/filters/filters-panorama-projection" "") +; (gtk_accel_path "/context/context-paint-mode-last" "") +; (gtk_accel_path "/image/colors-components-menu" "") +; (gtk_accel_path "/context/context-colormap-foreground-last" "") +; (gtk_accel_path "/view/view-zoom-out" "minus") +; (gtk_accel_path "/plug-in/plug-in-colormap-remap" "") +; (gtk_accel_path "/context/context-palette-background-next-skip" "") +; (gtk_accel_path "/tools/tools-force-decrease" "") +; (gtk_accel_path "/context/context-background-hue-maximum" "") +; (gtk_accel_path "/plug-in/plug-in-mail-image" "") +; (gtk_accel_path "/filters/filters-mantiuk-2006" "") +; (gtk_accel_path "/plug-in/plug-in-small-tiles" "") +; (gtk_accel_path "/layers/layers-composite-mode-clip-to-layer" "") +; (gtk_accel_path "/filters/filters-noise-menu" "") +; (gtk_accel_path "/layers/layers-mask-disable" "") +; (gtk_accel_path "/tools/tools-brightness-contrast" "") +; (gtk_accel_path "/filters/filters-erode" "") +; (gtk_accel_path "/context/context-brush-spikes-increase-skip" "") +; (gtk_accel_path "/context/context-palette-select-previous" "") +; (gtk_accel_path "/vectors/vectors-color-tag-none" "") +; (gtk_accel_path "/layers/layers-transform-menu" "") +; (gtk_accel_path "/context/context-pattern-select-first" "") +; (gtk_accel_path "/tools/tools-spacing-increase-percent" "") +; (gtk_accel_path "/select/select-border" "") +; (gtk_accel_path "/plug-in/script-fu-clothify" "") +; (gtk_accel_path "/edit/edit-paste-into-in-place" "") +; (gtk_accel_path "/layers/layers-new-last-values" "") +; (gtk_accel_path "/context/context-opacity-transparent" "") +; (gtk_accel_path "/plug-in/plug-in-animationoptimize" "") +; (gtk_accel_path "/context/context-colormap-background-next" "") +; (gtk_accel_path "/layers/layers-blend-space-auto" "") +; (gtk_accel_path "/plug-in/file-pdf-save-multi" "") +; (gtk_accel_path "/layers/layers-merge-layers" "") +; (gtk_accel_path "/layers/layers-composite-space-auto" "") +; (gtk_accel_path "/context/context-opacity-decrease-skip" "") +; (gtk_accel_path "/dockable/dialogs-buffers" "") +; (gtk_accel_path "/tools/tools-perspective" "p") +; (gtk_accel_path "/context/context-foreground-red-increase-skip" "") +; (gtk_accel_path "/context/context-colormap-foreground-set" "") +; (gtk_accel_path "/plug-in/script-fu-copy-visible" "") +; (gtk_accel_path "/filters/filters-high-pass" "") +; (gtk_accel_path "/layers/layers-composite-mode-clip-to-backdrop" "") +; (gtk_accel_path "/tools/tools-menu" "") +; (gtk_accel_path "/context/context-background-green-maximum" "") +; (gtk_accel_path "/filters/filters-brightness-contrast" "") +; (gtk_accel_path "/filters/filters-shadows-highlights" "") +; (gtk_accel_path "/channels/channels-color-tag-brown" "") +; (gtk_accel_path "/filters/filters-desaturate" "") +; (gtk_accel_path "/context/context-palette-foreground-previous" "") +; (gtk_accel_path "/plug-in/plug-in-nlfilt" "") +; (gtk_accel_path "/plug-in/gimp-palette-export-text" "") +; (gtk_accel_path "/context/context-palette-foreground-set" "") +; (gtk_accel_path "/tools/tools-paintbrush-spacing-set" "") +; (gtk_accel_path "/filters/filters-offset" "o") +; (gtk_accel_path "/filters/filters-softglow" "") +; (gtk_accel_path "/context/context-brush-shape-square" "") +; (gtk_accel_path "/vectors/vectors-select-top" "") +; (gtk_accel_path "/patterns/patterns-popup" "") +; (gtk_accel_path "/tools/tools-opacity-minimum" "") +; (gtk_accel_path "/channels/channels-raise-to-top" "") +; (gtk_accel_path "/filters/filters-reinhard-2005" "") +; (gtk_accel_path "/filters/filters-threshold-alpha" "") +; (gtk_accel_path "/view/view-zoom-2-1-accel" "KP_2") +; (gtk_accel_path "/context/context-foreground-hue-minimum" "") +; (gtk_accel_path "/tools/tools-aspect-decrease" "") +; (gtk_accel_path "/context/context-brush-spacing-decrease-skip" "") +; (gtk_accel_path "/plug-in/plug-in-fractal-trace" "") +; (gtk_accel_path "/tools/tools-mypaint-brush-radius-set" "") +; (gtk_accel_path "/context/context-tool-select-first" "") +; (gtk_accel_path "/vectors/vectors-lower" "") +; (gtk_accel_path "/context/context-brush-aspect-minimum" "") +; (gtk_accel_path "/layers/layers-mask-delete" "") +; (gtk_accel_path "/tools/tools-angle-decrease-percent" "") +; (gtk_accel_path "/context/context-background-green-increase-skip" "") +; (gtk_accel_path "/plug-in/plug-in-ccanalyze" "") +; (gtk_accel_path "/filters/filters-artistic-menu" "") +; (gtk_accel_path "/select/select-flood" "") +; (gtk_accel_path "/tools/tools-hardness-set-to-default" "") +; (gtk_accel_path "/tools/tools-bucket-fill" "b") +; (gtk_accel_path "/tools/tools-angle-set" "") +; (gtk_accel_path "/tools/tools-ink-blob-aspect-set" "") +; (gtk_accel_path "/tools/tools-size-increase" "bracketright") +; (gtk_accel_path "/tools/tools-force-increase-percent" "") +; (gtk_accel_path "/image/image-color-management-menu" "") +; (gtk_accel_path "/channels/channels-selection-replace" "") +; (gtk_accel_path "/dockable/dialogs-layers" "l") +; (gtk_accel_path "/view/view-zoom-fit-in" "j") +; (gtk_accel_path "/brushes/brushes-delete" "") +; (gtk_accel_path "/filters/filters-repeat" "f") +; (gtk_accel_path "/filters/filters-maze" "") +; (gtk_accel_path "/context/context-brush-shape-menu" "") +; (gtk_accel_path "/dockable/dialogs-palette-editor" "") +; (gtk_accel_path "/filters/filters-color-balance" "") +; (gtk_accel_path "/drawable/drawable-flip-vertical" "") +; (gtk_accel_path "/tools/tools-size-set-to-default" "backslash") +; (gtk_accel_path "/context/context-foreground-blue-decrease-skip" "") +; (gtk_accel_path "/context/context-colors-default" "d") +; (gtk_accel_path "/layers/layers-raise-to-top" "") +; (gtk_accel_path "/plug-in/plug-in-gradmap" "") +; (gtk_accel_path "/filters/filters-checkerboard" "") +; (gtk_accel_path "/image/image-convert-grayscale" "") +; (gtk_accel_path "/plug-in/script-fu-fuzzy-border" "") +; (gtk_accel_path "/filters/filters-tile-paper" "") +; (gtk_accel_path "/dialogs/dialogs-selection-editor" "") +; (gtk_accel_path "/layers/layers-edit" "") +; (gtk_accel_path "/image/colors-desaturate-menu" "") +; (gtk_accel_path "/layers/layers-flatten-image" "") +; (gtk_accel_path "/tools/tools-airbrush-rate-increase-skip" "") +; (gtk_accel_path "/channels/channels-select-bottom" "") +; (gtk_accel_path "/dialogs/dialogs-preferences" "") +; (gtk_accel_path "/plug-in/plug-in-animationplay" "") +; (gtk_accel_path "/context/context-brush-angle-menu" "") +; (gtk_accel_path "/tools/tools-airbrush-flow-minimum" "") +; (gtk_accel_path "/view/view-rotate-menu" "") +; (gtk_accel_path "/vectors/vectors-import" "") +; (gtk_accel_path "/plug-in/script-fu-xach-effect" "") +; (gtk_accel_path "/view/view-rotate-345" "") +; (gtk_accel_path "/plug-in/plug-in-decompose" "") +; (gtk_accel_path "/plug-in/gimp-palette-export-css" "") +; (gtk_accel_path "/filters/filters-color-exchange" "") +; (gtk_accel_path "/tools/tools-warp-effect-size-set" "") +; (gtk_accel_path "/view/view-display-intent-perceptual" "") +; (gtk_accel_path "/dialogs/dialogs-navigation" "") +; (gtk_accel_path "/dock/dock-open-display" "") +; (gtk_accel_path "/context/context-paint-mode-previous" "") +; (gtk_accel_path "/plug-in/plug-in-hot" "") +; (gtk_accel_path "/tools/tools-aspect-decrease-skip" "") +; (gtk_accel_path "/view/view-zoom-out-skip" "") +; (gtk_accel_path "/dialogs/dialogs-keyboard-shortcuts" "") +; (gtk_accel_path "/view/view-zoom-maximum" "") +; (gtk_accel_path "/dialogs/dialogs-input-devices" "") +; (gtk_accel_path "/dockable/dialogs-document-history" "") +; (gtk_accel_path "/quick-mask/quick-mask-invert-on" "") +; (gtk_accel_path "/context/context-swatch-foreground-first" "") +; (gtk_accel_path "/file/file-export" "e") +; (gtk_accel_path "/plug-in/script-fu-set-cmap" "") +; (gtk_accel_path "/layers/layers-text-discard" "") +; (gtk_accel_path "/context/context-foreground-red-maximum" "") +; (gtk_accel_path "/filters/filters-edge-sobel" "") +; (gtk_accel_path "/dockable/dockable-preview-size-tiny" "") +; (gtk_accel_path "/plug-in/script-fu-guide-new-percent" "") +; (gtk_accel_path "/view/view-show-scrollbars" "") +; (gtk_accel_path "/filters/filters-render-noise-menu" "") +; (gtk_accel_path "/channels/channels-delete" "") +; (gtk_accel_path "/image/image-flip-vertical" "") +; (gtk_accel_path "/layers/layers-opacity-set" "") +; (gtk_accel_path "/context/context-font-select-next" "") +; (gtk_accel_path "/context/context-menu" "") +; (gtk_accel_path "/image/image-convert-half" "") +; (gtk_accel_path "/tools/tools-size-increase-skip" "braceright") +; (gtk_accel_path "/file/file-overwrite" "") +; (gtk_accel_path "/context/context-background-red-increase-skip" "") +; (gtk_accel_path "/vectors/vectors-popup" "") +; (gtk_accel_path "/image/image-rotate-90" "") +; (gtk_accel_path "/edit/edit-fill-bg" "period") +; (gtk_accel_path "/tools/tools-iscissors" "i") +; (gtk_accel_path "/context/context-palette-menu" "") +; (gtk_accel_path "/layers/layers-properties-menu" "") +; (gtk_accel_path "/view/view-flip-vertically" "") +; (gtk_accel_path "/context/context-foreground-hue-increase" "") +; (gtk_accel_path "/select/select-invert" "i") +; (gtk_accel_path "/layers/layers-mode-next" "") +; (gtk_accel_path "/file/file-save-as" "s") +; (gtk_accel_path "/context/context-swatch-foreground-last" "") +; (gtk_accel_path "/context/context-palette-background-next" "") +; (gtk_accel_path "/image/image-rotate-270" "") +; (gtk_accel_path "/tools/tools-warp" "w") +; (gtk_accel_path "/context/context-brush-hardness-menu" "") +; (gtk_accel_path "/plug-in/script-fu-erase-nth-rows" "") +; (gtk_accel_path "/context/context-brush-radius-decrease-less" "") +; (gtk_accel_path "/quick-mask/quick-mask-popup" "") +; (gtk_accel_path "/plug-in/plug-in-sparkle" "") +; (gtk_accel_path "/vectors/vectors-selection-subtract" "") +; (gtk_accel_path "/filters/filters-combine-menu" "") +; (gtk_accel_path "/layers/layers-raise" "") +; (gtk_accel_path "/edit/edit-strong-undo" "z") +; (gtk_accel_path "/context/context-colormap-foreground-next-skip" "") +; (gtk_accel_path "/context/context-brush-aspect-increase" "") +; (gtk_accel_path "/filters/filters-invert-value" "") +; (gtk_accel_path "/context/context-foreground-blue-set" "") +; (gtk_accel_path "/filters/filters-bump-map" "") +; (gtk_accel_path "/plug-in/file-gih-save-internal" "") +; (gtk_accel_path "/context/context-background-blue-increase-skip" "") +; (gtk_accel_path "/plug-in/script-fu-old-photo" "") +; (gtk_accel_path "/patterns/patterns-edit" "") +; (gtk_accel_path "/dialogs/dialogs-module-dialog" "") +; (gtk_accel_path "/image/image-configure-grid" "") +; (gtk_accel_path "/context/context-tool-menu" "") +; (gtk_accel_path "/view/view-zoom-1-1-accel" "KP_1") +; (gtk_accel_path "/filters/filters-noise-spread" "") +; (gtk_accel_path "/plug-in/script-fu-round-corners" "") +; (gtk_accel_path "/tools/tools-hardness-increase-skip" "") +; (gtk_accel_path "/select/select-save" "") +; (gtk_accel_path "/context/context-background-saturation-set" "") +; (gtk_accel_path "/plug-in/script-fu-guide-new" "") +; (gtk_accel_path "/tools/tools-hardness-decrease-percent" "") +; (gtk_accel_path "/tools/tools-size-minimum" "") +; (gtk_accel_path "/plug-in/gimp-help-concepts-paths" "") +; (gtk_accel_path "/vectors/vectors-select-next" "") +; (gtk_accel_path "/filters/filters-noise-cell" "") +; (gtk_accel_path "/quick-mask/quick-mask-toggle" "q") +; (gtk_accel_path "/filters/filters-gaussian-blur" "") +; (gtk_accel_path "/plug-in/plug-in-screenshot" "") +; (gtk_accel_path "/view/view-rotate-180" "") +; (gtk_accel_path "/tools/tools-text" "t") +; (gtk_accel_path "/filters/filters-newsprint" "") +; (gtk_accel_path "/filters/filters-noise-solid" "") +; (gtk_accel_path "/file/file-open-as-layers" "o") +; (gtk_accel_path "/context/context-background-red-minimum" "") +; (gtk_accel_path "/plug-in/gimp-online-wiki" "") +; (gtk_accel_path "/layers/layers-merge-down-button" "") +; (gtk_accel_path "/plug-in/script-fu-refresh" "") +; (gtk_accel_path "/layers/layers-text-to-vectors" "") +; (gtk_accel_path "/vectors/vectors-fill-last-values" "") +; (gtk_accel_path "/documents/documents-popup" "") +; (gtk_accel_path "/view/view-padding-color-menu" "") +; (gtk_accel_path "/tools/tools-smudge" "s") +; (gtk_accel_path "/context/context-font-menu" "") +; (gtk_accel_path "/tools/tools-mypaint-brush-hardness-set" "") +; (gtk_accel_path "/plug-in/plug-in-pagecurl" "") +; (gtk_accel_path "/dialogs/dialogs-layers" "l") +; (gtk_accel_path "/context/context-colormap-background-last" "") +; (gtk_accel_path "/plug-in/script-fu-selection-to-image" "") +; (gtk_accel_path "/channels/channels-selection-add" "") +; (gtk_accel_path "/context/context-palette-select-first" "") +; (gtk_accel_path "/layers/layers-lock-position" "") +; (gtk_accel_path "/tools/tools-object-1-next" "") +; (gtk_accel_path "/dialogs/dialogs-device-status" "") +; (gtk_accel_path "/view/view-scroll-vertical" "") +; (gtk_accel_path "/view/view-show-selection" "t") +; (gtk_accel_path "/tools/tools-spacing-maximum" "") +; (gtk_accel_path "/filters/filters-photocopy" "") +; (gtk_accel_path "/channels/channels-color-tag-orange" "") +; (gtk_accel_path "/tools/tools-ink-blob-angle-set" "") +; (gtk_accel_path "/context/context-background-saturation-minimum" "") +; (gtk_accel_path "/layers/layers-lock-alpha" "") +; (gtk_accel_path "/tools/tools-transform-menu" "") +; (gtk_accel_path "/plug-in/plug-in-borderaverage" "") +; (gtk_accel_path "/view/view-padding-color-theme" "") +; (gtk_accel_path "/plug-in/script-fu-gradient-example" "") +; (gtk_accel_path "/filters/filters-color-rotate" "") +; (gtk_accel_path "/dockable/dialogs-dynamics" "") +; (gtk_accel_path "/plug-in/gimp-online-roadmap" "") +; (gtk_accel_path "/filters/filters-vignette" "") +; (gtk_accel_path "/patterns/patterns-copy-location" "") +; (gtk_accel_path "/filters/filters-apply-lens" "") +; (gtk_accel_path "/tools/tools-angle-minimum" "") +; (gtk_accel_path "/tools/tools-ink" "k") +; (gtk_accel_path "/tools/tools-airbrush-rate-set" "") +; (gtk_accel_path "/layers/layers-mask-add-button" "") +; (gtk_accel_path "/layers/layers-color-tag-orange" "") +; (gtk_accel_path "/plug-in/script-fu-coffee-stain" "") +; (gtk_accel_path "/view/view-display-filters" "") +; (gtk_accel_path "/context/context-swatch-background-first" "") +; (gtk_accel_path "/plug-in/plug-in-tile" "") +; (gtk_accel_path "/filters/filters-noise-rgb" "") +; (gtk_accel_path "/layers/layers-composite-mode-intersection" "") +; (gtk_accel_path "/context/context-foreground-hue-decrease" "") +; (gtk_accel_path "/filters/filters-edge-neon" "") +; (gtk_accel_path "/dialogs/dialogs-about" "") +; (gtk_accel_path "/plug-in/plug-in-despeckle" "") +; (gtk_accel_path "/tools/tools-spacing-set" "") +; (gtk_accel_path "/dialogs/dialogs-templates" "") +; (gtk_accel_path "/tools/tools-object-2-first" "") +; (gtk_accel_path "/context/context-background-blue-minimum" "") +; (gtk_accel_path "/documents/documents-file-open-dialog" "") +; (gtk_accel_path "/quick-mask/quick-mask-invert-off" "") +; (gtk_accel_path "/filters/filters-tile-seamless" "") +; (gtk_accel_path "/filters/filters-red-eye-removal" "") +; (gtk_accel_path "/layers/layers-resize-to-image" "") +; (gtk_accel_path "/filters/filters-lens-flare" "") +; (gtk_accel_path "/filters/filters-render-fractals-menu" "") +; (gtk_accel_path "/context/context-brush-angle-decrease-skip" "") +; (gtk_accel_path "/plug-in/gimp-help-using-web" "") +; (gtk_accel_path "/view/view-color-management-softproof" "") +; (gtk_accel_path "/dialogs/dialogs-vectors" "") +; (gtk_accel_path "/edit/edit-buffer-menu" "") +; (gtk_accel_path "/plug-in/script-fu-make-brush-elliptical" "") +; (gtk_accel_path "/plug-in/plug-in-grid" "") +; (gtk_accel_path "/plug-in/file-pdf-save" "") +; (gtk_accel_path "/filters/filters-color-enhance" "") +; (gtk_accel_path "/plug-in/file-png-save" "") +; (gtk_accel_path "/view/view-padding-color-custom" "") +; (gtk_accel_path "/plug-in/script-fu-weave" "") +; (gtk_accel_path "/filters/filters-blur-menu" "") +; (gtk_accel_path "/context/context-brush-aspect-decrease" "") +; (gtk_accel_path "/tools/tools-paintbrush-angle-set" "") +; (gtk_accel_path "/context/context-pattern-select-next" "") +; (gtk_accel_path "/channels/channels-lower" "") +; (gtk_accel_path "/view/view-rotate-other" "") +; (gtk_accel_path "/context/context-brush-hardness-minimum" "") +; (gtk_accel_path "/filters/filters-mosaic" "") +; (gtk_accel_path "/patterns/patterns-show-in-file-manager" "") +; (gtk_accel_path "/debug/debug-menu" "") +; (gtk_accel_path "/context/context-brush-radius-increase-skip" "") +; (gtk_accel_path "/view/view-softproof-black-point-compensation" "") +; (gtk_accel_path "/select/select-menu" "") +; (gtk_accel_path "/plug-in/plug-in-sample-colorize" "") +; (gtk_accel_path "/file/file-open-recent-10" "0") +; (gtk_accel_path "/tools/tools-by-color-select" "o") +; (gtk_accel_path "/context/context-palette-background-previous" "") +; (gtk_accel_path "/tools/tools-force-minimum" "") +; (gtk_accel_path "/channels/channels-color-tag-violet" "") +; (gtk_accel_path "/context/context-swatch-background-next-skip" "") +; (gtk_accel_path "/dockable/dialogs-brush-editor" "") +; (gtk_accel_path "/plug-in/gimp-help-using-simpleobjects" "") +; (gtk_accel_path "/filters/filters-recursive-transform" "") +; (gtk_accel_path "/plug-in/script-fu-add-bevel" "") +; (gtk_accel_path "/dialogs/dialogs-dynamics" "") +; (gtk_accel_path "/plug-in/plug-in-curve-bend" "") +; (gtk_accel_path "/context/context-background-saturation-increase-skip" "") +; (gtk_accel_path "/view/view-scroll-page-up" "") +; (gtk_accel_path "/filters/filters-convolution-matrix" "") +; (gtk_accel_path "/tools/tools-pencil" "n") +; (gtk_accel_path "/filters/filters-levels" "") +; (gtk_accel_path "/layers/layers-color-tag-violet" "") +; (gtk_accel_path "/tools/tools-opacity-increase" "greater") +; (gtk_accel_path "/context/context-brush-radius-decrease-percent" "") +; (gtk_accel_path "/context/context-foreground-red-set" "") +; (gtk_accel_path "/select/select-fill" "") +; (gtk_accel_path "/filters/filters-colorize" "") +; (gtk_accel_path "/view/view-padding-color-dark-check" "") +; (gtk_accel_path "/tools/tools-hardness-maximum" "") +; (gtk_accel_path "/tool-options/tool-options-save-new-preset" "") +; (gtk_accel_path "/tools/tools-spacing-increase-skip" "") +; (gtk_accel_path "/context/context-gradient-select-previous" "") +; (gtk_accel_path "/layers/layers-new-from-visible" "") +; (gtk_accel_path "/filters/filters-saturation" "") +; (gtk_accel_path "/tools/tools-crop" "c") +; (gtk_accel_path "/plug-in/plug-in-flame" "") +; (gtk_accel_path "/images/images-popup" "") +; (gtk_accel_path "/context/context-font-select-last" "") +; (gtk_accel_path "/vectors/vectors-new" "") +; (gtk_accel_path "/tool-options/tool-options-popup" "") +; (gtk_accel_path "/filters/filters-posterize" "") +; (gtk_accel_path "/dockable/dockable-view-type-list" "") +; (gtk_accel_path "/filters/filters-slic" "") +; (gtk_accel_path "/view/view-rotate-reset" "exclam") +; (gtk_accel_path "/filters/filters-shift" "") +; (gtk_accel_path "/drawable/drawable-rotate-90" "") +; (gtk_accel_path "/plug-in/plug-in-lighting" "") +; (gtk_accel_path "/tools/tools-mypaint-brush" "y") +; (gtk_accel_path "/channels/channels-color-tag-menu" "") +; (gtk_accel_path "/layers/layers-merge-down" "") +; (gtk_accel_path "/dialogs/dialogs-tips" "") +; (gtk_accel_path "/layers/layers-mode-last" "") +; (gtk_accel_path "/tools/tools-warp-effect-hardness-set" "") +; (gtk_accel_path "/layers/layers-alpha-add" "") +; (gtk_accel_path "/filters/filters-map-menu" "") +; (gtk_accel_path "/context/context-palette-foreground-previous-skip" "") +; (gtk_accel_path "/context/context-tool-select-set" "") +; (gtk_accel_path "/plug-in/plug-in-color-enhance" "") +; (gtk_accel_path "/filters/filters-dilate" "") +; (gtk_accel_path "/context/context-palette-background-last" "") +; (gtk_accel_path "/image/image-mode-menu" "") +; (gtk_accel_path "/vectors/vectors-raise" "") +; (gtk_accel_path "/vectors/vectors-selection-to-vectors" "") +; (gtk_accel_path "/edit/edit-named-copy-visible" "") +; (gtk_accel_path "/dockable/dialogs-brushes" "b") +; (gtk_accel_path "/drawable/drawable-rotate-180" "") +; (gtk_accel_path "/filters/filters-decor-menu" "") +; (gtk_accel_path "/layers/layers-composite-mode-menu" "") +; (gtk_accel_path "/tools/tools-airbrush-rate-decrease" "") +; (gtk_accel_path "/image/image-convert-gamma" "") +; (gtk_accel_path "/context/context-foreground-hue-increase-skip" "") +; (gtk_accel_path "/channels/channels-popup" "") +; (gtk_accel_path "/channels/channels-color-tag-yellow" "") +; (gtk_accel_path "/dockable/dockable-preview-size-small" "") +; (gtk_accel_path "/image/image-guides-menu" "") +; (gtk_accel_path "/tools/tools-force-increase" "") +; (gtk_accel_path "/layers/layers-alpha-selection-intersect" "") +; (gtk_accel_path "/context/context-brush-select-next" "") +; (gtk_accel_path "/filters/filters-waterpixels" "") +; (gtk_accel_path "/context/context-brush-spacing-increase" "") +; (gtk_accel_path "/dialogs/dialogs-action-search" "slash") +; (gtk_accel_path "/layers/layers-select-next" "Page_Down") +; (gtk_accel_path "/tools/tools-rotate-arbitrary" "") +; (gtk_accel_path "/layers/layers-opacity-decrease-skip" "") +; (gtk_accel_path "/view/view-zoom-16-1" "5") +; (gtk_accel_path "/plug-in/gimp-help-concepts-usage" "") +; (gtk_accel_path "/debug/debug-dump-keyboard-shortcuts" "") +; (gtk_accel_path "/image/image-color-profile-discard" "") +; (gtk_accel_path "/filters/filters-mean-curvature-blur" "") +; (gtk_accel_path "/layers/layers-color-tag-yellow" "") +; (gtk_accel_path "/context/context-brush-aspect-decrease-skip" "") +; (gtk_accel_path "/dock/dock-move-to-screen-:0.0" "") +; (gtk_accel_path "/filters/filters-animation-menu" "") +; (gtk_accel_path "/filters/filters-noise-reduction" "") +; (gtk_accel_path "/dialogs/dialogs-gradients" "g") +; (gtk_accel_path "/tools/tools-object-1-previous" "") +; (gtk_accel_path "/image/image-duplicate" "d") +; (gtk_accel_path "/documents/documents-show-in-file-manager" "") +; (gtk_accel_path "/dockable/dialogs-patterns" "p") +; (gtk_accel_path "/view/view-scroll-right-border" "") +; (gtk_accel_path "/edit/edit-paste" "v") +; (gtk_accel_path "/context/context-palette-foreground-next" "") +; (gtk_accel_path "/channels/channels-color-tag-red" "") +; (gtk_accel_path "/filters/filters-mono-mixer" "") +; (gtk_accel_path "/context/context-font-select-set" "") +; (gtk_accel_path "/patterns/patterns-duplicate" "") +; (gtk_accel_path "/filters/filters-spiral" "") +; (gtk_accel_path "/plug-in/plug-in-unit-editor" "") +; (gtk_accel_path "/tools/tools-angle-decrease-skip" "") +; (gtk_accel_path "/tools/tools-airbrush-flow-decrease-skip" "") +; (gtk_accel_path "/vectors/vectors-select-bottom" "") +; (gtk_accel_path "/context/context-foreground-value-set" "") +; (gtk_accel_path "/debug/debug-dump-items" "") +; (gtk_accel_path "/view/view-scroll-up" "") +; (gtk_accel_path "/plug-in/gimp-help-using-selections" "") +; (gtk_accel_path "/plug-in/plug-in-cml-explorer" "") +; (gtk_accel_path "/select/select-stroke" "") +; (gtk_accel_path "/context/context-foreground-saturation-decrease-skip" "") +; (gtk_accel_path "/tool-options/tool-options-reset-all" "") +; (gtk_accel_path "/drawable/drawable-visible" "") +; (gtk_accel_path "/image/image-metadata-menu" "") +; (gtk_accel_path "/channels/channels-select-previous" "") +; (gtk_accel_path "/context/context-brush-angle-increase" "") +; (gtk_accel_path "/filters/filters-snn-mean" "") +; (gtk_accel_path "/tools/tools-hardness-set" "") +; (gtk_accel_path "/tools/tools-object-1-last" "") +; (gtk_accel_path "/layers/layers-color-tag-menu" "") +; (gtk_accel_path "/context/context-background-value-increase-skip" "") +; (gtk_accel_path "/view/view-display-intent-relative-colorimetric" "") +; (gtk_accel_path "/tools/tools-aspect-set-to-default" "") +; (gtk_accel_path "/filters/filters-supernova" "") +; (gtk_accel_path "/image/image-transform-menu" "") +; (gtk_accel_path "/view/view-shrink-wrap" "j") +; (gtk_accel_path "/context/context-swatch-foreground-set" "") +; (gtk_accel_path "/plug-in/file-pat-save-internal" "") +; (gtk_accel_path "/context/context-foreground-red-decrease" "") +; (gtk_accel_path "/view/view-zoom-8-1" "4") +; (gtk_accel_path "/context/context-brush-radius-minimum" "") +; (gtk_accel_path "/filters/filters-sepia" "") +; (gtk_accel_path "/debug/debug-dump-attached-data" "") +; (gtk_accel_path "/context/context-brush-hardness-increase" "") +; (gtk_accel_path "/context/context-foreground-saturation-set" "") +; (gtk_accel_path "/view/view-softproof-gamut-check" "") +; (gtk_accel_path "/dialogs/dialogs-images" "") +; (gtk_accel_path "/layers/layers-mask-selection-intersect" "") +(gtk_accel_path "/plug-in/file-print-gtk" "p") +; (gtk_accel_path "/filters/filters-reshow" "f") +; (gtk_accel_path "/dialogs/dialogs-gradient-editor" "") +; (gtk_accel_path "/view/view-move-to-screen-menu" "") +; (gtk_accel_path "/documents/documents-copy-location" "") +; (gtk_accel_path "/view/view-open-display" "") +; (gtk_accel_path "/plug-in/file-tiff-save2" "") +; (gtk_accel_path "/layers/layers-linked" "") +; (gtk_accel_path "/tool-options/tool-options-save-preset-menu" "") +; (gtk_accel_path "/context/context-brush-spacing-maximum" "") +; (gtk_accel_path "/images/images-delete" "") +; (gtk_accel_path "/file/file-copy-location" "") +; (gtk_accel_path "/dialogs/dialogs-buffers" "") +; (gtk_accel_path "/layers/layers-menu" "") +; (gtk_accel_path "/tools/tools-aspect-minimum" "") +; (gtk_accel_path "/context/context-foreground-green-decrease-skip" "") +; (gtk_accel_path "/context/context-palette-background-previous-skip" "") +; (gtk_accel_path "/edit/edit-paste-as-new-image" "v") +; (gtk_accel_path "/filters/filters-stress" "") +; (gtk_accel_path "/dialogs/dialogs-patterns" "p") +; (gtk_accel_path "/filters/filters-edge-laplace" "") +; (gtk_accel_path "/context/context-background-green-decrease" "") +; (gtk_accel_path "/view/view-rotate-90" "") +; (gtk_accel_path "/filters/filters-ripple" "") +; (gtk_accel_path "/filters/filters-variable-blur" "") +; (gtk_accel_path "/plug-in/plug-in-ifscompose" "") +; (gtk_accel_path "/context/context-brush-spacing-decrease" "") +; (gtk_accel_path "/tools/tools-airbrush" "a") +; (gtk_accel_path "/context/context-background-hue-increase-skip" "") +; (gtk_accel_path "/view/view-softproof-intent-menu" "") +; (gtk_accel_path "/filters/filters-sinus" "") +; (gtk_accel_path "/filters/filters-c2g" "") +; (gtk_accel_path "/plug-in/plug-in-metadata-viewer" "") +; (gtk_accel_path "/tool-options/tool-options-edit-preset-menu" "") +; (gtk_accel_path "/view/view-close" "w") +; (gtk_accel_path "/layers/layers-edit-text" "") +; (gtk_accel_path "/context/context-brush-shape-diamond" "") +; (gtk_accel_path "/tools/tools-force-decrease-skip" "") +; (gtk_accel_path "/plug-in/gimp-online-main-web-site" "") +; (gtk_accel_path "/vectors/vectors-edit-attributes" "") +; (gtk_accel_path "/context/context-opacity-increase" "") +; (gtk_accel_path "/dockable/dialogs-tool-options" "") +; (gtk_accel_path "/context/context-brush-spacing-set" "") +; (gtk_accel_path "/context/context-pattern-select-last" "") +; (gtk_accel_path "/filters/filters-distance-map" "") +; (gtk_accel_path "/tools/tools-free-select" "f") +; (gtk_accel_path "/context/context-foreground-green-minimum" "") +; (gtk_accel_path "/file/file-open-recent-09" "9") +; (gtk_accel_path "/dockable/dialogs-fonts" "") +; (gtk_accel_path "/context/context-tool-select-next" "") +; (gtk_accel_path "/layers/layers-select-top" "Home") +; (gtk_accel_path "/channels/channels-selection-subtract" "") +; (gtk_accel_path "/file/file-open-recent-08" "8") +; (gtk_accel_path "/context/context-background-hue-increase" "") +; (gtk_accel_path "/context/context-colormap-background-next-skip" "") +; (gtk_accel_path "/context/context-brush-spikes-decrease-skip" "") +; (gtk_accel_path "/dialogs/dialogs-mypaint-brushes" "") +; (gtk_accel_path "/context/context-font-select-previous" "") +; (gtk_accel_path "/file/file-open-recent-07" "7") +; (gtk_accel_path "/plug-in/plug-in-film" "") +; (gtk_accel_path "/layers/layers-anchor" "h") +; (gtk_accel_path "/view/view-new" "") +; (gtk_accel_path "/edit/edit-redo" "y") +; (gtk_accel_path "/context/context-brush-angle-decrease" "") +; (gtk_accel_path "/file/file-open-recent-06" "6") +; (gtk_accel_path "/images/images-new-view" "") +; (gtk_accel_path "/plug-in/plug-in-goat-exercise" "") +; (gtk_accel_path "/plug-in/file-gbr-save-internal" "") +; (gtk_accel_path "/file/file-open-recent-05" "5") +; (gtk_accel_path "/edit/edit-paste-in-place" "v") +; (gtk_accel_path "/vectors/vectors-selection-add" "") +; (gtk_accel_path "/tools/tools-aspect-increase-percent" "") +; (gtk_accel_path "/plug-in/plug-in-reset-all" "") +; (gtk_accel_path "/layers/layers-edit-attributes" "") +; (gtk_accel_path "/drawable/drawable-lock-content" "") +; (gtk_accel_path "/plug-in/gimp-help-using-docks" "") +; (gtk_accel_path "/filters/filters-hue-saturation" "") +; (gtk_accel_path "/context/context-foreground-red-decrease-skip" "") +; (gtk_accel_path "/filters/filters-lens-distortion" "") +; (gtk_accel_path "/image/image-convert-indexed" "") +; (gtk_accel_path "/filters/filters-tile-glass" "") +; (gtk_accel_path "/plug-in/script-fu-lava" "") +; (gtk_accel_path "/file/file-open-recent-04" "4") +; (gtk_accel_path "/dock/dock-auto-follow-active" "") +; (gtk_accel_path "/plug-in/script-fu-spyrogimp" "") +; (gtk_accel_path "/patterns/patterns-open-as-image" "") +; (gtk_accel_path "/context/context-foreground-saturation-maximum" "") +; (gtk_accel_path "/image/colors-map-menu" "") +; (gtk_accel_path "/context/context-brush-radius-set" "") +; (gtk_accel_path "/file/file-open-recent-03" "3") +; (gtk_accel_path "/context/context-brush-hardness-decrease" "") +; (gtk_accel_path "/windows/windows-show-display-previous" "Tab") +; (gtk_accel_path "/view/view-softproof-intent-relative-colorimetric" "") +; (gtk_accel_path "/tools/tools-force-set-to-default" "") +; (gtk_accel_path "/file/file-open-recent-02" "2") +; (gtk_accel_path "/drawable/drawable-equalize" "") +; (gtk_accel_path "/context/context-font-select-first" "") +; (gtk_accel_path "/plug-in/plug-in-animationunoptimize" "") +; (gtk_accel_path "/layers/layers-mask-selection-replace" "") +; (gtk_accel_path "/patterns/patterns-refresh" "") +; (gtk_accel_path "/file/file-open-recent-01" "1") +; (gtk_accel_path "/image/image-crop-to-content" "") +; (gtk_accel_path "/filters/filters-polar-coordinates" "") +; (gtk_accel_path "/brushes/brushes-new" "") +; (gtk_accel_path "/context/context-background-hue-minimum" "") +; (gtk_accel_path "/tools/tools-rotate" "r") +; (gtk_accel_path "/image/image-convert-double" "") +; (gtk_accel_path "/view/view-zoom-1-8" "4") +; (gtk_accel_path "/context/context-background-green-decrease-skip" "") +; (gtk_accel_path "/edit/edit-fill-fg" "comma") +; (gtk_accel_path "/tools/tools-scale" "s") +; (gtk_accel_path "/context/context-brush-select-last" "") +; (gtk_accel_path "/plug-in/script-fu-distress-selection" "") +; (gtk_accel_path "/edit/undo-popup" "") +; (gtk_accel_path "/layers/layers-mode-first" "") +; (gtk_accel_path "/view/view-zoom-1-16" "5") +; (gtk_accel_path "/dockable/dockable-add-tab-menu" "") +; (gtk_accel_path "/context/context-tool-select-previous" "") +; (gtk_accel_path "/channels/channels-color-tag-gray" "") +; (gtk_accel_path "/dockable/dialogs-error-console" "") +; (gtk_accel_path "/context/context-foreground-value-maximum" "") +; (gtk_accel_path "/channels/channels-raise" "") +; (gtk_accel_path "/context/context-background-red-set" "") +; (gtk_accel_path "/plug-in/script-fu-perspective-shadow" "") +; (gtk_accel_path "/context/context-opacity-decrease" "") +; (gtk_accel_path "/filters/filters-cubism" "") +; (gtk_accel_path "/filters/filters-motion-blur-circular" "") +; (gtk_accel_path "/context/context-gradient-menu" "") +; (gtk_accel_path "/plug-in/plug-in-max-rgb" "") +; (gtk_accel_path "/image/image-resize" "") +; (gtk_accel_path "/filters/filters-normal-map" "") +; (gtk_accel_path "/vectors/vectors-color-tag-green" "") +; (gtk_accel_path "/plug-in/gimp-online-docs-web-site" "") +; (gtk_accel_path "/view/view-zoom-1-4" "3") +; (gtk_accel_path "/vectors/vectors-copy" "") +; (gtk_accel_path "/context/context-palette-foreground-last" "") +; (gtk_accel_path "/tools/tools-airbrush-rate-decrease-skip" "") +; (gtk_accel_path "/tools/tools-shear" "h") +; (gtk_accel_path "/context/context-background-green-minimum" "") +; (gtk_accel_path "/view/view-snap-to-canvas" "") +; (gtk_accel_path "/view/view-scroll-left-border" "") +; (gtk_accel_path "/filters/filters-pixelize" "") +; (gtk_accel_path "/dock/dock-close" "") +; (gtk_accel_path "/windows/windows-hide-docks" "Tab") +; (gtk_accel_path "/view/view-show-layer-boundary" "") +; (gtk_accel_path "/file/file-save" "s") +; (gtk_accel_path "/layers/layers-composite-space-rgb-linear" "") +; (gtk_accel_path "/context/context-background-hue-decrease" "") +; (gtk_accel_path "/windows/windows-show-display-next" "Tab") +; (gtk_accel_path "/brushes/brushes-copy-location" "") +; (gtk_accel_path "/filters/filters-noise-slur" "") +; (gtk_accel_path "/view/view-zoom-1-2" "2") +; (gtk_accel_path "/image/image-menu" "") +; (gtk_accel_path "/plug-in/plug-in-photocopy" "") +; (gtk_accel_path "/edit/edit-paste-as-menu" "") +; (gtk_accel_path "/tools/tools-select-menu" "") +; (gtk_accel_path "/view/view-zoom-1-1" "1") +; (gtk_accel_path "/plug-in/plug-in-warp" "") +; (gtk_accel_path "/dockable/dockable-preview-size-huge" "") +; (gtk_accel_path "/dockable/dockable-tab-style-automatic" "") +; (gtk_accel_path "/layers/layers-mask-edit" "") +; (gtk_accel_path "/windows/windows-show-tabs" "") +; (gtk_accel_path "/layers/layers-mask-add-last-values" "") +; (gtk_accel_path "/plug-in/file-raw-save" "") +; (gtk_accel_path "/image/image-merge-layers" "m") +; (gtk_accel_path "/filters/filters-noise-perlin" "") +; (gtk_accel_path "/plug-in/plug-in-destripe" "") +; (gtk_accel_path "/dockable/dockable-tab-style-icon-name" "") +; (gtk_accel_path "/dockable/dockable-preview-size-large" "") +; (gtk_accel_path "/layers/layers-color-tag-green" "") +; (gtk_accel_path "/context/context-background-red-decrease-skip" "") +; (gtk_accel_path "/tools/tools-size-decrease-skip" "braceleft") +; (gtk_accel_path "/dockable/dialogs-selection-editor" "") +; (gtk_accel_path "/quick-mask/quick-mask-configure" "") +; (gtk_accel_path "/filters/filters-cartoon" "") +; (gtk_accel_path "/plug-in/plug-in-fractalexplorer" "") +; (gtk_accel_path "/view/view-softproof-profile" "") +; (gtk_accel_path "/view/view-rotate-270" "") +; (gtk_accel_path "/vectors/vectors-lower-to-bottom" "") +; (gtk_accel_path "/context/context-colormap-background-set" "") +; (gtk_accel_path "/layers/layers-color-tag-gray" "") +; (gtk_accel_path "/tools/tools-paintbrush-size-set" "") +; (gtk_accel_path "/brushes/brushes-popup" "") +; (gtk_accel_path "/dock/dock-show-image-menu" "") +; (gtk_accel_path "/context/context-brush-hardness-increase-skip" "") +; (gtk_accel_path "/plug-in/script-fu-selection-to-pattern" "") +; (gtk_accel_path "/documents/documents-clear" "") +; (gtk_accel_path "/plug-in/script-fu-carve-it" "") +; (gtk_accel_path "/plug-in/plug-in-plug-in-details" "") +; (gtk_accel_path "/context/context-brush-select-previous" "") +; (gtk_accel_path "/context/context-palette-background-set" "") +; (gtk_accel_path "/tools/tools-eraser" "e") +; (gtk_accel_path "/select/select-float" "l") +; (gtk_accel_path "/context/context-gradient-select-next" "") +; (gtk_accel_path "/filters/filters-grid" "") +; (gtk_accel_path "/tools/tools-size-decrease-percent" "") +; (gtk_accel_path "/layers/layers-visible" "") +; (gtk_accel_path "/documents/documents-open" "") +; (gtk_accel_path "/dockable/dialogs-sample-points" "") +; (gtk_accel_path "/context/context-background-blue-decrease-skip" "") +; (gtk_accel_path "/view/view-softproof-intent-saturation" "") +; (gtk_accel_path "/view/view-zoom-minimum" "") +; (gtk_accel_path "/tools/tools-hardness-decrease-skip" "") +; (gtk_accel_path "/filters/filters-rgb-clip" "") +; (gtk_accel_path "/context/context-background-value-maximum" "") +; (gtk_accel_path "/layers/layers-lower-to-bottom" "") +; (gtk_accel_path "/tools/tools-force-set" "") +; (gtk_accel_path "/filters/filters-wind" "") +; (gtk_accel_path "/context/context-foreground-red-minimum" "") +; (gtk_accel_path "/debug/debug-dump-managers" "") +; (gtk_accel_path "/context/context-tool-select-last" "") +; (gtk_accel_path "/filters/filters-displace" "") +; (gtk_accel_path "/filters/filters-enhance-menu" "") +; (gtk_accel_path "/filters/filters-engrave" "") +; (gtk_accel_path "/tools/tools-object-2-next" "") +; (gtk_accel_path "/view/view-show-guides" "t") +; (gtk_accel_path "/vectors/vectors-color-tag-red" "") +; (gtk_accel_path "/vectors/vectors-selection-from-vectors" "v") +; (gtk_accel_path "/view/view-zoom-other" "") +; (gtk_accel_path "/image/image-convert-u32" "") +; (gtk_accel_path "/dockable/dialogs-symmetry" "") +; (gtk_accel_path "/context/context-swatch-background-previous" "") +; (gtk_accel_path "/select/select-feather" "") +; (gtk_accel_path "/filters/filters-motion-blur-zoom" "") +; (gtk_accel_path "/dialogs/dialogs-tool-presets" "") +; (gtk_accel_path "/vectors/vectors-duplicate" "") +; (gtk_accel_path "/view/view-display-intent-saturation" "") +; (gtk_accel_path "/tools/tools-foreground-select" "") diff --git a/GIMP/2.10/parasiterc b/GIMP/2.10/parasiterc new file mode 100644 index 0000000..6cfb1be --- /dev/null +++ b/GIMP/2.10/parasiterc @@ -0,0 +1,6 @@ +# GIMP parasiterc +# +# This file will be entirely rewritten each time you exit. + + +# end of parasiterc diff --git a/GIMP/2.10/pluginrc b/GIMP/2.10/pluginrc new file mode 100644 index 0000000..27001dc --- /dev/null +++ b/GIMP/2.10/pluginrc @@ -0,0 +1,4463 @@ +# GIMP pluginrc +# +# This file can safely be removed and will be automatically regenerated by +# querying the installed plug-ins. + +(protocol-version 26) +(file-version 5) + +(plug-in-def "${gimp_plug_in_dir}/plug-ins/blinds/blinds" 1672736559 + (proc-def "plug-in-blinds" 1 + "Simulate an image painted on window blinds" + "More here later" + "Andy Thomas" + "Andy Thomas" + "1997" + "_Blinds..." + 0 + (icon icon-name -1 "") + "RGB*, GRAY*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "angle-dsp" "Angle of Displacement") + (proc-arg 0 "num-segments" "Number of segments in blinds") + (proc-arg 0 "orientation" "The orientation { ORIENTATION-HORIZONTAL (0), ORIENTATION-VERTICAL (1) }") + (proc-arg 0 "bg-transparent" "Background transparent { FALSE, TRUE }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/animation-play/animation-play" 1672736559 + (proc-def "plug-in-animationplay" 1 + "Preview a GIMP layer-based animation" + "" + "Adam D. Moss " + "Adam D. Moss " + "1997, 1998..." + "_Playback..." + 1 + (menu-path "/Filters/Animation") + (icon icon-name -1 "media-playback-start") + "RGB*, INDEXED*, GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/animation-optimize/animation-optimize" 1672736559 + (proc-def "plug-in-animationoptimize" 1 + "Modify image to reduce size when saved as GIF animation" + "This procedure applies various optimizations to a GIMP layer-based animation in an attempt to reduce the final file size. If a frame of the animation can use the 'combine' mode, this procedure attempts to maximize the number of ajdacent pixels having the same color, which improves the compression for some image formats such as GIF or MNG." + "Adam D. Moss " + "Adam D. Moss " + "1997-2003" + "Optimize (for _GIF)" + 1 + (menu-path "/Filters/Animation") + (icon icon-name -1 "") + "RGB*, INDEXED*, GRAY*" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)") + (proc-arg 13 "result" "Resulting image")) + (proc-def "plug-in-animationoptimize-diff" 1 + "Reduce file size where combining layers is possible" + "This procedure applies various optimizations to a GIMP layer-based animation in an attempt to reduce the final file size. If a frame of the animation can use the 'combine' mode, this procedure uses a simple difference between the frames." + "Adam D. Moss " + "Adam D. Moss " + "1997-2001" + "_Optimize (Difference)" + 1 + (menu-path "/Filters/Animation") + (icon icon-name -1 "") + "RGB*, INDEXED*, GRAY*" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)") + (proc-arg 13 "result" "Resulting image")) + (proc-def "plug-in-animationunoptimize" 1 + "Remove optimization to make editing easier" + "This procedure 'simplifies' a GIMP layer-based animation that has been optimized for animation. This makes editing the animation much easier." + "Adam D. Moss " + "Adam D. Moss " + "1997-2001" + "_Unoptimize" + 1 + (menu-path "/Filters/Animation") + (icon icon-name -1 "") + "RGB*, INDEXED*, GRAY*" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)") + (proc-arg 13 "result" "Resulting image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/align-layers/align-layers" 1672736559 + (proc-def "plug-in-align-layers" 1 + "Align all visible layers of the image" + "Align visible layers" + "Shuji Narazaki " + "Shuji Narazaki" + "1997" + "Align Visi_ble Layers..." + 1 + (menu-path "/Image/Arrange") + (icon icon-name -1 "") + "RGB*,GRAY*,INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (not used)") + (proc-arg 0 "link-after-alignment" "Link the visible layers after alignment { TRUE, FALSE }") + (proc-arg 0 "use-bottom" "use the bottom layer as the base of alignment { TRUE, FALSE }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-jxl/file-jxl" 1674629825 + (proc-def "file-jxl-load" 1 + "Loads JPEG XL image files" + "Loads JPEG XL image files" + "JPEG XL Project" + "JPEG XL Project" + "2019" + "JPEG XL image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "jxl") + (magics "0,string,ÿ\n,0,string,\\000\\000\\000\fJXL\\040\\015\\012‡\\012") + (mime-types "image/jxl")) + "" + 3 1 + (proc-arg 0 "run-mode" "Run mode") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file, as entered by the user") + (proc-arg 13 "image" "Loaded image")) + (proc-def "file-jxl-save" 1 + "Saves JPEG XL image files" + "Saves JPEG XL image files" + "JPEG XL Project" + "JPEG XL Project" + "2019" + "JPEG XL image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "jxl") + (mime-types "image/jxl")) + "RGB*, GRAY*" + 5 0 + (proc-arg 0 "run-mode" "Run mode") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save") + (proc-arg 4 "raw-filename" "The name of the file to save"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/web-browser/web-browser" 1672736559 + (proc-def "plug-in-web-browser" 1 + "Open an URL in the user specified web browser" + "Opens the given URL in the user specified web browser." + "Henrik Brix Andersen " + "2003" + "2003/09/16" + "" + 0 + (icon icon-name -1 "") + "" + 1 0 + (proc-arg 4 "url" "URL to open"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/wavelet-decompose/wavelet-decompose" 1672736559 + (proc-def "plug-in-wavelet-decompose" 1 + "Wavelet decompose" + "Compute and render wavelet scales" + "Miroslav Talasek " + "Miroslav Talasek " + "19january 2017" + "_Wavelet-decompose..." + 1 + (menu-path "/Filters/Enhance") + (icon icon-name -1 "") + "RGB*, GRAY*" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "scales" "Number of scales (1-7)") + (proc-arg 0 "create-group" "Create a layer group to store the decomposition") + (proc-arg 0 "create-masks" "Add a layer mask to each scales layers"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/warp/warp" 1672736559 + (proc-def "plug-in-warp" 1 + "Twist or smear image in many different ways" + "Smears an image along vector paths calculated as the gradient of a separate control matrix. The effect can look like brushstrokes of acrylic or watercolor paint, in some cases." + "John P. Beale" + "John P. Beale" + "1997" + "_Warp..." + 1 + (menu-path "/Filters/Map") + (icon icon-name -1 "") + "RGB*, GRAY*" + 17 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 3 "amount" "Pixel displacement multiplier") + (proc-arg 16 "warp-map" "Displacement control map") + (proc-arg 0 "iter" "Iteration count (last required argument)") + (proc-arg 3 "dither" "Random dither amount (first optional argument)") + (proc-arg 3 "angle" "Angle of gradient vector rotation") + (proc-arg 0 "wrap-type" "Edge behavior: { WRAP (0), SMEAR (1), BLACK (2), COLOR (3) }") + (proc-arg 16 "mag-map" "Magnitude control map") + (proc-arg 0 "mag-use" "Use magnitude map: { FALSE (0), TRUE (1) }") + (proc-arg 0 "substeps" "Substeps between image updates") + (proc-arg 0 "grad-map" "Gradient control map") + (proc-arg 3 "grad-scale" "Scaling factor for gradient map (0=don't use)") + (proc-arg 0 "vector-map" "Fixed vector control map") + (proc-arg 3 "vector-scale" "Scaling factor for fixed vector map (0=don't use)") + (proc-arg 3 "vector-angle" "Angle for fixed vector map"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/van-gogh-lic/van-gogh-lic" 1672736559 + (proc-def "plug-in-lic" 1 + "Special effects that nobody understands" + "No help yet" + "Tom Bech & Federico Mena Quintero" + "Tom Bech & Federico Mena Quintero" + "Version 0.14, September 24 1997" + "_Van Gogh (LIC)..." + 1 + (menu-path "/Filters/Artistic") + (icon icon-name -1 "") + "RGB*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/unit-editor/unit-editor" 1672736559 + (proc-def "plug-in-unit-editor" 1 + "Create or alter units used in GIMP" + "The GIMP unit editor" + "Michael Natterer " + "Michael Natterer " + "2000" + "U_nits" + 1 + (menu-path "/Edit/Preferences") + (icon icon-name -1 "gimp-tool-measure") + "" + 1 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/tile-small/tile-small" 1672736559 + (proc-def "plug-in-small-tiles" 1 + "Tile image into smaller versions of the original" + "More here later" + "Andy Thomas" + "Andy Thomas" + "1997" + "_Small Tiles..." + 0 + (icon icon-name -1 "") + "RGB*, GRAY*" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "num-tiles" "Number of tiles to make"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/tile/tile" 1672736559 + (proc-def "plug-in-tile" 1 + "Create an array of copies of the image" + "This function creates a new image with a single layer sized to the specified 'new_width' and 'new_height' parameters. The specified drawable is tiled into this layer. The new layer will have the same type as the specified drawable and the new image will have a corresponding base type." + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1996-1997" + "_Tile..." + 1 + (menu-path "/Filters/Map") + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 6 2 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "new-width" "New (tiled) image width") + (proc-arg 0 "new-height" "New (tiled) image height") + (proc-arg 0 "new-image" "Create a new image?") + (proc-arg 13 "new-image" "Output image (-1 if new-image == FALSE)") + (proc-arg 14 "new-layer" "Output layer (-1 if new-image == FALSE)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/sphere-designer/sphere-designer" 1672736559 + (proc-def "plug-in-spheredesigner" 1 + "Create an image of a textured sphere" + "This plug-in can be used to create textured and/or bumpmapped spheres, and uses a small lightweight raytracer to perform the task with good quality" + "Vidar Madsen" + "Vidar Madsen" + "1999" + "Sphere _Designer..." + 1 + (menu-path "/Filters/Render") + (icon icon-name -1 "") + "RGB*, GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/sparkle/sparkle" 1672736559 + (proc-def "plug-in-sparkle" 1 + "Turn bright spots into starry sparkles" + "Uses a percentage based luminoisty threhsold to find candidate pixels for adding some sparkles (spikes). " + "John Beale, & (ported to GIMP v0.54) Michael J. Hammel & ted to GIMP v1.0) & Seth Burgess & Spencer Kimball" + "John Beale" + "Version 1.27, September 2003" + "_Sparkle..." + 1 + (menu-path "/Filters/Light and Shadow/Light") + (icon icon-name -1 "") + "RGB*, GRAY*" + 16 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 3 "lum-threshold" "Luminosity threshold (0.0 - 1.0)") + (proc-arg 3 "flare-inten" "Flare intensity (0.0 - 1.0)") + (proc-arg 0 "spike-len" "Spike length (in pixels)") + (proc-arg 0 "spike-pts" "# of spike points") + (proc-arg 0 "spike-angle" "Spike angle (0-360 degrees, -1: random)") + (proc-arg 3 "density" "Spike density (0.0 - 1.0)") + (proc-arg 3 "transparency" "Transparency (0.0 - 1.0)") + (proc-arg 3 "random-hue" "Random hue (0.0 - 1.0)") + (proc-arg 3 "random-saturation" "Random saturation (0.0 - 1.0)") + (proc-arg 0 "preserve-luminosity" "Preserve luminosity (TRUE/FALSE)") + (proc-arg 0 "inverse" "Inverse (TRUE/FALSE)") + (proc-arg 0 "border" "Add border (TRUE/FALSE)") + (proc-arg 0 "color-type" "Color of sparkles: { NATURAL (0), FOREGROUND (1), BACKGROUND (2) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/softglow/softglow" 1672736559 + (proc-def "plug-in-softglow" 1 + "Simulate glow by making highlights intense and fuzzy" + "Gives an image a softglow effect by intensifying the highlights in the image. This is done by screening a modified version of the drawable with itself. The modified version is desaturated and then a sigmoidal transfer function is applied to force the distribution of intensities into very small and very large only. This desaturated version is then blurred to give it a fuzzy 'vaseline-on-the-lens' effect. The glow radius parameter controls the sharpness of the glow effect. The brightness parameter controls the degree of intensification applied to image highlights. The sharpness parameter controls how defined or alternatively, diffuse, the glow effect should be." + "Spencer Kimball" + "Bit Specialists, Inc." + "2001" + "_Softglow (legacy)..." + 1 + (menu-path "/Filters/Artistic") + (icon icon-name -1 "") + "RGB*, GRAY*" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 3 "glow-radius" "Glow radius (radius in pixels)") + (proc-arg 3 "brightness" "Glow brightness (0.0 - 1.0)") + (proc-arg 3 "sharpness" "Glow sharpness (0.0 - 1.0)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/smooth-palette/smooth-palette" 1672736559 + (proc-def "plug-in-smooth-palette" 1 + "Derive a smooth color palette from the image" + "help!" + "Scott Draves" + "Scott Draves" + "1997" + "Smoo_th Palette..." + 1 + (menu-path "/Colors/Info") + (icon icon-name -1 "") + "RGB*" + 7 2 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "width" "Width") + (proc-arg 0 "height" "Height") + (proc-arg 0 "ntries" "Search Depth") + (proc-arg 0 "show-image" "Show Image?") + (proc-arg 13 "new-image" "Output image") + (proc-arg 14 "new-layer" "Output layer"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/sharpen/sharpen" 1672736559 + (proc-def "plug-in-sharpen" 1 + "Make image sharper (less powerful than Unsharp Mask)" + "This plug-in selectively performs a convolution filter on an image." + "Michael Sweet " + "Copyright 1997-1998 by Michael Sweet" + "1.4.2 - 3 June 1998" + "_Sharpen..." + 0 + (icon icon-name -1 "") + "RGB*, GRAY*" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "percent" "Percent sharpening (default = 10)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/selection-to-path/selection-to-path" 1672736559 + (proc-def "plug-in-sel2path" 1 + "Converts a selection to a path" + "Converts a selection to a path" + "Andy Thomas" + "Andy Thomas" + "1999" + "" + 0 + (icon icon-name -1 "") + "RGB*, INDEXED*, GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)")) + (proc-def "plug-in-sel2path-advanced" 1 + "Converts a selection to a path (with advanced user menu)" + "Converts a selection to a path (with advanced user menu)" + "Andy Thomas" + "Andy Thomas" + "1999" + "" + 0 + (icon icon-name -1 "") + "RGB*, INDEXED*, GRAY*" + 23 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)") + (proc-arg 3 "align-threshold" "align_threshold") + (proc-arg 3 "corner-always-threshold" "corner_always_threshold") + (proc-arg 2 "corner-surround" "corner_surround") + (proc-arg 3 "corner-threshold" "corner_threshold") + (proc-arg 3 "error-threshold" "error_threshold") + (proc-arg 2 "filter-alternative-surround" "filter_alternative_surround") + (proc-arg 3 "filter-epsilon" "filter_epsilon") + (proc-arg 2 "filter-iteration-count" "filter_iteration_count") + (proc-arg 3 "filter-percent" "filter_percent") + (proc-arg 2 "filter-secondary-surround" "filter_secondary_surround") + (proc-arg 2 "filter-surround" "filter_surround") + (proc-arg 2 "keep-knees" "{1-Yes, 0-No}") + (proc-arg 3 "line-reversion-threshold" "line_reversion_threshold") + (proc-arg 3 "line-threshold" "line_threshold") + (proc-arg 3 "reparameterize-improvement" "reparameterize_improvement") + (proc-arg 3 "reparameterize-threshold" "reparameterize_threshold") + (proc-arg 3 "subdivide-search" "subdivide_search") + (proc-arg 2 "subdivide-surround" "subdivide_surround") + (proc-arg 3 "subdivide-threshold" "subdivide_threshold") + (proc-arg 2 "tangent-surround" "tangent_surround"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/script-fu/script-fu" 1672736559 + (proc-def "extension-script-fu" 2 + "A scheme interpreter for scripting GIMP operations" + "More help here later" + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1997" + "" + 0 + (icon icon-name -1 "") + "" + 0 0) + (proc-def "plug-in-script-fu-console" 1 + "Interactive console for Script-Fu development" + "Provides an interface which allows interactive scheme development." + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1997" + "_Console" + 1 + (menu-path "/Filters/Languages/Script-Fu") + (icon icon-name -1 "") + "" + 1 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }")) + (proc-def "plug-in-script-fu-text-console" 1 + "Provides a text console mode for script-fu development" + "Provides an interface which allows interactive scheme development." + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1997" + "" + 0 + (icon icon-name -1 "") + "" + 1 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }")) + (proc-def "plug-in-script-fu-server" 1 + "Server for remote Script-Fu operation" + "Provides a server for remote script-fu operation. NOTE that for security reasons this procedure's API was changed in an incompatible way since GIMP 2.8.12. You now have to pass the IP to listen on as first parameter. Calling this procedure with the old API will fail on purpose." + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1997" + "_Start Server..." + 1 + (menu-path "/Filters/Languages/Script-Fu") + (icon icon-name -1 "") + "" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "ip" "The ip on which to listen for requests") + (proc-arg 0 "port" "The port on which to listen for requests") + (proc-arg 4 "logfile" "The file to log server activity to")) + (proc-def "plug-in-script-fu-eval" 1 + "Evaluate scheme code" + "Evaluate the code under the scheme interpreter (primarily for batch mode)" + "Manish Singh" + "Manish Singh" + "1998" + "" + 0 + (icon icon-name -1 "") + "" + 2 0 + (proc-arg 0 "run-mode" "The run mode { RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "code" "The code to evaluate")) + (locale-def "gimp20-script-fu")) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/screenshot/screenshot" 1672736559 + (proc-def "plug-in-screenshot" 1 + "Create an image from an area of the screen" + "The plug-in takes screenshots of an interactively selected window or of the desktop, either the whole desktop or an interactively selected region. When called non-interactively, it may grab the root window or use the window-id passed as a parameter. The last four parameters are optional and can be used to specify the corners of the region to be grabbed.On Mac OS X or on gnome-shell, when called non-interactively, the plug-inonly can take screenshots of the entire root window.Grabbing a window or a region is not supportednon-interactively. To grab a region or a particularwindow, you need to use the interactive mode." + "Sven Neumann , Henrik Brix Andersen ,Simone Karin Lehmann" + "1998 - 2008" + "v1.1 (2008/04)" + "_Screenshot..." + 1 + (menu-path "/File/Create/Acquire") + (icon inline-pixbuf 1606 "GdkP\0\0\6F\2\1\0\2\0\0\0X\0\0\0\26\0\0\0\26\213\0\0\0\0\1\242\242\242\5\203\242\242\242\31\221\0\0\0\0\2\27\27\26D\40\40\40\372\203\51\51\51\375\2\32\32\32\362\26\26\25\60\217\0\0\0\0\2\2\2\2\322\307\310\307\377\203\377\377\377\377\2\263\263\262\363\0\0\0\314\217\0\0\0\0\2\6\6\6\334\206\207\205\377\202\252\253\251\377\3\252\252\251\377ghe\376\1\1\1\320\217\0\0\0\0\2\11\11\11\346\56\57\55\345\202GHE\25\3JKH\32\60\61\57\364\5\5\5\333\212\0\0\0\0\17\26\26\25\31\26\26\25\60\26\26\25g\0\0\0\314\53\54\53\331LMK\375EFD\362ffe\347iig\346lmk\346RSQ\362\13\13\13\360\0\0\0\314\2\2\2\321\26\26\25V\203\0\0\0\0\43\26\26\25\31\26\26\25\60\26\26\25n\3\3\3\331\2\2\2\332JJI\355\215\215\215\372\246\246\246\347\267\270\266\362\177\202\176\377BC\77\377TUR\377\134\135Y\377gid\377\133\135X\377\204\206\204\374wxw\276\224\225\224\314LLK\343\26\26\25D\0\0\0\0\26\26\25D\3\3\3\341\17\17\17\373ghg\377\237\240\236\377\273\274\272\377\302\303\300\377\272\273\270\377\200\201\177\377zzz\377tws\377\220\223\217\377\221\225\221\377\224\227\223\377\202\226\232\226\377K\177\202\175\377xyu\377\217\221\215\377\226\227\226\365\0\0\0\371\0\0\0\0\2\2\2\330\257\261\257\377\275\276\273\377\262\263\260\377UWT\377QSP\377suq\377\135\136\133\377\304\304\304\377\303\303\303\377kmi\377MNJ\377WZX\377\133\140\137\377aeb\377gid\377\175\200\173\377SUQ\377FGE\377\200\201\200\377\12\12\12\357\0\0\0\0\4\4\4\345xyv\377\241\242\236\377\210\212\205\377vxt\377\220\222\217\377GIF\377\53\54\51\377\140\140\140\377jji\377UXV\377y\204\210\377\203\215\220\377\176\204\207\377flo\377PW\134\377SWU\377JLI\377\64\65\62\377tut\377\12\12\12\357\0\0\0\0\4\4\4\344opm\377\221\223\217\377\175\177\173\377\215\217\213\377\140b\137\377\50\51\47\377\52\53\51\377\67\70\65\377VXV\377u\176\202\377nsu\377VYZ\377OST\377OQS\377JOP\377\136cd\377\66\71\70\377\41\42\41\377llk\377\12\12\12\357\0\0\0\0\3\3\3\345npl\377\220\221\216\377\202UWS\377\24GIF\377\40\41\37\377\52\53\51\377\71\72\67\377\136ce\377NRT\377UXY\377\50\54\56\377\22\24\25\377\41\44\46\377ILM\377\70\75\77\377RVX\377\47\47\46\377klk\377\12\12\12\357\0\0\0\1\3\3\3\345nol\377\220\221\216\377\202UWS\377\24GIF\377\40\41\37\377\52\53\51\377\70\72\70\377TXY\377\62\70\71\377\23\25\26\377\16\16\16\377\1\1\1\377\2\2\2\377\24\25\25\377\56\63\64\377\62\70\71\377\60\61\61\377aa\140\377\11\11\11\360\0\0\0\3\3\3\3\345nol\377\204\205\202\377\202UWS\377\24GIF\377\40\41\37\377\52\53\51\377\77BA\377\62\70\72\377\34\40\41\377\31\32\32\377\377\377\377\377hhh\377\40\40\40\377\22\22\22\377\56\60\60\377\56\64\66\377\72\76\77\377\140a\140\377\11\11\10\361\0\0\0\7\3\3\3\345mok\377z\173x\377\202UWS\377\24GIF\377\40\41\37\377\52\53\51\377HJI\377\56\64\66\377\25\27\30\377\40\40\40\377hhh\377\232\232\232\377\175\175\175\377\47\47\47\377\71\73\73\377\57\65\67\377\65\71\71\377\140\140\137\377\11\11\10\362\0\0\0\15\3\3\3\345lnk\377rsp\377\202UWS\377\24GIF\377\40\41\37\377\54\55\52\377\76\100\76\377\56\64\66\377\35\37\40\377\1\1\1\377\70\70\70\377\214\214\214\377\213\213\213\377AAA\377JKK\377\57\65\67\377\66\72\73\377WXV\377\6\6\6\364\0\0\0\21\0\0\0\371\201\202\177\377mok\377\202UWS\377iGIF\377MNM\377RRR\372ghg\364\133\140b\377\53\57\60\377\17\17\17\377\42\42\42\377\47\47\47\377HHH\377\263\263\263\377SUU\377W\134\136\377CFF\374\74\74\74\376\20\20\17\317\0\0\0\20\24\24\23\135\4\4\4\353\177\177\176\375\174\175z\373\175\176\174\374hih\376\71\72\71\371\0\0\0\347\0\0\0\351\7\7\7\367\56\64\66\377\62\65\66\377\40\40\40\377\50\50\50\377\72\72\72\377\140ab\377\71\76\77\377\11\13\13\376\0\0\0\353\0\0\0\300\14\14\13H\0\0\0\15\0\0\0\4\23\23\22L\0\0\0\332\0\0\0\341\0\0\0\346\0\0\0\341\14\14\13\173\0\0\0V\0\0\0a\0\0\0l\10\11\11\371\134\136\137\377LOP\377ILL\377LOQ\377QUV\377\16\17\17\377\34\37\40\244\0\0\0\140\0\0\0\64\0\0\0\27\0\0\0\7\0\0\0\1\0\0\0\3\0\0\0\10\0\0\0\21\0\0\0\34\0\0\0\47\0\0\0\60\0\0\0\66\0\0\0\75\0\0\0A\0\0\0F\4\5\5\355\12\13\13\371\17\20\20\376\15\16\16\375\10\10\11\365\7\10\11j\0\0\0G\0\0\0\55\0\0\0\30\0\0\0\13\0\0\0\4\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\11\0\0\0\16\0\0\0\23\0\0\0\31\0\0\0\35\0\0\0\41\0\0\0\43\0\0\0\44\0\0\0\45\0\0\0\44\0\0\0\46\0\0\0\45\0\0\0\36\0\0\0\27\0\0\0\20\0\0\0\10\0\0\0\3\0\0\0\1\204\0\0\0\0\5\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\5\0\0\0\6\202\0\0\0\10\11\0\0\0\11\0\0\0\7\0\0\0\10\0\0\0\5\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\3\0\0\0\1\202\0\0\0\0") + "" + 7 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 0 "shoot-type" "The Shoot type { SHOOT-WINDOW (0), SHOOT-ROOT (1), SHOOT-REGION (2) }") + (proc-arg 0 "window-id" "Window id for SHOOT-WINDOW") + (proc-arg 0 "x1" "Region left x coord for SHOOT-REGION") + (proc-arg 0 "y1" "Region top y coord for SHOOT-REGION") + (proc-arg 0 "x2" "Region right x coord for SHOOT-REGION") + (proc-arg 0 "y2" "Region bottom y coord for SHOOT-REGION") + (proc-arg 13 "image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/sample-colorize/sample-colorize" 1672736559 + (proc-def "plug-in-sample-colorize" 1 + "Colorize image using a sample image as a guide" + "This plug-in colorizes the contents of the specified (gray) layer with the help of a sample (color) layer. It analyzes all colors in the sample layer. The sample colors are sorted by brightness (== intentisty) and amount and stored in a sample colortable (where brightness is the index) The pixels of the destination layer are remapped with the help of the sample colortable. If use_subcolors is TRUE, the remapping process uses all sample colors of the corresponding brightness-intensity and distributes the subcolors according to their amount in the sample (If the sample has 5 green, 3 yellow, and 1 red pixel of the intensity value 105, the destination pixels at intensity value 105 are randomly painted in green, yellow and red in a relation of 5:3:1 If use_subcolors is FALSE only one sample color per intensity is used. (green will be used in this example) The brightness intensity value is transformed at the remapping process according to the levels: out_lo, out_hi, in_lo, in_high and gamma The in_low / in_high levels specify an initial mapping of the intensity. The gamma value determines how intensities are interpolated between the in_lo and in_high levels. A gamma value of 1.0 results in linear interpolation. Higher gamma values results in more high-level intensities Lower gamma values results in more low-level intensities The out_low/out_high levels constrain the resulting intensity index The intensity index is used to pick the corresponding color in the sample colortable. If hold_inten is FALSE the picked color is used 1:1 as resulting remap_color. If hold_inten is TRUE The brightness of the picked color is adjusted back to the origial intensity value (only hue and saturation are taken from the picked sample color) (or to the input level, if orig_inten is set FALSE) Works on both Grayscale and RGB image with/without alpha channel. (the image with the dst_drawable is converted to RGB if necessary) The sample_drawable should be of type RGB or RGBA" + "Wolfgang Hofer" + "hof@hotbot.com" + "02/2000" + "_Sample Colorize..." + 1 + (menu-path "/Colors/Map") + (icon icon-name -1 "") + "RGB*, GRAY*" + 13 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "dst-drawable" "The drawable to be colorized (Type GRAY* or RGB*)") + (proc-arg 16 "sample-drawable" "Sample drawable (should be of Type RGB or RGBA)") + (proc-arg 0 "hold-inten" "hold brightness intensity levels (TRUE, FALSE)") + (proc-arg 0 "orig-inten" "TRUE: hold brightness of original intensity levels. FALSE: Hold Intensity of input levels") + (proc-arg 0 "rnd-subcolors" "TRUE: Use all subcolors of same intensity, FALSE: use only one color per intensity") + (proc-arg 0 "guess-missing" "TRUE: guess samplecolors for the missing intensity values FALSE: use only colors found in the sample") + (proc-arg 0 "in-low" "intensity of lowest input (0 <= in_low <= 254)") + (proc-arg 0 "in-high" "intensity of highest input (1 <= in_high <= 255)") + (proc-arg 3 "gamma" "gamma adjustment factor (0.1 <= gamma <= 10) where 1.0 is linear") + (proc-arg 0 "out-low" "lowest sample color intensity (0 <= out_low <= 254)") + (proc-arg 0 "out-high" "highest sample color intensity (1 <= out_high <= 255)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/qbist/qbist" 1672736559 + (proc-def "plug-in-qbist" 1 + "Generate a huge variety of abstract patterns" + "This Plug-in is based on an article by Jörn Loviscach (appeared in c't 10/95, page 326). It generates modern art pictures from a random genetic formula." + "Jörn Loviscach, Jens Ch. Restemeier" + "Jörn Loviscach, Jens Ch. Restemeier" + "January 2001, 1.12" + "_Qbist..." + 1 + (menu-path "/Filters/Render/Pattern") + (icon icon-name -1 "") + "RGB*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/procedure-browser/procedure-browser" 1672736559 + (proc-def "plug-in-dbbrowser" 1 + "List available procedures in the PDB" + "" + "Thomas Noel" + "Thomas Noel" + "23th june 1997" + "Procedure _Browser" + 1 + (menu-path "/Help/Programming") + (icon icon-name -1 "") + "" + 1 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/print/print" 1672736559 + (proc-def "file-print-gtk" 1 + "Print the image" + "Print the image using the GTK+ Print API." + "Bill Skaggs, Sven Neumann, Stefan Röllin" + "Bill Skaggs " + "2006 - 2008" + "_Print..." + 1 + (menu-path "/File/Send") + (icon icon-name -1 "document-print") + "*" + 2 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Image to print"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/plugin-browser/plugin-browser" 1672736559 + (proc-def "plug-in-plug-in-details" 1 + "Display information about plug-ins" + "Allows one to browse the plug-in menus system. You can search for plug-in names, sort by name or menu location and you can view a tree representation of the plug-in menus. Can also be of help to find where new plug-ins have installed themselves in the menus." + "Andy Thomas" + "Andy Thomas" + "1999" + "_Plug-in Browser" + 1 + (menu-path "/Help/Programming") + (icon icon-name -1 "gimp-plugin") + "" + 1 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/photocopy/photocopy" 1672736559 + (proc-def "plug-in-photocopy" 1 + "Simulate color distortion produced by a copy machine" + "Propagates dark values in an image based on each pixel's relative darkness to a neighboring average. The idea behind this filter is to give the look of a photocopied version of the image, with toner transferred based on the relative darkness of a particular region. This is achieved by darkening areas of the image which are measured to be darker than a neighborhood average and setting other pixels to white. In this way, sufficiently large shifts in intensity are darkened to black. The rate at which they are darkened to black is determined by the second pct_black parameter. The mask_radius parameter controls the size of the pixel neighborhood over which the average intensity is computed and then compared to each pixel in the neighborhood to decide whether or not to darken it to black. Large values for mask_radius result in very thick black areas bordering the regions of white and much less detail for black areas everywhere including inside regions of color. Small values result in less toner overall and more detail everywhere. Small values for the pct_black make the blend from the white regions to the black border lines smoother and the toner regions themselves thinner and less noticeable; larger values achieve the opposite effect." + "Spencer Kimball" + "Bit Specialists, Inc." + "2001" + "_Photocopy (legacy)..." + 1 + (menu-path "/Filters/Artistic") + (icon icon-name -1 "") + "RGB*, GRAY*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 3 "mask-radius" "Photocopy mask radius (radius of pixel neighborhood)") + (proc-arg 3 "sharpness" "Sharpness (detail level) (0.0 - 1.0)") + (proc-arg 3 "pct-black" "Percentage of darkened pixels to set to black (0.0 - 1.0)") + (proc-arg 3 "pct-white" "Percentage of non-darkened pixels left white (0.0 - 1.0)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/pagecurl/pagecurl" 1672736559 + (proc-def "plug-in-pagecurl" 1 + "Curl up one of the image corners" + "This plug-in creates a pagecurl-effect." + "Federico Mena Quintero and Simon Budig" + "Federico Mena Quintero and Simon Budig" + "July 2004, 1.0" + "_Pagecurl..." + 1 + (menu-path "/Filters/Distorts") + (icon icon-name -1 "") + "RGB*, GRAY*" + 7 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "colors" "FG- and BG-Color (0), Current gradient (1), Current gradient reversed (2)") + (proc-arg 0 "edge" "Edge to curl (1-4, clockwise, starting in the lower right edge)") + (proc-arg 0 "orientation" "Vertical (0), Horizontal (1)") + (proc-arg 0 "shade" "Shade the region under the curl (1) or not (0)") + (proc-arg 14 "curl-layer" "The new layer with the curl."))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/nl-filter/nl-filter" 1672736559 + (proc-def "plug-in-nlfilt" 1 + "Nonlinear swiss army knife filter" + "This is the pnmnlfilt, in gimp's clothing. See the pnmnlfilt manpage for details." + "Graeme W. Gill, gimp 0.99 plug-in by Eric L. Hernes" + "Graeme W. Gill, Eric L. Hernes" + "1997" + "_NL Filter..." + 1 + (menu-path "/Filters/Enhance") + (icon icon-name -1 "") + "RGB,GRAY" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "img" "The Image to Filter") + (proc-arg 16 "drw" "The Drawable") + (proc-arg 3 "alpha" "The amount of the filter to apply") + (proc-arg 3 "radius" "The filter radius") + (proc-arg 0 "filter" "The Filter to Run, 0 - alpha trimmed mean; 1 - optimal estimation (alpha controls noise variance); 2 - edge enhancement"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/metadata-viewer/metadata-viewer" 1672736559 + (proc-def "plug-in-metadata-viewer" 1 + "View metadata (Exif, IPTC, XMP)" + "View metadata information attached to the current image. This can include Exif, IPTC and/or XMP information." + "Hartmut Kuhse, Michael Natterer, Ben Touchette" + "Hartmut Kuhse, Michael Natterer, Ben Touchette" + "2013, 2017" + "_View Metadata" + 1 + (menu-path "/Image/Metadata") + (icon icon-name -1 "") + "*" + 2 0 + (proc-arg 0 "run-mode" "Run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Input image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/metadata-editor/metadata-editor" 1672736559 + (proc-def "plug-in-metadata-editor" 1 + "Edit metadata (IPTC, EXIF, XMP)" + "Edit metadata information attached to the current image. Some or all of this metadata will be saved in the file, depending on the output file format." + "Ben Touchette" + "Ben Touchette" + "2017" + "_Edit Metadata" + 1 + (menu-path "/Image/Metadata") + (icon icon-name -1 "") + "*" + 2 0 + (proc-arg 0 "run-mode" "Run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Input image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/max-rgb/max-rgb" 1672736559 + (proc-def "plug-in-max-rgb" 1 + "Reduce image to pure red, green, and blue" + "There's no help yet." + "Shuji Narazaki (narazaki@InetQ.or.jp)" + "Shuji Narazaki" + "May 2000" + "Maxim_um RGB..." + 0 + (icon icon-name -1 "") + "RGB*" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (not used)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "max-p" "{ MINIMIZE (0), MAXIMIZE (1) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/map-object/map-object" 1672736559 + (proc-def "plug-in-map-object" 1 + "Map the image to an object (plane, sphere, box or cylinder)" + "No help yet" + "Tom Bech & Federico Mena Quintero" + "Tom Bech & Federico Mena Quintero" + "Version 1.2.0, July 16 1998" + "Map _Object..." + 1 + (menu-path "/Filters/Map") + (icon icon-name -1 "") + "RGB*" + 49 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "maptype" "Type of mapping (0=plane,1=sphere,2=box,3=cylinder)") + (proc-arg 3 "viewpoint-x" "Position of viewpoint (x,y,z)") + (proc-arg 3 "viewpoint-y" "Position of viewpoint (x,y,z)") + (proc-arg 3 "viewpoint-z" "Position of viewpoint (x,y,z)") + (proc-arg 3 "position-x" "Object position (x,y,z)") + (proc-arg 3 "position-y" "Object position (x,y,z)") + (proc-arg 3 "position-z" "Object position (x,y,z)") + (proc-arg 3 "firstaxis-x" "First axis of object [x,y,z]") + (proc-arg 3 "firstaxis-y" "First axis of object [x,y,z]") + (proc-arg 3 "firstaxis-z" "First axis of object [x,y,z]") + (proc-arg 3 "secondaxis-x" "Second axis of object [x,y,z]") + (proc-arg 3 "secondaxis-y" "Second axis of object [x,y,z]") + (proc-arg 3 "secondaxis-z" "Second axis of object [x,y,z]") + (proc-arg 3 "rotationangle-x" "Rotation about X axis in degrees") + (proc-arg 3 "rotationangle-y" "Rotation about Y axis in degrees") + (proc-arg 3 "rotationangle-z" "Rotation about Z axis in degrees") + (proc-arg 0 "lighttype" "Type of lightsource (0=point,1=directional,2=none)") + (proc-arg 10 "lightcolor" "Lightsource color (r,g,b)") + (proc-arg 3 "lightposition-x" "Lightsource position (x,y,z)") + (proc-arg 3 "lightposition-y" "Lightsource position (x,y,z)") + (proc-arg 3 "lightposition-z" "Lightsource position (x,y,z)") + (proc-arg 3 "lightdirection-x" "Lightsource direction [x,y,z]") + (proc-arg 3 "lightdirection-y" "Lightsource direction [x,y,z]") + (proc-arg 3 "lightdirection-z" "Lightsource direction [x,y,z]") + (proc-arg 3 "ambient-intensity" "Material ambient intensity (0..1)") + (proc-arg 3 "diffuse-intensity" "Material diffuse intensity (0..1)") + (proc-arg 3 "diffuse-reflectivity" "Material diffuse reflectivity (0..1)") + (proc-arg 3 "specular-reflectivity" "Material specular reflectivity (0..1)") + (proc-arg 3 "highlight" "Material highlight (0..->), note: it's exponential") + (proc-arg 0 "antialiasing" "Apply antialiasing (TRUE/FALSE)") + (proc-arg 0 "tiled" "Tile source image (TRUE/FALSE)") + (proc-arg 0 "newimage" "Create a new image (TRUE/FALSE)") + (proc-arg 0 "transparentbackground" "Make background transparent (TRUE/FALSE)") + (proc-arg 3 "radius" "Sphere/cylinder radius (only used when maptype=1 or 3)") + (proc-arg 3 "x-scale" "Box x size (0..->)") + (proc-arg 3 "y-scale" "Box y size (0..->)") + (proc-arg 3 "z-scale" "Box z size (0..->)") + (proc-arg 3 "cylinder-length" "Cylinder length (0..->)") + (proc-arg 16 "box-front-drawable" "Box front face (set these to -1 if not used)") + (proc-arg 16 "box-back-drawable" "Box back face") + (proc-arg 16 "box-top-drawable" "Box top face") + (proc-arg 16 "box-bottom-drawable" "Box bottom face") + (proc-arg 16 "box-left-drawable" "Box left face") + (proc-arg 16 "box-right-drawable" "Box right face") + (proc-arg 16 "cyl-top-drawable" "Cylinder top face (set these to -1 if not used)") + (proc-arg 16 "cyl-bottom-drawable" "Cylinder bottom face"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/mail/mail" 1672736559 + (proc-def "plug-in-mail-image" 1 + "Send the image by email" + "The preferred email composer is used to send emails and must be properly configured." + "Adrian Likins, Reagan Blundell" + "Adrian Likins, Reagan Blundell, Daniel Risacher, Spencer Kimball and Peter Mattis" + "1995-1997" + "Send by E_mail..." + 1 + (menu-path "/File/Send") + (icon icon-name -1 "gtk-edit") + "*" + 9 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "to-address" "The email address to send to") + (proc-arg 4 "from-address" "The email address for the From: field") + (proc-arg 4 "subject" "The subject") + (proc-arg 4 "comment" "The Comment") + (proc-arg 0 "encapsulation" "ignored"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/lighting/lighting" 1672736559 + (proc-def "plug-in-lighting" 1 + "Apply various lighting effects to an image" + "No help yet" + "Tom Bech & Federico Mena Quintero" + "Tom Bech & Federico Mena Quintero" + "Version 0.2.0, March 15 1998" + "_Lighting Effects..." + 1 + (menu-path "/Filters/Light and Shadow/Light") + (icon icon-name -1 "") + "RGB*" + 24 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 16 "bumpdrawable" "Bumpmap drawable (set to 0 if disabled)") + (proc-arg 16 "envdrawable" "Environmentmap drawable (set to 0 if disabled)") + (proc-arg 0 "dobumpmap" "Enable bumpmapping (TRUE/FALSE)") + (proc-arg 0 "doenvmap" "Enable envmapping (TRUE/FALSE)") + (proc-arg 0 "bumpmaptype" "Type of mapping (0=linear,1=log, 2=sinusoidal, 3=spherical)") + (proc-arg 0 "lighttype" "Type of lightsource (0=point,1=directional,3=spot,4=none)") + (proc-arg 10 "lightcolor" "Lightsource color (r,g,b)") + (proc-arg 3 "lightposition-x" "Lightsource position (x,y,z)") + (proc-arg 3 "lightposition-y" "Lightsource position (x,y,z)") + (proc-arg 3 "lightposition-z" "Lightsource position (x,y,z)") + (proc-arg 3 "lightdirection-x" "Lightsource direction [x,y,z]") + (proc-arg 3 "lightdirection-y" "Lightsource direction [x,y,z]") + (proc-arg 3 "lightdirection-z" "Lightsource direction [x,y,z]") + (proc-arg 3 "ambient-intensity" "Material ambient intensity (0..1)") + (proc-arg 3 "diffuse-intensity" "Material diffuse intensity (0..1)") + (proc-arg 3 "diffuse-reflectivity" "Material diffuse reflectivity (0..1)") + (proc-arg 3 "specular-reflectivity" "Material specular reflectivity (0..1)") + (proc-arg 3 "highlight" "Material highlight (0..->), note: it's exponential") + (proc-arg 0 "antialiasing" "Apply antialiasing (TRUE/FALSE)") + (proc-arg 0 "newimage" "Create a new image (TRUE/FALSE)") + (proc-arg 0 "transparentbackground" "Make background transparent (TRUE/FALSE)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/jigsaw/jigsaw" 1672736559 + (proc-def "plug-in-jigsaw" 1 + "Add a jigsaw-puzzle pattern to the image" + "Jigsaw puzzle look" + "Nigel Wetten" + "Nigel Wetten" + "May 2000" + "_Jigsaw..." + 1 + (menu-path "/Filters/Render/Pattern") + (icon icon-name -1 "") + "RGB*" + 8 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "x" "Number of tiles across > 0") + (proc-arg 0 "y" "Number of tiles down > 0") + (proc-arg 0 "style" "The style/shape of the jigsaw puzzle { 0, 1 }") + (proc-arg 0 "blend-lines" "Number of lines for shading bevels >= 0") + (proc-arg 3 "blend-amount" "The power of the light highlights 0 =< 5"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/imagemap/imagemap" 1672736559 + (proc-def "plug-in-imagemap" 1 + "Create a clickable imagemap" + "" + "Maurits Rijk" + "Maurits Rijk" + "1998-2005" + "_Image Map..." + 1 + (menu-path "/Filters/Web") + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/ifs-compose/ifs-compose" 1672736559 + (proc-def "plug-in-ifscompose" 1 + "Create an Iterated Function System (IFS) fractal" + "Interactively create an Iterated Function System fractal. Use the window on the upper left to adjust the component transformations of the fractal. The operation that is performed is selected by the buttons underneath the window, or from a menu popped up by the right mouse button. The fractal will be rendered with a transparent background if the current image has an alpha channel." + "Owen Taylor" + "Owen Taylor" + "1997" + "_IFS Fractal..." + 1 + (menu-path "/Filters/Render/Fractals") + (icon icon-name -1 "") + "*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/hot/hot" 1672736559 + (proc-def "plug-in-hot" 1 + "Find and fix pixels that may be unsafely bright" + "hot scans an image for pixels that will give unsave values of chrominance or composite signale amplitude when encoded into an NTSC or PAL signal. Three actions can be performed on these ``hot'' pixels. (0) reduce luminance, (1) reduce saturation, or (2) Blacken." + "Eric L. Hernes, Alan Wm Paeth" + "Eric L. Hernes" + "1997" + "_Hot..." + 1 + (menu-path "/Colors/Modify") + (icon icon-name -1 "") + "RGB" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "The Image") + (proc-arg 16 "drawable" "The Drawable") + (proc-arg 0 "mode" "Mode { NTSC (0), PAL (1) }") + (proc-arg 0 "action" "The action to perform") + (proc-arg 0 "new-layer" "Create a new layer { TRUE, FALSE }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/help/help" 1672736559 + (proc-def "extension-gimp-help" 2 + "" + "" + "Sven Neumann , Michael Natterer , Henrik Brix Andersen " + "Sven Neumann, Michael Natterer & Henrik Brix Andersen" + "1999-2008" + "" + 0 + (icon icon-name -1 "") + "" + 4 0 + (proc-arg 0 "num-domain-names" "") + (proc-arg 9 "domain-names" "") + (proc-arg 0 "num-domain-uris" "") + (proc-arg 9 "domain-uris" ""))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/guillotine/guillotine" 1672736559 + (proc-def "plug-in-guillotine" 1 + "Slice the image into subimages using guides" + "This function takes an image and slices it along its guides, creating new images. The original image is not modified." + "Adam D. Moss (adam@foxbox.org)" + "Adam D. Moss (adam@foxbox.org)" + "1998" + "Slice Using G_uides" + 1 + (menu-path "/Image/Crop") + (icon icon-name -1 "") + "RGB*, INDEXED*, GRAY*" + 3 2 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)") + (proc-arg 0 "image-count" "Number of images created") + (proc-arg 5 "image-ids" "Output images"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/grid/grid" 1672736559 + (proc-def "plug-in-grid" 1 + "Draw a grid on the image" + "Draws a grid using the specified colors. The grid origin is the upper left corner." + "Tim Newsome" + "Tim Newsome, Sven Neumann, Tom Rathborne, TC" + "1997 - 2000" + "_Grid (legacy)..." + 1 + (menu-path "/Filters/Render/Pattern") + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 18 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "hwidth" "Horizontal Width (>= 0)") + (proc-arg 0 "hspace" "Horizontal Spacing (>= 1)") + (proc-arg 0 "hoffset" "Horizontal Offset (>= 0)") + (proc-arg 10 "hcolor" "Horizontal Colour") + (proc-arg 2 "hopacity" "Horizontal Opacity (0...255)") + (proc-arg 0 "vwidth" "Vertical Width (>= 0)") + (proc-arg 0 "vspace" "Vertical Spacing (>= 1)") + (proc-arg 0 "voffset" "Vertical Offset (>= 0)") + (proc-arg 10 "vcolor" "Vertical Colour") + (proc-arg 2 "vopacity" "Vertical Opacity (0...255)") + (proc-arg 0 "iwidth" "Intersection Width (>= 0)") + (proc-arg 0 "ispace" "Intersection Spacing (>= 0)") + (proc-arg 0 "ioffset" "Intersection Offset (>= 0)") + (proc-arg 10 "icolor" "Intersection Colour") + (proc-arg 2 "iopacity" "Intersection Opacity (0...255)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/gradient-map/gradient-map" 1672736559 + (proc-def "plug-in-gradmap" 1 + "Recolor the image using colors from the active gradient" + "This plug-in maps the contents of the specified drawable with active gradient. It calculates luminosity of each pixel and replaces the pixel by the sample of active gradient at the position proportional to that luminosity. Complete black pixel becomes the leftmost color of the gradient, and complete white becomes the rightmost. Works on both Grayscale and RGB image with/without alpha channel." + "Eiichi Takamori" + "Eiichi Takamori" + "1997" + "_Gradient Map" + 1 + (menu-path "/Colors/Map") + (icon icon-name -1 "") + "RGB*, GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable")) + (proc-def "plug-in-palettemap" 1 + "Recolor the image using colors from the active palette" + "This plug-in maps the contents of the specified drawable with the active palette. It calculates luminosity of each pixel and replaces the pixel by the palette sample at the corresponding index. A complete black pixel becomes the lowest palette entry, and complete white becomes the highest. Works on both Grayscale and RGB image with/without alpha channel." + "Bill Skaggs" + "Bill Skaggs" + "2004" + "_Palette Map" + 1 + (menu-path "/Colors/Map") + (icon icon-name -1 "") + "RGB*, GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/gradient-flare/gradient-flare" 1672736559 + (proc-def "plug-in-gflare" 1 + "Produce a lense flare effect using gradients" + "This plug-in produces a lense flare effect using custom gradients. In interactive call, the user can edit his/her own favorite lense flare (GFlare) and render it. Edited gflare is saved automatically to the folder in gflare-path, if it is defined in gimprc. In non-interactive call, the user can only render one of GFlare which has been stored in gflare-path already." + "Eiichi Takamori" + "Eiichi Takamori, and a lot of GIMP people" + "1997" + "_Gradient Flare..." + 1 + (menu-path "/Filters/Light and Shadow/Light") + (icon icon-name -1 "") + "RGB*, GRAY*" + 14 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 4 "gflare-name" "The name of GFlare") + (proc-arg 0 "xcenter" "X coordinate of center of GFlare") + (proc-arg 0 "ycenter" "Y coordinate of center of GFlare") + (proc-arg 3 "radius" "Radius of GFlare (pixel)") + (proc-arg 3 "rotation" "Rotation of GFlare (degree)") + (proc-arg 3 "hue" "Hue rotation of GFlare (degree)") + (proc-arg 3 "vangle" "Vector angle for second flares (degree)") + (proc-arg 3 "vlength" "Vector length for second flares (percentage to Radius)") + (proc-arg 0 "use-asupsample" "Whether it uses or not adaptive supersampling while rendering (boolean)") + (proc-arg 0 "asupsample-max-depth" "Max depth for adaptive supersampling") + (proc-arg 3 "asupsample-threshold" "Threshold for adaptive supersampling"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/goat-exercise/goat-exercise" 1672736559 + (proc-def "plug-in-goat-exercise" 1 + "Exercise a goat" + "takes a goat for a walk" + "Øyvind KolÃ¥s " + "Øyvind KolÃ¥s " + "21march 2012" + "Goat-e_xercise" + 1 + (menu-path "/Filters") + (icon icon-name -1 "") + "RGB*, INDEXED*, GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/gimpressionist/gimpressionist" 1672736559 + (proc-def "plug-in-gimpressionist" 1 + "Performs various artistic operations" + "Performs various artistic operations on an image" + "Vidar Madsen " + "Vidar Madsen" + "v1.0, November 2003" + "_GIMPressionist..." + 1 + (menu-path "/Filters/Artistic") + (icon icon-name -1 "") + "RGB*, GRAY*" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 4 "preset" "Preset Name"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/gfig/gfig" 1672736559 + (proc-def "plug-in-gfig" 1 + "Create geometric shapes" + "Draw Vector Graphics and paint them onto your images. Gfig allows you to draw many types of objects including Lines, Circles, Ellipses, Curves, Polygons, pointed stars, Bezier curves, and Spirals. Objects can be painted using Brushes or other toolsor filled using colors or patterns. Gfig objects can also be used to create selections. " + "Andy Thomas" + "Andy Thomas" + "1997" + "_Gfig..." + 1 + (menu-path "/Filters/Render") + (icon icon-name -1 "") + "RGB*, GRAY*" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "dummy" "dummy"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/fractal-trace/fractal-trace" 1672736559 + (proc-def "plug-in-fractal-trace" 1 + "Transform image with the Mandelbrot Fractal" + "transform image with the Mandelbrot Fractal" + "Hirotsuna Mizuno " + "Copyright (C) 1997 Hirotsuna Mizuno" + "v0.4 test version (Dec. 25 1997)" + "_Fractal Trace (legacy)..." + 1 + (menu-path "/Filters/Map") + (icon icon-name -1 "") + "RGB*, GRAY*" + 9 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 3 "xmin" "xmin fractal image delimiter") + (proc-arg 3 "xmax" "xmax fractal image delimiter") + (proc-arg 3 "ymin" "ymin fractal image delimiter") + (proc-arg 3 "ymax" "ymax fractal image delimiter") + (proc-arg 0 "depth" "Trace depth") + (proc-arg 0 "outside-type" "Outside type { WRAP (0), TRANS (1), BLACK (2), WHITE (3) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/fractal-explorer/fractal-explorer" 1672736559 + (proc-def "plug-in-fractalexplorer" 1 + "Render fractal art" + "No help yet." + "Daniel Cotting (cotting@multimania.com, www.multimania.com/cotting)" + "Daniel Cotting (cotting@multimania.com, www.multimania.com/cotting)" + "December, 1998" + "_Fractal Explorer..." + 1 + (menu-path "/Filters/Render/Fractals") + (icon icon-name -1 "") + "RGB*, GRAY*" + 22 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 2 "fractaltype" "0: Mandelbrot; 1: Julia; 2: Barnsley 1; 3: Barnsley 2; 4: Barnsley 3; 5: Spider; 6: ManOWar; 7: Lambda; 8: Sierpinski") + (proc-arg 3 "xmin" "xmin fractal image delimiter") + (proc-arg 3 "xmax" "xmax fractal image delimiter") + (proc-arg 3 "ymin" "ymin fractal image delimiter") + (proc-arg 3 "ymax" "ymax fractal image delimiter") + (proc-arg 3 "iter" "Iteration value") + (proc-arg 3 "cx" "cx value ( only Julia)") + (proc-arg 3 "cy" "cy value ( only Julia)") + (proc-arg 2 "colormode" "0: Apply colormap as specified by the parameters below; 1: Apply active gradient to final image") + (proc-arg 3 "redstretch" "Red stretching factor") + (proc-arg 3 "greenstretch" "Green stretching factor") + (proc-arg 3 "bluestretch" "Blue stretching factor") + (proc-arg 2 "redmode" "Red application mode (0:SIN;1:COS;2:NONE)") + (proc-arg 2 "greenmode" "Green application mode (0:SIN;1:COS;2:NONE)") + (proc-arg 2 "bluemode" "Blue application mode (0:SIN;1:COS;2:NONE)") + (proc-arg 2 "redinvert" "Red inversion mode (1: enabled; 0: disabled)") + (proc-arg 2 "greeninvert" "Green inversion mode (1: enabled; 0: disabled)") + (proc-arg 2 "blueinvert" "Green inversion mode (1: enabled; 0: disabled)") + (proc-arg 0 "ncolors" "Number of Colors for mapping (2<=ncolors<=8192)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/flame/flame" 1672736559 + (proc-def "plug-in-flame" 1 + "Create cosmic recursive fractal flames" + "Create cosmic recursive fractal flames" + "Scott Draves" + "Scott Draves" + "1997" + "_Flame..." + 1 + (menu-path "/Filters/Render/Fractals") + (icon icon-name -1 "") + "RGB*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/filter-pack/filter-pack" 1672736559 + (proc-def "plug-in-filter-pack" 1 + "Interactively modify the image colors" + "Interactively modify the image colors." + "Pavel Grinfeld (pavel@ml.com)" + "Pavel Grinfeld (pavel@ml.com)" + "27th March 1997" + "_Filter Pack..." + 0 + (icon icon-name -1 "") + "RGB*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (used for indexed images)") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/film/film" 1672736559 + (proc-def "plug-in-film" 1 + "Combine several images on a film strip" + "Compose several images to a roll film" + "Peter Kirchgessner" + "Peter Kirchgessner (peter@kirchgessner.net)" + "1997" + "_Filmstrip..." + 1 + (menu-path "/Filters/Combine") + (icon icon-name -1 "") + "INDEXED*, GRAY*, RGB*" + 12 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (only used as default image in interactive mode)") + (proc-arg 16 "drawable" "Input drawable (not used)") + (proc-arg 0 "film-height" "Height of film (0: fit to images)") + (proc-arg 10 "film-color" "Color of the film") + (proc-arg 0 "number-start" "Start index for numbering") + (proc-arg 4 "number-font" "Font for drawing numbers") + (proc-arg 10 "number-color" "Color for numbers") + (proc-arg 0 "at-top" "Flag for drawing numbers at top of film") + (proc-arg 0 "at-bottom" "Flag for drawing numbers at bottom of film") + (proc-arg 0 "num-images" "Number of images to be used for film") + (proc-arg 5 "image-ids" "num-images image IDs to be used for film") + (proc-arg 13 "new-image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-xwd/file-xwd" 1672736559 + (proc-def "file-xwd-load" 1 + "Loads files in the XWD (X Window Dump) format" + "Loads files in the XWD (X Window Dump) format. XWD image files are produced by the program xwd. Xwd is an X Window System window dumping utility." + "Peter Kirchgessner" + "Peter Kirchgessner" + "1996" + "X window dump" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "xwd") + (magics "4,long,0x00000007") + (mime-types "image/x-xwindowdump")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-xwd-save" 1 + "Exports files in the XWD (X Window Dump) format" + "XWD exporting handles all image types except those with alpha channels." + "Peter Kirchgessner" + "Peter Kirchgessner" + "1996" + "X window dump" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "xwd") + (mime-types "image/x-xwindowdump") + (handles-uri)) + "RGB, GRAY, INDEXED" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-xpm/file-xpm" 1672736559 + (proc-def "file-xpm-load" 1 + "Load files in XPM (X11 Pixmap) format." + "Load files in XPM (X11 Pixmap) format. XPM is a portable image format designed to be included in C source code. XLib provides utility functions to read this format. Newer code should however be using gdk-pixbuf-csource instead. XPM supports colored images, unlike the XBM format which XPM was designed to replace." + "Spencer Kimball & Peter Mattis & Ray Lehtiniemi" + "Spencer Kimball & Peter Mattis" + "1997" + "X PixMap image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "xpm") + (magics "0, string,/*\\040XPM\\040*/") + (mime-types "image/x-xpixmap")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-xpm-save" 1 + "Export files in XPM (X11 Pixmap) format." + "Export files in XPM (X11 Pixmap) format. XPM is a portable image format designed to be included in C source code. XLib provides utility functions to read this format. Newer code should however be using gdk-pixbuf-csource instead. XPM supports colored images, unlike the XBM format which XPM was designed to replace." + "Spencer Kimball & Peter Mattis & Ray Lehtiniemi & Nathan Summers" + "Spencer Kimball & Peter Mattis" + "1997" + "X PixMap image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "xpm") + (mime-types "image/x-xpixmap")) + "RGB*, GRAY*, INDEXED*" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "threshold" "Alpha threshold (0-255)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-xmc/file-xmc" 1672736559 + (proc-def "file-xmc-load" 1 + "Loads files of X11 Mouse Cursor file format" + "This plug-in loads X11 Mouse Cursor (XMC) files." + "Takeshi Matsuyama " + "Takeshi Matsuyama" + "26 May 2009" + "X11 Mouse Cursor" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "xmc") + (magics "0,string,Xcur") + (mime-types "image/x-xcursor") + (thumb-loader "file-xmc-load-thumb")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-xmc-load-thumb" 1 + "Loads only first frame of X11 Mouse Cursor's animation sequence which nominal size is the closest of thumb-size to be used as a thumbnail" + "" + "Takeshi Matsuyama " + "Takeshi Matsuyama" + "26 May 2009" + "" + 0 + (icon icon-name -1 "") + "" + 2 5 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Thumbnail image") + (proc-arg 0 "image-width" "The width of image") + (proc-arg 0 "image-height" "The height of image") + (proc-arg 0 "image-type" "The color type of image") + (proc-arg 0 "image-num-layers" "The number of layeres")) + (proc-def "file-xmc-save" 1 + "Exports files of X11 cursor file" + "This plug-in exports X11 Mouse Cursor (XMC) files" + "Takeshi Matsuyama " + "Takeshi Matsuyama" + "26 May 2009" + "X11 Mouse Cursor" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "xmc") + (mime-types "image/x-xcursor")) + "RGBA" + 15 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "x-hot" "X-coordinate of hot spot") + (proc-arg 0 "y-hot" "Y-coordinate of hot spot\nUse (-1, -1) to keep original hot spot.") + (proc-arg 0 "crop" "Auto-crop or not") + (proc-arg 0 "size" "Default nominal size") + (proc-arg 0 "size-replace" "Replace existent size or not.") + (proc-arg 0 "delay" "Default delay") + (proc-arg 0 "delay-replace" "Replace existent delay or not.") + (proc-arg 4 "copyright" "Copyright information.") + (proc-arg 4 "license" "License information.") + (proc-arg 4 "other" "Other comment.(taken from \"gimp-comment\" parasite)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-xbm/file-xbm" 1672736559 + (proc-def "file-xbm-load" 1 + "Load a file in X10 or X11 bitmap (XBM) file format" + "Load a file in X10 or X11 bitmap (XBM) file format. XBM is a lossless format for flat black-and-white (two color indexed) images." + "Gordon Matzigkeit" + "Gordon Matzigkeit" + "1998" + "X BitMap image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "xbm,icon,bitmap") + (mime-types "image/x-xbitmap")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-xbm-save" 1 + "Export a file in X10 or X11 bitmap (XBM) file format" + "Export a file in X10 or X11 bitmap (XBM) file format. XBM is a lossless format for flat black-and-white (two color indexed) images." + "Gordon Matzigkeit" + "Gordon Matzigkeit" + "1998" + "X BitMap image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "xbm,icon,bitmap") + (mime-types "image/x-xbitmap") + (handles-uri)) + "INDEXED" + 12 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 4 "comment" "Image description (maximum 72 bytes)") + (proc-arg 0 "x10" "Export in X10 format") + (proc-arg 0 "x-hot" "X coordinate of hotspot") + (proc-arg 0 "y-hot" "Y coordinate of hotspot") + (proc-arg 4 "prefix" "Identifier prefix [determined from filename]") + (proc-arg 0 "write-mask" "(0 = ignore, 1 = save as extra file)") + (proc-arg 4 "mask-extension" "Extension of the mask file"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-wmf/file-wmf" 1672736559 + (proc-def "file-wmf-load" 1 + "Loads files in the WMF file format" + "Loads files in the WMF file format" + "Dom Lachowicz " + "Dom Lachowicz " + "(c) 2003 - Version 0.3.0" + "Microsoft WMF file" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "wmf,apm") + (magics "0,string,\\327\\315\\306\\232,0,string,\\1\\0\\11\\0") + (mime-types "image/x-wmf") + (thumb-loader "file-wmf-load-thumb")) + "" + 6 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 3 "resolution" "Resolution to use for rendering the WMF (defaults to 72 dpi") + (proc-arg 0 "width" "Width (in pixels) to load the WMF in, 0 for original width") + (proc-arg 0 "height" "Height (in pixels) to load the WMF in, 0 for original height") + (proc-arg 13 "image" "Output image")) + (proc-def "file-wmf-load-thumb" 1 + "Loads a small preview from a WMF image" + "" + "Dom Lachowicz " + "Dom Lachowicz " + "(c) 2003 - Version 0.3.0" + "" + 0 + (icon icon-name -1 "") + "" + 2 3 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Thumbnail image") + (proc-arg 0 "image-width" "Width of full-sized image") + (proc-arg 0 "image-height" "Height of full-sized image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-webp/file-webp" 1672736559 + (proc-def "file-webp-load" 1 + "Loads images in the WebP file format" + "Loads images in the WebP file format" + "Nathan Osman, Ben Touchette" + "(C) 2015-2016 Nathan Osman, (C) 2016 Ben Touchette" + "2015,2016" + "WebP image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "webp") + (magics "8,string,WEBP") + (mime-types "image/webp")) + "" + 3 1 + (proc-arg 0 "run-mode" "Interactive, non-interactive") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-webp-save" 1 + "Saves files in the WebP image format" + "Saves files in the WebP image format" + "Nathan Osman, Ben Touchette" + "(C) 2015-2016 Nathan Osman, (C) 2016 Ben Touchette" + "2015,2016" + "WebP image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "webp") + (mime-types "image/webp")) + "RGB*, GRAY*, INDEXED*" + 18 0 + (proc-arg 0 "run-mode" "Interactive, non-interactive") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image to") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "preset" "preset (Default=0, Picture=1, Photo=2, Drawing=3, Icon=4, Text=5)") + (proc-arg 0 "lossless" "Use lossless encoding (0/1)") + (proc-arg 3 "quality" "Quality of the image (0 <= quality <= 100)") + (proc-arg 3 "alpha-quality" "Quality of the image's alpha channel (0 <= alpha-quality <= 100)") + (proc-arg 0 "animation" "Use layers for animation (0/1)") + (proc-arg 0 "anim-loop" "Loop animation infinitely (0/1)") + (proc-arg 0 "minimize-size" "Minimize animation size (0/1)") + (proc-arg 0 "kf-distance" "Maximum distance between key-frames (>=0)") + (proc-arg 0 "exif" "Toggle saving exif data (0/1)") + (proc-arg 0 "iptc" "Toggle saving iptc data (0/1)") + (proc-arg 0 "xmp" "Toggle saving xmp data (0/1)") + (proc-arg 0 "delay" "Delay to use when timestamps are not available or forced") + (proc-arg 0 "force-delay" "Force delay on all frames")) + (proc-def "file-webp-save2" 1 + "Saves files in the WebP image format" + "Saves files in the WebP image format with additional metadata control" + "Nathan Osman, Ben Touchette" + "(C) 2015-2016 Nathan Osman, (C) 2016 Ben Touchette" + "2015,2016" + "WebP image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "webp") + (mime-types "image/webp")) + "RGB*, GRAY*, INDEXED*" + 19 0 + (proc-arg 0 "run-mode" "Interactive, non-interactive") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image to") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "preset" "preset (Default=0, Picture=1, Photo=2, Drawing=3, Icon=4, Text=5)") + (proc-arg 0 "lossless" "Use lossless encoding (0/1)") + (proc-arg 3 "quality" "Quality of the image (0 <= quality <= 100)") + (proc-arg 3 "alpha-quality" "Quality of the image's alpha channel (0 <= alpha-quality <= 100)") + (proc-arg 0 "animation" "Use layers for animation (0/1)") + (proc-arg 0 "anim-loop" "Loop animation infinitely (0/1)") + (proc-arg 0 "minimize-size" "Minimize animation size (0/1)") + (proc-arg 0 "kf-distance" "Maximum distance between key-frames (>=0)") + (proc-arg 0 "exif" "Toggle saving exif data (0/1)") + (proc-arg 0 "iptc" "Toggle saving iptc data (0/1)") + (proc-arg 0 "xmp" "Toggle saving xmp data (0/1)") + (proc-arg 0 "thumbnail" "Toggle saving thumbnail (0/1)") + (proc-arg 0 "delay" "Delay to use when timestamps are not available or forced") + (proc-arg 0 "force-delay" "Force delay on all frames"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-tiff/file-tiff" 1672736559 + (proc-def "file-tiff-load" 1 + "Loads files of the TIFF and BigTIFF file formats" + "Loads files of the Tag Image File Format (TIFF) and its 64-bits offsets variant (BigTIFF)" + "Spencer Kimball, Peter Mattis & Nick Lamb" + "Nick Lamb " + "1995-1996,1998-2003" + "TIFF image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "tif,tiff") + (magics "0,string,II*\\0,0,string,MM\\0*") + (mime-types "image/tiff") + (handles-uri)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-tiff-save" 1 + "Exports files in the TIFF file format" + "Exports files in the Tagged Image File Format. The value for the saved comment is taken from the 'gimp-comment' parasite." + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1995-1996,2000-2003" + "TIFF image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "tif,tiff") + (mime-types "image/tiff") + (handles-uri)) + "RGB*, GRAY*, INDEXED*" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 0 "compression" "Compression type: { NONE (0), LZW (1), PACKBITS (2), DEFLATE (3), JPEG (4), CCITT G3 Fax (5), CCITT G4 Fax (6) }")) + (proc-def "file-tiff-save2" 1 + "Exports files in the TIFF file format" + "Exports files in the Tagged Image File Format. The value for the saved comment is taken from the 'gimp-comment' parasite." + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1995-1996,2000-2003" + "TIFF image" + 0 + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 0 "compression" "Compression type: { NONE (0), LZW (1), PACKBITS (2), DEFLATE (3), JPEG (4), CCITT G3 Fax (5), CCITT G4 Fax (6) }") + (proc-arg 0 "save-transp-pixels" "Keep the color data masked by an alpha channel intact (do not store premultiplied components)")) + (proc-def "file-bigtiff-save" 1 + "Exports files in the TIFF or BigTIFF file format" + "Exports files in the Tagged Image File Format or its 64-bit offsets variant (BigTIFF) able to support much bigger file sizes. The value for the saved comment is taken from the 'gimp-comment' parasite." + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1995-1996,2000-2003" + "TIFF image" + 0 + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 8 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 0 "compression" "Compression type: { NONE (0), LZW (1), PACKBITS (2), DEFLATE (3), JPEG (4), CCITT G3 Fax (5), CCITT G4 Fax (6) }") + (proc-arg 0 "save-transp-pixels" "Keep the color data masked by an alpha channel intact (do not store premultiplied components)") + (proc-arg 0 "bigtiff" "Export in BigTIFF variant file format"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-tga/file-tga" 1672736559 + (proc-def "file-tga-load" 1 + "Loads files of Targa file format" + "FIXME: write help for tga_load" + "Raphael FRANCOIS, Gordon Matzigkeit" + "Raphael FRANCOIS, Gordon Matzigkeit" + "1997,2000,2007" + "TarGA image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "tga,vda,icb,vst") + (magics "-18&,string,TRUEVISION-XFILE.,-1,byte,0") + (mime-types "image/x-tga")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-tga-save" 1 + "exports files in the Targa file format" + "FIXME: write help for tga_save" + "Raphael FRANCOIS, Gordon Matzigkeit" + "Raphael FRANCOIS, Gordon Matzigkeit" + "1997,2000" + "TarGA image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "tga") + (mime-types "image/x-tga")) + "RGB*, GRAY*, INDEXED*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "rle" "Use RLE compression") + (proc-arg 0 "origin" "Image origin (0 = top-left, 1 = bottom-left)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-svg/file-svg" 1672736559 + (proc-def "file-svg-load" 1 + "Loads files in the SVG file format" + "Renders SVG files to raster graphics using librsvg." + "Dom Lachowicz, Sven Neumann" + "Dom Lachowicz " + "2.5.0" + "SVG image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "svg") + (magics "0,string," + "2.5.0" + "" + 0 + (icon icon-name -1 "") + "" + 2 3 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Thumbnail image") + (proc-arg 0 "image-width" "Width of full-sized image") + (proc-arg 0 "image-height" "Height of full-sized image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-sunras/file-sunras" 1672736559 + (proc-def "file-sunras-load" 1 + "load file of the SunRaster file format" + "load file of the SunRaster file format" + "Peter Kirchgessner" + "Peter Kirchgessner" + "1996" + "SUN Rasterfile image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "im1,im8,im24,im32,rs,ras,sun") + (magics "0,long,0x59a66a95") + (mime-types "image/x-sun-raster")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-sunras-save" 1 + "export file in the SunRaster file format" + "SUNRAS exporting handles all image types except those with alpha channels." + "Peter Kirchgessner" + "Peter Kirchgessner" + "1996" + "SUN Rasterfile image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "im1,im8,im24,im32,rs,ras,sun") + (mime-types "image/x-sun-raster")) + "RGB, GRAY, INDEXED" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "rle" "Specify non-zero for rle output, zero for standard output"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-sgi/file-sgi" 1672736559 + (proc-def "file-sgi-load" 1 + "Loads files in SGI image file format" + "This plug-in loads SGI image files." + "Michael Sweet " + "Copyright 1997-1998 by Michael Sweet" + "1.1.1 - 17 May 1998" + "Silicon Graphics IRIS image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "sgi,rgb,rgba,bw,icon") + (magics "0,short,474") + (mime-types "image/x-sgi")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-sgi-save" 1 + "Exports files in SGI image file format" + "This plug-in exports SGI image files." + "Michael Sweet " + "Copyright 1997-1998 by Michael Sweet" + "1.1.1 - 17 May 1998" + "Silicon Graphics IRIS image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "sgi,rgb,rgba,bw,icon") + (mime-types "image/x-sgi")) + "RGB*, GRAY*, INDEXED*" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "compression" "Compression level (0 = none, 1 = RLE, 2 = ARLE)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-raw-placeholder/file-raw-placeholder" 1672736559 + (proc-def "file-raw-placeholder-canon-load" 1 + "Load files in the Canon raw formats via raw-placeholder" + "This plug-in loads files in Canon's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Canon" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "cr2,crw,cr3") + (magics "0,string,II*\\0\\020\\0\\0\\0CR,0,string,II\\024\\0\\0\\0HEAPCCDR,4,string,ftypcrx ") + (mime-types "image/x-canon-cr2,image/x-canon-crw,image/x-canon-cr3") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-nikon-load" 1 + "Load files in the Nikon raw formats via raw-placeholder" + "This plug-in loads files in Nikon's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Nikon" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "nef,nrw") + (mime-types "image/x-nikon-nef,image/x-nikon-nrw") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-hasselblad-load" 1 + "Load files in the Hasselblad raw formats via raw-placeholder" + "This plug-in loads files in Hasselblad's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Hasselblad" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "3fr,fff") + (mime-types "image/x-hasselblad-3fr,image/x-hasselblad-fff") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-sony-load" 1 + "Load files in the Sony raw formats via raw-placeholder" + "This plug-in loads files in Sony's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Sony" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "arw,srf,sr2") + (mime-types "image/x-sony-arw,image/x-sony-srf,image/x-sony-sr2") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-bay-load" 1 + "Load files in the BAY raw format via raw-placeholder" + "This plug-in loads files in Casio's raw BAY format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Casio BAY" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "bay") + (mime-types "image/x-casio-bay") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-cine-load" 1 + "Load files in the CINE raw format via raw-placeholder" + "This plug-in loads files in Phantom Software's raw CINE format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Phantom Software CINE" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "cine,cin") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-sinar-load" 1 + "Load files in the Sinar raw formats via raw-placeholder" + "This plug-in loads files in Sinar's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Sinar" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "cs1,ia,sti") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-kodak-load" 1 + "Load files in the Kodak raw formats via raw-placeholder" + "This plug-in loads files in Kodak's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Kodak" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "dc2,dcr,kdc,k25,kc2") + (mime-types "image/x-kodak-dc2,image/x-kodak-dcr,image/x-kodak-kdc,image/x-kodak-k25,image/x-kodak-kc2") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-dng-load" 1 + "Load files in the DNG raw format via raw-placeholder" + "This plug-in loads files in the Adobe Digital Negative DNG format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Adobe DNG Digital Negative" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "dng") + (mime-types "image/x-adobe-dng") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-erf-load" 1 + "Load files in the ERF raw format via raw-placeholder" + "This plug-in loads files in Epson's raw ERF format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Epson ERF" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "erf") + (mime-types "image/x-epson-erf") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-phaseone-load" 1 + "Load files in the Phase One raw formats via raw-placeholder" + "This plug-in loads files in Phase One's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Phase One" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "cap,iiq") + (mime-types "image/x-phaseone-cap,image/x-phaseone-iiq") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-minolta-load" 1 + "Load files in the Minolta raw formats via raw-placeholder" + "This plug-in loads files in Minolta's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Minolta" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "mdc,mrw") + (mime-types "image/x-minolta-mdc,image/x-minolta-mrw") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-mef-load" 1 + "Load files in the MEF raw format via raw-placeholder" + "This plug-in loads files in Mamiya's raw MEF format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Mamiya MEF" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "mef") + (mime-types "image/x-mamiya-mef") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-mos-load" 1 + "Load files in the MOS raw format via raw-placeholder" + "This plug-in loads files in Leaf's raw MOS format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Leaf MOS" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "mos") + (mime-types "image/x-leaf-mos") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-orf-load" 1 + "Load files in the ORF raw format via raw-placeholder" + "This plug-in loads files in Olympus' raw ORF format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Olympus ORF" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "orf") + (magics "0,string,IIRO,0,string,MMOR,0,string,IIRS") + (mime-types "image/x-olympus-orf") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-pef-load" 1 + "Load files in the PEF raw format via raw-placeholder" + "This plug-in loads files in Pentax' raw PEF format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Pentax PEF" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "pef,raw") + (mime-types "image/x-pentax-pef,image/x-pentax-raw") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-pxn-load" 1 + "Load files in the PXN raw format via raw-placeholder" + "This plug-in loads files in Logitech's raw PXN format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Logitech PXN" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "pxn") + (mime-types "image/x-pxn") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-qtk-load" 1 + "Load files in the QTK raw format via raw-placeholder" + "This plug-in loads files in Apple's QuickTake QTK raw format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Apple QuickTake QTK" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "qtk") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-raf-load" 1 + "Load files in the RAF raw format via raw-placeholder" + "This plug-in loads files in Fujifilm's raw RAF format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Fujifilm RAF" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "raf") + (magics "0,string,FUJIFILMCCD-RAW") + (mime-types "image/x-fuji-raf") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-panasonic-load" 1 + "Load files in the Panasonic raw formats via raw-placeholder" + "This plug-in loads files in Panasonic's raw formats by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Panasonic" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "raw,rw2") + (magics "0,string,IIU\\0") + (mime-types "image/x-panasonic-raw,image/x-panasonic-rw2") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-rdc-load" 1 + "Load files in the RDC raw format via raw-placeholder" + "This plug-in loads files in Digital Foto Maker's raw RDC format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Digital Foto Maker RDC" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "rdc") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-rwl-load" 1 + "Load files in the RWL raw format via raw-placeholder" + "This plug-in loads files in Leica's raw RWL format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Leica RWL" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "rwl") + (mime-types "image/x-leica-rwl") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-srw-load" 1 + "Load files in the SRW raw format via raw-placeholder" + "This plug-in loads files in Samsung's raw SRW format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Samsung SRW" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "srw") + (mime-types "image/x-samsung-srw") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-x3f-load" 1 + "Load files in the X3F raw format via raw-placeholder" + "This plug-in loads files in Sigma's raw X3F format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Sigma X3F" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "x3f") + (magics "0,string,FOVb") + (mime-types "image/x-sigma-x3f") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-placeholder-ari-load" 1 + "Load files in the ARI raw format via raw-placeholder" + "This plug-in loads files in Arriflex' raw ARI format by calling raw-placeholder." + "Tobias Ellinghaus" + "Tobias Ellinghaus" + "2016" + "Raw Arriflex ARI" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "ari") + (handles-raw)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-raw-data/file-raw-data" 1672736559 + (proc-def "file-raw-load" 1 + "Load raw images, specifying image information" + "Load raw images, specifying image information" + "timecop, pg@futureware.at" + "timecop, pg@futureware.at" + "Aug 2004" + "Raw image data" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "data")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-hgt-load" 1 + "Load HGT data as images" + "Load Digital Elevation Model data in HGT format from the Shuttle Radar Topography Mission as images. Though the output image will be RGB, all colors are grayscale by default and the contrast will be quite low on most earth relief. Therefore You will likely want to remap elevation to colors as a second step, for instance with the \"Gradient Map\" plug-in." + "" + "" + "2017-12-09" + "Digital Elevation Model data" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "hgt")) + "" + 4 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "samplespacing" "The sample spacing of the data. Only supported values are 0, 1 and 3 (respectively auto-detect, SRTM-1 and SRTM-3 data)") + (proc-arg 13 "image" "Output image")) + (proc-def "file-raw-save" 1 + "Dump images to disk in raw format" + "This plug-in dumps images to disk in raw format, using the default settings stored as a parasite." + "timecop, pg@futureware.at" + "timecop, pg@futureware.at" + "Aug 2004" + "Raw image data" + 0 + (icon icon-name -1 "") + "INDEXED, GRAY, RGB, RGBA" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered")) + (proc-def "file-raw-save2" 1 + "Dump images to disk in raw format" + "Dump images to disk in raw format" + "Björn Kautler, Bjoern@Kautler.net" + "Björn Kautler, Bjoern@Kautler.net" + "April 2014" + "Raw image data" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "data,raw")) + "INDEXED, GRAY, RGB, RGBA" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "image-type" "The image type { RAW_RGB (0), RAW_PLANAR (3) }") + (proc-arg 0 "palette-type" "The palette type { RAW_PALETTE_RGB (0), RAW_PALETTE_BGR (1) }")) + (proc-def "file-raw-get-defaults" 1 + "Get the current set of defaults used by the raw image data dump plug-in" + "This procedure returns the current set of defaults stored as a parasite for the raw image data dump plug-in. These defaults are used to seed the UI, by the file_raw_save_defaults procedure, and by gimp_file_save when it detects to use RAW." + "Björn Kautler, Bjoern@Kautler.net" + "Björn Kautler, Bjoern@Kautler.net" + "April 2014" + "" + 0 + (icon icon-name -1 "") + "" + 0 2 + (proc-arg 0 "image-type" "The image type { RAW_RGB (0), RAW_PLANAR (3) }") + (proc-arg 0 "palette-type" "The palette type { RAW_PALETTE_RGB (0), RAW_PALETTE_BGR (1) }")) + (proc-def "file-raw-set-defaults" 1 + "Set the current set of defaults used by the raw image dump plug-in" + "This procedure sets the current set of defaults stored as a parasite for the raw image data dump plug-in. These defaults are used to seed the UI, by the file_raw_save_defaults procedure, and by gimp_file_save when it detects to use RAW." + "Björn Kautler, Bjoern@Kautler.net" + "Björn Kautler, Bjoern@Kautler.net" + "April 2014" + "" + 0 + (icon icon-name -1 "") + "" + 2 0 + (proc-arg 0 "image-type" "The image type { RAW_RGB (0), RAW_PLANAR (3) }") + (proc-arg 0 "palette-type" "The palette type { RAW_PALETTE_RGB (0), RAW_PALETTE_BGR (1) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-psp/file-psp" 1672736559 + (proc-def "file-psp-load" 1 + "loads images from the Paint Shop Pro PSP file format" + "This plug-in loads and exports images in Paint Shop Pro's native PSP format. Vector layers aren't handled. Exporting isn't yet implemented." + "Tor Lillqvist" + "Tor Lillqvist" + "1999" + "Paint Shop Pro image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "psp,tub,pspimage") + (magics "0,string,Paint\\040Shop\\040Pro\\040Image\\040File\n\032") + (mime-types "image/x-psp")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-psd/file-psd" 1672736559 + (proc-def "file-psd-load" 1 + "Loads images from the Photoshop PSD file format" + "This plug-in loads images in Adobe Photoshop (TM) native PSD format." + "John Marshall" + "John Marshall" + "2007" + "Photoshop image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "psd") + (magics "0,string,8BPS") + (mime-types "image/x-psd") + (thumb-loader "file-psd-load-thumb")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-psd-load-merged" 1 + "Loads merged images from the Photoshop PSD file format" + "This plug-in loads the merged image data in Adobe Photoshop (TM) native PSD format." + "Ell" + "Ell" + "2018" + "Photoshop image (merged)" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "psd") + (magics "0,string,8BPS") + (priority 1) + (mime-types "image/x-psd") + (priority 1)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-psd-load-thumb" 1 + "Loads thumbnails from the Photoshop PSD file format" + "This plug-in loads thumbnail images from Adobe Photoshop (TM) native PSD format files." + "John Marshall" + "John Marshall" + "2007" + "" + 0 + (icon icon-name -1 "") + "" + 2 3 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Thumbnail image") + (proc-arg 0 "image-width" "Width of full-sized image") + (proc-arg 0 "image-height" "Height of full-sized image")) + (proc-def "file-psd-save" 1 + "saves files in the Photoshop(tm) PSD file format" + "This filter saves files of Adobe Photoshop(tm) native PSD format. These files may be of any image type supported by GIMP, with or without layers, layer masks, aux channels and guides." + "Monigotes" + "Monigotes" + "2000" + "Photoshop image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "psd") + (mime-types "image/x-psd")) + "RGB*, GRAY*, INDEXED*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 0 "compression" "Compression type: { NONE (0), LZW (1), PACKBITS (2)") + (proc-arg 0 "fill-order" "Fill Order: { MSB to LSB (0), LSB to MSB (1)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-ps/file-ps" 1672736559 + (proc-def "file-ps-load" 1 + "load PostScript documents" + "load PostScript documents" + "Peter Kirchgessner " + "Peter Kirchgessner" + "v1.17 19-Sep-2004" + "PostScript document" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "ps") + (magics "0,string,%!,0,long,0xc5d0d3c6") + (mime-types "application/postscript") + (thumb-loader "file-ps-load-thumb")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-eps-load" 1 + "load Encapsulated PostScript images" + "load Encapsulated PostScript images" + "Peter Kirchgessner " + "Peter Kirchgessner" + "v1.17 19-Sep-2004" + "Encapsulated PostScript image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "eps") + (magics "0,string,%!,0,long,0xc5d0d3c6") + (mime-types "image/x-eps") + (thumb-loader "file-ps-load-thumb")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-ps-load-setargs" 1 + "set additional parameters for procedure file-ps-load" + "set additional parameters for procedure file-ps-load" + "Peter Kirchgessner " + "Peter Kirchgessner" + "v1.17 19-Sep-2004" + "" + 0 + (icon icon-name -1 "") + "" + 8 0 + (proc-arg 0 "resolution" "Resolution to interpret image (dpi)") + (proc-arg 0 "width" "Desired width") + (proc-arg 0 "height" "Desired height") + (proc-arg 0 "check-bbox" "0: Use width/height, 1: Use BoundingBox") + (proc-arg 4 "pages" "Pages to load (e.g.: 1,3,5-7)") + (proc-arg 0 "coloring" "4: b/w, 5: grey, 6: color image, 7: automatic") + (proc-arg 0 "text-alpha-bits" "1, 2, or 4") + (proc-arg 0 "graphic-alpha-bits" "1, 2, or 4")) + (proc-def "file-ps-load-thumb" 1 + "Loads a small preview from a PostScript or PDF document" + "" + "Peter Kirchgessner " + "Peter Kirchgessner" + "v1.17 19-Sep-2004" + "" + 0 + (icon icon-name -1 "") + "" + 2 1 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Output image")) + (proc-def "file-ps-save" 1 + "export image as PostScript document" + "PostScript exporting handles all image types except those with alpha channels." + "Peter Kirchgessner " + "Peter Kirchgessner" + "v1.17 19-Sep-2004" + "PostScript document" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "ps") + (mime-types "application/postscript") + (handles-uri)) + "RGB, GRAY, INDEXED" + 15 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 3 "width" "Width of the image in PostScript file (0: use input image size)") + (proc-arg 3 "height" "Height of image in PostScript file (0: use input image size)") + (proc-arg 3 "x-offset" "X-offset to image from lower left corner") + (proc-arg 3 "y-offset" "Y-offset to image from lower left corner") + (proc-arg 0 "unit" "Unit for width/height/offset. 0: inches, 1: millimeters") + (proc-arg 0 "keep-ratio" "0: use width/height, 1: keep aspect ratio") + (proc-arg 0 "rotation" "0, 90, 180, 270") + (proc-arg 0 "eps-flag" "0: PostScript, 1: Encapsulated PostScript") + (proc-arg 0 "preview" "0: no preview, >0: max. size of preview") + (proc-arg 0 "level" "1: PostScript Level 1, 2: PostScript Level 2")) + (proc-def "file-eps-save" 1 + "export image as Encapsulated PostScript image" + "PostScript exporting handles all image types except those with alpha channels." + "Peter Kirchgessner " + "Peter Kirchgessner" + "v1.17 19-Sep-2004" + "Encapsulated PostScript image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "eps") + (mime-types "application/x-eps") + (handles-uri)) + "RGB, GRAY, INDEXED" + 15 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 3 "width" "Width of the image in PostScript file (0: use input image size)") + (proc-arg 3 "height" "Height of image in PostScript file (0: use input image size)") + (proc-arg 3 "x-offset" "X-offset to image from lower left corner") + (proc-arg 3 "y-offset" "Y-offset to image from lower left corner") + (proc-arg 0 "unit" "Unit for width/height/offset. 0: inches, 1: millimeters") + (proc-arg 0 "keep-ratio" "0: use width/height, 1: keep aspect ratio") + (proc-arg 0 "rotation" "0, 90, 180, 270") + (proc-arg 0 "eps-flag" "0: PostScript, 1: Encapsulated PostScript") + (proc-arg 0 "preview" "0: no preview, >0: max. size of preview") + (proc-arg 0 "level" "1: PostScript Level 1, 2: PostScript Level 2"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-pnm/file-pnm" 1672736559 + (proc-def "file-pnm-load" 1 + "Loads files in the PNM file format" + "This plug-in loads files in the various Netpbm portable file formats." + "Erik Nygren" + "Erik Nygren" + "1996" + "PNM Image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "pnm,ppm,pgm,pbm,pfm") + (magics "0,string,P1,0,string,P2,0,string,P3,0,string,P4,0,string,P5,0,string,P6,0,string,PF,0,string,Pf") + (mime-types "image/x-portable-anymap") + (handles-uri)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-pnm-save" 1 + "Exports files in the PNM file format" + "PNM exporting handles all image types without transparency." + "Erik Nygren" + "Erik Nygren" + "1996" + "PNM image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "pnm") + (mime-types "image/x-portable-anymap") + (handles-uri)) + "RGB, GRAY, INDEXED" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "raw" "TRUE for raw output, FALSE for ascii output")) + (proc-def "file-pbm-save" 1 + "Exports files in the PBM file format" + "PBM exporting produces mono images without transparency." + "Martin K Collins" + "Erik Nygren" + "2006" + "PBM image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "pbm") + (mime-types "image/x-portable-bitmap") + (handles-uri)) + "RGB, GRAY, INDEXED" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "raw" "TRUE for raw output, FALSE for ascii output")) + (proc-def "file-pgm-save" 1 + "Exports files in the PGM file format" + "PGM exporting produces grayscale images without transparency." + "Erik Nygren" + "Erik Nygren" + "1996" + "PGM image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "pgm") + (mime-types "image/x-portable-graymap") + (handles-uri)) + "RGB, GRAY, INDEXED" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "raw" "TRUE for raw output, FALSE for ascii output")) + (proc-def "file-ppm-save" 1 + "Exports files in the PPM file format" + "PPM exporting handles RGB images without transparency." + "Erik Nygren" + "Erik Nygren" + "1996" + "PPM image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "ppm") + (mime-types "image/x-portable-floatmap") + (handles-uri)) + "RGB, GRAY, INDEXED" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "raw" "TRUE for raw output, FALSE for ascii output")) + (proc-def "file-pfm-save" 1 + "Exports files in the PFM file format" + "PFM exporting handles all images without transparency." + "Mukund Sivaraman" + "Mukund Sivaraman" + "2015" + "PFM image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "pfm") + (handles-uri)) + "RGB, GRAY, INDEXED" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-png/file-png" 1672736559 + (proc-def "file-png-load" 1 + "Loads files in PNG file format" + "This plug-in loads Portable Network Graphics (PNG) files." + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>" + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>, Nick Lamb " + "1.3.4 - 03 September 2002" + "PNG image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "png") + (magics "0,string,‰PNG\r\n\032\n") + (mime-types "image/png")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-png-save" 1 + "Exports files in PNG file format" + "This plug-in exports Portable Network Graphics (PNG) files." + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>" + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>, Nick Lamb " + "1.3.4 - 03 September 2002" + "PNG image" + 0 + (icon icon-name -1 "") + "RGB*,GRAY*,INDEXED*" + 12 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "interlace" "Use Adam7 interlacing?") + (proc-arg 0 "compression" "Deflate Compression factor (0--9)") + (proc-arg 0 "bkgd" "Write bKGD chunk?") + (proc-arg 0 "gama" "Write gAMA chunk?") + (proc-arg 0 "offs" "Write oFFs chunk?") + (proc-arg 0 "phys" "Write pHYs chunk?") + (proc-arg 0 "time" "Write tIME chunk?")) + (proc-def "file-png-save2" 1 + "Exports files in PNG file format" + "This plug-in exports Portable Network Graphics (PNG) files. This procedure adds 2 extra parameters to file-png-save that control whether image comments are saved and whether transparent pixels are saved or nullified." + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>" + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>, Nick Lamb " + "1.3.4 - 03 September 2002" + "PNG image" + 0 + (icon icon-name -1 "") + "RGB*,GRAY*,INDEXED*" + 14 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in") + (proc-arg 0 "interlace" "Use Adam7 interlacing?") + (proc-arg 0 "compression" "Deflate Compression factor (0--9)") + (proc-arg 0 "bkgd" "Write bKGD chunk?") + (proc-arg 0 "gama" "Write gAMA chunk?") + (proc-arg 0 "offs" "Write oFFs chunk?") + (proc-arg 0 "phys" "Write pHYs chunk?") + (proc-arg 0 "time" "Write tIME chunk?") + (proc-arg 0 "comment" "Write comment?") + (proc-arg 0 "svtrans" "Preserve color of transparent pixels?")) + (proc-def "file-png-save-defaults" 1 + "Exports files in PNG file format" + "This plug-in exports Portable Network Graphics (PNG) files, using the default settings stored as a parasite." + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>" + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>, Nick Lamb " + "1.3.4 - 03 September 2002" + "PNG image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "png") + (mime-types "image/png")) + "RGB*,GRAY*,INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in")) + (proc-def "file-png-get-defaults" 1 + "Get the current set of defaults used by the PNG file export plug-in" + "This procedure returns the current set of defaults stored as a parasite for the PNG export plug-in. These defaults are used to seed the UI, by the file_png_save_defaults procedure, and by gimp_file_save when it detects to use PNG." + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>" + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>, Nick Lamb " + "1.3.4 - 03 September 2002" + "" + 0 + (icon icon-name -1 "") + "" + 0 9 + (proc-arg 0 "interlace" "Use Adam7 interlacing?") + (proc-arg 0 "compression" "Deflate Compression factor (0--9)") + (proc-arg 0 "bkgd" "Write bKGD chunk?") + (proc-arg 0 "gama" "Write gAMA chunk?") + (proc-arg 0 "offs" "Write oFFs chunk?") + (proc-arg 0 "phys" "Write pHYs chunk?") + (proc-arg 0 "time" "Write tIME chunk?") + (proc-arg 0 "comment" "Write comment?") + (proc-arg 0 "svtrans" "Preserve color of transparent pixels?")) + (proc-def "file-png-set-defaults" 1 + "Set the current set of defaults used by the PNG file export plug-in" + "This procedure set the current set of defaults stored as a parasite for the PNG export plug-in. These defaults are used to seed the UI, by the file_png_save_defaults procedure, and by gimp_file_save when it detects to use PNG." + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>" + "Michael Sweet , Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>, Nick Lamb " + "1.3.4 - 03 September 2002" + "" + 0 + (icon icon-name -1 "") + "" + 9 0 + (proc-arg 0 "interlace" "Use Adam7 interlacing?") + (proc-arg 0 "compression" "Deflate Compression factor (0--9)") + (proc-arg 0 "bkgd" "Write bKGD chunk?") + (proc-arg 0 "gama" "Write gAMA chunk?") + (proc-arg 0 "offs" "Write oFFs chunk?") + (proc-arg 0 "phys" "Write pHYs chunk?") + (proc-arg 0 "time" "Write tIME chunk?") + (proc-arg 0 "comment" "Write comment?") + (proc-arg 0 "svtrans" "Preserve color of transparent pixels?"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-pix/file-pix" 1672736559 + (proc-def "file-pix-load" 1 + "loads files of the Alias|Wavefront Pix file format" + "loads files of the Alias|Wavefront Pix file format" + "Michael Taylor" + "Michael Taylor" + "1997" + "Alias Pix image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "pix,matte,mask,alpha,als") + (handles-uri)) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-pix-save" 1 + "export file in the Alias|Wavefront pix/matte file format" + "export file in the Alias|Wavefront pix/matte file format" + "Michael Taylor" + "Michael Taylor" + "1997" + "Alias Pix image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "pix,matte,mask,alpha,als") + (handles-uri)) + "RGB*, GRAY*, INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-pdf-save/file-pdf-save" 1672736559 + (proc-def "file-pdf-save" 1 + "Save files in PDF format" + "Saves files in Adobe's Portable Document Format. PDF is designed to be easily processed by a variety of different platforms, and is a distant cousin of PostScript." + "Barak Itkin" + "Copyright Barak Itkin" + "August 2009" + "Portable Document Format" + 0 + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 8 0 + (proc-arg 0 "run-mode" "Run mode") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 0 "vectorize" "Convert bitmaps to vector graphics where possible. TRUE or FALSE") + (proc-arg 0 "ignore-hidden" "Omit hidden layers and layers with zero opacity. TRUE or FALSE") + (proc-arg 0 "apply-masks" "Apply layer masks before saving. TRUE or FALSE (Keeping them will not change the output)")) + (proc-def "file-pdf-save2" 1 + "Save files in PDF format" + "Saves files in Adobe's Portable Document Format. PDF is designed to be easily processed by a variety of different platforms, and is a distant cousin of PostScript.\nThis procedure adds an extra parameter to file-pdf-save to save layers as pages." + "Barak Itkin, Lionel N., Jehan" + "Copyright Barak Itkin, Lionel N., Jehan" + "August 2009, 2017" + "Portable Document Format" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "pdf") + (mime-types "application/pdf")) + "RGB*, GRAY*, INDEXED*" + 10 0 + (proc-arg 0 "run-mode" "Run mode") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 0 "vectorize" "Convert bitmaps to vector graphics where possible. TRUE or FALSE") + (proc-arg 0 "ignore-hidden" "Omit hidden layers and layers with zero opacity. TRUE or FALSE") + (proc-arg 0 "apply-masks" "Apply layer masks before saving. TRUE or FALSE (Keeping them will not change the output)") + (proc-arg 0 "layers-as-pages" "Layers as pages (bottom layers first). TRUE or FALSE") + (proc-arg 0 "reverse-order" "Reverse the pages order (top layers first). TRUE or FALSE")) + (proc-def "file-pdf-save-multi" 1 + "Save files in PDF format" + "Saves files in Adobe's Portable Document Format. PDF is designed to be easily processed by a variety of different platforms, and is a distant cousin of PostScript." + "Barak Itkin" + "Copyright Barak Itkin" + "August 2009" + "_Create multipage PDF..." + 0 + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 8 0 + (proc-arg 0 "run-mode" "Run mode") + (proc-arg 0 "count" "The amount of images entered (This will be the amount of pages). 1 <= count <= MAX_PAGE_COUNT") + (proc-arg 5 "images" "Input image for each page (An image can appear more than once)") + (proc-arg 0 "vectorize" "Convert bitmaps to vector graphics where possible. TRUE or FALSE") + (proc-arg 0 "ignore-hidden" "Omit hidden layers and layers with zero opacity. TRUE or FALSE") + (proc-arg 0 "apply-masks" "Apply layer masks before saving. TRUE or FALSE (Keeping them will not change the output)") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-pdf-load/file-pdf-load" 1672736559 + (proc-def "file-pdf-load" 1 + "Load file in PDF format" + "Loads files in Adobe's Portable Document Format. PDF is designed to be easily processed by a variety of different platforms, and is a distant cousin of PostScript.\nIf the PDF document has multiple pages, only the first page will be loaded. Call file_pdf_load2() to load several pages as layers." + "Nathan Summers" + "Nathan Summers" + "2005" + "Portable Document Format" + 0 + (icon icon-name -1 "") + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-pdf-load2" 1 + "Load file in PDF format" + "Loads files in Adobe's Portable Document Format. PDF is designed to be easily processed by a variety of different platforms, and is a distant cousin of PostScript.\nThis procedure adds extra parameters to file-pdf-load to open encrypted PDF and to allow multiple page loading." + "Nathan Summers, Lionel N." + "Nathan Summers, Lionel N." + "2005, 2017" + "Portable Document Format" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "pdf") + (magics "0, string,%PDF-") + (mime-types "application/pdf") + (thumb-loader "file-pdf-load-thumb")) + "" + 6 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 4 "pdf-password" "The password to decrypt the encrypted PDF file") + (proc-arg 0 "n-pages" "Number of pages to load (0 for all)") + (proc-arg 5 "pages" "The pages to load in the expected order") + (proc-arg 13 "image" "Output image")) + (proc-def "file-pdf-load-thumb" 1 + "Loads a preview from a PDF file." + "Loads a small preview of the first page of the PDF format file. Uses the embedded thumbnail if present." + "Nathan Summers" + "Nathan Summers" + "2005" + "" + 0 + (icon icon-name -1 "") + "" + 2 5 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Thumbnail image") + (proc-arg 0 "image-width" "Width of full-sized image") + (proc-arg 0 "image-height" "Height of full-sized image") + (proc-arg 0 "image-type" "Image type") + (proc-arg 0 "num-layers" "Number of pages"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-pcx/file-pcx" 1672736559 + (proc-def "file-pcx-load" 1 + "Loads files in Zsoft PCX file format" + "FIXME: write help for pcx_load" + "Francisco Bustamante & Nick Lamb" + "Nick Lamb " + "January 1997" + "ZSoft PCX image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "pcx,pcc") + (magics "0&,byte,10,2&,byte,1,3&,byte,>0,3,byte,<9") + (mime-types "image/x-pcx")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-pcx-save" 1 + "Exports files in ZSoft PCX file format" + "FIXME: write help for pcx_save" + "Francisco Bustamante & Nick Lamb" + "Nick Lamb " + "January 1997" + "ZSoft PCX image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "pcx,pcc") + (mime-types "image/x-pcx")) + "INDEXED, RGB, GRAY" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name entered"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-pat/file-pat" 1672736559 + (proc-def "file-pat-save" 1 + "Exports Gimp pattern file (.PAT)" + "New Gimp patterns can be created by exporting them in the appropriate place with this plug-in." + "Tim Newsome" + "Tim Newsome" + "1997" + "GIMP pattern" + 0 + (icon icon-name -1 "gimp-pattern") + (save-proc + (extensions "pat") + (mime-types "image/x-gimp-pat") + (handles-uri)) + "RGB*, GRAY*, INDEXED*" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "uri" "The URI of the file to export the image in") + (proc-arg 4 "raw-uri" "The URI of the file to export the image in") + (proc-arg 4 "description" "Short description of the pattern"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-mng/file-mng" 1672736559 + (proc-def "file-mng-save" 1 + "Saves images in the MNG file format" + "This plug-in saves images in the Multiple-image Network Graphics (MNG) format which can be used as a replacement for animated GIFs, and more." + "Mukund Sivaraman " + "Mukund Sivaraman " + "November 19, 2002" + "MNG animation" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "mng") + (mime-types "image/x-mng")) + "RGB*,GRAY*,INDEXED*" + 17 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 0 "interlace" "Use interlacing") + (proc-arg 0 "compression" "PNG deflate compression level (0 - 9)") + (proc-arg 3 "quality" "JPEG quality factor (0.00 - 1.00)") + (proc-arg 3 "smoothing" "JPEG smoothing factor (0.00 - 1.00)") + (proc-arg 0 "loop" "(ANIMATED MNG) Loop infinitely") + (proc-arg 0 "default-delay" "(ANIMATED MNG) Default delay between frames in milliseconds") + (proc-arg 0 "default-chunks" "(ANIMATED MNG) Default chunks type (0 = PNG + Delta PNG; 1 = JNG + Delta PNG; 2 = All PNG; 3 = All JNG)") + (proc-arg 0 "default-dispose" "(ANIMATED MNG) Default dispose type (0 = combine; 1 = replace)") + (proc-arg 0 "bkgd" "Write bKGD (background color) chunk") + (proc-arg 0 "gama" "Write gAMA (gamma) chunk") + (proc-arg 0 "phys" "Write pHYs (image resolution) chunk") + (proc-arg 0 "time" "Write tIME (creation time) chunk"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-jpeg/file-jpeg" 1672736559 + (proc-def "file-jpeg-load" 1 + "loads files in the JPEG file format" + "loads files in the JPEG file format" + "Spencer Kimball, Peter Mattis & others" + "Spencer Kimball & Peter Mattis" + "1995-2007" + "JPEG image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "jpg,jpeg,jpe") + (magics "0,string,ÿØÿ") + (mime-types "image/jpeg") + (thumb-loader "file-jpeg-load-thumb")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-jpeg-load-thumb" 1 + "Loads a thumbnail from a JPEG image" + "Loads a thumbnail from a JPEG image (only if it exists)" + "Mukund Sivaraman , Sven Neumann " + "Mukund Sivaraman , Sven Neumann " + "November 15, 2004" + "" + 0 + (icon icon-name -1 "") + "" + 2 3 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Thumbnail image") + (proc-arg 0 "image-width" "Width of full-sized image") + (proc-arg 0 "image-height" "Height of full-sized image")) + (proc-def "file-jpeg-save" 1 + "saves files in the JPEG file format" + "saves files in the lossy, widely supported JPEG format" + "Spencer Kimball, Peter Mattis & others" + "Spencer Kimball & Peter Mattis" + "1995-2007" + "JPEG image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "jpg,jpeg,jpe") + (mime-types "image/jpeg")) + "RGB*, GRAY*" + 14 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in") + (proc-arg 3 "quality" "Quality of saved image (0 <= quality <= 1)") + (proc-arg 3 "smoothing" "Smoothing factor for saved image (0 <= smoothing <= 1)") + (proc-arg 0 "optimize" "Use optimized tables during Huffman coding (0/1)") + (proc-arg 0 "progressive" "Create progressive JPEG images (0/1)") + (proc-arg 4 "comment" "Image comment") + (proc-arg 0 "subsmp" "Sub-sampling type { 0, 1, 2, 3 } 0 == 4:2:0 (chroma quartered), 1 == 4:2:2 Horizontal (chroma halved), 2 == 4:4:4 (best quality), 3 == 4:2:2 Vertical (chroma halved)") + (proc-arg 0 "baseline" "Force creation of a baseline JPEG (non-baseline JPEGs can't be read by all decoders) (0/1)") + (proc-arg 0 "restart" "Interval of restart markers (in MCU rows, 0 = no restart markers)") + (proc-arg 0 "dct" "DCT method to use { INTEGER (0), FIXED (1), FLOAT (2) }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-jp2-load/file-jp2-load" 1672736559 + (proc-def "file-jp2-load" 1 + "Loads JPEG 2000 images." + "The JPEG 2000 image loader." + "Mukund Sivaraman" + "Mukund Sivaraman" + "2009" + "JPEG 2000 image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "jp2") + (magics "3,string,\fjP") + (mime-types "image/jp2")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-j2k-load" 1 + "Loads JPEG 2000 codestream." + "Loads JPEG 2000 codestream. If the color space is set to UNKNOWN (0), we will try to guess, which is only possible for few spaces (such as grayscale). Most such calls will fail. You are rather expected to know the color space of your data." + "Jehan" + "Jehan" + "2009" + "JPEG 2000 codestream" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "j2k,j2c,jpc") + (magics "0,string,ÿOÿQ") + (mime-types "image/x-jp2-codestream")) + "" + 4 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "colorspace" "Color space { UNKNOWN (0), GRAYSCALE (1), RGB (2), CMYK (3), YCbCr (4), xvYCC (5) }") + (proc-arg 13 "image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-ico/file-ico" 1672736559 + (proc-def "file-ico-load" 1 + "Loads files of Windows ICO file format" + "Loads files of Windows ICO file format" + "Christian Kreibich " + "Christian Kreibich " + "2002" + "Microsoft Windows icon" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "ico") + (magics "0,string,\\000\\001\\000\\000,0,string,\\000\\002\\000\\000") + (mime-types "image/x-ico") + (thumb-loader "file-ico-load-thumb")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-ico-load-thumb" 1 + "Loads a preview from an Windows ICO file" + "" + "Dom Lachowicz, Sven Neumann" + "Sven Neumann " + "2005" + "" + 0 + (icon icon-name -1 "") + "" + 2 3 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Thumbnail image") + (proc-arg 0 "image-width" "Width of full-sized image") + (proc-arg 0 "image-height" "Height of full-sized image")) + (proc-def "file-ico-save" 1 + "Saves files in Windows ICO file format" + "Saves files in Windows ICO file format" + "Christian Kreibich " + "Christian Kreibich " + "2002" + "Microsoft Windows icon" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "ico") + (mime-types "image/x-ico")) + "*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-html-table/file-html-table" 1672736559 + (proc-def "file-gtm-save" 1 + "GIMP Table Magic" + "Allows you to draw an HTML table in GIMP. See help for more info." + "Daniel Dunbar" + "Daniel Dunbar" + "1998" + "HTML table" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "html,htm") + (mime-types "text/html") + (handles-uri)) + "RGB*, GRAY*, INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-heif/file-heif" 1672736559 + (has-init)) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-header/file-header" 1672736559 + (proc-def "file-header-save" 1 + "saves files as C unsigned character array" + "FIXME: write help" + "Spencer Kimball & Peter Mattis" + "Spencer Kimball & Peter Mattis" + "1997" + "C source code header" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "h") + (mime-types "text/x-chdr") + (handles-uri)) + "INDEXED, RGB" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-glob/file-glob" 1672736559 + (proc-def "file-glob" 1 + "Returns a list of matching filenames" + "This can be useful in scripts and other plug-ins (e.g., batch-conversion). See the glob(7) manpage for more info. Note however that this isn't a full-featured glob implementation. It only handles simple patterns like \"/home/foo/bar/*.jpg\"." + "Sven Neumann" + "Sven Neumann" + "2004" + "" + 0 + (icon icon-name -1 "") + "" + 2 2 + (proc-arg 4 "pattern" "The glob pattern (in UTF-8 encoding)") + (proc-arg 0 "encoding" "Encoding of the returned names: { UTF-8 (0), filename encoding (1) }") + (proc-arg 0 "num-files" "The number of returned names") + (proc-arg 9 "files" "The list of matching names"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-gih/file-gih" 1672736559 + (proc-def "file-gih-save" 1 + "exports images in GIMP brush pipe format" + "This plug-in exports an image in the GIMP brush pipe format. For a colored brush pipe, RGBA layers are used, otherwise the layers should be grayscale masks. The image can be multi-layered, and additionally the layers can be divided into a rectangular array of brushes." + "Tor Lillqvist" + "Tor Lillqvist" + "1999" + "GIMP brush (animated)" + 0 + (icon icon-name -1 "gimp-tool-paintbrush") + (save-proc + (extensions "gih") + (mime-types "image/x-gimp-gih") + (handles-uri)) + "RGB*, GRAY*" + 15 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "uri" "The URI of the file to export the brush pipe in") + (proc-arg 4 "raw-uri" "The URI of the file to export the brush pipe in") + (proc-arg 0 "spacing" "Spacing of the brush") + (proc-arg 4 "description" "Short description of the brush pipe") + (proc-arg 0 "cell-width" "Width of the brush cells") + (proc-arg 0 "cell-height" "Width of the brush cells") + (proc-arg 2 "display-cols" "Display column number") + (proc-arg 2 "display-rows" "Display row number") + (proc-arg 0 "dimension" "Dimension of the brush pipe") + (proc-arg 7 "rank" "Ranks of the dimensions") + (proc-arg 0 "dimension" "Dimension (again)") + (proc-arg 9 "sel" "Selection modes"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-gif-save/file-gif-save" 1672736559 + (proc-def "file-gif-save" 1 + "exports files in Compuserve GIF file format" + "Export a file in Compuserve GIF format, with possible animation, transparency, and comment. To export an animation, operate on a multi-layer file. The plug-in will interpret <50% alpha as transparent. When run non-interactively, the value for the comment is taken from the 'gimp-comment' parasite. " + "Spencer Kimball, Peter Mattis, Adam Moss, David Koblas" + "Spencer Kimball, Peter Mattis, Adam Moss, David Koblas" + "1995-1997" + "GIF image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "gif") + (mime-types "image/gif") + (handles-uri)) + "INDEXED*, GRAY*" + 9 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Image to export") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "uri" "The name of the URI to export the image in") + (proc-arg 4 "raw-uri" "The name of the URI to export the image in") + (proc-arg 0 "interlace" "Try to export as interlaced") + (proc-arg 0 "loop" "(animated gif) loop infinitely") + (proc-arg 0 "default-delay" "(animated gif) Default delay between frames in milliseconds") + (proc-arg 0 "default-dispose" "(animated gif) Default disposal type (0=`don't care`, 1=combine, 2=replace)")) + (proc-def "file-gif-save2" 1 + "exports files in Compuserve GIF file format" + "Export a file in Compuserve GIF format, with possible animation, transparency, and comment. To export an animation, operate on a multi-layer file and give the 'as-animation' parameter as TRUE. The plug-in will interpret <50% alpha as transparent. When run non-interactively, the value for the comment is taken from the 'gimp-comment' parasite. " + "Spencer Kimball, Peter Mattis, Adam Moss, David Koblas" + "Spencer Kimball, Peter Mattis, Adam Moss, David Koblas" + "1995-1997" + "GIF image" + 0 + (icon icon-name -1 "") + "INDEXED*, GRAY*" + 12 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Image to export") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "uri" "The name of the URI to export the image in") + (proc-arg 4 "raw-uri" "The name of the URI to export the image in") + (proc-arg 0 "interlace" "Try to export as interlaced") + (proc-arg 0 "loop" "(animated gif) loop infinitely") + (proc-arg 0 "default-delay" "(animated gif) Default delay between frames in milliseconds") + (proc-arg 0 "default-dispose" "(animated gif) Default disposal type (0=`don't care`, 1=combine, 2=replace)") + (proc-arg 0 "as-animation" "Export GIF as animation?") + (proc-arg 0 "force-delay" "(animated gif) Use specified delay for all frames?") + (proc-arg 0 "force-dispose" "(animated gif) Use specified disposal for all frames?"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-gif-load/file-gif-load" 1672736559 + (proc-def "file-gif-load" 1 + "Loads files of Compuserve GIF file format" + "FIXME: write help for gif_load" + "Spencer Kimball, Peter Mattis, Adam Moss, David Koblas" + "Spencer Kimball, Peter Mattis, Adam Moss, David Koblas" + "1995-2006" + "GIF image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "gif") + (magics "0,string,GIF8") + (mime-types "image/gif") + (thumb-loader "file-gif-load-thumb")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-gif-load-thumb" 1 + "Loads only the first frame of a GIF image, to be used as a thumbnail" + "" + "Sven Neumann" + "Sven Neumann" + "2006" + "" + 0 + (icon icon-name -1 "") + "" + 2 3 + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 0 "thumb-size" "Preferred thumbnail size") + (proc-arg 13 "image" "Output image") + (proc-arg 0 "image-width" "Width of full-sized image") + (proc-arg 0 "image-height" "Height of full-sized image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-gegl/file-gegl" 1672736559 + (proc-def "file-load-rgbe" 1 + "Load files in the RGBE file format" + "This procedure loads images in the RGBE format, using gegl:rgbe-load" + "Simon Budig" + "Simon Budig" + "2012" + "Radiance RGBE" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "hdr") + (magics "0,string,#?") + (mime-types "image/vnd.radiance")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load.") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-save-rgbe" 1 + "Saves files in the RGBE file format" + "This procedure exports images in the RGBE format, using gegl:rgbe-save" + "Simon Budig" + "Simon Budig" + "2012" + "Radiance RGBE" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "hdr") + (mime-types "image/vnd.radiance")) + "*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in")) + (proc-def "file-exr-save" 1 + "Saves files in the OpenEXR file format" + "This procedure saves images in the OpenEXR format, using gegl:exr-save" + "Simon Budig" + "Simon Budig" + "2012" + "OpenEXR image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "exr") + (mime-types "image/x-exr")) + "*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-gbr/file-gbr" 1672736559 + (proc-def "file-gbr-save" 1 + "Exports files in the GIMP brush file format" + "Exports files in the GIMP brush file format" + "Tim Newsome, Jens Lautenbacher, Sven Neumann" + "Tim Newsome, Jens Lautenbacher, Sven Neumann" + "1997-2000" + "GIMP brush" + 0 + (icon icon-name -1 "gimp-tool-paintbrush") + (save-proc + (extensions "gbr") + (mime-types "image/x-gimp-gbr") + (handles-uri)) + "RGB*, GRAY*, INDEXED*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "uri" "The URI of the file to export the image in") + (proc-arg 4 "raw-uri" "The URI of the file to export the image in") + (proc-arg 0 "spacing" "Spacing of the brush") + (proc-arg 4 "description" "Short description of the brush"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-fli/file-fli" 1672736559 + (proc-def "file-fli-load" 1 + "load FLI-movies" + "This is an experimantal plug-in to handle FLI movies" + "Jens Ch. Restemeier" + "Jens Ch. Restemeier" + "1997" + "AutoDesk FLIC animation" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "fli,flc") + (mime-types "image/x-flic")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-fli-save" 1 + "export FLI-movies" + "This is an experimantal plug-in to handle FLI movies" + "Jens Ch. Restemeier" + "Jens Ch. Restemeier" + "1997" + "AutoDesk FLIC animation" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "fli,flc") + (mime-types "image/x-flic")) + "INDEXED,GRAY" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (unused)") + (proc-arg 4 "filename" "The name of the file to export") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "from-frame" "Export beginning from this frame") + (proc-arg 0 "to-frame" "End exporting with this frame")) + (proc-def "file-fli-info" 1 + "Get information about a Fli movie" + "This is a experimantal plug-in to handle FLI movies" + "Jens Ch. Restemeier" + "Jens Ch. Restemeier" + "1997" + "" + 0 + (icon icon-name -1 "") + "" + 1 3 + (proc-arg 4 "filename" "The name of the file to get info") + (proc-arg 0 "width" "Width of one frame") + (proc-arg 0 "height" "Height of one frame") + (proc-arg 0 "frames" "Number of Frames"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-fits/file-fits" 1672736559 + (proc-def "file-fits-load" 1 + "load file of the FITS file format" + "load file of the FITS file format (Flexible Image Transport System)" + "Peter Kirchgessner" + "Peter Kirchgessner (peter@kirchgessner.net)" + "1997" + "Flexible Image Transport System" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "fit,fits") + (magics "0,string,SIMPLE") + (mime-types "image/x-fits")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-fits-save" 1 + "export file in the FITS file format" + "FITS exporting handles all image types except those with alpha channels." + "Peter Kirchgessner" + "Peter Kirchgessner (peter@kirchgessner.net)" + "1997" + "Flexible Image Transport System" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "fit,fits") + (mime-types "image/x-fits")) + "RGB, GRAY, INDEXED" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "The name of the file to export the image in") + (proc-arg 4 "raw-filename" "The name of the file to export the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-faxg3/file-faxg3" 1672736559 + (proc-def "file-faxg3-load" 1 + "loads g3 fax files" + "This plug-in loads Fax G3 Image files." + "Jochen Friedrich" + "Jochen Friedrich, Gert Doering, Spencer Kimball & Peter Mattis" + "0.6" + "G3 fax image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "g3") + (magics "4,string,Research") + (mime-types "image/g3-fax")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-exr/file-exr" 1672736559 + (proc-def "file-exr-load" 1 + "Loads files in the OpenEXR file format" + "This plug-in loads OpenEXR files. " + "Dominik Ernst , Mukund Sivaraman " + "Dominik Ernst , Mukund Sivaraman " + "0.0.0" + "OpenEXR image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "exr") + (magics "0,long,0x762f3101") + (mime-types "image/x-exr")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-dicom/file-dicom" 1672736559 + (proc-def "file-dicom-load" 1 + "loads files of the dicom file format" + "Load a file in the DICOM standard format.The standard is defined at http://medical.nema.org/. The plug-in currently only supports reading images with uncompressed pixel sections." + "Dov Grobgeld" + "Dov Grobgeld " + "2003" + "DICOM image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "dcm,dicom") + (magics "128,string,DICM") + (mime-types "image/x-dcm")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name of the file to load") + (proc-arg 13 "image" "Output image")) + (proc-def "file-dicom-save" 1 + "Save file in the DICOM file format" + "Save an image in the medical standard DICOM image formats. The standard is defined at http://medical.nema.org/. The file format is defined in section 10 of the standard. The files are saved uncompressed and the compulsory DICOM tags are filled with default dummy values." + "Dov Grobgeld" + "Dov Grobgeld " + "2003" + "Digital Imaging and Communications in Medicine image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "dcm,dicom") + (mime-types "image/x-dcm")) + "RGB, GRAY" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save") + (proc-arg 4 "raw-filename" "The name of the file to save"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-desktop-link/file-desktop-link" 1672736559 + (proc-def "file-desktop-link-load" 1 + "Follows a link to an image in a .desktop file" + "Opens a .desktop file and if it is a link, it asks GIMP to open the file the link points to." + "Sven Neumann" + "Sven Neumann" + "2006" + "Desktop Link" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "desktop")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-dds/file-dds" 1672736559 + (proc-def "file-dds-load" 1 + "Loads files in DDS image format" + "Loads files in DDS image format" + "Shawn Kirst" + "Shawn Kirst" + "2008" + "DDS image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "dds") + (magics "0,string,DDS") + (mime-types "image/dds")) + "" + 5 1 + (proc-arg 0 "run-mode" "Interactive, non-interactive") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "load-mipmaps" "Load mipmaps if present") + (proc-arg 0 "decode-images" "Decode YCoCg/AExp images when detected") + (proc-arg 13 "image" "Output image")) + (proc-def "file-dds-save" 1 + "Saves files in DDS image format" + "Saves files in DDS image format" + "Shawn Kirst" + "Shawn Kirst" + "2008" + "DDS image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "dds") + (mime-types "image/dds")) + "INDEXED, GRAY, RGB" + 18 0 + (proc-arg 0 "run-mode" "Interactive, non-interactive") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image as") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "compression-format" "Compression format (0 = None, 1 = BC1/DXT1, 2 = BC2/DXT3, 3 = BC3/DXT5, 4 = BC3n/DXT5nm, 5 = BC4/ATI1N, 6 = BC5/ATI2N, 7 = RXGB (DXT5), 8 = Alpha Exponent (DXT5), 9 = YCoCg (DXT5), 10 = YCoCg scaled (DXT5))") + (proc-arg 0 "mipmaps" "How to handle mipmaps (0 = No mipmaps, 1 = Generate mipmaps, 2 = Use existing mipmaps (layers)") + (proc-arg 0 "savetype" "How to save the image (0 = selected layer, 1 = cube map, 2 = volume map, 3 = texture array, 4 = all visible layers") + (proc-arg 0 "format" "Custom pixel format (0 = default, 1 = R5G6B5, 2 = RGBA4, 3 = RGB5A1, 4 = RGB10A2)") + (proc-arg 0 "transparent-index" "Index of transparent color or -1 to disable (for indexed images only).") + (proc-arg 0 "mipmap-filter" "Filtering to use when generating mipmaps (0 = default, 1 = nearest, 2 = box, 3 = triangle, 4 = quadratic, 5 = bspline, 6 = mitchell, 7 = lanczos, 8 = kaiser)") + (proc-arg 0 "mipmap-wrap" "Wrap mode to use when generating mipmaps (0 = default, 1 = mirror, 2 = repeat, 3 = clamp)") + (proc-arg 0 "gamma-correct" "Use gamma correct mipmap filtering") + (proc-arg 0 "srgb" "Use sRGB colorspace for gamma correction") + (proc-arg 3 "gamma" "Gamma value to use for gamma correction (i.e. 2.2)") + (proc-arg 0 "perceptual-metric" "Use a perceptual error metric during compression") + (proc-arg 0 "preserve-alpha-coverage" "Preserve alpha test converage for alpha channel maps") + (proc-arg 3 "alpha-test-threshold" "Alpha test threshold value for which alpha test converage should be preserved")) + (proc-def "file-dds-save2" 1 + "Saves files in DDS image format with additional export options" + "Saves files in DDS image format with additional export options" + "Shawn Kirst" + "Shawn Kirst" + "2008" + "DDS image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "dds") + (mime-types "image/dds")) + "INDEXED, GRAY, RGB" + 19 0 + (proc-arg 0 "run-mode" "Interactive, non-interactive") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image as") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "compression-format" "Compression format (0 = None, 1 = BC1/DXT1, 2 = BC2/DXT3, 3 = BC3/DXT5, 4 = BC3n/DXT5nm, 5 = BC4/ATI1N, 6 = BC5/ATI2N, 7 = RXGB (DXT5), 8 = Alpha Exponent (DXT5), 9 = YCoCg (DXT5), 10 = YCoCg scaled (DXT5))") + (proc-arg 0 "mipmaps" "How to handle mipmaps (0 = No mipmaps, 1 = Generate mipmaps, 2 = Use existing mipmaps (layers)") + (proc-arg 0 "savetype" "How to save the image (0 = selected layer, 1 = cube map, 2 = volume map, 3 = texture array, 4 = all visible layers") + (proc-arg 0 "format" "Custom pixel format (0 = default, 1 = R5G6B5, 2 = RGBA4, 3 = RGB5A1, 4 = RGB10A2)") + (proc-arg 0 "transparent-index" "Index of transparent color or -1 to disable (for indexed images only).") + (proc-arg 0 "mipmap-filter" "Filtering to use when generating mipmaps (0 = default, 1 = nearest, 2 = box, 3 = triangle, 4 = quadratic, 5 = bspline, 6 = mitchell, 7 = lanczos, 8 = kaiser)") + (proc-arg 0 "mipmap-wrap" "Wrap mode to use when generating mipmaps (0 = default, 1 = mirror, 2 = repeat, 3 = clamp)") + (proc-arg 0 "gamma-correct" "Use gamma correct mipmap filtering") + (proc-arg 0 "srgb" "Use sRGB colorspace for gamma correction") + (proc-arg 3 "gamma" "Gamma value to use for gamma correction (i.e. 2.2)") + (proc-arg 0 "perceptual-metric" "Use a perceptual error metric during compression") + (proc-arg 0 "preserve-alpha-coverage" "Preserve alpha test converage for alpha channel maps") + (proc-arg 3 "alpha-test-threshold" "Alpha test threshold value for which alpha test converage should be preserved") + (proc-arg 0 "flip-image" "Flip image vertically on export"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-csource/file-csource" 1672736559 + (proc-def "file-csource-save" 1 + "Dump image data in RGB(A) format for C source" + "CSource cannot be run non-interactively." + "Tim Janik" + "Tim Janik" + "1999" + "C source code" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "c") + (mime-types "text/x-csrc") + (handles-uri)) + "*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name of the file to save the image in"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-compressor/file-compressor" 1672736559 + (proc-def "file-gz-load" 1 + "loads files compressed with gzip" + "This procedure loads files in the gzip compressed format." + "Daniel Risacher" + "Daniel Risacher, Spencer Kimball and Peter Mattis" + "1995-1997" + "gzip archive" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "xcf.gz,xcfgz") + (magics "0,string,\037‹") + (mime-types "application/x-gzip")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-gz-save" 1 + "saves files compressed with gzip" + "This procedure saves files in the gzip compressed format." + "Daniel Risacher" + "Daniel Risacher, Spencer Kimball and Peter Mattis" + "1995-1997" + "gzip archive" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "xcf.gz,xcfgz") + (mime-types "application/x-gzip")) + "RGB*, GRAY*, INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered")) + (proc-def "file-bz2-load" 1 + "loads files compressed with bzip2" + "This procedure loads files in the bzip2 compressed format." + "Daniel Risacher" + "Daniel Risacher, Spencer Kimball and Peter Mattis" + "1995-1997" + "bzip archive" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "xcf.bz2,xcfbz2") + (magics "0,string,BZh") + (mime-types "application/x-bzip")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-bz2-save" 1 + "saves files compressed with bzip2" + "This procedure saves files in the bzip2 compressed format." + "Daniel Risacher" + "Daniel Risacher, Spencer Kimball and Peter Mattis" + "1995-1997" + "bzip archive" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "xcf.bz2,xcfbz2") + (mime-types "application/x-bzip")) + "RGB*, GRAY*, INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered")) + (proc-def "file-xz-load" 1 + "loads files compressed with xz" + "This procedure loads files in the xz compressed format." + "Daniel Risacher" + "Daniel Risacher, Spencer Kimball and Peter Mattis" + "1995-1997" + "xz archive" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "xcf.xz,xcfxz") + (magics "0,string,ý7zXZ") + (mime-types "application/x-xz")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-xz-save" 1 + "saves files compressed with xz" + "This procedure saves files in the xz compressed format." + "Daniel Risacher" + "Daniel Risacher, Spencer Kimball and Peter Mattis" + "1995-1997" + "xz archive" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "xcf.xz,xcfxz") + (mime-types "application/x-xz")) + "RGB*, GRAY*, INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-cel/file-cel" 1672736559 + (proc-def "file-cel-load" 1 + "Loads files in KISS CEL file format" + "This plug-in loads individual KISS cell files." + "Nick Lamb" + "Nick Lamb " + "May 1998" + "KISS CEL" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "cel") + (magics "0,string,KiSS\\040")) + "" + 4 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "Filename to load image from") + (proc-arg 4 "raw-filename" "Name entered") + (proc-arg 4 "palette-filename" "Filename to load palette from") + (proc-arg 13 "image" "Output image")) + (proc-def "file-cel-save" 1 + "Exports files in KISS CEL file format" + "This plug-in exports individual KISS cell files." + "Nick Lamb" + "Nick Lamb " + "May 1998" + "KISS CEL" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "cel") + (handles-uri)) + "RGB*, INDEXED*" + 6 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to export") + (proc-arg 4 "filename" "Filename to export image to") + (proc-arg 4 "raw-filename" "Name entered") + (proc-arg 4 "palette-filename" "Filename to save palette to"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/file-bmp/file-bmp" 1672736559 + (proc-def "file-bmp-load" 1 + "Loads files of Windows BMP file format" + "Loads files of Windows BMP file format" + "Alexander Schulz" + "Alexander Schulz" + "1997" + "Windows BMP image" + 0 + (icon icon-name -1 "") + (load-proc + (extensions "bmp") + (magics "0,string,BM") + (mime-types "image/bmp")) + "" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 4 "filename" "The name of the file to load") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 13 "image" "Output image")) + (proc-def "file-bmp-save" 1 + "Saves files in Windows BMP file format" + "Saves files in Windows BMP file format" + "Alexander Schulz" + "Alexander Schulz" + "1997" + "Windows BMP image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "bmp") + (mime-types "image/bmp")) + "INDEXED, GRAY, RGB*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered")) + (proc-def "file-bmp-save2" 1 + "Saves files in Windows BMP file format" + "Saves files in Windows BMP file format, with RLE, color space information, and RGB format options available non-interactively" + "Alexander Schulz" + "Alexander Schulz" + "1997" + "Windows BMP image" + 0 + (icon icon-name -1 "") + (save-proc + (extensions "bmp") + (mime-types "image/bmp")) + "INDEXED, GRAY, RGB*" + 8 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Drawable to save") + (proc-arg 4 "filename" "The name of the file to save the image in") + (proc-arg 4 "raw-filename" "The name entered") + (proc-arg 0 "use-rle" "Use run-length-encoding compression (only valid for 4 and 8-bit indexed images)") + (proc-arg 0 "write-color-space" "Whether or not to write BITMAPV5HEADER color space data") + (proc-arg 0 "rgb-format" "Export format for RGB images (0=RGB_565, 1=RGBA_5551, 2=RGB_555, 3=RGB_888, 4=RGBA_8888, 5=RGBX_8888)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/emboss/emboss" 1672736559 + (proc-def "plug-in-emboss" 1 + "Simulate an image created by embossing" + "Emboss or Bumpmap the given drawable, specifying the angle and elevation for the light source." + "Eric L. Hernes, John Schlag" + "Eric L. Hernes" + "1997" + "_Emboss (legacy)..." + 1 + (menu-path "/Filters/Distorts") + (icon icon-name -1 "") + "RGB*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "The Image") + (proc-arg 16 "drawable" "The Drawable") + (proc-arg 3 "azimuth" "The Light Angle (degrees)") + (proc-arg 3 "elevation" "The Elevation Angle (degrees)") + (proc-arg 0 "depth" "The Filter Width") + (proc-arg 0 "emboss" "Emboss or Bumpmap"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/edge-dog/edge-dog" 1672736559 + (proc-def "plug-in-dog" 1 + "Edge detection with control of edge thickness" + "Applies two Gaussian blurs to the drawable, and subtracts the results. This is robust and widely used method for detecting edges." + "Spencer Kimball, Peter Mattis, Sven Neumann, William Skaggs" + "Spencer Kimball, Peter Mattis, Sven Neumann, William Skaggs" + "1995-2004" + "_Difference of Gaussians (legacy)..." + 1 + (menu-path "/Filters/Edge-Detect") + (icon icon-name -1 "") + "RGB*, GRAY*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 3 "inner" "Radius of inner gaussian blur (in pixels, > 0.0)") + (proc-arg 3 "outer" "Radius of outer gaussian blur (in pixels, > 0.0)") + (proc-arg 0 "normalize" "Normalize { TRUE, FALSE }") + (proc-arg 0 "invert" "Invert { TRUE, FALSE }"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/destripe/destripe" 1672736559 + (proc-def "plug-in-destripe" 1 + "Remove vertical stripe artifacts from the image" + "This plug-in tries to remove vertical stripes from an image." + "Marc Lehmann " + "Marc Lehmann " + "0.2" + "Des_tripe..." + 1 + (menu-path "/Filters/Enhance") + (icon icon-name -1 "") + "RGB*, GRAY*" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "avg-width" "Averaging filter width (default = 36)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/despeckle/despeckle" 1672736559 + (proc-def "plug-in-despeckle" 1 + "Remove speckle noise from the image" + "This plug-in selectively performs a median or adaptive box filter on an image." + "Michael Sweet " + "Copyright 1997-1998 by Michael Sweet" + "May 2010" + "Des_peckle..." + 1 + (menu-path "/Filters/Enhance") + (icon icon-name -1 "") + "RGB*, GRAY*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "radius" "Filter box radius (default = 3)") + (proc-arg 0 "type" "Filter type { MEDIAN (0), ADAPTIVE (1), RECURSIVE-MEDIAN (2), RECURSIVE-ADAPTIVE (3) }") + (proc-arg 0 "black" "Black level (-1 to 255)") + (proc-arg 0 "white" "White level (0 to 256)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/depth-merge/depth-merge" 1672736559 + (proc-def "plug-in-depth-merge" 1 + "Combine two images using depth maps (z-buffers)" + "Taking as input two full-color, full-alpha images and two corresponding grayscale depth maps, this plug-in combines the images based on which is closer (has a lower depth map value) at each point." + "Sean Cier" + "Sean Cier" + "August 1998" + "_Depth Merge..." + 1 + (menu-path "/Filters/Combine") + (icon icon-name -1 "") + "RGB*, GRAY*" + 11 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "result" "Result") + (proc-arg 16 "source1" "Source 1") + (proc-arg 16 "source2" "Source 2") + (proc-arg 16 "depthMap1" "Depth map 1") + (proc-arg 16 "depthMap2" "Depth map 2") + (proc-arg 3 "overlap" "Overlap") + (proc-arg 3 "offset" "Depth relative offset") + (proc-arg 3 "scale1" "Depth relative scale 1") + (proc-arg 3 "scale2" "Depth relative scale 2"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/decompose/decompose" 1672736559 + (proc-def "plug-in-decompose" 1 + "Decompose an image into separate colorspace components" + "This function creates new gray images with different channel information in each of them" + "Peter Kirchgessner" + "Peter Kirchgessner" + "1997" + "_Decompose..." + 0 + (icon icon-name -1 "") + "RGB*" + 5 4 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 4 "decompose-type" "What to decompose: \"RGB\", \"RGBA\", \"Red\", \"Green\", \"Blue\", \"Alpha\", \"HSV\", \"Hue\", \"Saturation\", \"Value\", \"HSL\", \"Hue (HSL)\", \"Saturation (HSL)\", \"Lightness\", \"CMYK\", \"Cyan\", \"Magenta\", \"Yellow\", \"Black\", \"LAB\", \"LCH\", \"YCbCr_ITU_R470\", \"YCbCr_ITU_R470_256\", \"YCbCr_ITU_R709\", \"YCbCr_ITU_R709_256\"") + (proc-arg 0 "layers-mode" "Create channels as layers in a single image") + (proc-arg 13 "new-image" "Output gray image") + (proc-arg 13 "new-image" "Output gray image (N/A for single channel extract)") + (proc-arg 13 "new-image" "Output gray image (N/A for single channel extract)") + (proc-arg 13 "new-image" "Output gray image (N/A for single channel extract)")) + (proc-def "plug-in-decompose-registered" 1 + "Decompose an image into separate colorspace components" + "This function creates new gray images with different channel information in each of them. Pixels in the foreground color will appear black in all output images. This can be used for things like crop marks that have to show up on all channels." + "Peter Kirchgessner" + "Peter Kirchgessner, Clarence Risher" + "1997" + "_Decompose..." + 1 + (menu-path "/Colors/Components") + (icon icon-name -1 "") + "RGB*" + 5 4 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 4 "decompose-type" "What to decompose: \"RGB\", \"RGBA\", \"Red\", \"Green\", \"Blue\", \"Alpha\", \"HSV\", \"Hue\", \"Saturation\", \"Value\", \"HSL\", \"Hue (HSL)\", \"Saturation (HSL)\", \"Lightness\", \"CMYK\", \"Cyan\", \"Magenta\", \"Yellow\", \"Black\", \"LAB\", \"LCH\", \"YCbCr_ITU_R470\", \"YCbCr_ITU_R470_256\", \"YCbCr_ITU_R709\", \"YCbCr_ITU_R709_256\"") + (proc-arg 0 "layers-mode" "Create channels as layers in a single image") + (proc-arg 13 "new-image" "Output gray image") + (proc-arg 13 "new-image" "Output gray image (N/A for single channel extract)") + (proc-arg 13 "new-image" "Output gray image (N/A for single channel extract)") + (proc-arg 13 "new-image" "Output gray image (N/A for single channel extract)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/curve-bend/curve-bend" 1672736559 + (proc-def "plug-in-curve-bend" 1 + "Bend the image using two control curves" + "This plug-in does bend the active layer If there is a current selection it is copied to floating selection and the curve_bend distortion is done on the floating selection. If work_on_copy parameter is TRUE, the curve_bend distortion is done on a copy of the active layer (or floating selection). The upper and lower edges are bent in shape of 2 spline curves. both (upper and lower) curves are determined by upto 17 points or by 256 Y-Values if curve_type == 1 (freehand mode) If rotation is not 0, the layer is rotated before and rotated back after the bend operation. This enables bending in other directions than vertical. bending usually changes the size of the handled layer. this plug-in sets the offsets of the handled layer to keep its center at the same position" + "Wolfgang Hofer (hof@hotbot.com)" + "Wolfgang Hofer" + "v1.3.18 (2003/08/26)" + "_Curve Bend..." + 1 + (menu-path "/Filters/Distorts") + (icon icon-name -1 "") + "RGB*, GRAY*" + 20 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable (must be a layer without layermask)") + (proc-arg 3 "rotation" "Direction {angle 0 to 360 degree } of the bend effect") + (proc-arg 0 "smoothing" "Smoothing { TRUE, FALSE }") + (proc-arg 0 "antialias" "Antialias { TRUE, FALSE }") + (proc-arg 0 "work-on-copy" "{ TRUE, FALSE } TRUE: copy the drawable and bend the copy") + (proc-arg 0 "curve-type" " { 0, 1 } 0 == smooth (use 17 points), 1 == freehand (use 256 val_y) ") + (proc-arg 0 "argc-upper-point-x" "{2 <= argc <= 17} ") + (proc-arg 8 "upper-point-x" "array of 17 x point_koords { 0.0 <= x <= 1.0 or -1 for unused point }") + (proc-arg 0 "argc-upper-point-y" "{2 <= argc <= 17} ") + (proc-arg 8 "upper-point-y" "array of 17 y point_koords { 0.0 <= y <= 1.0 or -1 for unused point }") + (proc-arg 0 "argc-lower-point-x" "{2 <= argc <= 17} ") + (proc-arg 8 "lower-point-x" "array of 17 x point_koords { 0.0 <= x <= 1.0 or -1 for unused point }") + (proc-arg 0 "argc-lower-point-y" "{2 <= argc <= 17} ") + (proc-arg 8 "lower-point-y" "array of 17 y point_koords { 0.0 <= y <= 1.0 or -1 for unused point }") + (proc-arg 0 "argc-upper-val-y" "{ 256 } ") + (proc-arg 7 "upper-val-y" "array of 256 y freehand koord { 0 <= y <= 255 }") + (proc-arg 0 "argc-lower-val-y" "{ 256 } ") + (proc-arg 7 "lower-val-y" "array of 256 y freehand koord { 0 <= y <= 255 }") + (proc-arg 14 "bent-layer" "the handled layer")) + (proc-def "plug_in_curve_bend_Iterator" 1 + "This procedure calculates the modified values for one iterationstep for the call of plug_in_curve_bend" + "" + "Wolfgang Hofer (hof@hotbot.com)" + "Wolfgang Hofer" + "v1.3.18 (2003/08/26)" + "" + 0 + (icon icon-name -1 "") + "" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-NONINTERACTIVE (1) }") + (proc-arg 0 "total-steps" "total number of steps (# of layers-1 to apply the related plug-in)") + (proc-arg 3 "current-step" "current (for linear iterations this is the layerstack position, otherwise some value in between)") + (proc-arg 0 "len-struct" "length of stored data structure with id is equal to the plug_in proc_name"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/crop-zealous/crop-zealous" 1672736559 + (proc-def "plug-in-zealouscrop" 1 + "Autocrop unused space from edges and middle" + "" + "Adam D. Moss" + "Adam D. Moss" + "1997" + "_Zealous Crop" + 1 + (menu-path "/Image/Crop") + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/contrast-retinex/contrast-retinex" 1672736559 + (proc-def "plug-in-retinex" 1 + "Enhance contrast using the Retinex method" + "The Retinex Image Enhancement Algorithm is an automatic image enhancement method that enhances a digital image in terms of dynamic range compression, color independence from the spectral distribution of the scene illuminant, and color/lightness rendition." + "Fabien Pelisson" + "Fabien Pelisson" + "2003" + "Retine_x..." + 1 + (menu-path "/Colors/Tone Mapping") + (icon icon-name -1 "") + "RGB*" + 7 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "scale" "Biggest scale value") + (proc-arg 0 "nscales" "Number of scales") + (proc-arg 0 "scales-mode" "Retinex distribution through scales") + (proc-arg 3 "cvar" "Variance value"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/compose/compose" 1672736559 + (proc-def "plug-in-compose" 1 + "Create an image using multiple gray images as color channels" + "This function creates a new image from multiple gray images" + "Peter Kirchgessner" + "Peter Kirchgessner (peter@kirchgessner.net)" + "1997" + "C_ompose..." + 1 + (menu-path "/Colors/Components") + (icon icon-name -1 "") + "GRAY*" + 7 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image1" "First input image") + (proc-arg 16 "drawable" "Input drawable (not used)") + (proc-arg 13 "image2" "Second input image") + (proc-arg 13 "image3" "Third input image") + (proc-arg 13 "image4" "Fourth input image") + (proc-arg 4 "compose-type" "What to compose: \"RGB\", \"RGBA\", \"HSV\", \"HSL\", \"CMYK\", \"LAB\", \"LCH\", \"YCbCr_ITU_R470\", \"YCbCr_ITU_R709\", \"YCbCr_ITU_R470_256\", \"YCbCr_ITU_R709_256\"") + (proc-arg 13 "new-image" "Output image")) + (proc-def "plug-in-drawable-compose" 1 + "Compose an image from multiple drawables of gray images" + "This function creates a new image from multiple drawables of gray images" + "Peter Kirchgessner" + "Peter Kirchgessner (peter@kirchgessner.net)" + "1998" + "" + 0 + (icon icon-name -1 "") + "GRAY*" + 7 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image1" "First input image (not used)") + (proc-arg 16 "drawable1" "First input drawable") + (proc-arg 16 "drawable2" "Second input drawable") + (proc-arg 16 "drawable3" "Third input drawable") + (proc-arg 16 "drawable4" "Fourth input drawable") + (proc-arg 4 "compose-type" "What to compose: \"RGB\", \"RGBA\", \"HSV\", \"HSL\", \"CMYK\", \"LAB\", \"LCH\", \"YCbCr_ITU_R470\", \"YCbCr_ITU_R709\", \"YCbCr_ITU_R470_256\", \"YCbCr_ITU_R709_256\"") + (proc-arg 13 "new-image" "Output image")) + (proc-def "plug-in-recompose" 1 + "Recompose an image that was previously decomposed" + "This function recombines the grayscale layers produced by Decompose into a single RGB or RGBA layer, and replaces the originally decomposed layer with the result." + "Bill Skaggs" + "Bill Skaggs" + "2004" + "R_ecompose" + 1 + (menu-path "/Colors/Components") + (icon icon-name -1 "") + "GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Image to recompose from") + (proc-arg 16 "drawable" "Not used"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/colormap-remap/colormap-remap" 1672736559 + (proc-def "plug-in-colormap-remap" 1 + "Rearrange the colormap" + "This procedure takes an indexed image and lets you alter the positions of colors in the colormap without visually changing the image." + "Mukund Sivaraman " + "Mukund Sivaraman " + "June 2006" + "R_earrange Colormap..." + 2 + (menu-path "/Colors/Map/Colormap") + (menu-path "") + (icon icon-name -1 "gimp-colormap") + "INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "num-colors" "Length of 'map' argument (should be equal to colormap size)") + (proc-arg 7 "map" "Remap array for the colormap")) + (proc-def "plug-in-colormap-swap" 1 + "Swap two colors in the colormap" + "This procedure takes an indexed image and lets you swap the positions of two colors in the colormap without visually changing the image." + "Mukund Sivaraman " + "Mukund Sivaraman " + "June 2006" + "_Swap Colors" + 0 + (icon icon-name -1 "") + "INDEXED*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 2 "index1" "First index in the colormap") + (proc-arg 2 "index2" "Second (other) index in the colormap"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/colorify/colorify" 1672736559 + (proc-def "plug-in-colorify" 1 + "Replace all colors with shades of a specified color" + "Makes an average of the RGB channels and uses it to set the color" + "Francisco Bustamante" + "Francisco Bustamante" + "1.1" + "Colorif_y..." + 0 + (icon icon-name -1 "") + "RGB*" + 4 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 10 "color" "Color to apply"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/color-enhance/color-enhance" 1672736559 + (proc-def "plug-in-color-enhance" 1 + "Stretch color saturation to cover maximum possible range" + "This simple plug-in does an automatic saturation stretch. For each channel in the image, it finds the minimum and maximum values... it uses those values to stretch the individual histograms to the full range. For some images it may do just what you want; for others it may not work that well. This version differs from Contrast Autostretch in that it works in HSV space, and preserves hue." + "Martin Weber" + "Martin Weber" + "1997" + "_Color Enhance (legacy)" + 1 + (menu-path "/Colors/Auto") + (icon icon-name -1 "") + "RGB*, INDEXED*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/color-cube-analyze/color-cube-analyze" 1672736559 + (proc-def "plug-in-ccanalyze" 1 + "Analyze the set of colors in the image" + "Analyze colorcube and print some information about the current image (also displays a color-histogram)" + "robert@experimental.net" + "robert@experimental.net" + "June 20th, 1997" + "Colorcube A_nalysis..." + 1 + (menu-path "/Colors/Info") + (icon icon-name -1 "") + "RGB*, GRAY*, INDEXED*" + 3 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "num-colors" "Number of colors in the image"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/cml-explorer/cml-explorer" 1672736559 + (proc-def "plug-in-cml-explorer" 1 + "Create abstract Coupled-Map Lattice patterns" + "Make an image of Coupled-Map Lattice (CML). CML is a kind of Cellula Automata on continuous (value) domain. In GIMP_RUN_NONINTERACTIVE, the name of a parameter file is passed as the 4th arg. You can control CML_explorer via parameter file." + "Shuji Narazaki (narazaki@InetQ.or.jp); http://www.inetq.or.jp/~narazaki/TheGIMP/" + "Shuji Narazaki" + "1997" + "CML _Explorer..." + 1 + (menu-path "/Filters/Render/Pattern") + (icon icon-name -1 "") + "RGB*, GRAY*" + 4 0 + (proc-arg 0 "ru--mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (not used)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 4 "parameter-filename" "The name of parameter file. CML_explorer makes an image with its settings."))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/checkerboard/checkerboard" 1672736559 + (proc-def "plug-in-checkerboard" 1 + "Create a checkerboard pattern" + "More here later" + "Brent Burton & the Edward Blevins" + "Brent Burton & the Edward Blevins" + "1997" + "_Checkerboard (legacy)..." + 1 + (menu-path "/Filters/Render/Pattern") + (icon icon-name -1 "") + "RGB*, GRAY*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "check-mode" "Check mode { REGULAR (0), PSYCHOBILY (1) }") + (proc-arg 0 "check-size" "Size of the checks"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/cartoon/cartoon" 1672736559 + (proc-def "plug-in-cartoon" 1 + "Simulate a cartoon by enhancing edges" + "Propagates dark values in an image based on each pixel's relative darkness to a neighboring average. The idea behind this filter is to give the look of a black felt pen drawing subsequently shaded with color. This is achieved by darkening areas of the image which are measured to be darker than a neighborhood average. In this way, sufficiently large shifts in intensity are darkened to black. The rate at which they are darkened to black is determined by the second pct_black parameter. The mask_radius parameter controls the size of the pixel neighborhood over which the average intensity is computed and then compared to each pixel in the neighborhood to decide whether or not to darken it to black. Large values for mask_radius result in very thick black areas bordering the shaded regions of color and much less detail for black areas everywhere including inside regions of color. Small values result in more subtle pen strokes and detail everywhere. Small values for the pct_black make the blend from the color regions to the black border lines smoother and the lines themselves thinner and less noticeable; larger values achieve the opposite effect." + "Spencer Kimball" + "Bit Specialists, Inc." + "2001" + "Ca_rtoon (legacy)..." + 1 + (menu-path "/Filters/Artistic") + (icon icon-name -1 "") + "RGB*, GRAY*" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 3 "mask-radius" "Cartoon mask radius (radius of pixel neighborhood)") + (proc-arg 3 "pct-black" "Percentage of darkened pixels to set to black (0.0 - 1.0)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/busy-dialog/busy-dialog" 1672736559 + (proc-def "plug-in-busy-dialog" 1 + "Show a dialog while waiting for an operation to finish" + "Used by GIMP to display a dialog, containing a spinner and a custom message, while waiting for an ongoing operation to finish. Optionally, the dialog may provide a \"Cancel\" button, which can be used to cancel the operation." + "Ell" + "Ell" + "2018" + "" + 0 + (icon icon-name -1 "") + "" + 5 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0) }") + (proc-arg 0 "read-fd" "The read file descriptor") + (proc-arg 0 "write-fd" "The write file descriptor") + (proc-arg 4 "message" "The message") + (proc-arg 0 "cancelable" "Whether the dialog is cancelable (TRUE or FALSE)"))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/border-average/border-average" 1672736559 + (proc-def "plug-in-borderaverage" 1 + "Set foreground to the average color of the image border" + "" + "Philipp Klaus" + "Internet Access AG" + "1998" + "_Border Average..." + 1 + (menu-path "/Colors/Info") + (icon icon-name -1 "") + "RGB*" + 5 1 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable") + (proc-arg 0 "thickness" "Border size to take in count") + (proc-arg 0 "bucket-exponent" "Bits for bucket size (default=4: 16 Levels)") + (proc-arg 10 "borderaverage" "The average color of the specified border."))) +(plug-in-def "${gimp_plug_in_dir}/plug-ins/blur/blur" 1672736559 + (proc-def "plug-in-blur" 1 + "Simple blur, fast but not very strong" + "This plug-in blurs the specified drawable, using a 3x3 blur. Indexed images are not supported." + "Miles O'Neal " + "Miles O'Neal, Spencer Kimball, Peter Mattis, Torsten Martinsen, Brian Degenhardt, Federico Mena Quintero, Stephen Norris, Daniel Cotting" + "1995-1998" + "_Blur" + 0 + (icon icon-name -1 "") + "RGB*, GRAY*" + 3 0 + (proc-arg 0 "run-mode" "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }") + (proc-arg 13 "image" "Input image (unused)") + (proc-arg 16 "drawable" "Input drawable"))) + +# end of pluginrc diff --git a/GIMP/2.10/profilerc b/GIMP/2.10/profilerc new file mode 100644 index 0000000..2a75c3e --- /dev/null +++ b/GIMP/2.10/profilerc @@ -0,0 +1,4 @@ +# GIMP color profile history + + +# end of color profile history diff --git a/GIMP/2.10/sessionrc b/GIMP/2.10/sessionrc new file mode 100644 index 0000000..53597b4 --- /dev/null +++ b/GIMP/2.10/sessionrc @@ -0,0 +1,109 @@ +# GIMP sessionrc +# +# This file takes session-specific info (that is info, you want to keep +# between two GIMP sessions). You are not supposed to edit it manually, but +# of course you can do. The sessionrc will be entirely rewritten every time +# you quit GIMP. If this file isn't found, defaults are used. + +(session-info "toplevel" + (factory-entry "gimp-empty-image-window") + (position 200 100) + (size 640 480)) +(session-info "toplevel" + (factory-entry "gimp-single-image-window") + (position 30 31) + (size 2494 1393) + (open-on-exit) + (aux-info + (left-docks-width "207") + (right-docks-width "202") + (maximized "no")) + (gimp-toolbox + (side left) + (book + (current-page 0) + (dockable "gimp-tool-options" + (tab-style automatic) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-device-status" + (tab-style automatic) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-undo-history" + (tab-style automatic) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-image-list" + (tab-style automatic) + (aux-info + (show-button-bar "true"))))) + (gimp-dock + (side right) + (book + (current-page 0) + (dockable "gimp-brush-grid" + (tab-style automatic) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-pattern-grid" + (tab-style automatic) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-font-list" + (tab-style automatic) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-document-list" + (tab-style automatic) + (aux-info + (show-button-bar "true")))) + (book + (position 336) + (current-page 0) + (dockable "gimp-layer-list" + (tab-style automatic) + (preview-size 32) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-channel-list" + (tab-style automatic) + (preview-size 32) + (aux-info + (show-button-bar "true"))) + (dockable "gimp-vectors-list" + (tab-style automatic) + (preview-size 32) + (aux-info + (show-button-bar "true")))))) +(session-info "toplevel" + (factory-entry "gimp-file-open-dialog") + (position 803 361) + (size 948 712)) +(session-info "toplevel" + (factory-entry "gimp-file-export-dialog") + (position 803 361) + (size 948 712)) +(session-info "toplevel" + (factory-entry "gimp-image-new-dialog") + (position 1086 586)) +(session-info "toplevel" + (factory-entry "gimp-toolbox-color-dialog") + (position 1073 534)) +(session-info "toplevel" + (factory-entry "gimp-file-save-dialog") + (position 803 361) + (size 948 712)) +(session-info "toplevel" + (factory-entry "gimp-text-tool-dialog") + (position 798 415) + (size 318 244) + (monitor 0)) + +(hide-docks no) +(single-window-mode yes) +(show-tabs yes) +(tabs-position 0) +(last-tip-shown 0) + +# end of sessionrc diff --git a/GIMP/2.10/tags.xml b/GIMP/2.10/tags.xml new file mode 100644 index 0000000..efe1705 --- /dev/null +++ b/GIMP/2.10/tags.xml @@ -0,0 +1,3921 @@ + + + + + round + + + + fuzzy + round + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIMP/2.10/templaterc b/GIMP/2.10/templaterc new file mode 100644 index 0000000..fe461c9 --- /dev/null +++ b/GIMP/2.10/templaterc @@ -0,0 +1,500 @@ +# GIMP templaterc +# +# This file will be entirely rewritten each time you exit. + +(GimpTemplate "A0 (300 ppi)" + (width 9933) + (height 14043) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "A1 (300 ppi)" + (width 7016) + (height 9933) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "A2 (300 ppi)" + (width 4960) + (height 7016) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "A3 (300 ppi)" + (width 3508) + (height 4960) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "A4 (300 ppi)" + (width 2480) + (height 3508) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "A5 (300 ppi)" + (width 1748) + (height 2480) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "A6 (300 ppi)" + (width 1240) + (height 1748) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "A7 (300 ppi)" + (width 874) + (height 1240) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "B4 (300 ppi)" + (width 2953) + (height 4169) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "B5 (300 ppi)" + (width 2079) + (height 2953) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "B5-Japan (300 ppi)" + (width 2150) + (height 3035) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "US Letter (300 ppi)" + (width 2550) + (height 3300) + (unit inches) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "US Legal (300 ppi)" + (width 2550) + (height 4200) + (unit inches) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "88.9×50.8 US Business Card" + (icon-name "gimp-business-card") + (width 1050) + (height 600) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "85×55 Western Europe Business Card" + (icon-name "gimp-business-card") + (width 1004) + (height 650) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "90×50 Eastern Europe Business Card" + (icon-name "gimp-business-card") + (width 1063) + (height 591) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "90×55 Business Card (AU, IN etc.)" + (icon-name "gimp-business-card") + (width 1063) + (height 650) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "87×49 Vistaprint Business Card" + (icon-name "gimp-business-card") + (width 1028) + (height 579) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Toilet paper (US, 300 ppi)" + (icon-name "gimp-toilet-paper") + (width 1350) + (height 1350) + (unit inches) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "CD cover (300 ppi)" + (icon-name "media-optical") + (width 1429) + (height 1417) + (unit millimeters) + (xresolution 300) + (yresolution 300) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Web banner leaderboard 728x90" + (icon-name "gimp-web") + (width 728) + (height 90) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Web banner large rectangle 336×280" + (icon-name "gimp-web") + (width 336) + (height 280) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Web banner medium rectangle 300×250" + (icon-name "gimp-web") + (width 300) + (height 250) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Web banner large mobile 320×100" + (icon-name "gimp-web") + (width 320) + (height 100) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Web banner large skyscraper 300×600" + (icon-name "gimp-web") + (width 300) + (height 600) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "1280×720 (HD 720p)" + (icon-name "gimp-video") + (width 1280) + (height 720) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "1920×1080 (Full HD 1080p)" + (icon-name "gimp-video") + (width 1920) + (height 1080) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "3840x2160 (4K UHD)" + (icon-name "gimp-video") + (width 3840) + (height 2160) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "4096×2160 (Digital Cinema Initiatives 4K)" + (icon-name "gimp-video") + (width 4096) + (height 2160) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "1366×768 HD" + (icon-name "gimp-display") + (width 1366) + (height 768) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "1920×1200 WUXGA" + (icon-name "gimp-display") + (width 1920) + (height 1200) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "2560x1600 WQXGA" + (icon-name "gimp-display") + (width 2560) + (height 1600) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "3840×2160 4K UHD" + (icon-name "gimp-display") + (width 3840) + (height 2160) + (unit pixels) + (xresolution 72) + (yresolution 72) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Apple iPhone 6/7" + (icon-name "gimp-smartphone") + (width 750) + (height 1334) + (unit millimeters) + (xresolution 326) + (yresolution 326) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Apple iPhone 5" + (icon-name "gimp-smartphone") + (width 640) + (height 1136) + (unit millimeters) + (xresolution 326) + (yresolution 326) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Apple iPad 3&4, Air" + (icon-name "gimp-smartphone") + (width 2048) + (height 2732) + (unit millimeters) + (xresolution 264) + (yresolution 264) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Samsung Galaxy S6" + (icon-name "gimp-smartphone") + (width 1440) + (height 2560) + (unit millimeters) + (xresolution 577) + (yresolution 577) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Samsung Galaxy S5" + (icon-name "gimp-smartphone") + (width 1080) + (height 1920) + (unit millimeters) + (xresolution 360) + (yresolution 360) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) +(GimpTemplate "Samsung Galaxy Tab 2&3 10,1 inch" + (icon-name "gimp-smartphone") + (width 800) + (height 1280) + (unit millimeters) + (xresolution 149) + (yresolution 149) + (resolution-unit inches) + (image-type rgb) + (precision u8-gamma) + (color-managed yes) + (color-profile NULL) + (fill-type background)) + +# end of templaterc diff --git a/GIMP/2.10/themerc b/GIMP/2.10/themerc new file mode 100644 index 0000000..6c445ac --- /dev/null +++ b/GIMP/2.10/themerc @@ -0,0 +1,17 @@ +# GIMP themerc +# +# This file is written on GIMP startup and on every theme change. +# It is NOT supposed to be edited manually. Edit your personal +# gtkrc file instead (/home/victor/.config/GIMP/2.10/gtkrc). + +style "gimp-spin-scale-style" +{ + GimpSpinScale::compact = 1 +} + +class "GimpSpinScale" style "gimp-spin-scale-style" + +include "/usr/share/gimp/2.0/themes/Dark/gtkrc" +include "/etc/gimp/2.0/gtkrc" + +# end of themerc diff --git a/GIMP/2.10/tool-options/gimp-airbrush-tool b/GIMP/2.10/tool-options/gimp-airbrush-tool new file mode 100644 index 0000000..3fff508 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-airbrush-tool @@ -0,0 +1,10 @@ +# GIMP gimp-airbrush-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(gradient "FG to BG (RGB)") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-airbrush-tool options diff --git a/GIMP/2.10/tool-options/gimp-align-tool b/GIMP/2.10/tool-options/gimp-align-tool new file mode 100644 index 0000000..521b3bf --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-align-tool @@ -0,0 +1,4 @@ +# GIMP gimp-align-tool options + + +# end of gimp-align-tool options diff --git a/GIMP/2.10/tool-options/gimp-brightness-contrast-tool b/GIMP/2.10/tool-options/gimp-brightness-contrast-tool new file mode 100644 index 0000000..16bc2d3 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-brightness-contrast-tool @@ -0,0 +1,4 @@ +# GIMP gimp-brightness-contrast-tool options + + +# end of gimp-brightness-contrast-tool options diff --git a/GIMP/2.10/tool-options/gimp-bucket-fill-tool b/GIMP/2.10/tool-options/gimp-bucket-fill-tool new file mode 100644 index 0000000..f0c8fdf --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-bucket-fill-tool @@ -0,0 +1,8 @@ +# GIMP gimp-bucket-fill-tool options + +(pattern "Pine") +(brush-size 51) +(brush-hardness 0.5) +(fill-criterion r) + +# end of gimp-bucket-fill-tool options diff --git a/GIMP/2.10/tool-options/gimp-by-color-select-tool b/GIMP/2.10/tool-options/gimp-by-color-select-tool new file mode 100644 index 0000000..434e5db --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-by-color-select-tool @@ -0,0 +1,4 @@ +# GIMP gimp-by-color-select-tool options + + +# end of gimp-by-color-select-tool options diff --git a/GIMP/2.10/tool-options/gimp-cage-tool b/GIMP/2.10/tool-options/gimp-cage-tool new file mode 100644 index 0000000..70074a2 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-cage-tool @@ -0,0 +1,4 @@ +# GIMP gimp-cage-tool options + + +# end of gimp-cage-tool options diff --git a/GIMP/2.10/tool-options/gimp-clone-tool b/GIMP/2.10/tool-options/gimp-clone-tool new file mode 100644 index 0000000..abcb2d8 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-clone-tool @@ -0,0 +1,10 @@ +# GIMP gimp-clone-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(pattern "Pine") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-clone-tool options diff --git a/GIMP/2.10/tool-options/gimp-color-picker-tool b/GIMP/2.10/tool-options/gimp-color-picker-tool new file mode 100644 index 0000000..d46490a --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-color-picker-tool @@ -0,0 +1,4 @@ +# GIMP gimp-color-picker-tool options + + +# end of gimp-color-picker-tool options diff --git a/GIMP/2.10/tool-options/gimp-convolve-tool b/GIMP/2.10/tool-options/gimp-convolve-tool new file mode 100644 index 0000000..f362082 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-convolve-tool @@ -0,0 +1,9 @@ +# GIMP gimp-convolve-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-convolve-tool options diff --git a/GIMP/2.10/tool-options/gimp-crop-tool b/GIMP/2.10/tool-options/gimp-crop-tool new file mode 100644 index 0000000..edc1db4 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-crop-tool @@ -0,0 +1,8 @@ +# GIMP gimp-crop-tool options + +(aspect-denominator 334) +(aspect-numerator 259) +(overridden-fixed-aspect yes) +(pattern "Pine") + +# end of gimp-crop-tool options diff --git a/GIMP/2.10/tool-options/gimp-curves-tool b/GIMP/2.10/tool-options/gimp-curves-tool new file mode 100644 index 0000000..b7a332b --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-curves-tool @@ -0,0 +1,4 @@ +# GIMP gimp-curves-tool options + + +# end of gimp-curves-tool options diff --git a/GIMP/2.10/tool-options/gimp-dodge-burn-tool b/GIMP/2.10/tool-options/gimp-dodge-burn-tool new file mode 100644 index 0000000..28c2e9b --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-dodge-burn-tool @@ -0,0 +1,9 @@ +# GIMP gimp-dodge-burn-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-dodge-burn-tool options diff --git a/GIMP/2.10/tool-options/gimp-ellipse-select-tool b/GIMP/2.10/tool-options/gimp-ellipse-select-tool new file mode 100644 index 0000000..5b00a25 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-ellipse-select-tool @@ -0,0 +1,4 @@ +# GIMP gimp-ellipse-select-tool options + + +# end of gimp-ellipse-select-tool options diff --git a/GIMP/2.10/tool-options/gimp-eraser-tool b/GIMP/2.10/tool-options/gimp-eraser-tool new file mode 100644 index 0000000..01d5dc5 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-eraser-tool @@ -0,0 +1,9 @@ +# GIMP gimp-eraser-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-eraser-tool options diff --git a/GIMP/2.10/tool-options/gimp-flip-tool b/GIMP/2.10/tool-options/gimp-flip-tool new file mode 100644 index 0000000..4686677 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-flip-tool @@ -0,0 +1,4 @@ +# GIMP gimp-flip-tool options + + +# end of gimp-flip-tool options diff --git a/GIMP/2.10/tool-options/gimp-foreground-select-tool b/GIMP/2.10/tool-options/gimp-foreground-select-tool new file mode 100644 index 0000000..1026eac --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-foreground-select-tool @@ -0,0 +1,4 @@ +# GIMP gimp-foreground-select-tool options + + +# end of gimp-foreground-select-tool options diff --git a/GIMP/2.10/tool-options/gimp-free-select-tool b/GIMP/2.10/tool-options/gimp-free-select-tool new file mode 100644 index 0000000..86b6ab3 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-free-select-tool @@ -0,0 +1,4 @@ +# GIMP gimp-free-select-tool options + + +# end of gimp-free-select-tool options diff --git a/GIMP/2.10/tool-options/gimp-fuzzy-select-tool b/GIMP/2.10/tool-options/gimp-fuzzy-select-tool new file mode 100644 index 0000000..a0f7bdb --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-fuzzy-select-tool @@ -0,0 +1,4 @@ +# GIMP gimp-fuzzy-select-tool options + + +# end of gimp-fuzzy-select-tool options diff --git a/GIMP/2.10/tool-options/gimp-gegl-tool b/GIMP/2.10/tool-options/gimp-gegl-tool new file mode 100644 index 0000000..f085e5f --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-gegl-tool @@ -0,0 +1,4 @@ +# GIMP gimp-gegl-tool options + + +# end of gimp-gegl-tool options diff --git a/GIMP/2.10/tool-options/gimp-gradient-tool b/GIMP/2.10/tool-options/gimp-gradient-tool new file mode 100644 index 0000000..a3b7422 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-gradient-tool @@ -0,0 +1,7 @@ +# GIMP gimp-gradient-tool options + +(gradient "FG to BG (RGB)") +(brush-size 51) +(brush-hardness 0.5) + +# end of gimp-gradient-tool options diff --git a/GIMP/2.10/tool-options/gimp-handle-transform-tool b/GIMP/2.10/tool-options/gimp-handle-transform-tool new file mode 100644 index 0000000..a23ed42 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-handle-transform-tool @@ -0,0 +1,4 @@ +# GIMP gimp-handle-transform-tool options + + +# end of gimp-handle-transform-tool options diff --git a/GIMP/2.10/tool-options/gimp-heal-tool b/GIMP/2.10/tool-options/gimp-heal-tool new file mode 100644 index 0000000..029d414 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-heal-tool @@ -0,0 +1,9 @@ +# GIMP gimp-heal-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-heal-tool options diff --git a/GIMP/2.10/tool-options/gimp-ink-tool b/GIMP/2.10/tool-options/gimp-ink-tool new file mode 100644 index 0000000..05f649b --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-ink-tool @@ -0,0 +1,6 @@ +# GIMP gimp-ink-tool options + +(brush-size 51) +(brush-hardness 0.5) + +# end of gimp-ink-tool options diff --git a/GIMP/2.10/tool-options/gimp-iscissors-tool b/GIMP/2.10/tool-options/gimp-iscissors-tool new file mode 100644 index 0000000..fb42baf --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-iscissors-tool @@ -0,0 +1,4 @@ +# GIMP gimp-iscissors-tool options + + +# end of gimp-iscissors-tool options diff --git a/GIMP/2.10/tool-options/gimp-levels-tool b/GIMP/2.10/tool-options/gimp-levels-tool new file mode 100644 index 0000000..04c0f93 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-levels-tool @@ -0,0 +1,4 @@ +# GIMP gimp-levels-tool options + + +# end of gimp-levels-tool options diff --git a/GIMP/2.10/tool-options/gimp-measure-tool b/GIMP/2.10/tool-options/gimp-measure-tool new file mode 100644 index 0000000..ec7cff3 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-measure-tool @@ -0,0 +1,4 @@ +# GIMP gimp-measure-tool options + + +# end of gimp-measure-tool options diff --git a/GIMP/2.10/tool-options/gimp-move-tool b/GIMP/2.10/tool-options/gimp-move-tool new file mode 100644 index 0000000..b9721a8 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-move-tool @@ -0,0 +1,4 @@ +# GIMP gimp-move-tool options + + +# end of gimp-move-tool options diff --git a/GIMP/2.10/tool-options/gimp-mypaint-brush-tool b/GIMP/2.10/tool-options/gimp-mypaint-brush-tool new file mode 100644 index 0000000..7ba5cfb --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-mypaint-brush-tool @@ -0,0 +1,9 @@ +# GIMP gimp-mypaint-brush-tool options + +(mybrush "100% Opaque") +(brush-size 51) +(brush-hardness 0.5) +(radius 3.0099999904632568) +(hardness 0.94999998807907104) + +# end of gimp-mypaint-brush-tool options diff --git a/GIMP/2.10/tool-options/gimp-offset-tool b/GIMP/2.10/tool-options/gimp-offset-tool new file mode 100644 index 0000000..5a30253 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-offset-tool @@ -0,0 +1,4 @@ +# GIMP gimp-offset-tool options + + +# end of gimp-offset-tool options diff --git a/GIMP/2.10/tool-options/gimp-operation-tool b/GIMP/2.10/tool-options/gimp-operation-tool new file mode 100644 index 0000000..a71f690 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-operation-tool @@ -0,0 +1,4 @@ +# GIMP gimp-operation-tool options + + +# end of gimp-operation-tool options diff --git a/GIMP/2.10/tool-options/gimp-paintbrush-tool b/GIMP/2.10/tool-options/gimp-paintbrush-tool new file mode 100644 index 0000000..6186174 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-paintbrush-tool @@ -0,0 +1,10 @@ +# GIMP gimp-paintbrush-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(gradient "FG to BG (RGB)") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-paintbrush-tool options diff --git a/GIMP/2.10/tool-options/gimp-pencil-tool b/GIMP/2.10/tool-options/gimp-pencil-tool new file mode 100644 index 0000000..eebe6ca --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-pencil-tool @@ -0,0 +1,10 @@ +# GIMP gimp-pencil-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(gradient "FG to BG (RGB)") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-pencil-tool options diff --git a/GIMP/2.10/tool-options/gimp-perspective-clone-tool b/GIMP/2.10/tool-options/gimp-perspective-clone-tool new file mode 100644 index 0000000..e524aba --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-perspective-clone-tool @@ -0,0 +1,10 @@ +# GIMP gimp-perspective-clone-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(pattern "Pine") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-perspective-clone-tool options diff --git a/GIMP/2.10/tool-options/gimp-perspective-tool b/GIMP/2.10/tool-options/gimp-perspective-tool new file mode 100644 index 0000000..3a21bdc --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-perspective-tool @@ -0,0 +1,4 @@ +# GIMP gimp-perspective-tool options + + +# end of gimp-perspective-tool options diff --git a/GIMP/2.10/tool-options/gimp-rect-select-tool b/GIMP/2.10/tool-options/gimp-rect-select-tool new file mode 100644 index 0000000..25bc900 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-rect-select-tool @@ -0,0 +1,4 @@ +# GIMP gimp-rect-select-tool options + + +# end of gimp-rect-select-tool options diff --git a/GIMP/2.10/tool-options/gimp-rotate-tool b/GIMP/2.10/tool-options/gimp-rotate-tool new file mode 100644 index 0000000..32e5b73 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-rotate-tool @@ -0,0 +1,4 @@ +# GIMP gimp-rotate-tool options + + +# end of gimp-rotate-tool options diff --git a/GIMP/2.10/tool-options/gimp-scale-tool b/GIMP/2.10/tool-options/gimp-scale-tool new file mode 100644 index 0000000..243b4ea --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-scale-tool @@ -0,0 +1,6 @@ +# GIMP gimp-scale-tool options + +(interpolation linear) +(preview-opacity 0) + +# end of gimp-scale-tool options diff --git a/GIMP/2.10/tool-options/gimp-shear-tool b/GIMP/2.10/tool-options/gimp-shear-tool new file mode 100644 index 0000000..b1cf8f8 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-shear-tool @@ -0,0 +1,4 @@ +# GIMP gimp-shear-tool options + + +# end of gimp-shear-tool options diff --git a/GIMP/2.10/tool-options/gimp-smudge-tool b/GIMP/2.10/tool-options/gimp-smudge-tool new file mode 100644 index 0000000..e74ebb2 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-smudge-tool @@ -0,0 +1,10 @@ +# GIMP gimp-smudge-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(gradient "FG to BG (RGB)") +(palette "Color History") +(brush-size 12) +(brush-hardness 0.5) + +# end of gimp-smudge-tool options diff --git a/GIMP/2.10/tool-options/gimp-text-tool b/GIMP/2.10/tool-options/gimp-text-tool new file mode 100644 index 0000000..909620b --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-text-tool @@ -0,0 +1,7 @@ +# GIMP gimp-text-tool options + +(palette "Color History") +(font "Sans-serif") +(hint-style full) + +# end of gimp-text-tool options diff --git a/GIMP/2.10/tool-options/gimp-threshold-tool b/GIMP/2.10/tool-options/gimp-threshold-tool new file mode 100644 index 0000000..f114556 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-threshold-tool @@ -0,0 +1,4 @@ +# GIMP gimp-threshold-tool options + + +# end of gimp-threshold-tool options diff --git a/GIMP/2.10/tool-options/gimp-transform-3d-tool b/GIMP/2.10/tool-options/gimp-transform-3d-tool new file mode 100644 index 0000000..dbb8c08 --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-transform-3d-tool @@ -0,0 +1,4 @@ +# GIMP gimp-transform-3d-tool options + + +# end of gimp-transform-3d-tool options diff --git a/GIMP/2.10/tool-options/gimp-unified-transform-tool b/GIMP/2.10/tool-options/gimp-unified-transform-tool new file mode 100644 index 0000000..c84224d --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-unified-transform-tool @@ -0,0 +1,4 @@ +# GIMP gimp-unified-transform-tool options + + +# end of gimp-unified-transform-tool options diff --git a/GIMP/2.10/tool-options/gimp-vector-tool b/GIMP/2.10/tool-options/gimp-vector-tool new file mode 100644 index 0000000..7eb055c --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-vector-tool @@ -0,0 +1,9 @@ +# GIMP gimp-vector-tool options + +(brush "2. Hardness 050") +(dynamics "Dynamics Off") +(pattern "Pine") +(gradient "FG to BG (RGB)") +(palette "Color History") + +# end of gimp-vector-tool options diff --git a/GIMP/2.10/tool-options/gimp-warp-tool b/GIMP/2.10/tool-options/gimp-warp-tool new file mode 100644 index 0000000..e837f9e --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-warp-tool @@ -0,0 +1,4 @@ +# GIMP gimp-warp-tool options + + +# end of gimp-warp-tool options diff --git a/GIMP/2.10/tool-options/gimp-zoom-tool b/GIMP/2.10/tool-options/gimp-zoom-tool new file mode 100644 index 0000000..316363e --- /dev/null +++ b/GIMP/2.10/tool-options/gimp-zoom-tool @@ -0,0 +1,4 @@ +# GIMP gimp-zoom-tool options + + +# end of gimp-zoom-tool options diff --git a/GIMP/2.10/toolrc b/GIMP/2.10/toolrc new file mode 100644 index 0000000..33396e4 --- /dev/null +++ b/GIMP/2.10/toolrc @@ -0,0 +1,185 @@ +# GIMP toolrc + +(file-version 1) + +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-move-tool") + (children + (GimpToolInfo "gimp-move-tool" + (icon-name "gimp-tool-move") + (visible yes)) + (GimpToolInfo "gimp-align-tool" + (icon-name "gimp-tool-align") + (visible yes)))) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-rect-select-tool") + (children + (GimpToolInfo "gimp-rect-select-tool" + (icon-name "gimp-tool-rect-select") + (visible yes)) + (GimpToolInfo "gimp-ellipse-select-tool" + (icon-name "gimp-tool-ellipse-select") + (visible yes)))) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-iscissors-tool") + (children + (GimpToolInfo "gimp-free-select-tool" + (icon-name "gimp-tool-free-select") + (visible yes)) + (GimpToolInfo "gimp-iscissors-tool" + (icon-name "gimp-tool-iscissors") + (visible yes)) + (GimpToolInfo "gimp-foreground-select-tool" + (icon-name "gimp-tool-foreground-select") + (visible yes)))) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-fuzzy-select-tool") + (children + (GimpToolInfo "gimp-fuzzy-select-tool" + (icon-name "gimp-tool-fuzzy-select") + (visible yes)) + (GimpToolInfo "gimp-by-color-select-tool" + (icon-name "gimp-tool-by-color-select") + (visible yes)))) +(GimpToolInfo "gimp-crop-tool" + (icon-name "gimp-tool-crop") + (visible yes)) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-scale-tool") + (children + (GimpToolInfo "gimp-unified-transform-tool" + (icon-name "gimp-tool-unified-transform") + (visible yes)) + (GimpToolInfo "gimp-rotate-tool" + (icon-name "gimp-tool-rotate") + (visible yes)) + (GimpToolInfo "gimp-scale-tool" + (icon-name "gimp-tool-scale") + (visible yes)) + (GimpToolInfo "gimp-shear-tool" + (icon-name "gimp-tool-shear") + (visible yes)) + (GimpToolInfo "gimp-flip-tool" + (icon-name "gimp-tool-flip") + (visible yes)) + (GimpToolInfo "gimp-perspective-tool" + (icon-name "gimp-tool-perspective") + (visible yes)) + (GimpToolInfo "gimp-transform-3d-tool" + (icon-name "gimp-tool-transform-3d") + (visible yes)) + (GimpToolInfo "gimp-handle-transform-tool" + (icon-name "gimp-tool-handle-transform") + (visible yes)))) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-cage-tool") + (children + (GimpToolInfo "gimp-warp-tool" + (icon-name "gimp-tool-warp") + (visible yes)) + (GimpToolInfo "gimp-cage-tool" + (icon-name "gimp-tool-cage") + (visible yes)))) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-bucket-fill-tool") + (children + (GimpToolInfo "gimp-bucket-fill-tool" + (icon-name "gimp-tool-bucket-fill") + (visible yes)) + (GimpToolInfo "gimp-gradient-tool" + (icon-name "gimp-tool-gradient") + (visible yes)))) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-paintbrush-tool") + (children + (GimpToolInfo "gimp-paintbrush-tool" + (icon-name "gimp-tool-paintbrush") + (visible yes)) + (GimpToolInfo "gimp-pencil-tool" + (icon-name "gimp-tool-pencil") + (visible yes)) + (GimpToolInfo "gimp-airbrush-tool" + (icon-name "gimp-tool-airbrush") + (visible yes)) + (GimpToolInfo "gimp-ink-tool" + (icon-name "gimp-tool-ink") + (visible yes)) + (GimpToolInfo "gimp-mypaint-brush-tool" + (icon-name "gimp-tool-mypaint-brush") + (visible yes)))) +(GimpToolInfo "gimp-eraser-tool" + (icon-name "gimp-tool-eraser") + (visible yes)) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-clone-tool") + (children + (GimpToolInfo "gimp-clone-tool" + (icon-name "gimp-tool-clone") + (visible yes)) + (GimpToolInfo "gimp-perspective-clone-tool" + (icon-name "gimp-tool-perspective-clone") + (visible yes)) + (GimpToolInfo "gimp-heal-tool" + (icon-name "gimp-tool-heal") + (visible yes)))) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-dodge-burn-tool") + (children + (GimpToolInfo "gimp-smudge-tool" + (icon-name "gimp-tool-smudge") + (visible yes)) + (GimpToolInfo "gimp-convolve-tool" + (icon-name "gimp-tool-blur") + (visible yes)) + (GimpToolInfo "gimp-dodge-burn-tool" + (icon-name "gimp-tool-dodge") + (visible yes)))) +(GimpToolInfo "gimp-vector-tool" + (icon-name "gimp-tool-path") + (visible yes)) +(GimpToolInfo "gimp-text-tool" + (icon-name "gimp-tool-text") + (visible yes)) +(GimpToolGroup "tool group" + (visible yes) + (active-tool "gimp-color-picker-tool") + (children + (GimpToolInfo "gimp-color-picker-tool" + (icon-name "gimp-tool-color-picker") + (visible yes)) + (GimpToolInfo "gimp-measure-tool" + (icon-name "gimp-tool-measure") + (visible yes)))) +(GimpToolInfo "gimp-zoom-tool" + (icon-name "gimp-tool-zoom") + (visible yes)) +(GimpToolInfo "gimp-brightness-contrast-tool" + (icon-name "gimp-tool-brightness-contrast") + (visible no)) +(GimpToolInfo "gimp-threshold-tool" + (icon-name "gimp-tool-threshold") + (visible no)) +(GimpToolInfo "gimp-levels-tool" + (icon-name "gimp-tool-levels") + (visible no)) +(GimpToolInfo "gimp-curves-tool" + (icon-name "gimp-tool-curves") + (visible no)) +(GimpToolInfo "gimp-offset-tool" + (icon-name "gimp-tool-offset") + (visible no)) +(GimpToolInfo "gimp-gegl-tool" + (icon-name "gimp-gegl") + (visible no)) + +# end of toolrc diff --git a/GIMP/2.10/unitrc b/GIMP/2.10/unitrc new file mode 100644 index 0000000..9883ee8 --- /dev/null +++ b/GIMP/2.10/unitrc @@ -0,0 +1,51 @@ +# GIMP units +# +# This file contains the user unit database. You can edit this list with the +# unit editor. You are not supposed to edit it manually, but of course you +# can do. +# This file will be entirely rewritten each time you exit. + +(unit-info "centimeters" + (factor 2.54) + (digits 2) + (symbol "cm") + (abbreviation "cm") + (singular "centimeter") + (plural "centimeters")) +(unit-info "meters" + (factor 0.025399999999999999) + (digits 4) + (symbol "m") + (abbreviation "m") + (singular "meter") + (plural "meters")) +(unit-info "feet" + (factor 0.083333000000000004) + (digits 4) + (symbol "'") + (abbreviation "ft") + (singular "foot") + (plural "feet")) +(unit-info "yards" + (factor 0.027778000000000001) + (digits 4) + (symbol "yd") + (abbreviation "yd") + (singular "yard") + (plural "yards")) +(unit-info "typogr. points" + (factor 72.269999999999996) + (digits 0) + (symbol "tpt") + (abbreviation "tpt") + (singular "typogr. point") + (plural "typogr. points")) +(unit-info "typogr. picas" + (factor 6.0225) + (digits 1) + (symbol "tpc") + (abbreviation "tpc") + (singular "typogr. pica") + (plural "typogr. picas")) + +# end of units diff --git a/dunst/dunstrc b/dunst/dunstrc new file mode 100644 index 0000000..d03af62 --- /dev/null +++ b/dunst/dunstrc @@ -0,0 +1,27 @@ +[global] + monitor = 0 + follow = keyboard + width = 370 + height = 350 + offset = 0x19 + padding = 2 + horizontal_padding = 2 + transparency = 25 + font = Monospace 12 + format = "%s\n%b" + +[urgency_low] + background = "#1d2021" + foreground = "#928374" + timeout = 3 + +[urgency_normal] + foreground = "#ebdbb2" + background = "#458588" + timeout = 5 + +[urgency_critical] + background = "#1cc24d" + foreground = "#ebdbb2" + frame_color = "#fabd2f" + timeout = 10 diff --git a/fancontrol-gui b/fancontrol-gui new file mode 100644 index 0000000..b957444 --- /dev/null +++ b/fancontrol-gui @@ -0,0 +1,3 @@ +[window] +DP-4 DP-2 Height 2560x1440=1393 +DP-4 DP-2 Width 2560x1440=1363 diff --git a/fontconfig/fonts.conf b/fontconfig/fonts.conf new file mode 100755 index 0000000..be47e01 --- /dev/null +++ b/fontconfig/fonts.conf @@ -0,0 +1,36 @@ + + + + + serif + + Linux Libertine + Joy Pixels + Noto Color Emoji + + + + sans-serif + + Linux Biolinum + Joy Pixels + Noto Color Emoji + + + + sans + + Linux Biolinum + Joy Pixels + Noto Color Emoji + + + + monospace + + Noto Sans Mono + Liberation Mono + Braille + + + diff --git a/gtk-2.0/gtkfilechooser.ini b/gtk-2.0/gtkfilechooser.ini new file mode 100644 index 0000000..274ade5 --- /dev/null +++ b/gtk-2.0/gtkfilechooser.ini @@ -0,0 +1,11 @@ +[Filechooser Settings] +LocationMode=path-bar +ShowHidden=false +ShowSizeColumn=true +GeometryX=2726 +GeometryY=374 +GeometryWidth=948 +GeometryHeight=712 +SortColumn=name +SortOrder=ascending +StartupMode=recent diff --git a/gtk-2.0/gtkrc-2.0 b/gtk-2.0/gtkrc-2.0 new file mode 100644 index 0000000..208fdc7 --- /dev/null +++ b/gtk-2.0/gtkrc-2.0 @@ -0,0 +1,20 @@ +# DO NOT EDIT! This file will be overwritten by LXAppearance. +# Any customization should be done in ~/.gtkrc-2.0.mine instead. + +include "/home/victor/.gtkrc-2.0.mine" +gtk-theme-name="Arc-Gruvbox" +gtk-icon-theme-name="ePapirus" +gtk-font-name="Sans 10" +gtk-cursor-theme-name="capitaine-cursors" +gtk-cursor-theme-size=0 +gtk-toolbar-style=GTK_TOOLBAR_TEXT +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=0 +gtk-menu-images=1 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=1 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle="hintfull" +gtk-xft-rgba="rgb" +gtk-modules="gail:atk-bridge" diff --git a/gtk-3.0/bookmarks b/gtk-3.0/bookmarks new file mode 100644 index 0000000..06964db --- /dev/null +++ b/gtk-3.0/bookmarks @@ -0,0 +1,7 @@ +file:///home/victor/pix/1memes +file:///home/victor/pix/screenshots +file:///home/victor/vids +file:///home/victor/down +file:///home/victor/dox +file:///mnt/ssd250 +file:///mnt/USB diff --git a/gtk-3.0/colors.css b/gtk-3.0/colors.css new file mode 100644 index 0000000..d2709f7 --- /dev/null +++ b/gtk-3.0/colors.css @@ -0,0 +1,84 @@ +@define-color borders_breeze #bcbebf; +@define-color content_view_bg_breeze #ffffff; +@define-color error_color_backdrop_breeze #da4453; +@define-color error_color_breeze #da4453; +@define-color error_color_insensitive_backdrop_breeze #f0b1b8; +@define-color error_color_insensitive_breeze #f0b1b8; +@define-color insensitive_base_color_breeze #f3f3f3; +@define-color insensitive_base_fg_color_breeze #aaabac; +@define-color insensitive_bg_color_breeze #e3e5e7; +@define-color insensitive_borders_breeze #d2d4d6; +@define-color insensitive_fg_color_breeze #a0a1a3; +@define-color insensitive_selected_bg_color_breeze #e3e5e7; +@define-color insensitive_selected_fg_color_breeze #a0a1a3; +@define-color insensitive_unfocused_bg_color_breeze #e3e5e7; +@define-color insensitive_unfocused_fg_color_breeze #a0a1a3; +@define-color insensitive_unfocused_selected_bg_color_breeze #e3e5e7; +@define-color insensitive_unfocused_selected_fg_color_breeze #a0a1a3; +@define-color link_color_breeze #2980b9; +@define-color link_visited_color_breeze #9b59b6; +@define-color success_color_backdrop_breeze #27ae60; +@define-color success_color_breeze #27ae60; +@define-color success_color_insensitive_backdrop_breeze #abd8be; +@define-color success_color_insensitive_breeze #abd8be; +@define-color theme_base_color_breeze #ffffff; +@define-color theme_bg_color_breeze #eff0f1; +@define-color theme_button_background_backdrop_breeze #fcfcfc; +@define-color theme_button_background_backdrop_insensitive_breeze #f0f0f0; +@define-color theme_button_background_insensitive_breeze #f0f0f0; +@define-color theme_button_background_normal_breeze #fcfcfc; +@define-color theme_button_decoration_focus_backdrop_breeze #3daee9; +@define-color theme_button_decoration_focus_backdrop_insensitive_breeze #a2d8f3; +@define-color theme_button_decoration_focus_breeze #3daee9; +@define-color theme_button_decoration_focus_insensitive_breeze #a2d8f3; +@define-color theme_button_decoration_hover_backdrop_breeze #3daee9; +@define-color theme_button_decoration_hover_backdrop_insensitive_breeze #a2d8f3; +@define-color theme_button_decoration_hover_breeze #3daee9; +@define-color theme_button_decoration_hover_insensitive_breeze #a2d8f3; +@define-color theme_button_foreground_active_backdrop_breeze #232629; +@define-color theme_button_foreground_active_backdrop_insensitive_breeze #a0a1a3; +@define-color theme_button_foreground_active_breeze #ffffff; +@define-color theme_button_foreground_active_insensitive_breeze #a0a1a3; +@define-color theme_button_foreground_backdrop_breeze #232629; +@define-color theme_button_foreground_backdrop_insensitive_breeze #a8a9aa; +@define-color theme_button_foreground_insensitive_breeze #a8a9aa; +@define-color theme_button_foreground_normal_breeze #232629; +@define-color theme_fg_color_breeze #232629; +@define-color theme_header_background_backdrop_breeze #eff0f1; +@define-color theme_header_background_breeze #dee0e2; +@define-color theme_header_background_light_breeze #eff0f1; +@define-color theme_header_foreground_backdrop_breeze #232629; +@define-color theme_header_foreground_breeze #232629; +@define-color theme_header_foreground_insensitive_backdrop_breeze #232629; +@define-color theme_header_foreground_insensitive_breeze #232629; +@define-color theme_hovering_selected_bg_color_breeze #3daee9; +@define-color theme_selected_bg_color_breeze #3daee9; +@define-color theme_selected_fg_color_breeze #ffffff; +@define-color theme_text_color_breeze #232629; +@define-color theme_titlebar_background_backdrop_breeze #eff0f1; +@define-color theme_titlebar_background_breeze #dee0e2; +@define-color theme_titlebar_background_light_breeze #eff0f1; +@define-color theme_titlebar_foreground_backdrop_breeze #232629; +@define-color theme_titlebar_foreground_breeze #232629; +@define-color theme_titlebar_foreground_insensitive_backdrop_breeze #232629; +@define-color theme_titlebar_foreground_insensitive_breeze #232629; +@define-color theme_unfocused_base_color_breeze #ffffff; +@define-color theme_unfocused_bg_color_breeze #eff0f1; +@define-color theme_unfocused_fg_color_breeze #232629; +@define-color theme_unfocused_selected_bg_color_alt_breeze #c2e0f5; +@define-color theme_unfocused_selected_bg_color_breeze #c2e0f5; +@define-color theme_unfocused_selected_fg_color_breeze #232629; +@define-color theme_unfocused_text_color_breeze #232629; +@define-color theme_unfocused_view_bg_color_breeze #f3f3f3; +@define-color theme_unfocused_view_text_color_breeze #aaabac; +@define-color theme_view_active_decoration_color_breeze #3daee9; +@define-color theme_view_hover_decoration_color_breeze #3daee9; +@define-color tooltip_background_breeze #f7f7f7; +@define-color tooltip_border_breeze #c2c3c3; +@define-color tooltip_text_breeze #232629; +@define-color unfocused_borders_breeze #bcbebf; +@define-color unfocused_insensitive_borders_breeze #d2d4d6; +@define-color warning_color_backdrop_breeze #f67400; +@define-color warning_color_breeze #f67400; +@define-color warning_color_insensitive_backdrop_breeze #fbc289; +@define-color warning_color_insensitive_breeze #fbc289; diff --git a/gtk-3.0/gtk.css b/gtk-3.0/gtk.css new file mode 100644 index 0000000..c9763f7 --- /dev/null +++ b/gtk-3.0/gtk.css @@ -0,0 +1 @@ +@import 'colors.css'; \ No newline at end of file diff --git a/gtk-3.0/settings.ini b/gtk-3.0/settings.ini new file mode 100644 index 0000000..72a1a3d --- /dev/null +++ b/gtk-3.0/settings.ini @@ -0,0 +1,21 @@ +[Settings] +gtk-application-prefer-dark-theme=false +gtk-button-images=0 +gtk-cursor-theme-name=capitaine-cursors +gtk-cursor-theme-size=0 +gtk-decoration-layout=icon:minimize,maximize,close +gtk-enable-animations=true +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=1 +gtk-font-name=Sans 10 +gtk-icon-theme-name=ePapirus +gtk-menu-images=1 +gtk-primary-button-warps-slider=false +gtk-theme-name=Arc-Gruvbox +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-toolbar-style=GTK_TOOLBAR_TEXT +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle=hintfull +gtk-xft-rgba=rgb +gtk-modules=gail:atk-bridge diff --git a/gtk-4.0/settings.ini b/gtk-4.0/settings.ini new file mode 100644 index 0000000..781e3e7 --- /dev/null +++ b/gtk-4.0/settings.ini @@ -0,0 +1,9 @@ +[Settings] +gtk-application-prefer-dark-theme=false +gtk-cursor-theme-name=breeze_cursors +gtk-cursor-theme-size=24 +gtk-decoration-layout=icon:minimize,maximize,close +gtk-enable-animations=true +gtk-font-name=Noto Sans, 10 +gtk-icon-theme-name=breeze +gtk-primary-button-warps-slider=false diff --git a/gtkrc b/gtkrc new file mode 100644 index 0000000..37f4e80 --- /dev/null +++ b/gtkrc @@ -0,0 +1,2 @@ +# created by KDE Plasma, Sun Aug 14 14:02:50 2022 +# diff --git a/gtkrc-2.0 b/gtkrc-2.0 new file mode 100644 index 0000000..aa6e6c6 --- /dev/null +++ b/gtkrc-2.0 @@ -0,0 +1,5 @@ +# created by KDE Plasma, Sun Aug 14 14:02:50 2022 +# + +gtk-alternative-button-order = 1 + diff --git a/htop/htoprc b/htop/htoprc new file mode 100644 index 0000000..12529fd --- /dev/null +++ b/htop/htoprc @@ -0,0 +1,63 @@ +# Beware! This file is rewritten by htop when settings are changed in the interface. +# The parser is also very primitive, and not human-friendly. +htop_version=3.2.2 +config_reader_min_version=3 +fields=0 48 17 18 38 39 40 2 46 47 49 1 +hide_kernel_threads=1 +hide_userland_threads=1 +hide_running_in_container=0 +shadow_other_users=0 +show_thread_names=1 +show_program_path=1 +highlight_base_name=0 +highlight_deleted_exe=1 +shadow_distribution_path_prefix=0 +highlight_megabytes=1 +highlight_threads=1 +highlight_changes=0 +highlight_changes_delay_secs=5 +find_comm_in_cmdline=1 +strip_exe_from_cmdline=1 +show_merged_command=0 +header_margin=1 +screen_tabs=1 +detailed_cpu_time=0 +cpu_count_from_one=0 +show_cpu_usage=1 +show_cpu_frequency=0 +show_cpu_temperature=0 +degree_fahrenheit=0 +update_process_names=0 +account_guest_in_cpu_meter=0 +color_scheme=0 +enable_mouse=1 +delay=15 +hide_function_bar=0 +header_layout=two_50_50 +column_meters_0=CPU LeftCPUs2 Memory Swap +column_meter_modes_0=1 1 1 1 +column_meters_1=RightCPUs2 Tasks LoadAverage Uptime NetworkIO +column_meter_modes_1=1 2 2 2 2 +tree_view=1 +sort_key=46 +tree_sort_key=47 +sort_direction=-1 +tree_sort_direction=-1 +tree_view_always_by_pid=0 +all_branches_collapsed=0 +screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command +.sort_key=PERCENT_CPU +.tree_sort_key=PERCENT_MEM +.tree_view=1 +.tree_view_always_by_pid=0 +.sort_direction=-1 +.tree_sort_direction=-1 +.all_branches_collapsed=0 +screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE PERCENT_SWAP_DELAY PERCENT_IO_DELAY Command +.sort_key=IO_RATE +.tree_sort_key=PID +.tree_view=0 +.tree_view_always_by_pid=0 +.sort_direction=-1 +.tree_sort_direction=1 +.all_branches_collapsed=0 diff --git a/lf/cleaner b/lf/cleaner new file mode 100755 index 0000000..a184d84 --- /dev/null +++ b/lf/cleaner @@ -0,0 +1,4 @@ +#!/bin/sh +if [ -n "$FIFO_UEBERZUG" ]; then + printf '{"action": "remove", "identifier": "PREVIEW"}\n' > "$FIFO_UEBERZUG" +fi diff --git a/lf/icons b/lf/icons new file mode 100644 index 0000000..02dc03a --- /dev/null +++ b/lf/icons @@ -0,0 +1,78 @@ +di 📠+fi 📃 +tw 🤠+ow 📂 +ln ⛓ +or ⌠+ex 🎯 +*.txt ✠+*.mom ✠+*.me ✠+*.ms ✠+*.avif 🖼 +*.png 🖼 +*.webp 🖼 +*.ico 🖼 +*.jpg 📸 +*.jpe 📸 +*.jpeg 📸 +*.gif 🖼 +*.svg 🗺 +*.tif 🖼 +*.tiff 🖼 +*.xcf 🖌 +*.html 🌎 +*.xml 📰 +*.gpg 🔒 +*.css 🎨 +*.pdf 📚 +*.djvu 📚 +*.epub 📚 +*.csv 📓 +*.xlsx 📓 +*.tex 📜 +*.md 📘 +*.r 📊 +*.R 📊 +*.rmd 📊 +*.Rmd 📊 +*.m 📊 +*.py ðŸ +*.mp3 🎵 +*.opus 🎵 +*.ogg 🎵 +*.m4a 🎵 +*.flac 🎼 +*.wav 🎼 +*.mkv 🎥 +*.mp4 🎥 +*.webm 🎥 +*.mpeg 🎥 +*.avi 🎥 +*.mov 🎥 +*.mpg 🎥 +*.wmv 🎥 +*.m4b 🎥 +*.flv 🎥 +*.zip 📦 +*.rar 📦 +*.7z 📦 +*.tar 📦 +*.z64 🎮 +*.v64 🎮 +*.n64 🎮 +*.gba 🎮 +*.nes 🎮 +*.gdi 🎮 +*.1 ℹ +*.nfo ℹ +*.info ℹ +*.log 📙 +*.iso 📀 +*.img 📀 +*.bib 🎓 +*.ged 👪 +*.part 💔 +*.torrent 🔽 +*.jar ♨ +*.java ♨ diff --git a/lf/lfrc b/lf/lfrc new file mode 100644 index 0000000..3ebf064 --- /dev/null +++ b/lf/lfrc @@ -0,0 +1,138 @@ +# Luke's lf settings + + +# Note on Image Previews +# For those wanting image previews, like this system, there are four steps to +# set it up. These are done automatically for LARBS users, but I will state +# them here for others doing it manually. +# +# 1. ueberzug must be installed. +# 2. The scope file (~/.config/lf/scope for me), must have a command similar to +# mine to generate ueberzug images. +# 3. A `set cleaner` line as below is a cleaner script. +# 4. lf should be started through a wrapper script (~/.local/bin/lfub for me) +# that creates the environment for ueberzug. This command can be be aliased +# in your shellrc (`alias lf="lfub") or if set to a binding, should be +# called directly instead of normal lf. + +# Basic vars +set shellopts '-eu' +set ifs "\n" +set scrolloff 10 +set icons +set period 1 +set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml" +set cleaner '~/.config/lf/cleaner' +set previewer '~/.config/lf/scope' +set autoquit on + +# cmds/functions +cmd open ${{ + case $(file --mime-type "$(readlink -f $f)" -b) in + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) localc $fx ;; + image/vnd.djvu|application/pdf|application/octet-stream|application/postscript) setsid -f zathura $fx >/dev/null 2>&1 ;; + text/*|application/json|inode/x-empty|application/x-subrip) $EDITOR $fx;; + image/x-xcf) setsid -f gimp $f >/dev/null 2>&1 ;; + image/svg+xml) display -- $f ;; + image/*) rotdir $f | grep -i "\.\(png\|jpg\|jpeg\|gif\|avif\|webp\|tif\|ico\)\(_large\)*$" | + setsid -f sxiv -aio 2>/dev/null | while read -r file; do + [ -z "$file" ] && continue + lf -remote "send select \"$file\"" + lf -remote "send toggle" + done & + ;; + audio/*|video/x-ms-asf) mpv --audio-display=no $f ;; + video/*) setsid -f mpv $f -quiet >/dev/null 2>&1 ;; + application/pdf|application/vnd.djvu|application/epub*) setsid -f zathura $fx >/dev/null 2>&1 ;; + application/pgp-encrypted) $EDITOR $fx ;; + application/vnd.openxmlformats-officedocument.wordprocessingml.document|application/vnd.oasis.opendocument.text) setsid -f lowriter $fx >/dev/null 2>&1 ;; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|application/octet-stream|application/vnd.oasis.opendocument.spreadsheet|application/vnd.oasis.opendocument.spreadsheet-template) setsid -f localc $fx >/dev/null 2>&1 ;; + application/vnd.openxmlformats-officedocument.presentationml.presentation|application/vnd.oasis.opendocument.presentation-template|application/vnd.oasis.opendocument.presentation|application/vnd.ms-powerpoint) setsid -f loimpress $fx >/dev/null 2>&1 ;; + application/vnd.oasis.opendocument.graphics|application/vnd.oasis.opendocument.graphics-template) setsid -f lodraw $fx >/dev/null 2>&1 ;; + application/vnd.oasis.opendocument.formula) setsid -f lomath $fx >/dev/null 2>&1 ;; + application/vnd.oasis.opendocument.database) setsid -f lobase $fx >/dev/null 2>&1 ;; + *) for f in $fx; do setsid -f $OPENER $f >/dev/null 2>&1; done;; + esac +}} + +cmd mkdir $mkdir -p "$(echo $* | tr ' ' '\ ')" + +cmd extract ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + printf "%s\n\t" "$fx" + printf "extract?[y/N]" + read ans + [ $ans = "y" ] && aunpack $fx +}} + +cmd delete ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + printf "%s\n\t" "$fx" + printf "delete?[y/N]" + read ans + [ $ans = "y" ] && rm -rf -- $fx +}} + +cmd moveto ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + clear; echo "Move to where?" + dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" && + for x in $fx; do + eval mv -iv \"$x\" \"$dest\" + done && + notify-send "🚚 File(s) moved." "File(s) moved to $dest." +}} + +cmd copyto ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + clear; echo "Copy to where?" + dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" && + for x in $fx; do + eval cp -ivr \"$x\" \"$dest\" + done && + notify-send "📋 File(s) copied." "File(s) copies to $dest." +}} + +cmd setbg "$1" +cmd bulkrename $vidir + +# Bindings +map $lf -remote "send $id select \"$(fzf)\"" +map J $lf -remote "send $id cd $(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf)" +map gh +map g top +map D delete +map E extract +map C copyto +map M moveto +map push :mkdir +map reload +map set hidden! +map shell +map x $$f +map X !$f +map o &mimeopen "$f" +map O $mimeopen --ask "$f" + +map A rename # at the very end +map c push A # new rename +map I push A # at the very beginning +map i push A # before extension +map a push A # after extension +map B bulkrename +map b $setbg $f + +map down +map up +map V push :!nvim + +map W $setsid -f $TERMINAL >/dev/null 2>&1 + +map Y $printf "%s" "$fx" | xclip -selection clipboard + +# Source Bookmarks +source "~/.config/lf/shortcutrc" diff --git a/lf/scope b/lf/scope new file mode 100755 index 0000000..1154234 --- /dev/null +++ b/lf/scope @@ -0,0 +1,53 @@ +#!/bin/sh + +# File preview handler for lf. + +set -C -f +IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" + +image() { + if [ -f "$1" ] && [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1; then + printf '{"action": "add", "identifier": "PREVIEW", "x": "%s", "y": "%s", "width": "%s", "height": "%s", "scaler": "contain", "path": "%s"}\n' "$4" "$5" "$(($2-1))" "$(($3-1))" "$1" > "$FIFO_UEBERZUG" + else + mediainfo "$6" + fi +} + +ifub() { + [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1 +} + +# Note that the cache file name is a function of file information, meaning if +# an image appears in multiple places across the machine, it will not have to +# be regenerated once seen. + +case "$(file --dereference --brief --mime-type -- "$1")" in + image/avif) CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE" ] && convert "$1" "$CACHE.jpg" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; + + image/*) image "$1" "$2" "$3" "$4" "$5" "$1" ;; + text/html) lynx -width="$4" -display_charset=utf-8 -dump "$1" ;; + text/troff) man ./ "$1" | col -b ;; + text/* | */xml | application/json) bat --terminal-width "$(($4-2))" -f "$1" ;; + audio/* | application/octet-stream) mediainfo "$1" || exit 1 ;; + video/* ) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE" ] && ffmpegthumbnailer -i "$1" -o "$CACHE" -s 0 + image "$CACHE" "$2" "$3" "$4" "$5" "$1" + ;; + */pdf) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" + ;; + */epub+zip|*/mobi*) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE.jpg" ] && gnome-epub-thumbnailer "$1" "$CACHE.jpg" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" + ;; + application/*zip) atool --list -- "$1" ;; + *opendocument*) odt2txt "$1" ;; + application/pgp-encrypted) gpg -d -- "$1" ;; +esac +exit 1 diff --git a/lf/shortcutrc b/lf/shortcutrc new file mode 100644 index 0000000..490e801 --- /dev/null +++ b/lf/shortcutrc @@ -0,0 +1,35 @@ +map Ccac cd "/home/victor/.cache" +map Ccf cd "/home/victor/.config" +map CD cd "/home/victor/down" +map Cd cd "/home/victor/dox" +map Cdt cd "/home/victor/.local/share" +map Crr cd "/home/victor/.local/src" +map Ch cd "/home/victor" +map Cm cd "/home/victor/music" +map Cmn cd "/mnt" +map Cpp cd "/home/victor/pix" +map Csc cd "/home/victor/.local/bin" +map Csrc cd "/home/victor/.local/src" +map Cvv cd "/home/victor/vids" +map Cssd cd "/mnt/ssd250/" +map Cnvme cd "/mnt/nvme/" +map Cbsd cd "/home/victor/bsd" +map Cpub cd "/home/victor/Public" +map Cmemes cd "/home/victor/Pictures/1memes" +map Cweb cd "/home/victor/web" +map Ebf $$EDITOR "/home/victor/.config/shell/bm-files" +map Ebd $$EDITOR "/home/victor/.config/shell/bm-dirs" +map Ecfx $$EDITOR "/home/victor/.config/x11/xresources" +map Ecfb $$EDITOR "~/.local/src/dwmblocks/config.h" +map Ecfv $$EDITOR "/home/victor/.config/nvim/init.vim" +map Ecfz $$EDITOR "/home/victor/.config/zsh/.zshrc" +map Ecfa $$EDITOR "/home/victor/.config/shell/aliasrc" +map Ecfp $$EDITOR "/home/victor/.config/shell/profile" +map Ecfm $$EDITOR "/home/victor/.config/mutt/muttrc" +map Ecfn $$EDITOR "/home/victor/.config/newsboat/config" +map Ecfu $$EDITOR "/home/victor/.config/newsboat/urls" +map Ecfmb $$EDITOR "/home/victor/.config/ncmpcpp/bindings" +map Ecfmc $$EDITOR "/home/victor/.config/ncmpcpp/config" +map Ecfl $$EDITOR "/home/victor/.config/lf/lfrc" +map EcfL $$EDITOR "/home/victor/.config/lf/scope" +map EcfX $$EDITOR "/home/victor/.config/sxiv/exec/key-handler" diff --git a/mimeapps.list b/mimeapps.list new file mode 100644 index 0000000..0c3a9dc --- /dev/null +++ b/mimeapps.list @@ -0,0 +1,55 @@ +[Default Applications] +text/x-shellscript=text.desktop; +x-scheme-handler/magnet=torrent.desktop; +application/x-bittorrent=torrent.desktop; +x-scheme-handler/mailto=userapp-Thunderbird-ELFTO1.desktop +text/plain=text.desktop; +application/postscript=pdf.desktop; +application/pdf=pdf.desktop; +image/png=img.desktop; +image/jpeg=img.desktop; +image/gif=img.desktop; +application/rss+xml=rss.desktop +video/x-matroska=video.desktop +x-scheme-handler/lbry=lbry.desktop +inode/directory=file.desktop +x-scheme-handler/http=firefox.desktop +x-scheme-handler/https=firefox.desktop +x-scheme-handler/chrome=firefox.desktop +text/html=firefox.desktop +application/x-extension-htm=firefox.desktop +application/x-extension-html=firefox.desktop +application/x-extension-shtml=firefox.desktop +application/xhtml+xml=firefox.desktop +application/x-extension-xhtml=firefox.desktop +application/x-extension-xht=firefox.desktop +message/rfc822=userapp-Thunderbird-ELFTO1.desktop +x-scheme-handler/mid=userapp-Thunderbird-ELFTO1.desktop +x-scheme-handler/tg=userapp-Telegram Desktop-KTC7V1.desktop +video/mp4=mpv.desktop +audio/flac=mpv.desktop +application/gzip=unityhub.desktop + +[Added Associations] +x-scheme-handler/http=firefox.desktop; +x-scheme-handler/https=firefox.desktop; +x-scheme-handler/chrome=firefox.desktop; +text/html=firefox.desktop; +application/x-extension-htm=firefox.desktop; +application/x-extension-html=firefox.desktop; +application/x-extension-shtml=firefox.desktop; +application/xhtml+xml=firefox.desktop; +application/x-extension-xhtml=firefox.desktop; +application/x-extension-xht=firefox.desktop; +x-scheme-handler/mailto=userapp-Thunderbird-ELFTO1.desktop; +x-scheme-handler/mid=userapp-Thunderbird-ELFTO1.desktop; +x-scheme-handler/tg=userapp-Telegram Desktop-UY5IQ1.desktop;userapp-Telegram Desktop-KTC7V1.desktop; +video/mp4=vlc.desktop;mpv.desktop; +application/x-xpinstall=org.kde.ark.desktop; +application/javascript=codium.desktop; +audio/x-opus+ogg=org.gnome.Rhythmbox3.desktop;mpv.desktop; +video/webm=mpv.desktop;org.kde.kdenlive.desktop; +application/zip=org.kde.ark.desktop; +image/png=sxiv.desktop;org.kde.ark.desktop; +audio/flac=mpv.desktop; +application/gzip=unityhub.desktop; diff --git a/mpd/mpd.conf b/mpd/mpd.conf new file mode 100644 index 0000000..b32a3fb --- /dev/null +++ b/mpd/mpd.conf @@ -0,0 +1,21 @@ +music_directory "~/music" +playlist_directory "~/.config/mpd/playlists" + +auto_update "yes" +bind_to_address "127.0.0.1" +restore_paused "yes" +max_output_buffer_size "16384" + +audio_output { + type "pulse" + name "pulse" + #type "alsa" + #name "ALSA" +} + +audio_output { + type "fifo" + name "Visualizer feed" + path "/tmp/mpd.fifo" + format "44100:16:2" +} diff --git a/mpv/input.conf b/mpv/input.conf new file mode 100644 index 0000000..d614b15 --- /dev/null +++ b/mpv/input.conf @@ -0,0 +1,5 @@ +l seek 5 +h seek -5 +j seek -60 +k seek 60 +S cycle sub diff --git a/mpv/mpv.conf b/mpv/mpv.conf new file mode 100644 index 0000000..a07490a --- /dev/null +++ b/mpv/mpv.conf @@ -0,0 +1,25 @@ +# Misc +osc=no +save-position-on-quit +stop-screensaver=yes +fullscreen +ytdl-format=bestvideo[height<=?1080][fps<=?30]+bestaudio/best +#Hardware acceleration +vo=gpu +gpu-api=vulkan +hwdec=nvdec +# Choose a gpu api other than vulkan +cscale=bilinear +# Look +border=no +cursor-autohide=1000 +# Cache +cache=yes +cache-default=999999 +demuxer-max-bytes=2147483648 +demuxer-max-back-bytes=2147483648 +# Audio +volume=100 +[extension.webm] +loop-file=inf +no-resume-playback diff --git a/mpv/script_modules/mpvSockets/LICENSE b/mpv/script_modules/mpvSockets/LICENSE new file mode 100644 index 0000000..c5551bb --- /dev/null +++ b/mpv/script_modules/mpvSockets/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Wis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mpv/script_modules/mpvSockets/README.md b/mpv/script_modules/mpvSockets/README.md new file mode 100644 index 0000000..9d3e1fb --- /dev/null +++ b/mpv/script_modules/mpvSockets/README.md @@ -0,0 +1,76 @@ +# mpvSockets +create one sockets per mpv instance (with the instance's process **ID** (PID), (**unique**)), instead of one socket for the last started instance + +dangling sockets for crashed or killed instances is an issue, +not sure if this script should handle/remove them or the clients/users, or both. + +# Installation +Download the single script file to your mpv-scripts-directory +## Linux / unixes: +``` bash +curl "https://raw.githubusercontent.com/wis/mpvSockets/master/mpvSockets.lua" --create-dirs -o "$Your_Mpv_Scripts_Directory_Location/mpvSockets.lua" +``` +if you're on Linux, most likely the location is `~/.config/mpv/scripts`, so run this before: +``` bash +$Your_Mpv_Scripts_Directory_Location=$HOME/config/mpv/scripts +``` +## Windows (untested) +powershell: +``` powershell +Invoke-WebRequest -OutFile "$env:LOCALAPPDATA\mpv\scripts\mpvSockets.lua" "https://raw.githubusercontent.com/wis/mpvSockets/master/mpvSockets.lua" +``` + +# Usage, with Mpv's [JSON IPC](https://github.com/mpv-player/mpv/blob/master/DOCS/man/ipc.rst) +## Linux / unixes (unix sockets): +a script that pauses all running mpv instances: +bash: +``` bash +#!/bin/bash +for i in $(ls /tmp/mpvSockets/*); do + echo '{ "command": ["set_property", "pause", true] }' | socat - "$i"; +done +# Socat is a command line based utility that establishes two bidirec-tional byte streams and transfers data between them. +# available on Linux and FreeBSD, propably most unixes. you can also use +``` + +## Windows (named pipes): +quote from https://mpv.io/manual/stable/#command-prompt-example +> Unfortunately, it's not as easy to test the IPC protocol on Windows, since Windows ports of socat (in Cygwin and MSYS2) don't understand named pipes. In the absence of a simple tool to send and receive from bidirectional pipes, the echo command can be used to send commands, but not receive replies from the command prompt. +> +> Assuming mpv was started with: +> +> `mpv file.mkv --input-ipc-server=\\.\pipe\mpvsocket` +> You can send commands from a command prompt: +> +> `echo show-text ${playback-time} >\\.\pipe\mpvsocket` +To be able to simultaneously read and write from the IPC pipe, like on Linux, it's necessary to write an external program that uses overlapped file I/O (or some wrapper like .NET's NamedPipeClientStream.) + +powershell client writer and reader (untested): +``` powershell +# socat.ps1 +# usage: socat.ps1 +$sockedName = args[0] +$message = args[1] + +$npipeClient = new-object System.IO.Pipes.NamedPipeClientStream('.', $socketName, [System.IO.Pipes.PipeDirection]::InOut, [System.IO.Pipes.PipeOptions]::None, [System.Security.Principal.TokenImpersonationLevel]::Impersonation) + +$pipeReader = $pipeWriter = $null +try { + $npipeClient.Connect() + $pipeReader = new-object System.IO.StreamReader($npipeClient) + $pipeWriter = new-object System.IO.StreamWriter($npipeClient) + $pipeWriter.AutoFlush = $true + + $pipeWriter.WriteLine($message) + + while (($data = $pipeReader.ReadLine()) -ne $null) { + $data + } +} +catch { + "An error occurred that could not be resolved." +} +finally { + $npipeClient.Dispose() +} +``` \ No newline at end of file diff --git a/mpv/script_modules/mpvSockets/mpvSockets.lua b/mpv/script_modules/mpvSockets/mpvSockets.lua new file mode 100644 index 0000000..df8d078 --- /dev/null +++ b/mpv/script_modules/mpvSockets/mpvSockets.lua @@ -0,0 +1,36 @@ +-- mpvSockets, one socket per instance, removes socket on exit + +local utils = require 'mp.utils' + +local function get_temp_path() + local directory_seperator = package.config:match("([^\n]*)\n?") + local example_temp_file_path = os.tmpname() + + -- remove generated temp file + pcall(os.remove, example_temp_file_path) + + local seperator_idx = example_temp_file_path:reverse():find(directory_seperator) + local temp_path_length = #example_temp_file_path - seperator_idx + + return example_temp_file_path:sub(1, temp_path_length) +end + +tempDir = get_temp_path() + +function join_paths(...) + local arg={...} + path = "" + for i,v in ipairs(arg) do + path = utils.join_path(path, tostring(v)) + end + return path; +end + +ppid = utils.getpid() +os.execute("mkdir " .. join_paths(tempDir, "mpvSockets") .. " 2>/dev/null") +mp.set_property("options/input-ipc-server", join_paths(tempDir, "mpvSockets", ppid)) + +function shutdown_handler() + os.remove(join_paths(tempDir, "mpvSockets", ppid)) +end +mp.register_event("shutdown", shutdown_handler) diff --git a/mpv/scripts/blacklist-extensions.lua b/mpv/scripts/blacklist-extensions.lua new file mode 100644 index 0000000..8b7045c --- /dev/null +++ b/mpv/scripts/blacklist-extensions.lua @@ -0,0 +1,78 @@ +opts = { + blacklist="", + whitelist="", + remove_files_without_extension = false, + oneshot = true, +} +(require 'mp.options').read_options(opts) +local msg = require 'mp.msg' + +function split(input) + local ret = {} + for str in string.gmatch(input, "([^,]+)") do + ret[#ret + 1] = str + end + return ret +end + +opts.blacklist = split(opts.blacklist) +opts.whitelist = split(opts.whitelist) + +local exclude +if #opts.whitelist > 0 then + exclude = function(extension) + for _, ext in pairs(opts.whitelist) do + if extension == ext then + return false + end + end + return true + end +elseif #opts.blacklist > 0 then + exclude = function(extension) + for _, ext in pairs(opts.blacklist) do + if extension == ext then + return true + end + end + return false + end +else + return +end + +function should_remove(filename) + if string.find(filename, "://") then + return false + end + local extension = string.match(filename, "%.([^./]+)$") + if not extension and opts.remove_file_without_extension then + return true + end + if extension and exclude(string.lower(extension)) then + return true + end + return false +end + +function process(playlist_count) + if playlist_count < 2 then return end + if opts.oneshot then + mp.unobserve_property(observe) + end + local playlist = mp.get_property_native("playlist") + local removed = 0 + for i = #playlist, 1, -1 do + if should_remove(playlist[i].filename) then + mp.commandv("playlist-remove", i-1) + removed = removed + 1 + end + end + if removed == #playlist then + msg.warn("Removed eveything from the playlist") + end +end + +function observe(k,v) process(v) end + +mp.observe_property("playlist-count", "number", observe) diff --git a/mpv/scripts/misc.lua b/mpv/scripts/misc.lua new file mode 100644 index 0000000..0df86fd --- /dev/null +++ b/mpv/scripts/misc.lua @@ -0,0 +1,87 @@ +function rotate(inc) + if (360 + inc) % 90 ~= 0 then + return + end + local vf_table = mp.get_property_native("vf") + local previous_angle = 0 + local rotation_index = #vf_table + 1 + if #vf_table ~= 0 and vf_table[#vf_table]["name"] == "rotate" then + rotation_index = #vf_table + previous_angle = vf_table[#vf_table]["params"]["angle"] + end + local new_angle = (previous_angle + 360 + inc) % 360 + if new_angle == 0 then + vf_table[rotation_index] = nil + else + vf_table[rotation_index] = { + name = "rotate", + params = { angle = tostring(new_angle) } + } + end + mp.set_property_native("vf", vf_table) +end + +function toggle(filter) + local vf_table = mp.get_property_native("vf") + if #vf_table ~= 0 and vf_table[#vf_table]["name"] == filter then + vf_table[#vf_table] = nil + else + vf_table[#vf_table + 1] = { name = filter } + end + mp.set_property_native("vf", vf_table) +end + +local filters_undo_stack = {} + +function remove_last_filter() + local vf_table = mp.get_property_native("vf") + if #vf_table == 0 then + return + end + filters_undo_stack[#filters_undo_stack + 1] = vf_table[#vf_table] + vf_table[#vf_table] = nil + mp.set_property_native("vf", vf_table) +end + +function undo_filter_removal() + if #filters_undo_stack == 0 then + return + end + local vf_table = mp.get_property_native("vf") + vf_table[#vf_table + 1] = filters_undo_stack[#filters_undo_stack] + filters_undo_stack[#filters_undo_stack] = nil + mp.set_property_native("vf", vf_table) +end + +function clear_filters() + local vf_table = mp.get_property_native("vf") + if #vf_table == 0 then + return + end + for i = 1, #vf_table do + filters_undo_stack[#filters_undo_stack + 1] = vf_table[#vf_table + 1 - i] + end + mp.set_property_native("vf", {}) +end + +function ab_loop(operation, timestamp) + if not mp.get_property("seekable") then return end + if timestamp ~= "a" and timestamp ~= "b" then return end + timestamp = "ab-loop-" .. timestamp + if operation == "set" then + mp.set_property_number(timestamp, mp.get_property_number("time-pos")) + elseif operation == "jump" then + local t = tonumber(mp.get_property(timestamp)) + if t then mp.set_property_number("time-pos", t) end + elseif operation == "clear" then + mp.set_property(timestamp, "no") + end +end + +mp.add_key_binding(nil, "rotate", rotate) +mp.add_key_binding(nil, "toggle-filter", toggle) +mp.add_key_binding(nil, "clear-filters", clear_filters) +mp.add_key_binding(nil, "remove-last-filter", remove_last_filter) +mp.add_key_binding(nil, "undo-filter-removal", undo_filter_removal) +mp.add_key_binding(nil, "ab-loop", ab_loop) + diff --git a/mpv/scripts/modules.lua b/mpv/scripts/modules.lua new file mode 100644 index 0000000..703f372 --- /dev/null +++ b/mpv/scripts/modules.lua @@ -0,0 +1,3 @@ +local mpv_config_dir_path = require("mp").command_native({"expand-path", "~~/"}) +function load(relative_path) dofile(mpv_config_dir_path .. "/script_modules/" .. relative_path) end +load("mpvSockets/mpvSockets.lua") diff --git a/mpv/scripts/mpv_thumbnail_script_client_osc.lua b/mpv/scripts/mpv_thumbnail_script_client_osc.lua new file mode 100644 index 0000000..475647f --- /dev/null +++ b/mpv/scripts/mpv_thumbnail_script_client_osc.lua @@ -0,0 +1,3886 @@ +--[[ + Copyright (C) 2017 AMM + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +]]-- +--[[ + mpv_thumbnail_script.lua 0.4.2 - commit 682becf (branch master) + https://github.com/TheAMM/mpv_thumbnail_script + Built on 2022-08-30 16:27:14 +]]-- +local assdraw = require 'mp.assdraw' +local msg = require 'mp.msg' +local opt = require 'mp.options' +local utils = require 'mp.utils' + +-- Determine platform -- +ON_WINDOWS = (package.config:sub(1,1) ~= '/') + +-- Some helper functions needed to parse the options -- +function isempty(v) return (v == false) or (v == nil) or (v == "") or (v == 0) or (type(v) == "table" and next(v) == nil) end + +function divmod (a, b) + return math.floor(a / b), a % b +end + +-- Better modulo +function bmod( i, N ) + return (i % N + N) % N +end + +function join_paths(...) + local sep = ON_WINDOWS and "\\" or "/" + local result = ""; + for i, p in pairs({...}) do + if p ~= "" then + if is_absolute_path(p) then + result = p + else + result = (result ~= "") and (result:gsub("[\\"..sep.."]*$", "") .. sep .. p) or p + end + end + end + return result:gsub("[\\"..sep.."]*$", "") +end + +-- /some/path/file.ext -> /some/path, file.ext +function split_path( path ) + local sep = ON_WINDOWS and "\\" or "/" + local first_index, last_index = path:find('^.*' .. sep) + + if last_index == nil then + return "", path + else + local dir = path:sub(0, last_index-1) + local file = path:sub(last_index+1, -1) + + return dir, file + end +end + +function is_absolute_path( path ) + local tmp, is_win = path:gsub("^[A-Z]:\\", "") + local tmp, is_unix = path:gsub("^/", "") + return (is_win > 0) or (is_unix > 0) +end + +function Set(source) + local set = {} + for _, l in ipairs(source) do set[l] = true end + return set +end + +--------------------------- +-- More helper functions -- +--------------------------- + +-- Removes all keys from a table, without destroying the reference to it +function clear_table(target) + for key, value in pairs(target) do + target[key] = nil + end +end +function shallow_copy(target) + local copy = {} + for k, v in pairs(target) do + copy[k] = v + end + return copy +end + +-- Rounds to given decimals. eg. round_dec(3.145, 0) => 3 +function round_dec(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +function file_exists(name) + local f = io.open(name, "rb") + if f ~= nil then + local ok, err, code = f:read(1) + io.close(f) + return code == nil + else + return false + end +end + +function path_exists(name) + local f = io.open(name, "rb") + if f ~= nil then + io.close(f) + return true + else + return false + end +end + +function create_directories(path) + local cmd + if ON_WINDOWS then + cmd = { args = {"cmd", "/c", "mkdir", path} } + else + cmd = { args = {"mkdir", "-p", path} } + end + utils.subprocess(cmd) +end + +-- Find an executable in PATH or CWD with the given name +function find_executable(name) + local delim = ON_WINDOWS and ";" or ":" + + local pwd = os.getenv("PWD") or utils.getcwd() + local path = os.getenv("PATH") + + local env_path = pwd .. delim .. path -- Check CWD first + + local result, filename + for path_dir in env_path:gmatch("[^"..delim.."]+") do + filename = join_paths(path_dir, name) + if file_exists(filename) then + result = filename + break + end + end + + return result +end + +local ExecutableFinder = { path_cache = {} } +-- Searches for an executable and caches the result if any +function ExecutableFinder:get_executable_path( name, raw_name ) + name = ON_WINDOWS and not raw_name and (name .. ".exe") or name + + if self.path_cache[name] == nil then + self.path_cache[name] = find_executable(name) or false + end + return self.path_cache[name] +end + +-- Format seconds to HH.MM.SS.sss +function format_time(seconds, sep, decimals) + decimals = decimals == nil and 3 or decimals + sep = sep and sep or "." + local s = seconds + local h, s = divmod(s, 60*60) + local m, s = divmod(s, 60) + + local second_format = string.format("%%0%d.%df", 2+(decimals > 0 and decimals+1 or 0), decimals) + + return string.format("%02d"..sep.."%02d"..sep..second_format, h, m, s) +end + +-- Format seconds to 1h 2m 3.4s +function format_time_hms(seconds, sep, decimals, force_full) + decimals = decimals == nil and 1 or decimals + sep = sep ~= nil and sep or " " + + local s = seconds + local h, s = divmod(s, 60*60) + local m, s = divmod(s, 60) + + if force_full or h > 0 then + return string.format("%dh"..sep.."%dm"..sep.."%." .. tostring(decimals) .. "fs", h, m, s) + elseif m > 0 then + return string.format("%dm"..sep.."%." .. tostring(decimals) .. "fs", m, s) + else + return string.format("%." .. tostring(decimals) .. "fs", s) + end +end + +-- Writes text on OSD and console +function log_info(txt, timeout) + timeout = timeout or 1.5 + msg.info(txt) + mp.osd_message(txt, timeout) +end + +-- Join table items, ala ({"a", "b", "c"}, "=", "-", ", ") => "=a-, =b-, =c-" +function join_table(source, before, after, sep) + before = before or "" + after = after or "" + sep = sep or ", " + local result = "" + for i, v in pairs(source) do + if not isempty(v) then + local part = before .. v .. after + if i == 1 then + result = part + else + result = result .. sep .. part + end + end + end + return result +end + +function wrap(s, char) + char = char or "'" + return char .. s .. char +end +-- Wraps given string into 'string' and escapes any 's in it +function escape_and_wrap(s, char, replacement) + char = char or "'" + replacement = replacement or "\\" .. char + return wrap(string.gsub(s, char, replacement), char) +end +-- Escapes single quotes in a string and wraps the input in single quotes +function escape_single_bash(s) + return escape_and_wrap(s, "'", "'\\''") +end + +-- Returns (a .. b) if b is not empty or nil +function joined_or_nil(a, b) + return not isempty(b) and (a .. b) or nil +end + +-- Put items from one table into another +function extend_table(target, source) + for i, v in pairs(source) do + table.insert(target, v) + end +end + +-- Creates a handle and filename for a temporary random file (in current directory) +function create_temporary_file(base, mode, suffix) + local handle, filename + suffix = suffix or "" + while true do + filename = base .. tostring(math.random(1, 5000)) .. suffix + handle = io.open(filename, "r") + if not handle then + handle = io.open(filename, mode) + break + end + io.close(handle) + end + return handle, filename +end + + +function get_processor_count() + local proc_count + + if ON_WINDOWS then + proc_count = tonumber(os.getenv("NUMBER_OF_PROCESSORS")) + else + local cpuinfo_handle = io.open("/proc/cpuinfo") + if cpuinfo_handle ~= nil then + local cpuinfo_contents = cpuinfo_handle:read("*a") + local _, replace_count = cpuinfo_contents:gsub('processor', '') + proc_count = replace_count + end + end + + if proc_count and proc_count > 0 then + return proc_count + else + return nil + end +end + +function substitute_values(string, values) + local substitutor = function(match) + if match == "%" then + return "%" + else + -- nil is discarded by gsub + return values[match] + end + end + + local substituted = string:gsub('%%(.)', substitutor) + return substituted +end + +-- ASS HELPERS -- +function round_rect_top( ass, x0, y0, x1, y1, r ) + local c = 0.551915024494 * r -- circle approximation + ass:move_to(x0 + r, y0) + ass:line_to(x1 - r, y0) -- top line + if r > 0 then + ass:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r) -- top right corner + end + ass:line_to(x1, y1) -- right line + ass:line_to(x0, y1) -- bottom line + ass:line_to(x0, y0 + r) -- left line + if r > 0 then + ass:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0) -- top left corner + end +end + +function round_rect(ass, x0, y0, x1, y1, rtl, rtr, rbr, rbl) + local c = 0.551915024494 + ass:move_to(x0 + rtl, y0) + ass:line_to(x1 - rtr, y0) -- top line + if rtr > 0 then + ass:bezier_curve(x1 - rtr + rtr*c, y0, x1, y0 + rtr - rtr*c, x1, y0 + rtr) -- top right corner + end + ass:line_to(x1, y1 - rbr) -- right line + if rbr > 0 then + ass:bezier_curve(x1, y1 - rbr + rbr*c, x1 - rbr + rbr*c, y1, x1 - rbr, y1) -- bottom right corner + end + ass:line_to(x0 + rbl, y1) -- bottom line + if rbl > 0 then + ass:bezier_curve(x0 + rbl - rbl*c, y1, x0, y1 - rbl + rbl*c, x0, y1 - rbl) -- bottom left corner + end + ass:line_to(x0, y0 + rtl) -- left line + if rtl > 0 then + ass:bezier_curve(x0, y0 + rtl - rtl*c, x0 + rtl - rtl*c, y0, x0 + rtl, y0) -- top left corner + end +end +-- $Revision: 1.5 $ +-- $Date: 2014-09-10 16:54:25 $ + +-- This module was originally taken from http://cube3d.de/uploads/Main/sha1.txt. + +------------------------------------------------------------------------------- +-- SHA-1 secure hash computation, and HMAC-SHA1 signature computation, +-- in pure Lua (tested on Lua 5.1) +-- License: MIT +-- +-- Usage: +-- local hashAsHex = sha1.hex(message) -- returns a hex string +-- local hashAsData = sha1.bin(message) -- returns raw bytes +-- +-- local hmacAsHex = sha1.hmacHex(key, message) -- hex string +-- local hmacAsData = sha1.hmacBin(key, message) -- raw bytes +-- +-- +-- Pass sha1.hex() a string, and it returns a hash as a 40-character hex string. +-- For example, the call +-- +-- local hash = sha1.hex("iNTERFACEWARE") +-- +-- puts the 40-character string +-- +-- "e76705ffb88a291a0d2f9710a5471936791b4819" +-- +-- into the variable 'hash' +-- +-- Pass sha1.hmacHex() a key and a message, and it returns the signature as a +-- 40-byte hex string. +-- +-- +-- The two "bin" versions do the same, but return the 20-byte string of raw +-- data that the 40-byte hex strings represent. +-- +------------------------------------------------------------------------------- +-- +-- Description +-- Due to the lack of bitwise operations in 5.1, this version uses numbers to +-- represents the 32bit words that we combine with binary operations. The basic +-- operations of byte based "xor", "or", "and" are all cached in a combination +-- table (several 64k large tables are built on startup, which +-- consumes some memory and time). The caching can be switched off through +-- setting the local cfg_caching variable to false. +-- For all binary operations, the 32 bit numbers are split into 8 bit values +-- that are combined and then merged again. +-- +-- Algorithm: http://www.itl.nist.gov/fipspubs/fip180-1.htm +-- +------------------------------------------------------------------------------- + +local sha1 = (function() +local sha1 = {} + +-- set this to false if you don't want to build several 64k sized tables when +-- loading this file (takes a while but grants a boost of factor 13) +local cfg_caching = false +-- local storing of global functions (minor speedup) +local floor,modf = math.floor,math.modf +local char,format,rep = string.char,string.format,string.rep + +-- merge 4 bytes to an 32 bit word +local function bytes_to_w32 (a,b,c,d) return a*0x1000000+b*0x10000+c*0x100+d end +-- split a 32 bit word into four 8 bit numbers +local function w32_to_bytes (i) + return floor(i/0x1000000)%0x100,floor(i/0x10000)%0x100,floor(i/0x100)%0x100,i%0x100 +end + +-- shift the bits of a 32 bit word. Don't use negative values for "bits" +local function w32_rot (bits,a) + local b2 = 2^(32-bits) + local a,b = modf(a/b2) + return a+b*b2*(2^(bits)) +end + +-- caching function for functions that accept 2 arguments, both of values between +-- 0 and 255. The function to be cached is passed, all values are calculated +-- during loading and a function is returned that returns the cached values (only) +local function cache2arg (fn) + if not cfg_caching then return fn end + local lut = {} + for i=0,0xffff do + local a,b = floor(i/0x100),i%0x100 + lut[i] = fn(a,b) + end + return function (a,b) + return lut[a*0x100+b] + end +end + +-- splits an 8-bit number into 8 bits, returning all 8 bits as booleans +local function byte_to_bits (b) + local b = function (n) + local b = floor(b/n) + return b%2==1 + end + return b(1),b(2),b(4),b(8),b(16),b(32),b(64),b(128) +end + +-- builds an 8bit number from 8 booleans +local function bits_to_byte (a,b,c,d,e,f,g,h) + local function n(b,x) return b and x or 0 end + return n(a,1)+n(b,2)+n(c,4)+n(d,8)+n(e,16)+n(f,32)+n(g,64)+n(h,128) +end + +-- debug function for visualizing bits in a string +local function bits_to_string (a,b,c,d,e,f,g,h) + local function x(b) return b and "1" or "0" end + return ("%s%s%s%s %s%s%s%s"):format(x(a),x(b),x(c),x(d),x(e),x(f),x(g),x(h)) +end + +-- debug function for converting a 8-bit number as bit string +local function byte_to_bit_string (b) + return bits_to_string(byte_to_bits(b)) +end + +-- debug function for converting a 32 bit number as bit string +local function w32_to_bit_string(a) + if type(a) == "string" then return a end + local aa,ab,ac,ad = w32_to_bytes(a) + local s = byte_to_bit_string + return ("%s %s %s %s"):format(s(aa):reverse(),s(ab):reverse(),s(ac):reverse(),s(ad):reverse()):reverse() +end + +-- bitwise "and" function for 2 8bit number +local band = cache2arg (function(a,b) + local A,B,C,D,E,F,G,H = byte_to_bits(b) + local a,b,c,d,e,f,g,h = byte_to_bits(a) + return bits_to_byte( + A and a, B and b, C and c, D and d, + E and e, F and f, G and g, H and h) + end) + +-- bitwise "or" function for 2 8bit numbers +local bor = cache2arg(function(a,b) + local A,B,C,D,E,F,G,H = byte_to_bits(b) + local a,b,c,d,e,f,g,h = byte_to_bits(a) + return bits_to_byte( + A or a, B or b, C or c, D or d, + E or e, F or f, G or g, H or h) + end) + +-- bitwise "xor" function for 2 8bit numbers +local bxor = cache2arg(function(a,b) + local A,B,C,D,E,F,G,H = byte_to_bits(b) + local a,b,c,d,e,f,g,h = byte_to_bits(a) + return bits_to_byte( + A ~= a, B ~= b, C ~= c, D ~= d, + E ~= e, F ~= f, G ~= g, H ~= h) + end) + +-- bitwise complement for one 8bit number +local function bnot (x) + return 255-(x % 256) +end + +-- creates a function to combine to 32bit numbers using an 8bit combination function +local function w32_comb(fn) + return function (a,b) + local aa,ab,ac,ad = w32_to_bytes(a) + local ba,bb,bc,bd = w32_to_bytes(b) + return bytes_to_w32(fn(aa,ba),fn(ab,bb),fn(ac,bc),fn(ad,bd)) + end +end + +-- create functions for and, xor and or, all for 2 32bit numbers +local w32_and = w32_comb(band) +local w32_xor = w32_comb(bxor) +local w32_or = w32_comb(bor) + +-- xor function that may receive a variable number of arguments +local function w32_xor_n (a,...) + local aa,ab,ac,ad = w32_to_bytes(a) + for i=1,select('#',...) do + local ba,bb,bc,bd = w32_to_bytes(select(i,...)) + aa,ab,ac,ad = bxor(aa,ba),bxor(ab,bb),bxor(ac,bc),bxor(ad,bd) + end + return bytes_to_w32(aa,ab,ac,ad) +end + +-- combining 3 32bit numbers through binary "or" operation +local function w32_or3 (a,b,c) + local aa,ab,ac,ad = w32_to_bytes(a) + local ba,bb,bc,bd = w32_to_bytes(b) + local ca,cb,cc,cd = w32_to_bytes(c) + return bytes_to_w32( + bor(aa,bor(ba,ca)), bor(ab,bor(bb,cb)), bor(ac,bor(bc,cc)), bor(ad,bor(bd,cd)) + ) +end + +-- binary complement for 32bit numbers +local function w32_not (a) + return 4294967295-(a % 4294967296) +end + +-- adding 2 32bit numbers, cutting off the remainder on 33th bit +local function w32_add (a,b) return (a+b) % 4294967296 end + +-- adding n 32bit numbers, cutting off the remainder (again) +local function w32_add_n (a,...) + for i=1,select('#',...) do + a = (a+select(i,...)) % 4294967296 + end + return a +end +-- converting the number to a hexadecimal string +local function w32_to_hexstring (w) return format("%08x",w) end + +-- calculating the SHA1 for some text +function sha1.hex(msg) + local H0,H1,H2,H3,H4 = 0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,0xC3D2E1F0 + local msg_len_in_bits = #msg * 8 + + local first_append = char(0x80) -- append a '1' bit plus seven '0' bits + + local non_zero_message_bytes = #msg +1 +8 -- the +1 is the appended bit 1, the +8 are for the final appended length + local current_mod = non_zero_message_bytes % 64 + local second_append = current_mod>0 and rep(char(0), 64 - current_mod) or "" + + -- now to append the length as a 64-bit number. + local B1, R1 = modf(msg_len_in_bits / 0x01000000) + local B2, R2 = modf( 0x01000000 * R1 / 0x00010000) + local B3, R3 = modf( 0x00010000 * R2 / 0x00000100) + local B4 = 0x00000100 * R3 + + local L64 = char( 0) .. char( 0) .. char( 0) .. char( 0) -- high 32 bits + .. char(B1) .. char(B2) .. char(B3) .. char(B4) -- low 32 bits + + msg = msg .. first_append .. second_append .. L64 + + assert(#msg % 64 == 0) + + local chunks = #msg / 64 + + local W = { } + local start, A, B, C, D, E, f, K, TEMP + local chunk = 0 + + while chunk < chunks do + -- + -- break chunk up into W[0] through W[15] + -- + start,chunk = chunk * 64 + 1,chunk + 1 + + for t = 0, 15 do + W[t] = bytes_to_w32(msg:byte(start, start + 3)) + start = start + 4 + end + + -- + -- build W[16] through W[79] + -- + for t = 16, 79 do + -- For t = 16 to 79 let Wt = S1(Wt-3 XOR Wt-8 XOR Wt-14 XOR Wt-16). + W[t] = w32_rot(1, w32_xor_n(W[t-3], W[t-8], W[t-14], W[t-16])) + end + + A,B,C,D,E = H0,H1,H2,H3,H4 + + for t = 0, 79 do + if t <= 19 then + -- (B AND C) OR ((NOT B) AND D) + f = w32_or(w32_and(B, C), w32_and(w32_not(B), D)) + K = 0x5A827999 + elseif t <= 39 then + -- B XOR C XOR D + f = w32_xor_n(B, C, D) + K = 0x6ED9EBA1 + elseif t <= 59 then + -- (B AND C) OR (B AND D) OR (C AND D + f = w32_or3(w32_and(B, C), w32_and(B, D), w32_and(C, D)) + K = 0x8F1BBCDC + else + -- B XOR C XOR D + f = w32_xor_n(B, C, D) + K = 0xCA62C1D6 + end + + -- TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt; + A,B,C,D,E = w32_add_n(w32_rot(5, A), f, E, W[t], K), + A, w32_rot(30, B), C, D + end + -- Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E. + H0,H1,H2,H3,H4 = w32_add(H0, A),w32_add(H1, B),w32_add(H2, C),w32_add(H3, D),w32_add(H4, E) + end + local f = w32_to_hexstring + return f(H0) .. f(H1) .. f(H2) .. f(H3) .. f(H4) +end + +local function hex_to_binary(hex) + return hex:gsub('..', function(hexval) + return string.char(tonumber(hexval, 16)) + end) +end + +function sha1.bin(msg) + return hex_to_binary(sha1.hex(msg)) +end + +local xor_with_0x5c = {} +local xor_with_0x36 = {} +-- building the lookuptables ahead of time (instead of littering the source code +-- with precalculated values) +for i=0,0xff do + xor_with_0x5c[char(i)] = char(bxor(i,0x5c)) + xor_with_0x36[char(i)] = char(bxor(i,0x36)) +end + +local blocksize = 64 -- 512 bits + +function sha1.hmacHex(key, text) + assert(type(key) == 'string', "key passed to hmacHex should be a string") + assert(type(text) == 'string', "text passed to hmacHex should be a string") + + if #key > blocksize then + key = sha1.bin(key) + end + + local key_xord_with_0x36 = key:gsub('.', xor_with_0x36) .. string.rep(string.char(0x36), blocksize - #key) + local key_xord_with_0x5c = key:gsub('.', xor_with_0x5c) .. string.rep(string.char(0x5c), blocksize - #key) + + return sha1.hex(key_xord_with_0x5c .. sha1.bin(key_xord_with_0x36 .. text)) +end + +function sha1.hmacBin(key, text) + return hex_to_binary(sha1.hmacHex(key, text)) +end + +return sha1 +end)() + +local SCRIPT_NAME = "mpv_thumbnail_script" + +local default_cache_base = ON_WINDOWS and os.getenv("TEMP") or "/tmp/" + +local thumbnailer_options = { + -- The thumbnail directory + cache_directory = join_paths(default_cache_base, "mpv_thumbs_cache"), + + ------------------------ + -- Generation options -- + ------------------------ + + -- Automatically generate the thumbnails on video load, without a keypress + autogenerate = true, + + -- Only automatically thumbnail videos shorter than this (seconds) + autogenerate_max_duration = 3600, -- 1 hour + + -- SHA1-sum filenames over this length + -- It's nice to know what files the thumbnails are (hence directory names) + -- but long URLs may approach filesystem limits. + hash_filename_length = 128, + + -- Use mpv to generate thumbnail even if ffmpeg is found in PATH + -- ffmpeg does not handle ordered chapters (MKVs which rely on other MKVs)! + -- mpv is a bit slower, but has better support overall (eg. subtitles in the previews) + prefer_mpv = true, + + -- Explicitly disable subtitles on the mpv sub-calls + mpv_no_sub = false, + -- Add a "--no-config" to the mpv sub-call arguments + mpv_no_config = false, + -- Add a "--profile=" to the mpv sub-call arguments + -- Use "" to disable + mpv_profile = "", + -- Output debug logs to .log, ala //000000.bgra.log + -- The logs are removed after successful encodes, unless you set mpv_keep_logs below + mpv_logs = true, + -- Keep all mpv logs, even the succesfull ones + mpv_keep_logs = false, + + -- Disable the built-in keybind ("T") to add your own + disable_keybinds = false, + + --------------------- + -- Display options -- + --------------------- + + -- Move the thumbnail up or down + -- For example: + -- topbar/bottombar: 24 + -- rest: 0 + vertical_offset = 24, + + -- Adjust background padding + -- Examples: + -- topbar: 0, 10, 10, 10 + -- bottombar: 10, 0, 10, 10 + -- slimbox/box: 10, 10, 10, 10 + pad_top = 10, + pad_bot = 0, + pad_left = 10, + pad_right = 10, + + -- If true, pad values are screen-pixels. If false, video-pixels. + pad_in_screenspace = true, + -- Calculate pad into the offset + offset_by_pad = true, + + -- Background color in BBGGRR + background_color = "000000", + -- Alpha: 0 - fully opaque, 255 - transparent + background_alpha = 80, + + -- Keep thumbnail on the screen near left or right side + constrain_to_screen = true, + + -- Do not display the thumbnailing progress + hide_progress = false, + + ----------------------- + -- Thumbnail options -- + ----------------------- + + -- The maximum dimensions of the thumbnails (pixels) + thumbnail_width = 200, + thumbnail_height = 200, + + -- The thumbnail count target + -- (This will result in a thumbnail every ~10 seconds for a 25 minute video) + thumbnail_count = 150, + + -- The above target count will be adjusted by the minimum and + -- maximum time difference between thumbnails. + -- The thumbnail_count will be used to calculate a target separation, + -- and min/max_delta will be used to constrict it. + + -- In other words, thumbnails will be: + -- at least min_delta seconds apart (limiting the amount) + -- at most max_delta seconds apart (raising the amount if needed) + min_delta = 5, + -- 120 seconds aka 2 minutes will add more thumbnails when the video is over 5 hours! + max_delta = 90, + + + -- Overrides for remote urls (you generally want less thumbnails!) + -- Thumbnailing network paths will be done with mpv + + -- Allow thumbnailing network paths (naive check for "://") + thumbnail_network = false, + -- Override thumbnail count, min/max delta + remote_thumbnail_count = 60, + remote_min_delta = 15, + remote_max_delta = 120, + + -- Try to grab the raw stream and disable ytdl for the mpv subcalls + -- Much faster than passing the url to ytdl again, but may cause problems with some sites + remote_direct_stream = true, +} + +read_options(thumbnailer_options, SCRIPT_NAME) +local Thumbnailer = { + cache_directory = thumbnailer_options.cache_directory, + + state = { + ready = false, + available = false, + enabled = false, + + thumbnail_template = nil, + + thumbnail_delta = nil, + thumbnail_count = 0, + + thumbnail_size = nil, + + finished_thumbnails = 0, + + -- List of thumbnail states (from 1 to thumbnail_count) + -- ready: 1 + -- in progress: 0 + -- not ready: -1 + thumbnails = {}, + + worker_input_path = nil, + -- Extra options for the workers + worker_extra = {}, + }, + -- Set in register_client + worker_register_timeout = nil, + -- A timer used to wait for more workers in case we have none + worker_wait_timer = nil, + workers = {} +} + +function Thumbnailer:clear_state() + clear_table(self.state) + self.state.ready = false + self.state.available = false + self.state.finished_thumbnails = 0 + self.state.thumbnails = {} + self.state.worker_extra = {} +end + + +function Thumbnailer:on_file_loaded() + self:clear_state() +end + +function Thumbnailer:on_thumb_ready(index) + self.state.thumbnails[index] = 1 + + -- Full recount instead of a naive increment (let's be safe!) + self.state.finished_thumbnails = 0 + for i, v in pairs(self.state.thumbnails) do + if v > 0 then + self.state.finished_thumbnails = self.state.finished_thumbnails + 1 + end + end +end + +function Thumbnailer:on_thumb_progress(index) + self.state.thumbnails[index] = math.max(self.state.thumbnails[index], 0) +end + +function Thumbnailer:on_start_file() + -- Clear state when a new file is being loaded + self:clear_state() +end + +function Thumbnailer:on_video_change(params) + -- Gather a new state when we get proper video-dec-params and our state is empty + if params ~= nil then + if not self.state.ready then + self:update_state() + end + end +end + + +function Thumbnailer:update_state() + msg.debug("Gathering video/thumbnail state") + + self.state.thumbnail_delta = self:get_delta() + self.state.thumbnail_count = self:get_thumbnail_count(self.state.thumbnail_delta) + + -- Prefill individual thumbnail states + for i = 1, self.state.thumbnail_count do + self.state.thumbnails[i] = -1 + end + + self.state.thumbnail_template, self.state.thumbnail_directory = self:get_thumbnail_template() + self.state.thumbnail_size = self:get_thumbnail_size() + + self.state.ready = true + + local file_path = mp.get_property_native("path") + self.state.is_remote = file_path:find("://") ~= nil + + self.state.available = false + + -- Make sure the file has video (and not just albumart) + local track_list = mp.get_property_native("track-list") + local has_video = false + for i, track in pairs(track_list) do + if track.type == "video" and not track.external and not track.albumart then + has_video = true + break + end + end + + if has_video and self.state.thumbnail_delta ~= nil and self.state.thumbnail_size ~= nil and self.state.thumbnail_count > 0 then + self.state.available = true + end + + msg.debug("Thumbnailer.state:", utils.to_string(self.state)) + +end + + +function Thumbnailer:get_thumbnail_template() + local file_path = mp.get_property_native("path") + local is_remote = file_path:find("://") ~= nil + + local filename = mp.get_property_native("filename/no-ext") + local filesize = mp.get_property_native("file-size", 0) + + if is_remote then + filesize = 0 + end + + filename = filename:gsub('[^a-zA-Z0-9_.%-\' ]', '') + -- Hash overly long filenames (most likely URLs) + if #filename > thumbnailer_options.hash_filename_length then + filename = sha1.hex(filename) + end + + local file_key = ("%s-%d"):format(filename, filesize) + + local thumbnail_directory = join_paths(self.cache_directory, file_key) + local file_template = join_paths(thumbnail_directory, "%06d.bgra") + return file_template, thumbnail_directory +end + + +function Thumbnailer:get_thumbnail_size() + local video_dec_params = mp.get_property_native("video-dec-params") + local video_width = video_dec_params.dw + local video_height = video_dec_params.dh + if not (video_width and video_height) then + return nil + end + + local w, h + if video_width > video_height then + w = thumbnailer_options.thumbnail_width + h = math.floor(video_height * (w / video_width)) + else + h = thumbnailer_options.thumbnail_height + w = math.floor(video_width * (h / video_height)) + end + return { w=w, h=h } +end + + +function Thumbnailer:get_delta() + local file_path = mp.get_property_native("path") + local file_duration = mp.get_property_native("duration") + local is_seekable = mp.get_property_native("seekable") + + -- Naive url check + local is_remote = file_path:find("://") ~= nil + + local remote_and_disallowed = is_remote + if is_remote and thumbnailer_options.thumbnail_network then + remote_and_disallowed = false + end + + if remote_and_disallowed or not is_seekable or not file_duration then + -- Not a local path (or remote thumbnails allowed), not seekable or lacks duration + return nil + end + + local thumbnail_count = thumbnailer_options.thumbnail_count + local min_delta = thumbnailer_options.min_delta + local max_delta = thumbnailer_options.max_delta + + if is_remote then + thumbnail_count = thumbnailer_options.remote_thumbnail_count + min_delta = thumbnailer_options.remote_min_delta + max_delta = thumbnailer_options.remote_max_delta + end + + local target_delta = (file_duration / thumbnail_count) + local delta = math.max(min_delta, math.min(max_delta, target_delta)) + + return delta +end + + +function Thumbnailer:get_thumbnail_count(delta) + if delta == nil then + return 0 + end + local file_duration = mp.get_property_native("duration") + + return math.ceil(file_duration / delta) +end + +function Thumbnailer:get_closest(thumbnail_index) + -- Given a 1-based index, find the closest available thumbnail and return it's 1-based index + + -- Check the direct thumbnail index first + if self.state.thumbnails[thumbnail_index] > 0 then + return thumbnail_index + end + + local min_distance = self.state.thumbnail_count + 1 + local closest = nil + + -- Naive, inefficient, lazy. But functional. + for index, value in pairs(self.state.thumbnails) do + local distance = math.abs(index - thumbnail_index) + if distance < min_distance and value > 0 then + min_distance = distance + closest = index + end + end + return closest +end + +function Thumbnailer:get_thumbnail_index(time_position) + -- Returns a 1-based thumbnail index for the given timestamp (between 1 and thumbnail_count, inclusive) + if self.state.thumbnail_delta and (self.state.thumbnail_count and self.state.thumbnail_count > 0) then + return math.min(math.floor(time_position / self.state.thumbnail_delta) + 1, self.state.thumbnail_count) + else + return nil + end +end + +function Thumbnailer:get_thumbnail_path(time_position) + -- Given a timestamp, return: + -- the closest available thumbnail path (if any) + -- the 1-based thumbnail index calculated from the timestamp + -- the 1-based thumbnail index of the closest available (and used) thumbnail + -- OR nil if thumbnails are not available. + + local thumbnail_index = self:get_thumbnail_index(time_position) + if not thumbnail_index then return nil end + + local closest = self:get_closest(thumbnail_index) + + if closest ~= nil then + return self.state.thumbnail_template:format(closest-1), thumbnail_index, closest + else + return nil, thumbnail_index, nil + end +end + +function Thumbnailer:register_client() + self.worker_register_timeout = mp.get_time() + 2 + + mp.register_script_message("mpv_thumbnail_script-ready", function(index, path) + self:on_thumb_ready(tonumber(index), path) + end) + mp.register_script_message("mpv_thumbnail_script-progress", function(index, path) + self:on_thumb_progress(tonumber(index), path) + end) + + mp.register_script_message("mpv_thumbnail_script-worker", function(worker_name) + if not self.workers[worker_name] then + msg.debug("Registered worker", worker_name) + self.workers[worker_name] = true + mp.commandv("script-message-to", worker_name, "mpv_thumbnail_script-slaved") + end + end) + + -- Notify workers to generate thumbnails when video loads/changes + -- This will be executed after the on_video_change (because it's registered after it) + mp.observe_property("video-dec-params", "native", function() + local duration = mp.get_property_native("duration") + local max_duration = thumbnailer_options.autogenerate_max_duration + + if duration ~= nil and self.state.available and thumbnailer_options.autogenerate then + -- Notify if autogenerate is on and video is not too long + if duration < max_duration or max_duration == 0 then + self:start_worker_jobs() + end + end + end) + + local thumb_script_key = not thumbnailer_options.disable_keybinds and "T" or nil + mp.add_key_binding(thumb_script_key, "generate-thumbnails", function() + if self.state.available then + mp.osd_message("Started thumbnailer jobs") + self:start_worker_jobs() + else + mp.osd_message("Thumbnailing unavailabe") + end + end) +end + +function Thumbnailer:_create_thumbnail_job_order() + -- Returns a list of 1-based thumbnail indices in a job order + local used_frames = {} + local work_frames = {} + + -- Pick frames in increasing frequency. + -- This way we can do a quick few passes over the video and then fill in the gaps. + for x = 6, 0, -1 do + local nth = (2^x) + + for thi = 1, self.state.thumbnail_count, nth do + if not used_frames[thi] then + table.insert(work_frames, thi) + used_frames[thi] = true + end + end + end + return work_frames +end + +function Thumbnailer:prepare_source_path() + local file_path = mp.get_property_native("path") + + if self.state.is_remote and thumbnailer_options.remote_direct_stream then + -- Use the direct stream (possibly) provided by ytdl + -- This skips ytdl on the sub-calls, making the thumbnailing faster + -- Works well on YouTube, rest not really tested + file_path = mp.get_property_native("stream-path") + + -- edl:// urls can get LONG. In which case, save the path (URL) + -- to a temporary file and use that instead. + local playlist_filename = join_paths(self.state.thumbnail_directory, "playlist.txt") + + if #file_path > 8000 then + -- Path is too long for a playlist - just pass the original URL to + -- workers and allow ytdl + self.state.worker_extra.enable_ytdl = true + file_path = mp.get_property_native("path") + msg.warn("Falling back to original URL and ytdl due to LONG source path. This will be slow.") + + elseif #file_path > 1024 then + local playlist_file = io.open(playlist_filename, "wb") + if not playlist_file then + msg.error(("Tried to write a playlist to %s but couldn't!"):format(playlist_file)) + return false + end + + playlist_file:write(file_path .. "\n") + playlist_file:close() + + file_path = "--playlist=" .. playlist_filename + msg.warn("Using playlist workaround due to long source path") + end + end + + self.state.worker_input_path = file_path + return true +end + +function Thumbnailer:start_worker_jobs() + -- Create directory for the thumbnails, if needed + local l, err = utils.readdir(self.state.thumbnail_directory) + if err then + msg.debug("Creating thumbnail directory", self.state.thumbnail_directory) + create_directories(self.state.thumbnail_directory) + end + + -- Try to prepare the source path for workers, and bail if unable to do so + if not self:prepare_source_path() then + return + end + + local worker_list = {} + for worker_name in pairs(self.workers) do table.insert(worker_list, worker_name) end + + local worker_count = #worker_list + + -- In case we have a worker timer created already, clear it + -- (For example, if the video-dec-params change in quick succession or the user pressed T, etc) + if self.worker_wait_timer then + self.worker_wait_timer:stop() + end + + if worker_count == 0 then + local now = mp.get_time() + if mp.get_time() > self.worker_register_timeout then + -- Workers have had their time to register but we have none! + local err = "No thumbnail workers found. Make sure you are not missing a script!" + msg.error(err) + mp.osd_message(err, 3) + + else + -- We may be too early. Delay the work start a bit to try again. + msg.warn("No workers found. Waiting a bit more for them.") + -- Wait at least half a second + local wait_time = math.max(self.worker_register_timeout - now, 0.5) + self.worker_wait_timer = mp.add_timeout(wait_time, function() self:start_worker_jobs() end) + end + + else + -- We have at least one worker. This may not be all of them, but they have had + -- their time to register; we've done our best waiting for them. + self.state.enabled = true + + msg.debug( ("Splitting %d thumbnails amongst %d worker(s)"):format(self.state.thumbnail_count, worker_count) ) + + local frame_job_order = self:_create_thumbnail_job_order() + local worker_jobs = {} + for i = 1, worker_count do worker_jobs[worker_list[i]] = {} end + + -- Split frames amongst the workers + for i, thumbnail_index in ipairs(frame_job_order) do + local worker_id = worker_list[ ((i-1) % worker_count) + 1 ] + table.insert(worker_jobs[worker_id], thumbnail_index) + end + + local state_json_string = utils.format_json(self.state) + msg.debug("Giving workers state:", state_json_string) + + for worker_name, worker_frames in pairs(worker_jobs) do + if #worker_frames > 0 then + local frames_json_string = utils.format_json(worker_frames) + msg.debug("Assigning job to", worker_name, frames_json_string) + mp.commandv("script-message-to", worker_name, "mpv_thumbnail_script-job", state_json_string, frames_json_string) + end + end + end +end + +mp.register_event("start-file", function() Thumbnailer:on_start_file() end) +mp.observe_property("video-dec-params", "native", function(name, params) Thumbnailer:on_video_change(params) end) +--[[ +This is mpv's original player/lua/osc.lua patched to display thumbnails + +Sections are denoted with -- mpv_thumbnail_script.lua -- +Current osc.lua version: 97816bbef0f97cfda7abdbe560707481d5f68ccd +]]-- + +local assdraw = require 'mp.assdraw' +local msg = require 'mp.msg' +local opt = require 'mp.options' +local utils = require 'mp.utils' + + +-- +-- Parameters +-- + +-- default user option values +-- do not touch, change them in osc.conf +local user_opts = { + showwindowed = true, -- show OSC when windowed? + showfullscreen = true, -- show OSC when fullscreen? + scalewindowed = 1, -- scaling of the controller when windowed + scalefullscreen = 1, -- scaling of the controller when fullscreen + scaleforcedwindow = 2, -- scaling when rendered on a forced window + vidscale = true, -- scale the controller with the video? + valign = 0.8, -- vertical alignment, -1 (top) to 1 (bottom) + halign = 0, -- horizontal alignment, -1 (left) to 1 (right) + barmargin = 0, -- vertical margin of top/bottombar + boxalpha = 80, -- alpha of the background box, + -- 0 (opaque) to 255 (fully transparent) + hidetimeout = 500, -- duration in ms until the OSC hides if no + -- mouse movement. enforced non-negative for the + -- user, but internally negative is "always-on". + fadeduration = 200, -- duration of fade out in ms, 0 = no fade + deadzonesize = 0.5, -- size of deadzone + minmousemove = 0, -- minimum amount of pixels the mouse has to + -- move between ticks to make the OSC show up + iamaprogrammer = false, -- use native mpv values and disable OSC + -- internal track list management (and some + -- functions that depend on it) + layout = "bottombar", + seekbarstyle = "bar", -- slider (diamond marker), knob (circle + -- marker with guide), or bar (fill) + title = "${media-title}", -- string compatible with property-expansion + -- to be shown as OSC title + tooltipborder = 1, -- border of tooltip in bottom/topbar + timetotal = false, -- display total time instead of remaining time? + timems = false, -- display timecodes with milliseconds? + seekranges = true, -- display seek ranges? + visibility = "auto", -- only used at init to set visibility_mode(...) + boxmaxchars = 80, -- title crop threshold for box layout +} + +-- read_options may modify hidetimeout, so save the original default value in +-- case the user set hidetimeout < 0 and we need the default instead. +local hidetimeout_def = user_opts.hidetimeout +-- read options from config and command-line +opt.read_options(user_opts, "osc") +if user_opts.hidetimeout < 0 then + user_opts.hidetimeout = hidetimeout_def + msg.warn("hidetimeout cannot be negative. Using " .. user_opts.hidetimeout) +end + + +-- mpv_thumbnail_script.lua -- + +-- Patch in msg.trace +if not msg.trace then + msg.trace = function(...) return mp.log("trace", ...) end +end + +-- Patch in utils.format_bytes_humanized +if not utils.format_bytes_humanized then + utils.format_bytes_humanized = function(b) + local d = {"Bytes", "KiB", "MiB", "GiB", "TiB", "PiB"} + local i = 1 + while b >= 1024 do + b = b / 1024 + i = i + 1 + end + return string.format("%0.2f %s", b, d[i] and d[i] or "*1024^" .. (i-1)) + end +end + +Thumbnailer:register_client() + +function get_thumbnail_y_offset(thumb_size, msy) + local layout = user_opts.layout + local offset = 0 + + if layout == "bottombar" then + offset = 15 --+ margin + elseif layout == "topbar" then + offset = -(thumb_size.h * msy + 15) + elseif layout == "box" then + offset = 15 + elseif layout == "slimbox" then + offset = 12 + end + + return offset / msy +end + + +local osc_thumb_state = { + visible = false, + overlay_id = 1, + + last_path = nil, + last_x = nil, + last_y = nil, +} + +function hide_thumbnail() + osc_thumb_state.visible = false + osc_thumb_state.last_path = nil + mp.command_native({ "overlay-remove", osc_thumb_state.overlay_id }) +end + +function display_thumbnail(pos, value, ass) + -- If thumbnails are not available, bail + if not (Thumbnailer.state.enabled and Thumbnailer.state.available) then + return + end + + local duration = mp.get_property_number("duration", nil) + if not ((duration == nil) or (value == nil)) then + target_position = duration * (value / 100) + + local msx, msy = get_virt_scale_factor() + local osd_w, osd_h = mp.get_osd_size() + + local thumb_size = Thumbnailer.state.thumbnail_size + local thumb_path, thumb_index, closest_index = Thumbnailer:get_thumbnail_path(target_position) + + local thumbs_ready = Thumbnailer.state.finished_thumbnails + local thumbs_total = Thumbnailer.state.thumbnail_count + local perc = math.floor((thumbs_ready / thumbs_total) * 100) + + local display_progress = thumbs_ready ~= thumbs_total and not thumbnailer_options.hide_progress + + local vertical_offset = thumbnailer_options.vertical_offset + local padding = thumbnailer_options.background_padding + + local pad = { + l = thumbnailer_options.pad_left, r = thumbnailer_options.pad_right, + t = thumbnailer_options.pad_top, b = thumbnailer_options.pad_bot + } + if thumbnailer_options.pad_in_screenspace then + pad.l = pad.l * msx + pad.r = pad.r * msx + pad.t = pad.t * msy + pad.b = pad.b * msy + end + + if thumbnailer_options.offset_by_pad then + vertical_offset = vertical_offset + (user_opts.layout == "topbar" and pad.t or pad.b) + end + + local ass_w = thumb_size.w * msx + local ass_h = thumb_size.h * msy + local y_offset = get_thumbnail_y_offset(thumb_size, 1) + + -- Constrain thumbnail display to window + -- (ie. don't let it go off-screen left/right) + if thumbnailer_options.constrain_to_screen and osd_w > (ass_w + pad.l + pad.r)/msx then + local padded_left = (pad.l + (ass_w / 2)) + local padded_right = (pad.r + (ass_w / 2)) + if pos.x - padded_left < 0 then + pos.x = padded_left + elseif pos.x + padded_right > osd_w*msx then + pos.x = osd_w*msx - padded_right + end + end + + local text_h = 30 * msy + local bg_h = ass_h + (display_progress and text_h or 0) + local bg_left = pos.x - ass_w/2 + local framegraph_h = 10 * msy + + local bg_top = nil + local text_top = nil + local framegraph_top = nil + + if user_opts.layout == "topbar" then + bg_top = pos.y - ( y_offset + thumb_size.h ) + vertical_offset + text_top = bg_top + ass_h + framegraph_h + framegraph_top = bg_top + ass_h + vertical_offset = -vertical_offset + else + bg_top = pos.y - y_offset - bg_h - vertical_offset + text_top = bg_top + framegraph_top = bg_top + 20 * msy + end + + if display_progress then + if user_opts.layout == "topbar" then + pad.b = math.max(0, pad.b - 30) + else + pad.t = math.max(0, pad.t - 30) + end + end + + + + -- Draw background + ass:new_event() + ass:pos(bg_left, bg_top) + ass:append(("{\\bord0\\1c&H%s&\\1a&H%X&}"):format(thumbnailer_options.background_color, thumbnailer_options.background_alpha)) + ass:draw_start() + ass:rect_cw(-pad.l, -pad.t, ass_w+pad.r, bg_h+pad.b) + ass:draw_stop() + + if display_progress then + + ass:new_event() + ass:pos(pos.x, text_top) + ass:an(8) + -- Scale text to correct size + ass:append(("{\\fs20\\bord0\\fscx%f\\fscy%f}"):format(100*msx, 100*msy)) + ass:append(("%d%% - %d/%d"):format(perc, thumbs_ready, thumbs_total)) + + -- Draw the generation progress + local block_w = thumb_size.w * (Thumbnailer.state.thumbnail_delta / duration) * msy + local block_max_x = thumb_size.w * msy + + -- Draw finished thumbnail blocks (white) + ass:new_event() + ass:pos(bg_left, framegraph_top) + ass:append(("{\\bord0\\1c&HFFFFFF&\\1a&H%X&"):format(0)) + ass:draw_start(2) + for i, v in pairs(Thumbnailer.state.thumbnails) do + if i ~= closest_index and v > 0 then + ass:rect_cw((i-1)*block_w, 0, math.min(block_max_x, i*block_w), framegraph_h) + end + end + ass:draw_stop() + + -- Draw in-progress thumbnail blocks (grayish green) + ass:new_event() + ass:pos(bg_left, framegraph_top) + ass:append(("{\\bord0\\1c&H44AA44&\\1a&H%X&"):format(0)) + ass:draw_start(2) + for i, v in pairs(Thumbnailer.state.thumbnails) do + if i ~= closest_index and v == 0 then + ass:rect_cw((i-1)*block_w, 0, math.min(block_max_x, i*block_w), framegraph_h) + end + end + ass:draw_stop() + + if closest_index ~= nil then + ass:new_event() + ass:pos(bg_left, framegraph_top) + ass:append(("{\\bord0\\1c&H4444FF&\\1a&H%X&"):format(0)) + ass:draw_start(2) + ass:rect_cw((closest_index-1)*block_w, 0, math.min(block_max_x, closest_index*block_w), framegraph_h) + ass:draw_stop() + end + end + + if thumb_path then + local overlay_y_offset = get_thumbnail_y_offset(thumb_size, msy) + + local thumb_x = math.floor(pos.x / msx - thumb_size.w/2) + local thumb_y = math.floor(pos.y / msy - thumb_size.h - overlay_y_offset - vertical_offset/msy) + + osc_thumb_state.visible = true + if not (osc_thumb_state.last_path == thumb_path and osc_thumb_state.last_x == thumb_x and osc_thumb_state.last_y == thumb_y) then + local overlay_add_args = { + "overlay-add", osc_thumb_state.overlay_id, + thumb_x, thumb_y, + thumb_path, + 0, + "bgra", + thumb_size.w, thumb_size.h, + 4 * thumb_size.w + } + mp.command_native(overlay_add_args) + + osc_thumb_state.last_path = thumb_path + osc_thumb_state.last_x = thumb_x + osc_thumb_state.last_y = thumb_y + end + end + end +end + +-- // mpv_thumbnail_script.lua // -- + + +local osc_param = { -- calculated by osc_init() + playresy = 0, -- canvas size Y + playresx = 0, -- canvas size X + display_aspect = 1, + unscaled_y = 0, + areas = {}, +} + +local osc_styles = { + bigButtons = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs50\\fnmpv-osd-symbols}", + smallButtonsL = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs19\\fnmpv-osd-symbols}", + smallButtonsLlabel = "{\\fscx105\\fscy105\\fn" .. mp.get_property("options/osd-font") .. "}", + smallButtonsR = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs30\\fnmpv-osd-symbols}", + topButtons = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs12\\fnmpv-osd-symbols}", + + elementDown = "{\\1c&H999999}", + timecodes = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs20}", + vidtitle = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs12\\q2}", + box = "{\\rDefault\\blur0\\bord1\\1c&H000000\\3c&HFFFFFF}", + + topButtonsBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs18\\fnmpv-osd-symbols}", + smallButtonsBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs28\\fnmpv-osd-symbols}", + timecodesBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs27}", + timePosBar = "{\\blur0\\bord".. user_opts.tooltipborder .."\\1c&HFFFFFF\\3c&H000000\\fs30}", + vidtitleBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs18\\q2}", +} + +-- internal states, do not touch +local state = { + showtime, -- time of last invocation (last mouse move) + osc_visible = false, + anistart, -- time when the animation started + anitype, -- current type of animation + animation, -- current animation alpha + mouse_down_counter = 0, -- used for softrepeat + active_element = nil, -- nil = none, 0 = background, 1+ = see elements[] + active_event_source = nil, -- the "button" that issued the current event + rightTC_trem = not user_opts.timetotal, -- if the right timecode should display total or remaining time + tc_ms = user_opts.timems, -- Should the timecodes display their time with milliseconds + mp_screen_sizeX, mp_screen_sizeY, -- last screen-resolution, to detect resolution changes to issue reINITs + initREQ = false, -- is a re-init request pending? + last_mouseX, last_mouseY, -- last mouse position, to detect significant mouse movement + message_text, + message_timeout, + fullscreen = false, + timer = nil, + cache_idle = false, + idle = false, + enabled = true, + input_enabled = true, + showhide_enabled = false, +} + + + + +-- +-- Helperfunctions +-- + +-- scale factor for translating between real and virtual ASS coordinates +function get_virt_scale_factor() + local w, h = mp.get_osd_size() + if w <= 0 or h <= 0 then + return 0, 0 + end + return osc_param.playresx / w, osc_param.playresy / h +end + +-- return mouse position in virtual ASS coordinates (playresx/y) +function get_virt_mouse_pos() + local sx, sy = get_virt_scale_factor() + local x, y = mp.get_mouse_pos() + return x * sx, y * sy +end + +function set_virt_mouse_area(x0, y0, x1, y1, name) + local sx, sy = get_virt_scale_factor() + mp.set_mouse_area(x0 / sx, y0 / sy, x1 / sx, y1 / sy, name) +end + +function scale_value(x0, x1, y0, y1, val) + local m = (y1 - y0) / (x1 - x0) + local b = y0 - (m * x0) + return (m * val) + b +end + +-- returns hitbox spanning coordinates (top left, bottom right corner) +-- according to alignment +function get_hitbox_coords(x, y, an, w, h) + + local alignments = { + [1] = function () return x, y-h, x+w, y end, + [2] = function () return x-(w/2), y-h, x+(w/2), y end, + [3] = function () return x-w, y-h, x, y end, + + [4] = function () return x, y-(h/2), x+w, y+(h/2) end, + [5] = function () return x-(w/2), y-(h/2), x+(w/2), y+(h/2) end, + [6] = function () return x-w, y-(h/2), x, y+(h/2) end, + + [7] = function () return x, y, x+w, y+h end, + [8] = function () return x-(w/2), y, x+(w/2), y+h end, + [9] = function () return x-w, y, x, y+h end, + } + + return alignments[an]() +end + +function get_hitbox_coords_geo(geometry) + return get_hitbox_coords(geometry.x, geometry.y, geometry.an, + geometry.w, geometry.h) +end + +function get_element_hitbox(element) + return element.hitbox.x1, element.hitbox.y1, + element.hitbox.x2, element.hitbox.y2 +end + +function mouse_hit(element) + return mouse_hit_coords(get_element_hitbox(element)) +end + +function mouse_hit_coords(bX1, bY1, bX2, bY2) + local mX, mY = get_virt_mouse_pos() + return (mX >= bX1 and mX <= bX2 and mY >= bY1 and mY <= bY2) +end + +function limit_range(min, max, val) + if val > max then + val = max + elseif val < min then + val = min + end + return val +end + +-- translate value into element coordinates +function get_slider_ele_pos_for(element, val) + + local ele_pos = scale_value( + element.slider.min.value, element.slider.max.value, + element.slider.min.ele_pos, element.slider.max.ele_pos, + val) + + return limit_range( + element.slider.min.ele_pos, element.slider.max.ele_pos, + ele_pos) +end + +-- translates global (mouse) coordinates to value +function get_slider_value_at(element, glob_pos) + + local val = scale_value( + element.slider.min.glob_pos, element.slider.max.glob_pos, + element.slider.min.value, element.slider.max.value, + glob_pos) + + return limit_range( + element.slider.min.value, element.slider.max.value, + val) +end + +-- get value at current mouse position +function get_slider_value(element) + return get_slider_value_at(element, get_virt_mouse_pos()) +end + +function countone(val) + if not (user_opts.iamaprogrammer) then + val = val + 1 + end + return val +end + +-- align: -1 .. +1 +-- frame: size of the containing area +-- obj: size of the object that should be positioned inside the area +-- margin: min. distance from object to frame (as long as -1 <= align <= +1) +function get_align(align, frame, obj, margin) + return (frame / 2) + (((frame / 2) - margin - (obj / 2)) * align) +end + +-- multiplies two alpha values, formular can probably be improved +function mult_alpha(alphaA, alphaB) + return 255 - (((1-(alphaA/255)) * (1-(alphaB/255))) * 255) +end + +function add_area(name, x1, y1, x2, y2) + -- create area if needed + if (osc_param.areas[name] == nil) then + osc_param.areas[name] = {} + end + table.insert(osc_param.areas[name], {x1=x1, y1=y1, x2=x2, y2=y2}) +end + + +-- +-- Tracklist Management +-- + +local nicetypes = {video = "Video", audio = "Audio", sub = "Subtitle"} + +-- updates the OSC internal playlists, should be run each time the track-layout changes +function update_tracklist() + local tracktable = mp.get_property_native("track-list", {}) + + -- by osc_id + tracks_osc = {} + tracks_osc.video, tracks_osc.audio, tracks_osc.sub = {}, {}, {} + -- by mpv_id + tracks_mpv = {} + tracks_mpv.video, tracks_mpv.audio, tracks_mpv.sub = {}, {}, {} + for n = 1, #tracktable do + if not (tracktable[n].type == "unknown") then + local type = tracktable[n].type + local mpv_id = tonumber(tracktable[n].id) + + -- by osc_id + table.insert(tracks_osc[type], tracktable[n]) + + -- by mpv_id + tracks_mpv[type][mpv_id] = tracktable[n] + tracks_mpv[type][mpv_id].osc_id = #tracks_osc[type] + end + end +end + +-- return a nice list of tracks of the given type (video, audio, sub) +function get_tracklist(type) + local msg = "Available " .. nicetypes[type] .. " Tracks: " + if #tracks_osc[type] == 0 then + msg = msg .. "none" + else + for n = 1, #tracks_osc[type] do + local track = tracks_osc[type][n] + local lang, title, selected = "unknown", "", "â—‹" + if not(track.lang == nil) then lang = track.lang end + if not(track.title == nil) then title = track.title end + if (track.id == tonumber(mp.get_property(type))) then + selected = "â—" + end + msg = msg.."\n"..selected.." "..n..": ["..lang.."] "..title + end + end + return msg +end + +-- relatively change the track of given by tracks + --(+1 -> next, -1 -> previous) +function set_track(type, next) + local current_track_mpv, current_track_osc + if (mp.get_property(type) == "no") then + current_track_osc = 0 + else + current_track_mpv = tonumber(mp.get_property(type)) + current_track_osc = tracks_mpv[type][current_track_mpv].osc_id + end + local new_track_osc = (current_track_osc + next) % (#tracks_osc[type] + 1) + local new_track_mpv + if new_track_osc == 0 then + new_track_mpv = "no" + else + new_track_mpv = tracks_osc[type][new_track_osc].id + end + + mp.commandv("set", type, new_track_mpv) + + if (new_track_osc == 0) then + show_message(nicetypes[type] .. " Track: none") + else + show_message(nicetypes[type] .. " Track: " + .. new_track_osc .. "/" .. #tracks_osc[type] + .. " [".. (tracks_osc[type][new_track_osc].lang or "unknown") .."] " + .. (tracks_osc[type][new_track_osc].title or "")) + end +end + +-- get the currently selected track of , OSC-style counted +function get_track(type) + local track = mp.get_property(type) + if track ~= "no" and track ~= nil then + local tr = tracks_mpv[type][tonumber(track)] + if tr then + return tr.osc_id + end + end + return 0 +end + + +-- +-- Element Management +-- + +local elements = {} + +function prepare_elements() + + -- remove elements without layout or invisble + local elements2 = {} + for n, element in pairs(elements) do + if not (element.layout == nil) and (element.visible) then + table.insert(elements2, element) + end + end + elements = elements2 + + function elem_compare (a, b) + return a.layout.layer < b.layout.layer + end + + table.sort(elements, elem_compare) + + + for _,element in pairs(elements) do + + local elem_geo = element.layout.geometry + + -- Calculate the hitbox + local bX1, bY1, bX2, bY2 = get_hitbox_coords_geo(elem_geo) + element.hitbox = {x1 = bX1, y1 = bY1, x2 = bX2, y2 = bY2} + + local style_ass = assdraw.ass_new() + + -- prepare static elements + style_ass:append("{}") -- hack to troll new_event into inserting a \n + style_ass:new_event() + style_ass:pos(elem_geo.x, elem_geo.y) + style_ass:an(elem_geo.an) + style_ass:append(element.layout.style) + + element.style_ass = style_ass + + local static_ass = assdraw.ass_new() + + + if (element.type == "box") then + --draw box + static_ass:draw_start() + static_ass:round_rect_cw(0, 0, elem_geo.w, elem_geo.h, + element.layout.box.radius) + static_ass:draw_stop() + + + elseif (element.type == "slider") then + --draw static slider parts + + local slider_lo = element.layout.slider + -- offset between element outline and drag-area + local foV = slider_lo.border + slider_lo.gap + + -- calculate positions of min and max points + if (slider_lo.stype == "slider") or + (slider_lo.stype == "knob") then + element.slider.min.ele_pos = elem_geo.h / 2 + element.slider.max.ele_pos = elem_geo.w - (elem_geo.h / 2) + + elseif (slider_lo.stype == "bar") then + element.slider.min.ele_pos = + slider_lo.border + slider_lo.gap + element.slider.max.ele_pos = + elem_geo.w - (slider_lo.border + slider_lo.gap) + end + + element.slider.min.glob_pos = + element.hitbox.x1 + element.slider.min.ele_pos + element.slider.max.glob_pos = + element.hitbox.x1 + element.slider.max.ele_pos + + -- -- -- + + static_ass:draw_start() + + -- the box + static_ass:rect_cw(0, 0, elem_geo.w, elem_geo.h); + + -- the "hole" + static_ass:rect_ccw(slider_lo.border, slider_lo.border, + elem_geo.w - slider_lo.border, elem_geo.h - slider_lo.border) + + -- marker nibbles + if not (element.slider.markerF == nil) and (slider_lo.gap > 0) then + local markers = element.slider.markerF() + for _,marker in pairs(markers) do + if (marker > element.slider.min.value) and + (marker < element.slider.max.value) then + + local s = get_slider_ele_pos_for(element, marker) + + if (slider_lo.gap > 1) then -- draw triangles + + local a = slider_lo.gap / 0.5 --0.866 + + --top + if (slider_lo.nibbles_top) then + static_ass:move_to(s - (a/2), slider_lo.border) + static_ass:line_to(s + (a/2), slider_lo.border) + static_ass:line_to(s, foV) + end + + --bottom + if (slider_lo.nibbles_bottom) then + static_ass:move_to(s - (a/2), + elem_geo.h - slider_lo.border) + static_ass:line_to(s, + elem_geo.h - foV) + static_ass:line_to(s + (a/2), + elem_geo.h - slider_lo.border) + end + + else -- draw 2x1px nibbles + + --top + if (slider_lo.nibbles_top) then + static_ass:rect_cw(s - 1, slider_lo.border, + s + 1, slider_lo.border + slider_lo.gap); + end + + --bottom + if (slider_lo.nibbles_bottom) then + static_ass:rect_cw(s - 1, + elem_geo.h -slider_lo.border -slider_lo.gap, + s + 1, elem_geo.h - slider_lo.border); + end + end + end + end + end + end + + element.static_ass = static_ass + + + -- if the element is supposed to be disabled, + -- style it accordingly and kill the eventresponders + if not (element.enabled) then + element.layout.alpha[1] = 136 + element.eventresponder = nil + end + end +end + + +-- +-- Element Rendering +-- + +function render_elements(master_ass) + + for n=1, #elements do + local element = elements[n] + + local style_ass = assdraw.ass_new() + style_ass:merge(element.style_ass) + + --alpha + local ar = element.layout.alpha + if not (state.animation == nil) then + ar = {} + for ai, av in pairs(element.layout.alpha) do + ar[ai] = mult_alpha(av, state.animation) + end + end + + style_ass:append(string.format("{\\1a&H%X&\\2a&H%X&\\3a&H%X&\\4a&H%X&}", + ar[1], ar[2], ar[3], ar[4])) + + if element.eventresponder and (state.active_element == n) then + + -- run render event functions + if not (element.eventresponder.render == nil) then + element.eventresponder.render(element) + end + + if mouse_hit(element) then + -- mouse down styling + if (element.styledown) then + style_ass:append(osc_styles.elementDown) + end + + if (element.softrepeat) and (state.mouse_down_counter >= 15 + and state.mouse_down_counter % 5 == 0) then + + element.eventresponder[state.active_event_source.."_down"](element) + end + state.mouse_down_counter = state.mouse_down_counter + 1 + end + + end + + local elem_ass = assdraw.ass_new() + + elem_ass:merge(style_ass) + + if not (element.type == "button") then + elem_ass:merge(element.static_ass) + end + + if (element.type == "slider") then + + local slider_lo = element.layout.slider + local elem_geo = element.layout.geometry + local s_min = element.slider.min.value + local s_max = element.slider.max.value + + -- draw pos marker + local pos = element.slider.posF() + + if not (pos == nil) then + + local foV = slider_lo.border + slider_lo.gap + local foH = 0 + if (slider_lo.stype == "slider") or + (slider_lo.stype == "knob") then + foH = elem_geo.h / 2 + elseif (slider_lo.stype == "bar") then + foH = slider_lo.border + slider_lo.gap + end + + local xp = get_slider_ele_pos_for(element, pos) + + -- the filling + local innerH = elem_geo.h - (2*foV) + + if (slider_lo.stype == "bar") then + elem_ass:rect_cw(foH, foV, xp, elem_geo.h - foV) + elseif (slider_lo.stype == "slider") then + elem_ass:move_to(xp, foV) + elem_ass:line_to(xp+(innerH/2), (innerH/2)+foV) + elem_ass:line_to(xp, (innerH)+foV) + elem_ass:line_to(xp-(innerH/2), (innerH/2)+foV) + elseif (slider_lo.stype == "knob") then + elem_ass:rect_cw(xp, (9*innerH/20) + foV, + elem_geo.w - foH, (11*innerH/20) + foV) + elem_ass:rect_cw(foH, (3*innerH/8) + foV, + xp, (5*innerH/8) + foV) + elem_ass:round_rect_cw(xp - innerH/2, foV, + xp + innerH/2, foV + innerH, innerH/2.0) + end + end + + -- seek ranges + local seekRanges = element.slider.seekRangesF() + if not (seekRanges == nil) then + for _,range in pairs(seekRanges) do + local pstart = get_slider_ele_pos_for(element, range["start"]) + local pend = get_slider_ele_pos_for(element, range["end"]) + elem_ass:rect_ccw(pstart, (elem_geo.h/2)-1, pend, (elem_geo.h/2) + 1) + end + end + + elem_ass:draw_stop() + + -- add tooltip + if not (element.slider.tooltipF == nil) then + + if mouse_hit(element) then + local sliderpos = get_slider_value(element) + local tooltiplabel = element.slider.tooltipF(sliderpos) + + local an = slider_lo.tooltip_an + + local ty + + if (an == 2) then + ty = element.hitbox.y1 - slider_lo.border + else + ty = element.hitbox.y1 + elem_geo.h/2 + end + + local tx = get_virt_mouse_pos() + if (slider_lo.adjust_tooltip) then + if (an == 2) then + if (sliderpos < (s_min + 3)) then + an = an - 1 + elseif (sliderpos > (s_max - 3)) then + an = an + 1 + end + elseif (sliderpos > (s_max-s_min)/2) then + an = an + 1 + tx = tx - 5 + else + an = an - 1 + tx = tx + 10 + end + end + + -- tooltip label + elem_ass:new_event() + elem_ass:pos(tx, ty) + elem_ass:an(an) + elem_ass:append(slider_lo.tooltip_style) + + --alpha + local ar = slider_lo.alpha + if not (state.animation == nil) then + ar = {} + for ai, av in pairs(slider_lo.alpha) do + ar[ai] = mult_alpha(av, state.animation) + end + end + elem_ass:append(string.format("{\\1a&H%X&\\2a&H%X&\\3a&H%X&\\4a&H%X&}", + ar[1], ar[2], ar[3], ar[4])) + + elem_ass:append(tooltiplabel) + + -- mpv_thumbnail_script.lua -- + display_thumbnail({x=get_virt_mouse_pos(), y=ty, a=an}, sliderpos, elem_ass) + -- // mpv_thumbnail_script.lua // -- + + end + end + + elseif (element.type == "button") then + + local buttontext + if type(element.content) == "function" then + buttontext = element.content() -- function objects + elseif not (element.content == nil) then + buttontext = element.content -- text objects + end + + local maxchars = element.layout.button.maxchars + if not (maxchars == nil) and (#buttontext > maxchars) then + local max_ratio = 1.25 -- up to 25% more chars while shrinking + local limit = math.max(0, math.floor(maxchars * max_ratio) - 3) + if (#buttontext > limit) then + while (#buttontext > limit) do + buttontext = buttontext:gsub(".[\128-\191]*$", "") + end + buttontext = buttontext .. "..." + end + local _, nchars2 = buttontext:gsub(".[\128-\191]*", "") + local stretch = (maxchars/#buttontext)*100 + buttontext = string.format("{\\fscx%f}", + (maxchars/#buttontext)*100) .. buttontext + end + + elem_ass:append(buttontext) + end + + master_ass:merge(elem_ass) + end +end + +-- +-- Message display +-- + +-- pos is 1 based +function limited_list(prop, pos) + local proplist = mp.get_property_native(prop, {}) + local count = #proplist + if count == 0 then + return count, proplist + end + + local fs = tonumber(mp.get_property('options/osd-font-size')) + local max = math.ceil(osc_param.unscaled_y*0.75 / fs) + if max % 2 == 0 then + max = max - 1 + end + local delta = math.ceil(max / 2) - 1 + local begi = math.max(math.min(pos - delta, count - max + 1), 1) + local endi = math.min(begi + max - 1, count) + + local reslist = {} + for i=begi, endi do + local item = proplist[i] + item.current = (i == pos) and true or nil + table.insert(reslist, item) + end + return count, reslist +end + +function get_playlist() + local pos = mp.get_property_number('playlist-pos', 0) + 1 + local count, limlist = limited_list('playlist', pos) + if count == 0 then + return 'Empty playlist.' + end + + local message = string.format('Playlist [%d/%d]:\n', pos, count) + for i, v in ipairs(limlist) do + local title = v.title + local _, filename = utils.split_path(v.filename) + if title == nil then + title = filename + end + message = string.format('%s %s %s\n', message, + (v.current and 'â—' or 'â—‹'), title) + end + return message +end + +function get_chapterlist() + local pos = mp.get_property_number('chapter', 0) + 1 + local count, limlist = limited_list('chapter-list', pos) + if count == 0 then + return 'No chapters.' + end + + local message = string.format('Chapters [%d/%d]:\n', pos, count) + for i, v in ipairs(limlist) do + local time = mp.format_time(v.time) + local title = v.title + if title == nil then + title = string.format('Chapter %02d', i) + end + message = string.format('%s[%s] %s %s\n', message, time, + (v.current and 'â—' or 'â—‹'), title) + end + return message +end + +function show_message(text, duration) + + --print("text: "..text.." duration: " .. duration) + if duration == nil then + duration = tonumber(mp.get_property("options/osd-duration")) / 1000 + elseif not type(duration) == "number" then + print("duration: " .. duration) + end + + -- cut the text short, otherwise the following functions + -- may slow down massively on huge input + text = string.sub(text, 0, 4000) + + -- replace actual linebreaks with ASS linebreaks + text = string.gsub(text, "\n", "\\N") + + state.message_text = text + state.message_timeout = mp.get_time() + duration +end + +function render_message(ass) + if not(state.message_timeout == nil) and not(state.message_text == nil) + and state.message_timeout > mp.get_time() then + local _, lines = string.gsub(state.message_text, "\\N", "") + + local fontsize = tonumber(mp.get_property("options/osd-font-size")) + local outline = tonumber(mp.get_property("options/osd-border-size")) + local maxlines = math.ceil(osc_param.unscaled_y*0.75 / fontsize) + local counterscale = osc_param.playresy / osc_param.unscaled_y + + fontsize = fontsize * counterscale / math.max(0.65 + math.min(lines/maxlines, 1), 1) + outline = outline * counterscale / math.max(0.75 + math.min(lines/maxlines, 1)/2, 1) + + local style = "{\\bord" .. outline .. "\\fs" .. fontsize .. "}" + + + ass:new_event() + ass:append(style .. state.message_text) + else + state.message_text = nil + state.message_timeout = nil + end +end + +-- +-- Initialisation and Layout +-- + +function new_element(name, type) + elements[name] = {} + elements[name].type = type + + -- add default stuff + elements[name].eventresponder = {} + elements[name].visible = true + elements[name].enabled = true + elements[name].softrepeat = false + elements[name].styledown = (type == "button") + elements[name].state = {} + + if (type == "slider") then + elements[name].slider = {min = {value = 0}, max = {value = 100}} + end + + + return elements[name] +end + +function add_layout(name) + if not (elements[name] == nil) then + -- new layout + elements[name].layout = {} + + -- set layout defaults + elements[name].layout.layer = 50 + elements[name].layout.alpha = {[1] = 0, [2] = 255, [3] = 255, [4] = 255} + + if (elements[name].type == "button") then + elements[name].layout.button = { + maxchars = nil, + } + elseif (elements[name].type == "slider") then + -- slider defaults + elements[name].layout.slider = { + border = 1, + gap = 1, + nibbles_top = true, + nibbles_bottom = true, + stype = "slider", + adjust_tooltip = true, + tooltip_style = "", + tooltip_an = 2, + alpha = {[1] = 0, [2] = 255, [3] = 88, [4] = 255}, + } + elseif (elements[name].type == "box") then + elements[name].layout.box = {radius = 0} + end + + return elements[name].layout + else + msg.error("Can't add_layout to element \""..name.."\", doesn't exist.") + end +end + +-- +-- Layouts +-- + +local layouts = {} + +-- Classic box layout +layouts["box"] = function () + + local osc_geo = { + w = 550, -- width + h = 138, -- height + r = 10, -- corner-radius + p = 15, -- padding + } + + -- make sure the OSC actually fits into the video + if (osc_param.playresx < (osc_geo.w + (2 * osc_geo.p))) then + osc_param.playresy = (osc_geo.w+(2*osc_geo.p))/osc_param.display_aspect + osc_param.playresx = osc_param.playresy * osc_param.display_aspect + end + + -- position of the controller according to video aspect and valignment + local posX = math.floor(get_align(user_opts.halign, osc_param.playresx, + osc_geo.w, 0)) + local posY = math.floor(get_align(user_opts.valign, osc_param.playresy, + osc_geo.h, 0)) + + -- position offset for contents aligned at the borders of the box + local pos_offsetX = (osc_geo.w - (2*osc_geo.p)) / 2 + local pos_offsetY = (osc_geo.h - (2*osc_geo.p)) / 2 + + osc_param.areas = {} -- delete areas + + -- area for active mouse input + add_area("input", get_hitbox_coords(posX, posY, 5, osc_geo.w, osc_geo.h)) + + -- area for show/hide + local sh_area_y0, sh_area_y1 + if user_opts.valign > 0 then + -- deadzone above OSC + sh_area_y0 = get_align(-1 + (2*user_opts.deadzonesize), + posY - (osc_geo.h / 2), 0, 0) + sh_area_y1 = osc_param.playresy + else + -- deadzone below OSC + sh_area_y0 = 0 + sh_area_y1 = (posY + (osc_geo.h / 2)) + + get_align(1 - (2*user_opts.deadzonesize), + osc_param.playresy - (posY + (osc_geo.h / 2)), 0, 0) + end + add_area("showhide", 0, sh_area_y0, osc_param.playresx, sh_area_y1) + + -- fetch values + local osc_w, osc_h, osc_r, osc_p = + osc_geo.w, osc_geo.h, osc_geo.r, osc_geo.p + + local lo + + -- + -- Background box + -- + + new_element("bgbox", "box") + lo = add_layout("bgbox") + + lo.geometry = {x = posX, y = posY, an = 5, w = osc_w, h = osc_h} + lo.layer = 10 + lo.style = osc_styles.box + lo.alpha[1] = user_opts.boxalpha + lo.alpha[3] = user_opts.boxalpha + lo.box.radius = osc_r + + -- + -- Title row + -- + + local titlerowY = posY - pos_offsetY - 10 + + lo = add_layout("title") + lo.geometry = {x = posX, y = titlerowY, an = 8, w = 496, h = 12} + lo.style = osc_styles.vidtitle + lo.button.maxchars = user_opts.boxmaxchars + + lo = add_layout("pl_prev") + lo.geometry = + {x = (posX - pos_offsetX), y = titlerowY, an = 7, w = 12, h = 12} + lo.style = osc_styles.topButtons + + lo = add_layout("pl_next") + lo.geometry = + {x = (posX + pos_offsetX), y = titlerowY, an = 9, w = 12, h = 12} + lo.style = osc_styles.topButtons + + -- + -- Big buttons + -- + + local bigbtnrowY = posY - pos_offsetY + 35 + local bigbtndist = 60 + + lo = add_layout("playpause") + lo.geometry = + {x = posX, y = bigbtnrowY, an = 5, w = 40, h = 40} + lo.style = osc_styles.bigButtons + + lo = add_layout("skipback") + lo.geometry = + {x = posX - bigbtndist, y = bigbtnrowY, an = 5, w = 40, h = 40} + lo.style = osc_styles.bigButtons + + lo = add_layout("skipfrwd") + lo.geometry = + {x = posX + bigbtndist, y = bigbtnrowY, an = 5, w = 40, h = 40} + lo.style = osc_styles.bigButtons + + lo = add_layout("ch_prev") + lo.geometry = + {x = posX - (bigbtndist * 2), y = bigbtnrowY, an = 5, w = 40, h = 40} + lo.style = osc_styles.bigButtons + + lo = add_layout("ch_next") + lo.geometry = + {x = posX + (bigbtndist * 2), y = bigbtnrowY, an = 5, w = 40, h = 40} + lo.style = osc_styles.bigButtons + + lo = add_layout("cy_audio") + lo.geometry = + {x = posX - pos_offsetX, y = bigbtnrowY, an = 1, w = 70, h = 18} + lo.style = osc_styles.smallButtonsL + + lo = add_layout("cy_sub") + lo.geometry = + {x = posX - pos_offsetX, y = bigbtnrowY, an = 7, w = 70, h = 18} + lo.style = osc_styles.smallButtonsL + + lo = add_layout("tog_fs") + lo.geometry = + {x = posX+pos_offsetX - 25, y = bigbtnrowY, an = 4, w = 25, h = 25} + lo.style = osc_styles.smallButtonsR + + lo = add_layout("volume") + lo.geometry = + {x = posX+pos_offsetX - (25 * 2) - osc_geo.p, + y = bigbtnrowY, an = 4, w = 25, h = 25} + lo.style = osc_styles.smallButtonsR + + -- + -- Seekbar + -- + + lo = add_layout("seekbar") + lo.geometry = + {x = posX, y = posY+pos_offsetY-22, an = 2, w = pos_offsetX*2, h = 15} + lo.style = osc_styles.timecodes + lo.slider.tooltip_style = osc_styles.vidtitle + lo.slider.stype = user_opts["seekbarstyle"] + if lo.slider.stype == "knob" then + lo.slider.border = 0 + end + + -- + -- Timecodes + Cache + -- + + local bottomrowY = posY + pos_offsetY - 5 + + lo = add_layout("tc_left") + lo.geometry = + {x = posX - pos_offsetX, y = bottomrowY, an = 4, w = 110, h = 18} + lo.style = osc_styles.timecodes + + lo = add_layout("tc_right") + lo.geometry = + {x = posX + pos_offsetX, y = bottomrowY, an = 6, w = 110, h = 18} + lo.style = osc_styles.timecodes + + lo = add_layout("cache") + lo.geometry = + {x = posX, y = bottomrowY, an = 5, w = 110, h = 18} + lo.style = osc_styles.timecodes + +end + +-- slim box layout +layouts["slimbox"] = function () + + local osc_geo = { + w = 660, -- width + h = 70, -- height + r = 10, -- corner-radius + } + + -- make sure the OSC actually fits into the video + if (osc_param.playresx < (osc_geo.w)) then + osc_param.playresy = (osc_geo.w)/osc_param.display_aspect + osc_param.playresx = osc_param.playresy * osc_param.display_aspect + end + + -- position of the controller according to video aspect and valignment + local posX = math.floor(get_align(user_opts.halign, osc_param.playresx, + osc_geo.w, 0)) + local posY = math.floor(get_align(user_opts.valign, osc_param.playresy, + osc_geo.h, 0)) + + osc_param.areas = {} -- delete areas + + -- area for active mouse input + add_area("input", get_hitbox_coords(posX, posY, 5, osc_geo.w, osc_geo.h)) + + -- area for show/hide + local sh_area_y0, sh_area_y1 + if user_opts.valign > 0 then + -- deadzone above OSC + sh_area_y0 = get_align(-1 + (2*user_opts.deadzonesize), + posY - (osc_geo.h / 2), 0, 0) + sh_area_y1 = osc_param.playresy + else + -- deadzone below OSC + sh_area_y0 = 0 + sh_area_y1 = (posY + (osc_geo.h / 2)) + + get_align(1 - (2*user_opts.deadzonesize), + osc_param.playresy - (posY + (osc_geo.h / 2)), 0, 0) + end + add_area("showhide", 0, sh_area_y0, osc_param.playresx, sh_area_y1) + + local lo + + local tc_w, ele_h, inner_w = 100, 20, osc_geo.w - 100 + + -- styles + local styles = { + box = "{\\rDefault\\blur0\\bord1\\1c&H000000\\3c&HFFFFFF}", + timecodes = "{\\1c&HFFFFFF\\3c&H000000\\fs20\\bord2\\blur1}", + tooltip = "{\\1c&HFFFFFF\\3c&H000000\\fs12\\bord1\\blur0.5}", + } + + + new_element("bgbox", "box") + lo = add_layout("bgbox") + + lo.geometry = {x = posX, y = posY - 1, an = 2, w = inner_w, h = ele_h} + lo.layer = 10 + lo.style = osc_styles.box + lo.alpha[1] = user_opts.boxalpha + lo.alpha[3] = 0 + if not (user_opts["seekbarstyle"] == "bar") then + lo.box.radius = osc_geo.r + end + + + lo = add_layout("seekbar") + lo.geometry = + {x = posX, y = posY - 1, an = 2, w = inner_w, h = ele_h} + lo.style = osc_styles.timecodes + lo.slider.border = 0 + lo.slider.gap = 1.5 + lo.slider.tooltip_style = styles.tooltip + lo.slider.stype = user_opts["seekbarstyle"] + lo.slider.adjust_tooltip = false + + -- + -- Timecodes + -- + + lo = add_layout("tc_left") + lo.geometry = + {x = posX - (inner_w/2) + osc_geo.r, y = posY + 1, + an = 7, w = tc_w, h = ele_h} + lo.style = styles.timecodes + lo.alpha[3] = user_opts.boxalpha + + lo = add_layout("tc_right") + lo.geometry = + {x = posX + (inner_w/2) - osc_geo.r, y = posY + 1, + an = 9, w = tc_w, h = ele_h} + lo.style = styles.timecodes + lo.alpha[3] = user_opts.boxalpha + + -- Cache + + lo = add_layout("cache") + lo.geometry = + {x = posX, y = posY + 1, + an = 8, w = tc_w, h = ele_h} + lo.style = styles.timecodes + lo.alpha[3] = user_opts.boxalpha + + +end + +layouts["bottombar"] = function() + local osc_geo = { + x = -2, + y = osc_param.playresy - 54 - user_opts.barmargin, + an = 7, + w = osc_param.playresx + 4, + h = 56, + } + + local padX = 9 + local padY = 3 + local buttonW = 27 + local tcW = (state.tc_ms) and 170 or 110 + local tsW = 90 + local minW = (buttonW + padX)*5 + (tcW + padX)*4 + (tsW + padX)*2 + + if ((osc_param.display_aspect > 0) and (osc_param.playresx < minW)) then + osc_param.playresy = minW / osc_param.display_aspect + osc_param.playresx = osc_param.playresy * osc_param.display_aspect + osc_geo.y = osc_param.playresy - 54 - user_opts.barmargin + osc_geo.w = osc_param.playresx + 4 + end + + local line1 = osc_geo.y + 9 + padY + local line2 = osc_geo.y + 36 + padY + + osc_param.areas = {} + + add_area("input", get_hitbox_coords(osc_geo.x, osc_geo.y, osc_geo.an, + osc_geo.w, osc_geo.h)) + + local sh_area_y0, sh_area_y1 + sh_area_y0 = get_align(-1 + (2*user_opts.deadzonesize), + osc_geo.y - (osc_geo.h / 2), 0, 0) + sh_area_y1 = osc_param.playresy - user_opts.barmargin + add_area("showhide", 0, sh_area_y0, osc_param.playresx, sh_area_y1) + + local lo, geo + + -- Background bar + new_element("bgbox", "box") + lo = add_layout("bgbox") + + lo.geometry = osc_geo + lo.layer = 10 + lo.style = osc_styles.box + lo.alpha[1] = user_opts.boxalpha + + + -- Playlist prev/next + geo = { x = osc_geo.x + padX, y = line1, + an = 4, w = 18, h = 18 - padY } + lo = add_layout("pl_prev") + lo.geometry = geo + lo.style = osc_styles.topButtonsBar + + geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("pl_next") + lo.geometry = geo + lo.style = osc_styles.topButtonsBar + + local t_l = geo.x + geo.w + padX + + -- Cache + geo = { x = osc_geo.x + osc_geo.w - padX, y = geo.y, + an = 6, w = 150, h = geo.h } + lo = add_layout("cache") + lo.geometry = geo + lo.style = osc_styles.vidtitleBar + + local t_r = geo.x - geo.w - padX*2 + + -- Title + geo = { x = t_l, y = geo.y, an = 4, + w = t_r - t_l, h = geo.h } + lo = add_layout("title") + lo.geometry = geo + lo.style = string.format("%s{\\clip(%f,%f,%f,%f)}", + osc_styles.vidtitleBar, + geo.x, geo.y-geo.h, geo.w, geo.y+geo.h) + + + -- Playback control buttons + geo = { x = osc_geo.x + padX, y = line2, an = 4, + w = buttonW, h = 36 - padY*2} + lo = add_layout("playpause") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("ch_prev") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("ch_next") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + -- Left timecode + geo = { x = geo.x + geo.w + padX + tcW, y = geo.y, an = 6, + w = tcW, h = geo.h } + lo = add_layout("tc_left") + lo.geometry = geo + lo.style = osc_styles.timecodesBar + + local sb_l = geo.x + padX + + -- Fullscreen button + geo = { x = osc_geo.x + osc_geo.w - buttonW - padX, y = geo.y, an = 4, + w = buttonW, h = geo.h } + lo = add_layout("tog_fs") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + -- Volume + geo = { x = geo.x - geo.w - padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("volume") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + -- Track selection buttons + geo = { x = geo.x - tsW - padX, y = geo.y, an = geo.an, w = tsW, h = geo.h } + lo = add_layout("cy_sub") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + geo = { x = geo.x - geo.w - padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("cy_audio") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + + -- Right timecode + geo = { x = geo.x - padX - tcW - 10, y = geo.y, an = geo.an, + w = tcW, h = geo.h } + lo = add_layout("tc_right") + lo.geometry = geo + lo.style = osc_styles.timecodesBar + + local sb_r = geo.x - padX + + + -- Seekbar + geo = { x = sb_l, y = geo.y, an = geo.an, + w = math.max(0, sb_r - sb_l), h = geo.h } + new_element("bgbar1", "box") + lo = add_layout("bgbar1") + + lo.geometry = geo + lo.layer = 15 + lo.style = osc_styles.timecodesBar + lo.alpha[1] = + math.min(255, user_opts.boxalpha + (255 - user_opts.boxalpha)*0.8) + + lo = add_layout("seekbar") + lo.geometry = geo + lo.style = osc_styles.timecodes + lo.slider.border = 0 + lo.slider.gap = 2 + lo.slider.tooltip_style = osc_styles.timePosBar + lo.slider.tooltip_an = 5 + lo.slider.stype = user_opts["seekbarstyle"] +end + +layouts["topbar"] = function() + local osc_geo = { + x = -2, + y = 54 + user_opts.barmargin, + an = 1, + w = osc_param.playresx + 4, + h = 56, + } + + local padX = 9 + local padY = 3 + local buttonW = 27 + local tcW = (state.tc_ms) and 170 or 110 + local tsW = 90 + local minW = (buttonW + padX)*5 + (tcW + padX)*4 + (tsW + padX)*2 + + if ((osc_param.display_aspect > 0) and (osc_param.playresx < minW)) then + osc_param.playresy = minW / osc_param.display_aspect + osc_param.playresx = osc_param.playresy * osc_param.display_aspect + osc_geo.y = 54 + user_opts.barmargin + osc_geo.w = osc_param.playresx + 4 + end + + local line1 = osc_geo.y - 36 - padY + local line2 = osc_geo.y - 9 - padY + + osc_param.areas = {} + + add_area("input", get_hitbox_coords(osc_geo.x, osc_geo.y, osc_geo.an, + osc_geo.w, osc_geo.h)) + + local sh_area_y0, sh_area_y1 + sh_area_y0 = user_opts.barmargin + sh_area_y1 = (osc_geo.y + (osc_geo.h / 2)) + + get_align(1 - (2*user_opts.deadzonesize), + osc_param.playresy - (osc_geo.y + (osc_geo.h / 2)), 0, 0) + add_area("showhide", 0, sh_area_y0, osc_param.playresx, sh_area_y1) + + local lo, geo + + -- Background bar + new_element("bgbox", "box") + lo = add_layout("bgbox") + + lo.geometry = osc_geo + lo.layer = 10 + lo.style = osc_styles.box + lo.alpha[1] = user_opts.boxalpha + + + -- Playback control buttons + geo = { x = osc_geo.x + padX, y = line1, an = 4, + w = buttonW, h = 36 - padY*2 } + lo = add_layout("playpause") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("ch_prev") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("ch_next") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + + -- Left timecode + geo = { x = geo.x + geo.w + padX + tcW, y = geo.y, an = 6, + w = tcW, h = geo.h } + lo = add_layout("tc_left") + lo.geometry = geo + lo.style = osc_styles.timecodesBar + + local sb_l = geo.x + padX + + -- Fullscreen button + geo = { x = osc_geo.x + osc_geo.w - buttonW - padX, y = geo.y, an = 4, + w = buttonW, h = geo.h } + lo = add_layout("tog_fs") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + -- Volume + geo = { x = geo.x - geo.w - padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("volume") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + -- Track selection buttons + geo = { x = geo.x - tsW - padX, y = geo.y, an = geo.an, w = tsW, h = geo.h } + lo = add_layout("cy_sub") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + geo = { x = geo.x - geo.w - padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("cy_audio") + lo.geometry = geo + lo.style = osc_styles.smallButtonsBar + + + -- Right timecode + geo = { x = geo.x - geo.w - padX - tcW - 10, y = geo.y, an = 4, + w = tcW, h = geo.h } + lo = add_layout("tc_right") + lo.geometry = geo + lo.style = osc_styles.timecodesBar + + local sb_r = geo.x - padX + + + -- Seekbar + geo = { x = sb_l, y = user_opts.barmargin, an = 7, + w = math.max(0, sb_r - sb_l), h = geo.h } + new_element("bgbar1", "box") + lo = add_layout("bgbar1") + + lo.geometry = geo + lo.layer = 15 + lo.style = osc_styles.timecodesBar + lo.alpha[1] = + math.min(255, user_opts.boxalpha + (255 - user_opts.boxalpha)*0.8) + + lo = add_layout("seekbar") + lo.geometry = geo + lo.style = osc_styles.timecodesBar + lo.slider.border = 0 + lo.slider.gap = 2 + lo.slider.tooltip_style = osc_styles.timePosBar + lo.slider.stype = user_opts["seekbarstyle"] + lo.slider.tooltip_an = 5 + + + -- Playlist prev/next + geo = { x = osc_geo.x + padX, y = line2, an = 4, w = 18, h = 18 - padY } + lo = add_layout("pl_prev") + lo.geometry = geo + lo.style = osc_styles.topButtonsBar + + geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } + lo = add_layout("pl_next") + lo.geometry = geo + lo.style = osc_styles.topButtonsBar + + local t_l = geo.x + geo.w + padX + + -- Cache + geo = { x = osc_geo.x + osc_geo.w - padX, y = geo.y, + an = 6, w = 150, h = geo.h } + lo = add_layout("cache") + lo.geometry = geo + lo.style = osc_styles.vidtitleBar + + local t_r = geo.x - geo.w - padX*2 + + -- Title + geo = { x = t_l, y = geo.y, an = 4, + w = t_r - t_l, h = geo.h } + lo = add_layout("title") + lo.geometry = geo + lo.style = string.format("%s{\\clip(%f,%f,%f,%f)}", + osc_styles.vidtitleBar, + geo.x, geo.y-geo.h, geo.w, geo.y+geo.h) +end + +-- Validate string type user options +function validate_user_opts() + if layouts[user_opts.layout] == nil then + msg.warn("Invalid setting \""..user_opts.layout.."\" for layout") + user_opts.layout = "box" + end + + if user_opts.seekbarstyle ~= "slider" and + user_opts.seekbarstyle ~= "bar" and + user_opts.seekbarstyle ~= "knob" then + msg.warn("Invalid setting \"" .. user_opts.seekbarstyle + .. "\" for seekbarstyle") + user_opts.seekbarstyle = "slider" + end +end + + +-- OSC INIT +function osc_init() + msg.debug("osc_init") + + -- set canvas resolution according to display aspect and scaling setting + local baseResY = 720 + local display_w, display_h, display_aspect = mp.get_osd_size() + local scale = 1 + + if (mp.get_property("video") == "no") then -- dummy/forced window + scale = user_opts.scaleforcedwindow + elseif state.fullscreen then + scale = user_opts.scalefullscreen + else + scale = user_opts.scalewindowed + end + + if user_opts.vidscale then + osc_param.unscaled_y = baseResY + else + osc_param.unscaled_y = display_h + end + osc_param.playresy = osc_param.unscaled_y / scale + if (display_aspect > 0) then + osc_param.display_aspect = display_aspect + end + osc_param.playresx = osc_param.playresy * osc_param.display_aspect + + + + + + elements = {} + + -- some often needed stuff + local pl_count = mp.get_property_number("playlist-count", 0) + local have_pl = (pl_count > 1) + local pl_pos = mp.get_property_number("playlist-pos", 0) + 1 + local have_ch = (mp.get_property_number("chapters", 0) > 0) + local loop = mp.get_property("loop-playlist", "no") + + local ne + + -- title + ne = new_element("title", "button") + + ne.content = function () + local title = mp.command_native({"expand-text", user_opts.title}) + -- escape ASS, and strip newlines and trailing slashes + title = title:gsub("\\n", " "):gsub("\\$", ""):gsub("{","\\{") + return not (title == "") and title or "mpv" + end + + ne.eventresponder["mbtn_left_up"] = function () + local title = mp.get_property_osd("media-title") + if (have_pl) then + title = string.format("[%d/%d] %s", countone(pl_pos - 1), + pl_count, title) + end + show_message(title) + end + + ne.eventresponder["mbtn_right_up"] = + function () show_message(mp.get_property_osd("filename")) end + + -- playlist buttons + + -- prev + ne = new_element("pl_prev", "button") + + ne.content = "\238\132\144" + ne.enabled = (pl_pos > 1) or (loop ~= "no") + ne.eventresponder["mbtn_left_up"] = + function () + mp.commandv("playlist-prev", "weak") + show_message(get_playlist(), 3) + end + ne.eventresponder["shift+mbtn_left_up"] = + function () show_message(get_playlist(), 3) end + ne.eventresponder["mbtn_right_up"] = + function () show_message(get_playlist(), 3) end + + --next + ne = new_element("pl_next", "button") + + ne.content = "\238\132\129" + ne.enabled = (have_pl and (pl_pos < pl_count)) or (loop ~= "no") + ne.eventresponder["mbtn_left_up"] = + function () + mp.commandv("playlist-next", "weak") + show_message(get_playlist(), 3) + end + ne.eventresponder["shift+mbtn_left_up"] = + function () show_message(get_playlist(), 3) end + ne.eventresponder["mbtn_right_up"] = + function () show_message(get_playlist(), 3) end + + + -- big buttons + + --playpause + ne = new_element("playpause", "button") + + ne.content = function () + if mp.get_property("pause") == "yes" then + return ("\238\132\129") + else + return ("\238\128\130") + end + end + ne.eventresponder["mbtn_left_up"] = + function () mp.commandv("cycle", "pause") end + + --skipback + ne = new_element("skipback", "button") + + ne.softrepeat = true + ne.content = "\238\128\132" + ne.eventresponder["mbtn_left_down"] = + function () mp.commandv("seek", -5, "relative", "keyframes") end + ne.eventresponder["shift+mbtn_left_down"] = + function () mp.commandv("frame-back-step") end + ne.eventresponder["mbtn_right_down"] = + function () mp.commandv("seek", -30, "relative", "keyframes") end + + --skipfrwd + ne = new_element("skipfrwd", "button") + + ne.softrepeat = true + ne.content = "\238\128\133" + ne.eventresponder["mbtn_left_down"] = + function () mp.commandv("seek", 10, "relative", "keyframes") end + ne.eventresponder["shift+mbtn_left_down"] = + function () mp.commandv("frame-step") end + ne.eventresponder["mbtn_right_down"] = + function () mp.commandv("seek", 60, "relative", "keyframes") end + + --ch_prev + ne = new_element("ch_prev", "button") + + ne.enabled = have_ch + ne.content = "\238\132\132" + ne.eventresponder["mbtn_left_up"] = + function () + mp.commandv("add", "chapter", -1) + show_message(get_chapterlist(), 3) + end + ne.eventresponder["shift+mbtn_left_up"] = + function () show_message(get_chapterlist(), 3) end + ne.eventresponder["mbtn_right_up"] = + function () show_message(get_chapterlist(), 3) end + + --ch_next + ne = new_element("ch_next", "button") + + ne.enabled = have_ch + ne.content = "\238\132\133" + ne.eventresponder["mbtn_left_up"] = + function () + mp.commandv("add", "chapter", 1) + show_message(get_chapterlist(), 3) + end + ne.eventresponder["shift+mbtn_left_up"] = + function () show_message(get_chapterlist(), 3) end + ne.eventresponder["mbtn_right_up"] = + function () show_message(get_chapterlist(), 3) end + + -- + update_tracklist() + + --cy_audio + ne = new_element("cy_audio", "button") + + ne.enabled = (#tracks_osc.audio > 0) + ne.content = function () + local aid = "–" + if not (get_track("audio") == 0) then + aid = get_track("audio") + end + return ("\238\132\134" .. osc_styles.smallButtonsLlabel + .. " " .. aid .. "/" .. #tracks_osc.audio) + end + ne.eventresponder["mbtn_left_up"] = + function () set_track("audio", 1) end + ne.eventresponder["mbtn_right_up"] = + function () set_track("audio", -1) end + ne.eventresponder["shift+mbtn_left_down"] = + function () show_message(get_tracklist("audio"), 2) end + + --cy_sub + ne = new_element("cy_sub", "button") + + ne.enabled = (#tracks_osc.sub > 0) + ne.content = function () + local sid = "–" + if not (get_track("sub") == 0) then + sid = get_track("sub") + end + return ("\238\132\135" .. osc_styles.smallButtonsLlabel + .. " " .. sid .. "/" .. #tracks_osc.sub) + end + ne.eventresponder["mbtn_left_up"] = + function () set_track("sub", 1) end + ne.eventresponder["mbtn_right_up"] = + function () set_track("sub", -1) end + ne.eventresponder["shift+mbtn_left_down"] = + function () show_message(get_tracklist("sub"), 2) end + + --tog_fs + ne = new_element("tog_fs", "button") + ne.content = function () + if (state.fullscreen) then + return ("\238\132\137") + else + return ("\238\132\136") + end + end + ne.eventresponder["mbtn_left_up"] = + function () mp.commandv("cycle", "fullscreen") end + + + --seekbar + ne = new_element("seekbar", "slider") + + ne.enabled = not (mp.get_property("percent-pos") == nil) + ne.slider.markerF = function () + local duration = mp.get_property_number("duration", nil) + if not (duration == nil) then + local chapters = mp.get_property_native("chapter-list", {}) + local markers = {} + for n = 1, #chapters do + markers[n] = (chapters[n].time / duration * 100) + end + return markers + else + return {} + end + end + ne.slider.posF = + function () return mp.get_property_number("percent-pos", nil) end + ne.slider.tooltipF = function (pos) + local duration = mp.get_property_number("duration", nil) + if not ((duration == nil) or (pos == nil)) then + possec = duration * (pos / 100) + return mp.format_time(possec) + else + return "" + end + end + ne.slider.seekRangesF = function() + if not (user_opts.seekranges) then + return nil + end + local cache_state = mp.get_property_native("demuxer-cache-state", nil) + if not cache_state then + return nil + end + local duration = mp.get_property_number("duration", nil) + if (duration == nil) or duration <= 0 then + return nil + end + local ranges = cache_state["seekable-ranges"] + for _, range in pairs(ranges) do + range["start"] = 100 * range["start"] / duration + range["end"] = 100 * range["end"] / duration + end + return ranges + end + ne.eventresponder["mouse_move"] = --keyframe seeking when mouse is dragged + function (element) + -- mouse move events may pile up during seeking and may still get + -- sent when the user is done seeking, so we need to throw away + -- identical seeks + local seekto = get_slider_value(element) + if (element.state.lastseek == nil) or + (not (element.state.lastseek == seekto)) then + mp.commandv("seek", seekto, + "absolute-percent", "keyframes") + element.state.lastseek = seekto + end + + end + ne.eventresponder["mbtn_left_down"] = --exact seeks on single clicks + function (element) mp.commandv("seek", get_slider_value(element), + "absolute-percent", "exact") end + ne.eventresponder["reset"] = + function (element) element.state.lastseek = nil end + + + -- tc_left (current pos) + ne = new_element("tc_left", "button") + + ne.content = function () + if (state.tc_ms) then + return (mp.get_property_osd("playback-time/full")) + else + return (mp.get_property_osd("playback-time")) + end + end + ne.eventresponder["mbtn_left_up"] = function () + state.tc_ms = not state.tc_ms + request_init() + end + + -- tc_right (total/remaining time) + ne = new_element("tc_right", "button") + + ne.visible = (mp.get_property_number("duration", 0) > 0) + ne.content = function () + if (state.rightTC_trem) then + if state.tc_ms then + return ("-"..mp.get_property_osd("playtime-remaining/full")) + else + return ("-"..mp.get_property_osd("playtime-remaining")) + end + else + if state.tc_ms then + return (mp.get_property_osd("duration/full")) + else + return (mp.get_property_osd("duration")) + end + end + end + ne.eventresponder["mbtn_left_up"] = + function () state.rightTC_trem = not state.rightTC_trem end + + -- cache + ne = new_element("cache", "button") + + ne.content = function () + local dmx_cache = mp.get_property_number("demuxer-cache-duration") + local cache_used = mp.get_property_number("cache-used") + local dmx_cache_state = mp.get_property_native("demuxer-cache-state", {}) + local is_network = mp.get_property_native("demuxer-via-network") + local show_cache = cache_used and not dmx_cache_state["eof"] + if dmx_cache then + dmx_cache = string.format("%3.0fs", dmx_cache) + end + if dmx_cache_state["fw-bytes"] then + cache_used = (cache_used or 0)*1024 + dmx_cache_state["fw-bytes"] + end + if (is_network and dmx_cache) or show_cache then + -- Only show dmx-cache-duration by itself if it's a network file. + -- Cache can be forced even for local files, so always show that. + return string.format("Cache: %s%s%s", + (dmx_cache and dmx_cache or ""), + ((dmx_cache and show_cache) and " | " or ""), + (show_cache and + utils.format_bytes_humanized(cache_used) or "")) + else + return "" + end + end + + -- volume + ne = new_element("volume", "button") + + ne.content = function() + local volume = mp.get_property_number("volume", 0) + local mute = mp.get_property_native("mute") + local volicon = {"\238\132\139", "\238\132\140", + "\238\132\141", "\238\132\142"} + if volume == 0 or mute then + return "\238\132\138" + else + return volicon[math.min(4,math.ceil(volume / (100/3)))] + end + end + ne.eventresponder["mbtn_left_up"] = + function () mp.commandv("cycle", "mute") end + + ne.eventresponder["wheel_up_press"] = + function () mp.commandv("osd-auto", "add", "volume", 5) end + ne.eventresponder["wheel_down_press"] = + function () mp.commandv("osd-auto", "add", "volume", -5) end + + + -- load layout + layouts[user_opts.layout]() + + --do something with the elements + prepare_elements() + +end + + + +-- +-- Other important stuff +-- + + +function show_osc() + -- show when disabled can happen (e.g. mouse_move) due to async/delayed unbinding + if not state.enabled then return end + + msg.trace("show_osc") + --remember last time of invocation (mouse move) + state.showtime = mp.get_time() + + osc_visible(true) + + if (user_opts.fadeduration > 0) then + state.anitype = nil + end +end + +function hide_osc() + msg.trace("hide_osc") + if not state.enabled then + -- typically hide happens at render() from tick(), but now tick() is + -- no-op and won't render again to remove the osc, so do that manually. + state.osc_visible = false + timer_stop() + render_wipe() + elseif (user_opts.fadeduration > 0) then + if not(state.osc_visible == false) then + state.anitype = "out" + control_timer() + end + else + osc_visible(false) + end +end + +function osc_visible(visible) + state.osc_visible = visible + control_timer() +end + +function pause_state(name, enabled) + state.paused = enabled + control_timer() +end + +function cache_state(name, idle) + state.cache_idle = idle + control_timer() +end + +function control_timer() + if (state.paused) and (state.osc_visible) and + ( not(state.cache_idle) or not (state.anitype == nil) ) then + + timer_start() + else + timer_stop() + end +end + +function timer_start() + if not (state.timer_active) then + msg.trace("timer start") + + if (state.timer == nil) then + -- create new timer + state.timer = mp.add_periodic_timer(0.03, tick) + else + -- resume existing one + state.timer:resume() + end + + state.timer_active = true + end +end + +function timer_stop() + if (state.timer_active) then + msg.trace("timer stop") + + if not (state.timer == nil) then + -- kill timer + state.timer:kill() + end + + state.timer_active = false + end +end + + + +function mouse_leave() + if user_opts.hidetimeout >= 0 then + hide_osc() + end + -- reset mouse position + state.last_mouseX, state.last_mouseY = nil, nil +end + +function request_init() + state.initREQ = true +end + +function render_wipe() + msg.trace("render_wipe()") + mp.set_osd_ass(0, 0, "{}") +end + +function render() + msg.trace("rendering") + local current_screen_sizeX, current_screen_sizeY, aspect = mp.get_osd_size() + local mouseX, mouseY = get_virt_mouse_pos() + local now = mp.get_time() + + -- check if display changed, if so request reinit + if not (state.mp_screen_sizeX == current_screen_sizeX + and state.mp_screen_sizeY == current_screen_sizeY) then + + request_init() + + state.mp_screen_sizeX = current_screen_sizeX + state.mp_screen_sizeY = current_screen_sizeY + end + + -- init management + if state.initREQ then + osc_init() + state.initREQ = false + + -- store initial mouse position + if (state.last_mouseX == nil or state.last_mouseY == nil) + and not (mouseX == nil or mouseY == nil) then + + state.last_mouseX, state.last_mouseY = mouseX, mouseY + end + end + + + -- fade animation + if not(state.anitype == nil) then + + if (state.anistart == nil) then + state.anistart = now + end + + if (now < state.anistart + (user_opts.fadeduration/1000)) then + + if (state.anitype == "in") then --fade in + osc_visible(true) + state.animation = scale_value(state.anistart, + (state.anistart + (user_opts.fadeduration/1000)), + 255, 0, now) + elseif (state.anitype == "out") then --fade out + state.animation = scale_value(state.anistart, + (state.anistart + (user_opts.fadeduration/1000)), + 0, 255, now) + end + + else + if (state.anitype == "out") then + osc_visible(false) + end + state.anistart = nil + state.animation = nil + state.anitype = nil + end + else + state.anistart = nil + state.animation = nil + state.anitype = nil + end + + --mouse show/hide area + for k,cords in pairs(osc_param.areas["showhide"]) do + set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide") + end + do_enable_keybindings() + + --mouse input area + local mouse_over_osc = false + + for _,cords in ipairs(osc_param.areas["input"]) do + if state.osc_visible then -- activate only when OSC is actually visible + set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "input") + end + if state.osc_visible ~= state.input_enabled then + if state.osc_visible then + mp.enable_key_bindings("input") + else + mp.disable_key_bindings("input") + end + state.input_enabled = state.osc_visible + end + + if (mouse_hit_coords(cords.x1, cords.y1, cords.x2, cords.y2)) then + mouse_over_osc = true + end + end + + -- autohide + if not (state.showtime == nil) and (user_opts.hidetimeout >= 0) + and (state.showtime + (user_opts.hidetimeout/1000) < now) + and (state.active_element == nil) and not (mouse_over_osc) then + + hide_osc() + end + + + -- actual rendering + local ass = assdraw.ass_new() + + -- Messages + render_message(ass) + + -- mpv_thumbnail_script.lua -- + local thumb_was_visible = osc_thumb_state.visible + osc_thumb_state.visible = false + -- // mpv_thumbnail_script.lua // -- + + -- actual OSC + if state.osc_visible then + render_elements(ass) + end + + -- mpv_thumbnail_script.lua -- + if not osc_thumb_state.visible and thumb_was_visible then + hide_thumbnail() + end + -- // mpv_thumbnail_script.lua // -- + + -- submit + mp.set_osd_ass(osc_param.playresy * osc_param.display_aspect, + osc_param.playresy, ass.text) + + + + +end + +-- +-- Eventhandling +-- + +local function element_has_action(element, action) + return element and element.eventresponder and + element.eventresponder[action] +end + +function process_event(source, what) + local action = string.format("%s%s", source, + what and ("_" .. what) or "") + + if what == "down" or what == "press" then + + for n = 1, #elements do + + if mouse_hit(elements[n]) and + elements[n].eventresponder and + (elements[n].eventresponder[source .. "_up"] or + elements[n].eventresponder[action]) then + + if what == "down" then + state.active_element = n + state.active_event_source = source + end + -- fire the down or press event if the element has one + if element_has_action(elements[n], action) then + elements[n].eventresponder[action](elements[n]) + end + + end + end + + elseif what == "up" then + + if elements[state.active_element] then + local n = state.active_element + + if n == 0 then + --click on background (does not work) + elseif element_has_action(elements[n], action) and + mouse_hit(elements[n]) then + + elements[n].eventresponder[action](elements[n]) + end + + --reset active element + if element_has_action(elements[n], "reset") then + elements[n].eventresponder["reset"](elements[n]) + end + + end + state.active_element = nil + state.mouse_down_counter = 0 + + elseif source == "mouse_move" then + + local mouseX, mouseY = get_virt_mouse_pos() + if (user_opts.minmousemove == 0) or + (not ((state.last_mouseX == nil) or (state.last_mouseY == nil)) and + ((math.abs(mouseX - state.last_mouseX) >= user_opts.minmousemove) + or (math.abs(mouseY - state.last_mouseY) >= user_opts.minmousemove) + ) + ) then + show_osc() + end + state.last_mouseX, state.last_mouseY = mouseX, mouseY + + local n = state.active_element + if element_has_action(elements[n], action) then + elements[n].eventresponder[action](elements[n]) + end + tick() + end +end + +-- called by mpv on every frame +function tick() + if (not state.enabled) then return end + + if (state.idle) then + + -- render idle message + msg.trace("idle message") + local icon_x, icon_y = 320 - 26, 140 + + local ass = assdraw.ass_new() + ass:new_event() + ass:pos(icon_x, icon_y) + ass:append("{\\rDefault\\an7\\c&H430142&\\1a&H00&\\bord0\\shad0\\p6}m 1605 828 b 1605 1175 1324 1456 977 1456 631 1456 349 1175 349 828 349 482 631 200 977 200 1324 200 1605 482 1605 828{\\p0}") + ass:new_event() + ass:pos(icon_x, icon_y) + ass:append("{\\rDefault\\an7\\c&HDDDBDD&\\1a&H00&\\bord0\\shad0\\p6}m 1296 910 b 1296 1131 1117 1310 897 1310 676 1310 497 1131 497 910 497 689 676 511 897 511 1117 511 1296 689 1296 910{\\p0}") + ass:new_event() + ass:pos(icon_x, icon_y) + ass:append("{\\rDefault\\an7\\c&H691F69&\\1a&H00&\\bord0\\shad0\\p6}m 762 1113 l 762 708 b 881 776 1000 843 1119 911 1000 978 881 1046 762 1113{\\p0}") + ass:new_event() + ass:pos(icon_x, icon_y) + ass:append("{\\rDefault\\an7\\c&H682167&\\1a&H00&\\bord0\\shad0\\p6}m 925 42 b 463 42 87 418 87 880 87 1343 463 1718 925 1718 1388 1718 1763 1343 1763 880 1763 418 1388 42 925 42 m 925 42 m 977 200 b 1324 200 1605 482 1605 828 1605 1175 1324 1456 977 1456 631 1456 349 1175 349 828 349 482 631 200 977 200{\\p0}") + ass:new_event() + ass:pos(icon_x, icon_y) + ass:append("{\\rDefault\\an7\\c&H753074&\\1a&H00&\\bord0\\shad0\\p6}m 977 198 b 630 198 348 480 348 828 348 1176 630 1458 977 1458 1325 1458 1607 1176 1607 828 1607 480 1325 198 977 198 m 977 198 m 977 202 b 1323 202 1604 483 1604 828 1604 1174 1323 1454 977 1454 632 1454 351 1174 351 828 351 483 632 202 977 202{\\p0}") + ass:new_event() + ass:pos(icon_x, icon_y) + ass:append("{\\rDefault\\an7\\c&HE5E5E5&\\1a&H00&\\bord0\\shad0\\p6}m 895 10 b 401 10 0 410 0 905 0 1399 401 1800 895 1800 1390 1800 1790 1399 1790 905 1790 410 1390 10 895 10 m 895 10 m 925 42 b 1388 42 1763 418 1763 880 1763 1343 1388 1718 925 1718 463 1718 87 1343 87 880 87 418 463 42 925 42{\\p0}") + ass:new_event() + ass:pos(320, icon_y+65) + ass:an(8) + ass:append("Drop files or URLs to play here.") + mp.set_osd_ass(640, 360, ass.text) + + if state.showhide_enabled then + mp.disable_key_bindings("showhide") + state.showhide_enabled = false + end + + + elseif (state.fullscreen and user_opts.showfullscreen) + or (not state.fullscreen and user_opts.showwindowed) then + + -- render the OSC + render() + else + -- Flush OSD + mp.set_osd_ass(osc_param.playresy, osc_param.playresy, "") + end +end + +function do_enable_keybindings() + if state.enabled then + if not state.showhide_enabled then + mp.enable_key_bindings("showhide", "allow-vo-dragging+allow-hide-cursor") + end + state.showhide_enabled = true + end +end + +function enable_osc(enable) + state.enabled = enable + if enable then + do_enable_keybindings() + else + hide_osc() -- acts immediately when state.enabled == false + if state.showhide_enabled then + mp.disable_key_bindings("showhide") + end + state.showhide_enabled = false + end +end + +-- mpv_thumbnail_script.lua -- + +local builtin_osc_enabled = mp.get_property_native('osc') +if builtin_osc_enabled then + local err = "You must disable the built-in OSC with osc=no in your configuration!" + mp.osd_message(err, 5) + msg.error(err) + + -- This may break, but since we can, let's try to just disable the builtin OSC. + mp.set_property_native('osc', false) +end + +-- // mpv_thumbnail_script.lua // -- + + +validate_user_opts() + +mp.register_event("start-file", request_init) +mp.register_event("tracks-changed", request_init) +mp.observe_property("playlist", nil, request_init) + +mp.register_script_message("osc-message", show_message) +mp.register_script_message("osc-chapterlist", function(dur) + show_message(get_chapterlist(), dur) +end) +mp.register_script_message("osc-playlist", function(dur) + show_message(get_playlist(), dur) +end) +mp.register_script_message("osc-tracklist", function(dur) + local msg = {} + for k,v in pairs(nicetypes) do + table.insert(msg, get_tracklist(k)) + end + show_message(table.concat(msg, '\n\n'), dur) +end) + +mp.observe_property("fullscreen", "bool", + function(name, val) + state.fullscreen = val + request_init() + end +) +mp.observe_property("idle-active", "bool", + function(name, val) + state.idle = val + tick() + end +) +mp.observe_property("pause", "bool", pause_state) +mp.observe_property("cache-idle", "bool", cache_state) +mp.observe_property("vo-configured", "bool", function(name, val) + if val then + mp.register_event("tick", tick) + else + mp.unregister_event(tick) + end +end) + +-- mouse show/hide bindings +mp.set_key_bindings({ + {"mouse_move", function(e) process_event("mouse_move", nil) end}, + {"mouse_leave", mouse_leave}, +}, "showhide", "force") +do_enable_keybindings() + +--mouse input bindings +mp.set_key_bindings({ + {"mbtn_left", function(e) process_event("mbtn_left", "up") end, + function(e) process_event("mbtn_left", "down") end}, + {"shift+mbtn_left", function(e) process_event("shift+mbtn_left", "up") end, + function(e) process_event("shift+mbtn_left", "down") end}, + {"mbtn_right", function(e) process_event("mbtn_right", "up") end, + function(e) process_event("mbtn_right", "down") end}, + {"wheel_up", function(e) process_event("wheel_up", "press") end}, + {"wheel_down", function(e) process_event("wheel_down", "press") end}, + {"mbtn_left_dbl", "ignore"}, + {"shift+mbtn_left_dbl", "ignore"}, + {"mbtn_right_dbl", "ignore"}, +}, "input", "force") +mp.enable_key_bindings("input") + + +user_opts.hidetimeout_orig = user_opts.hidetimeout + +function always_on(val) + if val then + user_opts.hidetimeout = -1 -- disable autohide + if state.enabled then show_osc() end + else + user_opts.hidetimeout = user_opts.hidetimeout_orig + if state.enabled then hide_osc() end + end +end + +-- mode can be auto/always/never/cycle +-- the modes only affect internal variables and not stored on its own. +function visibility_mode(mode, no_osd) + if mode == "cycle" then + if not state.enabled then + mode = "auto" + elseif user_opts.hidetimeout >= 0 then + mode = "always" + else + mode = "never" + end + end + + if mode == "auto" then + always_on(false) + enable_osc(true) + elseif mode == "always" then + enable_osc(true) + always_on(true) + elseif mode == "never" then + enable_osc(false) + else + msg.warn("Ignoring unknown visibility mode '" .. mode .. "'") + return + end + + if not no_osd and tonumber(mp.get_property("osd-level")) >= 1 then + mp.osd_message("OSC visibility: " .. mode) + end +end + +visibility_mode(user_opts.visibility, true) +mp.register_script_message("osc-visibility", visibility_mode) +mp.add_key_binding(nil, "visibility", function() visibility_mode("cycle") end) + +set_virt_mouse_area(0, 0, 0, 0, "input") diff --git a/mpv/scripts/mpv_thumbnail_script_server.lua b/mpv/scripts/mpv_thumbnail_script_server.lua new file mode 100644 index 0000000..df9cfda --- /dev/null +++ b/mpv/scripts/mpv_thumbnail_script_server.lua @@ -0,0 +1,736 @@ +--[[ + Copyright (C) 2017 AMM + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +]]-- +--[[ + mpv_thumbnail_script.lua 0.4.2 - commit 682becf (branch master) + https://github.com/TheAMM/mpv_thumbnail_script + Built on 2022-08-30 16:27:14 +]]-- +local assdraw = require 'mp.assdraw' +local msg = require 'mp.msg' +local opt = require 'mp.options' +local utils = require 'mp.utils' + +-- Determine platform -- +ON_WINDOWS = (package.config:sub(1,1) ~= '/') + +-- Some helper functions needed to parse the options -- +function isempty(v) return (v == false) or (v == nil) or (v == "") or (v == 0) or (type(v) == "table" and next(v) == nil) end + +function divmod (a, b) + return math.floor(a / b), a % b +end + +-- Better modulo +function bmod( i, N ) + return (i % N + N) % N +end + +function join_paths(...) + local sep = ON_WINDOWS and "\\" or "/" + local result = ""; + for i, p in pairs({...}) do + if p ~= "" then + if is_absolute_path(p) then + result = p + else + result = (result ~= "") and (result:gsub("[\\"..sep.."]*$", "") .. sep .. p) or p + end + end + end + return result:gsub("[\\"..sep.."]*$", "") +end + +-- /some/path/file.ext -> /some/path, file.ext +function split_path( path ) + local sep = ON_WINDOWS and "\\" or "/" + local first_index, last_index = path:find('^.*' .. sep) + + if last_index == nil then + return "", path + else + local dir = path:sub(0, last_index-1) + local file = path:sub(last_index+1, -1) + + return dir, file + end +end + +function is_absolute_path( path ) + local tmp, is_win = path:gsub("^[A-Z]:\\", "") + local tmp, is_unix = path:gsub("^/", "") + return (is_win > 0) or (is_unix > 0) +end + +function Set(source) + local set = {} + for _, l in ipairs(source) do set[l] = true end + return set +end + +--------------------------- +-- More helper functions -- +--------------------------- + +-- Removes all keys from a table, without destroying the reference to it +function clear_table(target) + for key, value in pairs(target) do + target[key] = nil + end +end +function shallow_copy(target) + local copy = {} + for k, v in pairs(target) do + copy[k] = v + end + return copy +end + +-- Rounds to given decimals. eg. round_dec(3.145, 0) => 3 +function round_dec(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +function file_exists(name) + local f = io.open(name, "rb") + if f ~= nil then + local ok, err, code = f:read(1) + io.close(f) + return code == nil + else + return false + end +end + +function path_exists(name) + local f = io.open(name, "rb") + if f ~= nil then + io.close(f) + return true + else + return false + end +end + +function create_directories(path) + local cmd + if ON_WINDOWS then + cmd = { args = {"cmd", "/c", "mkdir", path} } + else + cmd = { args = {"mkdir", "-p", path} } + end + utils.subprocess(cmd) +end + +-- Find an executable in PATH or CWD with the given name +function find_executable(name) + local delim = ON_WINDOWS and ";" or ":" + + local pwd = os.getenv("PWD") or utils.getcwd() + local path = os.getenv("PATH") + + local env_path = pwd .. delim .. path -- Check CWD first + + local result, filename + for path_dir in env_path:gmatch("[^"..delim.."]+") do + filename = join_paths(path_dir, name) + if file_exists(filename) then + result = filename + break + end + end + + return result +end + +local ExecutableFinder = { path_cache = {} } +-- Searches for an executable and caches the result if any +function ExecutableFinder:get_executable_path( name, raw_name ) + name = ON_WINDOWS and not raw_name and (name .. ".exe") or name + + if self.path_cache[name] == nil then + self.path_cache[name] = find_executable(name) or false + end + return self.path_cache[name] +end + +-- Format seconds to HH.MM.SS.sss +function format_time(seconds, sep, decimals) + decimals = decimals == nil and 3 or decimals + sep = sep and sep or "." + local s = seconds + local h, s = divmod(s, 60*60) + local m, s = divmod(s, 60) + + local second_format = string.format("%%0%d.%df", 2+(decimals > 0 and decimals+1 or 0), decimals) + + return string.format("%02d"..sep.."%02d"..sep..second_format, h, m, s) +end + +-- Format seconds to 1h 2m 3.4s +function format_time_hms(seconds, sep, decimals, force_full) + decimals = decimals == nil and 1 or decimals + sep = sep ~= nil and sep or " " + + local s = seconds + local h, s = divmod(s, 60*60) + local m, s = divmod(s, 60) + + if force_full or h > 0 then + return string.format("%dh"..sep.."%dm"..sep.."%." .. tostring(decimals) .. "fs", h, m, s) + elseif m > 0 then + return string.format("%dm"..sep.."%." .. tostring(decimals) .. "fs", m, s) + else + return string.format("%." .. tostring(decimals) .. "fs", s) + end +end + +-- Writes text on OSD and console +function log_info(txt, timeout) + timeout = timeout or 1.5 + msg.info(txt) + mp.osd_message(txt, timeout) +end + +-- Join table items, ala ({"a", "b", "c"}, "=", "-", ", ") => "=a-, =b-, =c-" +function join_table(source, before, after, sep) + before = before or "" + after = after or "" + sep = sep or ", " + local result = "" + for i, v in pairs(source) do + if not isempty(v) then + local part = before .. v .. after + if i == 1 then + result = part + else + result = result .. sep .. part + end + end + end + return result +end + +function wrap(s, char) + char = char or "'" + return char .. s .. char +end +-- Wraps given string into 'string' and escapes any 's in it +function escape_and_wrap(s, char, replacement) + char = char or "'" + replacement = replacement or "\\" .. char + return wrap(string.gsub(s, char, replacement), char) +end +-- Escapes single quotes in a string and wraps the input in single quotes +function escape_single_bash(s) + return escape_and_wrap(s, "'", "'\\''") +end + +-- Returns (a .. b) if b is not empty or nil +function joined_or_nil(a, b) + return not isempty(b) and (a .. b) or nil +end + +-- Put items from one table into another +function extend_table(target, source) + for i, v in pairs(source) do + table.insert(target, v) + end +end + +-- Creates a handle and filename for a temporary random file (in current directory) +function create_temporary_file(base, mode, suffix) + local handle, filename + suffix = suffix or "" + while true do + filename = base .. tostring(math.random(1, 5000)) .. suffix + handle = io.open(filename, "r") + if not handle then + handle = io.open(filename, mode) + break + end + io.close(handle) + end + return handle, filename +end + + +function get_processor_count() + local proc_count + + if ON_WINDOWS then + proc_count = tonumber(os.getenv("NUMBER_OF_PROCESSORS")) + else + local cpuinfo_handle = io.open("/proc/cpuinfo") + if cpuinfo_handle ~= nil then + local cpuinfo_contents = cpuinfo_handle:read("*a") + local _, replace_count = cpuinfo_contents:gsub('processor', '') + proc_count = replace_count + end + end + + if proc_count and proc_count > 0 then + return proc_count + else + return nil + end +end + +function substitute_values(string, values) + local substitutor = function(match) + if match == "%" then + return "%" + else + -- nil is discarded by gsub + return values[match] + end + end + + local substituted = string:gsub('%%(.)', substitutor) + return substituted +end + +-- ASS HELPERS -- +function round_rect_top( ass, x0, y0, x1, y1, r ) + local c = 0.551915024494 * r -- circle approximation + ass:move_to(x0 + r, y0) + ass:line_to(x1 - r, y0) -- top line + if r > 0 then + ass:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r) -- top right corner + end + ass:line_to(x1, y1) -- right line + ass:line_to(x0, y1) -- bottom line + ass:line_to(x0, y0 + r) -- left line + if r > 0 then + ass:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0) -- top left corner + end +end + +function round_rect(ass, x0, y0, x1, y1, rtl, rtr, rbr, rbl) + local c = 0.551915024494 + ass:move_to(x0 + rtl, y0) + ass:line_to(x1 - rtr, y0) -- top line + if rtr > 0 then + ass:bezier_curve(x1 - rtr + rtr*c, y0, x1, y0 + rtr - rtr*c, x1, y0 + rtr) -- top right corner + end + ass:line_to(x1, y1 - rbr) -- right line + if rbr > 0 then + ass:bezier_curve(x1, y1 - rbr + rbr*c, x1 - rbr + rbr*c, y1, x1 - rbr, y1) -- bottom right corner + end + ass:line_to(x0 + rbl, y1) -- bottom line + if rbl > 0 then + ass:bezier_curve(x0 + rbl - rbl*c, y1, x0, y1 - rbl + rbl*c, x0, y1 - rbl) -- bottom left corner + end + ass:line_to(x0, y0 + rtl) -- left line + if rtl > 0 then + ass:bezier_curve(x0, y0 + rtl - rtl*c, x0 + rtl - rtl*c, y0, x0 + rtl, y0) -- top left corner + end +end +local SCRIPT_NAME = "mpv_thumbnail_script" + +local default_cache_base = ON_WINDOWS and os.getenv("TEMP") or "/tmp/" + +local thumbnailer_options = { + -- The thumbnail directory + cache_directory = join_paths(default_cache_base, "mpv_thumbs_cache"), + + ------------------------ + -- Generation options -- + ------------------------ + + -- Automatically generate the thumbnails on video load, without a keypress + autogenerate = true, + + -- Only automatically thumbnail videos shorter than this (seconds) + autogenerate_max_duration = 3600, -- 1 hour + + -- SHA1-sum filenames over this length + -- It's nice to know what files the thumbnails are (hence directory names) + -- but long URLs may approach filesystem limits. + hash_filename_length = 128, + + -- Use mpv to generate thumbnail even if ffmpeg is found in PATH + -- ffmpeg does not handle ordered chapters (MKVs which rely on other MKVs)! + -- mpv is a bit slower, but has better support overall (eg. subtitles in the previews) + prefer_mpv = true, + + -- Explicitly disable subtitles on the mpv sub-calls + mpv_no_sub = false, + -- Add a "--no-config" to the mpv sub-call arguments + mpv_no_config = false, + -- Add a "--profile=" to the mpv sub-call arguments + -- Use "" to disable + mpv_profile = "", + -- Output debug logs to .log, ala //000000.bgra.log + -- The logs are removed after successful encodes, unless you set mpv_keep_logs below + mpv_logs = true, + -- Keep all mpv logs, even the succesfull ones + mpv_keep_logs = false, + + -- Disable the built-in keybind ("T") to add your own + disable_keybinds = false, + + --------------------- + -- Display options -- + --------------------- + + -- Move the thumbnail up or down + -- For example: + -- topbar/bottombar: 24 + -- rest: 0 + vertical_offset = 24, + + -- Adjust background padding + -- Examples: + -- topbar: 0, 10, 10, 10 + -- bottombar: 10, 0, 10, 10 + -- slimbox/box: 10, 10, 10, 10 + pad_top = 10, + pad_bot = 0, + pad_left = 10, + pad_right = 10, + + -- If true, pad values are screen-pixels. If false, video-pixels. + pad_in_screenspace = true, + -- Calculate pad into the offset + offset_by_pad = true, + + -- Background color in BBGGRR + background_color = "000000", + -- Alpha: 0 - fully opaque, 255 - transparent + background_alpha = 80, + + -- Keep thumbnail on the screen near left or right side + constrain_to_screen = true, + + -- Do not display the thumbnailing progress + hide_progress = false, + + ----------------------- + -- Thumbnail options -- + ----------------------- + + -- The maximum dimensions of the thumbnails (pixels) + thumbnail_width = 200, + thumbnail_height = 200, + + -- The thumbnail count target + -- (This will result in a thumbnail every ~10 seconds for a 25 minute video) + thumbnail_count = 150, + + -- The above target count will be adjusted by the minimum and + -- maximum time difference between thumbnails. + -- The thumbnail_count will be used to calculate a target separation, + -- and min/max_delta will be used to constrict it. + + -- In other words, thumbnails will be: + -- at least min_delta seconds apart (limiting the amount) + -- at most max_delta seconds apart (raising the amount if needed) + min_delta = 5, + -- 120 seconds aka 2 minutes will add more thumbnails when the video is over 5 hours! + max_delta = 90, + + + -- Overrides for remote urls (you generally want less thumbnails!) + -- Thumbnailing network paths will be done with mpv + + -- Allow thumbnailing network paths (naive check for "://") + thumbnail_network = false, + -- Override thumbnail count, min/max delta + remote_thumbnail_count = 60, + remote_min_delta = 15, + remote_max_delta = 120, + + -- Try to grab the raw stream and disable ytdl for the mpv subcalls + -- Much faster than passing the url to ytdl again, but may cause problems with some sites + remote_direct_stream = true, +} + +read_options(thumbnailer_options, SCRIPT_NAME) +function skip_nil(tbl) + local n = {} + for k, v in pairs(tbl) do + table.insert(n, v) + end + return n +end + +function create_thumbnail_mpv(file_path, timestamp, size, output_path, options) + options = options or {} + + local ytdl_disabled = not options.enable_ytdl and (mp.get_property_native("ytdl") == false + or thumbnailer_options.remote_direct_stream) + + local header_fields_arg = nil + local header_fields = mp.get_property_native("http-header-fields") + if #header_fields > 0 then + -- We can't escape the headers, mpv won't parse "--http-header-fields='Name: value'" properly + header_fields_arg = "--http-header-fields=" .. table.concat(header_fields, ",") + end + + local profile_arg = nil + if thumbnailer_options.mpv_profile ~= "" then + profile_arg = "--profile=" .. thumbnailer_options.mpv_profile + end + + local log_arg = "--log-file=" .. output_path .. ".log" + + local mpv_command = skip_nil({ + "mpv", + -- Hide console output + "--msg-level=all=no", + + -- Disable ytdl + (ytdl_disabled and "--no-ytdl" or nil), + -- Pass HTTP headers from current instance + header_fields_arg, + -- Pass User-Agent and Referer - should do no harm even with ytdl active + "--user-agent=" .. mp.get_property_native("user-agent"), + "--referrer=" .. mp.get_property_native("referrer"), + -- Disable hardware decoding + "--hwdec=no", + + -- Insert --no-config, --profile=... and --log-file if enabled + (thumbnailer_options.mpv_no_config and "--no-config" or nil), + profile_arg, + (thumbnailer_options.mpv_logs and log_arg or nil), + + file_path, + + "--start=" .. tostring(timestamp), + "--frames=1", + "--hr-seek=yes", + "--no-audio", + -- Optionally disable subtitles + (thumbnailer_options.mpv_no_sub and "--no-sub" or nil), + + ("--vf=scale=%d:%d"):format(size.w, size.h), + "--vf-add=format=bgra", + "--of=rawvideo", + "--ovc=rawvideo", + "--o=" .. output_path + }) + return utils.subprocess({args=mpv_command}) +end + + +function create_thumbnail_ffmpeg(file_path, timestamp, size, output_path) + local ffmpeg_command = { + "ffmpeg", + "-loglevel", "quiet", + "-noaccurate_seek", + "-ss", format_time(timestamp, ":"), + "-i", file_path, + + "-frames:v", "1", + "-an", + + "-vf", ("scale=%d:%d"):format(size.w, size.h), + "-c:v", "rawvideo", + "-pix_fmt", "bgra", + "-f", "rawvideo", + + "-y", output_path + } + return utils.subprocess({args=ffmpeg_command}) +end + + +function check_output(ret, output_path, is_mpv) + local log_path = output_path .. ".log" + local success = true + + if ret.killed_by_us then + return nil + else + if ret.error or ret.status ~= 0 then + msg.error("Thumbnailing command failed!") + msg.error("mpv process error:", ret.error) + msg.error("Process stdout:", ret.stdout) + if is_mpv then + msg.error("Debug log:", log_path) + end + + success = false + end + + if not file_exists(output_path) then + msg.error("Output file missing!", output_path) + success = false + end + end + + if is_mpv and not thumbnailer_options.mpv_keep_logs then + -- Remove successful debug logs + if success and file_exists(log_path) then + os.remove(log_path) + end + end + + return success +end + + +function do_worker_job(state_json_string, frames_json_string) + msg.debug("Handling given job") + local thumb_state, err = utils.parse_json(state_json_string) + if err then + msg.error("Failed to parse state JSON") + return + end + + local thumbnail_indexes, err = utils.parse_json(frames_json_string) + if err then + msg.error("Failed to parse thumbnail frame indexes") + return + end + + local thumbnail_func = create_thumbnail_mpv + if not thumbnailer_options.prefer_mpv then + if ExecutableFinder:get_executable_path("ffmpeg") then + thumbnail_func = create_thumbnail_ffmpeg + else + msg.warn("Could not find ffmpeg in PATH! Falling back on mpv.") + end + end + + local file_duration = mp.get_property_native("duration") + local file_path = thumb_state.worker_input_path + + if thumb_state.is_remote then + if (thumbnail_func == create_thumbnail_ffmpeg) then + msg.warn("Thumbnailing remote path, falling back on mpv.") + end + thumbnail_func = create_thumbnail_mpv + end + + local generate_thumbnail_for_index = function(thumbnail_index) + -- Given a 1-based thumbnail index, generate a thumbnail for it based on the thumbnailer state + local thumb_idx = thumbnail_index - 1 + msg.debug("Starting work on thumbnail", thumb_idx) + + local thumbnail_path = thumb_state.thumbnail_template:format(thumb_idx) + -- Grab the "middle" of the thumbnail duration instead of the very start, and leave some margin in the end + local timestamp = math.min(file_duration - 0.25, (thumb_idx + 0.5) * thumb_state.thumbnail_delta) + + mp.commandv("script-message", "mpv_thumbnail_script-progress", tostring(thumbnail_index)) + + -- The expected size (raw BGRA image) + local thumbnail_raw_size = (thumb_state.thumbnail_size.w * thumb_state.thumbnail_size.h * 4) + + local need_thumbnail_generation = false + + -- Check if the thumbnail already exists and is the correct size + local thumbnail_file = io.open(thumbnail_path, "rb") + if thumbnail_file == nil then + need_thumbnail_generation = true + else + local existing_thumbnail_filesize = thumbnail_file:seek("end") + if existing_thumbnail_filesize ~= thumbnail_raw_size then + -- Size doesn't match, so (re)generate + msg.warn("Thumbnail", thumb_idx, "did not match expected size, regenerating") + need_thumbnail_generation = true + end + thumbnail_file:close() + end + + if need_thumbnail_generation then + local ret = thumbnail_func(file_path, timestamp, thumb_state.thumbnail_size, thumbnail_path, thumb_state.worker_extra) + local success = check_output(ret, thumbnail_path, thumbnail_func == create_thumbnail_mpv) + + if success == nil then + -- Killed by us, changing files, ignore + msg.debug("Changing files, subprocess killed") + return true + elseif not success then + -- Real failure + mp.osd_message("Thumbnailing failed, check console for details", 3.5) + return true + end + else + msg.debug("Thumbnail", thumb_idx, "already done!") + end + + -- Verify thumbnail size + -- Sometimes ffmpeg will output an empty file when seeking to a "bad" section (usually the end) + thumbnail_file = io.open(thumbnail_path, "rb") + + -- Bail if we can't read the file (it should really exist by now, we checked this in check_output!) + if thumbnail_file == nil then + msg.error("Thumbnail suddenly disappeared!") + return true + end + + -- Check the size of the generated file + local thumbnail_file_size = thumbnail_file:seek("end") + thumbnail_file:close() + + -- Check if the file is big enough + local missing_bytes = math.max(0, thumbnail_raw_size - thumbnail_file_size) + if missing_bytes > 0 then + msg.warn(("Thumbnail missing %d bytes (expected %d, had %d), padding %s"):format( + missing_bytes, thumbnail_raw_size, thumbnail_file_size, thumbnail_path + )) + -- Pad the file if it's missing content (eg. ffmpeg seek to file end) + thumbnail_file = io.open(thumbnail_path, "ab") + thumbnail_file:write(string.rep(string.char(0), missing_bytes)) + thumbnail_file:close() + end + + msg.debug("Finished work on thumbnail", thumb_idx) + mp.commandv("script-message", "mpv_thumbnail_script-ready", tostring(thumbnail_index), thumbnail_path) + end + + msg.debug(("Generating %d thumbnails @ %dx%d for %q"):format( + #thumbnail_indexes, + thumb_state.thumbnail_size.w, + thumb_state.thumbnail_size.h, + file_path)) + + for i, thumbnail_index in ipairs(thumbnail_indexes) do + local bail = generate_thumbnail_for_index(thumbnail_index) + if bail then return end + end + +end + +-- Set up listeners and keybinds + +-- Job listener +mp.register_script_message("mpv_thumbnail_script-job", do_worker_job) + + +-- Register this worker with the master script +local register_timer = nil +local register_timeout = mp.get_time() + 1.5 + +local register_function = function() + if mp.get_time() > register_timeout and register_timer then + msg.error("Thumbnail worker registering timed out") + register_timer:stop() + else + msg.debug("Announcing self to master...") + mp.commandv("script-message", "mpv_thumbnail_script-worker", mp.get_script_name()) + end +end + +register_timer = mp.add_periodic_timer(0.1, register_function) + +mp.register_script_message("mpv_thumbnail_script-slaved", function() + msg.debug("Successfully registered with master") + register_timer:stop() +end) diff --git a/mpv/scripts/seek-to.lua b/mpv/scripts/seek-to.lua new file mode 100644 index 0000000..f6a1ed3 --- /dev/null +++ b/mpv/scripts/seek-to.lua @@ -0,0 +1,157 @@ +local assdraw = require 'mp.assdraw' +local active = false +local cursor_position = 1 +local time_scale = {60*60*10, 60*60, 60*10, 60, 10, 1, 0.1, 0.01, 0.001} + +local ass_begin = mp.get_property("osd-ass-cc/0") +local ass_end = mp.get_property("osd-ass-cc/1") + +local history = { {} } +for i = 1, 9 do + history[1][i] = 0 +end +local history_position = 1 + +-- timer to redraw periodically the message +-- to avoid leaving bindings when the seeker disappears for whatever reason +-- pretty hacky tbh +local timer = nil +local timer_duration = 3 + +function show_seeker() + local prepend_char = {'','',':','',':','','.','',''} + local str = '' + for i = 1, 9 do + str = str .. prepend_char[i] + if i == cursor_position then + str = str .. '{\\b1}' .. history[history_position][i] .. '{\\r}' + else + str = str .. history[history_position][i] + end + end + mp.osd_message("Seek to: " .. ass_begin .. str .. ass_end, timer_duration) +end + +function copy_history_to_last() + if history_position ~= #history then + for i = 1, 9 do + history[#history][i] = history[history_position][i] + end + history_position = #history + end +end + +function change_number(i) + -- can't set above 60 minutes or seconds + if (cursor_position == 3 or cursor_position == 5) and i >= 6 then + return + end + if history[history_position][cursor_position] ~= i then + copy_history_to_last() + history[#history][cursor_position] = i + end + shift_cursor(false) +end + +function shift_cursor(left) + if left then + cursor_position = math.max(1, cursor_position - 1) + else + cursor_position = math.min(cursor_position + 1, 9) + end +end + +function current_time_as_sec(time) + local sec = 0 + for i = 1, 9 do + sec = sec + time_scale[i] * time[i] + end + return sec +end + +function time_equal(lhs, rhs) + for i = 1, 9 do + if lhs[i] ~= rhs[i] then + return false + end + end + return true +end + +function seek_to() + copy_history_to_last() + mp.commandv("osd-bar", "seek", current_time_as_sec(history[history_position]), "absolute") + --deduplicate consecutive timestamps + if #history == 1 or not time_equal(history[history_position], history[#history - 1]) then + history[#history + 1] = {} + history_position = #history + end + for i = 1, 9 do + history[#history][i] = 0 + end +end + +function backspace() + if cursor_position ~= 9 or current_time[9] == 0 then + shift_cursor(true) + end + if history[history_position][cursor_position] ~= 0 then + copy_history_to_last() + history[#history][cursor_position] = 0 + end +end + +function history_move(up) + if up then + history_position = math.max(1, history_position - 1) + else + history_position = math.min(history_position + 1, #history) + end +end + +local key_mappings = { + LEFT = function() shift_cursor(true) show_seeker() end, + RIGHT = function() shift_cursor(false) show_seeker() end, + UP = function() history_move(true) show_seeker() end, + DOWN = function() history_move(false) show_seeker() end, + BS = function() backspace() show_seeker() end, + ESC = function() set_inactive() end, + ENTER = function() seek_to() set_inactive() end +} +for i = 0, 9 do + local func = function() change_number(i) show_seeker() end + key_mappings[string.format("KP%d", i)] = func + key_mappings[string.format("%d", i)] = func +end + +function set_active() + if not mp.get_property("seekable") then return end + -- find duration of the video and set cursor position accordingly + local duration = mp.get_property_number("duration") + if duration ~= nil then + for i = 1, 9 do + if duration > time_scale[i] then + cursor_position = i + break + end + end + end + for key, func in pairs(key_mappings) do + mp.add_forced_key_binding(key, "seek-to-"..key, func) + end + show_seeker() + timer = mp.add_periodic_timer(timer_duration, show_seeker) + active = true +end + +function set_inactive() + mp.osd_message("") + for key, _ in pairs(key_mappings) do + mp.remove_key_binding("seek-to-"..key) + end + timer:kill() + active = false +end + +mp.add_key_binding(nil, "toggle-seeker", function() if active then set_inactive() else set_active() end end) + diff --git a/mpv/scripts/sponsorblock b/mpv/scripts/sponsorblock new file mode 160000 index 0000000..4120b5a --- /dev/null +++ b/mpv/scripts/sponsorblock @@ -0,0 +1 @@ +Subproject commit 4120b5afc0578ce00fbede01bc9e0b8c5fc31adf diff --git a/nautilus/search-metadata b/nautilus/search-metadata new file mode 100644 index 0000000..97f7bf4 --- /dev/null +++ b/nautilus/search-metadata @@ -0,0 +1,3 @@ +[directory] +nautilus-icon-view-sort-by=search_relevance +nautilus-icon-view-sort-reversed=true diff --git a/ncmpcpp/bindings b/ncmpcpp/bindings new file mode 100644 index 0000000..645e41f --- /dev/null +++ b/ncmpcpp/bindings @@ -0,0 +1,479 @@ +############################################################## +## This is the example bindings file. Copy it to ## +## ~/.ncmpcpp/bindings or $XDG_CONFIG_HOME/ncmpcpp/bindings ## +## and set up your preferences ## +############################################################## +# +#def_key "mouse" +# mouse_event +# +#def_key "up" +# scroll_up +# +#def_key "shift-up" +# select_item +# scroll_up +# +#def_key "down" +# scroll_down +# +#def_key "shift-down" +# select_item +# scroll_down +# +#def_key "[" +# scroll_up_album +# +#def_key "]" +# scroll_down_album +# +#def_key "{" +# scroll_up_artist +# +#def_key "}" +# scroll_down_artist +# +#def_key "page_up" +# page_up +# +#def_key "page_down" +# page_down +# +#def_key "home" +# move_home +# +#def_key "end" +# move_end +# +#def_key "insert" +# select_item +# +#def_key "enter" +# enter_directory +# +#def_key "enter" +# toggle_output +# +#def_key "enter" +# run_action +# +#def_key "enter" +# play_item +# +#def_key "space" +# add_item_to_playlist +# +#def_key "space" +# toggle_lyrics_update_on_song_change +# +#def_key "space" +# toggle_visualization_type +# +#def_key "delete" +# delete_playlist_items +# +#def_key "delete" +# delete_browser_items +# +#def_key "delete" +# delete_stored_playlist +# +#def_key "right" +# next_column +# +#def_key "right" +# slave_screen +# +#def_key "right" +# volume_up +# +#def_key "+" +# volume_up +# +#def_key "left" +# previous_column +# +#def_key "left" +# master_screen +# +#def_key "left" +# volume_down +# +#def_key "-" +# volume_down +# +#def_key ":" +# execute_command +# +#def_key "tab" +# next_screen +# +#def_key "shift-tab" +# previous_screen +# +#def_key "f1" +# show_help +# +#def_key "1" +# show_playlist +# +#def_key "2" +# show_browser +# +#def_key "2" +# change_browse_mode +# +#def_key "3" +# show_search_engine +# +#def_key "3" +# reset_search_engine +# +#def_key "4" +# show_media_library +# +#def_key "4" +# toggle_media_library_columns_mode +# +#def_key "5" +# show_playlist_editor +# +#def_key "6" +# show_tag_editor +# +#def_key "7" +# show_outputs +# +#def_key "8" +# show_visualizer +# +#def_key "=" +# show_clock +# +#def_key "@" +# show_server_info +# +#def_key "s" +# stop +# +#def_key "p" +# pause +# +#def_key ">" +# next +# +#def_key "<" +# previous +# +#def_key "ctrl-h" +# jump_to_parent_directory +# +#def_key "ctrl-h" +# replay_song +# +#def_key "backspace" +# jump_to_parent_directory +# +#def_key "backspace" +# replay_song +# +#def_key "f" +# seek_forward +# +#def_key "b" +# seek_backward +# +#def_key "r" +# toggle_repeat +# +#def_key "z" +# toggle_random +# +#def_key "y" +# save_tag_changes +# +#def_key "y" +# start_searching +# +#def_key "y" +# toggle_single +# +#def_key "R" +# toggle_consume +# +#def_key "Y" +# toggle_replay_gain_mode +# +#def_key "T" +# toggle_add_mode +# +#def_key "|" +# toggle_mouse +# +#def_key "#" +# toggle_bitrate_visibility +# +#def_key "Z" +# shuffle +# +#def_key "x" +# toggle_crossfade +# +#def_key "X" +# set_crossfade +# +#def_key "u" +# update_database +# +#def_key "ctrl-s" +# sort_playlist +# +#def_key "ctrl-s" +# toggle_browser_sort_mode +# +#def_key "ctrl-s" +# toggle_media_library_sort_mode +# +#def_key "ctrl-r" +# reverse_playlist +# +#def_key "ctrl-f" +# apply_filter +# +#def_key "ctrl-_" +# select_found_items +# +#def_key "/" +# find +# +#def_key "/" +# find_item_forward +# +#def_key "?" +# find +# +#def_key "?" +# find_item_backward +# +#def_key "." +# next_found_item +# +#def_key "," +# previous_found_item +# +#def_key "w" +# toggle_find_mode +# +#def_key "e" +# edit_song +# +#def_key "e" +# edit_library_tag +# +#def_key "e" +# edit_library_album +# +#def_key "e" +# edit_directory_name +# +#def_key "e" +# edit_playlist_name +# +#def_key "e" +# edit_lyrics +# +#def_key "i" +# show_song_info +# +#def_key "I" +# show_artist_info +# +#def_key "g" +# jump_to_position_in_song +# +#def_key "l" +# show_lyrics +# +#def_key "ctrl-v" +# select_range +# +#def_key "v" +# reverse_selection +# +#def_key "V" +# remove_selection +# +#def_key "B" +# select_album +# +#def_key "a" +# add_selected_items +# +#def_key "c" +# clear_playlist +# +#def_key "c" +# clear_main_playlist +# +#def_key "C" +# crop_playlist +# +#def_key "C" +# crop_main_playlist +# +#def_key "m" +# move_sort_order_up +# +#def_key "m" +# move_selected_items_up +# +#def_key "n" +# move_sort_order_down +# +#def_key "n" +# move_selected_items_down +# +#def_key "M" +# move_selected_items_to +# +#def_key "A" +# add +# +#def_key "S" +# save_playlist +# +#def_key "o" +# jump_to_playing_song +# +#def_key "G" +# jump_to_browser +# +#def_key "G" +# jump_to_playlist_editor +# +#def_key "~" +# jump_to_media_library +# +#def_key "E" +# jump_to_tag_editor +# +#def_key "U" +# toggle_playing_song_centering +# +#def_key "P" +# toggle_display_mode +# +#def_key "\\" +# toggle_interface +# +#def_key "!" +# toggle_separators_between_albums +# +#def_key "L" +# toggle_lyrics_fetcher +# +#def_key "F" +# fetch_lyrics_in_background +# +#def_key "alt-l" +# toggle_fetching_lyrics_in_background +# +#def_key "ctrl-l" +# toggle_screen_lock +# +#def_key "`" +# toggle_library_tag_type +# +#def_key "`" +# refetch_lyrics +# +#def_key "`" +# add_random_items +# +#def_key "ctrl-p" +# set_selected_items_priority +# +#def_key "q" +# quit +# +# +#def_key "f" +# find +#def_key "f" +# find_item_forward + +def_key "+" + show_clock +def_key "=" + volume_up + +def_key "j" + scroll_down +def_key "k" + scroll_up + +def_key "ctrl-u" + page_up +#push_characters "kkkkkkkkkkkkkkk" +def_key "ctrl-d" + page_down +#push_characters "jjjjjjjjjjjjjjj" +def_key "u" + page_up +#push_characters "kkkkkkkkkkkkkkk" +def_key "d" + page_down +#push_characters "jjjjjjjjjjjjjjj" +def_key "h" + previous_column +def_key "l" + next_column + +def_key "." + show_lyrics + +def_key "n" + next_found_item +def_key "N" + previous_found_item + +# not used but bound +def_key "J" + move_sort_order_down +def_key "K" + move_sort_order_up +def_key "h" + jump_to_parent_directory +def_key "l" + enter_directory +def_key "l" + run_action +def_key "l" + play_item +def_key "m" + show_media_library +def_key "m" + toggle_media_library_columns_mode +def_key "t" + show_tag_editor +def_key "v" + show_visualizer +def_key "G" + move_end +def_key "g" + move_home +#jump_to_position_in_song +def_key "U" + update_database +def_key "s" + reset_search_engine +def_key "s" + show_search_engine +def_key "f" + show_browser +def_key "f" + change_browse_mode +def_key "x" + delete_playlist_items +def_key "P" + show_playlist diff --git a/ncmpcpp/config b/ncmpcpp/config new file mode 100644 index 0000000..3632496 --- /dev/null +++ b/ncmpcpp/config @@ -0,0 +1,32 @@ +# vim: filetype=conf + +ncmpcpp_directory = "~/.config/ncmpcpp" +lyrics_directory = "~/.local/share/lyrics" +mpd_music_dir = "~/Music" +message_delay_time = "1" +visualizer_type = "spectrum" +song_list_format = {$4%a - }{%t}|{$8%f$9}$R{$3(%l)$9} +song_status_format = $b{{$8"%t"}} $3by {$4%a{ $3in $7%b{ (%y)}} $3}|{$8%f} +song_library_format = {%n - }{%t}|{%f} +alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b +alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D} +current_item_prefix = $(cyan)$r$b +current_item_suffix = $/r$(end)$/b +current_item_inactive_column_prefix = $(magenta)$r +current_item_inactive_column_suffix = $/r$(end) +playlist_display_mode = columns +browser_display_mode = columns +progressbar_look = -> +media_library_primary_tag = album_artist +media_library_albums_split_by_date = no +startup_screen = "media_library" +display_volume_level = no +ignore_leading_the = yes +external_editor = nvim +use_console_editor = yes +empty_tag_color = magenta +main_window_color = white +progressbar_color = black:b +progressbar_elapsed_color = blue:b +statusbar_color = red +statusbar_time_color = cyan:b diff --git a/ncmpcpp/error.log b/ncmpcpp/error.log new file mode 100644 index 0000000..e69de29 diff --git a/neofetch/config.conf b/neofetch/config.conf new file mode 100644 index 0000000..97a410c --- /dev/null +++ b/neofetch/config.conf @@ -0,0 +1,864 @@ +# See this wiki page for more info: +# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info +print_info() { + info title + info underline + + info "OS" distro + info "Host" model + info "Kernel" kernel + info "Uptime" uptime + info "Packages" packages + info "Shell" shell + info "Resolution" resolution + info "DE" de + info "WM" wm + info "WM Theme" wm_theme + info "Theme" theme + info "Icons" icons + info "Terminal" term + info "Terminal Font" term_font + info "CPU" cpu + info "GPU" gpu + info "Memory" memory + + # info "GPU Driver" gpu_driver # Linux/macOS only + # info "CPU Usage" cpu_usage + # info "Disk" disk + # info "Battery" battery + # info "Font" font + # info "Song" song + # [[ "$player" ]] && prin "Music Player" "$player" + # info "Local IP" local_ip + # info "Public IP" public_ip + # info "Users" users + # info "Locale" locale # This only works on glibc systems. + + info cols +} + +# Title + + +# Hide/Show Fully qualified domain name. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --title_fqdn +title_fqdn="off" + + +# Kernel + + +# Shorten the output of the kernel function. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --kernel_shorthand +# Supports: Everything except *BSDs (except PacBSD and PC-BSD) +# +# Example: +# on: '4.8.9-1-ARCH' +# off: 'Linux 4.8.9-1-ARCH' +kernel_shorthand="on" + + +# Distro + + +# Shorten the output of the distro function +# +# Default: 'off' +# Values: 'on', 'tiny', 'off' +# Flag: --distro_shorthand +# Supports: Everything except Windows and Haiku +distro_shorthand="off" + +# Show/Hide OS Architecture. +# Show 'x86_64', 'x86' and etc in 'Distro:' output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --os_arch +# +# Example: +# on: 'Arch Linux x86_64' +# off: 'Arch Linux' +os_arch="on" + + +# Uptime + + +# Shorten the output of the uptime function +# +# Default: 'on' +# Values: 'on', 'tiny', 'off' +# Flag: --uptime_shorthand +# +# Example: +# on: '2 days, 10 hours, 3 mins' +# tiny: '2d 10h 3m' +# off: '2 days, 10 hours, 3 minutes' +uptime_shorthand="on" + + +# Memory + + +# Show memory pecentage in output. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --memory_percent +# +# Example: +# on: '1801MiB / 7881MiB (22%)' +# off: '1801MiB / 7881MiB' +memory_percent="on" + +# Change memory output unit. +# +# Default: 'mib' +# Values: 'kib', 'mib', 'gib' +# Flag: --memory_unit +# +# Example: +# kib '1020928KiB / 7117824KiB' +# mib '1042MiB / 6951MiB' +# gib: ' 0.98GiB / 6.79GiB' +memory_unit="gib" + + +# Packages + + +# Show/Hide Package Manager names. +# +# Default: 'tiny' +# Values: 'on', 'tiny' 'off' +# Flag: --package_managers +# +# Example: +# on: '998 (pacman), 8 (flatpak), 4 (snap)' +# tiny: '908 (pacman, flatpak, snap)' +# off: '908' +package_managers="on" + + +# Shell + + +# Show the path to $SHELL +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --shell_path +# +# Example: +# on: '/bin/bash' +# off: 'bash' +shell_path="off" + +# Show $SHELL version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --shell_version +# +# Example: +# on: 'bash 4.4.5' +# off: 'bash' +shell_version="on" + + +# CPU + + +# CPU speed type +# +# Default: 'bios_limit' +# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'. +# Flag: --speed_type +# Supports: Linux with 'cpufreq' +# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value. +speed_type="bios_limit" + +# CPU speed shorthand +# +# Default: 'off' +# Values: 'on', 'off'. +# Flag: --speed_shorthand +# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz +# +# Example: +# on: 'i7-6500U (4) @ 3.1GHz' +# off: 'i7-6500U (4) @ 3.100GHz' +speed_shorthand="off" + +# Enable/Disable CPU brand in output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_brand +# +# Example: +# on: 'Intel i7-6500U' +# off: 'i7-6500U (4)' +cpu_brand="on" + +# CPU Speed +# Hide/Show CPU speed. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_speed +# +# Example: +# on: 'Intel i7-6500U (4) @ 3.1GHz' +# off: 'Intel i7-6500U (4)' +cpu_speed="on" + +# CPU Cores +# Display CPU cores in output +# +# Default: 'logical' +# Values: 'logical', 'physical', 'off' +# Flag: --cpu_cores +# Support: 'physical' doesn't work on BSD. +# +# Example: +# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores) +# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores) +# off: 'Intel i7-6500U @ 3.1GHz' +cpu_cores="logical" + +# CPU Temperature +# Hide/Show CPU temperature. +# Note the temperature is added to the regular CPU function. +# +# Default: 'off' +# Values: 'C', 'F', 'off' +# Flag: --cpu_temp +# Supports: Linux, BSD +# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable +# coretemp kernel module. This only supports newer Intel processors. +# +# Example: +# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]' +# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]' +# off: 'Intel i7-6500U (4) @ 3.1GHz' +cpu_temp="C" + + +# GPU + + +# Enable/Disable GPU Brand +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gpu_brand +# +# Example: +# on: 'AMD HD 7950' +# off: 'HD 7950' +gpu_brand="on" + +# Which GPU to display +# +# Default: 'all' +# Values: 'all', 'dedicated', 'integrated' +# Flag: --gpu_type +# Supports: Linux +# +# Example: +# all: +# GPU1: AMD HD 7950 +# GPU2: Intel Integrated Graphics +# +# dedicated: +# GPU1: AMD HD 7950 +# +# integrated: +# GPU1: Intel Integrated Graphics +gpu_type="all" + + +# Resolution + + +# Display refresh rate next to each monitor +# Default: 'off' +# Values: 'on', 'off' +# Flag: --refresh_rate +# Supports: Doesn't work on Windows. +# +# Example: +# on: '1920x1080 @ 60Hz' +# off: '1920x1080' +refresh_rate="off" + + +# Gtk Theme / Icons / Font + + +# Shorten output of GTK Theme / Icons / Font +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --gtk_shorthand +# +# Example: +# on: 'Numix, Adwaita' +# off: 'Numix [GTK2], Adwaita [GTK3]' +gtk_shorthand="off" + + +# Enable/Disable gtk2 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk2 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Adwaita [GTK3]' +gtk2="on" + +# Enable/Disable gtk3 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk3 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Numix [GTK2]' +gtk3="on" + + +# IP Address + + +# Website to ping for the public IP +# +# Default: 'http://ident.me' +# Values: 'url' +# Flag: --ip_host +public_ip_host="http://ident.me" + +# Public IP timeout. +# +# Default: '2' +# Values: 'int' +# Flag: --ip_timeout +public_ip_timeout=2 + + +# Desktop Environment + + +# Show Desktop Environment version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --de_version +de_version="on" + + +# Disk + + +# Which disks to display. +# The values can be any /dev/sdXX, mount point or directory. +# NOTE: By default we only show the disk info for '/'. +# +# Default: '/' +# Values: '/', '/dev/sdXX', '/path/to/drive'. +# Flag: --disk_show +# +# Example: +# disk_show=('/' '/dev/sdb1'): +# 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 823G / 893G (93%)' +# +# disk_show=('/'): +# 'Disk (/): 74G / 118G (66%)' +# +disk_show=('/') + +# Disk subtitle. +# What to append to the Disk subtitle. +# +# Default: 'mount' +# Values: 'mount', 'name', 'dir', 'none' +# Flag: --disk_subtitle +# +# Example: +# name: 'Disk (/dev/sda1): 74G / 118G (66%)' +# 'Disk (/dev/sdb2): 74G / 118G (66%)' +# +# mount: 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Local Disk): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 74G / 118G (66%)' +# +# dir: 'Disk (/): 74G / 118G (66%)' +# 'Disk (Local Disk): 74G / 118G (66%)' +# 'Disk (Videos): 74G / 118G (66%)' +# +# none: 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +disk_subtitle="mount" + +# Disk percent. +# Show/Hide disk percent. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --disk_percent +# +# Example: +# on: 'Disk (/): 74G / 118G (66%)' +# off: 'Disk (/): 74G / 118G' +disk_percent="on" + + +# Song + + +# Manually specify a music player. +# +# Default: 'auto' +# Values: 'auto', 'player-name' +# Flag: --music_player +# +# Available values for 'player-name': +# +# amarok +# audacious +# banshee +# bluemindo +# clementine +# cmus +# deadbeef +# deepin-music +# dragon +# elisa +# exaile +# gnome-music +# gmusicbrowser +# gogglesmm +# guayadeque +# io.elementary.music +# iTunes +# juk +# lollypop +# mocp +# mopidy +# mpd +# muine +# netease-cloud-music +# olivia +# playerctl +# pogo +# pragha +# qmmp +# quodlibet +# rhythmbox +# sayonara +# smplayer +# spotify +# strawberry +# tauonmb +# tomahawk +# vlc +# xmms2d +# xnoise +# yarock +music_player="mpd" + +# Format to display song information. +# +# Default: '%artist% - %album% - %title%' +# Values: '%artist%', '%album%', '%title%' +# Flag: --song_format +# +# Example: +# default: 'Song: Jet - Get Born - Sgt Major' +song_format="%artist% - %album% - %title%" + +# Print the Artist, Album and Title on separate lines +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --song_shorthand +# +# Example: +# on: 'Artist: The Fratellis' +# 'Album: Costello Music' +# 'Song: Chelsea Dagger' +# +# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger' +song_shorthand="off" + +# 'mpc' arguments (specify a host, password etc). +# +# Default: '' +# Example: mpc_args=(-h HOST -P PASSWORD) +mpc_args=() + + +# Text Colors + + +# Text Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --colors +# +# Each number represents a different part of the text in +# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info' +# +# Example: +# colors=(distro) - Text is colored based on Distro colors. +# colors=(4 6 1 8 8 6) - Text is colored in the order above. +colors=(distro) + + +# Text Options + + +# Toggle bold text +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bold +bold="on" + +# Enable/Disable Underline +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --underline +underline_enabled="on" + +# Underline character +# +# Default: '-' +# Values: 'string' +# Flag: --underline_char +underline_char="-" + + +# Info Separator +# Replace the default separator with the specified string. +# +# Default: ':' +# Flag: --separator +# +# Example: +# separator="->": 'Shell-> bash' +# separator=" =": 'WM = dwm' +separator=":" + + +# Color Blocks + + +# Color block range +# The range of colors to print. +# +# Default: '0', '15' +# Values: 'num' +# Flag: --block_range +# +# Example: +# +# Display colors 0-7 in the blocks. (8 colors) +# neofetch --block_range 0 7 +# +# Display colors 0-15 in the blocks. (16 colors) +# neofetch --block_range 0 15 +block_range=(0 15) + +# Toggle color blocks +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --color_blocks +color_blocks="on" + +# Color block width in spaces +# +# Default: '3' +# Values: 'num' +# Flag: --block_width +block_width=3 + +# Color block height in lines +# +# Default: '1' +# Values: 'num' +# Flag: --block_height +block_height=1 + +# Color Alignment +# +# Default: 'auto' +# Values: 'auto', 'num' +# Flag: --col_offset +# +# Number specifies how far from the left side of the terminal (in spaces) to +# begin printing the columns, in case you want to e.g. center them under your +# text. +# Example: +# col_offset="auto" - Default behavior of neofetch +# col_offset=7 - Leave 7 spaces then print the colors +col_offset="auto" + +# Progress Bars + + +# Bar characters +# +# Default: '-', '=' +# Values: 'string', 'string' +# Flag: --bar_char +# +# Example: +# neofetch --bar_char 'elapsed' 'total' +# neofetch --bar_char '-' '=' +bar_char_elapsed="-" +bar_char_total="=" + +# Toggle Bar border +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bar_border +bar_border="on" + +# Progress bar length in spaces +# Number of chars long to make the progress bars. +# +# Default: '15' +# Values: 'num' +# Flag: --bar_length +bar_length=15 + +# Progress bar colors +# When set to distro, uses your distro's logo colors. +# +# Default: 'distro', 'distro' +# Values: 'distro', 'num' +# Flag: --bar_colors +# +# Example: +# neofetch --bar_colors 3 4 +# neofetch --bar_colors distro 5 +bar_color_elapsed="distro" +bar_color_total="distro" + + +# Info display +# Display a bar with the info. +# +# Default: 'off' +# Values: 'bar', 'infobar', 'barinfo', 'off' +# Flags: --cpu_display +# --memory_display +# --battery_display +# --disk_display +# +# Example: +# bar: '[---=======]' +# infobar: 'info [---=======]' +# barinfo: '[---=======] info' +# off: 'info' +cpu_display="off" +memory_display="off" +battery_display="off" +disk_display="off" + + +# Backend Settings + + +# Image backend. +# +# Default: 'ascii' +# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off', +# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty' +# Flag: --backend +image_backend="ascii" + +# Image Source +# +# Which image or ascii file to display. +# +# Default: 'auto' +# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/' +# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")' +# Flag: --source +# +# NOTE: 'auto' will pick the best image source for whatever image backend is used. +# In ascii mode, distro ascii art will be used and in an image mode, your +# wallpaper will be used. +image_source="auto" + + +# Ascii Options + + +# Ascii distro +# Which distro's ascii art to display. +# +# Default: 'auto' +# Values: 'auto', 'distro_name' +# Flag: --ascii_distro +# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS", +# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs, +# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock, +# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD, +# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS, +# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, +# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin, +# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary, +# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD, +# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo, +# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, +# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, +# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite, +# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, +# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib, +# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner, +# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba, +# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD, +# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint, +# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix, +# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan, +# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific, +# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz, +# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, +# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, +# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio, +# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin, +# and IRIX have ascii logos +# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants. +# Use '{distro name}_old' to use the old logos. +# NOTE: Ubuntu has flavor variants. +# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME, +# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors. +# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu, +# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android, +# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola, +# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS, +# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian, +# postmarketOS, and Void have a smaller logo variant. +# Use '{distro name}_small' to use the small variants. +ascii_distro="auto" + +# Ascii Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --ascii_colors +# +# Example: +# ascii_colors=(distro) - Ascii is colored based on Distro colors. +# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors. +ascii_colors=(distro) + +# Bold ascii logo +# Whether or not to bold the ascii logo. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --ascii_bold +ascii_bold="on" + + +# Image Options + + +# Image loop +# Setting this to on will make neofetch redraw the image constantly until +# Ctrl+C is pressed. This fixes display issues in some terminal emulators. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --loop +image_loop="off" + +# Thumbnail directory +# +# Default: '~/.cache/thumbnails/neofetch' +# Values: 'dir' +thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch" + +# Crop mode +# +# Default: 'normal' +# Values: 'normal', 'fit', 'fill' +# Flag: --crop_mode +# +# See this wiki page to learn about the fit and fill options. +# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F +crop_mode="normal" + +# Crop offset +# Note: Only affects 'normal' crop mode. +# +# Default: 'center' +# Values: 'northwest', 'north', 'northeast', 'west', 'center' +# 'east', 'southwest', 'south', 'southeast' +# Flag: --crop_offset +crop_offset="center" + +# Image size +# The image is half the terminal width by default. +# +# Default: 'auto' +# Values: 'auto', '00px', '00%', 'none' +# Flags: --image_size +# --size +image_size="auto" + +# Gap between image and text +# +# Default: '3' +# Values: 'num', '-num' +# Flag: --gap +gap=3 + +# Image offsets +# Only works with the w3m backend. +# +# Default: '0' +# Values: 'px' +# Flags: --xoffset +# --yoffset +yoffset=0 +xoffset=0 + +# Image background color +# Only works with the w3m backend. +# +# Default: '' +# Values: 'color', 'blue' +# Flag: --bg_color +background_color= + + +# Misc Options + +# Stdout mode +# Turn off all colors and disables image backend (ASCII/Image). +# Useful for piping into another command. +# Default: 'off' +# Values: 'on', 'off' +stdout="off" diff --git a/newsboat/config b/newsboat/config new file mode 100644 index 0000000..b7a78da --- /dev/null +++ b/newsboat/config @@ -0,0 +1,55 @@ +#show-read-feeds no +auto-reload yes + +external-url-viewer "urlscan -dc -r 'linkhandler {}'" + +bind-key j down +bind-key k up +bind-key j next articlelist +bind-key k prev articlelist +bind-key J next-feed articlelist +bind-key K prev-feed articlelist +bind-key G end +bind-key g home +bind-key d pagedown +bind-key u pageup +bind-key l open +bind-key h quit +bind-key a toggle-article-read +bind-key n next-unread +bind-key N prev-unread +bind-key D pb-download +bind-key U show-urls +bind-key x pb-delete + +color listnormal cyan default +color listfocus black yellow standout bold +color listnormal_unread blue default +color listfocus_unread yellow default bold +color info red black bold +color article white default bold + +browser linkhandler +macro , open-in-browser +macro t set browser "qndl" ; open-in-browser ; set browser linkhandler +macro a set browser "tsp yt-dlp --embed-metadata -xic -f bestaudio/best" ; open-in-browser ; set browser linkhandler +macro v set browser "setsid -f mpv" ; open-in-browser ; set browser linkhandler +macro w set browser "lynx" ; open-in-browser ; set browser linkhandler +macro d set browser "dmenuhandler" ; open-in-browser ; set browser linkhandler +macro c set browser "echo %u | xclip -r -sel c" ; open-in-browser ; set browser linkhandler +macro C set browser "youtube-viewer --comments=%u" ; open-in-browser ; set browser linkhandler +macro p set browser "peertubetorrent %u 480" ; open-in-browser ; set browser linkhandler +macro P set browser "peertubetorrent %u 1080" ; open-in-browser ; set browser linkhandler + +highlight all "---.*---" yellow +highlight feedlist ".*(0/0))" black +highlight article "(^Feed:.*|^Title:.*|^Author:.*)" cyan default bold +highlight article "(^Link:.*|^Date:.*)" default default +highlight article "https?://[^ ]+" green default +highlight article "^(Title):.*$" blue default +highlight article "\\[[0-9][0-9]*\\]" magenta default bold +highlight article "\\[image\\ [0-9]+\\]" green default bold +highlight article "\\[embedded flash: [0-9][0-9]*\\]" green default bold +highlight article ":.*\\(link\\)$" cyan default +highlight article ":.*\\(image\\)$" blue default +highlight article ":.*\\(embedded flash\\)$" magenta default diff --git a/newsboat/urls b/newsboat/urls new file mode 100644 index 0000000..6fdd242 --- /dev/null +++ b/newsboat/urls @@ -0,0 +1,6 @@ +https://lukesmith.xyz/rss.xml +https://notrelated.xyz/rss +https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA "~Luke Smith (YouTube)" +https://landchad.net/rss.xml +https://artixlinux.org/feed.php "tech" +https://www.archlinux.org/feeds/news/ "tech" diff --git a/nvim/after/indent/html.vim b/nvim/after/indent/html.vim new file mode 100644 index 0000000..e637708 --- /dev/null +++ b/nvim/after/indent/html.vim @@ -0,0 +1,33 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +" Load the coffee and html indent functions. +silent! unlet b:did_indent +runtime indent/coffee.vim +let s:coffeeIndentExpr = &l:indentexpr + +" Load html last so it can overwrite coffee settings. +silent! unlet b:did_indent +runtime indent/html.vim +let s:htmlIndentExpr = &l:indentexpr + +" Inject our wrapper indent function. +setlocal indentexpr=GetCoffeeHtmlIndent(v:lnum) + +function! GetCoffeeHtmlIndent(curlinenum) + " See if we're inside a coffeescript block. + let scriptlnum = searchpair('', 'bWn') + let prevlnum = prevnonblank(a:curlinenum) + + " If we're in the script block and the previous line isn't the script tag + " itself, use coffee indenting. + if scriptlnum && scriptlnum != prevlnum + exec 'return ' s:coffeeIndentExpr + endif + + " Otherwise use html indenting. + exec 'return ' s:htmlIndentExpr +endfunction diff --git a/nvim/after/syntax/haml.vim b/nvim/after/syntax/haml.vim new file mode 100644 index 0000000..4c517eb --- /dev/null +++ b/nvim/after/syntax/haml.vim @@ -0,0 +1,13 @@ +" Language: CoffeeScript +" Maintainer: Sven Felix Oberquelle +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +" Inherit coffee from html so coffeeComment isn't redefined and given higher +" priority than hamlInterpolation. +syn cluster hamlCoffeescript contains=@htmlCoffeeScript +syn region hamlCoffeescriptFilter matchgroup=hamlFilter +\ start="^\z(\s*\):coffee\z(script\)\?\s*$" +\ end="^\%(\z1 \| *$\)\@!" +\ contains=@hamlCoffeeScript,hamlInterpolation +\ keepend diff --git a/nvim/after/syntax/html.vim b/nvim/after/syntax/html.vim new file mode 100644 index 0000000..9e2eb3a --- /dev/null +++ b/nvim/after/syntax/html.vim @@ -0,0 +1,11 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +" Syntax highlighting for text/coffeescript script tags +syn include @htmlCoffeeScript syntax/coffee.vim +syn region coffeeScript start=##me=s-1 keepend +\ contains=@htmlCoffeeScript,htmlScriptTag,@htmlPreproc +\ containedin=htmlHead diff --git a/nvim/autoload/coffee.vim b/nvim/autoload/coffee.vim new file mode 100644 index 0000000..04d5efb --- /dev/null +++ b/nvim/autoload/coffee.vim @@ -0,0 +1,54 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +" Set up some common global/buffer variables. +function! coffee#CoffeeSetUpVariables() + " Path to coffee executable + if !exists('g:coffee_compiler') + let g:coffee_compiler = 'coffee' + endif + + " Options passed to coffee with make + if !exists('g:coffee_make_options') + let g:coffee_make_options = '' + endif + + " Path to cake executable + if !exists('g:coffee_cake') + let g:coffee_cake = 'cake' + endif + + " Extra options passed to cake + if !exists('g:coffee_cake_options') + let g:coffee_cake_options = '' + endif + + " Path to coffeelint executable + if !exists('g:coffee_linter') + let g:coffee_linter = 'coffeelint' + endif + + " Options passed to CoffeeLint + if !exists('g:coffee_lint_options') + let g:coffee_lint_options = '' + endif + + " Pass the litcoffee flag to tools in this buffer if a litcoffee file is open. + " Let the variable be overwritten so it can be updated if a different filetype + " is set. + if &filetype == 'litcoffee' + let b:coffee_litcoffee = '--literate' + else + let b:coffee_litcoffee = '' + endif +endfunction + +function! coffee#CoffeeSetUpErrorFormat() + CompilerSet errorformat=Error:\ In\ %f\\,\ %m\ on\ line\ %l, + \Error:\ In\ %f\\,\ Parse\ error\ on\ line\ %l:\ %m, + \SyntaxError:\ In\ %f\\,\ %m, + \%f:%l:%c:\ error:\ %m, + \%-G%.%# +endfunction diff --git a/nvim/autoload/plug.vim b/nvim/autoload/plug.vim new file mode 100644 index 0000000..652caa8 --- /dev/null +++ b/nvim/autoload/plug.vim @@ -0,0 +1,2812 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-default branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand(':p')) + set shellslash +else + let s:me = resolve(expand(':p')) +endif +let s:base_spec = { 'branch': '', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! s:is_powershell(shell) + return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$' +endfunction + +function! s:isabsolute(dir) abort + return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') +endfunction + +function! s:git_dir(dir) abort + let gitdir = s:trim(a:dir) . '/.git' + if isdirectory(gitdir) + return gitdir + endif + if !filereadable(gitdir) + return '' + endif + let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*') + if len(gitdir) && !s:isabsolute(gitdir) + let gitdir = a:dir . '/' . gitdir + endif + return isdirectory(gitdir) ? gitdir : '' +endfunction + +function! s:git_origin_url(dir) abort + let gitdir = s:git_dir(a:dir) + let config = gitdir . '/config' + if empty(gitdir) || !filereadable(config) + return '' + endif + return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') +endfunction + +function! s:git_revision(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + + let line = get(readfile(head), 0, '') + let ref = matchstr(line, '^ref: \zs.*') + if empty(ref) + return line + endif + + if filereadable(gitdir . '/' . ref) + return get(readfile(gitdir . '/' . ref), 0, '') + endif + + if filereadable(gitdir . '/packed-refs') + for line in readfile(gitdir . '/packed-refs') + if line =~# ' ' . ref + return matchstr(line, '^[0-9a-f]*') + endif + endfor + endif + + return '' +endfunction + +function! s:git_local_branch(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*') + return len(branch) ? branch : 'HEAD' +endfunction + +function! s:git_origin_branch(spec) + if len(a:spec.branch) + return a:spec.branch + endif + + " The file may not be present if this is a local repository + let gitdir = s:git_dir(a:spec.dir) + let origin_head = gitdir.'/refs/remotes/origin/HEAD' + if len(gitdir) && filereadable(origin_head) + return matchstr(get(readfile(origin_head), 0, ''), + \ '^ref: refs/remotes/origin/\zs.*') + endif + + " The command may not return the name of a branch in detached HEAD state + let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir)) + return v:shell_error ? '' : result[-1] +endfunction + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif has('nvim') + let home = stdpath('data') . '/plugged' + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell)) + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('plug#end() called without calling plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if get(g:, 'did_load_filetypes', 0) + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(repo . ' ' . v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' + if type == s:TYPE.string + if empty(a:arg) + throw printf(opt_errfmt, 'tag', 'string') + endif + let opts.tag = a:arg + elseif type == s:TYPE.dict + for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] + if has_key(a:arg, opt) + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string') + endif + endfor + for opt in ['on', 'for'] + if has_key(a:arg, opt) + \ && type(a:arg[opt]) != s:TYPE.list + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string or list') + endif + endfor + if has_key(a:arg, 'do') + \ && type(a:arg.do) != s:TYPE.funcref + \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do)) + throw printf(opt_errfmt, 'do', 'string or funcref') + endif + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(s:plug_expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-\{1}\ / + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn match plugH2 /^-\{2,}/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(s:plug_getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :call close_pane() + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:close_pane() + if b:plug_preview == 1 + pc + let b:plug_preview = -1 + else + bd + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win + set shell=sh + endif + if a:swap + if s:is_powershell(&shell) + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' + set shellredir=>%s\ 2>&1 + endif + endif + return prev +endfunction + +function! s:bang(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + call s:load_plugin(spec) + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:git_revision(a:spec.dir) + if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) + let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : '' + let output = s:system( + \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + " Set remote name, overriding a possible user git config's clone.defaultRemoteName + let s:clone_opt = ['--origin', 'origin'] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif + + if has('win32unix') || has('wsl') + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) + else + let branch = s:git_origin_branch(spec) + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:rm_rf(g:plugs[name].dir) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return (a:event == 'stdout' || a:event == 'stderr') ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + + if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = s:plug_call('jobstart', argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + let max = line('$') + for i in range(4, max > 4 ? max : 4) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, max > 5 ? max : 5) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt').join(' ') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. +function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\(\.exe\)\?$' + return s:shellesc_cmd(a:arg, script) + elseif s:is_powershell(shell) + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)] + let remote = result[-1] + if empty(remote) + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let sha = s:git_revision(a:spec.dir) + if empty(sha) + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let current_branch = result[0] + " Check tag + let origin_branch = s:git_origin_branch(a:spec) + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif origin_branch !=# current_branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ current_branch, origin_branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', origin_branch) + \ ], a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ origin_branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + return s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + let err_count = 0 + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + let err = s:rm_rf(line[2:]) + setlocal modifiable + if empty(err) + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + else + delete _ + call append(l1 - 1, s:format_message('x', line[1:], err)) + let l2 += len(s:lines(err)) + let err_count += 1 + endif + let msg = printf('Removed %d directories.', s:clean_count) + if err_count > 0 + let msg .= printf(' Failed to remove %d directories.', err_count) + endif + call setline(4, msg) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = s:plug_tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$') + if empty(name) + return + endif + let title = 'HEAD@{1}..' + let command = 'git diff --no-color HEAD@{1}' + else + let title = sha + let command = 'git show --no-color --pretty=medium '.sha + let name = s:find_name(line('.')) + endif + + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' title + else + execute 'pedit' title + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let branch = s:git_origin_branch(v) + if len(branch) + let range = origin ? '..origin/'.branch : 'HEAD@{1}..' + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) + if has_key(v, 'rtp') + call extend(cmd, ['--', v.rtp]) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = s:plug_expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@ +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +if exists('current_compiler') + finish +endif + +let current_compiler = 'cake' +call coffee#CoffeeSetUpVariables() + +exec 'CompilerSet makeprg=' . escape(g:coffee_cake . ' ' . +\ g:coffee_cake_options . ' $*', ' ') +call coffee#CoffeeSetUpErrorFormat() diff --git a/nvim/compiler/coffee.vim b/nvim/compiler/coffee.vim new file mode 100644 index 0000000..9a91d35 --- /dev/null +++ b/nvim/compiler/coffee.vim @@ -0,0 +1,82 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +" All this is needed to support compiling filenames with spaces, quotes, and +" such. The filename is escaped and embedded into the `makeprg` setting. +" +" Because of this, `makeprg` must be updated on every file rename. And because +" of that, `CompilerSet` can't be used because it doesn't exist when the +" rename autocmd is ran. So, we have to do some checks to see whether `compiler` +" was called locally or globally, and respect that in the rest of the script. + +if exists('current_compiler') + finish +endif + +let current_compiler = 'coffee' +call coffee#CoffeeSetUpVariables() + +" Pattern to check if coffee is the compiler +let s:pat = '^' . current_compiler + +" Get a `makeprg` for the current filename. +function! s:GetMakePrg() + return g:coffee_compiler . + \ ' -c' . + \ ' ' . b:coffee_litcoffee . + \ ' ' . g:coffee_make_options . + \ ' $*' . + \ ' ' . fnameescape(expand('%')) +endfunction + +" Set `makeprg` and return 1 if coffee is still the compiler, else return 0. +function! s:SetMakePrg() + if &l:makeprg =~ s:pat + let &l:makeprg = s:GetMakePrg() + elseif &g:makeprg =~ s:pat + let &g:makeprg = s:GetMakePrg() + else + return 0 + endif + + return 1 +endfunction + +" Set a dummy compiler so we can check whether to set locally or globally. +exec 'CompilerSet makeprg=' . current_compiler +" Then actually set the compiler. +call s:SetMakePrg() +call coffee#CoffeeSetUpErrorFormat() + +function! s:CoffeeMakeDeprecated(bang, args) + echoerr 'CoffeeMake is deprecated! Please use :make instead, its behavior ' . + \ 'is identical.' + sleep 5 + exec 'make' . a:bang a:args +endfunction + +" Compile the current file. +command! -bang -bar -nargs=* CoffeeMake +\ call s:CoffeeMakeDeprecated(, ) + +" Set `makeprg` on rename since we embed the filename in the setting. +augroup CoffeeUpdateMakePrg + autocmd! + + " Update `makeprg` if coffee is still the compiler, else stop running this + " function. + function! s:UpdateMakePrg() + if !s:SetMakePrg() + autocmd! CoffeeUpdateMakePrg + endif + endfunction + + " Set autocmd locally if compiler was set locally. + if &l:makeprg =~ s:pat + autocmd BufWritePre,BufFilePost call s:UpdateMakePrg() + else + autocmd BufWritePre,BufFilePost call s:UpdateMakePrg() + endif +augroup END diff --git a/nvim/ftdetect/coffee.vim b/nvim/ftdetect/coffee.vim new file mode 100644 index 0000000..5056929 --- /dev/null +++ b/nvim/ftdetect/coffee.vim @@ -0,0 +1,17 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +autocmd BufNewFile,BufRead *.coffee set filetype=coffee +autocmd BufNewFile,BufRead *Cakefile set filetype=coffee +autocmd BufNewFile,BufRead *.coffeekup,*.ck set filetype=coffee +autocmd BufNewFile,BufRead *._coffee set filetype=coffee + +function! s:DetectCoffee() + if getline(1) =~ '^#!.*\' + set filetype=coffee + endif +endfunction + +autocmd BufNewFile,BufRead * call s:DetectCoffee() diff --git a/nvim/ftplugin/coffee.vim b/nvim/ftplugin/coffee.vim new file mode 100644 index 0000000..0b63dff --- /dev/null +++ b/nvim/ftplugin/coffee.vim @@ -0,0 +1,405 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +if exists('b:did_ftplugin') + finish +endif + +let b:did_ftplugin = 1 +call coffee#CoffeeSetUpVariables() + +setlocal formatoptions-=t formatoptions+=croql +setlocal comments=:# commentstring=#\ %s +setlocal omnifunc=javascriptcomplete#CompleteJS +setlocal suffixesadd+=coffee + +" Create custom augroups. +augroup CoffeeBufUpdate | augroup END +augroup CoffeeBufNew | augroup END + +" Enable coffee compiler if a compiler isn't set already. +if !len(&l:makeprg) + compiler coffee +endif + +" Switch to the window for buf. +function! s:SwitchWindow(buf) + exec bufwinnr(a:buf) 'wincmd w' +endfunction + +" Create a new scratch buffer and return the bufnr of it. After the function +" returns, vim remains in the scratch buffer so more set up can be done. +function! s:ScratchBufBuild(src, vert, size) + if a:size <= 0 + if a:vert + let size = winwidth(bufwinnr(a:src)) / 2 + else + let size = winheight(bufwinnr(a:src)) / 2 + endif + endif + + if a:vert + vertical belowright new + exec 'vertical resize' size + else + belowright new + exec 'resize' size + endif + + setlocal bufhidden=wipe buftype=nofile nobuflisted noswapfile nomodifiable + nnoremap q :hide + + return bufnr('%') +endfunction + +" Replace buffer contents with text and delete the last empty line. +function! s:ScratchBufUpdate(buf, text) + " Move to the scratch buffer. + call s:SwitchWindow(a:buf) + + " Double check we're in the scratch buffer before overwriting. + if bufnr('%') != a:buf + throw 'unable to change to scratch buffer' + endif + + setlocal modifiable + silent exec '% delete _' + silent put! =a:text + silent exec '$ delete _' + setlocal nomodifiable +endfunction + +" Parse the output of coffee into a qflist entry for src buffer. +function! s:ParseCoffeeError(output, src, startline) + " Coffee error is always on first line? + let match = matchlist(a:output, + \ '^\(\f\+\|\[stdin\]\):\(\d\):\(\d\): error: \(.\{-}\)' . "\n") + + if !len(match) + return + endif + + " Consider the line number from coffee as relative and add it to the beginning + " line number of the range the command was called on, then subtract one for + " zero-based relativity. + call setqflist([{'bufnr': a:src, 'lnum': a:startline + str2nr(match[2]) - 1, + \ 'type': 'E', 'col': str2nr(match[3]), 'text': match[4]}], 'r') +endfunction + +" Reset source buffer variables. +function! s:CoffeeCompileResetVars() + " Variables defined in source buffer: + " b:coffee_compile_buf: bufnr of output buffer + " Variables defined in output buffer: + " b:coffee_src_buf: bufnr of source buffer + " b:coffee_compile_pos: previous cursor position in output buffer + + let b:coffee_compile_buf = -1 +endfunction + +function! s:CoffeeWatchResetVars() + " Variables defined in source buffer: + " b:coffee_watch_buf: bufnr of output buffer + " Variables defined in output buffer: + " b:coffee_src_buf: bufnr of source buffer + " b:coffee_watch_pos: previous cursor position in output buffer + + let b:coffee_watch_buf = -1 +endfunction + +function! s:CoffeeRunResetVars() + " Variables defined in CoffeeRun source buffer: + " b:coffee_run_buf: bufnr of output buffer + " Variables defined in CoffeeRun output buffer: + " b:coffee_src_buf: bufnr of source buffer + " b:coffee_run_pos: previous cursor position in output buffer + + let b:coffee_run_buf = -1 +endfunction + +" Clean things up in the source buffers. +function! s:CoffeeCompileClose() + " Switch to the source buffer if not already in it. + silent! call s:SwitchWindow(b:coffee_src_buf) + call s:CoffeeCompileResetVars() +endfunction + +function! s:CoffeeWatchClose() + silent! call s:SwitchWindow(b:coffee_src_buf) + silent! autocmd! CoffeeAuWatch * + call s:CoffeeWatchResetVars() +endfunction + +function! s:CoffeeRunClose() + silent! call s:SwitchWindow(b:coffee_src_buf) + call s:CoffeeRunResetVars() +endfunction + +" Compile the lines between startline and endline and put the result into buf. +function! s:CoffeeCompileToBuf(buf, startline, endline) + let src = bufnr('%') + let input = join(getline(a:startline, a:endline), "\n") + + " Coffee doesn't like empty input. + if !len(input) + " Function should still return within output buffer. + call s:SwitchWindow(a:buf) + return + endif + + " Pipe lines into coffee. + let output = system(g:coffee_compiler . + \ ' -scb' . + \ ' ' . b:coffee_litcoffee . + \ ' 2>&1', input) + + " Paste output into output buffer. + call s:ScratchBufUpdate(a:buf, output) + + " Highlight as JavaScript if there were no compile errors. + if v:shell_error + call s:ParseCoffeeError(output, src, a:startline) + setlocal filetype= + else + " Clear the quickfix list. + call setqflist([], 'r') + setlocal filetype=javascript + endif +endfunction + +" Peek at compiled CoffeeScript in a scratch buffer. We handle ranges like this +" to prevent the cursor from being moved (and its position saved) before the +" function is called. +function! s:CoffeeCompile(startline, endline, args) + if a:args =~ '\' + echoerr 'CoffeeCompile watch is deprecated! Please use CoffeeWatch instead' + sleep 5 + call s:CoffeeWatch(a:args) + return + endif + + " Switch to the source buffer if not already in it. + silent! call s:SwitchWindow(b:coffee_src_buf) + + " Bail if not in source buffer. + if !exists('b:coffee_compile_buf') + return + endif + + " Build the output buffer if it doesn't exist. + if bufwinnr(b:coffee_compile_buf) == -1 + let src = bufnr('%') + + let vert = exists('g:coffee_compile_vert') || a:args =~ '\' + let size = str2nr(matchstr(a:args, '\<\d\+\>')) + + " Build the output buffer and save the source bufnr. + let buf = s:ScratchBufBuild(src, vert, size) + let b:coffee_src_buf = src + + " Set the buffer name. + exec 'silent! file [CoffeeCompile ' . src . ']' + + " Clean up the source buffer when the output buffer is closed. + autocmd BufWipeout call s:CoffeeCompileClose() + " Save the cursor when leaving the output buffer. + autocmd BufLeave let b:coffee_compile_pos = getpos('.') + + " Run user-defined commands on new buffer. + silent doautocmd CoffeeBufNew User CoffeeCompile + + " Switch back to the source buffer and save the output bufnr. This also + " triggers BufLeave above. + call s:SwitchWindow(src) + let b:coffee_compile_buf = buf + endif + + " Fill the scratch buffer. + call s:CoffeeCompileToBuf(b:coffee_compile_buf, a:startline, a:endline) + " Reset cursor to previous position. + call setpos('.', b:coffee_compile_pos) + + " Run any user-defined commands on the scratch buffer. + silent doautocmd CoffeeBufUpdate User CoffeeCompile +endfunction + +" Update the scratch buffer and switch back to the source buffer. +function! s:CoffeeWatchUpdate() + call s:CoffeeCompileToBuf(b:coffee_watch_buf, 1, '$') + call setpos('.', b:coffee_watch_pos) + silent doautocmd CoffeeBufUpdate User CoffeeWatch + call s:SwitchWindow(b:coffee_src_buf) +endfunction + +" Continually compile a source buffer. +function! s:CoffeeWatch(args) + silent! call s:SwitchWindow(b:coffee_src_buf) + + if !exists('b:coffee_watch_buf') + return + endif + + if bufwinnr(b:coffee_watch_buf) == -1 + let src = bufnr('%') + + let vert = exists('g:coffee_watch_vert') || a:args =~ '\' + let size = str2nr(matchstr(a:args, '\<\d\+\>')) + + let buf = s:ScratchBufBuild(src, vert, size) + let b:coffee_src_buf = src + + exec 'silent! file [CoffeeWatch ' . src . ']' + + autocmd BufWipeout call s:CoffeeWatchClose() + autocmd BufLeave let b:coffee_watch_pos = getpos('.') + + silent doautocmd CoffeeBufNew User CoffeeWatch + + call s:SwitchWindow(src) + let b:coffee_watch_buf = buf + endif + + " Make sure only one watch autocmd is defined on this buffer. + silent! autocmd! CoffeeAuWatch * + + augroup CoffeeAuWatch + autocmd InsertLeave call s:CoffeeWatchUpdate() + autocmd BufWritePost call s:CoffeeWatchUpdate() + augroup END + + call s:CoffeeWatchUpdate() +endfunction + +" Run a snippet of CoffeeScript between startline and endline. +function! s:CoffeeRun(startline, endline, args) + silent! call s:SwitchWindow(b:coffee_src_buf) + + if !exists('b:coffee_run_buf') + return + endif + + if bufwinnr(b:coffee_run_buf) == -1 + let src = bufnr('%') + + let buf = s:ScratchBufBuild(src, exists('g:coffee_run_vert'), 0) + let b:coffee_src_buf = src + + exec 'silent! file [CoffeeRun ' . src . ']' + + autocmd BufWipeout call s:CoffeeRunClose() + autocmd BufLeave let b:coffee_run_pos = getpos('.') + + silent doautocmd CoffeeBufNew User CoffeeRun + + call s:SwitchWindow(src) + let b:coffee_run_buf = buf + endif + + if a:startline == 1 && a:endline == line('$') + let output = system(g:coffee_compiler . + \ ' ' . b:coffee_litcoffee . + \ ' ' . fnameescape(expand('%')) . + \ ' ' . a:args) + else + let input = join(getline(a:startline, a:endline), "\n") + + if !len(input) + return + endif + + let output = system(g:coffee_compiler . + \ ' -s' . + \ ' ' . b:coffee_litcoffee . + \ ' ' . a:args, input) + endif + + call s:ScratchBufUpdate(b:coffee_run_buf, output) + call setpos('.', b:coffee_run_pos) + + silent doautocmd CoffeeBufUpdate User CoffeeRun +endfunction + +" Run coffeelint on a file, and add any errors between startline and endline +" to the quickfix list. +function! s:CoffeeLint(startline, endline, bang, args) + let input = join(getline(a:startline, a:endline), "\n") + + if !len(input) + return + endif + + let output = system(g:coffee_linter . + \ ' -s --reporter csv' . + \ ' ' . b:coffee_litcoffee . + \ ' ' . g:coffee_lint_options . + \ ' ' . a:args . + \ ' 2>&1', input) + + " Convert output into an array and strip off the csv header. + let lines = split(output, "\n")[1:] + let buf = bufnr('%') + let qflist = [] + + for line in lines + let match = matchlist(line, '^stdin,\(\d\+\),\d*,\(error\|warn\),\(.\+\)$') + + " Ignore unmatched lines. + if !len(match) + continue + endif + + " The 'type' will result in either 'E' or 'W'. + call add(qflist, {'bufnr': buf, 'lnum': a:startline + str2nr(match[1]) - 1, + \ 'type': toupper(match[2][0]), 'text': match[3]}) + endfor + + " Replace the quicklist with our items. + call setqflist(qflist, 'r') + + " If not given a bang, jump to first error. + if !len(a:bang) + silent! cc 1 + endif +endfunction + +" Complete arguments for Coffee* commands. +function! s:CoffeeComplete(cmd, cmdline, cursor) + let args = ['vertical'] + + " If no partial command, return all possibilities. + if !len(a:cmd) + return args + endif + + let pat = '^' . a:cmd + + for arg in args + if arg =~ pat + return [arg] + endif + endfor +endfunction + +" Set initial state variables if they don't exist +if !exists('b:coffee_compile_buf') + call s:CoffeeCompileResetVars() +endif + +if !exists('b:coffee_watch_buf') + call s:CoffeeWatchResetVars() +endif + +if !exists('b:coffee_run_buf') + call s:CoffeeRunResetVars() +endif + +command! -buffer -range=% -bar -nargs=* -complete=customlist,s:CoffeeComplete +\ CoffeeCompile call s:CoffeeCompile(, , ) +command! -buffer -bar -nargs=* -complete=customlist,s:CoffeeComplete +\ CoffeeWatch call s:CoffeeWatch() +command! -buffer -range=% -bar -nargs=* CoffeeRun +\ call s:CoffeeRun(, , ) +command! -buffer -range=% -bang -bar -nargs=* CoffeeLint +\ call s:CoffeeLint(, , , ) diff --git a/nvim/indent/coffee.vim b/nvim/indent/coffee.vim new file mode 100644 index 0000000..7bd82e3 --- /dev/null +++ b/nvim/indent/coffee.vim @@ -0,0 +1,428 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +if exists('b:did_indent') + finish +endif + +let b:did_indent = 1 + +setlocal autoindent +setlocal indentexpr=GetCoffeeIndent(v:lnum) +" Make sure GetCoffeeIndent is run when these are typed so they can be +" indented or outdented. +setlocal indentkeys+=0],0),0.,=else,=when,=catch,=finally + +" If no indenting or outdenting is needed, either keep the indent of the cursor +" (use autoindent) or match the indent of the previous line. +if exists('g:coffee_indent_keep_current') + let s:DEFAULT_LEVEL = '-1' +else + let s:DEFAULT_LEVEL = 'indent(prevnlnum)' +endif + +" Only define the function once. +if exists('*GetCoffeeIndent') + finish +endif + +" Keywords that begin a block +let s:BEGIN_BLOCK_KEYWORD = '\C^\%(if\|unless\|else\|for\|while\|until\|' +\ . 'loop\|switch\|when\|try\|catch\|finally\|' +\ . 'class\)\>\%(\s*:\)\@!' + +" An expression that uses the result of a statement +let s:COMPOUND_EXPRESSION = '\C\%([^-]-\|[^+]+\|[^/]/\|[:=*%&|^<>]\)\s*' +\ . '\%(if\|unless\|for\|while\|until\|loop\|switch\|' +\ . 'try\|class\)\>' + +" Combine the two above +let s:BEGIN_BLOCK = s:BEGIN_BLOCK_KEYWORD . '\|' . s:COMPOUND_EXPRESSION + +" Operators that begin a block but also count as a continuation +let s:BEGIN_BLOCK_OP = '[([{:=]$' + +" Begins a function block +let s:FUNCTION = '[-=]>$' + +" Operators that continue a line onto the next line +let s:CONTINUATION_OP = '\C\%(\<\%(is\|isnt\|and\|or\)\>\|' +\ . '[^-]-\|[^+]+\|[^-=]>\|[^.]\.\|[<*/%&|^,]\)$' + +" Ancestor operators that prevent continuation indenting +let s:CONTINUATION = s:CONTINUATION_OP . '\|' . s:BEGIN_BLOCK_OP + +" A closing bracket by itself on a line followed by a continuation +let s:BRACKET_CONTINUATION = '^\s*[}\])]\s*' . s:CONTINUATION_OP + +" A continuation dot access +let s:DOT_ACCESS = '^\.' + +" Keywords that break out of a block +let s:BREAK_BLOCK_OP = '\C^\%(return\|break\|continue\|throw\)\>' + +" A condition attached to the end of a statement +let s:POSTFIX_CONDITION = '\C\S\s\+\zs\<\%(if\|unless\|when\|while\|until\)\>' + +" A then contained in brackets +let s:CONTAINED_THEN = '\C[(\[].\{-}\.\{-\}[)\]]' + +" An else with a condition attached +let s:ELSE_COND = '\C^\s*else\s\+\<\%(if\|unless\)\>' + +" A single-line else statement (without a condition attached) +let s:SINGLE_LINE_ELSE = '\C^else\s\+\%(\<\%(if\|unless\)\>\)\@!' + +" Pairs of starting and ending keywords, with an initial pattern to match +let s:KEYWORD_PAIRS = [ +\ ['\C^else\>', '\C\<\%(if\|unless\|when\|else\s\+\%(if\|unless\)\)\>', +\ '\C\'], +\ ['\C^catch\>', '\C\', '\C\'], +\ ['\C^finally\>', '\C\', '\C\'] +\] + +" Pairs of starting and ending brackets +let s:BRACKET_PAIRS = {']': '\[', '}': '{', ')': '('} + +" Max lines to look back for a match +let s:MAX_LOOKBACK = 50 + +" Syntax names for strings +let s:SYNTAX_STRING = 'coffee\%(String\|AssignString\|Embed\|Regex\|Heregex\|' +\ . 'Heredoc\)' + +" Syntax names for comments +let s:SYNTAX_COMMENT = 'coffee\%(Comment\|BlockComment\|HeregexComment\)' + +" Syntax names for strings and comments +let s:SYNTAX_STRING_COMMENT = s:SYNTAX_STRING . '\|' . s:SYNTAX_COMMENT + +" Compatibility code for shiftwidth() as recommended by the docs, but modified +" so there isn't as much of a penalty if shiftwidth() exists. +if exists('*shiftwidth') + let s:ShiftWidth = function('shiftwidth') +else + function! s:ShiftWidth() + return &shiftwidth + endfunction +endif + +" Get the linked syntax name of a character. +function! s:SyntaxName(lnum, col) + return synIDattr(synID(a:lnum, a:col, 1), 'name') +endfunction + +" Check if a character is in a comment. +function! s:IsComment(lnum, col) + return s:SyntaxName(a:lnum, a:col) =~ s:SYNTAX_COMMENT +endfunction + +" Check if a character is in a string. +function! s:IsString(lnum, col) + return s:SyntaxName(a:lnum, a:col) =~ s:SYNTAX_STRING +endfunction + +" Check if a character is in a comment or string. +function! s:IsCommentOrString(lnum, col) + return s:SyntaxName(a:lnum, a:col) =~ s:SYNTAX_STRING_COMMENT +endfunction + +" Search a line for a regex until one is found outside a string or comment. +function! s:SearchCode(lnum, regex) + " Start at the first column and look for an initial match (including at the + " cursor.) + call cursor(a:lnum, 1) + let pos = search(a:regex, 'c', a:lnum) + + while pos + if !s:IsCommentOrString(a:lnum, col('.')) + return 1 + endif + + " Move to the match and continue searching (don't accept matches at the + " cursor.) + let pos = search(a:regex, '', a:lnum) + endwhile + + return 0 +endfunction + +" Search for the nearest previous line that isn't a comment. +function! s:GetPrevNormalLine(startlnum) + let curlnum = a:startlnum + + while curlnum + let curlnum = prevnonblank(curlnum - 1) + + " Return the line if the first non-whitespace character isn't a comment. + if !s:IsComment(curlnum, indent(curlnum) + 1) + return curlnum + endif + endwhile + + return 0 +endfunction + +function! s:SearchPair(startlnum, lookback, skip, open, close) + " Go to the first column so a:close will be matched even if it's at the + " beginning of the line. + call cursor(a:startlnum, 1) + return searchpair(a:open, '', a:close, 'bnW', a:skip, max([1, a:lookback])) +endfunction + +" Skip if a match +" - is in a string or comment +" - is a single-line statement that isn't immediately +" adjacent +" - has a postfix condition and isn't an else statement or compound +" expression +function! s:ShouldSkip(startlnum, lnum, col) + return s:IsCommentOrString(a:lnum, a:col) || + \ s:SearchCode(a:lnum, '\C\') && a:startlnum - a:lnum > 1 || + \ s:SearchCode(a:lnum, s:POSTFIX_CONDITION) && + \ getline(a:lnum) !~ s:ELSE_COND && + \ !s:SearchCode(a:lnum, s:COMPOUND_EXPRESSION) +endfunction + +" Search for the nearest and farthest match for a keyword pair. +function! s:SearchMatchingKeyword(startlnum, open, close) + let skip = 's:ShouldSkip(' . a:startlnum . ", line('.'), line('.'))" + + " Search for the nearest match. + let nearestlnum = s:SearchPair(a:startlnum, a:startlnum - s:MAX_LOOKBACK, + \ skip, a:open, a:close) + + if !nearestlnum + return [] + endif + + " Find the nearest previous line with indent less than or equal to startlnum. + let ind = indent(a:startlnum) + let lookback = s:GetPrevNormalLine(a:startlnum) + + while lookback && indent(lookback) > ind + let lookback = s:GetPrevNormalLine(lookback) + endwhile + + " Search for the farthest match. If there are no other matches, then the + " nearest match is also the farthest one. + let matchlnum = nearestlnum + + while matchlnum + let lnum = matchlnum + let matchlnum = s:SearchPair(matchlnum, lookback, skip, a:open, a:close) + endwhile + + return [nearestlnum, lnum] +endfunction + +" Strip a line of a trailing comment and surrounding whitespace. +function! s:GetTrimmedLine(lnum) + " Try to find a comment starting at the first column. + call cursor(a:lnum, 1) + let pos = search('#', 'c', a:lnum) + + " Keep searching until a comment is found or search returns 0. + while pos + if s:IsComment(a:lnum, col('.')) + break + endif + + let pos = search('#', '', a:lnum) + endwhile + + if !pos + " No comment was found so use the whole line. + let line = getline(a:lnum) + else + " Subtract 1 to get to the column before the comment and another 1 for + " column indexing -> zero-based indexing. + let line = getline(a:lnum)[:col('.') - 2] + endif + + return substitute(substitute(line, '^\s\+', '', ''), + \ '\s\+$', '', '') +endfunction + +" Get the indent policy when no special rules are used. +function! s:GetDefaultPolicy(curlnum) + " Check whether equalprg is being ran on existing lines. + if strlen(getline(a:curlnum)) == indent(a:curlnum) + " If not indenting an existing line, use the default policy. + return s:DEFAULT_LEVEL + else + " Otherwise let autoindent determine what to do with an existing line. + return '-1' + endif +endfunction + +function! GetCoffeeIndent(curlnum) + " Get the previous non-blank line (may be a comment.) + let prevlnum = prevnonblank(a:curlnum - 1) + + " Bail if there's no code before. + if !prevlnum + return -1 + endif + + " Bail if inside a multiline string. + if s:IsString(a:curlnum, 1) + let prevnlnum = prevlnum + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + + " Get the code part of the current line. + let curline = s:GetTrimmedLine(a:curlnum) + " Get the previous non-comment line. + let prevnlnum = s:GetPrevNormalLine(a:curlnum) + + " Check if the current line is the closing bracket in a bracket pair. + if has_key(s:BRACKET_PAIRS, curline[0]) + " Search for a matching opening bracket. + let matchlnum = s:SearchPair(a:curlnum, a:curlnum - s:MAX_LOOKBACK, + \ "s:IsCommentOrString(line('.'), col('.'))", + \ s:BRACKET_PAIRS[curline[0]], curline[0]) + + if matchlnum + " Match the indent of the opening bracket. + return indent(matchlnum) + else + " No opening bracket found (bad syntax), so bail. + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + endif + + " Check if the current line is the closing keyword in a keyword pair. + for pair in s:KEYWORD_PAIRS + if curline =~ pair[0] + " Find the nearest and farthest matches within the same indent level. + let matches = s:SearchMatchingKeyword(a:curlnum, pair[1], pair[2]) + + if len(matches) + " Don't force indenting/outdenting as long as line is already lined up + " with a valid match + return max([min([indent(a:curlnum), indent(matches[0])]), + \ indent(matches[1])]) + else + " No starting keyword found (bad syntax), so bail. + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + endif + endfor + + " Check if the current line is a `when` and not the first in a switch block. + if curline =~ '\C^when\>' && !s:SearchCode(prevnlnum, '\C\') + " Look back for a `when`. + while prevnlnum + if getline(prevnlnum) =~ '\C^\s*when\>' + " Indent to match the found `when`, but don't force indenting (for when + " indenting nested switch blocks.) + return min([indent(a:curlnum), indent(prevnlnum)]) + endif + + let prevnlnum = s:GetPrevNormalLine(prevnlnum) + endwhile + + " No matching `when` found (bad syntax), so bail. + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + + " If the previous line is a comment, use its indentation, but don't force + " indenting. + if prevlnum != prevnlnum + return min([indent(a:curlnum), indent(prevlnum)]) + endif + + let prevline = s:GetTrimmedLine(prevnlnum) + + " Always indent after these operators. + if prevline =~ s:BEGIN_BLOCK_OP + return indent(prevnlnum) + s:ShiftWidth() + endif + + " Indent if the previous line starts a function block, but don't force + " indenting if the line is non-blank (for empty function bodies.) + if prevline =~ s:FUNCTION + if strlen(getline(a:curlnum)) > indent(a:curlnum) + return min([indent(prevnlnum) + s:ShiftWidth(), indent(a:curlnum)]) + else + return indent(prevnlnum) + s:ShiftWidth() + endif + endif + + " Check if continuation indenting is needed. If the line ends in a slash, make + " sure it isn't a regex. + if prevline =~ s:CONTINUATION_OP && + \ !(prevline =~ '/$' && s:IsString(prevnlnum, col([prevnlnum, '$']) - 1)) + " Don't indent if the continuation follows a closing bracket. + if prevline =~ s:BRACKET_CONTINUATION + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + + let prevprevnlnum = s:GetPrevNormalLine(prevnlnum) + + " Don't indent if not the first continuation. + if prevprevnlnum && s:GetTrimmedLine(prevprevnlnum) =~ s:CONTINUATION + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + + " Continuation indenting seems to vary between programmers, so if the line + " is non-blank, don't override the indentation + if strlen(getline(a:curlnum)) > indent(a:curlnum) + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + + " Otherwise indent a level. + return indent(prevnlnum) + s:ShiftWidth() + endif + + " Check if the previous line starts with a keyword that begins a block. + if prevline =~ s:BEGIN_BLOCK + " Indent if the current line doesn't start with `then` and the previous line + " isn't a single-line statement. + if curline !~ '\C^\' && !s:SearchCode(prevnlnum, '\C\') && + \ prevline !~ s:SINGLE_LINE_ELSE + return indent(prevnlnum) + s:ShiftWidth() + else + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + endif + + " Indent a dot access if it's the first. + if curline =~ s:DOT_ACCESS + if prevline !~ s:DOT_ACCESS + return indent(prevnlnum) + s:ShiftWidth() + else + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + endif + + " Outdent if a keyword breaks out of a block as long as it doesn't have a + " postfix condition (and the postfix condition isn't a single-line statement.) + if prevline =~ s:BREAK_BLOCK_OP + if !s:SearchCode(prevnlnum, s:POSTFIX_CONDITION) || + \ s:SearchCode(prevnlnum, '\C\') && + \ !s:SearchCode(prevnlnum, s:CONTAINED_THEN) + " Don't force indenting. + return min([indent(a:curlnum), indent(prevnlnum) - s:ShiftWidth()]) + else + exec 'return' s:GetDefaultPolicy(a:curlnum) + endif + endif + + " Check if inside brackets. + let matchlnum = s:SearchPair(a:curlnum, a:curlnum - s:MAX_LOOKBACK, + \ "s:IsCommentOrString(line('.'), col('.'))", + \ '\[\|(\|{', '\]\|)\|}') + + " If inside brackets, indent relative to the brackets, but don't outdent an + " already indented line. + if matchlnum + return max([indent(a:curlnum), indent(matchlnum) + s:ShiftWidth()]) + endif + + " No special rules applied, so use the default policy. + exec 'return' s:GetDefaultPolicy(a:curlnum) +endfunction diff --git a/nvim/init.vim b/nvim/init.vim new file mode 100644 index 0000000..513ce1b --- /dev/null +++ b/nvim/init.vim @@ -0,0 +1,157 @@ +let mapleader ="," + +if ! filereadable(system('echo -n "${XDG_CONFIG_HOME:-$HOME/.config}/nvim/autoload/plug.vim"')) + echo "Downloading junegunn/vim-plug to manage plugins..." + silent !mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/autoload/ + silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/autoload/plug.vim + autocmd VimEnter * PlugInstall +endif + +call plug#begin(system('echo -n "${XDG_CONFIG_HOME:-$HOME/.config}/nvim/plugged"')) +Plug 'tpope/vim-surround' +Plug 'preservim/nerdtree' +Plug 'junegunn/goyo.vim' +Plug 'jreybert/vimagit' +Plug 'vimwiki/vimwiki' +Plug 'vim-airline/vim-airline' +Plug 'tpope/vim-commentary' +Plug 'ap/vim-css-color' +Plug 'iamcco/posix-lib' +call plug#end() + +set title +set bg=light +set go=a +set mouse=a +set nohlsearch +set clipboard+=unnamedplus +set noshowmode +set noruler +set laststatus=0 +set noshowcmd + +" Some basics: + nnoremap c "_c + set nocompatible + filetype plugin on + syntax on + set encoding=utf-8 + set number relativenumber +" Enable autocompletion: + set wildmode=longest,list,full +" Disables automatic commenting on newline: + autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o +" Perform dot commands over visual blocks: + vnoremap . :normal . +" Goyo plugin makes text more readable when writing prose: + map f :Goyo \| set bg=light \| set linebreak +" Spell-check set to o, 'o' for 'orthography': + map o :setlocal spell! spelllang=en_us +" Splits open at the bottom and right, which is non-retarded, unlike vim defaults. + set splitbelow splitright + +" Nerd tree + map n :NERDTreeToggle + autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif + if has('nvim') + let NERDTreeBookmarksFile = stdpath('data') . '/NERDTreeBookmarks' + else + let NERDTreeBookmarksFile = '~/.vim' . '/NERDTreeBookmarks' + endif + +" vimling: + nm d :call ToggleDeadKeys() + imap d :call ToggleDeadKeys()a + nm i :call ToggleIPA() + imap i :call ToggleIPA()a + nm q :call ToggleProse() + +" Shortcutting split navigation, saving a keypress: + map h + map j + map k + map l + +" Replace ex mode with gq + map Q gq + +" Check file in shellcheck: + map s :!clear && shellcheck -x % + +" Open my bibliography file in split + map b :vsp$BIB + map r :vsp$REFER + +" Replace all is aliased to S. + nnoremap S :%s//g + +" Compile document, be it groff/LaTeX/markdown/etc. + map c :w! \| !compiler "%" + +" Open corresponding .pdf/.html or preview + map p :!opout % + +" Runs a script that cleans out tex build files whenever I close out of a .tex file. + autocmd VimLeave *.tex !texclear % + +" Ensure files are read as what I want: + let g:vimwiki_ext2syntax = {'.Rmd': 'markdown', '.rmd': 'markdown','.md': 'markdown', '.markdown': 'markdown', '.mdown': 'markdown'} + map v :VimwikiIndex + let g:vimwiki_list = [{'path': '~/.local/share/nvim/vimwiki', 'syntax': 'markdown', 'ext': '.md'}] + autocmd BufRead,BufNewFile /tmp/calcurse*,~/.calcurse/notes/* set filetype=markdown + autocmd BufRead,BufNewFile *.ms,*.me,*.mom,*.man set filetype=groff + autocmd BufRead,BufNewFile *.tex set filetype=tex + +" Save file as sudo on files that require root permission + cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' edit! + +" Enable Goyo by default for mutt writing + autocmd BufRead,BufNewFile /tmp/neomutt* let g:goyo_width=80 + autocmd BufRead,BufNewFile /tmp/neomutt* :Goyo | set bg=light + autocmd BufRead,BufNewFile /tmp/neomutt* map ZZ :Goyo\|x! + autocmd BufRead,BufNewFile /tmp/neomutt* map ZQ :Goyo\|q! + +" Automatically deletes all trailing whitespace and newlines at end of file on save. & reset cursor position + autocmd BufWritePre * let currPos = getpos(".") + autocmd BufWritePre * %s/\s\+$//e + autocmd BufWritePre * %s/\n\+\%$//e + autocmd BufWritePre *.[ch] %s/\%$/\r/e + autocmd BufWritePre * cal cursor(currPos[1], currPos[2]) +" Auto Make 4chan filters" + autocmd BufWritePost ~/gits/4chanFilters/filters/* !cd ~/gits/4chanFilters/; make all +" When shortcut files are updated, renew bash and ranger configs with new material: + autocmd BufWritePost bm-files,bm-dirs !shortcuts +" Run xrdb whenever Xdefaults or Xresources are updated. + autocmd BufRead,BufNewFile Xresources,Xdefaults,xresources,xdefaults set filetype=xdefaults + autocmd BufWritePost Xresources,Xdefaults,xresources,xdefaults !xrdb % +" Recompile dwmblocks on config edit. + autocmd BufWritePost ~/.local/src/dwmblocks/config.h !cd ~/.local/src/dwmblocks/; sudo make install && { killall -q dwmblocks;setsid -f dwmblocks } + +" Turns off highlighting on the bits of code that are changed, so the line that is changed is highlighted but the actual text that has changed stands out on the line and is readable. +if &diff + highlight! link DiffText MatchParen +endif + +" Function for toggling the bottom statusbar: +let s:hidden_all = 0 +function! ToggleHiddenAll() + if s:hidden_all == 0 + let s:hidden_all = 1 + set noshowmode + set noruler + set laststatus=0 + set noshowcmd + else + let s:hidden_all = 0 + set showmode + set ruler + set laststatus=2 + set showcmd + endif +endfunction +nnoremap h :call ToggleHiddenAll() +" Load command shortcuts generated from bm-dirs and bm-files via shortcuts script. +" Here leader is ";". +" So ":vs ;cfz" will expand into ":vs /home//.config/zsh/.zshrc" +" if typed fast without the timeout. +source ~/.config/nvim/shortcuts.vim diff --git a/nvim/plugged/goyo.vim b/nvim/plugged/goyo.vim new file mode 160000 index 0000000..d0bb582 --- /dev/null +++ b/nvim/plugged/goyo.vim @@ -0,0 +1 @@ +Subproject commit d0bb582dd478011cfdba18ac3b2d52a7f1659aeb diff --git a/nvim/plugged/nerdtree b/nvim/plugged/nerdtree new file mode 160000 index 0000000..fc85a6f --- /dev/null +++ b/nvim/plugged/nerdtree @@ -0,0 +1 @@ +Subproject commit fc85a6f07c2cd694be93496ffad75be126240068 diff --git a/nvim/plugged/vim-airline b/nvim/plugged/vim-airline new file mode 160000 index 0000000..f5a6597 --- /dev/null +++ b/nvim/plugged/vim-airline @@ -0,0 +1 @@ +Subproject commit f5a6597496506da19d8177f4efc569e4971d0b74 diff --git a/nvim/plugged/vim-commentary b/nvim/plugged/vim-commentary new file mode 160000 index 0000000..3654775 --- /dev/null +++ b/nvim/plugged/vim-commentary @@ -0,0 +1 @@ +Subproject commit 3654775824337f466109f00eaf6759760f65be34 diff --git a/nvim/plugged/vim-css-color b/nvim/plugged/vim-css-color new file mode 160000 index 0000000..8bf9436 --- /dev/null +++ b/nvim/plugged/vim-css-color @@ -0,0 +1 @@ +Subproject commit 8bf943681f92c81a8cca19762a1ccec8bc29098a diff --git a/nvim/plugged/vim-surround b/nvim/plugged/vim-surround new file mode 160000 index 0000000..bf3480d --- /dev/null +++ b/nvim/plugged/vim-surround @@ -0,0 +1 @@ +Subproject commit bf3480dc9ae7bea34c78fbba4c65b4548b5b1fea diff --git a/nvim/plugged/vimagit b/nvim/plugged/vimagit new file mode 160000 index 0000000..308650d --- /dev/null +++ b/nvim/plugged/vimagit @@ -0,0 +1 @@ +Subproject commit 308650ddc1e9a94e49fae0ea04bbc1c45f23d4c4 diff --git a/nvim/plugged/vimwiki b/nvim/plugged/vimwiki new file mode 160000 index 0000000..63af6e7 --- /dev/null +++ b/nvim/plugged/vimwiki @@ -0,0 +1 @@ +Subproject commit 63af6e72dd3fa840bffb3ebcb8c96970c02e0913 diff --git a/nvim/shortcuts.vim b/nvim/shortcuts.vim new file mode 100644 index 0000000..0683a6b --- /dev/null +++ b/nvim/shortcuts.vim @@ -0,0 +1,35 @@ +cmap ;cac /home/victor/.cache +cmap ;cf /home/victor/.config +cmap ;D /home/victor/down +cmap ;d /home/victor/dox +cmap ;dt /home/victor/.local/share +cmap ;rr /home/victor/.local/src +cmap ;h /home/victor +cmap ;m /home/victor/music +cmap ;mn /mnt +cmap ;pp /home/victor/pix +cmap ;sc /home/victor/.local/bin +cmap ;src /home/victor/.local/src +cmap ;vv /home/victor/vids +cmap ;ssd /mnt/ssd250/ +cmap ;nvme /mnt/nvme/ +cmap ;bsd /home/victor/bsd +cmap ;pub /home/victor/Public +cmap ;memes /home/victor/Pictures/1memes +cmap ;web /home/victor/web +cmap ;bf /home/victor/.config/shell/bm-files +cmap ;bd /home/victor/.config/shell/bm-dirs +cmap ;cfx /home/victor/.config/x11/xresources +cmap ;cfb ~/.local/src/dwmblocks/config.h +cmap ;cfv /home/victor/.config/nvim/init.vim +cmap ;cfz /home/victor/.config/zsh/.zshrc +cmap ;cfa /home/victor/.config/shell/aliasrc +cmap ;cfp /home/victor/.config/shell/profile +cmap ;cfm /home/victor/.config/mutt/muttrc +cmap ;cfn /home/victor/.config/newsboat/config +cmap ;cfu /home/victor/.config/newsboat/urls +cmap ;cfmb /home/victor/.config/ncmpcpp/bindings +cmap ;cfmc /home/victor/.config/ncmpcpp/config +cmap ;cfl /home/victor/.config/lf/lfrc +cmap ;cfL /home/victor/.config/lf/scope +cmap ;cfX /home/victor/.config/sxiv/exec/key-handler diff --git a/nvim/syntax/coffee.vim b/nvim/syntax/coffee.vim new file mode 100644 index 0000000..7f8df73 --- /dev/null +++ b/nvim/syntax/coffee.vim @@ -0,0 +1,221 @@ +" Language: CoffeeScript +" Maintainer: Mick Koch +" URL: http://github.com/kchmck/vim-coffee-script +" License: WTFPL + +" Bail if our syntax is already loaded. +if exists('b:current_syntax') && b:current_syntax == 'coffee' + finish +endif + +" Include JavaScript for coffeeEmbed. +syn include @coffeeJS syntax/javascript.vim +silent! unlet b:current_syntax + +" Highlight long strings. +syntax sync fromstart + +" These are `matches` instead of `keywords` because vim's highlighting +" priority for keywords is higher than matches. This causes keywords to be +" highlighted inside matches, even if a match says it shouldn't contain them -- +" like with coffeeAssign and coffeeDot. +syn match coffeeStatement /\<\%(return\|break\|continue\|throw\)\>/ display +hi def link coffeeStatement Statement + +syn match coffeeRepeat /\<\%(for\|while\|until\|loop\)\>/ display +hi def link coffeeRepeat Repeat + +syn match coffeeConditional /\<\%(if\|else\|unless\|switch\|when\|then\)\>/ +\ display +hi def link coffeeConditional Conditional + +syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display +hi def link coffeeException Exception + +syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\)\>/ +\ display +" The `own` keyword is only a keyword after `for`. +syn match coffeeKeyword /\/ contained containedin=coffeeRepeat +\ display +hi def link coffeeKeyword Keyword + +syn match coffeeOperator /\<\%(instanceof\|typeof\|delete\)\>/ display +hi def link coffeeOperator Operator + +" The first case matches symbol operators only if they have an operand before. +syn match coffeeExtendedOp /\%(\S\s*\)\@<=[+\-*/%&|\^=!<>?.]\{-1,}\|[-=]>\|--\|++\|:/ +\ display +syn match coffeeExtendedOp /\<\%(and\|or\)=/ display +hi def link coffeeExtendedOp coffeeOperator + +" This is separate from `coffeeExtendedOp` to help differentiate commas from +" dots. +syn match coffeeSpecialOp /[,;]/ display +hi def link coffeeSpecialOp SpecialChar + +syn match coffeeBoolean /\<\%(true\|on\|yes\|false\|off\|no\)\>/ display +hi def link coffeeBoolean Boolean + +syn match coffeeGlobal /\<\%(null\|undefined\)\>/ display +hi def link coffeeGlobal Type + +" A special variable +syn match coffeeSpecialVar /\<\%(this\|prototype\|arguments\)\>/ display +hi def link coffeeSpecialVar Special + +" An @-variable +syn match coffeeSpecialIdent /@\%(\%(\I\|\$\)\%(\i\|\$\)*\)\?/ display +hi def link coffeeSpecialIdent Identifier + +" A class-like name that starts with a capital letter +syn match coffeeObject /\<\u\w*\>/ display +hi def link coffeeObject Structure + +" A constant-like name in SCREAMING_CAPS +syn match coffeeConstant /\<\u[A-Z0-9_]\+\>/ display +hi def link coffeeConstant Constant + +" A variable name +syn cluster coffeeIdentifier contains=coffeeSpecialVar,coffeeSpecialIdent, +\ coffeeObject,coffeeConstant + +" A non-interpolated string +syn cluster coffeeBasicString contains=@Spell,coffeeEscape +" An interpolated string +syn cluster coffeeInterpString contains=@coffeeBasicString,coffeeInterp + +" Regular strings +syn region coffeeString start=/"/ skip=/\\\\\|\\"/ end=/"/ +\ contains=@coffeeInterpString +syn region coffeeString start=/'/ skip=/\\\\\|\\'/ end=/'/ +\ contains=@coffeeBasicString +hi def link coffeeString String + +" A integer, including a leading plus or minus +syn match coffeeNumber /\%(\i\|\$\)\@/ display +syn match coffeeNumber /\<0[bB][01]\+\>/ display +syn match coffeeNumber /\<0[oO][0-7]\+\>/ display +syn match coffeeNumber /\<\%(Infinity\|NaN\)\>/ display +hi def link coffeeNumber Number + +" A floating-point number, including a leading plus or minus +syn match coffeeFloat /\%(\i\|\$\)\@/ +\ display +hi def link coffeeReservedError Error + +" A normal object assignment +syn match coffeeObjAssign /@\?\%(\I\|\$\)\%(\i\|\$\)*\s*\ze::\@!/ contains=@coffeeIdentifier display +hi def link coffeeObjAssign Identifier + +syn keyword coffeeTodo TODO FIXME XXX contained +hi def link coffeeTodo Todo + +syn match coffeeComment /#.*/ contains=@Spell,coffeeTodo +hi def link coffeeComment Comment + +syn region coffeeBlockComment start=/####\@!/ end=/###/ +\ contains=@Spell,coffeeTodo +hi def link coffeeBlockComment coffeeComment + +" A comment in a heregex +syn region coffeeHeregexComment start=/#/ end=/\ze\/\/\/\|$/ contained +\ contains=@Spell,coffeeTodo +hi def link coffeeHeregexComment coffeeComment + +" Embedded JavaScript +syn region coffeeEmbed matchgroup=coffeeEmbedDelim +\ start=/`/ skip=/\\\\\|\\`/ end=/`/ keepend +\ contains=@coffeeJS +hi def link coffeeEmbedDelim Delimiter + +syn region coffeeInterp matchgroup=coffeeInterpDelim start=/#{/ end=/}/ contained +\ contains=@coffeeAll +hi def link coffeeInterpDelim PreProc + +" A string escape sequence +syn match coffeeEscape /\\\d\d\d\|\\x\x\{2\}\|\\u\x\{4\}\|\\./ contained display +hi def link coffeeEscape SpecialChar + +" A regex -- must not follow a parenthesis, number, or identifier, and must not +" be followed by a number +syn region coffeeRegex start=#\%(\%()\|\%(\i\|\$\)\@ = + # + # Used to find spa factory names. It maps an spa factory name + # regular expression to a library name that should contain + # that factory. + # + audio.convert.* = audioconvert/libspa-audioconvert + api.alsa.* = alsa/libspa-alsa + api.v4l2.* = v4l2/libspa-v4l2 + api.libcamera.* = libcamera/libspa-libcamera + api.bluez5.* = bluez5/libspa-bluez5 + api.vulkan.* = vulkan/libspa-vulkan + api.jack.* = jack/libspa-jack + support.* = support/libspa-support + #videotestsrc = videotestsrc/libspa-videotestsrc + #audiotestsrc = audiotestsrc/libspa-audiotestsrc +} + +context.modules = [ + #{ name = + # [ args = { = ... } ] + # [ flags = [ [ ifexists ] [ nofail ] ] + #} + # + # Loads a module with the given parameters. + # If ifexists is given, the module is ignored when it is not found. + # If nofail is given, module initialization failures are ignored. + # + + # Uses RTKit to boost the data thread priority. + { name = libpipewire-module-rtkit + args = { + #nice.level = -11 + #rt.prio = 88 + #rt.time.soft = 2000000 + #rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } + + # Set thread priorities without using RTKit. + #{ name = libpipewire-module-rt + # args = { + # nice.level = -11 + # rt.prio = 88 + # rt.time.soft = 2000000 + # rt.time.hard = 2000000 + # } + # flags = [ ifexists nofail ] + #} + + # The native communication protocol. + { name = libpipewire-module-protocol-native } + + # The profile module. Allows application to access profiler + # and performance data. It provides an interface that is used + # by pw-top and pw-profiler. + { name = libpipewire-module-profiler } + + # Allows applications to create metadata objects. It creates + # a factory for Metadata objects. + { name = libpipewire-module-metadata } + + # Creates a factory for making devices that run in the + # context of the PipeWire server. + { name = libpipewire-module-spa-device-factory } + + # Creates a factory for making nodes that run in the + # context of the PipeWire server. + { name = libpipewire-module-spa-node-factory } + + # Allows creating nodes that run in the context of the + # client. Is used by all clients that want to provide + # data to PipeWire. + { name = libpipewire-module-client-node } + + # Allows creating devices that run in the context of the + # client. Is used by the session manager. + { name = libpipewire-module-client-device } + + # The portal module monitors the PID of the portal process + # and tags connections with the same PID as portal + # connections. + { name = libpipewire-module-portal + flags = [ ifexists nofail ] + } + + # The access module can perform access checks and block + # new clients. + { name = libpipewire-module-access + args = { + # access.allowed to list an array of paths of allowed + # apps. + #access.allowed = [ + # /usr/bin/pipewire-media-session + #] + + # An array of rejected paths. + #access.rejected = [ ] + + # An array of paths with restricted access. + #access.restricted = [ ] + + # Anything not in the above lists gets assigned the + # access.force permission. + #access.force = flatpak + } + } + + # Makes a factory for wrapping nodes in an adapter with a + # converter and resampler. + { name = libpipewire-module-adapter } + + # Makes a factory for creating links between ports. + { name = libpipewire-module-link-factory } + + # Provides factories to make session manager objects. + { name = libpipewire-module-session-manager } +] + +context.objects = [ + #{ factory = + # [ args = { = ... } ] + # [ flags = [ [ nofail ] ] + #} + # + # Creates an object from a PipeWire factory with the given parameters. + # If nofail is given, errors are ignored (and no object is created). + # + #{ factory = spa-node-factory args = { factory.name = videotestsrc node.name = videotestsrc Spa:Pod:Object:Param:Props:patternType = 1 } } + #{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] } + #{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } } + #{ factory = spa-node-factory args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } } + #{ factory = adapter args = { factory.name = audiotestsrc node.name = my-test } } + #{ factory = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } } + + # A default dummy driver. This handles nodes marked with the "node.always-driver" + # property when no other driver is currently active. JACK clients need this. + { factory = spa-node-factory + args = { + factory.name = support.node.driver + node.name = Dummy-Driver + node.group = pipewire.dummy + priority.driver = 20000 + } + } + { factory = spa-node-factory + args = { + factory.name = support.node.driver + node.name = Freewheel-Driver + priority.driver = 19000 + node.group = pipewire.freewheel + node.freewheel = true + } + } + # This creates a new Source node. It will have input ports + # that you can link, to provide audio for this source. + #{ factory = adapter + # args = { + # factory.name = support.null-audio-sink + # node.name = "my-mic" + # node.description = "Microphone" + # media.class = "Audio/Source/Virtual" + # audio.position = "FL,FR" + # } + #} + + # This creates a single PCM source device for the given + # alsa device path hw:0. You can change source to sink + # to make a sink in the same way. + #{ factory = adapter + # args = { + # factory.name = api.alsa.pcm.source + # node.name = "alsa-source" + # node.description = "PCM Source" + # media.class = "Audio/Source" + # api.alsa.path = "hw:0" + # api.alsa.period-size = 1024 + # api.alsa.headroom = 0 + # api.alsa.disable-mmap = false + # api.alsa.disable-batch = false + # audio.format = "S16LE" + # audio.rate = 48000 + # audio.channels = 2 + # audio.position = "FL,FR" + # } + #} +] + +context.exec = [ + #{ path = [ args = "" ] } + # + # Execute the given program with arguments. + # + # You can optionally start the session manager here, + # but it is better to start it as a systemd service. + # Run the session manager with -h for options. + # + { path = "/usr/bin/wireplumber" args = "" } + # + # You can optionally start the pulseaudio-server here as well + # but it is better to start it as a systemd service. + # It can be interesting to start another daemon here that listens + # on another address with the -a option (eg. -a tcp:4713). + # + { path = "/usr/bin/pipewire" args = "-c pipewire-pulse.conf" } +] diff --git a/pulse/cookie b/pulse/cookie new file mode 100644 index 0000000..ac83891 Binary files /dev/null and b/pulse/cookie differ diff --git a/pulse/daemon.conf b/pulse/daemon.conf new file mode 100644 index 0000000..ef900f1 --- /dev/null +++ b/pulse/daemon.conf @@ -0,0 +1,4 @@ +# Never exit pulseaudio if idle. This is to deal with an issue of Chromium +# browsers not properly starting Pulseaudio by themselves. When the underlying +# issue is solved, this file/directory should be removed. +exit-idle-time = -1 diff --git a/shell/aliasrc b/shell/aliasrc new file mode 100644 index 0000000..73a7f82 --- /dev/null +++ b/shell/aliasrc @@ -0,0 +1,67 @@ +#!/bin/sh + +# Use neovim for vim if present. +[ -x "$(command -v nvim)" ] && alias vim="nvim" vimdiff="nvim -d" + +# Use $XINITRC variable if file exists. +[ -f "$XINITRC" ] && alias startx="startx $XINITRC" + +# sudo not required for some system commands +for command in mount umount sv pacman updatedb su shutdown poweroff reboot ; do + alias $command="sudo $command" +done; unset command + +# Verbosity and settings that you pretty much just always are going to want. +alias \ + cp="cp -iv" \ + mv="mv -iv" \ + rm="rm -vI" \ + bc="bc -ql" \ + mkd="mkdir -pv" \ + yt="yt-dlp --embed-metadata -i" \ + yta="yt -x -f bestaudio/best" \ + ffmpeg="ffmpeg -hide_banner" \ + nvidia-settings="nvidia-settings --config="$XDG_CONFIG_HOME"/nvidia/settings" \ + ye="yay" + +# Colorize commands when possible. +alias \ + ls="ls -hN --color=auto --group-directories-first" \ + grep="grep --color=auto" \ + diff="diff --color=auto" \ + ccat="highlight --out-format=ansi" \ + lf="lfub" \ + ip="ip -color=auto" + +# These common commands are just too long! Abbreviate them. +alias \ + ka="killall" \ + ncdu="ncdu --exclude /proc/" \ + g="git" \ + trem="transmission-remote" \ + YT="youtube-viewer" \ + sdn="shutdown -h now" \ + e="$EDITOR" \ + v="$EDITOR" \ + p="pacman" \ + xi="sudo xbps-install" \ + xr="sudo xbps-remove -R" \ + jelly="pidof -s jellyfin || echo 1234 | sudo -S /lib/jellyfin/bin/jellyfin -w /usr/share/jellyfin/web -C /home/victor/.cache/jellyfin -c /home/victor/.config/jellyfin >/dev/null 2>&1 &" \ + xq="xbps-query" \ + z="zathura" \ + jpgv="sxiv" \ + pngv="sxiv" \ + pdfv="zathura" \ + jpegv="sxiv" \ + bs="cd ~/Based/ && ls -a" \ + trrnt="nordvpn c p2p && qbittorrent" \ + q="exit" \ + :q="exit" \ + syncweb="rsync -vrP --delete-after ~/risgaard.xyz/ root@risgaard.xyz:/var/www/risgaard" \ + +alias \ + magit="nvim -c MagitOnly" \ + ref="shortcuts >/dev/null; source ${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc ; source ${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc" \ + weath="less -S ${XDG_DATA_HOME:-$HOME/.local/share}/weatherreport" \ + ris="ssh risgaard@192.168.0.156" \ + shutdown="poweroff -h now" diff --git a/shell/bm-dirs b/shell/bm-dirs new file mode 100644 index 0000000..930a5ab --- /dev/null +++ b/shell/bm-dirs @@ -0,0 +1,20 @@ +# You can add comments to these files with # +cac ${XDG_CACHE_HOME:-$HOME/.cache} +cf ${XDG_CONFIG_HOME:-$HOME/.config} +D ${XDG_DOWNLOAD_DIR:-$HOME/down} +d ${XDG_DOCUMENTS_DIR:-$HOME/dox} +dt ${XDG_DATA_HOME:-$HOME/.local/share} +rr $HOME/.local/src +h $HOME +m ${XDG_MUSIC_DIR:-$HOME/music} +mn /mnt +pp ${XDG_PICTURES_DIR:-$HOME/pix} +sc $HOME/.local/bin +src $HOME/.local/src +vv ${XDG_VIDEOS_DIR:-$HOME/vids} +ssd /mnt/ssd250/ +nvme /mnt/nvme/ +bsd $HOME/bsd +pub $HOME/Public +memes $HOME/Pictures/1memes +web $HOME/web diff --git a/shell/bm-files b/shell/bm-files new file mode 100644 index 0000000..7acbb66 --- /dev/null +++ b/shell/bm-files @@ -0,0 +1,23 @@ +# These files automatically update when edited/saved in vim: + +# keys filename description +bf ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-files # This file, a list of bookmarked files +bd ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs # A list of bookmarked directories similar to this file +cfx ${XDG_CONFIG_HOME:-$HOME/.config}/x11/xresources # Colors, themes and variables for X11 +cfb ~/.local/src/dwmblocks/config.h # dwmblocks: the status bar for dwm + + +# These do not update automatically, but on the next new instance of a program: + +cfv ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/init.vim # vim/neovim config +cfz $ZDOTDIR/.zshrc # zsh (shell) config +cfa ${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliasrc # aliases used by zsh (and potentially other shells) +cfp ${XDG_CONFIG_HOME:-$HOME/.config}/shell/profile # profile file for login settings for zsh +cfm ${XDG_CONFIG_HOME:-$HOME/.config}/mutt/muttrc # mutt (email client) config +cfn ${XDG_CONFIG_HOME:-$HOME/.config}/newsboat/config # newsboat (RSS reader) +cfu ${XDG_CONFIG_HOME:-$HOME/.config}/newsboat/urls # RSS urls for newsboat +cfmb ${XDG_CONFIG_HOME:-$HOME/.config}/ncmpcpp/bindings # ncmpcpp (music player) keybinds file +cfmc ${XDG_CONFIG_HOME:-$HOME/.config}/ncmpcpp/config # ncmpcpp (music player) config +cfl ${XDG_CONFIG_HOME:-$HOME/.config}/lf/lfrc # lf (file browser) config +cfL ${XDG_CONFIG_HOME:-$HOME/.config}/lf/scope # lf's scope/preview file +cfX ${XDG_CONFIG_HOME:-$HOME/.config}/sxiv/exec/key-handler # sxiv (image viewer) key/script handler diff --git a/shell/inputrc b/shell/inputrc new file mode 100644 index 0000000..f9b94dd --- /dev/null +++ b/shell/inputrc @@ -0,0 +1,19 @@ +$include /etc/inputrc +set editing-mode vi +$if mode=vi + +set show-mode-in-prompt on +set vi-ins-mode-string \1\e[6 q\2 +set vi-cmd-mode-string \1\e[2 q\2 + +set keymap vi-command +# these are for vi-command mode +Control-l: clear-screen +Control-a: beginning-of-line + +set keymap vi-insert +# these are for vi-insert mode +Control-l: clear-screen +Control-a: beginning-of-line + +$endif diff --git a/shell/profile b/shell/profile new file mode 100644 index 0000000..b970e97 --- /dev/null +++ b/shell/profile @@ -0,0 +1,158 @@ +#!/bin/zsh + +# profile file. Runs on login. Environmental variables are set here. + +# If you don't plan on reverting to bash, you can remove the link in ~/.profile +# to clean up. + +# Adds `~/.local/bin` to $PATH +export PATH="$PATH:${$(find ~/.local/bin -type d -printf %p:)%%:}" + +unsetopt PROMPT_SP + +# Default programs: +export EDITOR="nvim" +export TERMINAL="st" +export BROWSER="librewolf" + +# ~/ Clean-up: +export XDG_CONFIG_HOME="$HOME/.config" +export XDG_DATA_HOME="$HOME/.local/share" +export XDG_CACHE_HOME="$HOME/.cache" +export XINITRC="${XDG_CONFIG_HOME:-$HOME/.config}/x11/xinitrc" +#export XAUTHORITY="$XDG_RUNTIME_DIR/Xauthority" # This line will break some DMs. +export NOTMUCH_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/notmuch-config" +export GTK2_RC_FILES="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-2.0/gtkrc-2.0" +export LESSHISTFILE="-" +export WGETRC="${XDG_CONFIG_HOME:-$HOME/.config}/wget/wgetrc" +export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/shell/inputrc" +export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh" +#export ALSA_CONFIG_PATH="$XDG_CONFIG_HOME/alsa/asoundrc" +#export GNUPGHOME="${XDG_DATA_HOME:-$HOME/.local/share}/gnupg" +export WINEPREFIX="${XDG_DATA_HOME:-$HOME/.local/share}/wineprefixes/default" +export KODI_DATA="${XDG_DATA_HOME:-$HOME/.local/share}/kodi" +export PASSWORD_STORE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/password-store" +export TMUX_TMPDIR="$XDG_RUNTIME_DIR" +export ANDROID_SDK_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/android" +export CARGO_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/cargo" +export GOPATH="${XDG_DATA_HOME:-$HOME/.local/share}/go" +export ANSIBLE_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/ansible/ansible.cfg" +export UNISON="${XDG_DATA_HOME:-$HOME/.local/share}/unison" +export HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/history" +export WEECHAT_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/weechat" +export MBSYNCRC="${XDG_CONFIG_HOME:-$HOME/.config}/mbsync/config" +export ELECTRUMDIR="${XDG_DATA_HOME:-$HOME/.local/share}/electrum" +export CUDA_CACHE_PATH="${XDG_CACHE_HOME}/nv" +export NUGET_PACKAGES="${XDG_CACHE_HOME}/NuGetPackages" +# Other program settings: +export DICS="/usr/share/stardict/dic/" +export SUDO_ASKPASS="$HOME/.local/bin/dmenupass" +export FZF_DEFAULT_OPTS="--layout=reverse --height 40%" +export LESS=-R +export LESS_TERMCAP_mb="$(printf '%b' '')" +export LESS_TERMCAP_md="$(printf '%b' '')" +export LESS_TERMCAP_me="$(printf '%b' '')" +export LESS_TERMCAP_so="$(printf '%b' '')" +export LESS_TERMCAP_se="$(printf '%b' '')" +export LESS_TERMCAP_us="$(printf '%b' '')" +export LESS_TERMCAP_ue="$(printf '%b' '')" +export LESSOPEN="| /usr/bin/highlight -O ansi %s 2>/dev/null" +export QT_QPA_PLATFORMTHEME="gtk2" # Have QT use gtk2 theme. +export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads. +export AWT_TOOLKIT="MToolkit wmname LG3D" #May have to install wmname +export _JAVA_AWT_WM_NONREPARENTING=1 # Fix for Java applications in dwm +export VSCODE_PORTABLE="$XDG_DATA_HOME"/vscode +export LANG=en_US.UTF-8 +# This is the list for lf icons: +export LF_ICONS="di=ðŸ“:\ +fi=📃:\ +tw=ðŸ¤:\ +ow=📂:\ +ln=⛓:\ +or=âŒ:\ +ex=🎯:\ +*.txt=âœ:\ +*.mom=âœ:\ +*.me=âœ:\ +*.ms=âœ:\ +*.png=🖼:\ +*.webp=🖼:\ +*.ico=🖼:\ +*.jpg=📸:\ +*.jpe=📸:\ +*.jpeg=📸:\ +*.gif=🖼:\ +*.svg=🗺:\ +*.tif=🖼:\ +*.tiff=🖼:\ +*.xcf=🖌:\ +*.html=🌎:\ +*.xml=📰:\ +*.gpg=🔒:\ +*.css=🎨:\ +*.pdf=📚:\ +*.djvu=📚:\ +*.epub=📚:\ +*.csv=📓:\ +*.xlsx=📓:\ +*.tex=📜:\ +*.md=📘:\ +*.r=📊:\ +*.R=📊:\ +*.rmd=📊:\ +*.Rmd=📊:\ +*.m=📊:\ +*.mp3=🎵:\ +*.opus=🎵:\ +*.ogg=🎵:\ +*.m4a=🎵:\ +*.flac=🎼:\ +*.wav=🎼:\ +*.mkv=🎥:\ +*.mp4=🎥:\ +*.webm=🎥:\ +*.mpeg=🎥:\ +*.avi=🎥:\ +*.mov=🎥:\ +*.mpg=🎥:\ +*.wmv=🎥:\ +*.m4b=🎥:\ +*.flv=🎥:\ +*.zip=📦:\ +*.rar=📦:\ +*.7z=📦:\ +*.tar.gz=📦:\ +*.z64=🎮:\ +*.v64=🎮:\ +*.n64=🎮:\ +*.gba=🎮:\ +*.nes=🎮:\ +*.gdi=🎮:\ +*.1=ℹ:\ +*.nfo=ℹ:\ +*.info=ℹ:\ +*.log=📙:\ +*.iso=📀:\ +*.img=📀:\ +*.bib=🎓:\ +*.ged=👪:\ +*.part=💔:\ +*.torrent=🔽:\ +*.jar=♨:\ +*.java=♨:\ +" + +[ ! -f ${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc ] && shortcuts >/dev/null 2>&1 & + +if pacman -Qs libxft-bgra >/dev/null 2>&1; then + # Start graphical server on user's current tty if not already running. + [ "$(tty)" = "/dev/tty2" ] && ! pidof -s Xorg >/dev/null 2>&1 && exec startx "$XINITRC" +else + echo "\033[31mIMPORTANT\033[0m: Note that \033[32m\`libxft-bgra\`\033[0m must be installed for this build of dwm. +Please run: + \033[32myay -S libxft-bgra-git\033[0m +and replace \`libxft\`. Afterwards, you may start the graphical server by running \`startx\`." +fi + +# Switch escape and caps if tty and no passwd required: +sudo -n loadkeys ${XDG_DATA_HOME:-$HOME/.local/share}/larbs/ttymaps.kmap 2>/dev/null diff --git a/shell/shortcutrc b/shell/shortcutrc new file mode 100644 index 0000000..7beb8b8 --- /dev/null +++ b/shell/shortcutrc @@ -0,0 +1,36 @@ +# vim: filetype=sh +alias cac="cd /home/victor/.cache && ls -a" \ +cf="cd /home/victor/.config && ls -a" \ +D="cd /home/victor/down && ls -a" \ +d="cd /home/victor/dox && ls -a" \ +dt="cd /home/victor/.local/share && ls -a" \ +rr="cd /home/victor/.local/src && ls -a" \ +h="cd /home/victor && ls -a" \ +m="cd /home/victor/music && ls -a" \ +mn="cd /mnt && ls -a" \ +pp="cd /home/victor/pix && ls -a" \ +sc="cd /home/victor/.local/bin && ls -a" \ +src="cd /home/victor/.local/src && ls -a" \ +vv="cd /home/victor/vids && ls -a" \ +ssd="cd /mnt/ssd250/ && ls -a" \ +nvme="cd /mnt/nvme/ && ls -a" \ +bsd="cd /home/victor/bsd && ls -a" \ +pub="cd /home/victor/Public && ls -a" \ +memes="cd /home/victor/Pictures/1memes && ls -a" \ +web="cd /home/victor/web && ls -a" \ +bf="$EDITOR /home/victor/.config/shell/bm-files" \ +bd="$EDITOR /home/victor/.config/shell/bm-dirs" \ +cfx="$EDITOR /home/victor/.config/x11/xresources" \ +cfb="$EDITOR ~/.local/src/dwmblocks/config.h" \ +cfv="$EDITOR /home/victor/.config/nvim/init.vim" \ +cfz="$EDITOR /home/victor/.config/zsh/.zshrc" \ +cfa="$EDITOR /home/victor/.config/shell/aliasrc" \ +cfp="$EDITOR /home/victor/.config/shell/profile" \ +cfm="$EDITOR /home/victor/.config/mutt/muttrc" \ +cfn="$EDITOR /home/victor/.config/newsboat/config" \ +cfu="$EDITOR /home/victor/.config/newsboat/urls" \ +cfmb="$EDITOR /home/victor/.config/ncmpcpp/bindings" \ +cfmc="$EDITOR /home/victor/.config/ncmpcpp/config" \ +cfl="$EDITOR /home/victor/.config/lf/lfrc" \ +cfL="$EDITOR /home/victor/.config/lf/scope" \ +cfX="$EDITOR /home/victor/.config/sxiv/exec/key-handler" \ diff --git a/shell/zshnameddirrc b/shell/zshnameddirrc new file mode 100644 index 0000000..c1d12f7 --- /dev/null +++ b/shell/zshnameddirrc @@ -0,0 +1,35 @@ +hash -d cac=/home/victor/.cache +hash -d cf=/home/victor/.config +hash -d D=/home/victor/down +hash -d d=/home/victor/dox +hash -d dt=/home/victor/.local/share +hash -d rr=/home/victor/.local/src +hash -d h=/home/victor +hash -d m=/home/victor/music +hash -d mn=/mnt +hash -d pp=/home/victor/pix +hash -d sc=/home/victor/.local/bin +hash -d src=/home/victor/.local/src +hash -d vv=/home/victor/vids +hash -d ssd=/mnt/ssd250/ +hash -d nvme=/mnt/nvme/ +hash -d bsd=/home/victor/bsd +hash -d pub=/home/victor/Public +hash -d memes=/home/victor/Pictures/1memes +hash -d web=/home/victor/web +hash -d bf=/home/victor/.config/shell/bm-files +hash -d bd=/home/victor/.config/shell/bm-dirs +hash -d cfx=/home/victor/.config/x11/xresources +hash -d cfb=~/.local/src/dwmblocks/config.h +hash -d cfv=/home/victor/.config/nvim/init.vim +hash -d cfz=/home/victor/.config/zsh/.zshrc +hash -d cfa=/home/victor/.config/shell/aliasrc +hash -d cfp=/home/victor/.config/shell/profile +hash -d cfm=/home/victor/.config/mutt/muttrc +hash -d cfn=/home/victor/.config/newsboat/config +hash -d cfu=/home/victor/.config/newsboat/urls +hash -d cfmb=/home/victor/.config/ncmpcpp/bindings +hash -d cfmc=/home/victor/.config/ncmpcpp/config +hash -d cfl=/home/victor/.config/lf/lfrc +hash -d cfL=/home/victor/.config/lf/scope +hash -d cfX=/home/victor/.config/sxiv/exec/key-handler diff --git a/sxiv/exec/key-handler b/sxiv/exec/key-handler new file mode 100755 index 0000000..4a4f10a --- /dev/null +++ b/sxiv/exec/key-handler @@ -0,0 +1,33 @@ +#!/bin/sh +while read -r file +do + case "$1" in + "w") setbg "$file" & ;; + "c") + [ -z "$destdir" ] && destdir="$(sed "s/#.*$//;/^\s*$/d" ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | awk '{print $2}' | dmenu -l 20 -i -p "Copy file(s) to where?" | sed "s|~|$HOME|g")" + [ ! -d "$destdir" ] && notify-send "$destdir is not a directory, cancelled." && exit + cp "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file copied to $destdir." & + ;; + "m") + [ -z "$destdir" ] && destdir="$(sed "s/#.*$//;/^\s*$/d" ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | awk '{print $2}' | dmenu -l 20 -i -p "Move file(s) to where?" | sed "s|~|$HOME|g")" + [ ! -d "$destdir" ] && notify-send "$destdir is not a directory, cancelled." && exit + mv "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file moved to $destdir." & + ;; + "r") + convert -rotate 90 "$file" "$file" ;; + "R") + convert -rotate -90 "$file" "$file" ;; + "f") + convert -flop "$file" "$file" ;; + "y") + printf "%s" "$file" | tr -d '\n' | xclip -selection clipboard && + notify-send "$file copied to clipboard" & ;; + "Y") + readlink -f "$file" | tr -d '\n' | xclip -selection clipboard && + notify-send "$(readlink -f "$file") copied to clipboard" & ;; + "d") + [ "$(printf "No\\nYes" | dmenu -i -p "Really delete $file?")" = "Yes" ] && rm "$file" && notify-send "$file deleted." ;; + "g") ifinstalled gimp && setsid -f gimp "$file" ;; + "i") notify-send "File information" "$(mediainfo "$file")" ;; + esac +done diff --git a/transmission/dht.dat b/transmission/dht.dat new file mode 100644 index 0000000..ccd7eaa Binary files /dev/null and b/transmission/dht.dat differ diff --git a/transmission/stats.json b/transmission/stats.json new file mode 100644 index 0000000..d5e1828 --- /dev/null +++ b/transmission/stats.json @@ -0,0 +1,7 @@ +{ + "downloaded-bytes": 109338584563, + "files-added": 667, + "seconds-active": 27420, + "session-count": 9, + "uploaded-bytes": 8856997489 +} diff --git a/user-dirs.dirs b/user-dirs.dirs new file mode 100644 index 0000000..ae3b77b --- /dev/null +++ b/user-dirs.dirs @@ -0,0 +1,15 @@ +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run. +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/" +XDG_DOWNLOAD_DIR="$HOME/down" +XDG_TEMPLATES_DIR="$HOME/Templates" +XDG_PUBLICSHARE_DIR="$HOME/Public" +XDG_DOCUMENTS_DIR="$HOME/down" +XDG_MUSIC_DIR="$HOME/music" +XDG_PICTURES_DIR="$HOME/pix" +XDG_VIDEOS_DIR="$HOME/vids" diff --git a/wal/postrun b/wal/postrun new file mode 100755 index 0000000..61d8a41 --- /dev/null +++ b/wal/postrun @@ -0,0 +1,32 @@ +#!/bin/bash + +dunstconf="${XDG_CONFIG_HOME:-$HOME/.config}/dunst/dunstrc" +zathuraconf="${XDG_CONFIG_HOME:-$HOME/.config}/zathura/zathurarc" + +source "${XDG_CACHE_HOME:-$HOME/.cache}/wal/colors.sh" + +mkdir -p "${dunstconf%/*}" "${zathuraconf%/*}" + +mv -n "$dunstconf" "$dunstconf.bak" +mv -n "$zathuraconf" "$zathuraconf.bak" + +ln -sf "${XDG_CACHE_HOME:-$HOME/.cache}/wal/dunstrc" "$dunstconf" +ln -sf "${XDG_CACHE_HOME:-$HOME/.cache}/wal/zathurarc" "$zathuraconf" + +fix_sequences() { + e=$'\e' + sequences=$(cat) + foreground_color="$(echo -e "${sequences}\c" | grep --color=never -Eo "${e}]10[^${e}\\\\]*?${e}\\\\" | grep --color=never -Eo "#[0-9A-Fa-f]{6}")" + background_color="$(echo -e "${sequences}\c" | grep --color=never -Eo "${e}]11[^${e}\\\\]*?${e}\\\\" | grep --color=never -Eo "#[0-9A-Fa-f]{6}")" + cursor_color="$(echo -e "${sequences}\c" | grep --color=never -Eo "${e}]12[^${e}\\\\]*?${e}\\\\" | grep --color=never -Eo "#[0-9A-Fa-f]{6}")" + + for term in /dev/pts/{0..9}*; do + echo -e "\e]4;256;${cursor_color}\a\c" > "${term}" 2>/dev/null + echo -e "\e]4;258;${background_color}\a\c" > "${term}" 2>/dev/null + echo -e "\e]4;259;${foreground_color}\a\c" > "${term}" 2>/dev/null + done +} + +fix_sequences <"${XDG_CACHE_HOME:-$HOME/.cache}/wal/sequences" + +pkill dunst; setsid -f dunst diff --git a/wal/templates/dunstrc b/wal/templates/dunstrc new file mode 100644 index 0000000..5a2e020 --- /dev/null +++ b/wal/templates/dunstrc @@ -0,0 +1,27 @@ +[global] + monitor = 0 + follow = keyboard + width = 370 + height = 350 + offset = 0x19 + padding = 2 + horizontal_padding = 2 + transparency = 25 + font = Monospace 12 + format = "%s\n%b" + +[urgency_low] + background = "{color0}" # color0 + foreground = "{color8}" # color8 + timeout = 3 + +[urgency_normal] + foreground = "{color15}" # color15 + background = "{color4}" # color4 + timeout = 5 + +[urgency_critical] + background = "{color1}" # color1 + foreground = "{color15}" # color15 + frame_color = "{color11}" # color11 + timeout = 10 diff --git a/wal/templates/zathurarc b/wal/templates/zathurarc new file mode 100644 index 0000000..a12bbd3 --- /dev/null +++ b/wal/templates/zathurarc @@ -0,0 +1,35 @@ +set sandbox none +set statusbar-h-padding 0 +set statusbar-v-padding 0 +set page-padding 1 +set selection-clipboard clipboard +map u scroll half-up +map d scroll half-down +map D toggle_page_mode +map r reload +map R rotate +map K zoom in +map J zoom out +map i recolor +map p print + +set default-bg "{background}" +set default-fg "{foreground}" +set statusbar-bg "{background}" +set statusbar-fg "{foreground}" +set inputbar-bg "{background}" +set inputbar-fg "{foreground}" +set notification-bg "{background}" +set notification-fg "{foreground}" +set notification-error-bg "{background}" +set notification-error-fg "{foreground}" +set notification-warning-bg "{background}" +set notification-warning-fg "{foreground}" +set highlight-color "{color3}" +set highlight-active-color "{color4}" +set completion-bg "{color3}" +set completion-fg "{color4}" +set completion-highlight-bg "{color3}" +set completion-highlight-fg "{color4}" +set recolor-lightcolor "{background}" +set recolor-darkcolor "{foreground}" diff --git a/wget/wgetrc b/wget/wgetrc new file mode 100644 index 0000000..4fd7999 --- /dev/null +++ b/wget/wgetrc @@ -0,0 +1 @@ +hsts-file=~/.cache/wget-hsts diff --git a/x11/xinitrc b/x11/xinitrc new file mode 100755 index 0000000..2debc01 --- /dev/null +++ b/x11/xinitrc @@ -0,0 +1,17 @@ +#!/bin/sh + +# xinitrc runs automatically when you run startx. + +# There are some small but important commands that need to be run when we start +# the graphical environment. There is a link to this file in ~/.xprofile +# because that file is run automatically if someone uses a display manager +# (login screen) and so they are needed there. To prevent doubling up commands, +# I source them here with the line below. + +if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/x11/xprofile" ]; then + . "${XDG_CONFIG_HOME:-$HOME/.config}/x11/xprofile" +else + . "$HOME/.xprofile" +fi + +ssh-agent dwm diff --git a/x11/xprofile b/x11/xprofile new file mode 100755 index 0000000..1d63fd2 --- /dev/null +++ b/x11/xprofile @@ -0,0 +1,17 @@ +#!/bin/sh + +# This file runs when a DM logs you into a graphical session. +# If you use startx/xinit like a Chad, this file will also be sourced. + +xrandr --dpi 96 # Set DPI. User may want to use a larger number for larger screens. +setbg & # set the background with the `setbg` script +#xrdb ${XDG_CONFIG_HOME:-$HOME/.config}/x11/xresources & xrdbpid=$! # Uncomment to use Xresources colors/settings on startup + +autostart="mpd xcompmgr dunst unclutter pipewire remapd" + +for program in $autostart; do + pidof -s "$program" || "$program" & +done >/dev/null 2>&1 + +# Ensure that xrdb has finished running before moving on to start the WM/DE. +[ -n "$xrdbpid" ] && wait "$xrdbpid" diff --git a/x11/xresources b/x11/xresources new file mode 100644 index 0000000..611f39a --- /dev/null +++ b/x11/xresources @@ -0,0 +1,156 @@ +!! Transparency (0-1): +*.alpha: 0.8 + +!! Set a default font and font size as below: +*.font: monospace:size=10 + +/* name dark light */ +/* black 0 8 */ +/* red 1 9 */ +/* green 2 10 */ +/* yellow 3 11 */ +/* blue 4 12 */ +/* purple 5 13 */ +/* cyan 6 14 */ +/* white 7 15 */ + +/* !! gruvbox: */ +/* *.color0: #1d2021 */ +/* *.color1: #cc241d */ +/* *.color2: #98971a */ +/* *.color3: #d79921 */ +/* *.color4: #458588 */ +/* *.color5: #b16286 */ +/* *.color6: #689d6a */ +/* *.color7: #a89984 */ +/* *.color8: #928374 */ +/* *.color9: #fb4934 */ +/* *.color10: #b8bb26 */ +/* *.color11: #fabd2f */ +/* *.color12: #83a598 */ +/* *.color13: #d3869b */ +/* *.color14: #8ec07c */ +/* *.color15: #ebdbb2 */ +/* *.color256: #1d2021 */ +/* *.color257: #ebdbb2 */ + +/* !! gruvbox light: */ +/* *.color0: #fbf1c7 */ +/* *.color1: #cc241d */ +/* *.color2: #98971a */ +/* *.color3: #d79921 */ +/* *.color4: #458588 */ +/* *.color5: #b16286 */ +/* *.color6: #689d6a */ +/* *.color7: #7c6f64 */ +/* *.color8: #928374 */ +/* *.color9: #9d0006 */ +/* *.color10: #79740e */ +/* *.color11: #b57614 */ +/* *.color12: #076678 */ +/* *.color13: #8f3f71 */ +/* *.color14: #427b58 */ +/* *.color15: #3c3836 */ +/* *.background: #fbf1c7 */ +/* *.foreground: #282828 */ +/* st.alpha: 0.9 */ + +/* !! brogrammer: */ +/* *.foreground: #d6dbe5 */ +/* *.background: #131313 */ +/* *.color0: #1f1f1f */ +/* *.color8: #d6dbe5 */ +/* *.color1: #f81118 */ +/* *.color9: #de352e */ +/* *.color2: #2dc55e */ +/* *.color10: #1dd361 */ +/* *.color3: #ecba0f */ +/* *.color11: #f3bd09 */ +/* *.color4: #2a84d2 */ +/* *.color12: #1081d6 */ +/* *.color5: #4e5ab7 */ +/* *.color13: #5350b9 */ +/* *.color6: #1081d6 */ +/* *.color14: #0f7ddb */ +/* *.color7: #d6dbe5 */ +/* *.color15: #ffffff */ +/* *.colorBD: #d6dbe5 */ + +/* ! base16 */ +/* *.color0: #181818 */ +/* *.color1: #ab4642 */ +/* *.color2: #a1b56c */ +/* *.color3: #f7ca88 */ +/* *.color4: #7cafc2 */ +/* *.color5: #ba8baf */ +/* *.color6: #86c1b9 */ +/* *.color7: #d8d8d8 */ +/* *.color8: #585858 */ +/* *.color9: #ab4642 */ +/* *.color10: #a1b56c */ +/* *.color11: #f7ca88 */ +/* *.color12: #7cafc2 */ +/* *.color13: #ba8baf */ +/* *.color14: #86c1b9 */ +/* *.color15: #f8f8f8 */ + +/* !! solarized */ +/* *.color0: #073642 */ +/* *.color1: #dc322f */ +/* *.color2: #859900 */ +/* *.color3: #b58900 */ +/* *.color4: #268bd2 */ +/* *.color5: #d33682 */ +/* *.color6: #2aa198 */ +/* *.color7: #eee8d5 */ +/* *.color9: #cb4b16 */ +/* *.color8: #fdf6e3 */ +/* *.color10: #586e75 */ +/* *.color11: #657b83 */ +/* *.color12: #839496 */ +/* *.color13: #6c71c4 */ +/* *.color14: #93a1a1 */ +/* *.color15: #fdf6e3 */ + +/* !! xterm */ +/* *.color0: #000000 */ +/* *.color1: #cd0000 */ +/* *.color2: #00cd00 */ +/* *.color3: #cdcd00 */ +/* *.color4: #0000cd */ +/* *.color5: #cd00cd */ +/* *.color6: #00cdcd */ +/* *.color7: #e5e5e5 */ +/* *.color8: #4d4d4d */ +/* *.color9: #ff0000 */ +/* *.color10: #00ff00 */ +/* *.color11: #ffff00 */ +/* *.color12: #0000ff */ +/* *.color13: #ff00ff */ +/* *.color14: #00ffff */ +/* *.color15: #aabac8 */ +/* *.background: #000000 */ + +/* ! Dracula Xresources palette */ +/* *.foreground: #F8F8F2 */ +/* *.background: #282A36 */ +/* *.color0: #000000 */ +/* *.color8: #4D4D4D */ +/* *.color1: #FF5555 */ +/* *.color9: #FF6E67 */ +/* *.color2: #50FA7B */ +/* *.color10: #5AF78E */ +/* *.color3: #F1FA8C */ +/* *.color11: #F4F99D */ +/* *.color4: #BD93F9 */ +/* *.color12: #CAA9FA */ +/* *.color5: #FF79C6 */ +/* *.color13: #FF92D0 */ +/* *.color6: #8BE9FD */ +/* *.color14: #9AEDFE */ +/* *.color7: #BFBFBF */ +/* *.color15: #E6E6E6 */ + +/* *.background: .color0 */ +/* *.color256: 0#1d2021 */ +/* *.color257: 15#ebdbb2 */ diff --git a/xsettingsd/xsettingsd.conf b/xsettingsd/xsettingsd.conf new file mode 100644 index 0000000..0333fb6 --- /dev/null +++ b/xsettingsd/xsettingsd.conf @@ -0,0 +1,11 @@ +Gtk/EnableAnimations 1 +Gtk/DecorationLayout "icon:minimize,maximize,close" +Gtk/PrimaryButtonWarpsSlider 0 +Gtk/ToolbarStyle 3 +Gtk/MenuImages 1 +Gtk/ButtonImages 1 +Gtk/CursorThemeSize 24 +Gtk/CursorThemeName "breeze_cursors" +Net/IconThemeName "breeze" +Gtk/FontName "Noto Sans, 10" + diff --git a/zathura/zathurarc b/zathura/zathurarc new file mode 100644 index 0000000..452e116 --- /dev/null +++ b/zathura/zathurarc @@ -0,0 +1,15 @@ +set sandbox none +set statusbar-h-padding 0 +set statusbar-v-padding 0 +set page-padding 1 +set selection-clipboard clipboard +map u scroll half-up +map d scroll half-down +map D toggle_page_mode +map r reload +map R rotate +map K zoom in +map J zoom out +map i recolor +map p print +map g goto top diff --git a/zsh/.zcompdump b/zsh/.zcompdump new file mode 100644 index 0000000..01941fc --- /dev/null +++ b/zsh/.zcompdump @@ -0,0 +1,1809 @@ +#files: 794 version: 5.9 + +_comps=( +'-' '_precommand' +'-*-' '_loginctl' +'.' '_source' +'5g' '_go' +'5l' '_go' +'6g' '_go' +'6l' '_go' +'8g' '_go' +'8l' '_go' +'a2ps' '_a2ps' +'aaaa' '_hosts' +'aap' '_aap' +'ab-av1' '_ab-av1' +'abcde' '_abcde' +'ack' '_ack' +'ack2' '_ack' +'ack-grep' '_ack' +'ack-standalone' '_ack' +'acpi' '_acpi' +'acpitool' '_acpitool' +'acroread' '_acroread' +'adb' '_adb' +'add-zle-hook-widget' '_add-zle-hook-widget' +'add-zsh-hook' '_add-zsh-hook' +'admin' '_sccs' +'ali' '_mh' +'alias' '_alias' +'amaya' '_webbrowser' +'analyseplugin' '_analyseplugin' +'animate' '_imagemagick' +'anno' '_mh' +'ansible' '_ansible' +'ansible-config' '_ansible' +'ansible-console' '_ansible' +'ansible-doc' '_ansible' +'ansible-galaxy' '_ansible' +'ansible-inventory' '_ansible' +'ansible-playbook' '_ansible' +'ansible-pull' '_ansible' +'ansible-vault' '_ansible' +'ant' '_ant' +'antiword' '_antiword' +'aodh' '_openstack' +'aoss' '_precommand' +'apache2ctl' '_apachectl' +'apachectl' '_apachectl' +'aplay' '_alsa-utils' +'apm' '_apm' +'appletviewer' '_java' +'apropos' '_man' +'apvlv' '_pdf' +'arduino-ctags' '_ctags' +'arecord' '_alsa-utils' +'arena' '_webbrowser' +'_arguments' '__arguments' +'arp' '_arp' +'arping' '_arping' +'-array-value-' '_value' +'asciidoctor' '_asciidoctor' +'asciinema' '_asciinema' +'ash' '_sh' +'-assign-parameter-' '_assign' +'at' '_at' +'atq' '_at' +'atrm' '_at' +'attr' '_attr' +'augtool' '_augeas' +'autoload' '_typeset' +'avahi-browse' '_avahi' +'avahi-browse-domains' '_avahi' +'avahi-resolve' '_avahi' +'avahi-resolve-address' '_avahi' +'avahi-resolve-host-name' '_avahi' +'awk' '_awk' +'b2sum' '_md5sum' +'barbican' '_openstack' +'base32' '_base64' +'base64' '_base64' +'basename' '_basename' +'basenc' '_basenc' +'bash' '_bash' +'bat' '_bat' +'batch' '_at' +'baz' '_baz' +'beep' '_beep' +'bg' '_jobs_bg' +'bibtex' '_bibtex' +'bindkey' '_bindkey' +'bison' '_bison' +'bmake' '_make' +'bogofilter' '_bogofilter' +'bogotune' '_bogofilter' +'bogoutil' '_bogofilter' +'bpython' '_bpython' +'bpython2' '_bpython' +'bpython2-gtk' '_bpython' +'bpython2-urwid' '_bpython' +'bpython3' '_bpython' +'bpython3-gtk' '_bpython' +'bpython3-urwid' '_bpython' +'bpython-gtk' '_bpython' +'bpython-urwid' '_bpython' +'-brace-parameter-' '_brace_parameter' +'brctl' '_brctl' +'bsdgrep' '_grep' +'bsdtar' '_tar' +'btdownloadcurses' '_bittorrent' +'btdownloadgui' '_bittorrent' +'btdownloadheadless' '_bittorrent' +'btlaunchmany' '_bittorrent' +'btlaunchmanycurses' '_bittorrent' +'btmakemetafile' '_bittorrent' +'btreannounce' '_bittorrent' +'btrename' '_bittorrent' +'btrfs' '_btrfs' +'btshowmetainfo' '_bittorrent' +'bttrack' '_bittorrent' +'buildhash' '_ispell' +'builtin' '_builtin' +'bunzip2' '_bzip2' +'burst' '_mh' +'_bw' '_bw' +'bw' '_bw' +'bwrap' '_bwrap' +'bzcat' '_bzip2' +'bzegrep' '_grep' +'bzfgrep' '_grep' +'bzgrep' '_grep' +'bzip2' '_bzip2' +'bzip2recover' '_bzip2' +'bzr' '_bzr' +'c++' '_gcc' +'cabal' '_cabal' +'cal' '_cal' +'calendar' '_calendar' +'cargo' '_cargo' +'cat' '_cat' +'catchsegv' '_precommand' +'cc' '_gcc' +'ccal' '_ccal' +'cd' '_cd' +'cdc' '_sccs' +'cdcd' '_cdcd' +'cdr' '_cdr' +'cdrdao' '_cdrdao' +'cdrecord' '_cdrecord' +'ceilometer' '_openstack' +'certtool' '_gnutls' +'cftp' '_twisted' +'chage' '_users' +'chattr' '_chattr' +'chcon' '_chcon' +'chdir' '_cd' +'chfn' '_users' +'chg' '_hg' +'chgrp' '_chown' +'chimera' '_webbrowser' +'chkconfig' '_chkconfig' +'chkstow' '_stow' +'chmod' '_chmod' +'choom' '_choom' +'chown' '_chown' +'chpass' '_chsh' +'chroot' '_chroot' +'chrt' '_chrt' +'chsh' '_chsh' +'ci' '_rcs' +'cifsiostat' '_sysstat' +'cinder' '_openstack' +'ckeygen' '_twisted' +'cksum' '_cksum' +'clang' '_gcc' +'clang++' '_gcc' +'clay' '_clay' +'clear' '_nothing' +'cloudkitty' '_openstack' +'clusterdb' '_postgresql' +'cmp' '_cmp' +'co' '_rcs' +'code' '_code' +'codium' '_codium' +'column' '_column' +'comb' '_sccs' +'combine' '_imagemagick' +'combinediff' '_patchutils' +'comm' '_comm' +'-command-' '_autocd' +'command' '_command' +'-command-line-' '_normal' +'comp' '_mh' +'compadd' '_compadd' +'compdef' '_compdef' +'composer' '_composer' +'composer.phar' '_composer' +'composite' '_imagemagick' +'compress' '_compress' +'conch' '_twisted' +'-condition-' '_condition' +'config.status' '_configure' +'configure' '_configure' +'convert' '_imagemagick' +'cowsay' '_cowsay' +'cowthink' '_cowsay' +'cp' '_cp' +'cpio' '_cpio' +'cplay' '_cplay' +'cpupower' '_cpupower' +'createdb' '_postgresql' +'createuser' '_postgresql' +'crontab' '_crontab' +'crsh' '_cssh' +'cryptsetup' '_cryptsetup' +'cscope' '_cscope' +'csh' '_sh' +'csplit' '_csplit' +'cssh' '_cssh' +'ctags' '_ctags' +'ctags-exuberant' '_ctags' +'ctags-universal' '_ctags' +'curl' '_curl' +'cut' '_cut' +'cvs' '_cvs' +'darcs' '_darcs' +'dash' '_sh' +'date' '_date' +'dbus-launch' '_dbus' +'dbus-monitor' '_dbus' +'dbus-send' '_dbus' +'dconf' '_dconf' +'dcop' '_dcop' +'dcopclient' '_dcop' +'dcopfind' '_dcop' +'dcopobject' '_dcop' +'dcopref' '_dcop' +'dcopstart' '_dcop' +'dd' '_dd' +'declare' '_typeset' +'-default-' '_default' +'delta' '_sccs' +'designate' '_openstack' +'devtodo' '_devtodo' +'df' '_df' +'dhclient' '_dhclient' +'dhclient3' '_dhclient' +'dict' '_dict' +'diff' '_diff' +'diff3' '_diff3' +'diffstat' '_diffstat' +'dig' '_dig' +'dillo' '_webbrowser' +'dircmp' '_directories' +'dirs' '_dirs' +'disable' '_disable' +'disown' '_jobs_fg' +'display' '_imagemagick' +'dist' '_mh' +'django-admin' '_django' +'django-admin.py' '_django' +'dkms' '_dkms' +'dmake' '_make' +'dmesg' '_dmesg' +'dmidecode' '_dmidecode' +'doas' '_doas' +'domainname' '_yp' +'dos2unix' '_dos2unix' +'drill' '_drill' +'dropbox' '_dropbox' +'dropdb' '_postgresql' +'dropuser' '_postgresql' +'dsh' '_dsh' +'dtruss' '_dtruss' +'du' '_du' +'dvibook' '_dvi' +'dviconcat' '_dvi' +'dvicopy' '_dvi' +'dvidvi' '_dvi' +'dvipdf' '_dvi' +'dvips' '_dvi' +'dviselect' '_dvi' +'dvitodvi' '_dvi' +'dvitype' '_dvi' +'dwb' '_webbrowser' +'e2label' '_e2label' +'eatmydata' '_precommand' +'ecasound' '_ecasound' +'echotc' '_echotc' +'echoti' '_echoti' +'ed' '_ed' +'egrep' '_grep' +'elfdump' '_elfdump' +'elinks' '_elinks' +'emulate' '_emulate' +'enable' '_enable' +'enscript' '_enscript' +'entr' '_entr' +'env' '_env' +'eog' '_eog' +'epdfview' '_pdf' +'epsffit' '_psutils' +'-equal-' '_equal' +'erb' '_ruby' +'espeak' '_espeak' +'etags' '_etags' +'ethtool' '_ethtool' +'eu-nm' '_nm' +'eu-objdump' '_objdump' +'eu-readelf' '_readelf' +'eu-strings' '_strings' +'eval' '_precommand' +'eview' '_vim' +'evim' '_vim' +'evince' '_evince' +'ex' '_vi' +'exec' '_exec' +'exercism' '_exercism' +'expand' '_unexpand' +'export' '_typeset' +'express' '_webbrowser' +'extcheck' '_java' +'extractres' '_psutils' +'fakeroot' '_fakeroot' +'false' '_nothing' +'fc' '_fc' +'fc-list' '_xft_fonts' +'fc-match' '_xft_fonts' +'feh' '_feh' +'fetchmail' '_fetchmail' +'ffmpeg' '_ffmpeg' +'fg' '_jobs_fg' +'fgrep' '_grep' +'figlet' '_figlet' +'filterdiff' '_patchutils' +'find' '_find' +'findaffix' '_ispell' +'findmnt' '_findmnt' +'finger' '_finger' +'firefox' '_mozilla' +'-first-' '_first' +'fixdlsrps' '_psutils' +'fixfmps' '_psutils' +'fixmacps' '_psutils' +'fixpsditps' '_psutils' +'fixpspps' '_psutils' +'fixscribeps' '_psutils' +'fixtpps' '_psutils' +'fixwfwps' '_psutils' +'fixwpps' '_psutils' +'fixwwps' '_psutils' +'flac' '_flac' +'flex' '_flex' +'flex++' '_flex' +'flipdiff' '_patchutils' +'flist' '_mh' +'flists' '_mh' +'float' '_typeset' +'fmt' '_fmt' +'fmttest' '_mh' +'fned' '_zed' +'fnext' '_mh' +'fold' '_fold' +'folder' '_mh' +'folders' '_mh' +'fortune' '_fortune' +'forw' '_mh' +'fprev' '_mh' +'free' '_free' +'freebsd-make' '_make' +'freezer' '_openstack' +'fsh' '_fsh' +'ftp' '_hosts' +'functions' '_typeset' +'fuser' '_fuser' +'fusermount' '_fusermount' +'fwhois' '_whois' +'g++' '_gcc' +'galeon' '_webbrowser' +'gawk' '_awk' +'gb2sum' '_md5sum' +'gbase32' '_base64' +'gbase64' '_base64' +'gbasename' '_basename' +'gcat' '_cat' +'gcc' '_gcc' +'gccgo' '_go' +'gchgrp' '_chown' +'gchmod' '_chmod' +'gchown' '_chown' +'gchroot' '_chroot' +'gcksum' '_cksum' +'gcmp' '_cmp' +'gcomm' '_comm' +'gcore' '_gcore' +'gcp' '_cp' +'gcut' '_cut' +'gdate' '_date' +'gdb' '_gdb' +'gdd' '_dd' +'gdf' '_df' +'gdiff' '_diff' +'gdu' '_du' +'geany' '_geany' +'gegrep' '_grep' +'gem' '_gem' +'genisoimage' '_genisoimage' +'genv' '_env' +'get' '_sccs' +'getafm' '_psutils' +'getconf' '_getconf' +'getent' '_getent' +'getfacl' '_getfacl' +'getfacl.exe' '_getfacl' +'getfattr' '_attr' +'getmail' '_getmail' +'getopt' '_getopt' +'getopts' '_vars' +'gex' '_vim' +'gexpand' '_unexpand' +'gfgrep' '_grep' +'gfind' '_find' +'gfmt' '_fmt' +'gfold' '_fold' +'ggetopt' '_getopt' +'ggrep' '_grep' +'ggv' '_gnome-gv' +'ghead' '_head' +'ghostscript' '_ghostscript' +'ghostview' '_pspdf' +'gid' '_id' +'ginstall' '_install' +'git' '_git' +'git-cvsserver' '_git' +'gitk' '_git' +'git-receive-pack' '_git' +'git-shell' '_git' +'git-upload-archive' '_git' +'git-upload-pack' '_git' +'gjoin' '_join' +'glance' '_openstack' +'gln' '_ln' +'global' '_global' +'glocate' '_locate' +'gls' '_ls' +'gm' '_graphicsmagick' +'gmake' '_make' +'gmd5sum' '_md5sum' +'gmkdir' '_mkdir' +'gmkfifo' '_mkfifo' +'gmknod' '_mknod' +'gmktemp' '_mktemp' +'gmplayer' '_mplayer' +'gmv' '_mv' +'gnl' '_nl' +'gnocchi' '_openstack' +'gnome-gv' '_gnome-gv' +'gnumfmt' '_numfmt' +'gnupod_addsong' '_gnupod' +'gnupod_addsong.pl' '_gnupod' +'gnupod_check' '_gnupod' +'gnupod_check.pl' '_gnupod' +'gnupod_INIT' '_gnupod' +'gnupod_INIT.pl' '_gnupod' +'gnupod_search' '_gnupod' +'gnupod_search.pl' '_gnupod' +'gnutls-cli' '_gnutls' +'gnutls-cli-debug' '_gnutls' +'gnutls-serv' '_gnutls' +'god' '_od' +'gofmt' '_go' +'gpasswd' '_gpasswd' +'gpaste' '_paste' +'gpatch' '_patch' +'gpg' '_gpg' +'gpg2' '_gpg' +'gpgv' '_gpg' +'gpg-zip' '_gpg' +'gphoto2' '_gphoto2' +'gprintenv' '_printenv' +'gprof' '_gprof' +'gqview' '_gqview' +'gradle' '_gradle' +'gradlew' '_gradle' +'grail' '_webbrowser' +'greadlink' '_readlink' +'grep' '_grep' +'grepdiff' '_patchutils' +'grm' '_rm' +'grmdir' '_rmdir' +'groff' '_groff' +'groupadd' '_user_admin' +'groupdel' '_groups' +'groupmod' '_user_admin' +'groups' '_users' +'growisofs' '_growisofs' +'gs' '_ghostscript' +'gsbj' '_pspdf' +'gsdj' '_pspdf' +'gsdj500' '_pspdf' +'gsed' '_sed' +'gseq' '_seq' +'gsettings' '_gsettings' +'gsha1sum' '_md5sum' +'gsha224sum' '_md5sum' +'gsha256sum' '_md5sum' +'gsha384sum' '_md5sum' +'gsha512sum' '_md5sum' +'gshred' '_shred' +'gshuf' '_shuf' +'gslj' '_pspdf' +'gslp' '_pspdf' +'gsnd' '_pspdf' +'gsort' '_sort' +'gsplit' '_split' +'gstat' '_stat' +'gstdbuf' '_stdbuf' +'gstrings' '_strings' +'gstty' '_stty' +'gsum' '_cksum' +'gtac' '_tac' +'gtail' '_tail' +'gtar' '_tar' +'gtee' '_tee' +'gtimeout' '_timeout' +'gtouch' '_touch' +'gtr' '_tr' +'gtty' '_tty' +'guilt' '_guilt' +'guilt-add' '_guilt' +'guilt-applied' '_guilt' +'guilt-delete' '_guilt' +'guilt-files' '_guilt' +'guilt-fold' '_guilt' +'guilt-fork' '_guilt' +'guilt-header' '_guilt' +'guilt-help' '_guilt' +'guilt-import' '_guilt' +'guilt-import-commit' '_guilt' +'guilt-init' '_guilt' +'guilt-new' '_guilt' +'guilt-next' '_guilt' +'guilt-patchbomb' '_guilt' +'guilt-pop' '_guilt' +'guilt-prev' '_guilt' +'guilt-push' '_guilt' +'guilt-rebase' '_guilt' +'guilt-refresh' '_guilt' +'guilt-rm' '_guilt' +'guilt-series' '_guilt' +'guilt-status' '_guilt' +'guilt-top' '_guilt' +'guilt-unapplied' '_guilt' +'guname' '_uname' +'gunexpand' '_unexpand' +'guniq' '_uniq' +'gunzip' '_gzip' +'guptime' '_uptime' +'gv' '_gv' +'gview' '_vim' +'gvim' '_vim' +'gvimdiff' '_vim' +'gwc' '_wc' +'gwho' '_who' +'gxargs' '_xargs' +'gzcat' '_gzip' +'gzegrep' '_grep' +'gzfgrep' '_grep' +'gzgrep' '_grep' +'gzilla' '_webbrowser' +'gzip' '_gzip' +'hash' '_hash' +'hd' '_hexdump' +'head' '_head' +'heat' '_openstack' +'help' '_sccs' +'hexdump' '_hexdump' +'hg' '_hg' +'hilite' '_precommand' +'histed' '_zed' +'history' '_fc' +'host' '_host' +'hostname' '_hostname' +'hotjava' '_webbrowser' +'htop' '_htop' +'hugo' '_hugo' +'iceweasel' '_mozilla' +'icombine' '_ispell' +'iconv' '_iconv' +'iconvconfig' '_iconvconfig' +'id' '_id' +'identify' '_imagemagick' +'ifconfig' '_ifconfig' +'ifdown' '_net_interfaces' +'iftop' '_iftop' +'ifup' '_net_interfaces' +'ijoin' '_ispell' +'import' '_imagemagick' +'inc' '_mh' +'includeres' '_psutils' +'info' '_texinfo' +'infocmp' '_terminals' +'initctl' '_initctl' +'initdb' '_postgresql' +'insmod' '_modutils' +'install' '_install' +'install-info' '_texinfo' +'integer' '_typeset' +'interdiff' '_patchutils' +'ionice' '_ionice' +'iostat' '_iostat' +'ip' '_ip' +'ip6tables' '_iptables' +'ip6tables-restore' '_iptables' +'ip6tables-save' '_iptables' +'ipkg' '_opkg' +'ipsec' '_ipsec' +'ipset' '_ipset' +'iptables' '_iptables' +'iptables-restore' '_iptables' +'iptables-save' '_iptables' +'irb' '_ruby' +'ironic' '_openstack' +'irssi' '_irssi' +'isag' '_sysstat' +'ispell' '_ispell' +'iwconfig' '_iwconfig' +'jadetex' '_tex' +'jar' '_java' +'jarsigner' '_java' +'java' '_java' +'javac' '_java' +'javadoc' '_java' +'javah' '_java' +'javap' '_java' +'jdb' '_java' +'jobs' '_jobs_builtin' +'joe' '_joe' +'john' '_john' +'join' '_join' +'jq' '_jq' +'kdeconnect-cli' '_kdeconnect' +'keystone' '_openstack' +'keytool' '_java' +'kfmclient' '_kfmclient' +'kill' '_kill' +'killall' '_killall' +'killall5' '_killall' +'kioclient' '_kfmclient' +'knock' '_knock' +'konqueror' '_webbrowser' +'kpartx' '_kpartx' +'kpdf' '_pdf' +'ksh' '_sh' +'ksh88' '_sh' +'ksh93' '_sh' +'kvno' '_kvno' +'last' '_last' +'lastb' '_last' +'latex' '_tex' +'latexmk' '_tex' +'ldconfig' '_ldconfig' +'ldconfig.real' '_ldconfig' +'ldd' '_ldd' +'less' '_less' +'let' '_math' +'lftp' '_ncftp' +'lha' '_lha' +'libinput' '_libinput' +'light' '_webbrowser' +'limit' '_limit' +'links' '_links' +'links2' '_links' +'linux' '_uml' +'lldb' '_lldb' +'llvm-g++' '_gcc' +'llvm-gcc' '_gcc' +'llvm-objdump' '_objdump' +'ln' '_ln' +'loadkeys' '_loadkeys' +'local' '_typeset' +'locale' '_locale' +'localedef' '_localedef' +'locate' '_locate' +'log' '_nothing' +'logger' '_logger' +'loginctl' '_loginctl' +'logname' '_nothing' +'look' '_look' +'losetup' '_losetup' +'lp' '_lp' +'lpadmin' '_lp' +'lpinfo' '_lp' +'lpoptions' '_lp' +'lpq' '_lp' +'lpr' '_lp' +'lprm' '_lp' +'lpstat' '_lp' +'ls' '_ls' +'lsattr' '_lsattr' +'lsblk' '_lsblk' +'lsdiff' '_patchutils' +'lsinitcpio' '_mkinitcpio' +'lsmod' '_modutils' +'lsns' '_lsns' +'lsof' '_lsof' +'lsusb' '_lsusb' +'ltrace' '_ltrace' +'lua' '_lua' +'luarocks' '_luarocks' +'lynx' '_lynx' +'lz4' '_lz4' +'lz4c' '_lz4' +'lz4c32' '_lz4' +'lz4cat' '_lz4' +'lzcat' '_xz' +'lzma' '_xz' +'lzop' '_lzop' +'mac2unix' '_dos2unix' +'magnum' '_openstack' +'mail' '_mail' +'Mail' '_mail' +'mailx' '_mail' +'make' '_make' +'makeinfo' '_texinfo' +'makepkg' '_pacman' +'man' '_man' +'manage.py' '_django' +'manila' '_openstack' +'mark' '_mh' +'mat' '_mat' +'mat2' '_mat2' +'-math-' '_math' +'matlab' '_matlab' +'mattrib' '_mtools' +'mcd' '_mtools' +'mcopy' '_mtools' +'md2' '_cksum' +'md4' '_cksum' +'md5' '_cksum' +'md5sum' '_md5sum' +'mdadm' '_mdadm' +'mdel' '_mtools' +'mdeltree' '_mtools' +'mdir' '_mtools' +'mdu' '_mtools' +'mencal' '_mencal' +'mere' '_mere' +'merge' '_rcs' +'meson' '_meson' +'metaflac' '_flac' +'mformat' '_mtools' +'mgv' '_pspdf' +'mhfixmsg' '_mh' +'mhlist' '_mh' +'mhmail' '_mh' +'mhn' '_mh' +'mhparam' '_mh' +'mhpath' '_mh' +'mhshow' '_mh' +'mhstore' '_mh' +'mii-tool' '_mii-tool' +'mistral' '_openstack' +'mkdir' '_mkdir' +'mkfifo' '_mkfifo' +'mkinitcpio' '_mkinitcpio' +'mkisofs' '_growisofs' +'mknod' '_mknod' +'mksh' '_sh' +'mktemp' '_mktemp' +'mktunes' '_gnupod' +'mktunes.pl' '_gnupod' +'mlabel' '_mtools' +'mlocate' '_locate' +'mmd' '_mtools' +'mmm' '_webbrowser' +'mmount' '_mtools' +'mmove' '_mtools' +'modinfo' '_modutils' +'modprobe' '_modutils' +'module' '_module' +'mogrify' '_imagemagick' +'monasca' '_openstack' +'mondoarchive' '_mondo' +'montage' '_imagemagick' +'moosic' '_moosic' +'Mosaic' '_webbrowser' +'mosh' '_mosh' +'mount' '_mount' +'mozilla' '_mozilla' +'mozilla-firefox' '_mozilla' +'mozilla-xremote-client' '_mozilla' +'mpc' '_mpc' +'mplayer' '_mplayer' +'mpstat' '_sysstat' +'mpv' '_mpv' +'mr' '_myrepos' +'mrd' '_mtools' +'mread' '_mtools' +'mren' '_mtools' +'msgchk' '_mh' +'mt' '_mt' +'mtn' '_monotone' +'mtoolstest' '_mtools' +'mtr' '_mtr' +'mtype' '_mtools' +'munchlist' '_ispell' +'mupdf' '_mupdf' +'murano' '_openstack' +'mush' '_mail' +'mutt' '_mutt' +'mv' '_mv' +'mvim' '_vim' +'mx' '_hosts' +'mysql' '_mysql_utils' +'mysqladmin' '_mysql_utils' +'mysqldiff' '_mysqldiff' +'mysqldump' '_mysql_utils' +'mysqlimport' '_mysql_utils' +'mysqlshow' '_mysql_utils' +'nail' '_mail' +'native2ascii' '_java' +'nautilus' '_nautilus' +'nawk' '_awk' +'nc' '_netcat' +'ncal' '_cal' +'ncftp' '_ncftp' +'ncl' '_nedit' +'nedit' '_nedit' +'nedit-nc' '_nedit' +'netcat' '_netcat' +'netrik' '_webbrowser' +'netscape' '_netscape' +'netstat' '_netstat' +'neutron' '_openstack' +'new' '_mh' +'newgrp' '_groups' +'next' '_mh' +'nginx' '_nginx' +'ngrep' '_ngrep' +'nice' '_nice' +'ninja' '_ninja' +'nkf' '_nkf' +'nl' '_nl' +'nm' '_nm' +'nmap' '_nmap' +'nmblookup' '_samba' +'nmcli' '_networkmanager' +'nocorrect' '_precommand' +'noglob' '_precommand' +'nohup' '_precommand' +'notmuch' '_notmuch' +'nova' '_openstack' +'npm' '_npm' +'ns' '_hosts' +'nsenter' '_nsenter' +'nslookup' '_nslookup' +'ntalk' '_other_accounts' +'numfmt' '_numfmt' +'nvim' '_vim' +'objdump' '_objdump' +'od' '_od' +'ogg123' '_vorbis' +'oggdec' '_vorbis' +'oggenc' '_vorbis' +'ogginfo' '_vorbis' +'oksh' '_sh' +'okular' '_okular' +'openstack' '_openstack' +'opera' '_webbrowser' +'opera-next' '_webbrowser' +'opkg' '_opkg' +'opusdec' '_opustools' +'opusenc' '_opustools' +'opusinfo' '_opustools' +'p4' '_perforce' +'p4d' '_perforce' +'pacat' '_pulseaudio' +'pack' '_pack' +'packf' '_mh' +'pacman' '_pacman' +'pacman-conf' '_pacman' +'pacman-key' '_pacman' +'pacman.static' '_pacman' +'pacmd' '_pulseaudio' +'pactl' '_pulseaudio' +'padsp' '_pulseaudio' +'pandoc' '_pandoc' +'paplay' '_pulseaudio' +'-parameter-' '_parameter' +'parec' '_pulseaudio' +'parecord' '_pulseaudio' +'pass' '_pass' +'passwd' '_users' +'paste' '_paste' +'pasuspender' '_pulseaudio' +'patch' '_patch' +'pax' '_pax' +'pcat' '_pack' +'pcp-htop' '_htop' +'pcred' '_pids' +'pdf2dsc' '_pdf' +'pdf2ps' '_pdf' +'pdffonts' '_pdf' +'pdfimages' '_pdf' +'pdfinfo' '_pdf' +'pdfjadetex' '_tex' +'pdflatex' '_tex' +'pdfopt' '_pdf' +'pdftex' '_tex' +'pdftexi2dvi' '_texinfo' +'pdftk' '_pdftk' +'pdftopbm' '_pdf' +'pdftops' '_pdf' +'pdftotext' '_pdf' +'pdksh' '_sh' +'perf' '_perf' +'perl' '_perl' +'perldoc' '_perldoc' +'pfiles' '_pids' +'pflags' '_pids' +'pg_config' '_postgresql' +'pg_ctl' '_postgresql' +'pg_dump' '_postgresql' +'pg_dumpall' '_postgresql' +'pg_isready' '_postgresql' +'pgrep' '_pgrep' +'pg_restore' '_postgresql' +'pg_upgrade' '_postgresql' +'php' '_php' +'pick' '_mh' +'picocom' '_picocom' +'pidof' '_pidof' +'pidstat' '_sysstat' +'pigz' '_gzip' +'pine' '_pine' +'pinef' '_pine' +'pinfo' '_texinfo' +'ping' '_ping' +'ping6' '_ping' +'pkgadd' '_pkgadd' +'pkg-config' '_pkg-config' +'pkginfo' '_pkginfo' +'pkgrm' '_pkgrm' +'pkill' '_pgrep' +'pldd' '_pids' +'pmake' '_make' +'pman' '_perl_modules' +'pmap' '_pmap' +'pmcat' '_perl_modules' +'pmdesc' '_perl_modules' +'pmeth' '_perl_modules' +'pmexp' '_perl_modules' +'pmfunc' '_perl_modules' +'pmload' '_perl_modules' +'pmls' '_perl_modules' +'pmpath' '_perl_modules' +'pmvers' '_perl_modules' +'podgrep' '_perl_modules' +'podpath' '_perl_modules' +'podtoc' '_perl_modules' +'poff' '_pon' +'policytool' '_java' +'pon' '_pon' +'popd' '_directory_stack' +'postconf' '_postfix' +'postgres' '_postgresql' +'postmaster' '_postgresql' +'postqueue' '_postfix' +'postsuper' '_postfix' +'pr' '_pr' +'prev' '_mh' +'print' '_print' +'printenv' '_printenv' +'printf' '_print' +'prompt' '_prompt' +'prove' '_prove' +'prs' '_sccs' +'prt' '_sccs' +'prun' '_pids' +'ps' '_ps' +'ps2ascii' '_pspdf' +'ps2epsi' '_postscript' +'ps2pdf' '_postscript' +'ps2pdf12' '_postscript' +'ps2pdf13' '_postscript' +'ps2pdf14' '_postscript' +'ps2pdfwr' '_postscript' +'ps2ps' '_postscript' +'psbook' '_psutils' +'psed' '_sed' +'psig' '_pids' +'psmerge' '_psutils' +'psmulti' '_postscript' +'psnup' '_psutils' +'psql' '_postgresql' +'psresize' '_psutils' +'psselect' '_psutils' +'pstack' '_pids' +'pstoedit' '_pspdf' +'pstop' '_pids' +'pstops' '_psutils' +'pstotgif' '_pspdf' +'pswrap' '_postscript' +'ptx' '_ptx' +'pulseaudio' '_pulseaudio' +'pump' '_pump' +'pushd' '_cd' +'pv' '_pv' +'pwait' '_pids' +'pwdx' '_pids' +'pwgen' '_pwgen' +'pyhtmlizer' '_twisted' +'qdbus' '_qdbus' +'qiv' '_qiv' +'quilt' '_quilt' +'r' '_fc' +'rage' '_rage' +'rage-keygen' '_rage-keygen' +'rage-mount' '_rage-mount' +'rake' '_rake' +'ranlib' '_ranlib' +'rar' '_rar' +'rc' '_sh' +'rclone' '_rclone' +'rcp' '_rlogin' +'rcs' '_rcs' +'rcsdiff' '_rcs' +'rdesktop' '_rdesktop' +'read' '_read' +'readelf' '_readelf' +'readlink' '_readlink' +'readonly' '_typeset' +'-redirect-' '_redirect' +'-redirect-,<,bunzip2' '_bzip2' +'-redirect-,<,bzip2' '_bzip2' +'-redirect-,>,bzip2' '_bzip2' +'-redirect-,<,compress' '_compress' +'-redirect-,>,compress' '_compress' +'-redirect-,-default-,-default-' '_files' +'-redirect-,<,gunzip' '_gzip' +'-redirect-,<,gzip' '_gzip' +'-redirect-,>,gzip' '_gzip' +'-redirect-,<,uncompress' '_compress' +'-redirect-,<,unxz' '_xz' +'-redirect-,<,xz' '_xz' +'-redirect-,>,xz' '_xz' +'refile' '_mh' +'rehash' '_hash' +'reindexdb' '_postgresql' +'reload' '_initctl' +'remsh' '_rlogin' +'renice' '_renice' +'repl' '_mh' +'restart' '_initctl' +'retawq' '_webbrowser' +'rgrep' '_grep' +'rgview' '_vim' +'rgvim' '_vim' +'ri' '_ri' +'rlogin' '_rlogin' +'rm' '_rm' +'rmd160' '_cksum' +'rmdel' '_sccs' +'rmdir' '_rmdir' +'rmf' '_mh' +'rmic' '_java' +'rmid' '_java' +'rmiregistry' '_java' +'rmm' '_mh' +'rmmod' '_modutils' +'route' '_route' +'rrdtool' '_rrdtool' +'rsh' '_rlogin' +'rsync' '_rsync' +'rtin' '_tin' +'rubber' '_rubber' +'rubber-info' '_rubber' +'rubber-pipe' '_rubber' +'ruby' '_ruby' +'ruby-mri' '_ruby' +'run-help' '_run-help' +'rup' '_hosts' +'rusage' '_precommand' +'rview' '_vim' +'rvim' '_vim' +'rwho' '_hosts' +'rxvt' '_urxvt' +'s2p' '_sed' +'sact' '_sccs' +'sadf' '_sysstat' +'sahara' '_openstack' +'sar' '_sysstat' +'scan' '_mh' +'sccs' '_sccs' +'sccsdiff' '_sccs' +'sched' '_sched' +'schedtool' '_schedtool' +'scons' '_scons' +'scp' '_ssh' +'screen' '_screen' +'script' '_script' +'scriptreplay' '_script' +'seaf-cli' '_seafile' +'sed' '_sed' +'senlin' '_openstack' +'seq' '_seq' +'serialver' '_java' +'service' '_service' +'set' '_set' +'setfacl' '_setfacl' +'setfacl.exe' '_setfacl' +'setfattr' '_attr' +'setopt' '_setopt' +'setpriv' '_setpriv' +'setsid' '_setsid' +'setxkbmap' '_setxkbmap' +'sftp' '_ssh' +'sh' '_sh' +'sha1' '_cksum' +'sha1sum' '_md5sum' +'sha224sum' '_md5sum' +'sha256' '_cksum' +'sha256sum' '_md5sum' +'sha384' '_cksum' +'sha384sum' '_md5sum' +'sha512' '_cksum' +'sha512sum' '_md5sum' +'sha512t256' '_cksum' +'shasum' '_shasum' +'shell-script' '_loginctl' +'shift' '_arrays' +'show' '_mh' +'showchar' '_psutils' +'showmount' '_showmount' +'shred' '_shred' +'shuf' '_shuf' +'shutdown' '_shutdown' +'sisu' '_sisu' +'skein1024' '_cksum' +'skein256' '_cksum' +'skein512' '_cksum' +'skipstone' '_webbrowser' +'slabtop' '_slabtop' +'slitex' '_tex' +'slocate' '_locate' +'slogin' '_ssh' +'slrn' '_slrn' +'smartctl' '_smartmontools' +'smbclient' '_samba' +'smbcontrol' '_samba' +'smbstatus' '_samba' +'soa' '_hosts' +'socket' '_socket' +'sort' '_sort' +'sortm' '_mh' +'source' '_source' +'spamassassin' '_spamassassin' +'split' '_split' +'splitdiff' '_patchutils' +'sqlite' '_sqlite' +'sqlite3' '_sqlite' +'sqsh' '_sqsh' +'sr' '_surfraw' +'srptool' '_gnutls' +'ss' '_ss' +'ssh' '_ssh' +'ssh-add' '_ssh' +'ssh-agent' '_ssh' +'ssh-copy-id' '_ssh' +'sshfs' '_sshfs' +'ssh-keygen' '_ssh' +'ssh-keyscan' '_ssh' +'star' '_tar' +'start' '_initctl' +'stat' '_stat' +'status' '_initctl' +'stdbuf' '_stdbuf' +'stg' '_stgit' +'stop' '_initctl' +'stow' '_stow' +'strace' '_strace' +'strace64' '_strace' +'strftime' '_strftime' +'strings' '_strings' +'strip' '_strip' +'strongswan' '_ipsec' +'stty' '_stty' +'su' '_su' +'subl' '_sublimetext' +'-subscript-' '_subscript' +'sudo' '_sudo' +'sudoedit' '_sudo' +'sum' '_cksum' +'surfraw' '_surfraw' +'sv' '_runit' +'svn' '_subversion' +'svnadmin' '_subversion' +'svnadmin-static' '_subversion' +'svnlite' '_subversion' +'svnliteadmin' '_subversion' +'swaks' '_swaks' +'swanctl' '_swanctl' +'swift' '_swift' +'swiftc' '_swift' +'sync' '_nothing' +'sysctl' '_sysctl' +'tac' '_tac' +'tacker' '_openstack' +'tail' '_tail' +'talk' '_other_accounts' +'tar' '_tar' +'tardy' '_tardy' +'tcpdump' '_tcpdump' +'tcp_open' '_tcpsys' +'tcptraceroute' '_tcptraceroute' +'tcsh' '_sh' +'tda' '_devtodo' +'tdd' '_devtodo' +'tde' '_devtodo' +'tdr' '_devtodo' +'tee' '_tee' +'telnet' '_telnet' +'tex' '_tex' +'texi2any' '_texinfo' +'texi2dvi' '_texinfo' +'texi2pdf' '_texinfo' +'texindex' '_texinfo' +'tg' '_topgit' +'tidy' '_tidy' +'tig' '_git' +'-tilde-' '_tilde' +'time' '_precommand' +'timeout' '_timeout' +'times' '_nothing' +'tin' '_tin' +'tkconch' '_twisted' +'tkinfo' '_texinfo' +'tla' '_tla' +'tload' '_tload' +'tmux' '_tmux' +'todo' '_devtodo' +'todo.sh' '_todo.sh' +'toilet' '_toilet' +'top' '_top' +'totdconfig' '_totd' +'touch' '_touch' +'tpb' '_tpb' +'tput' '_tput' +'tr' '_tr' +'tracepath' '_tracepath' +'tracepath6' '_tracepath' +'traceroute' '_hosts' +'transmission-remote' '_transmission' +'trap' '_trap' +'tree' '_tree' +'trial' '_twisted' +'trove' '_openstack' +'true' '_nothing' +'truncate' '_truncate' +'truss' '_truss' +'tryaffix' '_ispell' +'tty' '_tty' +'ttyctl' '_ttyctl' +'tunctl' '_uml' +'tune2fs' '_tune2fs' +'tunes2pod' '_gnupod' +'tunes2pod.pl' '_gnupod' +'twidge' '_twidge' +'twist' '_twisted' +'twistd' '_twisted' +'txt' '_hosts' +'type' '_which' +'typeset' '_typeset' +'ulimit' '_ulimit' +'uml_mconsole' '_uml' +'uml_moo' '_uml' +'uml_switch' '_uml' +'umount' '_mount' +'unace' '_unace' +'unalias' '_aliases' +'uname' '_uname' +'uncompress' '_compress' +'unexpand' '_unexpand' +'unfunction' '_functions' +'unget' '_sccs' +'unhash' '_unhash' +'uniq' '_uniq' +'unison' '_unison' +'units' '_units' +'unix2dos' '_dos2unix' +'unix2mac' '_dos2unix' +'unlimit' '_limits' +'unlz4' '_lz4' +'unlzma' '_xz' +'unpack' '_pack' +'unpigz' '_gzip' +'unrar' '_rar' +'unset' '_vars' +'unsetopt' '_setopt' +'unshare' '_unshare' +'unwrapdiff' '_patchutils' +'unxz' '_xz' +'unzip' '_zip' +'uptime' '_uptime' +'urxvt' '_urxvt' +'urxvt256c' '_urxvt' +'urxvt256cc' '_urxvt' +'urxvt256c-ml' '_urxvt' +'urxvt256c-mlc' '_urxvt' +'urxvtc' '_urxvt' +'useradd' '_user_admin' +'userdel' '_users' +'usermod' '_user_admin' +'vacuumdb' '_postgresql' +'val' '_sccs' +'valgrind' '_valgrind' +'-value-' '_value' +'-value-,ADB_TRACE,-default-' '_adb' +'-value-,ANDROID_LOG_TAGS,-default-' '_adb' +'-value-,ANDROID_SERIAL,-default-' '_adb' +'-value-,ANSIBLE_INVENTORY_ENABLED,-default-' '_ansible' +'-value-,ANSIBLE_STDOUT_CALLBACK,-default-' '_ansible' +'-value-,ANT_ARGS,-default-' '_ant' +'-value-,CFLAGS,-default-' '_gcc' +'-value-,CPPFLAGS,-default-' '_gcc' +'-value-,CXXFLAGS,-default-' '_gcc' +'-value-,-default-,-command-' '_zargs' +'-value-,-default-,-default-' '_value' +'-value-,DISPLAY,-default-' '_x_display' +'-value-,GREP_OPTIONS,-default-' '_grep' +'-value-,GZIP,-default-' '_gzip' +'-value-,LANG,-default-' '_locales' +'-value-,LANGUAGE,-default-' '_locales' +'-value-,LD_DEBUG,-default-' '_ld_debug' +'-value-,LDFLAGS,-default-' '_gcc' +'-value-,LESSCHARSET,-default-' '_less' +'-value-,LESS,-default-' '_less' +'-value-,LOOPDEV_DEBUG,-default-' '_losetup' +'-value-,LPDEST,-default-' '_printers' +'-value-,MPD_HOST,-default' '_mpc' +'-value-,P4CLIENT,-default-' '_perforce' +'-value-,P4MERGE,-default-' '_perforce' +'-value-,P4PORT,-default-' '_perforce' +'-value-,P4USER,-default-' '_perforce' +'-value-,PERLDOC,-default-' '_perldoc' +'-value-,PRINTER,-default-' '_printers' +'-value-,PROMPT2,-default-' '_ps1234' +'-value-,PROMPT3,-default-' '_ps1234' +'-value-,PROMPT4,-default-' '_ps1234' +'-value-,PROMPT,-default-' '_ps1234' +'-value-,PS1,-default-' '_ps1234' +'-value-,PS2,-default-' '_ps1234' +'-value-,PS3,-default-' '_ps1234' +'-value-,PS4,-default-' '_ps1234' +'-value-,RPROMPT2,-default-' '_ps1234' +'-value-,RPROMPT,-default-' '_ps1234' +'-value-,RPS1,-default-' '_ps1234' +'-value-,RPS2,-default-' '_ps1234' +'-value-,SPROMPT,-default-' '_ps1234' +'-value-,TERM,-default-' '_terminals' +'-value-,TERMINFO_DIRS,-default-' '_dir_list' +'-value-,TZ,-default-' '_time_zone' +'-value-,VALGRIND_OPTS,-default-' '_valgrind' +'-value-,WWW_HOME,-default-' '_urls' +'-value-,XML_CATALOG_FILES,-default-' '_xmlsoft' +'-value-,XZ_DEFAULTS,-default-' '_xz' +'-value-,XZ_OPT,-default-' '_xz' +'-vared-' '_in_vared' +'vared' '_vared' +'vcs_info_hookadd' '_vcs_info' +'vcs_info_hookdel' '_vcs_info' +'vi' '_vi' +'view' '_vi' +'vim' '_vim' +'vimdiff' '_vim' +'virsh' '_libvirt' +'virt-admin' '_libvirt' +'virt-host-validate' '_libvirt' +'virt-pki-validate' '_libvirt' +'virt-xml-validate' '_libvirt' +'visudo' '_visudo' +'vitrage' '_openstack' +'vmstat' '_vmstat' +'vncserver' '_vnc' +'vncviewer' '_vnc' +'vorbiscomment' '_vorbis' +'vpnc' '_vpnc' +'vpnc-connect' '_vpnc' +'vserver' '_vserver' +'w' '_w' +'w3m' '_w3m' +'wait' '_wait' +'watch' '_watch' +'watcher' '_openstack' +'wc' '_wc' +'wget' '_wget' +'what' '_sccs' +'whatis' '_man' +'whence' '_which' +'where' '_which' +'whereis' '_whereis' +'which' '_which' +'who' '_who' +'whoami' '_nothing' +'whois' '_whois' +'whom' '_mh' +'wiggle' '_wiggle' +'wipefs' '_wipefs' +'wodim' '_cdrecord' +'wpa_cli' '_wpa_cli' +'write' '_users_on' +'www' '_webbrowser' +'xargs' '_xargs' +'xattr' '_attr' +'xauth' '_xauth' +'xautolock' '_xautolock' +'xclip' '_xclip' +'xdpyinfo' '_x_utils' +'xdvi' '_xdvi' +'xelatex' '_tex' +'xetex' '_tex' +'xev' '_x_utils' +'xfd' '_x_utils' +'xfig' '_xfig' +'xfontsel' '_x_utils' +'xfreerdp' '_rdesktop' +'xhost' '_x_utils' +'xinput' '_xinput' +'xkill' '_x_utils' +'xli' '_xloadimage' +'xloadimage' '_xloadimage' +'xlsatoms' '_x_utils' +'xlsclients' '_x_utils' +'xml' '_xmlstarlet' +'xmllint' '_xmlsoft' +'xmlstarlet' '_xmlstarlet' +'xmms2' '_xmms2' +'xmodmap' '_xmodmap' +'xmosaic' '_webbrowser' +'xon' '_x_utils' +'xournal' '_xournal' +'xpdf' '_xpdf' +'xping' '_hosts' +'xprop' '_x_utils' +'xrandr' '_xrandr' +'xrdb' '_x_utils' +'xscreensaver-command' '_xscreensaver' +'xset' '_xset' +'xsetbg' '_xloadimage' +'xsetroot' '_x_utils' +'xsltproc' '_xmlsoft' +'xterm' '_xterm' +'xtightvncviewer' '_vnc' +'xtp' '_imagemagick' +'xv' '_xv' +'xview' '_xloadimage' +'xvnc4viewer' '_vnc' +'xvncviewer' '_vnc' +'xwallpaper' '_xwallpaper' +'xwd' '_x_utils' +'xwininfo' '_x_utils' +'xwit' '_xwit' +'xwud' '_x_utils' +'xxd' '_xxd' +'xz' '_xz' +'xzcat' '_xz' +'yafc' '_yafc' +'yash' '_sh' +'yay' '_yay' +'youtube-dl' '_youtube-dl' +'ypbind' '_yp' +'ypcat' '_yp' +'ypmatch' '_yp' +'yppasswd' '_yp' +'yppoll' '_yp' +'yppush' '_yp' +'ypserv' '_yp' +'ypset' '_yp' +'ypwhich' '_yp' +'ypxfr' '_yp' +'ytalk' '_other_accounts' +'yt-dlp' '_yt-dlp' +'zargs' '_zargs' +'zathura' '_zathura' +'zcalc' '_zcalc' +'-zcalc-line-' '_zcalc_line' +'zcat' '_zcat' +'zcompile' '_zcompile' +'zcp' '_zmv' +'zdb' '_zfs' +'zdelattr' '_zattr' +'zdump' '_zdump' +'zeal' '_zeal' +'zed' '_zed' +'zegrep' '_grep' +'zen' '_webbrowser' +'zf_chgrp' '_chown' +'zf_chmod' '_chmod' +'zf_chown' '_chown' +'zfgrep' '_grep' +'zf_ln' '_ln' +'zf_mkdir' '_mkdir' +'zf_mv' '_mv' +'zf_rm' '_rm' +'zf_rmdir' '_rmdir' +'zfs' '_zfs' +'zgetattr' '_zattr' +'zgrep' '_grep' +'zip' '_zip' +'zipinfo' '_zip' +'zle' '_zle' +'zlistattr' '_zattr' +'zln' '_zmv' +'zmail' '_mail' +'zmodload' '_zmodload' +'zmv' '_zmv' +'zone' '_hosts' +'zparseopts' '_zparseopts' +'zpool' '_zfs' +'zpty' '_zpty' +'zsetattr' '_zattr' +'zsh' '_zsh' +'zsh-mime-handler' '_zsh-mime-handler' +'zsocket' '_zsocket' +'zstat' '_stat' +'zstyle' '_zstyle' +'ztodo' '_ztodo' +'zun' '_openstack' +'zxpdf' '_xpdf' +) + +_services=( +'bzcat' 'bunzip2' +'gchgrp' 'chgrp' +'gchown' 'chown' +'gnupod_addsong.pl' 'gnupod_addsong' +'gnupod_check.pl' 'gnupod_check' +'gnupod_INIT.pl' 'gnupod_INIT' +'gnupod_search.pl' 'gnupod_search' +'gpg2' 'gpg' +'gzcat' 'gunzip' +'iceweasel' 'firefox' +'lzcat' 'unxz' +'lzma' 'xz' +'Mail' 'mail' +'mailx' 'mail' +'mktunes.pl' 'mktunes' +'nail' 'mail' +'ncl' 'nc' +'nedit-nc' 'nc' +'pacman.static' 'pacman' +'pcat' 'unpack' +'-redirect-,<,bunzip2' 'bunzip2' +'-redirect-,<,bzip2' 'bzip2' +'-redirect-,>,bzip2' 'bunzip2' +'-redirect-,<,compress' 'compress' +'-redirect-,>,compress' 'uncompress' +'-redirect-,<,gunzip' 'gunzip' +'-redirect-,<,gzip' 'gzip' +'-redirect-,>,gzip' 'gunzip' +'-redirect-,<,uncompress' 'uncompress' +'-redirect-,<,unxz' 'unxz' +'-redirect-,<,xz' 'xz' +'-redirect-,>,xz' 'unxz' +'remsh' 'rsh' +'slogin' 'ssh' +'svnadmin-static' 'svnadmin' +'svnlite' 'svn' +'svnliteadmin' 'svnadmin' +'tunes2pod.pl' 'tunes2pod' +'unlzma' 'unxz' +'xelatex' 'latex' +'xetex' 'tex' +'xzcat' 'unxz' +'zf_chgrp' 'chgrp' +'zf_chown' 'chown' +) + +_patcomps=( +'*/(init|rc[0-9S]#).d/*' '_init_d' +'notmuch-*' '_notmuch' +) + +_postpatcomps=( +'_*' '_compadd' +'c++-*' '_gcc' +'g++-*' '_gcc' +'gcc-*' '_gcc' +'gem[0-9.]#' '_gem' +'lua[0-9.-]##' '_lua' +'(p[bgpn]m*|*top[bgpn]m)' '_pbm' +'php[0-9.-]' '_php' +'pip[0-9.]#' '_pip' +'pydoc[0-9.]#' '_pydoc' +'python[0-9.]#' '_python' +'qemu(|-system-*)' '_qemu' +'(ruby|[ei]rb)[0-9.]#' '_ruby' +'shasum(|5).*' '_shasum' +'(texi(2*|ndex))' '_texi' +'(tiff*|*2tiff|pal2rgb)' '_tiff' +'-value-,(ftp|http(|s))_proxy,-default-' '_urls' +'-value-,LC_*,-default-' '_locales' +'-value-,*path,-default-' '_directories' +'-value-,*PATH,-default-' '_dir_list' +'-value-,RUBY(LIB|OPT|PATH),-default-' '_ruby' +'*/X11(|R<4->)/*' '_x_arguments' +'yodl(|2*)' '_yodl' +'zf*' '_zftp' +) + +_compautos=( +'_call_program' '+X' +) + +zle -C _bash_complete-word .complete-word _bash_completions +zle -C _bash_list-choices .list-choices _bash_completions +zle -C _complete_debug .complete-word _complete_debug +zle -C _complete_help .complete-word _complete_help +zle -C _complete_tag .complete-word _complete_tag +zle -C _correct_filename .complete-word _correct_filename +zle -C _correct_word .complete-word _correct_word +zle -C _expand_alias .complete-word _expand_alias +zle -C _expand_word .complete-word _expand_word +zle -C _history-complete-newer .complete-word _history_complete_word +zle -C _history-complete-older .complete-word _history_complete_word +zle -C _list_expansions .list-choices _expand_word +zle -C _most_recent_file .complete-word _most_recent_file +zle -C _next_tags .list-choices _next_tags +zle -C _read_comp .complete-word _read_comp +bindkey '^X^R' _read_comp +bindkey '^X?' _complete_debug +bindkey '^XC' _correct_filename +bindkey '^Xa' _expand_alias +bindkey '^Xc' _correct_word +bindkey '^Xd' _list_expansions +bindkey '^Xe' _expand_word +bindkey '^Xh' _complete_help +bindkey '^Xm' _most_recent_file +bindkey '^Xn' _next_tags +bindkey '^Xt' _complete_tag +bindkey '^X~' _bash_list-choices +bindkey '^[,' _history-complete-newer +bindkey '^[/' _history-complete-older +bindkey '^[~' _bash_complete-word + +autoload -Uz _ab-av1 _bat _bw _bwrap _cargo \ + _codium _curl _email-notmuch _exercism _hg \ + _hugo _john _libinput _loginctl _meson \ + _mkinitcpio _mpv _ninja _notmuch _pacman \ + _pass _pulseaudio _rage _rage-keygen _rage-mount \ + _xwallpaper _yay _youtube-dl _yt-dlp _zathura \ + _cdr _all_labels _all_matches _alternative _approximate \ + _arg_compile _arguments _bash_completions _cache_invalid _call_function \ + _combination _complete _complete_debug _complete_help _complete_help_generic \ + _complete_tag _comp_locale _correct _correct_filename _correct_word \ + _describe _description _dispatch _expand _expand_alias \ + _expand_word _extensions _external_pwds _generic _guard \ + _history _history_complete_word _ignored _list _main_complete \ + _match _menu _message _most_recent_file _multi_parts \ + _next_label _next_tags _normal _nothing _numbers \ + _oldlist _pick_variant _prefix _read_comp _regex_arguments \ + _regex_words _requested _retrieve_cache _sep_parts _sequence \ + _set_command _setup _store_cache _sub_commands _tags \ + _user_expand _values _wanted _acpi _acpitool \ + _alsa-utils _analyseplugin _basenc _brctl _btrfs \ + _capabilities _chattr _chcon _choom _chrt \ + _cpupower _cryptsetup _dkms _e2label _ethtool \ + _findmnt _free _fuse_arguments _fusermount _fuse_values \ + _gpasswd _htop _iconvconfig _ionice _ipset \ + _iptables _iwconfig _kpartx _losetup _lsattr \ + _lsblk _lsns _lsusb _ltrace _mat \ + _mat2 _mdadm _mii-tool _modutils _mondo \ + _networkmanager _nsenter _opkg _perf _pidof \ + _pmap _qdbus _schedtool _selinux_contexts _selinux_roles \ + _selinux_types _selinux_users _setpriv _setsid _slabtop \ + _ss _sshfs _strace _sysstat _tload \ + _tpb _tracepath _tune2fs _uml _unshare \ + _valgrind _vserver _wakeup_capable_devices _wipefs _wpa_cli \ + _a2ps _aap _abcde _absolute_command_paths _ack \ + _adb _ansible _ant _antiword _apachectl \ + _apm _arch_archives _arch_namespace _arp _arping \ + _asciidoctor _asciinema _at _attr _augeas \ + _avahi _awk _base64 _basename _bash \ + _baudrates _baz _beep _bibtex _bind_addresses \ + _bison _bittorrent _bogofilter _bpf_filters _bpython \ + _bzip2 _bzr _cabal _cal _calendar \ + _canonical_paths _cat _ccal _cdcd _cdrdao \ + _cdrecord _chkconfig _chmod _chown _chroot \ + _chsh _cksum _clay _cmdambivalent _cmdstring \ + _cmp _column _comm _composer _compress \ + _configure _cowsay _cp _cpio _cplay \ + _crontab _cscope _csplit _cssh _ctags \ + _ctags_tags _curl _cut _cvs _darcs \ + _date _date_formats _dates _dbus _dconf \ + _dd _devtodo _df _dhclient _dict \ + _dict_words _diff _diff3 _diff_options _diffstat \ + _dig _directories _dir_list _django _dmesg \ + _dmidecode _dns_types _doas _domains _dos2unix \ + _drill _dropbox _dsh _dtruss _du \ + _dvi _ecasound _ed _elfdump _elinks \ + _email_addresses _enscript _entr _env _espeak \ + _etags _fakeroot _feh _fetchmail _ffmpeg \ + _figlet _file_modes _files _file_systems _find \ + _find_net_interfaces _finger _flac _flex _fmt \ + _fold _fortune _fsh _fuser _gcc \ + _gcore _gdb _gem _genisoimage _getconf \ + _getent _getfacl _getmail _getopt _ghostscript \ + _git _global _global_tags _gnu_generic _gnupod \ + _gnutls _go _gpg _gphoto2 _gprof \ + _gradle _graphicsmagick _grep _groff _groups \ + _growisofs _gsettings _guilt _gzip _have_glob_qual \ + _head _hexdump _host _hostname _hosts \ + _iconv _id _ifconfig _iftop _imagemagick \ + _initctl _init_d _install _iostat _ip \ + _ipsec _irssi _ispell _java _java_class \ + _joe _join _jq _killall _knock \ + _kvno _last _ldconfig _ldd _ld_debug \ + _less _lha _libvirt _links _list_files \ + _lldb _ln _loadkeys _locale _localedef \ + _locales _locate _logger _look _lp \ + _ls _lsof _lua _luarocks _lynx \ + _lz4 _lzop _mail _mailboxes _make \ + _man _md5sum _mencal _mh _mime_types \ + _mkdir _mkfifo _mknod _mktemp _module \ + _monotone _moosic _mosh _mount _mpc \ + _mt _mtools _mtr _mutt _mv \ + _my_accounts _myrepos _mysqldiff _mysql_utils _ncftp \ + _netcat _net_interfaces _netstat _newsgroups _nginx \ + _ngrep _nice _nkf _nl _nm \ + _nmap _npm _nslookup _numfmt _objdump \ + _object_files _od _openstack _opustools _other_accounts \ + _pack _pandoc _paste _patch _patchutils \ + _path_commands _path_files _pax _pbm _pdf \ + _perforce _perl _perl_basepods _perldoc _perl_modules \ + _pgids _pgrep _php _picocom _pids \ + _pine _ping _pip _pkgadd _pkg-config \ + _pkginfo _pkg_instance _pkgrm _pon _ports \ + _postfix _postgresql _postscript _pr _printenv \ + _printers _process_names _prove _ps _pspdf \ + _psutils _ptx _pump _pv _pwgen \ + _pydoc _python _python_modules _qemu _quilt \ + _rake _ranlib _rar _rclone _rcs \ + _readelf _readlink _remote_files _renice _ri \ + _rlogin _rm _rmdir _route _rrdtool \ + _rsync _rubber _ruby _runit _samba \ + _sccs _scons _screen _script _seafile \ + _sed _seq _service _services _setfacl \ + _sh _shasum _showmount _shred _shuf \ + _shutdown _signals _sisu _slrn _smartmontools \ + _socket _sort _spamassassin _split _sqlite \ + _sqsh _ssh _ssh_hosts _stat _stdbuf \ + _stgit _stow _strings _strip _stty \ + _su _subversion _sudo _surfraw _swaks \ + _swanctl _swift _sys_calls _sysctl _tac \ + _tail _tar _tar_archive _tardy _tcpdump \ + _tcptraceroute _tee _telnet _terminals _tex \ + _texi _texinfo _tidy _tiff _tilde_files \ + _timeout _time_zone _tin _tla _tmux \ + _todo.sh _toilet _top _topgit _totd \ + _touch _tput _tr _transmission _tree \ + _truncate _truss _tty _ttys _twidge \ + _twisted _umountable _unace _uname _unexpand \ + _uniq _unison _units _uptime _urls \ + _user_admin _user_at_host _users _users_on _vi \ + _vim _visudo _vmstat _vorbis _vpnc \ + _w _w3m _watch _wc _webbrowser \ + _wget _whereis _who _whois _wiggle \ + _xargs _xmlsoft _xmlstarlet _xmms2 _xxd \ + _xz _yafc _yodl _yp _zcat \ + _zdump _zfs _zfs_dataset _zfs_pool _zip \ + _zsh _acroread _code _dcop _eog \ + _evince _geany _gnome-gv _gqview _gv \ + _kdeconnect _kfmclient _matlab _mozilla _mplayer \ + _mupdf _nautilus _nedit _netscape _okular \ + _pdftk _qiv _rdesktop _setxkbmap _sublimetext \ + _urxvt _vnc _x_arguments _xauth _xautolock \ + _x_borderwidth _xclip _x_color _x_colormapid _x_cursor \ + _x_display _xdvi _x_extension _xfig _x_font \ + _xft_fonts _x_geometry _xinput _x_keysym _xloadimage \ + _x_locale _x_modifier _xmodmap _x_name _xournal \ + _xpdf _xrandr _x_resource _xscreensaver _x_selection_timeout \ + _xset _xt_arguments _xterm _x_title _xt_session_id \ + _x_utils _xv _x_visual _x_window _xwit \ + _zeal _add-zle-hook-widget _add-zsh-hook _alias _aliases \ + __arguments _arrays _assign _autocd _bindkey \ + _brace_parameter _builtin _cd _command _command_names \ + _compadd _compdef _completers _condition _default \ + _delimiters _directory_stack _dirs _disable _dynamic_directory_name \ + _echotc _echoti _emulate _enable _equal \ + _exec _fc _file_descriptors _first _functions \ + _globflags _globqual_delims _globquals _hash _history_modifiers \ + _in_vared _jobs _jobs_bg _jobs_builtin _jobs_fg \ + _kill _limit _limits _math _math_params \ + _mere _module_math_func _options _options_set _options_unset \ + _parameter _parameters _precommand _print _prompt \ + _ps1234 _read _redirect _run-help _sched \ + _set _setopt _source _strftime _subscript \ + _suffix_alias_files _tcpsys _tilde _trap _ttyctl \ + _typeset _ulimit _unhash _user_math_func _value \ + _vared _vars _vcs_info _vcs_info_hooks _wait \ + _which _widgets _zargs _zattr _zcalc \ + _zcalc_line _zcompile _zed _zftp _zle \ + _zmodload _zmv _zparseopts _zpty _zsh-mime-handler \ + _zsocket _zstyle _ztodo +autoload -Uz +X _call_program + +typeset -gUa _comp_assocs +_comp_assocs=( '' ) diff --git a/zsh/.zshrc b/zsh/.zshrc new file mode 100644 index 0000000..ae3f5ff --- /dev/null +++ b/zsh/.zshrc @@ -0,0 +1,84 @@ +# Luke's config for the Zoomer Shell + +# Enable colors and change prompt: +autoload -U colors && colors # Load colors +PS1="%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b " +setopt autocd # Automatically cd into typed directory. +stty stop undef # Disable ctrl-s to freeze terminal. +setopt interactive_comments + +# History in cache directory: +HISTSIZE=10000000 +SAVEHIST=10000000 +HISTFILE="${XDG_CACHE_HOME:-$HOME/.cache}/zsh/history" + +# Load aliases and shortcuts if existent. +[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc" +[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliasrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliasrc" +[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc" + +# Basic auto/tab complete: +autoload -U compinit +zstyle ':completion:*' menu select +zmodload zsh/complist +compinit +_comp_options+=(globdots) # Include hidden files. +# Set enviorment variables for nvidia-vaapi +export LIBVA_DRIVER_NAME=nvidia +export MOZ_DISABLE_RDD_SANDBOX=1 +export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/10_nvidia.json +# vi mode +bindkey -v +export KEYTIMEOUT=1 +# Use keychain to load ssh-agent +eval `keychain --eval --quiet --noask --agents ssh id_rsa ~/.ssh/id_rsa` +# Use vim keys in tab complete menu: +bindkey -M menuselect 'h' vi-backward-char +bindkey -M menuselect 'k' vi-up-line-or-history +bindkey -M menuselect 'l' vi-forward-char +bindkey -M menuselect 'j' vi-down-line-or-history +bindkey -v '^?' backward-delete-char + +# Change cursor shape for different vi modes. +function zle-keymap-select () { + case $KEYMAP in + vicmd) echo -ne '\e[1 q';; # block + viins|main) echo -ne '\e[5 q';; # beam + esac +} +zle -N zle-keymap-select +zle-line-init() { + zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) + echo -ne "\e[5 q" +} +zle -N zle-line-init +echo -ne '\e[5 q' # Use beam shape cursor on startup. +preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt. + +# Use lf to switch directories and bind it to ctrl-o +lfcd () { + tmp="$(mktemp -uq)" + trap 'rm -f $tmp >/dev/null 2>&1' HUP INT QUIT TERM PWR EXIT + lf -last-dir-path="$tmp" "$@" + if [ -f "$tmp" ]; then + dir="$(cat "$tmp")" + [ -d "$dir" ] && [ "$dir" != "$(pwd)" ] && cd "$dir" + fi +} +bindkey -s '^o' '^ulfcd\n' + +bindkey -s '^a' '^ubc -lq\n' + +bindkey -s '^f' '^ucd "$(dirname "$(fzf)")"\n' + +bindkey '^[[P' delete-char + +# Edit line in vim with ctrl-e: +autoload edit-command-line; zle -N edit-command-line +bindkey '^e' edit-command-line +bindkey -M vicmd '^[[P' vi-delete-char +bindkey -M vicmd '^e' edit-command-line +bindkey -M visual '^[[P' vi-delete + +# Load syntax highlighting; should be last. +source /usr/share/zsh/plugins/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh 2>/dev/null