add files

This commit is contained in:
Javier 2024-04-02 21:09:23 -05:00
commit bf390a8694
546 changed files with 760395 additions and 0 deletions

View File

@ -0,0 +1,959 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Catppuccin</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c6d0f5</string>
<key>background</key>
<string>#303446</string>
<key>caret</key>
<string>#b5bfe2</string>
<key>invisibles</key>
<string>#a5adce</string>
<key>gutterForeground</key>
<string>#949cbb</string>
<key>gutterForegroundHighlight</key>
<string>#a6d189</string>
<key>lineHighlight</key>
<string>#626880</string>
<key>selection</key>
<string>#737994</string>
<key>selectionBorder</key>
<string>#303446</string>
<key>activeGuide</key>
<string>#ef9f76</string>
<key>findHighlightForeground</key>
<string>#292c3c</string>
<key>findHighlight</key>
<string>#e5c890</string>
<key>bracketsForeground</key>
<string>#949cbb</string>
<key>bracketContentsForeground</key>
<string>#949cbb</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#737994</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a6d189</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String regex</string>
<key>scope</key>
<string>string.regexp</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ef9f76</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ef9f76</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Boolean</string>
<key>scope</key>
<string>constant.language.boolean</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ef9f76</string>
<key>fontStyle</key>
<string>bold italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#babbf1</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in function</string>
<key>scope</key>
<string>support.function.builtin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ef9f76</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>variable.other.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ef9f76</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict></dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Conditional/loop</string>
<key>scope</key>
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ca9ee6</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Return</string>
<key>scope</key>
<string>keyword.control.return, keyword.control.flow.return</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4b8e4</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Exception</string>
<key>scope</key>
<string>support.type.exception</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ef9f76</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operator</string>
<key>scope</key>
<string>keyword.operator, punctuation.accessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#99d1db</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation separator</string>
<key>scope</key>
<string>punctuation.separator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation terminator</string>
<key>scope</key>
<string>punctuation.terminator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation bracket</string>
<key>scope</key>
<string>punctuation.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#949cbb</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Include</string>
<key>scope</key>
<string>keyword.control.import.include</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type</string>
<key>scope</key>
<string>storage.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e5c890</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage modifier</string>
<key>scope</key>
<string>storage.modifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type namespace</string>
<key>scope</key>
<string>entity.name.namespace, meta.path</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2d5cf</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type class</string>
<key>scope</key>
<string>storage.type.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2d5cf</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Label</string>
<key>scope</key>
<string>entity.name.label</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8caaee</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword class</string>
<key>scope</key>
<string>keyword.declaration.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class, meta.toc-list.full-identifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#99d1db</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#99d1db</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function, variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8caaee</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function macro</string>
<key>scope</key>
<string>entity.name.function.preprocessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Macro directive - ifdef</string>
<key>scope</key>
<string>keyword.control.import</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Constructor</string>
<key>scope</key>
<string>entity.name.function.constructor, entity.name.function.destructor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#babbf1</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2d5cf</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function declaration</string>
<key>scope</key>
<string>keyword.declaration.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ea999c</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#99d1db</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8caaee</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class/type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8caaee</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable function</string>
<key>scope</key>
<string>variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8caaee</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable parameter</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2d5cf</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable other</string>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c6d0f5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable field</string>
<key>scope</key>
<string>variable.other.member</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2d5cf</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable language</string>
<key>scope</key>
<string>variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ef9f76</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ca9ee6</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag delimiter</string>
<key>scope</key>
<string>punctuation.definition.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ea999c</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown URL</string>
<key>scope</key>
<string>markup.underline.link.markdown</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2d5cf</string>
<key>fontStyle</key>
<string>italic underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown reference</string>
<key>scope</key>
<string>meta.link.inline.description</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#babbf1</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown literal</string>
<key>scope</key>
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown title</string>
<key>scope</key>
<string>punctuation.definition.heading, entity.name.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8caaee</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown emphasis</string>
<key>scope</key>
<string>markup.italic</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ea999c</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown strong</string>
<key>scope</key>
<string>markup.bold</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ea999c</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Escape</string>
<key>scope</key>
<string>constant.character.escape</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4b8e4</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash built-in function</string>
<key>scope</key>
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4b8e4</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash parameter</string>
<key>scope</key>
<string>variable.language.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua field</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#babbf1</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua constructor</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eebebe</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Java constant</string>
<key>scope</key>
<string>entity.name.constant.java</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS property</string>
<key>scope</key>
<string>support.type.property-name.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eebebe</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS constant</string>
<key>scope</key>
<string>support.constant.property-value.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c6d0f5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS suffix</string>
<key>scope</key>
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS variable property</string>
<key>scope</key>
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SCSS tag</string>
<key>scope</key>
<string>entity.name.tag.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#babbf1</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SASS variable</string>
<key>scope</key>
<string>variable.other.sass</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#81c8be</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c6d0f5</string>
<key>background</key>
<string>#e78284</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
<string>invalid.deprecated</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c6d0f5</string>
<key>background</key>
<string>#ca9ee6</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff header</string>
<key>scope</key>
<string>meta.diff, meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#737994</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a6d189</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e5c890</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Message error</string>
<key>scope</key>
<string>message.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e78284</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.dark.Catppuccin</string>
<key>author</key>
<string>BrunDerSchwarzmagier</string>
</dict>
</plist>

View File

@ -0,0 +1,959 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Catppuccin</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4c4f69</string>
<key>background</key>
<string>#eff1f5</string>
<key>caret</key>
<string>#5c5f77</string>
<key>invisibles</key>
<string>#6c6f85</string>
<key>gutterForeground</key>
<string>#7c7f93</string>
<key>gutterForegroundHighlight</key>
<string>#40a02b</string>
<key>lineHighlight</key>
<string>#acb0be</string>
<key>selection</key>
<string>#9ca0b0</string>
<key>selectionBorder</key>
<string>#eff1f5</string>
<key>activeGuide</key>
<string>#fe640b</string>
<key>findHighlightForeground</key>
<string>#e6e9ef</string>
<key>findHighlight</key>
<string>#df8e1d</string>
<key>bracketsForeground</key>
<string>#7c7f93</string>
<key>bracketContentsForeground</key>
<string>#7c7f93</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#9ca0b0</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#40a02b</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String regex</string>
<key>scope</key>
<string>string.regexp</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fe640b</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fe640b</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Boolean</string>
<key>scope</key>
<string>constant.language.boolean</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fe640b</string>
<key>fontStyle</key>
<string>bold italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7287fd</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in function</string>
<key>scope</key>
<string>support.function.builtin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fe640b</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>variable.other.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fe640b</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict></dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Conditional/loop</string>
<key>scope</key>
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8839ef</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Return</string>
<key>scope</key>
<string>keyword.control.return, keyword.control.flow.return</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ea76cb</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Exception</string>
<key>scope</key>
<string>support.type.exception</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fe640b</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operator</string>
<key>scope</key>
<string>keyword.operator, punctuation.accessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#04a5e5</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation separator</string>
<key>scope</key>
<string>punctuation.separator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation terminator</string>
<key>scope</key>
<string>punctuation.terminator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation bracket</string>
<key>scope</key>
<string>punctuation.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7c7f93</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Include</string>
<key>scope</key>
<string>keyword.control.import.include</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type</string>
<key>scope</key>
<string>storage.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#df8e1d</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage modifier</string>
<key>scope</key>
<string>storage.modifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type namespace</string>
<key>scope</key>
<string>entity.name.namespace, meta.path</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dc8a78</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type class</string>
<key>scope</key>
<string>storage.type.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dc8a78</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Label</string>
<key>scope</key>
<string>entity.name.label</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#1e66f5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword class</string>
<key>scope</key>
<string>keyword.declaration.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class, meta.toc-list.full-identifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#04a5e5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#04a5e5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function, variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#1e66f5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function macro</string>
<key>scope</key>
<string>entity.name.function.preprocessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Macro directive - ifdef</string>
<key>scope</key>
<string>keyword.control.import</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Constructor</string>
<key>scope</key>
<string>entity.name.function.constructor, entity.name.function.destructor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7287fd</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dc8a78</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function declaration</string>
<key>scope</key>
<string>keyword.declaration.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e64553</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#04a5e5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#1e66f5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class/type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#1e66f5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable function</string>
<key>scope</key>
<string>variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#1e66f5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable parameter</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dc8a78</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable other</string>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4c4f69</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable field</string>
<key>scope</key>
<string>variable.other.member</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dc8a78</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable language</string>
<key>scope</key>
<string>variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fe640b</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8839ef</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag delimiter</string>
<key>scope</key>
<string>punctuation.definition.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e64553</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown URL</string>
<key>scope</key>
<string>markup.underline.link.markdown</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dc8a78</string>
<key>fontStyle</key>
<string>italic underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown reference</string>
<key>scope</key>
<string>meta.link.inline.description</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7287fd</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown literal</string>
<key>scope</key>
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown title</string>
<key>scope</key>
<string>punctuation.definition.heading, entity.name.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#1e66f5</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown emphasis</string>
<key>scope</key>
<string>markup.italic</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e64553</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown strong</string>
<key>scope</key>
<string>markup.bold</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e64553</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Escape</string>
<key>scope</key>
<string>constant.character.escape</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ea76cb</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash built-in function</string>
<key>scope</key>
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ea76cb</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash parameter</string>
<key>scope</key>
<string>variable.language.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua field</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7287fd</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua constructor</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dd7878</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Java constant</string>
<key>scope</key>
<string>entity.name.constant.java</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS property</string>
<key>scope</key>
<string>support.type.property-name.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dd7878</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS constant</string>
<key>scope</key>
<string>support.constant.property-value.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4c4f69</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS suffix</string>
<key>scope</key>
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS variable property</string>
<key>scope</key>
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SCSS tag</string>
<key>scope</key>
<string>entity.name.tag.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7287fd</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SASS variable</string>
<key>scope</key>
<string>variable.other.sass</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#179299</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4c4f69</string>
<key>background</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
<string>invalid.deprecated</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4c4f69</string>
<key>background</key>
<string>#8839ef</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff header</string>
<key>scope</key>
<string>meta.diff, meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#9ca0b0</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#40a02b</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#df8e1d</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Message error</string>
<key>scope</key>
<string>message.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d20f39</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.dark.Catppuccin</string>
<key>author</key>
<string>BrunDerSchwarzmagier</string>
</dict>
</plist>

View File

@ -0,0 +1,959 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Catppuccin</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cad3f5</string>
<key>background</key>
<string>#24273a</string>
<key>caret</key>
<string>#b8c0e0</string>
<key>invisibles</key>
<string>#a5adcb</string>
<key>gutterForeground</key>
<string>#939ab7</string>
<key>gutterForegroundHighlight</key>
<string>#a6da95</string>
<key>lineHighlight</key>
<string>#5b6078</string>
<key>selection</key>
<string>#6e738d</string>
<key>selectionBorder</key>
<string>#24273a</string>
<key>activeGuide</key>
<string>#f5a97f</string>
<key>findHighlightForeground</key>
<string>#1e2030</string>
<key>findHighlight</key>
<string>#eed49f</string>
<key>bracketsForeground</key>
<string>#939ab7</string>
<key>bracketContentsForeground</key>
<string>#939ab7</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6e738d</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a6da95</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String regex</string>
<key>scope</key>
<string>string.regexp</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5a97f</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5a97f</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Boolean</string>
<key>scope</key>
<string>constant.language.boolean</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5a97f</string>
<key>fontStyle</key>
<string>bold italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b7bdf8</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in function</string>
<key>scope</key>
<string>support.function.builtin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5a97f</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>variable.other.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5a97f</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict></dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Conditional/loop</string>
<key>scope</key>
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c6a0f6</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Return</string>
<key>scope</key>
<string>keyword.control.return, keyword.control.flow.return</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5bde6</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Exception</string>
<key>scope</key>
<string>support.type.exception</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5a97f</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operator</string>
<key>scope</key>
<string>keyword.operator, punctuation.accessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#91d7e3</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation separator</string>
<key>scope</key>
<string>punctuation.separator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation terminator</string>
<key>scope</key>
<string>punctuation.terminator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation bracket</string>
<key>scope</key>
<string>punctuation.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#939ab7</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Include</string>
<key>scope</key>
<string>keyword.control.import.include</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type</string>
<key>scope</key>
<string>storage.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eed49f</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage modifier</string>
<key>scope</key>
<string>storage.modifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type namespace</string>
<key>scope</key>
<string>entity.name.namespace, meta.path</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4dbd6</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type class</string>
<key>scope</key>
<string>storage.type.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4dbd6</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Label</string>
<key>scope</key>
<string>entity.name.label</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8aadf4</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword class</string>
<key>scope</key>
<string>keyword.declaration.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class, meta.toc-list.full-identifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#91d7e3</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#91d7e3</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function, variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8aadf4</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function macro</string>
<key>scope</key>
<string>entity.name.function.preprocessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Macro directive - ifdef</string>
<key>scope</key>
<string>keyword.control.import</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Constructor</string>
<key>scope</key>
<string>entity.name.function.constructor, entity.name.function.destructor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b7bdf8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4dbd6</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function declaration</string>
<key>scope</key>
<string>keyword.declaration.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ee99a0</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#91d7e3</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8aadf4</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class/type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8aadf4</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable function</string>
<key>scope</key>
<string>variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8aadf4</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable parameter</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4dbd6</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable other</string>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cad3f5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable field</string>
<key>scope</key>
<string>variable.other.member</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4dbd6</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable language</string>
<key>scope</key>
<string>variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5a97f</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c6a0f6</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag delimiter</string>
<key>scope</key>
<string>punctuation.definition.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ee99a0</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown URL</string>
<key>scope</key>
<string>markup.underline.link.markdown</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f4dbd6</string>
<key>fontStyle</key>
<string>italic underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown reference</string>
<key>scope</key>
<string>meta.link.inline.description</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b7bdf8</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown literal</string>
<key>scope</key>
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown title</string>
<key>scope</key>
<string>punctuation.definition.heading, entity.name.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8aadf4</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown emphasis</string>
<key>scope</key>
<string>markup.italic</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ee99a0</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown strong</string>
<key>scope</key>
<string>markup.bold</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ee99a0</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Escape</string>
<key>scope</key>
<string>constant.character.escape</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5bde6</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash built-in function</string>
<key>scope</key>
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5bde6</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash parameter</string>
<key>scope</key>
<string>variable.language.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua field</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b7bdf8</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua constructor</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f0c6c6</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Java constant</string>
<key>scope</key>
<string>entity.name.constant.java</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS property</string>
<key>scope</key>
<string>support.type.property-name.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f0c6c6</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS constant</string>
<key>scope</key>
<string>support.constant.property-value.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cad3f5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS suffix</string>
<key>scope</key>
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS variable property</string>
<key>scope</key>
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SCSS tag</string>
<key>scope</key>
<string>entity.name.tag.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b7bdf8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SASS variable</string>
<key>scope</key>
<string>variable.other.sass</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8bd5ca</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cad3f5</string>
<key>background</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
<string>invalid.deprecated</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cad3f5</string>
<key>background</key>
<string>#c6a0f6</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff header</string>
<key>scope</key>
<string>meta.diff, meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6e738d</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a6da95</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eed49f</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Message error</string>
<key>scope</key>
<string>message.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed8796</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.dark.Catppuccin</string>
<key>author</key>
<string>BrunDerSchwarzmagier</string>
</dict>
</plist>

View File

@ -0,0 +1,959 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Catppuccin</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cdd6f4</string>
<key>background</key>
<string>#1e1e2e</string>
<key>caret</key>
<string>#bac2de</string>
<key>invisibles</key>
<string>#a6adc8</string>
<key>gutterForeground</key>
<string>#9399b2</string>
<key>gutterForegroundHighlight</key>
<string>#a6e3a1</string>
<key>lineHighlight</key>
<string>#585b70</string>
<key>selection</key>
<string>#6c7086</string>
<key>selectionBorder</key>
<string>#1e1e2e</string>
<key>activeGuide</key>
<string>#fab387</string>
<key>findHighlightForeground</key>
<string>#181825</string>
<key>findHighlight</key>
<string>#f9e2af</string>
<key>bracketsForeground</key>
<string>#9399b2</string>
<key>bracketContentsForeground</key>
<string>#9399b2</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6c7086</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a6e3a1</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String regex</string>
<key>scope</key>
<string>string.regexp</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fab387</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fab387</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Boolean</string>
<key>scope</key>
<string>constant.language.boolean</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fab387</string>
<key>fontStyle</key>
<string>bold italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b4befe</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in function</string>
<key>scope</key>
<string>support.function.builtin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fab387</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>variable.other.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fab387</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict></dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Conditional/loop</string>
<key>scope</key>
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cba6f7</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Return</string>
<key>scope</key>
<string>keyword.control.return, keyword.control.flow.return</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5c2e7</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Exception</string>
<key>scope</key>
<string>support.type.exception</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fab387</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operator</string>
<key>scope</key>
<string>keyword.operator, punctuation.accessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89dceb</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation separator</string>
<key>scope</key>
<string>punctuation.separator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation terminator</string>
<key>scope</key>
<string>punctuation.terminator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation bracket</string>
<key>scope</key>
<string>punctuation.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#9399b2</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Include</string>
<key>scope</key>
<string>keyword.control.import.include</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type</string>
<key>scope</key>
<string>storage.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f9e2af</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage modifier</string>
<key>scope</key>
<string>storage.modifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type namespace</string>
<key>scope</key>
<string>entity.name.namespace, meta.path</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5e0dc</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type class</string>
<key>scope</key>
<string>storage.type.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5e0dc</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Label</string>
<key>scope</key>
<string>entity.name.label</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89b4fa</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword class</string>
<key>scope</key>
<string>keyword.declaration.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class, meta.toc-list.full-identifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89dceb</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89dceb</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function, variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89b4fa</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function macro</string>
<key>scope</key>
<string>entity.name.function.preprocessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Macro directive - ifdef</string>
<key>scope</key>
<string>keyword.control.import</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Constructor</string>
<key>scope</key>
<string>entity.name.function.constructor, entity.name.function.destructor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b4befe</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5e0dc</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function declaration</string>
<key>scope</key>
<string>keyword.declaration.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eba0ac</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89dceb</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89b4fa</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class/type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89b4fa</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable function</string>
<key>scope</key>
<string>variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89b4fa</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable parameter</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5e0dc</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable other</string>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cdd6f4</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable field</string>
<key>scope</key>
<string>variable.other.member</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5e0dc</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable language</string>
<key>scope</key>
<string>variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#fab387</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cba6f7</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag delimiter</string>
<key>scope</key>
<string>punctuation.definition.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eba0ac</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown URL</string>
<key>scope</key>
<string>markup.underline.link.markdown</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5e0dc</string>
<key>fontStyle</key>
<string>italic underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown reference</string>
<key>scope</key>
<string>meta.link.inline.description</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b4befe</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown literal</string>
<key>scope</key>
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown title</string>
<key>scope</key>
<string>punctuation.definition.heading, entity.name.section</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#89b4fa</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown emphasis</string>
<key>scope</key>
<string>markup.italic</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eba0ac</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown strong</string>
<key>scope</key>
<string>markup.bold</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#eba0ac</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Escape</string>
<key>scope</key>
<string>constant.character.escape</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5c2e7</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash built-in function</string>
<key>scope</key>
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f5c2e7</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bash parameter</string>
<key>scope</key>
<string>variable.language.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua field</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b4befe</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lua constructor</string>
<key>scope</key>
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2cdcd</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Java constant</string>
<key>scope</key>
<string>entity.name.constant.java</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS property</string>
<key>scope</key>
<string>support.type.property-name.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f2cdcd</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS constant</string>
<key>scope</key>
<string>support.constant.property-value.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cdd6f4</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS suffix</string>
<key>scope</key>
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS variable property</string>
<key>scope</key>
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SCSS tag</string>
<key>scope</key>
<string>entity.name.tag.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b4befe</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SASS variable</string>
<key>scope</key>
<string>variable.other.sass</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#94e2d5</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cdd6f4</string>
<key>background</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
<string>invalid.deprecated</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cdd6f4</string>
<key>background</key>
<string>#cba6f7</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff header</string>
<key>scope</key>
<string>meta.diff, meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6c7086</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a6e3a1</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f9e2af</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Message error</string>
<key>scope</key>
<string>message.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f38ba8</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.dark.Catppuccin</string>
<key>author</key>
<string>BrunDerSchwarzmagier</string>
</dict>
</plist>

BIN
.config/cache.sqlite Executable file

Binary file not shown.

16
.config/cron/cron.conf Executable file
View File

@ -0,0 +1,16 @@
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# backup using the rsbu program to the internal 4TB HDD and then 4TB external
*/1 * * * * swww img $(shuf -en1 ~/pics/classic/art/*)
*/59 * * * * doas scratch sync &>/dev/null && pkill -SIGRTMIN+8 waybar

223
.config/foot/foot.ini Executable file
View File

@ -0,0 +1,223 @@
# -*- conf -*-
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
# term=foot (or xterm-256color if built with -Dterminfo=disabled)
# login-shell=no
# app-id=foot
# title=foot
# locked-title=no
font=IBM Plex Mono:size=14
font-bold=IBM Plex Mono:size=14
font-italic=IBM Plex Mono:size=14
font-bold-italic=IBM Plex Mono:size=14
# font-size-adjustment=0.5
# line-height=<font metrics>
# letter-spacing=0
# horizontal-letter-offset=0
# vertical-letter-offset=0
# underline-offset=<font metrics>
# underline-thickness=<font underline thickness>
# box-drawings-uses-font-glyphs=no
# dpi-aware=auto
# initial-window-size-pixels=700x500 # Or,
# initial-window-size-chars=<COLSxROWS>
# initial-window-mode=windowed
# pad=0x0 # optionally append 'center'
# resize-delay-ms=100
# notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body}
# bold-text-in-bright=no
# word-delimiters=,│`|:"'()[]{}<>
# selection-target=primary
# workers=<number of logical CPUs>
# utempter=/usr/lib/utempter/utempter
[environment]
# name=value
[bell]
# urgent=no
# notify=no
# command=
# command-focused=no
[scrollback]
lines=1000
multiplier=3.0
indicator-position=relative
# indicator-format=""
[url]
# launch=xdg-open ${url}
# label-letters=sadfjklewcmpgh
# osc8-underline=url-mode
# protocols=http, https, ftp, ftps, file, gemini, gopher
# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]
[cursor]
# style=block
# color=<inverse foreground/background>
blink=yes
# beam-thickness=1.5
# underline-thickness=<font underline thickness>
[mouse]
# hide-when-typing=no
# alternate-scroll-mode=yes
[colors]
# alpha=1.0
# background=002b36
# foreground=839496
## Normal/regular colors (color palette 0-7)
# regular0=073642 # black
# regular1=dc322f # red
# regular2=859900 # green
# regular3=b58900 # yellow
# regular4=268bd2 # blue
# regular5=d33682 # magenta
# regular6=2aa198 # cyan
# regular7=eee8d5 # white
## Bright colors (color palette 8-15)
# bright0=08404f # bright black
# bright1=e35f5c # bright red
# bright2=9fb700 # bright green
# bright3=d9a400 # bright yellow
# bright4=4ba1de # bright blue
# bright5=dc619d # bright magenta
# bright6=32c1b6 # bright cyan
# bright7=ffffff # bright white
## dimmed colors (see foot.ini(5) man page)
# dim0=<not set>
# ...
# dim7=<not-set>
## The remaining 256-color palette
# 16 = <256-color palette #16>
# ...
# 255 = <256-color palette #255>
## Misc colors
# selection-foreground=<inverse foreground/background>
# selection-background=<inverse foreground/background>
# jump-labels=<regular0> <regular3> # black-on-yellow
# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue
# search-box-no-match=<regular0> <regular1> # black-on-red
# search-box-match=<regular0> <regular3> # black-on-yellow
# urls=<regular3>
[csd]
# preferred=server
# size=26
# font=<primary font>
# color=<foreground color>
# hide-when-typing=no
# border-width=0
# border-color=<csd.color>
# button-width=26
# button-color=<background color>
# button-minimize-color=<regular4>
# button-maximize-color=<regular2>
# button-close-color=<regular1>
[key-bindings]
scrollback-up-page=Control+k
# scrollback-up-half-page=none
# scrollback-up-line=none
scrollback-down-page=Control+j
# scrollback-down-half-page=none
# scrollback-down-line=none
# clipboard-copy=Control+Shift+c XF86Copy
# clipboard-paste=Control+Shift+v XF86Paste
# primary-paste=Shift+Insert
# search-start=Control+Shift+r
# font-increase=Control+plus Control+equal Control+KP_Add
# font-decrease=Control+minus Control+KP_Subtract
# font-reset=Control+0 Control+KP_0
# spawn-terminal=Control+Shift+n
# minimize=none
# maximize=none
# fullscreen=none
# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none
# pipe-selected=[xargs -r firefox] none
# show-urls-launch=Control+Shift+u
# show-urls-copy=none
# show-urls-persistent=none
# prompt-prev=Control+Shift+z
# prompt-next=Control+Shift+x
# unicode-input=none
# noop=none
[search-bindings]
# cancel=Control+g Control+c Escape
# commit=Return
# find-prev=Control+r
# find-next=Control+s
# cursor-left=Left Control+b
# cursor-left-word=Control+Left Mod1+b
# cursor-right=Right Control+f
# cursor-right-word=Control+Right Mod1+f
# cursor-home=Home Control+a
# cursor-end=End Control+e
# delete-prev=BackSpace
# delete-prev-word=Mod1+BackSpace Control+BackSpace
# delete-next=Delete
# delete-next-word=Mod1+d Control+Delete
# extend-to-word-boundary=Control+w
# extend-to-next-whitespace=Control+Shift+w
# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
# primary-paste=Shift+Insert
# unicode-input=none
[url-bindings]
# cancel=Control+g Control+c Control+d Escape
# toggle-url-visible=t
[text-bindings]
# \x03=Mod4+c # Map Super+c -> Ctrl+c
[mouse-bindings]
# selection-override-modifiers=Shift
# primary-paste=BTN_MIDDLE
# select-begin=BTN_LEFT
# select-begin-block=Control+BTN_LEFT
# select-extend=BTN_RIGHT
# select-extend-character-wise=Control+BTN_RIGHT
# select-word=BTN_LEFT-2
# select-word-whitespace=Control+BTN_LEFT-2
# select-row=BTN_LEFT-3
# vim: ft=dosini
[colors]
alpha=0.8
foreground=dcdccc
background=111111
## Normal/regular colors (color palette 0-7)
regular0=222222 # black
regular1=cc9393 # red
regular2=7f9f7f # green
regular3=d0bf8f # yellow
regular4=6ca0a3 # blue
regular5=dc8cc3 # magenta
regular6=93e0e3 # cyan
regular7=dcdccc # white
## Bright colors (color palette 8-15)
bright0=666666 # bright black
bright1=dca3a3 # bright red
bright2=bfebbf # bright green
bright3=f0dfaf # bright yellow
bright4=8cd0d3 # bright blue
bright5=fcace3 # bright magenta
bright6=b3ffff # bright cyan
bright7=ffffff # bright white

42
.config/fuzzel/fuzzel.ini Normal file
View File

@ -0,0 +1,42 @@
font=IBM Plex Mono:size=10
icons-enabled=no
fields=filename,name,generic
password-character=*
filter-desktop=yes
fuzzy=yes
# show-actions=no
# terminal=$TERMINAL -e # Note: you cannot actually use environment variables here
# launch-prefix=<not set>
# list-executables-in-path=yes
# anchor=center
# lines=15
width=50
tabs=4
# horizontal-pad=40
# vertical-pad=8
# inner-pad=0
# image-size-ratio=0.5
# line-height=<use font metrics>
# letter-spacing=0
# layer = top
# exit-on-keyboard-focus-loss = yes
[colors]
background=1e1e1edd
text=ffffffff
match=458588ff
selection=2f2f2fdd
selection-text=657b83ff
selection-match=458588ff
[border]
width=0
radius=0
[dmenu]
# mode=text # text|index
# exit-immediately-if-empty=no

View File

@ -0,0 +1,15 @@
[Settings]
gtk-theme-name=Graphite-Dark
gtk-icon-theme-name=Papirus
gtk-font-name=Iosevka JP 10
gtk-cursor-theme-name=Breeze_Dark
gtk-cursor-theme-size=24
gtk-toolbar-style=GTK_TOOLBAR_BOTH
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=1
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

61
.config/htop/htoprc Normal file
View File

@ -0,0 +1,61 @@
# 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.3.0
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=0
hide_running_in_container=0
shadow_other_users=0
show_thread_names=0
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=1
header_margin=1
screen_tabs=0
detailed_cpu_time=0
cpu_count_from_one=0
show_cpu_usage=1
show_cpu_frequency=0
update_process_names=0
account_guest_in_cpu_meter=0
color_scheme=6
enable_mouse=1
delay=15
hide_function_bar=0
header_layout=two_50_50
column_meters_0=AllCPUs MemorySwap
column_meter_modes_0=1 1
column_meters_1=Tasks LoadAverage Uptime Battery
column_meter_modes_1=2 2 4 4
tree_view=0
sort_key=46
tree_sort_key=0
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=PID
.tree_view_always_by_pid=0
.tree_view=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 Command
.sort_key=IO_RATE
.tree_sort_key=PID
.tree_view_always_by_pid=0
.tree_view=0
.sort_direction=-1
.tree_sort_direction=1
.all_branches_collapsed=0

8
.config/hypr/hyprland.conf Executable file
View File

@ -0,0 +1,8 @@
# [[ Javier Hyprland configuration ]]
source = ~/.config/hypr/src/init.conf
source = ~/.config/hypr/src/general.conf
source = ~/.config/hypr/src/env.conf
source = ~/.config/hypr/src/windowrules.conf
source = ~/.config/hypr/src/keybinds.conf
source = ~/.config/hypr/src/scratchpads.conf

View File

@ -0,0 +1,57 @@
[pyprland]
plugins = [
"scratchpads",
"shortcuts_menu",
"expose"
]
[scratchpads.term]
animation = "fromTop"
command = "foot -a term"
class = "term"
size = "75% 60%"
max_size = "1920px 100%"
margin = 50
[scratchpads.music_player]
animation = "fromRight"
command = "foot -a music_player -e ncmpcpp"
class = "music_player"
size = "75% 60%"
max_size = "1920px 100%"
margin = 50
[scratchpads.nnn]
animation = "fromLeft"
command = "foot -a nnn -e nnn"
class = "nnn"
size = "50% 40%"
position = "5% 10%"
max_size = "1920px 100%"
margin = 50
[scratchpads.fetch]
animation = "fromLeft"
command = "foot -a venom_fetch"
class = "venom_fetch"
size = "23% 48%"
position = "5% 10%"
max_size = "1920px 100%"
margin = 50
[shortcuts_menu]
engine = "fuzzel --dmenu"
# parameters = "-p '[prompt] 🍰 ' -dmenu -matching fuzzy -i"
command_start = "💀"
[shortcuts_menu.entries]
"Restart Waybar" = "pkill -9 waybar ; setsid waybar"
"Telegram" = "xdg-open https://web.telegram.org/a/#-1421253041"
"Cinny" = "xdg-open https://app.cinny.in/"
"Scratch" = [
{name="action", options=["sync", "sysup" ]},
"foot -e doas scratch [action]"
]

10
.config/hypr/src/env.conf Executable file
View File

@ -0,0 +1,10 @@
# hyprland env's
env = QT_QPA_PLATFORM,wayland
env = HYPRCURSOR_THEME,Breeze_Dark
env = HYPRCURSOR_SIZE,24
# Set variables
monitor=eDP-1,1920x1080@60,0x0,1
$terminal = footclient
$menu = fuzzel_run

87
.config/hypr/src/general.conf Executable file
View File

@ -0,0 +1,87 @@
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
input {
kb_layout = gb,us
kb_options=grp:win_space_toggle
kb_variant =
kb_model =
numlock_by_default = true
kb_options = ctrl:nocaps
kb_rules =
follow_mouse = 1
touchpad {
natural_scroll = no
}
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
}
general {
gaps_in = 5
gaps_out = 10
border_size = 2
no_border_on_floating = 0
col.active_border = rgba(999999bb)
col.inactive_border = rgba(595959aa)
layout = master
allow_tearing = false
cursor_inactive_timeout = 2
resize_corner = 3
}
decoration {
rounding = 0
blur {
size = 1
passes = 2
new_optimizations = true
xray = false
ignore_opacity = true
}
drop_shadow = no
shadow_range = 4
shadow_render_power = 3
col.shadow = rgba(1a1a1aee)
blurls = waybar
}
animations {
enabled = yes
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default
animation = borderangle, 1, 8, default
animation = fade, 1, 7, default
animation = workspaces, 1, 6, default
}
dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = yes # you probably want this
}
master {
new_is_master = false
drop_at_cursor = false
}
gestures {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
workspace_swipe = 1
}
misc {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
force_default_wallpaper = 0
focus_on_activate = 1
enable_swallow = 1
swallow_regex = ^(Alacritty|foot|footclient)$
}
device:epic-mouse-v1 {
#sensitivity = -0.5
}

13
.config/hypr/src/init.conf Executable file
View File

@ -0,0 +1,13 @@
# Execute your favorite apps at launch
exec-once = pypr
exec-once = swww init
exec-once = cron -f ~/.config/cron/cron.conf
exec-once = waybar
exec-once = mpd --no-daemon "$HOME"/.config/mpd/mpd.conf
exec-once = pipewire
exec-once = pipewire-pulse
exec-once = wireplumber
exec-once = foot --server
exec-once = swayidle -w timeout 500 'swaylock'
exec-once = xrdb ~/.config/.Xdefaults

99
.config/hypr/src/keybinds.conf Executable file
View File

@ -0,0 +1,99 @@
# [[ Keybinds ]]
$mainMod = SUPER
bind = $mainMod, return, exec, $terminal
bind = $mainMod, Q, killactive,
bind = SUPER_SHIFT, Q, exec, sysact
bind = $mainMod, F, exec, hyprctl dispatch togglefloating; pkill -SIGRTMIN+8 waybar # hyprctl dispatch right in your script just so you can exec at the same time
bind = $mainMod SHIFT, F, fullscreen,
bindr = $mainMod, D, exec, $menu
bind = $mainMod, W, exec, chromium
bind = $SUPER_SHIFT, f, exec, wbg
bind = $SUPER_SHIFT, l, exec, swaylock
bind = ,XF86PowerOff, exec, doas zzz -z
bind = $mainMod, P, pseudo, # dwindle
bind = ,Print, exec, grimblast -n copy screen
bind = $mainMod SHIFT,Print, exec, shareurl.sh
bind = $mainMod SHIFT, s, exec, grimblast -n copy area
$screenrecorder= $HOME/.local/bin/scripts/screencast
bind = $mainMod SHIFT, r , exec, $screenrecorder
bind = ALT,m , exec, pypr menu
bind = ALT SHIFT, Return , exec, pypr expose
# [[ KeyChords ]]
bind = $mainMod, SPACE , submap, menusubmap
submap = menusubmap
bind = ,i,exec,foot -e nsxiv ~/pics/classic/art -t -g 1500x700
bind = ,i,submap,reset
bind = ,m,exec,dmenumount
bind = ,m,submap,reset
bind = ,u,exec,dmenuumount
bind = ,u,submap,reset
bind = ,q,exec,sysact
bind = ,q,submap,reset
bind=,escape,submap,reset
submap = reset
# Audio MPC commands
bind = ,XF86AudioPlay, exec, mpc toggle
bind = ,XF86AudioStop, exec, mpc stop
bind = ,XF86AudioNext, exec, mpc next
bind = ,XF86AudioPrev, exec, mpc prev
binde=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+
bindl=, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindl=, XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
# Screen Brightness
bind=,XF86MonBrightnessUp,exec,doas brightnessctl set +10%
bind=,XF86MonBrightnessDown,exec,doas brightnessctl set 10%-
# [[ Window management ]]
# Move focus with mainMod + arrow keys
bind = $mainMod, J, layoutmsg,cyclenext
bind = $mainMod, K, layoutmsg,cycleprev
# Swap windows
bind = $mainMod SHIFT, J, swapnext, next
bind = $mainMod SHIFT, K, swapnext, prev
# Resize windows
bind = $mainMod, l, resizeactive, 40 0
bind = $mainMod, h, resizeactive, -40 0
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# Cycle through ocuped workspaces
bind = ALT, Tab, workspace, m+1
bind = ALT SHIFT, Tab, workspace, m-1
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1
bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2
bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3
bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4
bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5
bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6
bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7
bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8
bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9
bind = $mainMod SHIFT, 0, movetoworkspacesilent, 10
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow

View File

@ -0,0 +1,27 @@
# [[ Scratchpads rules ]]
# Keydind
# window rules
bind = $mainMod Shift,Return,exec,pypr toggle term
$dropterm = (term)$
windowrule = float,$dropterm
windowrule = workspace special silent,$dropterm
windowrule = size 75% 60%,$dropterm
bind = ALT,Return,exec,pypr toggle fetch
$fetch = (venom_fetch)$
windowrule = float,$fetch
windowrule = workspace special silent,$fetch
windowrule = size 75% 60%,$fetch
bind = $mainMod,m,exec,pypr toggle music_player
$music_player = (music_player)$
windowrule = float,$music_player
windowrule = workspace special silent,$music_player
windowrule = size 75% 60%,$music_player
bind = $mainMod,e,exec,pypr toggle nnn
$nnn = (nnn)$
windowrule = float,$nnn
windowrule = workspace special silent,$nnn
windowrule = size 75% 60%,$nnn

View File

218
.config/lazygit/config.yml Executable file
View File

@ -0,0 +1,218 @@
#NOTE: config lives in: Linux: ~/.config/lazygit/config.yml
gui:
# stuff relating to the UI
showIcons: true
scrollHeight: 2 # how many lines you scroll by
scrollPastBottom: true # enable scrolling past the bottom
sidePanelWidth: 0.3333 # number from 0 to 1
expandFocusedSidePanel: false
mainPanelSplitMode: 'flexible' # one of 'horizontal' | 'flexible' | 'vertical'
language: 'auto' # one of 'auto' | 'en' | 'zh' | 'pl' | 'nl' | 'ja' | 'ko'
timeFormat: '02 Jan 06 15:04 MST' # https://pkg.go.dev/time#Time.Format
theme:
lightTheme: false # For terminals with a light background
activeBorderColor:
- "#c678dd"
- bold
inactiveBorderColor:
- "#61afef"
optionsTextColor:
- "#c678dd"
selectedLineBgColor:
- "#61afef"
selectedRangeBgColor:
- "#61afef"
cherryPickedCommitBgColor:
- "#61afef"
cherryPickedCommitFgColor:
- "#abb2bf"
unstagedChangesColor:
- "#c94f6d"
stagedChangesColor:
- "#61a"
commitLength:
show: true
mouseEvents: true
skipDiscardChangeWarning: false
skipStashWarning: false
showFileTree: true # for rendering changes files in a tree format
showListFooter: true # for seeing the '5 of 20' message in list panels
showRandomTip: true
showBottomLine: true # for hiding the bottom information line (unless it has important information to tell you)
showCommandLog: true
commandLogSize: 8
splitDiff: 'auto' # one of 'auto' | 'always'
git:
paging:
colorArg: always
useConfig: false
commit:
signOff: false
merging:
# only applicable to unix users
manualCommit: false
# extra args passed to `git merge`, e.g. --no-ff
args: ''
log:
# one of date-order, author-date-order, topo-order.
# topo-order makes it easier to read the git log graph, but commits may not
# appear chronologically. See https://git-scm.com/docs/git-log#_commit_ordering
order: 'topo-order'
# one of always, never, when-maximised
# this determines whether the git graph is rendered in the commits panel
showGraph: 'when-maximised'
# displays the whole git graph by default in the commits panel (equivalent to passing the `--all` argument to `git log`)
showWholeGraph: false
skipHookPrefix: WIP
autoFetch: true
autoRefresh: true
branchLogCmd: 'git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} --'
allBranchesLogCmd: 'git log --graph --all --color=always --abbrev-commit --decorate --date=relative --pretty=medium'
overrideGpg: false # prevents lazygit from spawning a separate process when using GPG
disableForcePushing: false
parseEmoji: true
diffContextSize: 3 # how many lines of context are shown around a change in diffs
os:
editCommand: '' # see 'Configuring File Editing' section
editCommandTemplate: ''
openCommand: ''
refresher:
refreshInterval: 10 # File/submodule refresh interval in seconds. Auto-refresh can be disabled via option 'git.autoRefresh'.
fetchInterval: 60 # Re-fetch interval in seconds. Auto-fetch can be disabled via option 'git.autoFetch'.
update:
method: prompt # can be: prompt | background | never
days: 14 # how often an update is checked for
reporting: 'undetermined' # one of: 'on' | 'off' | 'undetermined'
confirmOnQuit: false
# determines whether hitting 'esc' will quit the application when there is nothing to cancel/close
quitOnTopLevelReturn: false
disableStartupPopups: false
notARepository: 'prompt' # one of: 'prompt' | 'create' | 'skip' | 'quit'
promptToReturnFromSubprocess: true # display confirmation when subprocess terminates
keybinding:
universal:
quit: 'q'
quit-alt1: '<c-c>' # alternative/alias of quit
return: '<esc>' # return to previous menu, will quit if there's nowhere to return
quitWithoutChangingDirectory: 'Q'
togglePanel: '<tab>' # goto the next panel
prevItem: '<up>' # go one line up
nextItem: '<down>' # go one line down
prevItem-alt: 'k' # go one line up
nextItem-alt: 'j' # go one line down
prevPage: ',' # go to next page in list
nextPage: '.' # go to previous page in list
gotoTop: '<' # go to top of list
gotoBottom: '>' # go to bottom of list
scrollLeft: 'H' # scroll left within list view
scrollRight: 'L' # scroll right within list view
prevBlock: '<left>' # goto the previous block / panel
nextBlock: '<right>' # goto the next block / panel
prevBlock-alt: 'h' # goto the previous block / panel
nextBlock-alt: 'l' # goto the next block / panel
jumpToBlock: ['1', '2', '3', '4', '5'] # goto the Nth block / panel
nextMatch: 'n'
prevMatch: 'N'
optionMenu: 'x' # show help menu
optionMenu-alt1: '?' # show help menu
select: '<space>'
goInto: '<enter>'
openRecentRepos: '<c-r>'
confirm: '<enter>'
confirm-alt1: 'y'
remove: 'd'
new: 'n'
edit: 'e'
openFile: 'o'
scrollUpMain: '<pgup>' # main panel scroll up
scrollDownMain: '<pgdown>' # main panel scroll down
scrollUpMain-alt1: 'K' # main panel scroll up
scrollDownMain-alt1: 'J' # main panel scroll down
scrollUpMain-alt2: '<c-u>' # main panel scroll up
scrollDownMain-alt2: '<c-d>' # main panel scroll down
executeCustomCommand: ':'
createRebaseOptionsMenu: 'm'
pushFiles: 'P'
pullFiles: 'p'
refresh: 'R'
createPatchOptionsMenu: '<c-p>'
nextTab: ']'
prevTab: '['
nextScreenMode: '+'
prevScreenMode: '_'
undo: 'z'
redo: '<c-z>'
filteringMenu: '<c-s>'
diffingMenu: 'W'
diffingMenu-alt: '<c-e>' # deprecated
copyToClipboard: '<c-o>'
submitEditorText: '<enter>'
appendNewline: '<a-enter>'
extrasMenu: '@'
toggleWhitespaceInDiffView: '<c-w>'
increaseContextInDiffView: '}'
decreaseContextInDiffView: '{'
status:
checkForUpdate: 'u'
recentRepos: '<enter>'
files:
commitChanges: 'c'
commitChangesWithoutHook: 'w' # commit changes without pre-commit hook
amendLastCommit: 'A'
commitChangesWithEditor: 'C'
ignoreFile: 'i'
refreshFiles: 'r'
stashAllChanges: 's'
viewStashOptions: 'S'
toggleStagedAll: 'a' # stage/unstage all
viewResetOptions: 'D'
fetch: 'f'
toggleTreeView: '`'
branches:
createPullRequest: 'o'
viewPullRequestOptions: 'O'
checkoutBranchByName: 'c'
forceCheckoutBranch: 'F'
rebaseBranch: 'r'
renameBranch: 'R'
mergeIntoCurrentBranch: 'M'
viewGitFlowOptions: 'i'
fastForward: 'f' # fast-forward this branch from its upstream
pushTag: 'P'
setUpstream: 'u' # set as upstream of checked-out branch
fetchRemote: 'f'
commits:
squashDown: 's'
renameCommit: 'r'
renameCommitWithEditor: 'R'
viewResetOptions: 'g'
markCommitAsFixup: 'f'
createFixupCommit: 'F' # create fixup commit for this commit
squashAboveCommits: 'S'
moveDownCommit: '<c-j>' # move commit down one
moveUpCommit: '<c-k>' # move commit up one
amendToCommit: 'A'
pickCommit: 'p' # pick commit (when mid-rebase)
revertCommit: 't'
cherryPickCopy: 'c'
cherryPickCopyRange: 'C'
pasteCommits: 'v'
tagCommit: 'T'
checkoutCommit: '<space>'
resetCherryPick: '<c-R>'
copyCommitMessageToClipboard: '<c-y>'
openLogMenu: '<c-l>'
viewBisectOptions: 'b'
stash:
popStash: 'g'
commitFiles:
checkoutCommitFile: 'c'
main:
toggleDragSelect: 'v'
toggleDragSelect-alt: 'V'
toggleSelectHunk: 'a'
pickBothHunks: 'b'
submodules:
init: 'i'
update: 'u'
bulkMenu: 'b'

22
.config/lazygit/state.yml Executable file
View File

@ -0,0 +1,22 @@
lastupdatecheck: 0
recentrepos:
- /home/javier/.emacs.d
- /home/javier/.local/src/jpmacs
- /home/javier/.local/src/noobemacs
- /home/javier/.local/src/dwmblocks/dwmblocks
- /home/javier/repos/dwm
- /home/javier/notes
- /home/javier/.dotfiles
- /home/javier/.dotfiles/home/.config/nvim
- /home/javier/.config/nvim
- /home/javier/.local/src/classic
- /home/javier/.dotfiles/home/.local/src/classic
- /home/javier/pics/classic
- /home/javier/repos/st
- /home/javier/.local/src/void-packages
- /home/javier/code/rust/d2b
startuppopupversion: 5
customcommandshistory:
- q
hidecommandlog: false
ignorewhitespaceindiffview: false

25
.config/mako/config Normal file
View File

@ -0,0 +1,25 @@
# [[ Mako config file - JP ]]
font=IBM Plex Mono 14
background-color=#1e1e1eaa
text-color=#ffffff
# Eyecandy config
border-size=0
border-color=#1e1e1e
border-radius=0
layer=overlay
# Size
width=300
height=110
# Show icons in notifications.
icons=1
max-icon-size=64
# Text alignment
text-alignment=left
default-timeout=3000

4
.config/mimeapps.list Normal file
View File

@ -0,0 +1,4 @@
[Default Applications]
application/pdf=org.pwmt.zathura-pdf-poppler.desktop
image/jpeg=nsxiv.desktop
image/png=nsxiv.desktop

706
.config/mpd/database Normal file
View File

@ -0,0 +1,706 @@
info_begin
format: 2
mpd_version: 0.23.14
fs_charset: UTF-8
tag: Artist
tag: ArtistSort
tag: Album
tag: AlbumSort
tag: AlbumArtist
tag: AlbumArtistSort
tag: Title
tag: Track
tag: Name
tag: Genre
tag: Date
tag: OriginalDate
tag: Composer
tag: ComposerSort
tag: Performer
tag: Conductor
tag: Work
tag: Movement
tag: MovementNumber
tag: Ensemble
tag: Location
tag: Grouping
tag: Disc
tag: Label
tag: MUSICBRAINZ_ARTISTID
tag: MUSICBRAINZ_ALBUMID
tag: MUSICBRAINZ_ALBUMARTISTID
tag: MUSICBRAINZ_TRACKID
tag: MUSICBRAINZ_RELEASETRACKID
tag: MUSICBRAINZ_WORKID
info_end
directory: Annihilator - Alice In Hell
mtime: 1710237521
begin: Annihilator - Alice In Hell
song_begin: 01 - Crystal Ann.mp3
Time: 100.940000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Crystal Ann
Album: Alice In Hell
Track: 1
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 02 - Alison Hell..mp3
Time: 300.803000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Alison Hell
Album: Alice In Hell
Track: 2
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters/Jon Bates
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710843107
song_end
song_begin: 03 - W.T.Y.D..mp3
Time: 236.228000
Artist: Annihilator
AlbumArtist: Annihilator
Title: W.T.Y.D.
Album: Alice In Hell
Track: 3
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters/Jon Bates
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 04 - Wicked Mystic.mp3
Time: 218.047000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Wicked Mystic
Album: Alice In Hell
Track: 4
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters/Jody Weil
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 05 - Burns Like A Buzzsaw Blade.mp3
Time: 213.684000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Burns Like A Buzzsaw Blade
Album: Alice In Hell
Track: 5
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters/Jody Weil/Jon Bates
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 06 - Word Salad.mp3
Time: 349.417000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Word Salad
Album: Alice In Hell
Track: 6
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 07 - Schizos (Are Never Alone) Parts I & II.mp3
Time: 272.460000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Schizos (Are Never Alone) Parts I & II
Album: Alice In Hell
Track: 7
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 08 - Ligeia.mp3
Time: 287.480000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Ligeia
Album: Alice In Hell
Track: 8
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 09 - Human Insecticide.mp3
Time: 290.850000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Human Insecticide
Album: Alice In Hell
Track: 9
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters/Jon Bates
Disc: 1
Label: Roadrunner Records
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 10 - Powerdrain (Demo).mp3
Time: 169.381000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Powerdrain (Demo)
Album: Alice In Hell
Track: 10
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters
Disc: 1
Label: Zebralution
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 11 - Schizos (Are Never Alone) Parts I & II (Demo).mp3
Time: 258.563000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Schizos (Are Never Alone) - Parts I & II (Demo)
Album: Alice In Hell
Track: 11
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters
Disc: 1
Label: Zebralution
Format: 44100:24:2
mtime: 1710237521
song_end
song_begin: 12 - Ligeia (Demo).mp3
Time: 296.205000
Artist: Annihilator
AlbumArtist: Annihilator
Title: Ligeia (Demo)
Album: Alice In Hell
Track: 12
Date: 1989
Genre: Technical Speed/Thrash Metal
Composer: Jeff Waters
Disc: 1
Label: Zebralution
Format: 44100:24:2
mtime: 1710237522
song_end
end: Annihilator - Alice In Hell
directory: Killemall
mtime: 1710237522
begin: Killemall
song_begin: 01 - Metallica - Hit The Lights.mp3
Time: 256.522000
Artist: Metallica
Title: Hit The Lights
Album: Kill 'em All
Track: 1
Date: 1983
Genre: Thrash Metal
Composer: Dave Mustaine/James Hetfield/Lars Ulrich/R. McGovney
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 02 - Metallica - The Four Horsemen.mp3
Time: 429.565000
Artist: Metallica
AlbumArtist: Metallica
Title: The Four Horsemen
Album: Kill 'em All
Track: 2
Date: 1983
Date: 1983
Genre: Thrash Metal
Composer: Dave Mustaine/James Hetfield/Lars Ulrich
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 03 - Metallica - Motorbreath.mp3
Time: 183.544000
Artist: Metallica
AlbumArtist: Metallica
Title: Motorbreath
Album: Kill 'em All
Track: 3
Date: 1983
Date: 1983
Genre: Thrash Metal
Composer: James Hetfield
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 04 - Metallica - Jump In The Fire.mp3
Time: 279.544000
Artist: Metallica
AlbumArtist: Metallica
Title: Jump In The Fire
Album: Kill 'em All
Track: 4
Date: 1983
Date: 1983
Genre: Thrash Metal
Composer: Dave Mustaine/James Hetfield/Lars Ulrich
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 05 - Metallica - (Anesthesia) - Pulling Teeth.mp3
Time: 254.545000
Artist: Metallica
AlbumArtist: Metallica
Title: (Anesthesia) - Pulling Teeth
Album: Kill 'em All
Track: 5
Date: 1983
Date: 1983
Genre: Thrash Metal
Composer: Cliff Burton
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 06 - Metallica - Whiplash.mp3
Time: 247.048000
Artist: Metallica
AlbumArtist: Metallica
Title: Whiplash
Album: Kill 'em All
Track: 6
Date: 1983
Date: 1983
Genre: Thrash Metal
Composer: James Hetfield/Lars Ulrich
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 07 - Metallica - Phantom Lord.mp3
Time: 297.542000
Artist: Metallica
AlbumArtist: Metallica
Title: Phantom Lord
Album: Kill 'em All
Track: 7
Date: 1983
Date: 1983
Genre: Thrash Metal
Composer: Dave Mustaine/James Hetfield/Lars Ulrich
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 08 - Metallica - No Remorse.mp3
Time: 383.033000
Artist: Metallica
Title: No Remorse
Album: Kill 'em All
Track: 8
Date: 1984
Genre: Thrash Metal
Composer: James Hetfield/Lars Ulrich
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 09 - Metallica - Seek And Destroy.mp3
Time: 415.041000
Artist: Metallica
AlbumArtist: Metallica
Title: Seek And Destroy
Album: Kill 'em All
Track: 9
Date: 1984
Date: 1984
Genre: Thrash Metal
Composer: James Hetfield/Lars Ulrich
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 10 - Metallica - Metal Militia.mp3
Time: 309.062000
Artist: Metallica
AlbumArtist: Metallica
Title: Metal Militia
Album: Kill 'em All
Track: 10
Date: 1983
Date: 1983
Genre: Thrash Metal
Composer: Dave Mustaine/James Hetfield/Lars Ulrich
Label: Warner Bros.
Format: 44100:24:2
mtime: 1710237522
song_end
end: Killemall
directory: Revocation
mtime: 1710237523
begin: Revocation
song_begin: 01 - Cretin.mp3
Time: 183.431000
Artist: Revocation
Title: Cretin
Album: Chaos of Forms
Track: 1
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 02 - Cradle Robber.mp3
Time: 264.986000
Artist: Revocation
Title: Cradle Robber
Album: Chaos of Forms
Track: 2
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 03 - Harlot.mp3
Time: 171.546000
Artist: Revocation
Title: Harlot
Album: Chaos of Forms
Track: 3
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 04 - Dissolution Ritual.mp3
Time: 277.394000
Artist: Revocation
Title: Dissolution Ritual
Album: Chaos of Forms
Track: 4
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 05 - Conjuring the Cataclysm.mp3
Time: 273.841000
Artist: Revocation
Title: Conjuring the Cataclysm
Album: Chaos of Forms
Track: 5
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 06 - No Funeral.mp3
Time: 235.128000
Artist: Revocation
Title: No Funeral
Album: Chaos of Forms
Track: 6
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 07 - Fractal Entity.mp3
Time: 103.288000
Artist: Revocation
Title: Fractal Entity
Album: Chaos of Forms
Track: 7
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237522
song_end
song_begin: 08 - Chaos of Forms.mp3
Time: 270.053000
Artist: Revocation
Title: Chaos of Forms
Album: Chaos of Forms
Track: 8
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 09 - The Watchers.mp3
Time: 252.133000
Artist: Revocation
Title: The Watchers
Album: Chaos of Forms
Track: 9
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 10 - Beloved Horrifier.mp3
Time: 249.077000
Artist: Revocation
Title: Beloved Horrifier
Album: Chaos of Forms
Track: 10
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 11 - Dethroned.mp3
Time: 297.769000
Artist: Revocation
Title: Dethroned
Album: Chaos of Forms
Track: 11
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 12 - Reprogrammed.mp3
Time: 243.226000
Artist: Revocation
Title: Reprogrammed
Album: Chaos of Forms
Track: 12
Date: 2011
Genre: Metal
Label: Relapse
Format: 44100:24:2
mtime: 1710237523
song_end
end: Revocation
directory: Revocation - Teratogenesis (EP) (2012)
mtime: 1710237524
begin: Revocation - Teratogenesis (EP) (2012)
song_begin: 01. The Grip Tightens.mp3
Time: 250.935000
Artist: Revocation
AlbumArtist: Revocation
Title: The Grip Tightens
Album: Teratogenesis
Track: 1
Date: 2012
Genre: Technical Death | Thrash Meal
Format: 44100:24:2
mtime: 1710237524
song_end
song_begin: 02. Spurn The Outstretched Hand.mp3
Time: 247.539000
Artist: Revocation
AlbumArtist: Revocation
Title: Spurn The Outstreched Hand
Album: Teratogenesis
Track: 2
Date: 2012
Genre: Technical Death | Thrash Meal
Format: 44100:24:2
mtime: 1710237524
song_end
song_begin: 03. Maniacally Unleashed.mp3
Time: 221.469000
Artist: Revocation
AlbumArtist: Revocation
Title: Maniacally Unleashed
Album: Teratogenesis
Track: 3
Date: 2012
Genre: Technical Death | Thrash Meal
Format: 44100:24:2
mtime: 1710237524
song_end
song_begin: 04. Teratogenesis.mp3
Time: 246.285000
Artist: Revocation
AlbumArtist: Revocation
Title: Teratogenesis
Album: Teratogenesis
Track: 4
Date: 2012
Genre: Technical Death | Thrash Meal
Format: 44100:24:2
mtime: 1710237524
song_end
song_begin: 05. Bound By Desire.mp3
Time: 334.631000
Artist: Revocation
AlbumArtist: Revocation
Title: Bound By Desire
Album: Teratogenesis
Track: 5
Date: 2012
Genre: Technical Death | Thrash Meal
Format: 44100:24:2
mtime: 1710237524
song_end
end: Revocation - Teratogenesis (EP) (2012)
directory: Revocation - Existence Is Futile (2009)
mtime: 1710237524
begin: Revocation - Existence Is Futile (2009)
song_begin: 01. Enter The Hall.mp3
Time: 147.513000
Artist: Revocation
Title: Enter The Hall
Album: Existence Is Futile
Track: 1
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 02. Pestilence Reigns.mp3
Time: 273.815000
Artist: Revocation
Title: Pestilence Reigns
Album: Existence Is Futile
Track: 2
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 03. Deathonomics.mp3
Time: 222.537000
Artist: Revocation
Title: Deathonomics
Album: Existence Is Futile
Track: 3
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 04. Existence Is Futile.mp3
Time: 290.847000
Artist: Revocation
Title: Existence Is Futile
Album: Existence Is Futile
Track: 4
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 05. The Brain Scramblers.mp3
Time: 191.712000
Artist: Revocation
Title: The Brain Scramblers
Album: Existence Is Futile
Track: 5
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 06. Across Forests And Fjords.mp3
Time: 256.182000
Artist: Revocation
Title: Across Forests And Fjords
Album: Existence Is Futile
Track: 6
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 07. Re-Animaniac.mp3
Time: 198.426000
Artist: Revocation
Title: Re-Animaniac
Album: Existence Is Futile
Track: 7
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237523
song_end
song_begin: 08. Dismantle The Dictator.mp3
Time: 237.766000
Artist: Revocation
Title: Dismantle The Dictator
Album: Existence Is Futile
Track: 8
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237524
song_end
song_begin: 09. Anthem of the Betrayed.mp3
Time: 316.577000
Artist: Revocation
Title: Anthem Of The Betrayed
Album: Existence Is Futile
Track: 9
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237524
song_end
song_begin: 10. Leviathan Awaits.mp3
Time: 288.000000
Artist: Revocation
Title: Leviathan Awaits
Album: Existence Is Futile
Track: 10
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237524
song_end
song_begin: 11. The Tragedy Of Modern Ages.mp3
Time: 424.228000
Artist: Revocation
Title: The Tragedy Of Modern Ages
Album: Existence Is Futile
Track: 11
Date: 2009
Genre: Technical DeathThrash Metal
Format: 44100:24:2
mtime: 1710237524
song_end
end: Revocation - Existence Is Futile (2009)

825
.config/mpd/log Normal file
View File

@ -0,0 +1,825 @@
Feb 11 15:59 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 15:59 : update: added Annihilator - Alice In Hell/01 - Crystal Ann.mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/02 - Alison Hell..mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/03 - W.T.Y.D..mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/04 - Wicked Mystic.mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/05 - Burns Like A Buzzsaw Blade.mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/06 - Word Salad.mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/07 - Schizos (Are Never Alone) Parts I & II.mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/08 - Ligeia.mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/09 - Human Insecticide.mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/10 - Powerdrain (Demo).mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/11 - Schizos (Are Never Alone) Parts I & II (Demo).mp3
Feb 11 15:59 : update: added Annihilator - Alice In Hell/12 - Ligeia (Demo).mp3
Feb 11 15:59 : update: added Killemall/01 - Metallica - Hit The Lights.mp3
Feb 11 15:59 : update: added Killemall/02 - Metallica - The Four Horsemen.mp3
Feb 11 15:59 : update: added Killemall/03 - Metallica - Motorbreath.mp3
Feb 11 15:59 : update: added Killemall/04 - Metallica - Jump In The Fire.mp3
Feb 11 15:59 : update: added Killemall/05 - Metallica - (Anesthesia) - Pulling Teeth.mp3
Feb 11 15:59 : update: added Killemall/06 - Metallica - Whiplash.mp3
Feb 11 15:59 : update: added Killemall/07 - Metallica - Phantom Lord.mp3
Feb 11 15:59 : update: added Killemall/08 - Metallica - No Remorse.mp3
Feb 11 15:59 : update: added Killemall/09 - Metallica - Seek And Destroy.mp3
Feb 11 15:59 : update: added Killemall/10 - Metallica - Metal Militia.mp3
Feb 11 15:59 : update: added Revocation/01 - Cretin.mp3
Feb 11 15:59 : update: added Revocation/02 - Cradle Robber.mp3
Feb 11 15:59 : update: added Revocation/03 - Harlot.mp3
Feb 11 15:59 : update: added Revocation/04 - Dissolution Ritual.mp3
Feb 11 15:59 : update: added Revocation/05 - Conjuring the Cataclysm.mp3
Feb 11 15:59 : update: added Revocation/06 - No Funeral.mp3
Feb 11 15:59 : update: added Revocation/07 - Fractal Entity.mp3
Feb 11 15:59 : update: added Revocation/08 - Chaos of Forms.mp3
Feb 11 15:59 : update: added Revocation/09 - The Watchers.mp3
Feb 11 15:59 : update: added Revocation/10 - Beloved Horrifier.mp3
Feb 11 15:59 : update: added Revocation/11 - Dethroned.mp3
Feb 11 15:59 : update: added Revocation/12 - Reprogrammed.mp3
Feb 11 15:59 : update: added Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3
Feb 11 15:59 : update: added Revocation - Teratogenesis (EP) (2012)/02. Spurn The Outstretched Hand.mp3
Feb 11 15:59 : update: added Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3
Feb 11 15:59 : update: added Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3
Feb 11 15:59 : update: added Revocation - Teratogenesis (EP) (2012)/05. Bound By Desire.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/01. Enter The Hall.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/02. Pestilence Reigns.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/03. Deathonomics.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/04. Existence Is Futile.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/05. The Brain Scramblers.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/06. Across Forests And Fjords.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/07. Re-Animaniac.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/09. Anthem of the Betrayed.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/10. Leviathan Awaits.mp3
Feb 11 15:59 : update: added Revocation - Existence Is Futile (2009)/11. The Tragedy Of Modern Ages.mp3
Feb 11 16:00 : mixer: Failed to read mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 16:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 16:00 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:00 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:00 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 16:00 : mixer: Failed to read mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:08 : exception: Failed to open "Alsa Sound Server" (alsa); Failed to open ALSA device "default": Device or resource busy
Feb 11 16:10 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:30 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:30 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Feb 11 16:41 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 16:41 : exception: inotify_add_watch() has failed: No such file or directory
Feb 11 16:41 : mixer: Failed to read mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:41 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:43 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 16:43 : mixer: Failed to read mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:43 : output: Failed to open mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:43 : mixer: Failed to set mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:43 : exception: Failed to set mixer for 'Alsa Sound Server'; no such mixer control: PCM
Feb 11 16:45 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:47 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 16:47 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Feb 11 16:56 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 16:56 : mixer: Failed to read mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/03 - W.T.Y.D..mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/12 - Ligeia (Demo).mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/05 - Burns Like A Buzzsaw Blade.mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/02 - Alison Hell..mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/01 - Crystal Ann.mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/06 - Word Salad.mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/09 - Human Insecticide.mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/11 - Schizos (Are Never Alone) Parts I & II (Demo).mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/04 - Wicked Mystic.mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/10 - Powerdrain (Demo).mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/08 - Ligeia.mp3
Feb 11 16:57 : update: updating Annihilator - Alice In Hell/07 - Schizos (Are Never Alone) Parts I & II.mp3
Feb 11 16:57 : update: updating Revocation/01 - Cretin.mp3
Feb 11 16:57 : update: updating Revocation/08 - Chaos of Forms.mp3
Feb 11 16:57 : update: updating Revocation/09 - The Watchers.mp3
Feb 11 16:57 : update: updating Revocation/05 - Conjuring the Cataclysm.mp3
Feb 11 16:57 : update: updating Revocation/12 - Reprogrammed.mp3
Feb 11 16:57 : update: updating Revocation/04 - Dissolution Ritual.mp3
Feb 11 16:57 : update: updating Revocation/03 - Harlot.mp3
Feb 11 16:57 : update: updating Revocation/11 - Dethroned.mp3
Feb 11 16:57 : update: updating Revocation/07 - Fractal Entity.mp3
Feb 11 16:57 : update: updating Revocation/10 - Beloved Horrifier.mp3
Feb 11 16:57 : update: updating Revocation/06 - No Funeral.mp3
Feb 11 16:57 : update: updating Revocation/02 - Cradle Robber.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/06. Across Forests And Fjords.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/05. The Brain Scramblers.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/10. Leviathan Awaits.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/03. Deathonomics.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/04. Existence Is Futile.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/07. Re-Animaniac.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/02. Pestilence Reigns.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/01. Enter The Hall.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/11. The Tragedy Of Modern Ages.mp3
Feb 11 16:57 : update: updating Revocation - Existence Is Futile (2009)/09. Anthem of the Betrayed.mp3
Feb 11 16:57 : update: updating Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3
Feb 11 16:57 : update: updating Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3
Feb 11 16:57 : update: updating Revocation - Teratogenesis (EP) (2012)/05. Bound By Desire.mp3
Feb 11 16:57 : update: updating Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3
Feb 11 16:57 : update: updating Revocation - Teratogenesis (EP) (2012)/02. Spurn The Outstretched Hand.mp3
Feb 11 16:57 : update: updating Killemall/09 - Metallica - Seek And Destroy.mp3
Feb 11 16:57 : update: updating Killemall/04 - Metallica - Jump In The Fire.mp3
Feb 11 16:57 : update: updating Killemall/03 - Metallica - Motorbreath.mp3
Feb 11 16:57 : update: updating Killemall/07 - Metallica - Phantom Lord.mp3
Feb 11 16:57 : update: updating Killemall/10 - Metallica - Metal Militia.mp3
Feb 11 16:57 : update: updating Killemall/05 - Metallica - (Anesthesia) - Pulling Teeth.mp3
Feb 11 16:57 : update: updating Killemall/08 - Metallica - No Remorse.mp3
Feb 11 16:57 : update: updating Killemall/01 - Metallica - Hit The Lights.mp3
Feb 11 16:57 : update: updating Killemall/06 - Metallica - Whiplash.mp3
Feb 11 16:57 : update: updating Killemall/02 - Metallica - The Four Horsemen.mp3
Feb 11 16:57 : output: Failed to open mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 16:57 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Feb 11 16:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 17:03 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 17:06 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 17:06 : mixer: Failed to read mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 17:06 : output: Failed to open mixer for 'Alsa Sound Server': no such mixer control: PCM
Feb 11 17:06 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Feb 11 17:07 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 17:07 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 17:09 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 17:11 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 17:11 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Feb 11 17:11 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 17:14 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 17:16 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 17:16 : player: played "Revocation/06 - No Funeral.mp3"
Feb 11 17:16 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 17:24 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:19 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 18:19 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:19 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:19 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 11 18:19 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 18:20 : exception: Failed to enable output "pulse audio" (pulse); pa_context_connect() has failed: Connection refused
Feb 11 18:20 : exception: Failed to enable output "pulse audio" (pulse); pa_context_connect() has failed: Connection refused
Feb 11 18:20 : exception: Failed to open audio output
Feb 11 18:20 : exception: Failed to enable output "pulse audio" (pulse); pa_context_connect() has failed: Connection refused
Feb 11 18:20 : exception: Failed to enable output "pulse audio" (pulse); pa_context_connect() has failed: Connection refused
Feb 11 18:21 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:21 : player: played "Killemall/02 - Metallica - The Four Horsemen.mp3"
Feb 11 18:21 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 18:22 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:22 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 11 18:22 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 18:22 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 11 18:23 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:23 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 18:25 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:26 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 11 18:48 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 11 18:49 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 15:52 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 15:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 15:57 : output: Failed to pause "pulse audio" (pulse): failed to connect the stream: Connection terminated
Feb 12 15:57 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 15:59 : player: played "Revocation/07 - Fractal Entity.mp3"
Feb 12 15:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 15:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 15:59 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 16:03 : player: played "Revocation/06 - No Funeral.mp3"
Feb 12 16:04 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 16:05 : exception: Failed to open "pipewire audio" (pipewire); Failed to connect stream: Host is down
Feb 12 16:05 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 16:05 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Feb 12 16:05 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 16:07 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 16:11 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 16:12 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 17:46 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 17:46 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 17:48 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 17:49 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 17:50 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:17 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:17 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:20 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:22 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Feb 12 18:24 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:24 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 18:24 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:44 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:44 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:44 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:45 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:45 : player: played "Revocation/06 - No Funeral.mp3"
Feb 12 18:46 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:46 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Feb 12 18:48 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:49 : output: Failed to play on "pipewire audio" (pipewire): connection error
Feb 12 18:49 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:49 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 18:49 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:49 : exception: Failed to open "pipewire audio" (pipewire); Failed to connect stream: Host is down
Feb 12 18:50 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:50 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 18:50 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 18:51 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 18:51 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 19:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 19:03 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 19:05 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 19:07 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 19:09 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 19:11 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 19:16 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Feb 12 19:16 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 19:16 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 19:25 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 19:27 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 19:29 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 19:31 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 19:32 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 19:33 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 19:38 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 19:41 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 19:42 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 19:44 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 20:30 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 20:30 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 20:31 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 20:46 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 20:47 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 20:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 20:57 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 20:58 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 20:58 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 20:58 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 20:58 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 21:02 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 21:02 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 21:02 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 21:11 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 21:13 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 21:28 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 21:28 : player: played "Revocation - Teratogenesis (EP) (2012)/02. Spurn The Outstretched Hand.mp3"
Feb 12 21:28 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 21:28 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 22:00 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 22:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 22:05 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Feb 12 22:06 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 22:06 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 22:13 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 22:13 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 22:15 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 22:15 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:16 : exception: Not playing
Feb 12 22:21 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 22:43 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 22:43 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 22:43 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 22:44 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 22:48 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 22:55 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 22:55 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 12 22:58 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 12 22:59 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Feb 12 23:00 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 12 23:00 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Feb 12 23:00 : output: Failed to play on "PipeWire Sound Server" (pipewire): connection error
Feb 12 23:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 04:47 : player: played "Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3"
Feb 13 04:49 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 04:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 04:54 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 04:58 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Feb 13 04:58 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 15:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 15:54 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 15:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 15:59 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Feb 13 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 16:50 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 16:50 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 16:51 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 16:52 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 20:39 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 20:39 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 20:40 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 20:40 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 21:18 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 21:19 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 21:19 : output: Failed to play on "PipeWire Sound Server" (pipewire): connection error
Feb 13 21:19 : player: played "Annihilator - Alice In Hell/04 - Wicked Mystic.mp3"
Feb 13 21:19 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 21:20 : player: played "Killemall/03 - Metallica - Motorbreath.mp3"
Feb 13 21:22 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 21:23 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 21:24 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 21:25 : exception: Failed to open "PipeWire Sound Server" (pipewire); Failed to connect stream: Host is down
Feb 13 21:25 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Feb 13 21:26 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 21:27 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 22:09 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 22:09 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 22:21 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Feb 13 22:21 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Feb 13 22:22 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 03:11 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 03:11 : exception: inotify_add_watch() has failed: No such file or directory
Mar 12 03:11 : exception: Failed to access /home/javier/music: No such file or directory
Mar 12 03:11 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 03:11 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 03:12 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 03:12 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 03:12 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 04:57 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 04:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 04:58 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 04:58 : update: added Annihilator - Alice In Hell/08 - Ligeia.mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/05 - Burns Like A Buzzsaw Blade.mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/01 - Crystal Ann.mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/06 - Word Salad.mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/09 - Human Insecticide.mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/02 - Alison Hell..mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/07 - Schizos (Are Never Alone) Parts I & II.mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/12 - Ligeia (Demo).mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/10 - Powerdrain (Demo).mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/04 - Wicked Mystic.mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/03 - W.T.Y.D..mp3
Mar 12 04:58 : update: added Annihilator - Alice In Hell/11 - Schizos (Are Never Alone) Parts I & II (Demo).mp3
Mar 12 04:58 : update: added Killemall/09 - Metallica - Seek And Destroy.mp3
Mar 12 04:58 : update: added Killemall/03 - Metallica - Motorbreath.mp3
Mar 12 04:58 : update: added Killemall/04 - Metallica - Jump In The Fire.mp3
Mar 12 04:58 : update: added Killemall/05 - Metallica - (Anesthesia) - Pulling Teeth.mp3
Mar 12 04:58 : update: added Killemall/02 - Metallica - The Four Horsemen.mp3
Mar 12 04:58 : update: added Killemall/06 - Metallica - Whiplash.mp3
Mar 12 04:58 : update: added Killemall/01 - Metallica - Hit The Lights.mp3
Mar 12 04:58 : update: added Killemall/08 - Metallica - No Remorse.mp3
Mar 12 04:58 : update: added Killemall/07 - Metallica - Phantom Lord.mp3
Mar 12 04:58 : update: added Killemall/10 - Metallica - Metal Militia.mp3
Mar 12 04:58 : update: added Revocation/11 - Dethroned.mp3
Mar 12 04:58 : update: added Revocation/04 - Dissolution Ritual.mp3
Mar 12 04:58 : update: added Revocation/05 - Conjuring the Cataclysm.mp3
Mar 12 04:58 : update: added Revocation/10 - Beloved Horrifier.mp3
Mar 12 04:58 : update: added Revocation/07 - Fractal Entity.mp3
Mar 12 04:58 : update: added Revocation/03 - Harlot.mp3
Mar 12 04:58 : update: added Revocation/08 - Chaos of Forms.mp3
Mar 12 04:58 : update: added Revocation/09 - The Watchers.mp3
Mar 12 04:58 : update: added Revocation/06 - No Funeral.mp3
Mar 12 04:58 : update: added Revocation/12 - Reprogrammed.mp3
Mar 12 04:58 : update: added Revocation/02 - Cradle Robber.mp3
Mar 12 04:58 : update: added Revocation/01 - Cretin.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/05. The Brain Scramblers.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/11. The Tragedy Of Modern Ages.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/09. Anthem of the Betrayed.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/02. Pestilence Reigns.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/06. Across Forests And Fjords.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/03. Deathonomics.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/04. Existence Is Futile.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/10. Leviathan Awaits.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/01. Enter The Hall.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/07. Re-Animaniac.mp3
Mar 12 04:58 : update: added Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3
Mar 12 04:58 : update: added Revocation - Teratogenesis (EP) (2012)/02. Spurn The Outstretched Hand.mp3
Mar 12 04:58 : update: added Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3
Mar 12 04:58 : update: added Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3
Mar 12 04:58 : update: added Revocation - Teratogenesis (EP) (2012)/03. Maniacally Unleashed.mp3
Mar 12 04:58 : update: added Revocation - Teratogenesis (EP) (2012)/05. Bound By Desire.mp3
Mar 12 04:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 04:59 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 12 05:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 05:03 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 16:06 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 16:19 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Mar 12 16:19 : exception: Not playing
Mar 12 16:19 : exception: Not playing
Mar 12 16:19 : exception: Not playing
Mar 12 16:19 : exception: Not playing
Mar 12 16:19 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Mar 12 16:20 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Mar 12 16:20 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 19:56 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Mar 12 19:56 : exception: Not playing
Mar 12 19:56 : exception: Not playing
Mar 12 19:58 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:00 : exception: Not playing
Mar 12 20:00 : exception: Not playing
Mar 12 20:00 : exception: Not playing
Mar 12 20:00 : exception: Not playing
Mar 12 20:01 : exception: Not playing
Mar 12 20:01 : exception: Not playing
Mar 12 20:03 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:16 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:19 : player: played "Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3"
Mar 12 20:19 : exception: Not playing
Mar 12 20:19 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Mar 12 20:20 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:24 : player: played "Killemall/06 - Metallica - Whiplash.mp3"
Mar 12 20:26 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:30 : player: played "Killemall/07 - Metallica - Phantom Lord.mp3"
Mar 12 20:32 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:35 : player: played "Killemall/10 - Metallica - Metal Militia.mp3"
Mar 12 20:37 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:41 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Mar 12 20:43 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 20:48 : player: played "Killemall/09 - Metallica - Seek And Destroy.mp3"
Mar 12 20:50 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:02 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:04 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 12 21:04 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 12 21:06 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:08 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 12 21:10 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:15 : player: played "Killemall/02 - Metallica - The Four Horsemen.mp3"
Mar 12 21:17 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:18 : player: played "Killemall/03 - Metallica - Motorbreath.mp3"
Mar 12 21:20 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 12 21:20 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:26 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:30 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:32 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 12 21:32 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 21:50 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 12 21:52 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 22:00 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 12 22:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 22:04 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 22:05 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 12 22:07 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 22:13 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 12 22:15 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 22:19 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 22:54 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 12 22:54 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 12 22:55 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 22:56 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 12 22:59 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 12 23:00 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 12 23:00 : exception: Bad song index
Mar 12 23:00 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 13 05:06 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 16:00 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 13 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 18:33 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 13 18:35 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 18:35 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Mar 13 18:37 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 18:38 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 18:38 : player: played "Annihilator - Alice In Hell/04 - Wicked Mystic.mp3"
Mar 13 18:38 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 13 19:23 : exception: Bad song index
Mar 13 19:24 : exception: Bad song index
Mar 13 19:26 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:34 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:35 : player: played "Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3"
Mar 13 19:36 : exception: Not playing
Mar 13 19:36 : exception: Not playing
Mar 13 19:36 : exception: Bad song index
Mar 13 19:37 : exception: Bad song index
Mar 13 19:37 : exception: Bad song index
Mar 13 19:37 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:38 : exception: Bad song index
Mar 13 19:38 : exception: Bad song index
Mar 13 19:38 : exception: Bad song index
Mar 13 19:39 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:40 : player: played "Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3"
Mar 13 19:42 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:44 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:46 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Mar 13 19:48 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:50 : player: played "Annihilator - Alice In Hell/04 - Wicked Mystic.mp3"
Mar 13 19:52 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:54 : player: played "Annihilator - Alice In Hell/09 - Human Insecticide.mp3"
Mar 13 19:56 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 19:59 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 13 20:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 20:04 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 21:51 : player: played "Killemall/02 - Metallica - The Four Horsemen.mp3"
Mar 13 21:53 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 21:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 13 21:54 : output: Failed to play on "PipeWire Sound Server" (pipewire): connection error
Mar 13 21:54 : player: played "Killemall/02 - Metallica - The Four Horsemen.mp3"
Mar 13 21:55 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 14 18:33 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 15 20:33 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 15 20:38 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 15 21:32 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 15 22:08 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 15 22:08 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 15 22:08 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 15 22:09 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 15 22:09 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 15 22:10 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 15 22:11 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 16 21:50 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 03:21 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 17 05:41 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 05:42 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 17 16:55 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 17 17:03 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 17 17:53 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 17:53 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 17:53 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 17 19:10 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 17 19:10 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 17 19:15 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 17 19:15 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:19 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:20 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 17 19:22 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:24 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Mar 17 19:26 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:28 : player: played "Annihilator - Alice In Hell/04 - Wicked Mystic.mp3"
Mar 17 19:30 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:32 : player: played "Annihilator - Alice In Hell/09 - Human Insecticide.mp3"
Mar 17 19:34 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:37 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 17 19:39 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:44 : player: played "Killemall/02 - Metallica - The Four Horsemen.mp3"
Mar 17 19:46 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:49 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 17 19:51 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:55 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Mar 17 19:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 19:59 : player: played "Revocation/02 - Cradle Robber.mp3"
Mar 17 20:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 20:03 : player: played "Revocation/06 - No Funeral.mp3"
Mar 17 20:05 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 20:07 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Mar 17 20:09 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 20:12 : player: played "Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3"
Mar 17 20:14 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 20:17 : player: played "Revocation - Teratogenesis (EP) (2012)/05. Bound By Desire.mp3"
Mar 17 20:19 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 20:21 : player: played "Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3"
Mar 17 20:23 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 20:26 : player: played "Revocation - Existence Is Futile (2009)/10. Leviathan Awaits.mp3"
Mar 17 20:28 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 21:46 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 21:46 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 21:46 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 17 21:47 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 18 00:20 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 18 21:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 18 21:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 18 21:58 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 18 22:22 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 18 22:46 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 18 22:49 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 18 22:49 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 18 22:51 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 05:10 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 19 05:10 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 19 05:10 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 05:11 : update: updating Annihilator - Alice In Hell/02 - Alison Hell..mp3
Mar 19 05:11 : update: updating Annihilator - Alice In Hell/02 - Alison Hell..mp3
Mar 19 05:11 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 19 05:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 05:15 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 19 05:16 : player: played "Revocation/06 - No Funeral.mp3"
Mar 19 18:49 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 19:38 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 19:38 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 19:38 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 19 19:41 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 19:42 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 19 20:22 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 20:22 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 19 21:19 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 19 21:20 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 20 15:51 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 20 15:51 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 21 11:04 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 21 11:21 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 21 12:00 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 21 12:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:05 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 21 12:07 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:09 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Mar 21 12:11 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:13 : player: played "Annihilator - Alice In Hell/04 - Wicked Mystic.mp3"
Mar 21 12:15 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:18 : player: played "Annihilator - Alice In Hell/09 - Human Insecticide.mp3"
Mar 21 12:20 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:22 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 21 12:24 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:29 : player: played "Killemall/02 - Metallica - The Four Horsemen.mp3"
Mar 21 12:31 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:34 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 21 12:36 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:40 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Mar 21 12:40 : player: played "Revocation/02 - Cradle Robber.mp3"
Mar 21 12:42 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:54 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 21 12:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 12:54 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 21 21:15 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 21 21:15 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 22 05:06 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 22 21:51 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 22 21:51 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 22 22:40 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 22 22:41 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 23 13:40 : exception: Not playing
Mar 23 14:20 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 23 14:20 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 23 14:25 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 23 14:27 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 23 14:44 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 23 14:45 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 23 14:46 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 23 14:47 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 24 18:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 24 18:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 24 18:02 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 24 21:45 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 24 21:45 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 24 22:18 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 25 15:05 : exception: Not playing
Mar 25 16:05 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 25 16:05 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 25 16:05 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 25 17:15 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 25 21:02 : exception: Not playing
Mar 25 21:02 : exception: Not playing
Mar 25 21:02 : exception: Not playing
Mar 25 21:03 : exception: Not playing
Mar 25 21:03 : exception: Not playing
Mar 26 20:15 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 26 20:28 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 26 20:28 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 26 20:28 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 27 17:52 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 27 18:08 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 27 20:29 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 28 05:13 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 28 05:13 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 05:14 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 28 05:16 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 18:58 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 19:07 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 28 19:09 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 19:19 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 28 19:20 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 19:22 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 28 19:23 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 19:28 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 20:02 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 28 20:02 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 28 20:02 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 28 20:04 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 20:09 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 28 20:11 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 20:49 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 28 21:00 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 28 21:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 09:11 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 09:11 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 29 12:20 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 29 12:41 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 12:46 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Mar 29 12:48 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 12:51 : player: played "Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3"
Mar 29 12:52 : pipewire_output: Decoder is too slow; playing silence to avoid xrun
Mar 29 12:53 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 12:55 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Mar 29 12:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 12:59 : player: played "Annihilator - Alice In Hell/04 - Wicked Mystic.mp3"
Mar 29 13:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 13:04 : player: played "Annihilator - Alice In Hell/09 - Human Insecticide.mp3"
Mar 29 13:06 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 13:09 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 29 13:10 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 13:16 : player: played "Killemall/02 - Metallica - The Four Horsemen.mp3"
Mar 29 13:18 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 13:21 : player: played "Killemall/04 - Metallica - Jump In The Fire.mp3"
Mar 29 13:23 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 13:26 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Mar 29 13:28 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 15:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 16:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 20:03 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Mar 29 20:05 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 20:31 : player: played "Killemall/08 - Metallica - No Remorse.mp3"
Mar 29 20:33 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 20:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 20:59 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 29 20:59 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 29 21:51 : exception: Not playing
Mar 29 21:51 : exception: Not playing
Mar 29 22:01 : exception: Not playing
Mar 29 22:01 : exception: Not playing
Mar 29 22:01 : exception: Not playing
Mar 29 22:01 : exception: Not playing
Mar 30 00:11 : exception: Not playing
Mar 30 00:11 : exception: Not playing
Mar 30 00:18 : exception: Not playing
Mar 30 00:18 : exception: Not playing
Mar 30 00:18 : exception: Not playing
Mar 30 12:55 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 12:56 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 13:06 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 13:07 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 13:07 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 13:08 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 13:30 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 18:20 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 18:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 18:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 18:54 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 18:55 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 22:16 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 22:19 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 23:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 23:35 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 23:35 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 23:35 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 23:35 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 30 23:36 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 23:45 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 23:52 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 30 23:54 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 00:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 12:03 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 15:46 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 16:01 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:01 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 16:02 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 16:02 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 16:33 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 16:34 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 17:49 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 18:05 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 18:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 18:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 18:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 18:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 18:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 18:13 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 18:23 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 18:23 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 18:46 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 19:00 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 19:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 19:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 19:12 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 19:14 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Mar 31 19:21 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Mar 31 19:22 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 19:27 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Mar 31 19:29 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 19:30 : player: played "Annihilator - Alice In Hell/03 - W.T.Y.D..mp3"
Mar 31 19:32 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 19:34 : player: played "Annihilator - Alice In Hell/04 - Wicked Mystic.mp3"
Mar 31 19:36 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 19:39 : player: played "Annihilator - Alice In Hell/09 - Human Insecticide.mp3"
Mar 31 19:39 : player: played "Killemall/01 - Metallica - Hit The Lights.mp3"
Mar 31 19:41 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Mar 31 22:13 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Apr 01 01:27 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Apr 01 01:27 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Apr 01 01:27 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Apr 01 05:34 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory
Apr 01 16:55 : exception: Failed to open "PipeWire Sound Server" (pipewire); Failed to connect stream: Host is down
Apr 01 16:56 : player: played "Annihilator - Alice In Hell/01 - Crystal Ann.mp3"
Apr 01 16:56 : exception: Failed to open "PipeWire Sound Server" (pipewire); Failed to connect stream: Host is down
Apr 01 16:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Apr 01 16:57 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Apr 01 16:58 : exception: Failed to create /home/javier/.local/state/mpd/state: No such file or directory
Apr 01 16:58 : player: played "Annihilator - Alice In Hell/02 - Alison Hell..mp3"
Apr 01 16:58 : exception: Failed to open '/home/javier/.local/state/mpd/state': No such file or directory

33
.config/mpd/mpd.conf Normal file
View File

@ -0,0 +1,33 @@
# Recommended location for database
db_file "~/.config/mpd/database"
# Music directory is by default the XDG directory, uncomment to amend and choose a different directory
music_directory "~/music"
# Refresh the database whenever files in the music_directory are changed
auto_update "yes"
playlist_directory "~/.config/mpd/playlists"
pid_file "~/.config/mpd/pid"
log_file "~/.config//mpd/log"
sticker_file "~/.config/mpd/sticker.sql"
state_file "~/.local/state/mpd/state"
mixer_type "software"
# audio_output {
# type "alsa"
# name "Alsa Sound Server"
# }
audio_output {
type "fifo"
name "Visualizer feed"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
audio_output {
type "pipewire"
name "PipeWire Sound Server"
}

1
.config/mpd/pid Normal file
View File

@ -0,0 +1 @@
507

View File

@ -0,0 +1,16 @@
Annihilator - Alice In Hell/01 - Crystal Ann.mp3
Annihilator - Alice In Hell/02 - Alison Hell..mp3
Annihilator - Alice In Hell/03 - W.T.Y.D..mp3
Annihilator - Alice In Hell/04 - Wicked Mystic.mp3
Annihilator - Alice In Hell/09 - Human Insecticide.mp3
Killemall/01 - Metallica - Hit The Lights.mp3
Killemall/02 - Metallica - The Four Horsemen.mp3
Killemall/04 - Metallica - Jump In The Fire.mp3
Killemall/08 - Metallica - No Remorse.mp3
Revocation/02 - Cradle Robber.mp3
Revocation/06 - No Funeral.mp3
Revocation - Teratogenesis (EP) (2012)/01. The Grip Tightens.mp3
Revocation - Teratogenesis (EP) (2012)/04. Teratogenesis.mp3
Revocation - Teratogenesis (EP) (2012)/05. Bound By Desire.mp3
Revocation - Existence Is Futile (2009)/08. Dismantle The Dictator.mp3
Revocation - Existence Is Futile (2009)/10. Leviathan Awaits.mp3

BIN
.config/mpd/sticker.sql Normal file

Binary file not shown.

5
.config/mpv/input.conf Executable file
View File

@ -0,0 +1,5 @@
l seek 5
h seek -5
j seek -60
k seek 60
S cycle sub

265
.config/mpv/mpv.conf Executable file
View File

@ -0,0 +1,265 @@
# Example mpv configuration file
#
# Warning:
#
# The commented example options usually do _not_ set the default values. Call
# mpv with --list-options to see the default values for most options. There is
# no builtin or example mpv.conf with all the defaults.
#
#
# Configuration files are read system-wide from /usr/local/etc/mpv.conf
# and per-user from ~/.config/mpv/mpv.conf, where per-user settings override
# system-wide settings, all of which are overridden by the command line.
#
# Configuration file settings and the command line options use the same
# underlying mechanisms. Most options can be put into the configuration file
# by dropping the preceding '--'. See the man page for a complete list of
# options.
#
# Lines starting with '#' are comments and are ignored.
#
# See the CONFIGURATION FILES section in the man page
# for a detailed description of the syntax.
#
# Profiles should be placed at the bottom of the configuration file to ensure
# that settings wanted as defaults are not restricted to specific profiles.
##################
# video settings #
##################
# Start in fullscreen mode by default.
# fs=yes
# force starting with centered window
# geometry=50%:50%
# don't allow a new window to have a size larger than 90% of the screen size
#autofit-larger=90%x90%
# Do not close the window on exit.
#keep-open=yes
# Do not wait with showing the video window until it has loaded. (This will
# resize the window once video is loaded. Also always shows a window with
# audio.)
#force-window=immediate
# Disable the On Screen Controller (OSC).
#osc=no
# Keep the player window on top of all other windows.
#ontop=yes
# Specify high quality video rendering preset (for --vo=gpu only)
# Can cause performance problems with some drivers and GPUs.
profile=gpu-hq
#scale=ewa_lanczossharp
#cscale=ewa_lanczossharp
# Force video to lock on the display's refresh rate, and change video and audio
# speed to some degree to ensure synchronous playback - can cause problems
# with some drivers and desktop environments.
# video-sync=display-resample
# Enable hardware decoding if available. Often, this does not work with all
# video outputs, but should work well with default settings on most systems.
# If performance or energy usage is an issue, forcing the vdpau or vaapi VOs
# may or may not help.
hwdec=vaapi
# hwdec=gpu
# vo=xv
# ao=pulse
# sid=no
# dscale=bilinear
##################
# audio settings #
##################
# Specify default audio device. You can list devices with: --audio-device=help
# The option takes the device string (the stuff between the '...').
# audio-device=alsa/default
# Do not filter audio to keep pitch when changing playback speed.
#audio-pitch-correction=no
# Output 5.1 audio natively, and upmix/downmix audio with a different format.
#audio-channels=5.1
# Disable any automatic remix, _if_ the audio output accepts the audio format.
# of the currently played file. See caveats mentioned in the manpage.
# (The default is "auto-safe", see manpage.)
audio-channels=auto
##################
# other settings #
##################
# Pretend to be a web browser. Might fix playback with some streaming sites,
# but also will break with shoutcast streams.
#user-agent="Mozilla/5.0"
# cache settings
#
# Use a large seekable RAM cache even for local input.
#cache=yes
#
# Use extra large RAM cache (needs cache=yes to make it useful).
#demuxer-max-bytes=500M
#demuxer-max-back-bytes=100M
#
# Disable the behavior that the player will pause if the cache goes below a
# certain fill size.
#cache-pause=no
#
# Store cache payload on the hard disk instead of in RAM. (This may negatively
# impact performance unless used for slow input such as network.)
#cache-dir=~/.cache/
#cache-on-disk=yes
# Display English subtitles if available.
#slang=en
# Play Finnish audio if available, fall back to English otherwise.
#alang=fi,en
# Change subtitle encoding. For Arabic subtitles use 'cp1256'.
# If the file seems to be valid UTF-8, prefer UTF-8.
# (You can add '+' in front of the codepage to force it.)
#sub-codepage=cp1256
# You can also include other configuration files.
#include=/path/to/the/file/you/want/to/include
############
# Profiles #
############
# The options declared as part of profiles override global default settings,
# but only take effect when the profile is active.
# The following profile can be enabled on the command line with: --profile=eye-cancer
#[eye-cancer]
#sharpen=5
###########
# General #
###########
input-ipc-server=/tmp/mpvsocket # listen for IPC on this socket
# save-position-on-quit=yes # handled by a script
#no-border # no window title bar
msg-module # prepend module name to log messages
msg-color # color log messages on terminal
term-osd-bar # display a progress bar on the terminal
use-filedir-conf # look for additional config files in the directory of the opened file
#pause # no autoplay
keep-open # keep the player open when a file's end is reached
autofit-larger=90%x90% # resize window in case it's larger than W%xH% of the screen
cursor-autohide-fs-only # don't autohide the cursor in window mode, only fullscreen
input-media-keys=no # enable/disable OSX media keys
cursor-autohide=1000 # autohide the curser after 1s
prefetch-playlist=yes
force-seekable=yes
screenshot-format=png
screenshot-png-compression=8
screenshot-template='~/pics/MPV/%F (%P) %n'
hls-bitrate=max # use max quality for HLS streams
ytdl-format=best
[ytdl-desktop]
profile-desc=cond:is_desktop()
ytdl-format=bestvideo[height<=?720]+bestaudio/best
# ytdl-format=best
[ytdl-laptop]
profile-desc=cond:is_laptop()
ytdl-format=bestvideo[height<=?720][fps<=?30][vcodec!=?vp9][protocol!=http_dash_segments]+bestaudio/best
# ytdl-format=best
[default]
#########
# Cache #
#########
# Configure the cache to be really big (multiple GBs)
# We have a lot of memory, so why not use it for something
cache=no
#cache-default=4000000 # size in KB
#cache-backbuffer=250000 # size in KB
#demuxer-max-bytes=1147483647 # ~1 GiB in bytes
#############
# OSD / OSC #
#############
osd-level=1 # enable osd and display --osd-status-msg on interaction
osd-duration=2500 # hide the osd after x ms
osd-status-msg='${time-pos} / ${duration}${?percent-pos: (${percent-pos}%)}${?frame-drop-count:${!frame-drop-count==0: Dropped: ${frame-drop-count}}}\n${?chapter:Chapter: ${chapter}}'
osd-font='monospace'
osd-font-size=32
osd-color='#CCFFFFFF' # ARGB format
osd-border-color='#DD322640' # ARGB format
#osd-shadow-offset=1 # pixel width for osd text and progress bar
osd-bar-align-y=0 # progress bar y alignment (-1 top, 0 centered, 1 bottom)
osd-border-size=2 # size for osd text and progress bar
osd-bar-h=2 # height of osd bar as a fractional percentage of your screen height
osd-bar-w=60 # width of " " "
#############
# Subtitles #
#############
sub-auto=all # detect all subtitle
#no-sub-visibility # hidden as default
#sub-auto=fuzzy # external subs don't have to match the file name exactly to autoload
sub-file-paths-append=ass # search for external subs in these relative subdirectories
sub-file-paths-append=srt
sub-file-paths-append=sub
sub-file-paths-append=subs
sub-file-paths-append=subtitles
demuxer-mkv-subtitle-preroll # try to correctly show embedded subs when seeking
embeddedfonts=yes # use embedded fonts for SSA/ASS subs
sub-fix-timing=no # do not try to fix gaps (which might make it worse in some cases)
sub-ass-force-style=Kerning=yes # allows you to override style parameters of ASS scripts
sub-use-margins
sub-ass-force-margins
# the following options only apply to subtitles without own styling (i.e. not ASS but e.g. SRT)
sub-font="JetBrainsMono Nerd Font"
sub-font-size=36
sub-color="#FFFFFFFF"
sub-border-color="#FF262626"
sub-border-size=3.2
sub-shadow-offset=1
sub-shadow-color="#33000000"
sub-spacing=0.5
#############
# Languages #
#############
slang=enm,en,eng,de,deu,ger # automatically select these subtitles (decreasing priority)
alang=ja,jp,jpn,en,eng,de,deu,ger # automatically select these audio tracks (decreasing priority)
#########
# Audio #
#########
audio-file-auto=fuzzy # external audio doesn't has to match the file name exactly to autoload
audio-pitch-correction=yes # automatically insert scaletempo when playing with higher speed
volume-max=200 # maximum volume in %, everything above 100 results in amplification
volume=100 # default volume, 100 = unchanged

View File

@ -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.

View File

@ -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 <Pipe-name> <Message>
$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()
}
```

View File

@ -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)

View File

@ -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")

View File

@ -0,0 +1,2 @@
start=248.824809
pause=yes

View File

@ -0,0 +1 @@
# redirect entry

View File

@ -0,0 +1,2 @@
start=560.713000
fullscreen=no

19
.config/msmtp/config Executable file
View File

@ -0,0 +1,19 @@
host mail.cock.li
port 587
from jpacheco@cock.li
user jpacheco@cock.li
passwordeval "pass show muw/jpacheco@cock.li"
# End profile
account jpacheco@cock.li
host mail.cock.li
port 465
from jpacheco@cock.li
user jpacheco@cock.li
passwordeval "pass jpacheco@cock.li"
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /home/javier/.local/state/msmtp/msmtp.log
tls_starttls off

71
.config/ncmpcpp/config Normal file
View File

@ -0,0 +1,71 @@
# Files
mpd_music_dir = "~/music"
ncmpcpp_directory = ~/.config/ncmpcpp
mpd_host = "localhost"
mpd_port = "6600"
mpd_connection_timeout = "5"
mpd_crossfade_time = "5"
# Playlist
playlist_disable_highlight_delay = "0"
playlist_display_mode = "columns"
playlist_show_remaining_time = "yes"
browser_display_mode = "columns"
autocenter_mode = "yes"
follow_now_playing_lyrics = "yes"
allow_for_physical_item_deletion = yes
colors_enabled = "yes"
header_window_color = "white"
volume_color = "red"
progressbar_color = "white"
statusbar_color = "white"
active_window_border = "black"
alternative_header_first_line_format = "$0$aqqu$/a {$7%a - $9}{$5%t$9}|{$8%f$9} $0$atqq$/a$9"
alternative_header_second_line_format = "{{$6%b$9}{ [$6%y$9]}}|{%D}"
song_list_format = "{$3%n │ $9}{$7%a - $9}{$5%t$9}|{$8%f$9}$R{$6 │ %b$9}{$3 │ %l$9}"
user_interface = "classic"
default_place_to_search_in = "database"
# visualizer
visualizer_data_source = "/tmp/mpd.fifo"
visualizer_output_name = "my_fifo"
visualizer_type = "spectrum" (spectrum/wave)
visualizer_in_stereo = "yes"
visualizer_look = "+|"
## Navigation ##
cyclic_scrolling = "yes"
header_text_scrolling = "yes"
jump_to_now_playing_song_at_start = "yes"
lines_scrolled = "2"
## Other ##
system_encoding = "utf-8"
regular_expressions = "extended"
ask_before_clearing_playlists = yes
## Selected tracks ##
selected_item_prefix = "* "
discard_colors_if_item_is_selected = "no"
## Seeking ##
incremental_seeking = "yes"
seek_time = "1"
## Visivility ##
header_visibility = "yes"
statusbar_visibility = "yes"
titles_visibility = "yes"
progressbar_look = "=>"
locked_screen_width_part = 30
ask_for_locked_screen_width_part = no
progressbar_elapsed_color = "white"
now_playing_prefix = "> "
song_status_format = " $2%a $4⟫$3⟫ $8%t $4⟫$3⟫ $5%b "
centered_cursor = "yes"
display_bitrate = "no"
enable_window_title = "yes"
ignore_leading_the = "yes"
empty_tag_marker = ""
startup_screen = playlist
startup_slave_screen = "visualizer"

View File

Binary file not shown.

51
.config/nnn/plugins/.cbcp Executable file
View File

@ -0,0 +1,51 @@
#!/usr/bin/env sh
# Description: Copy selection to system clipboard as newline-separated entries
# Dependencies:
# - tr
# - xclip/xsel (Linux)
# - pbcopy (macOS)
# - termux-clipboard-set (Termux)
# - clip.exe (WSL)
# - clip (Cygwin)
# - wl-copy (Wayland)
# - clipboard (Haiku)
#
# Limitation: breaks if a filename has newline in it
#
# Note: For a space-separated list:
# xargs -0 < "$SELECTION"
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" # protect trailing \n
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
[ -s "$selection" ] || { echo "plugin .cbcp error: empty selection" >&2 ; exit 1; }
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
# Wayland
tr '\0' '\n' < "$selection" | wl-copy
elif type xsel >/dev/null 2>&1; then
# Linux
tr '\0' '\n' < "$selection" | xsel -bi
elif type xclip >/dev/null 2>&1; then
# Linux
tr '\0' '\n' < "$selection" | xclip -sel clip
elif type pbcopy >/dev/null 2>&1; then
# macOS
tr '\0' '\n' < "$selection" | pbcopy
elif type termux-clipboard-set >/dev/null 2>&1; then
# Termux
tr '\0' '\n' < "$selection" | termux-clipboard-set
elif type clip.exe >/dev/null 2>&1; then
# WSL
tr '\0' '\n' < "$selection" | clip.exe
elif type clip >/dev/null 2>&1; then
# Cygwin
tr '\0' '\n' < "$selection" | clip
elif type clipboard >/dev/null 2>&1; then
# Haiku
tr '\0' '\n' < "$selection" | clipboard --stdin
fi

428
.config/nnn/plugins/.iconlookup Executable file
View File

@ -0,0 +1,428 @@
#!/usr/bin/env sh
# Description: Print icons in front of list of directories/files
# Dependencies: awk
# Usage
# 1. Set colors and/or icons to your liking
# 2. Pipe any directory listing to iconlookup and it will output prepended icons
# 3. preview-tui uses the script to prepend icon to directory listings
# 4. Aditionally you can consider adding it to your PATH and/or FZF_DEFAULT_COMMAND to
# make it work with various fzf plugins (make sure you also add --ansi to your FZF_DEFAULT_OPTS)
# Shell: POSIX compliant
# Author: Luuk van Baal (https://github.com/luukvbaal/iconlookup)
icon_lookup() {
awk 'BEGIN {
# Set your ANSI colorscheme below (https://en.wikipedia.org/wiki/ANSI_escape_code#Colors).
# Default uses standard nnn icon colors, 8 and 24-bit nord themes are commented out.
colordepth=8 #colordepth=8 #colordepth=24
color_dirtxt=39 #color_dirtxt=111 #color_dirtxt="129;161;193"
color_filetxt=15 #color_filetxt=111 #color_filetxt="129;161;193"
color_default=39 #color_default=111 #color_default="129;161;193"
color_video=93 #color_video=110 #color_video="136;192;208"
color_audio=220 #color_audio=150 #color_audio="163;190;140"
color_image=82 #color_image=150 #color_image="163;190;140"
color_docs=202 #color_docs=173 #color_docs="208;135;112"
color_archive=209 #color_archive=179 #color_archive="235;203;139"
color_c=81 #color_c=150 #color_c="163;190;140"
color_java=32 #color_java=139 #color_java="180;142;173"
color_js=47 #color_js=109 #color_js="143;188;187"
color_react=39 #color_react=111 #color_react="129;161;193"
color_css=199 #color_css=110 #color_css="136;192;208"
color_python=227 #color_python=68 #color_python="94;129;172"
color_lua=19 #color_lua=167 #color_lua="191;97;106"
color_document=15 #color_document=173 #color_document="208;135;112"
color_fsharp=31 #color_fsharp=179 #color_fsharp="180;142;173"
color_ruby=160 #color_ruby=150 #color_ruby="163;190;140"
color_scala=196 #color_scala=139 #color_scala="143;188;187"
color_shell=47 #color_shell=109 #color_shell="143;188;187"
color_vim=28 #color_vim=109 #color_vim="143;188;187"
# icons[][1] contains icon and icons[][2] contains color
icons["directory"][1] = ""; icons["directory"][2] = color_default
icons["file"][1] = ""; icons["file"][2] = color_default
icons["exec"][1] = ""; icons["exec"][2] = color_default
icons["manual"][1] = ""; icons["manual"][2] = color_docs
icons["pipe"][1] = "ﳣ"; icons["pipe"][2] = color_default
icons["socket"][1] = "ﳧ"; icons["socket"][2] = color_default
icons["door"][1] = "➡"; icons["door"][2] = color_default
# top level and common icons
icons[".git"][1] = ""; icons[".git"][2] = color_default
icons["desktop"][1] = "ﲾ"; icons["desktop"][2] = color_default
icons["briefcase"][1] = ""; icons["briefcase"][2] = color_default
icons["document"][1] = ""; icons["document"][2] = color_default
icons["downloads"][1] = ""; icons["downloads"][2] = color_default
icons["music"][1] = ""; icons["music"][2] = color_default
icons["musicfile"][1] = ""; icons["musicfile"][2] = color_audio
icons["pictures"][1] = ""; icons["pictures"][2] = color_default
icons["picturefile"][1] = ""; icons["picturefile"][2] = color_image
icons["public"][1] = ""; icons["public"][2] = color_default
icons["templates"][1] = "陼"; icons["templates"][2] = color_default
icons["videos"][1] = ""; icons["videos"][2] = color_default
icons["videofile"][1] = "ﳜ"; icons["videofile"][2] = color_video
icons["changelog"][1] = ""; icons["changelog"][2] = color_docs
icons["configure"][1] = ""; icons["configure"][2] = color_default
icons["license"][1] = ""; icons["license"][2] = color_docs
icons["makefile"][1] = ""; icons["makefile"][2] = color_default
icons["archive"][1] = ""; icons["archive"][2] = color_archive
icons["script"][1] = ""; icons["script"][2] = color_shell
icons["cplusplus"][1] = ""; icons["cplusplus"][2] = color_c
icons["java"][1] = ""; icons["java"][2] = color_java
icons["clojure"][1] = ""; icons["clojure"][2] = color_default
icons["js"][1] = ""; icons["js"][2] = color_js
icons["linux"][1] = ""; icons["linux"][2] = color_default
icons["fsharp"][1] = ""; icons["fsharp"][2] = color_fsharp
icons["ruby"][1] = ""; icons["ruby"][2] = color_ruby
icons["c"][1] = ""; icons["c"][2] = color_c
icons["chess"][1] = ""; icons["chess"][2] = color_default
icons["haskell"][1] = ""; icons["haskell"][2] = color_vim
icons["html"][1] = ""; icons["html"][2] = color_default
icons["react"][1] = ""; icons["react"][2] = color_react
icons["python"][1] = ""; icons["python"][2] = color_python
icons["database"][1] = ""; icons["database"][2] = color_default
icons["worddoc"][1] = ""; icons["worddoc"][2] = color_document
icons["playlist"][1] = "蘿"; icons["playlist"][2] = color_audio
icons["opticaldisk"][1] = ""; icons["opticaldisk"][2] = color_archive
# numbers
icons["1"][1] = icons["manual"][1]; icons["1"][2] = icons["manual"][2]
icons["7z"][1] = icons["archive"][1]; icons["7z"][2] = icons["archive"][2]
# a
icons["a"][1] = icons["manual"][1]; icons["a"][2] = icons["manual"][2]
icons["apk"][1] = icons["archive"][1]; icons["apk"][2] = icons["archive"][2]
icons["asm"][1] = icons["file"][1]; icons["asm"][2] = icons["file"][2]
icons["aup"][1] = icons["musicfile"][1]; icons["aup"][2] = icons["musicfile"][2]
icons["avi"][1] = icons["videofile"][1]; icons["avi"][2] = icons["videofile"][2]
# b
icons["bat"][1] = icons["script"][1]; icons["bat"][2] = icons["script"][2]
icons["bin"][1] = ""; icons["bin"][2] = color_default
icons["bmp"][1] = icons["picturefile"][1]; icons["bmp"][2] = icons["picturefile"][2]
icons["bz2"][1] = icons["archive"][1]; icons["bz2"][2] = icons["archive"][2]
# c
icons["cplusplus"][1] = icons["cplusplus"][1]; icons["cplusplus"][2] = icons["cplusplus"][2]
icons["cabal"][1] = icons["haskell"][1]; icons["cab"][2] = icons["haskell"][2]
icons["cab"][1] = icons["archive"][1]; icons["cab"][2] = icons["archive"][2]
icons["cbr"][1] = icons["archive"][1]; icons["cbr"][2] = icons["archive"][2]
icons["cbz"][1] = icons["archive"][1]; icons["cbz"][2] = icons["archive"][2]
icons["cc"][1] = icons["cplusplus"][1]; icons["cc"][2] = icons["cplusplus"][2]
icons["class"][1] = icons["java"][1]; icons["class"][2] = icons["java"][2]
icons["clj"][1] = icons["clojure"][1]; icons["clj"][2] = icons["clojure"][2]
icons["cljc"][1] = icons["clojure"][1]; icons["cljc"][2] = icons["clojure"][2]
icons["cljs"][1] = icons["clojure"][1]; icons["cljs"][2] = icons["clojure"][2]
icons["cmake"][1] = icons["makefile"][1]; icons["cmake"][2] = icons["makefile"][2]
icons["coffee"][1] = ""; icons["coffee"][2] = color_default
icons["conf"][1] = icons["configure"][1]; icons["conf"][2] = icons["configure"][2]
icons["cpio"][1] = icons["archive"][1]; icons["cpio"][2] = icons["archive"][2]
icons["cpp"][1] = icons["cplusplus"][1]; icons["cpp"][2] = icons["cplusplus"][2]
icons["css"][1] = ""; icons["css"][2] = color_css
icons["cue"][1] = icons["playlist"][1]; icons["cue"][2] = icons["playlist"][2]
icons["cvs"][1] = icons["configure"][1]; icons["cvs"][2] = icons["configure"][2]
icons["cxx"][1] = icons["cplusplus"][1]; icons["cxx"][2] = icons["cplusplus"][2]
# d
icons["db"][1] = icons["database"][1]; icons["db"][2] = icons["database"][2]
icons["deb"][1] = ""; icons["deb"][2] = color_archive
icons["diff"][1] = ""; icons["diff"][2] = color_default
icons["dll"][1] = icons["script"][1]; icons["dll"][2] = icons["script"][2]
icons["doc"][1] = icons["worddoc"][1]; icons["doc"][2] = icons["worddoc"][2]
icons["docx"][1] = icons["worddoc"][1]; icons["docx"][2] = icons["worddoc"][2]
# e
icons["ejs"][1] = icons["js"][1]; icons["ejs"][2] = icons["js"][2]
icons["elf"][1] = icons["linux"][1]; icons["elf"][2] = icons["linux"][2]
icons["epub"][1] = icons["manual"][1]; icons["epub"][2] = icons["manual"][2]
icons["exe"][1] = icons["exec"][1]; icons["exe"][2] = icons["exec"][2]
# f
icons["fsharp"][1] = icons["fsharp"][1]; icons["fsharp"][2] = icons["fsharp"][2]
icons["flac"][1] = icons["musicfile"][1]; icons["flac"][2] = icons["musicfile"][2]
icons["fen"][1] = icons["chess"][1]; icons["fen"][2] = icons["chess"][2]
icons["flv"][1] = icons["videofile"][1]; icons["flv"][2] = icons["videofile"][2]
icons["fs"][1] = icons["fsharp"][1]; icons["fs"][2] = icons["fsharp"][2]
icons["fsi"][1] = icons["fsharp"][1]; icons["fsi"][2] = icons["fsharp"][2]
icons["fsscript"][1] = icons["fsharp"][1]; icons["fsscript"][2] = icons["fsharp"][2]
icons["fsx"][1] = icons["fsharp"][1]; icons["fsx"][2] = icons["fsharp"][2]
# g
icons["gem"][1] = icons["ruby"][1]; icons["gem"][2] = icons["ruby"][2]
icons["gif"][1] = icons["picturefile"][1]; icons["gif"][2] = icons["picturefile"][2]
icons["go"][1] = "ﳑ"; icons["go"][2] = color_default
icons["gz"][1] = icons["archive"][1]; icons["gz"][2] = icons["archive"][2]
icons["gzip"][1] = icons["archive"][1]; icons["gzip"][2] = icons["archive"][2]
# h
icons["h"][1] = icons["c"][1]; icons["h"][2] = icons["c"][2]
icons["hh"][1] = icons["cplusplus"][1]; icons["hh"][2] = icons["cplusplus"][2]
icons["hpp"][1] = icons["cplusplus"][1]; icons["hpp"][2] = icons["cplusplus"][2]
icons["hs"][1] = icons["haskell"][1]; icons["hs"][2] = icons["haskell"][2]
icons["htaccess"][1] = icons["configure"][1]; icons["htaccess"][2] = icons["configure"][2]
icons["htpasswd"][1] = icons["configure"][1]; icons["htpasswd"][2] = icons["configure"][2]
icons["htm"][1] = icons["html"][1]; icons["htm"][2] = icons["html"][2]
icons["hxx"][1] = icons["cplusplus"][1]; icons["hxx"][2] = icons["cplusplus"][2]
# i
icons["ico"][1] = icons["picturefile"][1]; icons["ico"][2] = icons["picturefile"][2]
icons["img"][1] = icons["opticaldisk"][1]; icons["img"][2] = icons["opticaldisk"][2]
icons["ini"][1] = icons["configure"][1]; icons["ini"][2] = icons["configure"][2]
icons["iso"][1] = icons["opticaldisk"][1]; icons["iso"][2] = icons["opticaldisk"][2]
# j
icons["jar"][1] = icons["java"][1]; icons["jar"][2] = icons["java"][2]
icons["java"][1] = icons["java"][1]; icons["java"][2] = icons["java"][2]
icons["jl"][1] = icons["configure"][1]; icons["jl"][2] = icons["configure"][2]
icons["jpeg"][1] = icons["picturefile"][1]; icons["jpeg"][2] = icons["picturefile"][2]
icons["jpg"][1] = icons["picturefile"][1]; icons["jpg"][2] = icons["picturefile"][2]
icons["json"][1] = "ﬥ"; icons["json"][2] = color_js
icons["jsx"][1] = icons["react"][1]; icons["jsx"][2] = icons["react"][2]
# k
# l
icons["lha"][1] = icons["archive"][1]; icons["lha"][2] = icons["archive"][2]
icons["lhs"][1] = icons["haskell"][1]; icons["lhs"][2] = icons["haskell"][2]
icons["ilog"][1] = icons["document"][1]; icons["ilog"][2] = icons["document"][2]
icons["lua"][1] = ""; icons["lua"][2] = color_lua
icons["lzh"][1] = icons["archive"][1]; icons["lzh"][2] = icons["archive"][2]
icons["lzma"][1] = icons["archive"][1]; icons["lzma"][2] = icons["archive"][2]
# m
icons["m"][1] = "ﴜ"; icons["mat"][2] = color_c
icons["m4a"][1] = icons["musicfile"][1]; icons["m4a"][2] = icons["musicfile"][2]
icons["m4v"][1] = icons["videofile"][1]; icons["m4v"][2] = icons["videofile"][2]
icons["mat"][1] = ""; icons["mat"][2] = color_c
icons["markdown"][1] = ""; icons["markdown"][2] = color_docs
icons["md"][1] = ""; icons["md"][2] = color_docs
icons["mk"][1] = icons["makefile"][1]; icons["mk"][2] = icons["makefile"][2]
icons["mkv"][1] = icons["videofile"][1]; icons["mkv"][2] = icons["videofile"][2]
icons["mov"][1] = icons["videofile"][1]; icons["mov"][2] = icons["videofile"][2]
icons["mp3"][1] = icons["musicfile"][1]; icons["mp3"][2] = icons["musicfile"][2]
icons["mp4"][1] = icons["videofile"][1]; icons["mp4"][2] = icons["videofile"][2]
icons["mpeg"][1] = icons["videofile"][1]; icons["mpeg"][2] = icons["videofile"][2]
icons["mpg"][1] = icons["videofile"][1]; icons["mpg"][2] = icons["videofile"][2]
icons["msi"][1] = ""; icons["msi"][2] = color_default
# n
icons["nix"][1] = ""; icons["nix"][2] = color_fsharp
# o
icons["o"][1] = icons["manual"][1]; icons["o"][2] = icons["manual"][2]
icons["ogg"][1] = icons["musicfile"][1]; icons["ogg"][2] = icons["musicfile"][2]
icons["odownload"][1] = icons["download"][1]; icons["odownload"][2] = icons["download"][2]
icons["out"][1] = icons["linux"][1]; icons["out"][2] = icons["linux"][2]
# p
icons["part"][1] = icons["download"][1]; icons["part"][2] = icons["download"][2]
icons["patch"][1] = icons["diff"][1]; icons["patch"][2] = icons["diff"][2]
icons["pdf"][1] = ""; icons["pdf"][2] = color_docs
icons["pgn"][1] = icons["chess"][1]; icons["pgn"][2] = icons["chess"][2]
icons["php"][1] = ""; icons["php"][2] = color_default
icons["png"][1] = icons["picturefile"][1]; icons["png"][2] = icons["picturefile"][2]
icons["ppt"][1] = ""; icons["ppt"][2] = color_default
icons["pptx"][1] = ""; icons["pptx"][2] = color_default
icons["psb"][1] = ""; icons["psb"][2] = color_default
icons["psd"][1] = ""; icons["psd"][2] = color_default
icons["py"][1] = icons["python"][1]; icons["py"][2] = icons["python"][2]
icons["pyc"][1] = icons["python"][1]; icons["pyc"][2] = icons["python"][2]
icons["pyd"][1] = icons["python"][1]; icons["pyd"][2] = icons["python"][2]
icons["pyo"][1] = icons["python"][1]; icons["pyo"][2] = icons["python"][2]
# q
# r
icons["rar"][1] = icons["archive"][1]; icons["rar"][2] = icons["archive"][2]
icons["rc"][1] = icons["configure"][1]; icons["rc"][2] = icons["configure"][2]
icons["rom"][1] = ""; icons["rom"][2] = color_default
icons["rpm"][1] = icons["archive"][1]; icons["rpm"][2] = icons["archive"][2]
icons["rss"][1] = "參"; icons["rss"][2] = color_default
icons["rtf"][1] = ""; icons["rtf"][2] = color_default
# s
icons["sass"][1] = ""; icons["sass"][2] = color_css
icons["scss"][1] = ""; icons["scss"][2] = color_css
icons["so"][1] = icons["manual"][1]; icons["so"][2] = icons["manual"][2]
icons["scala"][1] = ""; icons["scala"][2] = color_scala
icons["sh"][1] = icons["script"][1]; icons["sh"][2] = icons["script"][2]
icons["slim"][1] = icons["script"][1]; icons["slim"][2] = icons["script"][2]
icons["sln"][1] = ""; icons["sln"][2] = color_default
icons["sql"][1] = icons["database"][1]; icons["sql"][2] = icons["database"][2]
icons["srt"][1] = ""; icons["srt"][2] = color_default
icons["isub"][1] = ""; icons["isub"][2] = color_default
icons["svg"][1] = icons["picturefile"][1]; icons["svg"][2] = icons["picturefile"][2]
# t
icons["tar"][1] = icons["archive"][1]; icons["tar"][2] = icons["archive"][2]
icons["tex"][1] = ""; icons["tex"][2] = color_default
icons["tgz"][1] = icons["archive"][1]; icons["tgz"][2] = icons["archive"][2]
icons["ts"][1] = ""; icons["ts"][2] = color_js
icons["tsx"][1] = icons["react"][1]; icons["tsx"][2] = icons["react"][2]
icons["txt"][1] = icons["document"][1]; icons["txt"][2] = icons["document"][2]
icons["txz"][1] = icons["archive"][1]; icons["txz"][2] = icons["archive"][2]
# u
# v
icons["vid"][1] = icons["videofile"][1]; icons["vid"][2] = icons["videofile"][2]
icons["vim"][1] = ""; icons["vim"][2] = color_vim
icons["vimrc"][1] = ""; icons["vimrc"][2] = color_vim
icons["vtt"][1] = ""; icons["vtt"][2] = color_default
# w
icons["wav"][1] = icons["musicfile"][1]; icons["wav"][2] = icons["musicfile"][2]
icons["webm"][1] = icons["videofile"][1]; icons["webm"][2] = icons["videofile"][2]
icons["wma"][1] = icons["videofile"][1]; icons["wma"][2] = icons["videofile"][2]
icons["wmv"][1] = icons["videofile"][1]; icons["wmv"][2] = icons["videofile"][2]
# x
icons["xbps"][1] = icons["archive"][1]; icons["xbps"][2] = color_archive
icons["xcf"][1] = icons["picturefile"][1]; icons["xcf"][2] = color_image
icons["xhtml"][1] = icons["html"][1]; icons["xhtml"][2] = icons["html"][2]
icons["xls"][1] = ""; icons["xls"][2] = color_default
icons["xlsx"][1] = ""; icons["xlsx"][2] = color_default
icons["xml"][1] = icons["html"][1]; icons["xml"][2] = icons["html"][2]
icons["xz"][1] = icons["archive"][1]; icons["xz"][2] = icons["archive"][2]
# y
icons["yaml"][1] = icons["configure"][1]; icons["yaml"][2] = icons["configure"][2]
icons["yml"][1] = icons["configure"][1]; icons["yml"][2] = icons["configure"][2]
# z
icons["zip"][1] = icons["archive"][1]; icons["zip"][2] = icons["archive"][2]
icons["zsh"][1] = icons["script"][1]; icons["zsh"][2] = icons["script"][2]
icons["zst"][1] = icons["archive"][1]; icons["zst"][2] = icons["archive"][2]
FS = "."
limit = ENVIRON["limit"]
switch (colordepth) {
case "4":
escape="\033["
break;
case "8":
escape="\033[38;5;"
break;
case "24":
escape="\033[38;2;"
break;
}
bstr = ENVIRON["beforestr"]
}
{
# dont print cwd . and leading ./ from tree -f
if ($0 ~/^\.$/)
next
ent = ($0 ~/^\.\//) ? substr($0, 3, length($0) - 2) : $0
ext = $NF
# Print icons, set color and bold directories by using ansi escape codes
if (ext in icons)
printcolor(icons[ext][1], icons[ext][2], color_filetxt, ent, "10")
else
switch (substr(ent, length(ent), 1)) {
case "/":
printcolor(icons["directory"][1], color_default, color_dirtxt, ent, "1")
break;
case "*":
printcolor(icons["exe"][1], color_default, color_filetxt, ent, "10")
break;
case "|":
printcolor(icons["pipe"][1], color_default, color_filetxt, ent, "10")
break;
case "=":
printcolor(icons["socket"][1], color_default, color_filetxt, ent, "10")
break;
case ">":
printcolor(icons["door"][1], color_default, color_filetxt, ent, "10")
break;
default:
printcolor(icons["file"][1], color_default, color_filetxt, ent, "10")
}
}
function printcolor(i, c, d, n, b) {
if (limit != "" && length(n) + 2 > limit)
n = substr(n, 1, limit - 2)
printf "\033[0m"
printf "%s%s%s;%sm%s %s%sm%s\n", bstr, escape, c, b, i, escape, d, n
}'
printf '\033[0m'
}
print_begin() {
printf '%s\n' "$1" | sed 's/\\n/\n/g'
}
print_end() {
printf '%s\n' "$1" | sed 's/\\n/\n/g'
}
print_help() {
printf 'Icon Lookup\n
Usage:
iconlookup [options]
iconlookup [-bBe] [string]
iconlookup -l [number]
iconlookup (-h | --help)
Prepend icons to list of files based on extension or appended indicator by ls/tree "-F" flag ("/" for directory, "*" for executable etc.)
Options:
-h --help -? Show this screen.
-b --before Prepend str before icon.
-B --begin Prepend str before output.
-e --end Append str after output.
-l --limit Limit line length to [number] characters.'
}
while :; do
case $1 in
-h|-\?|--help)
print_help
exit ;;
-B|--begin)
if [ -n "$2" ]; then
print_begin "$2"
fi
shift ;;
-e|--end)
if [ -n "$2" ]; then
end=1
endstr="$2"
fi
shift ;;
-b|--before)
if [ -n "$2" ]; then
export beforestr="$2"
fi
shift ;;
-l|--limit)
if [ -n "$2" ]; then
export limit="$2"
shift
else
printf 'ERROR: "--limit" requires a non-empty option argument.\n'
exit
fi ;;
--)
shift
break ;;
-?*)
printf 'WARNING: Unknown option ignored: %s\n' "$1" ;;
*) break ;;
esac
shift
done
if [ ! -t 0 ]; then
[ -n "$beforestr" ] && limit="$((limit - ${#beforestr}))"
icon_lookup
else
printf 'ERROR: no data provided...\nExpecting a directory listing in stdin\n'
fi
if [ -n "$end" ]; then
print_end "$endstr"
fi

174
.config/nnn/plugins/.nmv Executable file
View File

@ -0,0 +1,174 @@
#!/usr/bin/env bash
# Description: An almost fully POSIX compliant batch file renamer
#
# Note: nnn auto-detects and invokes this plugin if available
# Whitespace is used as delimiter for read.
# The plugin doesn't support filenames with leading or trailing whitespace
# To use NNN_LIST your shell must support readlink(1)
#
# Capabilities:
# 1. Basic file rename
# 2. Detects order change
# 3. Can move files
# 4. Can remove files
# 5. Switch number pairs to swap filenames
#
# Shell: bash
# Author: KlzXS
# shellcheck disable=SC1090,SC1091
. "$(dirname "$0")"/.nnn-plugin-helper
EDITOR="${EDITOR:-vi}"
TMPDIR="${TMPDIR:-/tmp}"
NNN_INCLUDE_HIDDEN="${NNN_INCLUDE_HIDDEN:-0}"
VERBOSE="${VERBOSE:-0}"
RECURSIVE="${RECURSIVE:-0}"
case "$NNN_TRASH" in
1)
RM_UTIL="trash-put" ;;
2)
RM_UTIL="gio trash" ;;
*)
RM_UTIL="rm -ri" ;;
esac
exit_status=0
if nnn_use_selection "Rename"; then
# shellcheck disable=SC2154
arr=$(tr '\0' '\n' < "$selection")
else
findcmd="find . ! -name ."
if [ "$RECURSIVE" -eq 0 ]; then
findcmd="$findcmd -prune"
fi
if [ "$NNN_INCLUDE_HIDDEN" -eq 0 ]; then
findcmd="$findcmd ! -name \".*\""
fi
if [ -z "$NNN_LIST" ]; then
findcmd="$findcmd -print"
else
findcmd="$findcmd -printf "'"'"$NNN_LIST/%P\n"'"'
fi
arr=$(eval "$findcmd" | sort)
fi
lines=$(printf "%s\n" "$arr" | wc -l)
width=${#lines}
dst_file=$(mktemp "$TMPDIR/.nnnXXXXXX")
trap 'rm -f "$dst_file"' EXIT
printf "%s" "$arr" | awk '{printf("%'"${width}"'d %s\n", NR, $0)}' > "$dst_file"
items=("~")
while IFS='' read -r line; do
if [ -n "$NNN_LIST" ]; then
line=$(readlink "$line" || printf "%s" "$line")
fi
items+=("$line");
done < <(printf "%s\n" "$arr")
$EDITOR "$dst_file"
while read -r num name; do
if [ -z "$name" ]; then
if [ -z "$num" ]; then
continue
fi
printf "%s: unable to parse line, aborting\n" "$0"
exit 1
fi
# check if $num is an integer
if [ ! "$num" -eq "$num" ] 2> /dev/null; then
printf "%s: unable to parse line, aborting\n" "$0"
exit 1
fi
src=${items[$num]}
if [ -z "$src" ]; then
printf "%s: unknown item number %s\n" "$0" "$num" > /dev/stderr
continue
elif [ "$name" != "$src" ]; then
if [ -z "$name" ]; then
continue
fi
if [ ! -e "$src" ] && [ ! -L "$src" ]; then
printf "%s: %s does not exit\n" "$0" "$src" > /dev/stderr
unset "items[$num]"
continue
fi
# handle swaps
if [ -e "$name" ] || [ -L "$name" ]; then
tmp="$name~"
c=0
while [ -e "$tmp" ] || [ -L "$tmp" ]; do
c=$((c+1))
tmp="$tmp~$c"
done
if mv "$name" "$tmp"; then
if [ "$VERBOSE" -ne 0 ]; then
printf "'%s' -> '%s'\n" "$name" "$tmp"
fi
else
printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
exit_status=1
fi
for key in "${!items[@]}"; do
if [ "${items[$key]}" = "$name" ]; then
items[$key]="$tmp"
fi
done
fi
dir=$(dirname "$name")
if [ ! -d "$dir" ] && ! mkdir -p "$dir"; then
printf "%s: failed to create directory tree %s\n" "$0" "$dir" > /dev/stderr
exit_status=1
elif ! mv -i "$src" "$name"; then
printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
exit_status=1
else
if [ -d "$name" ]; then
for key in "${!items[@]}"; do
items[$key]=$(printf "%s" "${items[$key]}" | sed "s|^$src\(\$\|\/\)|$name\1|")
done
if [ "$VERBOSE" -ne 0 ]; then
printf "'%s' => '%s'\n" "$src" "$name"
fi
else
true
if [ "$VERBOSE" -ne 0 ]; then
printf "'%s' -> '%s'\n" "$src" "$name"
fi
fi
fi
fi
unset "items[$num]"
done <"$dst_file"
unset "items[0]"
for item in "${items[@]}"; do
$RM_UTIL "$item"
done
exit $exit_status

View File

@ -0,0 +1,61 @@
#!/usr/bin/env sh
# Description: Helper script for plugins
#
# Shell: POSIX compliant
# Author: Anna Arad
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
export selection
## Set CUR_CTX to 1 to open directory in current context
CUR_CTX=0
export CUR_CTX
NNN_PREFER_SELECTION="${NNN_PREFER_SELECTION:-0}"
export NNN_PREFER_SELECTION
## Ask nnn to switch to directory $1 in context $2.
## If $2 is not provided, the function asks explicitly.
nnn_cd () {
dir="$1"
if [ -z "$NNN_PIPE" ]; then
echo "No pipe file found" 1>&2
return
fi
if [ -n "$2" ]; then
context=$2
elif [ $CUR_CTX -ne 1 ]; then
printf "Choose context 1-4 (blank for current): "
read -r context
fi
printf "%s" "${context:-0}c$dir" > "$NNN_PIPE"
}
cmd_exists () {
type "$1" > /dev/null 2>&1
echo $?
}
nnn_use_selection() {
if ! [ -s "$selection" ]; then
return 1
fi
if [ "$NNN_PREFER_SELECTION" -eq 1 ]; then
return 0
else
[ -n "$1" ] && printf "%s " "$1"
printf "(s)election/(c)urrent? [default=c] "
read -r resp__
if [ "$resp__" = "s" ]; then
return 0
else
return 1
fi
fi
}

22
.config/nnn/plugins/.ntfy Executable file
View File

@ -0,0 +1,22 @@
#!/usr/bin/env sh
# Description: Show a notification
#
# Details: nnn invokes this plugin to show notification when a cp/mv/rm operation is complete.
#
# Dependencies: notify-send (Ubuntu)/ntfy (https://github.com/dschep/ntfy)/osascript (macOS)/notify (Haiku)
#
# Shell: POSIX compliant
# Author: Anna Arad
OS="$(uname)"
if type notify-send >/dev/null 2>&1; then
notify-send nnn "Done!"
elif [ "$OS" = "Darwin" ]; then
osascript -e 'display notification "Done!" with title "nnn"'
elif type ntfy >/dev/null 2>&1; then
ntfy -t nnn send "Done!"
elif [ "$OS" = "Haiku" ]; then
notify --title "nnn" "Done!"
fi

74
.config/nnn/plugins/autojump Executable file
View File

@ -0,0 +1,74 @@
#!/usr/bin/env sh
# Description: Navigate to directory using jump/autojump/zoxide/z
#
# Dependencies:
# - jump - https://github.com/gsamokovarov/jump
# - OR autojump - https://github.com/wting/autojump
# - OR zoxide - https://github.com/ajeetdsouza/zoxide
# - OR z - https://github.com/rupa/z (z requires fzf)
# - OR z (fish) - https://github.com/jethrokuan/z (z requires fzf)
# - OR z.lua - https://github.com/skywind3000/z.lua (z.lua can enhanced with fzf)
#
# Note: The dependencies STORE NAVIGATION PATTERNS
#
# to make z.lua work, you need to set $NNN_ZLUA to the path of script z.lua
#
# Shell: POSIX compliant
# Authors: Marty Buchaus, Dave Snider, Tim Adler, Nick Waywood
if [ ! -p "$NNN_PIPE" ]; then
printf 'ERROR: NNN_PIPE is not set!'
read -r _
exit 2
fi
if type jump >/dev/null 2>&1; then
printf "jump to : "
IFS= read -r line
# shellcheck disable=SC2086
odir="$(jump cd ${line})"
printf "%s" "0c$odir" > "$NNN_PIPE"
elif type autojump >/dev/null 2>&1; then
printf "jump to : "
read -r dir
odir="$(autojump "$dir")"
printf "%s" "0c$odir" > "$NNN_PIPE"
elif type zoxide >/dev/null 2>&1; then
if type fzf >/dev/null 2>&1; then
odir="$(zoxide query -i --)"
printf "%s" "0c$odir" > "$NNN_PIPE"
else
printf "jump to : "
read -r dir
odir="$(zoxide query -- "$dir")"
printf "%s" "0c$odir" > "$NNN_PIPE"
fi
elif type lua >/dev/null 2>&1 && [ -n "$NNN_ZLUA" ]; then
printf "jump to : "
read -r line
if type fzf >/dev/null 2>&1; then
odir="$(lua "$NNN_ZLUA" -l "$line" | fzf --nth 2.. --reverse --inline-info --tac +s -e --height 35%)"
printf "%s" "0c$(echo "$odir" | awk '{print $2}')" > "$NNN_PIPE"
else
odir="$(lua "$NNN_ZLUA" -e "$line")"
printf "%s" "0c$odir" > "$NNN_PIPE"
fi
else
# rupa/z uses $_Z_DATA, jethrokuan/z (=port of z for fish) uses $Z_DATA
datafile="${_Z_DATA:-${Z_DATA:-$HOME/.z}}"
if type fzf >/dev/null 2>&1 && [ -f "$datafile" ]; then
# Read the data from z's file instead of calling
# z so the data doesn't need to be processed twice
sel=$(awk -F "|" '{print $1}' "$datafile" | fzf | awk '{$1=$1};1')
# NOTE: Uncomment this line and comment out the line above if
# you want to see the weightings of the dir's in the fzf pane
# sel=$(awk -F "|" '{printf "%s %s\n", $2, $1}' "$datafile" | fzf | sed 's/^[0-9,.]* *//' | awk '{$1=$1};1')
printf "%s" "0c$sel" > "$NNN_PIPE"
else
printf "No supported autojump script [jump/autojump/zoxide/z (needs fzf)] found"
read -r _
fi
fi

50
.config/nnn/plugins/boom Executable file
View File

@ -0,0 +1,50 @@
#!/usr/bin/env sh
# Description: Play random music (MP3, FLAC, M4A, WEBM, WMA) from current dir.
#
# Dependencies: mocp (or custom)
#
# Note: You may want to set GUIPLAYER.
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
GUIPLAYER="${GUIPLAYER:-""}"
NUMTRACKS="${NUMTRACKS:-100}"
if [ -n "$GUIPLAYER" ]; then
find . -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.m4a" -o -iname "*.webm" -o -iname "*.wma" \) | shuf -n "$NUMTRACKS" | xargs -d "\n" "$GUIPLAYER" > /dev/null 2>&1 &
# detach the player
sleep 1
elif type mocp >/dev/null 2>&1; then
cmd=$(pgrep -x mocp 2>/dev/null)
ret=$cmd
if [ -z "$ret" ]; then
# start MOC server
mocp -S
mocp -o shuffle
else
# mocp running, check if it's playing
state=$(mocp -i | grep "State:" | cut -d' ' -f2)
if [ "$state" = 'PLAY' ]; then
# add up to 100 random audio files
find . -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.m4a" -o -iname "*.webm" -o -iname "*.wma" \) | head -n "$NUMTRACKS" | xargs -d "\n" mocp -a
exit
fi
fi
# clear MOC playlist
mocp -c
mocp -o shuffle
# add up to 100 random audio files
find . -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.m4a" -o -iname "*.webm" -o -iname "*.wma" \) | head -n "$NUMTRACKS" | xargs -d "\n" mocp -a
# start playing
mocp -p
else
printf "moc missing"
read -r _
fi

32
.config/nnn/plugins/bulknew Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env sh
# Description: Allows for creation of multiple files/dirs simultaneously
# Creates a tmp file to write each entry in a separate line
#
# Note: Only relative paths are supported. Absolute paths are ignored
# Leading and trailing whitespace in path names is also ignored
#
# Shell: POSIX compliant
# Author: KlzXS
EDITOR="${EDITOR:-vi}"
TMPDIR="${TMPDIR:-/tmp}"
printf "'f'ile / 'd'ir? "
read -r resp
if [ "$resp" = "f" ]; then
#shellcheck disable=SC2016
cmd='mkdir -p "$(dirname "{}")" && touch "{}"'
elif [ "$resp" = "d" ]; then
cmd='mkdir -p {}'
else
exit 1
fi
tmpfile=$(mktemp "$TMPDIR/.nnnXXXXXX")
$EDITOR "$tmpfile"
sed "/^\//d" "$tmpfile" | xargs -n1 -I{} sh -c "$cmd"
rm "$tmpfile"

56
.config/nnn/plugins/cdpath Executable file
View File

@ -0,0 +1,56 @@
#!/usr/bin/env sh
# Description: 'cd' to the directory from CDPATH
#
# Details: If the CDPATH environment variable is not set, the default value of
# ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/bookmarks will be used.
# You can create this directory and fill it with symbolic links to your
# favorite directories. It's a good idea to add it to CDPATH so that it
# could also be used from the command line outside of nnn.
# The fzf search is done on the directory basename (the first column).
#
# This plugin is an extended version of the bookmarks plugin.
# If you set your CDPATH to ${XDG_CACHE_HOME:-$HOME/.cache}/nnn/bookmarks
# or to the value of BOOKMARKS_DIR, you can use it as a bookmarks replacement.
#
# Shell: POSIX compliant
# Author: Yuri Kloubakov
# shellcheck disable=SC1090,SC1091
. "$(dirname "$0")"/.nnn-plugin-helper
# Get a list of (symbolic links to) directories for every element of CDPATH
get_dirs() {
IFS=':'
for path in $CDPATH; do
for entry in "$path"/*; do
if [ -d "$entry" ]; then
name=$(basename "$entry" | grep -o '^.\{1,24\}')
if [ -h "$entry" ]; then
slink=$(ls -dl -- "$entry")
entry=${slink#*" $entry -> "}
fi
printf "%-24s :%s\n" "${name}" "$entry"
fi
done
done
}
abort() {
echo "$1"
read -r _
exit 1
}
if [ -z "$CDPATH" ]; then
CDPATH="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/bookmarks"
[ -d "$CDPATH" ] || abort "CDPATH is not set and there is no \"$CDPATH\" directory"
fi
dir_list=$(get_dirs)
[ -n "$dir_list" ] || abort "There are no directories to choose from. Check your \"$CDPATH\"."
dir=$(echo "$dir_list" | fzf --nth=1 --delimiter=':' | awk -F: 'END { print $2 }')
if [ -n "$dir" ]; then
nnn_cd "$dir" 0
fi

75
.config/nnn/plugins/chksum Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/env sh
# Description: Create and verify checksums
#
# Note: On macOS, install the relevant checksum packages from Homebrew with:
# brew install coreutils
#
# Details:
# - selection: it will generate one file with the checksums and filenames
# (and with paths if they are in another directory)
# output checksum filename format: checksum_timestamp.checksum_type
# - file: if the file is a checksum, the plugin does the verification
# if the file is not a checksum, checksum will be generated for it
# the output checksum filename will be filename.checksum_type
# - directory: recursively calculates checksum for all the files in the dir
# the output checksum filename will be directory.checksum_type
#
# Shell: POSIX compliant
# Authors: ath3, Arun Prakash Jana
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
resp=f
chsum=md5
checksum_type()
{
echo "possible checksums: md5, sha1, sha224, sha256, sha384, sha512"
printf "create md5 (m), sha256 (s), sha512 (S) (or type one of the above checksums) [default=m]: "
read -r chsum_resp
for chks in md5 sha1 sha224 sha256 sha384 sha512
do
if [ "$chsum_resp" = "$chks" ]; then
chsum=$chsum_resp
return
fi
done
if [ "$chsum_resp" = "s" ]; then
chsum=sha256
elif [ "$chsum_resp" = "S" ]; then
chsum=sha512
fi
}
if [ -s "$selection" ]; then
printf "work with selection (s) or current file (f) [default=f]: "
read -r resp
fi
if [ "$resp" = "s" ]; then
checksum_type
sed 's|'"$PWD/"'||g' < "$selection" | xargs -0 -I{} ${chsum}sum {} > "checksum_$(date '+%Y%m%d%H%M').$chsum"
# Clear selection
if [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi
elif [ -n "$1" ]; then
if [ -f "$1" ]; then
for chks in md5 sha1 sha224 sha256 sha384 sha512
do
if echo "$1" | grep -q \.${chks}$; then
${chks}sum -c < "$1"
read -r _
exit
fi
done
checksum_type
file=$(basename "$1").$chsum
${chsum}sum "$1" > "$file"
elif [ -d "$1" ]; then
checksum_type
file=$(basename "$1").$chsum
find "$1" -type f -exec ${chsum}sum "{}" + > "$file"
fi
fi

80
.config/nnn/plugins/cmusq Executable file
View File

@ -0,0 +1,80 @@
#!/usr/bin/env sh
# Description: Add selection or hovered file/directory to cmus queue
#
# Dependencies: cmus, pgrep, xdotool (optional)
#
# Notes:
# 1. If adding selection, files/dirs are added in the same order they were selected in nnn
# 2. A new window will be opened if cmus is not running already, playback will start immediately
# 3. If cmus is already running, files will be appended to the queue with no forced playback
#
# TODO:
# 1. Add cava and cmus-lyrics as optional dependencies
# 2. Start cava and/or cmus-lyrics in tmux or kitty panes next to cmus
#
# Shell: POSIX compliant
# Author: Kabouik
# (Optional) Set preferred terminal emulator for cmus if not set in your env,
# or leave commented out to use OS default
#TERMINAL="kitty"
if ! type cmus >/dev/null; then
printf "cmus missing"
read -r _
exit 1
fi
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
start_cmus() {
type xdotool >/dev/null && nnnwindow="$(xdotool getactivewindow)"
case "$TERMINAL" in
kitty | gnome-terminal | st)
nohup "$TERMINAL" -- cmus & ;;
havoc)
nohup "$TERMINAL" cmus & ;;
"")
nohup x-terminal-emulator -e cmus & ;;
*)
nohup "$TERMINAL" -e cmus & ;;
esac
# Give the new terminal some time to open
until cmus-remote -C; do sleep 0.1; done
[ -n "$nnnwindow" ] && xdotool windowactivate "$nnnwindow"
} >/dev/null 2>&1
fill_queue() {
if [ "$REPLY" = "s" ]; then
xargs < "$selection" -0 cmus-remote -q
elif [ -n "$1" ]; then
cmus-remote -q "$1"
fi
}
# If active selection,then ask what to do
if [ -s "$selection" ]; then
printf "Queue [s]election or [c]urrently hovered? [default=c]: "
read -r REPLY
fi
# If cmus is not running, start and play queue
if ! pgrep cmus >/dev/null; then
printf "cmus is not running, starting it in a new %s window.\n" "$TERMINAL"
start_cmus
fill_queue "$1"
cmus-remote -p
printf "Files added to cmus queue.\n"
else # Append to existing queue if cmus is already running
fill_queue "$1"
printf "Files appended to current cmus queue.\n"
fi
# Change view
cmus-remote -C "view 4"
# Clear selection
if [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi

62
.config/nnn/plugins/diffs Executable file
View File

@ -0,0 +1,62 @@
#!/usr/bin/env sh
# Description: Show diff of 2 directories or multiple files in vimdiff
#
# Notes:
# 1. vim may show the warning: 'Vim: Warning: Input is not from a terminal'
# press 'Enter' to ignore and proceed.
# 2. if only one file is in selection, the hovered file is considered as the
# second file to diff with
#
# Shell: POSIX compliant
# Authors: Arun Prakash Jana, ath3
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
if type nvim >/dev/null 2>&1; then
diffcmd="nvim -d"
else
diffcmd="vimdiff +0"
fi
dirdiff() {
dir1=$(mktemp "${TMPDIR:-/tmp}"/nnn-"$(basename "$1")".XXXXXXXX)
dir2=$(mktemp "${TMPDIR:-/tmp}"/nnn-"$(basename "$2")".XXXXXXXX)
ls -A1 "$1" > "$dir1"
ls -A1 "$2" > "$dir2"
$diffcmd "$dir1" "$dir2"
rm "$dir1" "$dir2"
}
if [ -s "$selection" ]; then
arr=$(tr '\0' '\n' < "$selection")
if [ "$(echo "$arr" | wc -l)" -gt 1 ]; then
f1="$(echo "$arr" | sed -n '1p')"
f2="$(echo "$arr" | sed -n '2p')"
if [ -d "$f1" ] && [ -d "$f2" ]; then
dirdiff "$f1" "$f2"
else
# If xargs supports the -o option, use it to get rid of:
# Vim: Warning: Input is not from a terminal
# xargs -0 -o vimdiff < $selection
eval xargs -0 "$diffcmd" < "$selection"
fi
elif [ -n "$1" ]; then
f1="$(echo "$arr" | sed -n '1p')"
if [ -d "$f1" ] && [ -d "$1" ]; then
dirdiff "$f1" "$1"
elif [ -f "$f1" ] && [ -f "$1" ]; then
$diffcmd "$f1" "$1"
else
echo "cannot compare file with directory"
fi
else
echo "needs at least 2 files or directories selected for comparison"
fi
fi
# Clear selection
if [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi

77
.config/nnn/plugins/dragdrop Executable file
View File

@ -0,0 +1,77 @@
#!/usr/bin/env sh
# Description: Open a Drag and drop window, to drop files onto other programs.
# Also provides drag and drop window for files.
#
# Dependencies: dragon - https://github.com/mwh/dragon
#
# Notes:
# 1. Files that are dropped will be added to nnn's selection
# Some web-based files will be downloaded to current dir
# with curl and it may overwrite some existing files
# 2. The user has to mm to clear nnn's selection first
#
# Shell: POSIX compliant
# Author: 0xACE
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
resp=f
all=
if type dragon-drag-and-drop >/dev/null 2>&1; then
dnd="dragon-drag-and-drop"
elif type dragon-drop >/dev/null 2>&1; then
dnd="dragon-drop"
else
dnd="dragon"
fi
add_file ()
{
printf '%s\0' "$@" >> "$selection"
}
use_all ()
{
printf "mark --all (a) [default=none]: "
read -r resp
if [ "$resp" = "a" ]; then
all="--all"
else
all=""
fi
}
if [ -s "$selection" ]; then
printf "Drop file (r). Drag selection (s), Drag current directory (d) or drag current file (f) [default=f]: "
read -r resp
else
printf "Drop file (r). Drag current directory (d) or drag current file (f) [default=f]: "
read -r resp
if [ "$resp" = "s" ]; then
resp=f
fi
fi
if [ "$resp" = "s" ]; then
use_all
sed -z 's|'"$PWD/"'||g' < "$selection" | xargs -0 "$dnd" "$all" &
elif [ "$resp" = "d" ]; then
use_all
"$dnd" "$all" "$PWD/"* &
elif [ "$resp" = "r" ]; then
true > "$selection"
"$dnd" --print-path --target | while read -r f
do
if printf "%s" "$f" | grep '^\(https\?\|ftps\?\|s\?ftp\):\/\/' ; then
curl -LJO "$f"
add_file "$PWD/$(basename "$f")"
elif [ -e "$f" ]; then
add_file "$f"
fi
done &
else
if [ -n "$1" ] && [ -e "$1" ]; then
"$dnd" "$1" &
fi
fi

70
.config/nnn/plugins/dups Executable file
View File

@ -0,0 +1,70 @@
#!/usr/bin/env sh
# Description: List non-empty duplicates in the current dir (based on size followed by MD5)
#
# Source: https://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash
#
# Dependencies: find md5sum sort uniq xargs gsed
#
# Notes:
# 1. If the file size exceeds $size_digits digits the file will be misplaced
# 12 digits fit files up to 931GiB
# 2. Bash compatible required for mktemp
#
# Shell: Bash
# Authors: syssyphus, KlzXS
EDITOR="${EDITOR:-vi}"
TMPDIR="${TMPDIR:-/tmp}"
size_digits=12
tmpfile=$(mktemp "$TMPDIR/.nnnXXXXXX")
printf "\
## This is an overview of all duplicate files found.
## Comment out the files you wish to remove. You will be given an option to cancel.
## Lines with double comments (##) are ignored.
## You will have the option to remove the files with force or interactively.\n
" > "$tmpfile"
# shellcheck disable=SC2016
find . -size +0 -type f -printf "%${size_digits}s %p\n" | sort -rn | uniq -w"${size_digits}" -D | sed -e '
s/^ \{0,12\}\([0-9]\{0,12\}\) \(.*\)$/printf "%s %s\\n" "$(md5sum "\2")" "d\1"/
' | tr '\n' '\0' | xargs -0 -n1 sh -c | sort | { uniq -w32 --all-repeated=separate; echo; } | sed -ne '
h
s/^\(.\{32\}\).* d\([0-9]*\)$/## md5sum: \1 size: \2 bytes/p
g
:loop
N
/.*\n$/!b loop
p' | sed -e 's/^.\{32\} \(.*\) d[0-9]*$/\1/' >> "$tmpfile"
"$EDITOR" "$tmpfile"
printf "Remove commented files? (yes/no) [default=n]: "
read -r commented
if [ "$commented" = "y" ]; then
sedcmd="/^##.*/d; /^[^#].*/d; /^$/d; s/^# *\(.*\)$/\1/"
else
printf "Press any key to exit"
read -r _
exit
fi
printf "Remove with force or interactive? (f/i) [default=i]: "
read -r force
if [ "$force" = "f" ]; then
#shellcheck disable=SC2016
sed -e "$sedcmd" "$tmpfile" | tr '\n' '\0' | xargs -0 -r sh -c 'rm -f "$0" "$@" </dev/tty'
else
#shellcheck disable=SC2016
sed -e "$sedcmd" "$tmpfile" | tr '\n' '\0' | xargs -0 -r sh -c 'rm -i "$0" "$@" </dev/tty'
fi
rm "$tmpfile"
printf "Press any key to exit"
read -r _

89
.config/nnn/plugins/finder Executable file
View File

@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Description: Run custom search and list results in smart context
#
# Note: This plugin retains search history
#
# Usage:
# Run plugin and enter e.g. "-size +10M" to list files in current
# directory larger than 10M. By default entered expressions are
# interpreted as arguments to find. Results have to be NUL
# terminated which is done by default for find. Alternatively one
# can prepend a '$' to run a custom search program such as fd or
# ripgrep. Entered expressions will be saved in history file to
# be listed as bookmarks and and can be entered by index and edited.
#
# Shell: Bash
# Author: Arun Prakash Jana, Luuk van Baal
TMPDIR="${TMPDIR:-/tmp}"
NNN_FINDHIST="${NNN_FINDHIST:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/finderbms}"
NNN_FINDHISTLEN="${NNN_FINDHISTLEN:-10000}"
printexamples() {
printf -- "-maxdepth 1 -name pattern
-maxdepth 1 -size +100M
\$fd -0 pattern
\$fd -0 -d 2 -S +100M
\$grep -rlZ pattern
\$rg -l0 pattern
\$fzf -m | tr '\\\n' '\\\0'\n"
}
printexprs() {
for ((i = "$1"; i < ${#fexprs[@]}; i++)); do
printf '%s\t%s\n' "$((i + 1))" "${fexprs[$i]}"
done
}
mapexpr() {
if [ "$fexpr" -eq "$fexpr" ] 2>/dev/null; then
fexpr=${fexprs[$((fexpr - 1))]}
read -r -e -p "Search expression: " -i "$fexpr" fexpr
else
return 1
fi
}
readexpr() {
case "$fexpr" in
h) clear
printf "Examples:\n"
mapfile -t fexprs < <(printexamples)
printexprs 0
read -r -p "Search expression or index: " fexpr
mapexpr
[ -n "$fexpr" ] && readexpr ;;
\$*) cmd="${fexpr:1}" ;;
*) mapexpr && readexpr
cmd="find $fexpr -print0" ;;
esac
}
clear
[ -f "$NNN_FINDHIST" ] || printexamples > "$NNN_FINDHIST"
mapfile -t fexprs < <(sort "$NNN_FINDHIST" | uniq -c | sort -nr | head -n5 |\
awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}')
printf "Most used search expressions:\n"
printexprs 0
mapfile -t -O"$i" fexprs < <(tac "$NNN_FINDHIST" | awk '!a[$0]++' | head -n5)
printf "Most recently used search expressions:\n"
printexprs "$i"
read -r -p "Search expression or index (h for help): " fexpr
mapexpr
if [ -n "$fexpr" ]; then
printf "+l" > "$NNN_PIPE"
while :; do
readexpr
eval "$cmd" > "$NNN_PIPE" && break
read -r -e -p "Search expression: " -i "$fexpr" fexpr
done
if [ -n "$fexpr" ]; then
tail -n"$NNN_FINDHISTLEN" "$NNN_FINDHIST" > "$TMPDIR/finderbms"
printf "%s\n" "$fexpr" >> "$TMPDIR/finderbms"
mv "$TMPDIR/finderbms" "$NNN_FINDHIST"
fi
fi

75
.config/nnn/plugins/fixname Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/env bash
# Description: Clean filename or dirname (either hovered or selections)
# to be more shell-friendly. This script cleans
# non A-Za-z0-9._- characters.
# and replaces it with underscore (_).
#
# It supports cleaning single/double quote, newline,
# leading, trailing spaces.
#
# eg.
# to be continued (つづく).mp4 -> to_be_continued______.mp4
# [work] stuff.txt -> _work__stuff.txt
# home's server -> home_s_server
# qwe\trty -> __qwe_rty
#
# And if there are two almost similar filenames
# like: 'asd]f' and 'asd f' both will be renamed to 'asd_f',
# to avoid overwriting, the last file will be prepended by _.
# So they will be: 'asd_f' and '_asd_f'
#
# Dependencies: sed
#
# Shell: Bash
# Author: Benawi Adha
prompt=true
sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
cleanup() {
# printf "%s" "$1" | sed -e 's/[^A-Za-z0-9._-]/_/g'
printf "%s" "$1" | sed 's/[^A-Za-z0-9._-]/_/g' | sed ':a;N;$!ba;s/\n/_/g'
}
if [ -s "$sel" ]; then
targets=()
while IFS= read -r -d '' i || [ -n "$i" ]; do
targets+=( "$(basename "$i")" )
done < "$sel"
else
targets=("$1")
fi
for i in "${targets[@]}"; do
printf "%s -> %s\n" "$i" "$(cleanup "$i")";
done
if $prompt; then
echo
printf "Proceed [Yn]? "
read -r input
case "$input" in
y|Y|'')
;;
*)
echo "Canceled"
exit
;;
esac
fi
for i in "${targets[@]}"; do
if [ "$i" != "$(cleanup "$i")" ]; then
tmp=''
if [ -e "$(cleanup "$i")" ]; then
tmp='_'
fi
mv "$i" "$tmp$(cleanup "$i")";
fi
done
# Clear selection
if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi

89
.config/nnn/plugins/fzcd Executable file
View File

@ -0,0 +1,89 @@
#!/usr/bin/env sh
# Description: Fuzzy search multiple locations read-in from a path-list file
# (or $PWD) and open the selected file's dir in a smart context.
# Dependencies: fzf, find (only for multi-location search)
#
# Details: Paths in list file should be newline-separated absolute paths.
# Paths can be file paths; the script will scan the parent dirs.
#
# The path-list file precedence is:
# - "$1" (the hovered file) if it exists, is plain-text and the
# first line points to an existing file
# - "$LIST" if set below
# - "$2" (the current directory) [mimics plugin fzcd behaviour]
#
# The path-list file can be generated easily:
# - pick the (file)paths in picker mode to path-list file
# - OR, edit selection in nnn and save as path-list file
#
# Shell: POSIX compliant
# Author: Anna Arad, Arun Prakash Jana, KlzXS
IFS="$(printf '\n\r')"
# shellcheck disable=SC1090,SC1091
. "$(dirname "$0")"/.nnn-plugin-helper
CTX=+
LIST="${LIST:-""}"
if ! type fzf >/dev/null 2>&1; then
printf "fzf missing"
read -r _
exit 1
fi
if [ -n "$1" ] && [ "$(file -b --mime-type "$1")" = 'text/plain' ] && [ -e "$(head -1 "$1")" ]; then
LIST="$1"
elif ! [ -s "$LIST" ]; then
sel=$(fzf)
# Show only the file and parent dir
# sel=$(fzf --delimiter / --with-nth=-2,-1 --tiebreak=begin --info=hidden)
LIST=''
fi
if [ -n "$LIST" ]; then
if type find >/dev/null 2>&1; then
tmpfile=$(mktemp /tmp/abc-script.XXXXXX)
while IFS= read -r path; do
if [ -d "$path" ]; then
printf "%s\n" "$path" >> "$tmpfile"
elif [ -f "$path" ]; then
printf "%s\n" "$(dirname "$path")" >> "$tmpfile"
fi
done < "$LIST"
sel=$(xargs -d '\n' < "$tmpfile" -I{} find {} -type f -printf "%H//%P\n" | sed '/.*\/\/\(\..*\|.*\/\..*\)/d; s:/\+:/:g' | fzf --delimiter / --tiebreak=begin --info=hidden)
# Alternative for 'fd'
# sel=$(xargs -d '\n' < "$tmpfile" fd . | fzf --delimiter / --tiebreak=begin --info=hidden)
rm "$tmpfile"
else
printf "find missing"
read -r _
exit 1
fi
fi
if [ -n "$sel" ]; then
if [ "$sel" = "." ] || { ! [ -d "$sel" ] && ! [ -f "$sel" ]; }; then
exit 0
fi
# Check if the selected path returned by fzf command is absolute
case $sel in
/*) nnn_cd "$sel" "$CTX" ;;
*)
# Remove "./" prefix if it exists
sel="${sel#./}"
if [ "$PWD" = "/" ]; then
nnn_cd "/$sel" "$CTX"
else
nnn_cd "$PWD/$sel" "$CTX"
fi;;
esac
fi

40
.config/nnn/plugins/fzhist Executable file
View File

@ -0,0 +1,40 @@
#!/usr/bin/env sh
# Description: Fuzzy find a command from history,
# edit in $EDITOR and run as a command
#
# Note: Supports only bash and fish history
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
if type fzf >/dev/null 2>&1; then
fuzzy=fzf
else
exit 1
fi
shellname="$(basename "$SHELL")"
if [ "$shellname" = "bash" ]; then
hist_file="$HOME/.bash_history"
entry="$("$fuzzy" < "$hist_file")"
elif [ "$shellname" = "fish" ]; then
hist_file="$HOME/.local/share/fish/fish_history"
entry="$(grep "\- cmd: " "$hist_file" | cut -c 8- | "$fuzzy")"
fi
if [ -n "$entry" ]; then
tmpfile=$(mktemp)
echo "$entry" >> "$tmpfile"
$EDITOR "$tmpfile"
if [ -s "$tmpfile" ]; then
$SHELL -c "$(cat "$tmpfile")"
fi
rm "$tmpfile"
printf "Press any key to exit"
read -r _
fi

83
.config/nnn/plugins/fzopen Executable file
View File

@ -0,0 +1,83 @@
#!/usr/bin/env sh
# Description: Regular mode:
# Fuzzy find a file in directory subtree.
# Opens in $VISUAL or $EDITOR if text.
# Opens other type of files with xdg-open.
# Work only with a single file selected.
#
# Picker mode:
# If picker mode output file is passed, it
# will be overwritten with any picked files.
# Leaves untouched if no file is picked.
# Works with single/multiple files selected.
#
# Dependencies: fd/find, fzf/skim, xdg-open/open (on macOS)
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
NUKE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke"
USE_NUKE=0
# shellcheck disable=SC1090,SC1091
. "$(dirname "$0")"/.nnn-plugin-helper
if type fzf >/dev/null 2>&1; then
cmd="$FZF_DEFAULT_COMMAND"
if type fd >/dev/null 2>&1; then
[ -z "$cmd" ] && cmd="fd -t f 2>/dev/null"
else
[ -z "$cmd" ] && cmd="find . -type f 2>/dev/null"
fi
entry="$(eval "$cmd" | fzf -m)"
# To show only the file name
# entry=$(find . -type f 2>/dev/null | fzf --delimiter / --with-nth=-1 --tiebreak=begin --info=hidden)
elif type sk >/dev/null 2>&1; then
entry=$(find . -type f 2>/dev/null | sk)
else
exit 1
fi
# Check for picker mode
if [ "$3" ]; then
if [ "$entry" ]; then
case "$entry" in
/*) fullpath="$entry" ;;
*) fullpath="$PWD/$entry" ;;
esac
if [ "-" = "$3" ]; then
printf "%s\n" "$fullpath"
else
printf "%s\n" "$fullpath" > "$3"
fi
# Tell `nnn` to clear its internal selection
printf "%s" "0p" > "$NNN_PIPE"
fi
exit 0
fi
if [ "$USE_NUKE" -ne 0 ]; then
"$NUKE" "$entry"
exit 0
fi
# Open the file (works for a single file only)
cmd_file=""
cmd_open=""
if uname | grep -q "Darwin"; then
cmd_file="file -bIL"
cmd_open="open"
else
cmd_file="file -biL"
cmd_open="xdg-open"
fi
case "$($cmd_file "$entry")" in
*text*)
"${VISUAL:-$EDITOR}" "$entry" ;;
*)
$cmd_open "$entry" >/dev/null 2>&1 ;;
esac

59
.config/nnn/plugins/fzplug Executable file
View File

@ -0,0 +1,59 @@
#!/usr/bin/env sh
# Description: Fuzzy find and execute nnn plugins (and optionally,
# custom scripts located elsewhere).
# Description and details of plugins can be previewed
# from the fzf interface. Use `?` to toggle preview
# pane on and off, ^Up/^Dn to scroll.
#
# Dependencies: find, fzf, cat (or bat, if installed)
#
# Note: For better compatibility with as many nnn plugins as possible,
# fzplug will first execute the chosen script on the file hovered
# in nnn, and upon failure, try to run it with no target (i.e on
# an active selection, if present).
#
# Shell: POSIX compliant
# Author: Kabouik
# Optional scripts sources
# Leave blank or fill with the absolute path of a folder containing executable
# scripts other than nnn plugins (e.g., "$HOME/.local/share/nautilus/scripts",
# since there are numerous Nautilus script git repositories).
# Add extra variables if needed, make sure you call them in the find command.
#CUSTOMDIR1="$HOME/.local/share/nautilus/scripts"
CUSTOMDIR1=""
CUSTOMDIR2=""
nnnpluginsdir="$HOME/.config/nnn/plugins"
# Preview with bat if installed
if type bat >/dev/null; then
BAT="bat --terminal-width='$(tput cols)' --decorations=always --color=always --style='${BAT_STYLE:-header,numbers}'"
fi
plugin=$(find "$nnnpluginsdir" "$CUSTOMDIR1" "$CUSTOMDIR2" \
-maxdepth 3 -perm -111 -type f 2>/dev/null | fzf --ansi --preview \
"${BAT:-cat} {}" --preview-window="right:66%:wrap" --delimiter / \
--with-nth -1 --bind="?:toggle-preview")
# Try running the script on the hovered file, and abort
# abort if no plugin was selected (ESC or ^C pressed).
err=0
if ! [ "$plugin" = "" ]; then
"$plugin" "$1" || err=1
fi
# If attempt with hovered file fails, try without any target
# (nnn selections should still be passed to the script in that case)
if [ "$err" -eq "1" ]; then
clear && "$plugin" || err=2
fi
# Abort and show error if both fail
if [ "$err" -eq "2" ]; then
sep="\n---\n"
printf "$sep""Failed to execute '%s'. See error above or try without fzfplug. Press return to continue. " "$plugin" && read -r _ && clear
fi

70
.config/nnn/plugins/getplugs Executable file
View File

@ -0,0 +1,70 @@
#!/usr/bin/env sh
# Description: Update nnn plugins to installed nnn version
#
# Shell: POSIX compliant
# Authors: Arun Prakash Jana, KlzXS
CONFIG_DIR=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/
PLUGIN_DIR=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins
merge () {
if type nvim >/dev/null 2>&1; then
nvim -d "$1" "$2"
else
vimdiff +0 "$1" "$2"
fi
}
prompt () {
printf "%s\n" "Plugin $1 already exists and is different."
printf "Keep (k), merge (m), overwrite (o) [default: k]? "
read -r operation
if [ "$operation" = "m" ]; then
op="merge"
elif [ "$operation" = "o" ]; then
op="cp -vRf"
else
op="true"
fi
}
if [ "$1" = "master" ] ; then
VER="master"
ARCHIVE_URL=https://github.com/jarun/nnn/archive/master.tar.gz
elif type nnn >/dev/null 2>&1; then
VER=$(nnn -V)
ARCHIVE_URL=https://github.com/jarun/nnn/releases/download/v"$VER"/nnn-v"$VER".tar.gz
else
echo "nnn is not installed"
exit 1
fi
# backup any earlier plugins
if [ -d "$PLUGIN_DIR" ]; then
tar -C "$CONFIG_DIR" -czf "$CONFIG_DIR""plugins-$(date '+%Y%m%d%H%M').tar.gz" plugins/
fi
mkdir -p "$PLUGIN_DIR"
cd "$CONFIG_DIR" || exit 1
curl -Ls "$ARCHIVE_URL" -o nnn-"$VER".tar.gz
tar -zxf nnn-"$VER".tar.gz
cd nnn-"$VER"/plugins || exit 1
# shellcheck disable=SC2044
# We do not use obnoxious names for plugins
for f in $(find . -maxdepth 1 \( ! -iname "." ! -iname "*.md" \)); do
if [ -f ../../plugins/"$f" ]; then
if [ "$(diff --brief "$f" ../../plugins/"$f")" ]; then
prompt "$f"
$op "$f" ../../plugins/
fi
else
cp -vRf "$f" ../../plugins/
fi
done
cd ../.. || exit 1
rm -rf nnn-"$VER"/ nnn-"$VER".tar.gz

15
.config/nnn/plugins/gitroot Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env sh
# Description: cd to the top level of the current git repository in the current context
# Dependencies: git
# Shell: sh
# Author: https://github.com/PatrickF1
root="$(git rev-parse --show-toplevel 2>/dev/null)"
if [ -n "$root" ]; then
printf "%s" "0c$root" > "$NNN_PIPE"
else
printf "Not in a git repository"
read -r _
exit 1
fi

28
.config/nnn/plugins/gpgd Executable file
View File

@ -0,0 +1,28 @@
#!/usr/bin/env sh
# Description: Decrypts selected files using gpg. The contents of the
# decrypted file are stored in a file with extension .dec
#
# Note: If an appropriate private key cannot be found gpg silently
# prints a message in the background and no files are written.
#
# Shell: POSIX compliant
# Author: KlzXS
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
printf "(s)election/(c)urrent? [default=c] "
read -r resp
if [ "$resp" = "s" ]; then
files=$(tr '\0' '\n' < "$selection")
else
files=$1
fi
printf "%s" "$files" | xargs -n1 -I{} gpg --decrypt --output "{}.dec" {}
# Clear selection
if [ "$resp" = "s" ] && [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi

45
.config/nnn/plugins/gpge Executable file
View File

@ -0,0 +1,45 @@
#!/usr/bin/env sh
# Description: Encrypts selected files using gpg. Can encrypt
# asymmetrically (key) or symmetrically (passphrase).
# If asymmetric encryption is chosen a key can be
# chosen from the list of capable public keys using fzf.
#
# Note: Symmetric encryption only works for a single (current) file as per gpg limitations
#
# Shell: POSIX compliant
# Author: KlzXS
# shellcheck disable=SC1090,SC1091
. "$(dirname "$0")"/.nnn-plugin-helper
printf "(s)ymmetric, (a)symmetric? [default=a] "
read -r symmetry
if [ "$symmetry" = "s" ]; then
gpg --symmetric "$1"
else
if nnn_use_selection; then
clear_sel=1
# shellcheck disable=SC2154
files=$(tr '\0' '\n' < "$selection")
else
clear_sel=0
files=$1
fi
keyids=$(gpg --list-public-keys --with-colons | grep -E "pub:(.*:){10}.*[eE].*:" | awk -F ":" '{print $5}')
#awk needs literal $10
#shellcheck disable=SC2016
keyuids=$(printf "%s" "$keyids" | xargs -n1 -I{} sh -c 'gpg --list-key --with-colons "{}" | grep "uid" | awk -F ":" '\''{printf "%s %s\n", "{}", $10}'\''')
recipient=$(printf "%s" "$keyuids" | fzf | awk '{print $1}')
printf "%s" "$files" | xargs -n1 gpg --encrypt --recipient "$recipient"
# Clear selection
if [ "$clear_sel" -eq 1 ] && [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi
fi

21
.config/nnn/plugins/gsconnect Executable file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env sh
#set -x
# Description: Send the selected (or hovered) files to your Android device using gsconnect daemon.js.
# GSConnect must be configured on the Android device and the PC.
#
# Shell: POSIX compliant
# Author: Darukutsu
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
gsconnect=$HOME/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/daemon.js
ids=$($gsconnect -l)
for id in $ids; do
if [ -s "$selection" ]; then
xargs -0 < "$selection" -I{} "$gsconnect" -d "$id" --share-file="{}"
# Clear selection
printf "-" > "$NNN_PIPE"
else
"$gsconnect" -d "$id" --share-file="$2/$1"
fi
done

49
.config/nnn/plugins/gutenread Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env sh
# Description: Browse Project Gutenberg catalogue by popularity, then download
# and read a book of your choice.
#
# Details: Set the variable EBOOK_ID to download in html format and read in w3m.
# Clear EBOOK_ID to browse available ebooks by popularity and set it to
# the ID once you find an interesting one.
# To download and read in epub format set READER to an epub reader like
# epr: https://github.com/wustho/epr
#
# More on EBOOK_ID:
# Wuthering Heights by Emily Brontë is at https://www.gutenberg.org/ebooks/768
# So EBOOK_ID would be 768
#
# Downloaded ebooks are at ${XDG_CACHE_HOME:-$HOME/.cache}/nnn/gutenbooks/
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
EBOOK_ID="${EBOOK_ID:-""}"
DIR="${XDG_CACHE_HOME:-$HOME/.cache}/nnn/gutenbooks/$EBOOK_ID"
BROWSE_LINK="https://www.gutenberg.org/ebooks/search/?sort_order=downloads"
BROWSER="${BROWSER:-w3m}"
READER="${READER:-""}"
if [ -n "$EBOOK_ID" ]; then
if [ ! -e "$DIR" ]; then
mkdir -p "$DIR"
cd "$DIR" || exit 1
if [ -z "$READER" ]; then
curl -L -O "https://www.gutenberg.org/files/$EBOOK_ID/$EBOOK_ID-h.zip"
unzip "$EBOOK_ID"-h.zip
else
curl -L -o "$EBOOK_ID".epub "https://www.gutenberg.org/ebooks/$EBOOK_ID.epub.noimages"
fi
fi
if [ -d "$DIR" ]; then
if [ -z "$READER" ]; then
"$BROWSER" "$DIR/$EBOOK_ID-h/$EBOOK_ID-h.htm"
else
"$READER" "$DIR/$EBOOK_ID.epub"
fi
fi
else
"$BROWSER" "$BROWSE_LINK"
fi

31
.config/nnn/plugins/imgresize Executable file
View File

@ -0,0 +1,31 @@
#!/usr/bin/env sh
# Description: Resize images in a directory to screen resolution with imgp
#
# Dependencipes: imgp - https://github.com/jarun/imgp
#
# Notes:
# 1. Set res to avoid the desktop resolution prompt each time
# 2. MINSIZE is set to 1MB by default, adjust it if you want
# 3. imgp options used:
# a - adaptive mode
# c - convert PNG to JPG
# k - skip images matching specified hres/vres
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
# set resolution (e.g. 1920x1080)
res="${RESOLUTION}"
# set minimum image size (in bytes) to resize (default: 1MB)
MINSIZE="${MINSIZE:-1048576}"
if [ -z "$res" ]; then
printf "desktop resolution (hxv): "
read -r res
fi
if [ -n "$res" ] && [ -n "$MINSIZE" ]; then
imgp -ackx "$res" -s "$MINSIZE"
fi

597
.config/nnn/plugins/imgur Executable file
View File

@ -0,0 +1,597 @@
#!/usr/bin/env bash
##########################################################################
# The MIT License
#
# Copyright (c) jomo
#
# 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.
##########################################################################
# https://github.com/jomo/imgur-screenshot
# https://help.imgur.com/hc/en-us/articles/209592766-Tools-for-Imgur
#
# Slightly modified for `nnn` integration
#
# Shell: Bash
# Description: Upload an image file to imgur
if [ "${1}" = "--debug" ]; then
echo "########################################"
echo "Enabling debug mode"
echo "Please remove credentials before pasting"
echo "########################################"
echo ""
uname -a
for arg in ${0} "${@}"; do
echo -n "'${arg}' "
done
echo -e "\n"
shift
set -x
fi
current_version="v1.7.4"
function is_mac() {
uname | grep -q "Darwin"
}
### IMGUR-SCREENSHOT DEFAULT CONFIG ####
# You can override the config in ~/.config/imgur-screenshot/settings.conf
imgur_anon_id="ea6c0ef2987808e"
imgur_icon_path="${HOME}/Pictures/imgur.png"
imgur_acct_key=""
imgur_secret=""
login="false"
album_title=""
album_id=""
credentials_file="${HOME}/.config/imgur-screenshot/credentials.conf"
file_name_format="imgur-%Y_%m_%d-%H:%M:%S.png" # when using scrot, must end with .png!
file_dir="${HOME}/Pictures"
upload_connect_timeout="5"
upload_timeout="120"
upload_retries="1"
# shellcheck disable=SC2034
if is_mac; then
screenshot_select_command="screencapture -i %img"
screenshot_window_command="screencapture -iWa %img"
screenshot_full_command="screencapture %img"
open_command="open %url"
else
screenshot_select_command="scrot -s %img"
screenshot_window_command="scrot %img"
screenshot_full_command="scrot %img"
open_command="xdg-open %url"
fi
open="true"
mode="select"
edit_command="gimp %img"
edit="false"
exit_on_album_creation_fail="true"
log_file="${HOME}/.imgur-screenshot.log"
auto_delete=""
copy_url="true"
keep_file="true"
check_update="true"
# NOTICE: if you make changes here, also edit the docs at
# https://github.com/jomo/imgur-screenshot/wiki/Config
# You can override the config in ~/.config/imgur-screenshot/settings.conf
############## END CONFIG ##############
settings_path="${HOME}/.config/imgur-screenshot/settings.conf"
if [ -f "${settings_path}" ]; then
# shellcheck disable=SC1090
source "${settings_path}"
fi
# dependency check
if [ "${1}" = "--check" ]; then
(type grep &>/dev/null && echo "OK: found grep") || echo "ERROR: grep not found"
if is_mac; then
if type growlnotify &>/dev/null; then
echo "OK: found growlnotify"
elif type terminal-notifier &>/dev/null; then
echo "OK: found terminal-notifier"
else
echo "ERROR: growlnotify nor terminal-notifier found"
fi
(type screencapture &>/dev/null && echo "OK: found screencapture") || echo "ERROR: screencapture not found"
(type pbcopy &>/dev/null && echo "OK: found pbcopy") || echo "ERROR: pbcopy not found"
else
(type notify-send &>/dev/null && echo "OK: found notify-send") || echo "ERROR: notify-send (from libnotify-bin) not found"
(type scrot &>/dev/null && echo "OK: found scrot") || echo "ERROR: scrot not found"
(type xclip &>/dev/null && echo "OK: found xclip") || echo "ERROR: xclip not found"
fi
(type curl &>/dev/null && echo "OK: found curl") || echo "ERROR: curl not found"
exit 0
fi
# notify <'ok'|'error'> <title> <text>
function notify() {
if is_mac; then
if type growlnotify &>/dev/null; then
growlnotify --icon "${imgur_icon_path}" --iconpath "${imgur_icon_path}" --title "${2}" --message "${3}"
else
terminal-notifier -appIcon "${imgur_icon_path}" -contentImage "${imgur_icon_path}" -title "imgur: ${2}" -message "${3}"
fi
else
if [ "${1}" = "error" ]; then
notify-send -a ImgurScreenshot -u critical -c "im.error" -i "${imgur_icon_path}" -t 500 "imgur: ${2}" "${3}"
else
notify-send -a ImgurScreenshot -u low -c "transfer.complete" -i "${imgur_icon_path}" -t 500 "imgur: ${2}" "${3}"
fi
fi
}
function take_screenshot() {
echo "Please select area"
is_mac || sleep 0.1 # https://bbs.archlinux.org/viewtopic.php?pid=1246173#p1246173
cmd="screenshot_${mode}_command"
cmd=${!cmd//\%img/${1}}
if ! shot_err="$(${cmd} &>/dev/null)"; then #takes a screenshot with selection
echo "Failed to take screenshot '${1}': '${shot_err}'. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting" | tee -a "${log_file}"
notify error "Something went wrong :(" "Information has been logged"
exit 1
fi
}
function check_for_update() {
# exit non-zero on HTTP error, output only the body (no stats) but output errors, follow redirects, output everything to stdout
remote_version="$(curl --compressed -fsSL --stderr - "https://api.github.com/repos/jomo/imgur-screenshot/releases" | grep -Em 1 --color 'tag_name":\s*".*"' | cut -d '"' -f 4)"
if [ -n "$remote_version" ]; then
if [ ! "${current_version}" = "${remote_version}" ] && [ -n "${current_version}" ] && [ -n "${remote_version}" ]; then
echo "Update found!"
echo "Version ${remote_version} is available (You have ${current_version})"
notify ok "Update found" "Version ${remote_version} is available (You have ${current_version}). https://github.com/jomo/imgur-screenshot"
echo "Check https://github.com/jomo/imgur-screenshot/releases/${remote_version} for more info."
elif [ -z "${current_version}" ] || [ -z "${remote_version}" ]; then
echo "Invalid empty version string"
echo "Current (local) version: '${current_version}'"
echo "Latest (remote) version: '${remote_version}'"
else
echo "Version ${current_version} is up to date."
fi
else
echo "Failed to check for latest version: ${remote_version}"
fi
}
function check_oauth2_client_secrets() {
if [ -z "${imgur_acct_key}" ] || [ -z "${imgur_secret}" ]; then
echo "In order to upload to your account, register a new application at:"
echo "https://api.imgur.com/oauth2/addclient"
echo "Select 'OAuth 2 authorization without a callback URL'"
echo "Then, set the imgur_acct_key (Client ID) and imgur_secret in your config."
exit 1
fi
}
function load_access_token() {
token_expire_time=0
# check for saved access_token and its expiration date
if [ -f "${credentials_file}" ]; then
# shellcheck disable=SC1090
source "${credentials_file}"
fi
current_time="$(date +%s)"
preemptive_refresh_time="$((10*60))"
expired="$((current_time > (token_expire_time - preemptive_refresh_time)))"
if [ -n "${refresh_token}" ]; then
# token already set
if [ "${expired}" -eq "0" ]; then
# token expired
refresh_access_token "${credentials_file}"
fi
else
acquire_access_token "${credentials_file}"
fi
}
function acquire_access_token() {
check_oauth2_client_secrets
# prompt for a PIN
authorize_url="https://api.imgur.com/oauth2/authorize?client_id=${imgur_acct_key}&response_type=pin"
echo "Go to"
echo "${authorize_url}"
echo "and grant access to this application."
read -rp "Enter the PIN: " imgur_pin
if [ -z "${imgur_pin}" ]; then
echo "PIN not entered, exiting"
exit 1
fi
# exchange the PIN for access token and refresh token
response="$(curl --compressed -fsSL --stderr - \
-F "client_id=${imgur_acct_key}" \
-F "client_secret=${imgur_secret}" \
-F "grant_type=pin" \
-F "pin=${imgur_pin}" \
https://api.imgur.com/oauth2/token)"
save_access_token "${response}" "${1}"
}
function refresh_access_token() {
check_oauth2_client_secrets
token_url="https://api.imgur.com/oauth2/token"
# exchange the refresh token for access_token and refresh_token
if ! response="$(curl --compressed -fsSL --stderr - \
-F "client_id=${imgur_acct_key}" \
-F "client_secret=${imgur_secret}" \
-F "grant_type=refresh_token" \
-F "refresh_token=${refresh_token}" \
"${token_url}"
)"; then
# curl failed
handle_upload_error "${response}" "${token_url}"
exit 1
fi
save_access_token "${response}" "${1}"
}
function save_access_token() {
if ! grep -q "access_token" <<<"${1}"; then
# server did not send access_token
echo "Error: Something is wrong with your credentials:"
echo "${1}"
exit 1
fi
access_token="$(grep -Eo 'access_token":".*"' <<<"${1}" | cut -d '"' -f 3)"
refresh_token="$(grep -Eo 'refresh_token":".*"' <<<"${1}" | cut -d '"' -f 3)"
expires_in="$(grep -Eo 'expires_in":[0-9]*' <<<"${1}" | cut -d ':' -f 2)"
token_expire_time="$(( $(date +%s) + expires_in ))"
# create dir if not exist
mkdir -p "$(dirname "${2}")" 2>/dev/null
touch "${2}" && chmod 600 "${2}"
cat <<EOF > "${2}"
access_token="${access_token}"
refresh_token="${refresh_token}"
token_expire_time="${token_expire_time}"
EOF
}
function fetch_account_info() {
response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/account/me)"
if grep -Eq '"success":\s*true' <<<"${response}"; then
username="$(grep -Eo '"url":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
echo "Logged in as ${username}."
echo "https://${username}.imgur.com"
else
echo "Failed to fetch info: ${response}"
fi
}
function delete_image() {
response="$(curl --compressed -X DELETE -fsSL --stderr - -H "Authorization: Client-ID ${1}" "https://api.imgur.com/3/image/${2}")"
if grep -Eq '"success":\s*true' <<<"${response}"; then
echo "Image successfully deleted (delete hash: ${2})." >> "${3}"
else
echo "The Image could not be deleted: ${response}." >> "${3}"
fi
}
function upload_authenticated_image() {
echo "Uploading '${1}'..."
title="$(echo "${1}" | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev)"
if [ -n "${album_id}" ]; then
response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -F "title=${title}" -F "image=@\"${1}\"" -F "album=${album_id}" -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/image)"
else
response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -F "title=${title}" -F "image=@\"${1}\"" -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/image)"
fi
# JSON parser premium edition (not really)
if grep -Eq '"success":\s*true' <<<"${response}"; then
img_id="$(grep -Eo '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
img_ext="$(grep -Eo '"link":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev)" # "link" itself has ugly '\/' escaping and no https!
del_id="$(grep -Eo '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
if [ -n "${auto_delete}" ]; then
export -f delete_image
echo "Deleting image in ${auto_delete} seconds."
nohup /bin/bash -c "sleep ${auto_delete} && delete_image ${imgur_anon_id} ${del_id} ${log_file}" &
fi
handle_upload_success "https://i.imgur.com/${img_id}.${img_ext}" "https://imgur.com/delete/${del_id}" "${1}"
else # upload failed
err_msg="$(grep -Eo '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
test -z "${err_msg}" && err_msg="${response}"
handle_upload_error "${err_msg}" "${1}"
fi
}
function upload_anonymous_image() {
echo "Uploading '${1}'..."
title="$(echo "${1}" | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev)"
if [ -n "${album_id}" ]; then
response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Client-ID ${imgur_anon_id}" -F "title=${title}" -F "image=@\"${1}\"" -F "album=${album_id}" https://api.imgur.com/3/image)"
else
response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Client-ID ${imgur_anon_id}" -F "title=${title}" -F "image=@\"${1}\"" https://api.imgur.com/3/image)"
fi
# JSON parser premium edition (not really)
if grep -Eq '"success":\s*true' <<<"${response}"; then
img_id="$(grep -Eo '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
img_ext="$(grep -Eo '"link":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev)" # "link" itself has ugly '\/' escaping and no https!
del_id="$(grep -Eo '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
if [ -n "${auto_delete}" ]; then
export -f delete_image
echo "Deleting image in ${auto_delete} seconds."
nohup /bin/bash -c "sleep ${auto_delete} && delete_image ${imgur_anon_id} ${del_id} ${log_file}" &
fi
handle_upload_success "https://i.imgur.com/${img_id}.${img_ext}" "https://imgur.com/delete/${del_id}" "${1}"
else # upload failed
err_msg="$(grep -Eo '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
test -z "${err_msg}" && err_msg="${response}"
handle_upload_error "${err_msg}" "${1}"
fi
}
function handle_upload_success() {
echo ""
echo "image link: ${1}"
echo "delete link: ${2}"
if [ "${copy_url}" = "true" ] && [ -z "${album_title}" ]; then
if is_mac; then
echo -n "${1}" | pbcopy
else
echo -n "${1}" | xclip -selection clipboard
fi
echo "URL copied to clipboard"
fi
# print to log file: image link, image location, delete link
echo -e "${1}\t${3}\t${2}" >> "${log_file}"
notify ok "Upload done!" "${1}"
# if [ ! -z "${open_command}" ] && [ "${open}" = "true" ]; then
# open_cmd=${open_command//\%url/${1}}
# open_cmd=${open_cmd//\%img/${2}}
# echo "Opening '${open_cmd}'"
# eval "${open_cmd}"
# fi
}
function handle_upload_error() {
error="Upload failed: \"${1}\""
echo "${error}"
echo -e "Error\t${2}\t${error}" >> "${log_file}"
notify error "Upload failed :(" "${1}"
}
function handle_album_creation_success() {
echo ""
echo "Album link: ${1}"
echo "Delete hash: ${2}"
echo ""
notify ok "Album created!" "${1}"
if [ "${copy_url}" = "true" ]; then
if is_mac; then
echo -n "${1}" | pbcopy
else
echo -n "${1}" | xclip -selection clipboard
fi
echo "URL copied to clipboard"
fi
# print to log file: album link, album title, delete hash
echo -e "${1}\t\"${3}\"\t${2}" >> "${log_file}"
}
function handle_album_creation_error() {
error="Album creation failed: \"${1}\""
echo -e "Error\t${2}\t${error}" >> "${log_file}"
notify error "Album creation failed :(" "${1}"
if [ ${exit_on_album_creation_fail} ]; then
exit 1
fi
}
while [ ${#} != 0 ]; do
case "${1}" in
-h | --help)
echo "usage: ${0} [--debug] [-c | --check | -v | -h | -u]"
echo " ${0} [--debug] [option]... [file]..."
echo ""
echo " --debug Enable debugging, must be first option"
echo " -h, --help Show this help, exit"
echo " -v, --version Show current version, exit"
echo " --check Check if all dependencies are installed, exit"
echo " -c, --connect Show connected imgur account, exit"
echo " -o, --open <true|false> Override 'open' config"
echo " -e, --edit <true|false> Override 'edit' config"
echo " -i, --edit-command <command> Override 'edit_command' config (include '%img'), sets --edit 'true'"
echo " -l, --login <true|false> Override 'login' config"
echo " -a, --album <album_title> Create new album and upload there"
echo " -A, --album-id <album_id> Override 'album_id' config"
echo " -k, --keep-file <true|false> Override 'keep_file' config"
echo " -d, --auto-delete <s> Automatically delete image after <s> seconds"
echo " -u, --update Check for updates, exit"
echo " file Upload file instead of taking a screenshot"
exit 0;;
-v | --version)
echo "${current_version}"
exit 0;;
-s | --select)
mode="select"
shift;;
-w | --window)
mode="window"
shift;;
-f | --full)
mode="full"
shift;;
-o | --open)
# shellcheck disable=SC2034
open="${2}"
shift 2;;
-e | --edit)
edit="${2}"
shift 2;;
-i | --edit-command)
edit_command="${2}"
edit="true"
shift 2;;
-l | --login)
login="${2}"
shift 2;;
-c | --connect)
load_access_token
fetch_account_info
exit 0;;
-a | --album)
album_title="${2}"
shift 2;;
-A | --album-id)
album_id="${2}"
shift 2;;
-k | --keep-file)
keep_file="${2}"
shift 2;;
-d | --auto-delete)
auto_delete="${2}"
shift 2;;
-u | --update)
check_for_update
exit 0;;
*)
upload_files=("${@}")
break;;
esac
done
if [ "${login}" = "true" ]; then
# load before changing directory
load_access_token
fi
if [ -n "${album_title}" ]; then
if [ "${login}" = "true" ]; then
response="$(curl -fsSL --stderr - \
-F "title=${album_title}" \
-H "Authorization: Bearer ${access_token}" \
https://api.imgur.com/3/album)"
else
response="$(curl -fsSL --stderr - \
-F "title=${album_title}" \
-H "Authorization: Client-ID ${imgur_anon_id}" \
https://api.imgur.com/3/album)"
fi
if grep -Eq '"success":\s*true' <<<"${response}"; then # Album creation successful
echo "Album '${album_title}' successfully created"
album_id="$(grep -Eo '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
del_id="$(grep -Eo '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
handle_album_creation_success "https://imgur.com/a/${album_id}" "${del_id}" "${album_title}"
if [ "${login}" = "false" ]; then
album_id="${del_id}"
fi
else # Album creation failed
err_msg="$(grep -Eo '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
test -z "${err_msg}" && err_msg="${response}"
handle_album_creation_error "${err_msg}" "${album_title}"
fi
fi
if [ -z "${upload_files[*]}" ]; then
upload_files[0]=""
fi
for upload_file in "${upload_files[@]}"; do
if [ -z "${upload_file}" ]; then
cd "${file_dir}" || exit 1
# new filename with date
img_file="$(date +"${file_name_format}")"
take_screenshot "${img_file}"
else
# upload file instead of screenshot
img_file="${upload_file}"
fi
# get full path
#cd "$(dirname "$(realpath "${img_file}")")"
#img_file="$(realpath "${img_file}")"
# check if file exists
if ! [ -f "${img_file}" ]; then
echo "file '${img_file}' doesn't exist !"
read -r _
exit 1
fi
# open image in editor if configured
if [ "${edit}" = "true" ]; then
edit_cmd=${edit_command//\%img/${img_file}}
echo "Opening editor '${edit_cmd}'"
if ! (eval "${edit_cmd}"); then
echo "Error for image '${img_file}': command '${edit_cmd}' failed, not uploading. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting" | tee -a "${log_file}"
notify error "Something went wrong :(" "Information has been logged"
exit 1
fi
fi
if [ "${login}" = "true" ]; then
upload_authenticated_image "${img_file}"
else
upload_anonymous_image "${img_file}"
fi
# delete file if configured
if [ "${keep_file}" = "false" ] && [ -z "${1}" ]; then
echo "Deleting temp file ${file_dir}/${img_file}"
rm -rf "${img_file}"
fi
echo ""
done
if [ "${check_update}" = "true" ]; then
check_for_update
fi
read -r _

113
.config/nnn/plugins/imgview Executable file
View File

@ -0,0 +1,113 @@
#!/usr/bin/env sh
# Description: Open hovered or current directory in image viewer.
# Generates media thumbnails with optional dependencies.
#
# Dependencies:
# - imv (https://github.com/eXeC64/imv) or,
# - sxiv (https://github.com/muennich/sxiv) or,
# - nsxiv (https://codeberg.org/nsxiv/nsxiv) or,
# - ucollage (https://github.com/ckardaris/ucollage) or,
# - lsix (https://github.com/hackerb9/lsix), or
# - viu (https://github.com/atanunq/viu), or
# - catimg (https://github.com/posva/catimg), or
# - optional: ffmpeg for audio thumbnails (album art)
# - optional: ffmpegthumbnailer for video thumbnails
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana, Luuk van Baal
#
# Consider setting NNN_PREVIEWDIR to $XDG_CACHE_HOME/nnn/previews
# if you want to keep media thumbnails on disk between reboots.
NNN_PREVIEWDIR="${NNN_PREVIEWDIR:-${TMPDIR:-/tmp}/nnn/previews}"
exit_prompt() {
[ -n "$1" ] && printf "%s\n" "$1"
printf "%s" "Press any key to exit..."
cfg=$(stty -g); stty raw -echo; head -c 1; stty "$cfg"
clear
exit
}
make_thumbs() {
mkdir -p "$NNN_PREVIEWDIR$dir" || return
if [ "$1" = "viu" ] || [ "$1" = "catimg" ]; then
[ -d "$target" ] && exit_prompt "$1 can only display a single image"
mime="$(file -bL --mime-type -- "$target")"
case "$mime" in
audio/*) ffmpeg -i "$target" "$NNN_PREVIEWDIR$target.jpg" -y >/dev/null 2>&1
ret="$NNN_PREVIEWDIR/$target.jpg" ;;
video/*) ffmpegthumbnailer -i "$target" -o "$NNN_PREVIEWDIR$target.jpg" 2> /dev/null
ret="$NNN_PREVIEWDIR/$target.jpg" ;;
*) ret="$target" ;;
esac
fi
for file in "$dir"/*; do
if [ ! -f "$NNN_PREVIEWDIR$file.jpg" ]; then
case "$(file -bL --mime-type -- "$file")" in
audio/*) [ "$1" != "sxiv" ] &&
ffmpeg -i "$file" "$NNN_PREVIEWDIR$file.jpg" -y >/dev/null 2>&1 ;;
video/*) [ "$1" != "ucollage" ] &&
ffmpegthumbnailer -i "$file" -o "$NNN_PREVIEWDIR$file.jpg" 2> /dev/null ;;
esac
fi
done
for file in "$NNN_PREVIEWDIR$dir"/*; do
filename="$(basename "$file" .jpg)"
[ ! -e "$dir/$filename" ] && rm "$file" 2>/dev/null
done
}
listimages() {
find -L "$dir" "$NNN_PREVIEWDIR$dir" -maxdepth 1 -type f -print0 2>/dev/null | sort -z
}
view_files() {
[ -f "$target" ] && count="-n $(listimages | grep -a -m 1 -ZznF "$target" | cut -d: -f1)"
case "$1" in
nsxiv) listimages | xargs -0 nsxiv -a "${count:--t}" -- ;;
sxiv) listimages | xargs -0 sxiv -a "${count:--t}" -- ;;
imv*) listimages | xargs -0 "$1" "${count:-}" -- ;;
esac
}
target="$(readlink -f "$1")"
[ -d "$target" ] && dir="$target" || dir="${target%/*}"
if uname | grep -q "Darwin"; then
[ -f "$1" ] && open "$1" >/dev/null 2>&1 &
elif type lsix >/dev/null 2>&1; then
if [ -d "$target" ]; then
cd "$target" || exit_prompt
fi
make_thumbs lsix
clear
lsix
cd "$NNN_PREVIEWDIR$dir" && lsix
exit_prompt
elif type ucollage >/dev/null 2>&1; then
type ffmpeg >/dev/null 2>&1 && make_thumbs ucollage
UCOLLAGE_EXPAND_DIRS=1 ucollage "$dir" "$NNN_PREVIEWDIR$dir" || exit_prompt
elif type sxiv >/dev/null 2>&1; then
type ffmpegthumbnailer >/dev/null 2>&1 && make_thumbs sxiv
view_files sxiv >/dev/null 2>&1 &
elif type nsxiv >/dev/null 2>&1; then
type ffmpegthumbnailer >/dev/null 2>&1 && make_thumbs sxiv
view_files nsxiv >/dev/null 2>&1 &
elif type imv >/dev/null 2>&1; then
make_thumbs imv
view_files imv >/dev/null 2>&1 &
elif type imvr >/dev/null 2>&1; then
make_thumbs imv
view_files imvr >/dev/null 2>&1 &
elif type viu >/dev/null 2>&1; then
clear
make_thumbs viu
viu -n "$ret"
exit_prompt
elif type catimg >/dev/null 2>&1; then
make_thumbs catimg
catimg "$ret"
exit_prompt
else
exit_prompt "Please install sxiv/nsxiv/imv/viu/catimg/lsix."
fi

13
.config/nnn/plugins/ipinfo Executable file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env sh
# Description: Shows the external IP address and whois information. Useful over VPNs.
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
IP=$(curl -s ifconfig.me)
whois "$IP"
echo your external IP address is "$IP"
read -r _

66
.config/nnn/plugins/kdeconnect Executable file
View File

@ -0,0 +1,66 @@
#!/usr/bin/env sh
# Description: Send files or folders to your Android device using kdeconnect-cli.
# kdeconnect must be configured on the Android device and the PC.
#
# Usage:
# - Hover over a file or a folder and call the plugin.
# - Alternatively, select the files and folders you would like to send, and activate the plugin.
#
# Shell: POSIX compliant
# Author: juacq97, raffaem, N-R-K
# If you want system notification, put this equal to 1
notify=0
note() {
if [ $notify = 1 ]; then
notify-send -a "Kdeconnect" "$1"
else
echo "[Kdeconnect] $1"
fi
}
# kdeconnect doesn't cope with non-files
filter_files() {
xargs -0 -I{} sh -c '
if [ -f "{}" ]; then
printf "%s\0" "{}";
else
printf "Error: not a regular file: %s\n" "{}" >&2;
fi;'
}
send() {
filter_files | xargs -0 -I{} kdeconnect-cli --name "$devname" --share {}
note "Files sent"
}
# Select paired device
names=$(kdeconnect-cli --list-available --name-only 2>/dev/null)
if [ -z "$names" ]; then
note "No devices paired and available"
exit
fi
ndevs=$(printf "%s" "$names" | awk 'END{print NR}')
if [ "$ndevs" -eq 1 ]; then
devname="$names"
else
printf "%s" "$names" | awk '{ print NR ". " $0 }'
printf "Pick a device: "
read -r pick
if [ -n "$pick" ] && [ "$pick" -eq "$pick" ]; then
devname=$(printf '%s' "$names" | awk "NR==$pick")
fi
fi
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
if [ -s "$selection" ]; then
send < "$selection"
[ -p "$NNN_PIPE" ] && printf "-" > "$NNN_PIPE" # clear selection
elif [ -n "$1" ]; then
printf "%s" "$1" | send
else
note "No selection and no hovered file"
fi

42
.config/nnn/plugins/launch Executable file
View File

@ -0,0 +1,42 @@
#!/usr/bin/env sh
# Description: Independent POSIX-compliant GUI application launcher.
# Fuzzy find executables in $PATH and launch an application.
# stdin, stdout, stderr are suppressed so CLI tools exit silently.
#
# To configure launch as an independent app launcher add a keybind
# to open launch in a terminal e.g.,
#
# xfce4-terminal -e "${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/launch
#
# Dependencies: fzf
#
# Usage: launch [delay]
# delay is in seconds, if omitted launch waits for 1 sec
#
# Integration with nnn: launch is installed with other plugins, nnn picks it up.
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
# shellcheck disable=SC2086
IFS=':'
get_selection() {
if type fzf >/dev/null 2>&1; then
{ IFS=':'; ls -H $PATH; } | sort | fzf
else
exit 1
fi
}
if selection=$( get_selection ); then
setsid "$selection" 2>/dev/null 1>/dev/null &
if [ -n "$1" ]; then
sleep "$1"
else
sleep 1
fi
fi

15
.config/nnn/plugins/mimelist Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env sh
# Description: Find and list files by mime type in smart context
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
# shellcheck disable=SC1090,SC1091
. "$(dirname "$0")"/.nnn-plugin-helper
printf "mime (e.g., video/audio/image): "
read -r mime
printf "%s" "+l" > "$NNN_PIPE"
find . | file -if- | grep "$mime" | awk -F: '{printf "%s\0", $1}' > "$NNN_PIPE"

40
.config/nnn/plugins/moclyrics Executable file
View File

@ -0,0 +1,40 @@
#!/usr/bin/env sh
# Description: Fetches the lyrics of the track currently playing in MOC
#
# Dependencies: ddgr (https://github.com/jarun/ddgr)
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
# Check if MOC server is running
cmd=$(pgrep -x mocp 2>/dev/null)
ret=$cmd
if [ -z "$ret" ]; then
exit
fi
# Grab the output
out="$(mocp -i)"
# Check if anything is playing
state=$(echo "$out" | grep "State:" | cut -d' ' -f2)
if ! [ "$state" = 'PLAY' ]; then
exit
fi
# Try by Artist and Song Title first
ARTIST="$(echo "$out" | grep 'Artist:' | cut -d':' -f2 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')"
TITLE="$(echo "$out" | grep 'SongTitle:' | cut -d':' -f2 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')"
if [ -n "$ARTIST" ] && [ -n "$TITLE" ]; then
ddgr -w azlyrics.com --ducky "$ARTIST" "$TITLE"
else
# Try by file name
FILENAME="$(basename "$(echo "$out" | grep 'File:' | cut -d':' -f2)")"
FILENAME="$(echo "${FILENAME%%.*}" | tr -d -)"
if [ -n "$FILENAME" ]; then
ddgr -w azlyrics.com --ducky "$FILENAME"
fi
fi

89
.config/nnn/plugins/mocq Executable file
View File

@ -0,0 +1,89 @@
#!/usr/bin/env sh
# Description: Appends and optionally plays music in MOC
#
# Notes:
# - if selection is available, plays it, else plays the current file or directory
# - appends tracks and exits is MOC is running, else clears playlist and adds tracks
# - to let mocp shuffle tracks, set SHUFFLE=1
#
# Shell: POSIX compliant
# Authors: Arun Prakash Jana, ath3
IFS="$(printf '\n\r')"
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
cmd=$(pgrep -x mocp 2>/dev/null)
ret=$cmd
SHUFFLE="${SHUFFLE:-0}"
mocp_add ()
{
if [ "$SHUFFLE" = 1 ]; then
if [ "$resp" = "y" ]; then
arr=$(tr '\0' '\n' < "$selection")
elif [ -n "$1" ]; then
arr="$1"
fi
for entry in $arr
do
if [ -d "$entry" ]; then
arr2=$arr2$(find "$entry" -type f \( ! -iname "*.m3u" ! -iname "*.pls" \))
elif echo "$entry" | grep -qv '\.m3u$\|\.pls$' ; then
arr2=$(printf "%s\n%s" "$entry" "$arr2")
fi
done
mocp -o shuffle
echo "$arr2" | xargs -d "\n" mocp -a
else
if [ "$resp" = "y" ]; then
xargs < "$selection" -0 mocp -a
else
mocp -a "$1"
fi
fi
}
if [ ! -s "$selection" ] && [ -z "$1" ]; then
exit
fi
if [ "$2" = "opener" ]; then
:
elif [ -s "$selection" ]; then
printf "Work with selection? Enter 'y' to confirm: "
read -r resp
fi
if [ -z "$ret" ]; then
# mocp not running
mocp -S
else
# mocp running, check if it's playing
state=$(mocp -i | grep "State:" | cut -d' ' -f2)
if [ "$state" = 'PLAY' ]; then
# add to playlist and exit
mocp_add "$1"
# uncomment the line below to show mocp interface after appending
# mocp
exit
fi
fi
# clear selection and play
mocp -c
mocp_add "$1" "$resp"
mocp -p
# uncomment the line below to show mocp interface after appending
# mocp
# Clear selection
if [ "$resp" = "y" ] && [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi

41
.config/nnn/plugins/mp3conv Executable file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env sh
# Description: Extract audio from multimedia files and convert to mp3
#
# Dependencies: ffmpeg compiled with libmp3lame audio codec support
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
outdir=_mp3files
handle_multimedia() {
mime="${1}"
file="${2}"
case "${mime}" in
audio/* | video/*)
ffmpeg -i "${file}" -vn -codec:a libmp3lame -q:a 2 "${outdir}/${file%.*}.mp3"
;;
*)
;;
esac
}
printf "Process 'a'll in directory or 'c'urrent? "
read -r resp
if [ "$resp" = "a" ]; then
if ! [ -e "${outdir}" ]; then
mkdir "${outdir}"
fi
for f in *; do
if [ -f "${f}" ]; then
mimestr="$( file --dereference --brief --mime-type -- "${f}" )"
handle_multimedia "${mimestr}" "${f}"
fi
done
elif [ "$resp" = "c" ] && [ -f "$1" ]; then
ffmpeg -i "${1}" -vn -codec:a libmp3lame -q:a 2 "${1%.*}.mp3"
fi

76
.config/nnn/plugins/mtpmount Executable file
View File

@ -0,0 +1,76 @@
#!/usr/bin/env sh
# Description: Toggle mount of MTP device (eg. Android device)
# 'l' to list mountable devices
# 'n' integer associated to device to mount
# 'q'/'Return' exit
#
# Dependencies: gvfs-mtp
#
# Notes: The MTP device should be mounted at /run/user/$UID/gvfs.
# Put /run/user/$UID/gvfs to bookmark entries (NNN_BMS) for faster access.
# Make sure the device is unlocked when mounting.
#
# When doing copy-paste into MTP device, you will get an error like this:
# cp: preserving times for './gambar1.png': Operation not supported
# That just means the file is copied but timestamp won't be preserved.
# It's like doing `cp -p localfile.txt file-to-SMB.txt`.
#
# Shell: POSIX compliant
# Author: Benawi Adha
prompt="Device number ('l' to list): "
IFS='
'
lsmtp () {
devs=$(gio mount -li | grep -e 'activation_root' | sed 's/\s*activation_root=//g')
c=1
printf "Devices list:\n"
for i in $devs; do
printf "%s %s\\n" "$c" "$i"
c=$(( c + 1 ))
done
echo
}
lsmtp
printf "%s" "$prompt"
read -r input
while [ -n "$input" ]
do
if [ "$input" = "l" ]; then
lsmtp
elif [ "$input" = "q" ] || [ "$input" -eq 0 ]; then
exit
elif [ "$input" -le "$(printf '%s\n' "${devs}" | grep -c '^')" ]; then
# dev=$(printf "%s\n" "$devs" | cut -d$'\n' -f${input})
c=1
for i in $devs; do
dev=$i
if [ "$input" -eq $c ]; then
break
fi
c=$(( c + 1 ))
done
if (gio mount -l | grep '^Mount([1-9]).*'"$dev" ) 1>/dev/null; then
if gio mount -u "${dev}"; then
printf "%s unmounted\n" "$dev"
fi
else
if gio mount "${dev}"; then
printf "%s mounted to /run/user/\$UID/gvfs\n" "$dev"
fi
fi
echo
else
printf "Invalid input\n"
fi
printf "%s" "$prompt"
read -r input
done

75
.config/nnn/plugins/nbak Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/env sh
# Description: Backup nnn configuration
# - config dir content
# - environment config
# - shell functions and aliases
#
# Shell: POSIX compliant
# Author: Léo Villeveygoux
nnn_aliases="n nnn"
outdir="nnn-$(whoami)@$(hostname)"
outfile="${outdir}.tar.bz2"
shellname="$(basename "$SHELL")"
conffile="config.txt"
configdir="${XDG_CONFIG_HOME:-$HOME/.config}/nnn"
workdir="$PWD"
tempdir="$(mktemp -d)"
mkdir "$tempdir/$outdir"
if [ ! -d "$tempdir" ]; then
echo "Can't create work directory." >&2
exit 1
fi
cd "$tempdir/$outdir" || exit 1
# Backing up config dir content
cp -r "$configdir" . || exit 1
# Environment config
env | sed "s/'/'\\\\''/" |\
awk '/^NNN_/{print "export '\''"$0"'\''"}' > "$conffile"
# Shell functions/aliases
case "$shellname" in
bash)
for name in $nnn_aliases ; do
if [ "$(bash -ic "type -t $name")" = "function" ] ; then
bash -ic "type $name" | tail -n+2 >> "$conffile"
elif bash -ic "alias $name" >/dev/null 2>&1 ; then
bash -ic "alias $name" >> "$conffile"
fi
done
;;
zsh)
for name in $nnn_aliases ; do
if zsh -ic "functions $name" ; then
zsh -ic "functions $name" >> "$conffile"
elif zsh -ic "alias $name" ; then
echo alias "$(zsh -ic "alias $name")" >> "$conffile"
fi
done
;;
*)
echo "Unknown shell, skipping alias/function checking." >&2
;;
esac
cd .. || exit 1
printf "Saving as '%s' ... " "$workdir/$outfile"
tar caf "$workdir/$outfile" "$outdir" && echo "Done" || echo "Failed"
cd "$workdir" && rm -rf "$tempdir"

56
.config/nnn/plugins/nmount Executable file
View File

@ -0,0 +1,56 @@
#!/usr/bin/env sh
# Description: Toggle mount status of a device using pmount
# If the device is not mounted, it will be mounted.
# If the device is mounted, it will be unmounted and powered down.
#
# Dependencies: lsblk, pmount
#
# Usage: Runs `lsblk` on 'l', exits on 'Return`.
#
# Notes:
# - The script uses Linux-specific lsblk to list block devices. Alternatives:
# macOS: "diskutil list"
# BSD: "geom disk list"
# - The script uses udisksctl (from udisks2) to power down devices. This is also Linux-specific.
# Users on non-Linux platforms can comment it and use an alterntive to power-down disks.
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
prompt="device name [e.g. sdXn] ('l'ist, 'q'uit): "
lsblk
printf "\nEnsure you aren't still in the mounted device.\n"
printf "%s" "$prompt"
read -r dev
while [ -n "$dev" ]; do
if [ "$dev" = "l" ]; then
lsblk
elif [ "$dev" = "q" ]; then
exit
else
if grep -qs "$dev " /proc/mounts; then
sync "$(lsblk -n "/dev/$dev" -o MOUNTPOINT | sed "/^$/d")"
if pumount "/dev/$dev"; then
echo "/dev/$dev unmounted."
if udisksctl power-off -b "/dev/$dev" --no-user-interaction; then
echo "/dev/$dev ejected."
fi
fi
elif [ -b "/dev/$dev" ]; then
if pmount "/dev/$dev"; then
sleep 1
echo "/dev/$dev mounted to $(lsblk -n "/dev/$dev" -o MOUNTPOINT | sed "/^$/d")."
fi
else
echo "/dev/$dev does not exist or is not a block device."
fi
fi
echo
printf "%s" "$prompt"
read -r dev
done

79
.config/nnn/plugins/nuke Executable file
View File

@ -0,0 +1,79 @@
#! /bin/sh
FALLBACK_OPENER=xdg-open
entry="$1"
mime="$(file -ibL "$entry" )"
FNAME=$(basename "$entry")
ext="${FNAME##*.}"
if [ -n "$ext" ]; then
ext="$(printf "%s" "${ext}" | tr '[:upper:]' '[:lower:]')"
fi
case "${ext}" in
## Archive
a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\
rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zst|zip|rar|7z)
extract "$entry"
exit 0;;
## PDF
pdf)
devour zathura "$entry"
exit 1;;
## Audio
aac|flac|m4a|mid|midi|mpa|mp2|mp3|ogg|wav|wma)
mpv --no-video --quiet "$entry"
exit 1;;
## Video
avi|mkv|mp4|gif)
devour mpv "$entry"
exit 1;;
## Image
png|jpg|jpeg|PNG|JPG|JPEG|svg)
devour nsxiv "$entry"
exit 1;;
## Log files
log)
"$EDITOR" "$entry"
exit 0;;
## BitTorrent
torrenti|magnet)
aria2c -i "$entry"
exit 0;;
## OpenDocument
odt|ods|odp|sxw)
"$BROWSER" "$entry"
exit 0;;
## Markdown
md)
"$EDITOR" "$entry"
exit 0;;
## HTML
htm|html|xhtml)
## Preview as text conversion
"$BROWSER" "$entry"
exit 0;;
## JSON
json)
jq --color-output . "$entry"
exit 0 ;;
esac
case "$mime" in
*text*)
"$EDITOR" "$entry"
exit 0 ;;
esac
$FALLBACK_OPENER "$entry"

16
.config/nnn/plugins/oldbigfile Executable file
View File

@ -0,0 +1,16 @@
#!/usr/bin/env sh
# Description: List files bigger than input size by ascending access date.
#
# Dependencies: find sort
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
printf "Min file size (MB): "
read -r size
find . -size +"$size"M -type f -printf '%A+ %s %p\n' | sort
echo "Press any key to exit"
read -r _

49
.config/nnn/plugins/openall Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env bash
# Description: Open selected files in nuke one by one or in oneshot
#
# Notes: 1. Opens the hovered file if the selection is empty
# 2. nuke is the default, set OPENER below for custom
# 3. Opener is invoked once for each file in a loop
# 4. Keep pressing "Enter" to open files one by one
#
# Shell: bash
# Author: Arun Prakash Jana
sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
OPENER="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke"
if [ -s "$sel" ]; then
targets=()
while IFS= read -r -d '' entry || [ -n "$entry" ]; do
targets+=( "$entry" )
done < "$sel"
elements=${#targets[@]}
if (( elements == 1 )); then
# If there's only one file selected, open without prompts
"$OPENER" "${targets[0]}"
else
printf "open [A]ll? "
read -r all
for ((index=0; index <= ${#targets[@]}; index++)); do
"$OPENER" "${targets[index]}"
if [ "$all" != "A" ] && (( index+1 < elements )); then
printf "press Enter to open '%s'\n" "${targets[index+1]}"
read -r -s -n 1 key
if [[ $key != "" ]]; then
break
fi
fi
done
fi
# Clear selection
if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi
elif [ -n "$1" ]; then
"$OPENER" "$1"
fi

62
.config/nnn/plugins/organize Executable file
View File

@ -0,0 +1,62 @@
#!/usr/bin/env sh
# Description: Organize files in directories by category
#
# Note: This plugin clears the selection as it changes the contents of the current dir
#
# Shell: POSIX compliant
# Author: th3lusive
sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
organize() {
case "$(file -biL "$1")" in
*video*)
[ ! -d "Videos" ] && mkdir "Videos"
mv "$1" "Videos/$1"
printf "Moved %s to Videos\n" "$1" ;;
*audio*) [ ! -d "Audio" ] && mkdir "Audio"
mv "$1" "Audio/$1"
printf "Moved %s to Audio\n" "$1" ;;
*image*)
[ ! -d "Images" ] && mkdir "Images"
mv "$1" "Images/$1"
printf "Moved %s to Images\n" "$1" ;;
*pdf*|*document*|*epub*|*djvu*|*cb*)
[ ! -d "Documents" ] && mkdir "Documents"
mv "$1" "Documents/$1"
printf "Moved %s to Documents\n" "$1" ;;
*text*)
[ ! -d "Plaintext" ] && mkdir "Plaintext"
mv "$1" "Plaintext/$1"
printf "Moved %s to Plaintext\n" "$1" ;;
*tar*|*xz*|*compress*|*7z*|*rar*|*zip*)
[ ! -d "Archives" ] && mkdir "Archives"
mv "$1" "Archives/$1"
printf "Moved %s to Archives\n" "$1" ;;
*binary*)
[ ! -d "Binaries" ] && mkdir "Binaries"
mv "$1" "Binaries/$1"
printf "Moved %s to Binaries\n" "$1" ;;
esac
}
main() {
for file in *
do
[ -f "$file" ] && organize "$file"
done
# Clear selection
if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi
}
main "$@"

30
.config/nnn/plugins/pdfread Executable file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env sh
# Description: Read a text or PDF file in British English
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
if [ -n "$1" ]; then
tmpf="$(basename "$1")"
tmpf="${TMPDIR:-/tmp}"/"${tmpf%.*}"
if [ "$(head -c 4 "$1")" = "%PDF" ]; then
# Convert using pdftotext
pdftotext -nopgbrk -layout "$1" - | sed 's/\xe2\x80\x8b//g' > "$tmpf".txt
pico2wave -w "$tmpf".wav -l en-GB "$(tr '\n' ' ' < "$tmpf".txt)"
rm "$tmpf".txt
else
pico2wave -w "$tmpf".wav -l en-GB "$(tr '\n' ' ' < "$1")"
fi
# to jump around and note the time
mpv "$tmpf".wav
# flat read but better quality
# play -qV0 "$tmpf".wav treble 2 gain -l 2
rm "$tmpf".wav
fi

View File

@ -0,0 +1,216 @@
#!/usr/bin/env bash
# Description: tabbed/xembed based file previewer
#
# Dependencies:
# - tabbed (https://tools.suckless.org/tabbed): xembed host
# - xterm (or urxvt or st) : xembed client for text-based preview
# - mpv (https://mpv.io): xembed client for video/audio
# - sxiv (https://github.com/muennich/sxiv) or,
# - nsxiv (https://codeberg.org/nsxiv/nsxiv) : xembed client for images
# - zathura (https://pwmt.org/projects/zathura): xembed client for PDF
# - nnn's nuke plugin for text preview and fallback
# nuke is a fallback for 'mpv', 'sxiv'/'nsxiv', and 'zathura', but has its
# own dependencies, see the script for more information
# - vim (or any editor/pager really)
# - file
# - mktemp
# - xdotool (optional, to keep main window focused)
#
# Usage:
# - Install the dependencies. Then set a NNN_FIFO
# and set a key for the plugin, then start `nnn`:
# $ NNN_FIFO=/tmp/nnn.fifo nnn
# - Launch the plugin with the designated key from nnn
#
# Notes:
# 1. This plugin needs a "NNN_FIFO" to work. See man.
# 2. If the same NNN_FIFO is used in multiple nnn instances, there will be one
# common preview window. With different FIFO paths, they will be independent.
# 3. This plugin only works on X, not on Wayland.
#
# How it works:
# We use `tabbed` [1] as a xembed [2] host, to have a single window
# owning each previewer window. So each previewer must be a xembed client.
# For text previewers, this is not an issue, as there are a lot of
# xembed-able terminal emulator (we default to `xterm`, but examples are
# provided for `urxvt` and `st`). For graphic preview this can be trickier,
# but a few popular viewers are xembed-able, we use:
# - `mpv`: multimedia player, for video/audio preview
# - `sxiv`/`nsxiv`: image viewer
# - `zathura`: PDF viewer
# - but we always fallback to `nuke` plugin
#
# [1]: https://tools.suckless.org/tabbed/
# [2]: https://specifications.freedesktop.org/xembed-spec/xembed-spec-latest.html
#
# Shell: Bash (job control is weakly specified in POSIX)
# Author: Léo Villeveygoux
XDOTOOL_TIMEOUT=2
PAGER=${PAGER:-"vim -R"}
NUKE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke"
if [ -n "$WAYLAND_DISPLAY" ] ; then
echo "Wayland is not supported in preview-tabbed, this plugin could freeze your session!" >&2
exit 1
fi
if type xterm >/dev/null 2>&1 ; then
TERMINAL="xterm -into"
elif type urxvt >/dev/null 2>&1 ; then
TERMINAL="urxvt -embed"
elif type st >/dev/null 2>&1 ; then
TERMINAL="st -w"
else
echo "No xembed term found" >&2
fi
term_nuke () {
# $1 -> $XID, $2 -> $FILE
$TERMINAL "$1" -e "$NUKE" "$2" &
}
start_tabbed () {
FIFO="$(mktemp -u)"
mkfifo "$FIFO"
tabbed > "$FIFO" &
jobs # Get rid of the "Completed" entries
TABBEDPID="$(jobs -p %%)"
if [ -z "$TABBEDPID" ] ; then
echo "Can't start tabbed"
exit 1
fi
read -r XID < "$FIFO"
rm "$FIFO"
}
get_viewer_pid () {
VIEWERPID="$(jobs -p %%)"
}
kill_viewer () {
if [ -n "$VIEWERPID" ] && jobs -p | grep "$VIEWERPID" ; then
kill "$VIEWERPID"
fi
}
sigint_kill () {
kill_viewer
kill "$TABBEDPID"
exit 0
}
previewer_loop () {
unset -v NNN_FIFO
# mute from now
exec >/dev/null 2>&1
MAINWINDOW="$(xdotool getactivewindow)"
start_tabbed
trap sigint_kill SIGINT
xdotool windowactivate "$MAINWINDOW"
# Bruteforce focus stealing prevention method,
# works well in floating window managers like XFCE
# but make interaction with the preview window harder
# (uncomment to use):
#xdotool behave "$XID" focus windowactivate "$MAINWINDOW" &
while read -r FILE ; do
jobs # Get rid of the "Completed" entries
if ! jobs | grep tabbed ; then
break
fi
if [ ! -e "$FILE" ] ; then
continue
fi
kill_viewer
MIME="$(file -bL --mime-type "$FILE")"
case "$MIME" in
video/*)
if type mpv >/dev/null 2>&1 ; then
mpv --force-window=immediate --loop-file --wid="$XID" "$FILE" &
else
term_nuke "$XID" "$FILE"
fi
;;
audio/*)
if type mpv >/dev/null 2>&1 ; then
mpv --force-window=immediate --loop-file --wid="$XID" "$FILE" &
else
term_nuke "$XID" "$FILE"
fi
;;
image/*)
if type sxiv >/dev/null 2>&1 ; then
sxiv -ae "$XID" "$FILE" &
elif type nsxiv >/dev/null 2>&1 ; then
nsxiv -ae "$XID" "$FILE" &
else
term_nuke "$XID" "$FILE"
fi
;;
application/pdf)
if type zathura >/dev/null 2>&1 ; then
zathura -e "$XID" "$FILE" &
else
term_nuke "$XID" "$FILE"
fi
;;
inode/directory)
$TERMINAL "$XID" -e nnn "$FILE" &
;;
text/*)
if [ -x "$NUKE" ] ; then
term_nuke "$XID" "$FILE"
else
# shellcheck disable=SC2086
$TERMINAL "$XID" -e $PAGER "$FILE" &
fi
;;
*)
if [ -x "$NUKE" ] ; then
term_nuke "$XID" "$FILE"
else
$TERMINAL "$XID" -e sh -c "file '$FILE' | $PAGER -" &
fi
;;
esac
get_viewer_pid
# following lines are not needed with the bruteforce xdotool method
ACTIVE_XID="$(xdotool getactivewindow)"
if [ $((ACTIVE_XID == XID)) -ne 0 ] ; then
xdotool windowactivate "$MAINWINDOW"
else
timeout "$XDOTOOL_TIMEOUT" xdotool behave "$XID" focus windowactivate "$MAINWINDOW" &
fi
done
kill "$TABBEDPID"
kill_viewer
}
if [ ! -r "$NNN_FIFO" ] ; then
echo "Can't read \$NNN_FIFO ('$NNN_FIFO')"
exit 1
fi
previewer_loop < "$NNN_FIFO" &
disown

495
.config/nnn/plugins/preview-tui Executable file
View File

@ -0,0 +1,495 @@
#!/usr/bin/env sh
# Description: Terminal based file previewer
#
# Note: This plugin needs a "NNN_FIFO" to work. See man.
#
# Dependencies:
# - Supports 6 independent methods to preview with:
# - tmux (>=3.0), or
# - kitty with allow_remote_control and listen_on set in kitty.conf, or
# - wezterm (https://wezfurlong.org/wezterm), or
# - QuickLook on WSL (https://github.com/QL-Win/QuickLook), or
# - Windows Terminal (https://github.com/Microsoft/Terminal | https://aka.ms/terminal) with WSL, or
# - $NNN_TERMINAL set to a terminal (it's xterm by default).
# - less or $NNN_PAGER
# - tree or exa or ls
# - mediainfo or file
# - mktemp
# - unzip
# - tar
# - man
# - optional: bsdtar or atool for additional archive preview
# - optional: bat for code syntax highlighting
# - optional: ueberzug, kitty terminal, wezterm terminal, viu, catimg or chafa for images
# - optional: convert(ImageMagick) for playing gif preview (required for kitty image previews)
# - optional: ffmpegthumbnailer for video thumbnails (https://github.com/dirkvdb/ffmpegthumbnailer)
# - optional: ffmpeg for audio thumbnails
# - optional: libreoffce for opendocument/officedocument preview
# - optional: pdftoppm(poppler) for pdf thumbnails
# - optional: gnome-epub-thumbnailer for epub thumbnails (https://gitlab.gnome.org/GNOME/gnome-epub-thumbnailer)
# - optional: fontpreview for font preview (https://github.com/sdushantha/fontpreview)
# - optional: djvulibre for djvu
# - optional: glow or lowdown for markdown
# - optional: w3m or lynx or elinks for html
# - optional: set/export NNN_ICONLOOKUP as 1 to enable file icons in front of directory previews with .iconlookup
# Icons and colors are configurable in .iconlookup
# - optional: scope.sh file viewer from ranger.
# 1. drop scope.sh executable in $PATH
# 2. set/export $NNN_SCOPE as 1
# - optional: pistol file viewer (https://github.com/doronbehar/pistol).
# 1. install pistol
# 2. set/export $NNN_PISTOL as 1
#
# Usage:
# You need to set a NNN_FIFO path and a key for the plugin with NNN_PLUG,
# then start `nnn`:
#
# $ nnn -a
#
# or
#
# $ NNN_FIFO=/tmp/nnn.fifo nnn
#
# Then launch the `preview-tui` plugin in `nnn`.
#
# If you provide the same NNN_FIFO to all nnn instances, there will be a
# single common preview window. If you provide different FIFO path (e.g.
# with -a), they will be independent.
#
# The previews will be shown in a tmux split. If that isn't possible, it
# will try to use a kitty terminal split. And as a final fallback, a
# different terminal window will be used ($NNN_TERMINAL).
#
# Tmux, wezterm and kitty users can configure $NNN_SPLIT to either "h" or "v" to set a
# 'h'orizontal split or a 'v'ertical split (as in, the line that splits the
# windows will be horizontal or vertical).
#
# Kitty users need something similar to the following in their kitty.conf:
# - `allow_remote_control yes`
# - `listen_on unix:$TMPDIR/kitty`
# - `enabled_layouts splits` (optional)
# With ImageMagick installed, this terminal can use the icat kitten to display images.
# Refer to kitty documentation for further details.
#
# Wezterm should work out of the box. If `NNN_PREVIEWIMGPROG` is not specified it will use
# built in iTerm2 image protocol.
#
# Iterm2 users are recommended to use viu to view images without getting pixelated.
#
# Windows Terminal users can set "Profile termination behavior" under "Profile > Advanced" settings
# to automatically close pane on quit when exit code is 0.
#
# Shell: POSIX compliant
# Authors: Todd Yamakawa, Léo Villeveygoux, @Recidiviste, Mario Ortiz Manero, Luuk van Baal, @WanderLanz
NNN_SPLIT=${NNN_SPLIT:-} # Set permanent split direction
NNN_TERMINAL=${NNN_TERMINAL:-} # Set external terminal to be used
NNN_SPLITSIZE=${NNN_SPLITSIZE:-50} # Set previewer split size percentage
TMPDIR=${TMPDIR:-/tmp}
NNN_PARENT=${NNN_FIFO#*.}
[ "$NNN_PARENT" -eq "$NNN_PARENT" ] 2>/dev/null || NNN_PARENT="" # Make empty if non-numeric
ENVVARS="
PWD=$PWD
PATH=$PATH
PREVIEW_MODE=$2
NNN_FIFO=$NNN_FIFO
NNN_SCOPE=${NNN_SCOPE:-0}
NNN_PISTOL=${NNN_PISTOL:-0}
NNN_ICONLOOKUP=${NNN_ICONLOOKUP:-0}
NNN_PAGER=${NNN_PAGER:-less -P?n -R}
NNN_BATTHEME=${NNN_BATTHEME:-ansi}
NNN_BATSTYLE=${NNN_BATSTYLE:-numbers}
NNN_PREVIEWWIDTH=${NNN_PREVIEWWIDTH:-1920}
NNN_PREVIEWHEIGHT=${NNN_PREVIEWHEIGHT:-1080}
NNN_PREVIEWDIR=${NNN_PREVIEWDIR:-$TMPDIR/nnn/previews}
NNN_PREVIEWIMGPROG=${NNN_PREVIEWIMGPROG:-}
FIFOPID=$TMPDIR/nnn-preview-tui-fifopid.$NNN_PARENT
FIFOPATH=$TMPDIR/nnn-preview-tui-fifo.$NNN_PARENT
PREVIEWPID=$TMPDIR/nnn-preview-tui-previewpid.$NNN_PARENT
CURSEL=$TMPDIR/nnn-preview-tui-selection.$NNN_PARENT
FIFO_UEBERZUG=$TMPDIR/nnn-preview-tui-ueberzug-fifo.$NNN_PARENT
POSOFFSET=$TMPDIR/nnn-preview-tui-posoffset"
if [ -e "${TMUX%%,*}" ] && tmux -V | grep -q '[ -][3456789]\.'; then
NNN_TERMINAL=tmux
elif [ -n "$KITTY_LISTEN_ON" ]; then
NNN_TERMINAL=kitty
elif [ -n "$WEZTERM_PANE" ]; then
NNN_TERMINAL=wezterm
elif [ -z "$NNN_TERMINAL" ] && [ "$TERM_PROGRAM" = "iTerm.app" ]; then
NNN_TERMINAL=iterm
elif [ -n "$WT_SESSION" ]; then
NNN_TERMINAL=winterm
else
NNN_TERMINAL="${NNN_TERMINAL:-xterm}"
fi
if [ -z "$NNN_SPLIT" ] && [ $(($(tput lines) * 2)) -gt "$(tput cols)" ]; then
NNN_SPLIT='h'
elif [ "$NNN_SPLIT" != 'h' ]; then
NNN_SPLIT='v'
fi
ENVVARS="$ENVVARS
NNN_SPLIT=$NNN_SPLIT
NNN_TERMINAL=$NNN_TERMINAL"
IFS='
'
for env in $ENVVARS; do
export "${env?}"
case "$NNN_TERMINAL" in
tmux) ENVSTRING="$ENVSTRING -e '$env'" ;;
kitty) ENVSTRING="$ENVSTRING --env '$env'" ;;
winterm|iterm) ENVSTRING="$ENVSTRING \\\"$env\\\"" ;;
*) ENVSTRING="$ENVSTRING $env";;
esac
done; unset IFS
trap '' PIPE
exists() { type "$1" >/dev/null 2>&1 ;}
pkill() { command pkill "$@" >/dev/null 2>&1 ;}
prompt() { printf "%b" "$@"; cfg=$(stty -g); stty raw -echo; head -c 1; stty "$cfg" ;}
pidkill() {
if [ -f "$1" ]; then
PID="$(cat "$1" 2>/dev/null)" || return 1
kill "$PID" >/dev/null 2>&1
RET=$?
wait "$PID" 2>/dev/null
return $RET
fi
return 1
}
start_preview() {
case "$NNN_TERMINAL" in
tmux) # tmux splits are inverted
if [ "$NNN_SPLIT" = "v" ]; then split="h"; else split="v"; fi
eval tmux split-window "$ENVSTRING" -d"$split" -p"$NNN_SPLITSIZE" "$0" "$1" 1 ;;
kitty) # Setting the layout for the new window. It will be restored after the script ends.
kitty @ goto-layout splits
# Trying to use kitty's integrated window management as the split window.
eval kitty @ launch --no-response --title "preview-tui" --keep-focus \
--cwd "$PWD" "$ENVSTRING" --location "${NNN_SPLIT}split" "$0" "$1" 1 ;;
wezterm)
if [ "$NNN_SPLIT" = "v" ]; then split="--horizontal"; else split="--bottom"; fi
wezterm cli split-pane --cwd "$PWD" $split "$0" "$1" 1 >/dev/null
wezterm cli activate-pane-direction Prev ;;
iterm)
command="$SHELL -c 'cd $PWD; env $ENVSTRING $0 $1 1'"
if [ "$NNN_SPLIT" = "h" ]; then split="horizontally"; else split="vertically"; fi
osascript <<-EOF
tell application "iTerm"
tell current session of current window
split $split with default profile command "$command"
end tell
end tell
EOF
;;
winterm)
if [ "$NNN_SPLIT" = "h" ]; then split="H"; else split="V"; fi
cmd.exe /c wt -w 0 sp -$split -s"0.$NNN_SPLITSIZE" bash -c "cd $PWD \; \
env $ENVSTRING QLPATH=$2 $0 $1 1" \; -w 0 mf previous 2>/dev/null ;;
*) if [ -n "$2" ]; then
env "$ENVSTRING" QUICKLOOK=1 QLPATH="$2" "$0" "$1" 1 &
else
env "$ENVSTRING" "$NNN_TERMINAL" -e "$0" "$1" 1 &
fi ;;
esac
}
toggle_preview() {
if exists QuickLook.exe; then
QLPATH="QuickLook.exe"
elif exists Bridge.exe; then
QLPATH="Bridge.exe"
fi
if pidkill "$FIFOPID"; then
[ -p "$NNN_PPIPE" ] && printf "0" > "$NNN_PPIPE"
pidkill "$PREVIEWPID"
pkill -f "tail --follow $FIFO_UEBERZUG"
if [ -n "$QLPATH" ] && stat "$1"; then
f="$(wslpath -w "$1")" && "$QLPATH" "$f" &
fi
else
[ -p "$NNN_PPIPE" ] && printf "1" > "$NNN_PPIPE"
start_preview "$1" "$QLPATH"
fi
}
fifo_pager() {
cmd="$1"
shift
# We use a FIFO to access $NNN_PAGER PID in jobs control
mkfifo "$FIFOPATH" || return
$NNN_PAGER < "$FIFOPATH" &
printf "%s" "$!" > "$PREVIEWPID"
(
exec > "$FIFOPATH"
if [ "$cmd" = "pager" ]; then
if exists bat; then
bat --terminal-width="$cols" --decorations=always --color=always \
--paging=never --style="$NNN_BATSTYLE" --theme="$NNN_BATTHEME" "$@" &
else
$NNN_PAGER "$@" &
fi
else
"$cmd" "$@" &
fi
)
rm "$FIFOPATH"
}
# Binary file: show file info inside the pager
print_bin_info() {
printf -- "-------- \033[1;31mBinary file\033[0m --------\n"
if exists mediainfo; then
mediainfo "$1"
else
file -b "$1"
fi
}
handle_mime() {
case "$2" in
image/jpeg) image_preview "$cols" "$lines" "$1" ;;
image/gif) generate_preview "$cols" "$lines" "$1" "gif" ;;
image/vnd.djvu) generate_preview "$cols" "$lines" "$1" "djvu" ;;
image/*) generate_preview "$cols" "$lines" "$1" "image" ;;
video/*) generate_preview "$cols" "$lines" "$1" "video" ;;
audio/*) generate_preview "$cols" "$lines" "$1" "audio" ;;
application/font*|application/*opentype|font/*) generate_preview "$cols" "$lines" "$1" "font" ;;
*/*office*|*/*document*|*/*msword|*/*ms-excel) generate_preview "$cols" "$lines" "$1" "office" ;;
application/zip) fifo_pager unzip -l "$1" ;;
text/troff)
if exists man; then
fifo_pager man -Pcat -l "$1"
else
fifo_pager pager "$1"
fi ;;
*) handle_ext "$1" "$3" "$4" ;;
esac
}
handle_ext() {
case "$2" in
epub) generate_preview "$cols" "$lines" "$1" "epub" ;;
pdf) generate_preview "$cols" "$lines" "$1" "pdf" ;;
gz|bz2) fifo_pager tar -tvf "$1" ;;
md) if exists glow; then
fifo_pager glow -s dark "$1"
elif exists lowdown; then
fifo_pager lowdown -Tterm "$1"
else
fifo_pager pager "$1"
fi ;;
htm|html|xhtml)
if exists w3m; then
fifo_pager w3m "$1"
elif exists lynx; then
fifo_pager lynx "$1"
elif exists elinks; then
fifo_pager elinks "$1"
else
fifo_pager pager "$1"
fi ;;
7z|a|ace|alz|arc|arj|bz|cab|cpio|deb|jar|lha|lz|lzh|lzma|lzo\
|rar|rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z)
if exists atool; then
fifo_pager atool -l "$1"
elif exists bsdtar; then
fifo_pager bsdtar -tvf "$1"
fi ;;
*) if [ "$3" = "bin" ]; then
fifo_pager print_bin_info "$1"
else
fifo_pager pager "$1"
fi ;;
esac
}
preview_file() {
clear
# Trying to use pistol if it's available.
if [ "$NNN_PISTOL" -ne 0 ] && exists pistol; then
fifo_pager pistol "$1"
return
fi
# Trying to use scope.sh if it's available.
if [ "$NNN_SCOPE" -ne 0 ] && exists scope.sh; then
fifo_pager scope.sh "$1" "$cols" "$lines" "$(mktemp -d)" "True"
return
fi
# Use QuickLook if it's available.
if [ -n "$QUICKLOOK" ]; then
stat "$1" && f="$(wslpath -w "$1")" && "$QLPATH" "$f" &
return
fi
# Detecting the exact type of the file: the encoding, mime type, and extension in lowercase.
encoding="$(file -bL --mime-encoding -- "$1")"
mimetype="$(file -bL --mime-type -- "$1")"
ext="${1##*.}"
[ -n "$ext" ] && ext="$(printf "%s" "${ext}" | tr '[:upper:]' '[:lower:]')"
lines=$(tput lines)
cols=$(tput cols)
# Otherwise, falling back to the defaults.
if [ -d "$1" ]; then
cd "$1" || return
if [ "$NNN_ICONLOOKUP" -ne 0 ] && [ -f "$(dirname "$0")"/.iconlookup ]; then
[ "$NNN_SPLIT" = v ] && BSTR="\n"
# shellcheck disable=SC2012
ls -F --group-directories-first | head -n "$((lines - 3))" | "$(dirname "$0")"/.iconlookup -l "$cols" -B "$BSTR" -b " "
elif exists tree; then
fifo_pager tree --filelimit "$(find . -maxdepth 1 | wc -l)" -L 3 -C -F --dirsfirst --noreport
elif exists exa; then
exa -G --group-directories-first --colour=always
else
fifo_pager ls -F --group-directories-first --color=always
fi
cd ..
elif [ "${encoding#*)}" = "binary" ]; then
handle_mime "$1" "$mimetype" "$ext" "bin"
else
handle_mime "$1" "$mimetype" "$ext"
fi
}
generate_preview() {
if [ -n "$QLPATH" ] && stat "$3"; then
f="$(wslpath -w "$3")" && "$QLPATH" "$f" &
elif [ ! -f "$NNN_PREVIEWDIR/$3.jpg" ] || [ -n "$(find -L "$3" -newer "$NNN_PREVIEWDIR/$3.jpg")" ]; then
mkdir -p "$NNN_PREVIEWDIR/${3%/*}"
case $4 in
audio) ffmpeg -i "$3" -filter_complex "scale=iw*min(1\,min($NNN_PREVIEWWIDTH/iw\,ih)):-1" "$NNN_PREVIEWDIR/$3.jpg" -y ;;
epub) gnome-epub-thumbnailer "$3" "$NNN_PREVIEWDIR/$3.jpg" ;;
font) fontpreview -i "$3" -o "$NNN_PREVIEWDIR/$3.jpg" ;;
gif) if [ -p "$FIFO_UEBERZUG" ] && exists convert; then
frameprefix="$NNN_PREVIEWDIR/$3/${3##*/}"
if [ ! -d "$NNN_PREVIEWDIR/$3" ]; then
mkdir -p "$NNN_PREVIEWDIR/$3"
convert -coalesce -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$3" "$frameprefix.jpg" ||
MAGICK_TMPDIR="/tmp" convert -coalesce -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$3" "$frameprefix.jpg"
fi
frames=$(($(find "$NNN_PREVIEWDIR/$3" | wc -l) - 2))
[ $frames -lt 0 ] && return
while true; do
for i in $(seq 0 $frames); do
image_preview "$1" "$2" "$frameprefix-$i.jpg"
sleep 0.1
done
done &
printf "%s" "$!" > "$PREVIEWPID"
return
else
image_preview "$1" "$2" "$3"
return
fi ;;
image) if exists convert; then
convert "$3" -flatten -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$NNN_PREVIEWDIR/$3.jpg"
else
image_preview "$1" "$2" "$3" && return
fi ;;
office) libreoffice --convert-to jpg "$3" --outdir "$NNN_PREVIEWDIR/${3%/*}"
filename="$(printf "%s" "${3##*/}" | cut -d. -f1)"
mv "$NNN_PREVIEWDIR/${3%/*}/$filename.jpg" "$NNN_PREVIEWDIR/$3.jpg" ;;
pdf) pdftoppm -jpeg -f 1 -singlefile "$3" "$NNN_PREVIEWDIR/$3" ;;
djvu) ddjvu -format=ppm -page=1 "$3" "$NNN_PREVIEWDIR/$3.jpg" ;;
video) ffmpegthumbnailer -m -s0 -i "$3" -o "$NNN_PREVIEWDIR/$3.jpg" || rm "$NNN_PREVIEWDIR/$3.jpg" ;;
esac
fi
if [ -f "$NNN_PREVIEWDIR/$3.jpg" ]; then
image_preview "$1" "$2" "$NNN_PREVIEWDIR/$3.jpg"
else
fifo_pager print_bin_info "$3"
fi
} >/dev/null 2>&1
image_preview() {
clear
exec >/dev/tty
if [ "$NNN_TERMINAL" = "kitty" ]; then
# Kitty terminal users can use the native image preview method
kitty +kitten icat --silent --scale-up --place "$1"x"$2"@0x0 --transfer-mode=stream --stdin=no "$3" &
elif [ "$NNN_TERMINAL" = "wezterm" ] && [ -z "$NNN_PREVIEWIMGPROG" ]; then
wezterm imgcat "$3" &
elif exists ueberzug && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "ueberzug" ] ;}; then
ueberzug_layer "$1" "$2" "$3" && return
elif exists catimg && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "catimg" ] ;}; then
catimg "$3" &
elif exists viu && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "viu" ] ;}; then
viu -t "$3" &
elif exists chafa && { [ -z "$NNN_PREVIEWIMGPROG" ] || [ "$NNN_PREVIEWIMGPROG" = "chafa" ] ;}; then
chafa "$3" &
else
fifo_pager print_bin_info "$3" && return
fi
printf "%s" "$!" > "$PREVIEWPID"
}
ueberzug_layer() {
[ -f "$POSOFFSET" ] && read -r x y < "$POSOFFSET"
printf '{"action": "add", "identifier": "nnn_ueberzug", "x": %d, "y": %d, "width": "%d", "height": "%d", "scaler": "fit_contain", "path": "%s"}\n'\
"${x:-0}" "${y:-0}" "$1" "$2" "$3" > "$FIFO_UEBERZUG"
}
ueberzug_remove() {
printf '{"action": "remove", "identifier": "nnn_ueberzug"}\n' > "$FIFO_UEBERZUG"
}
winch_handler() {
clear
pidkill "$PREVIEWPID"
if [ -p "$FIFO_UEBERZUG" ]; then
pkill -f "tail --follow $FIFO_UEBERZUG"
tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser json &
fi
preview_file "$(cat "$CURSEL")"
}
preview_fifo() {
while read -r selection; do
if [ -n "$selection" ]; then
pidkill "$PREVIEWPID"
[ -p "$FIFO_UEBERZUG" ] && ueberzug_remove
[ "$selection" = "close" ] && break
preview_file "$selection"
printf "%s" "$selection" > "$CURSEL"
fi
done < "$NNN_FIFO"
sleep 0.1 # make sure potential preview by winch_handler is killed
pkill -P "$$"
}
if [ "$PREVIEW_MODE" -eq 1 ] 2>/dev/null; then
if [ "$NNN_TERMINAL" != "kitty" ] && exists ueberzug; then
mkfifo "$FIFO_UEBERZUG"
tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser json &
fi
preview_file "$PWD/$1"
preview_fifo &
printf "%s" "$!" > "$FIFOPID"
printf "%s" "$PWD/$1" > "$CURSEL"
trap 'winch_handler; wait' WINCH
trap 'rm "$PREVIEWPID" "$CURSEL" "$FIFO_UEBERZUG" "$FIFOPID" "$POSOFFSET" 2>/dev/null' INT HUP EXIT
wait "$!" 2>/dev/null
exit 0
else
if [ ! -r "$NNN_FIFO" ]; then
clear
prompt "No FIFO available! (\$NNN_FIFO='$NNN_FIFO')\nPlease read Usage in '$0'."
elif [ "$KITTY_WINDOW_ID" ] && [ -z "$TMUX" ] && [ -z "$KITTY_LISTEN_ON" ]; then
clear
prompt "\$KITTY_LISTEN_ON not set!\nPlease read Usage in '$0'."
else
toggle_preview "$1" &
fi
fi

35
.config/nnn/plugins/pskill Executable file
View File

@ -0,0 +1,35 @@
#!/usr/bin/env sh
# Description: Fuzzy list and kill a (zombie) process by name
#
# Dependencies: fzf, ps
#
# Note: To kill a zombie process enter "zombie"
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
printf "Enter process name ['defunct' for zombies]: "
read -r psname
# shellcheck disable=SC2009
if [ -n "$psname" ]; then
if type sudo >/dev/null 2>&1; then
sucmd=sudo
elif type doas >/dev/null 2>&1; then
sucmd=doas
else
sucmd=: # noop
fi
if type fzf >/dev/null 2>&1; then
fuzzy=fzf
else
exit 1
fi
cmd="$(ps -ax | grep -iw "$psname" | "$fuzzy" | sed -e 's/^[ \t]*//' | cut -d' ' -f1)"
if [ -n "$cmd" ]; then
$sucmd kill -9 "$cmd"
fi
fi

45
.config/nnn/plugins/renamer Executable file
View File

@ -0,0 +1,45 @@
#!/usr/bin/env sh
# Description: Batch rename selection or current directory with qmv or vidir
#
# Notes:
# - Try to mimic current batch rename functionality but with correct
# handling of edge cases by qmv or vidir.
# - Qmv opens with hidden files if no selection is used. Selected
# directories are shown.
# - Vidir don't show directories nor hidden files.
#
# Shell: POSIX compliant
# Author: José Neder
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
if type qmv >/dev/null 2>&1; then
batchrenamesel="qmv -fdo -da"
batchrename="qmv -fdo -a"
elif type vidir >/dev/null 2>&1; then
batchrenamesel="vidir"
batchrename="vidir"
else
printf "there is not batchrename program installed."
exit
fi
if [ -s "$selection" ]; then
printf "rename selection? "
read -r resp
fi
if [ "$resp" = "y" ]; then
# -o flag is necessary for interactive editors
xargs -o -0 $batchrenamesel < "$selection"
# Clear selection
if [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi
elif [ ! "$(LC_ALL=C ls -a)" = ".
.." ]; then
# On older systems that don't have ls -A
$batchrename
fi

36
.config/nnn/plugins/ringtone Executable file
View File

@ -0,0 +1,36 @@
#!/usr/bin/env sh
# Description: Create an mp3 ringtone out of an audio file in any format
# Needs user to provide start and end where to cut the file
# Input file audio.ext results in audio_ringtone.mp3
#
# Tip: To convert a complete media file, set start as 0 and
# the runtime of the file as end.
#
# Dependencies: date, ffmpeg
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
if [ -n "$1" ]; then
printf "start (hh:mm:ss): "
read -r start
st=$(date -d "$start" +%s) || exit 1
printf "end (hh:mm:ss): "
read -r end
et=$(date -d "$end" +%s) || exit 1
if [ "$st" -ge "$et" ]; then
printf "error: start >= end "
read -r _
exit 1
fi
interval=$(( et - st ))
outfile=$(basename "$1")
outfile="${outfile%.*}"_ringtone.mp3
ffmpeg -i "$1" -ss "$start" -t "$interval" -vn -sn -acodec libmp3lame -q:a 2 "$outfile"
fi

26
.config/nnn/plugins/rsynccp Executable file
View File

@ -0,0 +1,26 @@
#!/usr/bin/env sh
# Description: Simple script to give copy-paste a progress percentage
# by utilizing rsync.
#
# LIMITATION: this won't work when pasting to MTP device.
#
# Dependencies: rsync
#
# Shell: POSIX compliant
# Author: Benawi Adha
sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
# Choose one of these two schemes by commenting
# more verbose
xargs -0 -I % rsync -ah --progress % "$PWD" < "$sel"
# less verbose
# xargs -0 -I % rsync -ah --info=progress2 % "$PWD" < "$sel"
# Clear selection
if [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi

52
.config/nnn/plugins/splitjoin Executable file
View File

@ -0,0 +1,52 @@
#!/usr/bin/env sh
# Description: Splits the file passed as argument or joins selection
#
# Note: Adds numeric suffix to split files
# Adds '.out suffix to the first file to be joined and saves as output file for join
#
# Shell: POSIX compliant
# Authors: Arun Prakash Jana, ath3
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
resp=s
if [ -s "$selection" ]; then
printf "press 's' (split current file) or 'j' (join selection): "
read -r resp
fi
if [ "$resp" = "j" ]; then
if [ -s "$selection" ]; then
arr=$(tr '\0' '\n' < "$selection")
if [ "$(echo "$arr" | wc -l)" -lt 2 ]; then
echo "joining needs at least 2 files"
exit
fi
for entry in $arr
do
if [ -d "$entry" ]; then
echo "can't join directories"
exit
fi
done
file="$(basename "$(echo "$arr" | sed -n '1p' | sed -e 's/[0-9][0-9]$//')")"
sort -z < "$selection" | xargs -0 -I{} cat {} > "${file}.out"
# Clear selection
if [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi
fi
elif [ "$resp" = "s" ]; then
if [ -n "$1" ] && [ -f "$1" ]; then
# a single file is passed
printf "split size in MB: "
read -r size
if [ -n "$size" ]; then
split -d -b "$size"M "$1" "$1"
fi
fi
fi

16
.config/nnn/plugins/suedit Executable file
View File

@ -0,0 +1,16 @@
#!/usr/bin/env sh
# Description: Edit file as superuser
#
# Shell: POSIX compliant
# Author: Anna Arad
EDITOR="${EDITOR:-vim}"
if type sudo >/dev/null 2>&1; then
sudo -E "$EDITOR" "$1"
elif type sudoedit >/dev/null 2>&1; then
sudoedit -E "$1"
elif type doas >/dev/null 2>&1; then
doas "$EDITOR" "$1"
fi

21
.config/nnn/plugins/togglex Executable file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env sh
# Description: Toggles executable mode for selection
#
# Dependencies: chmod
#
# Note: Works _only_ with selection (nnn can toggle the mode for the hovered file)
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
if [ -s "$selection" ]; then
xargs -0 -I {} sh -c 'if [ -x "{}" ] ; then chmod -x "{}" ; else chmod +x "{}" ; fi' < "$selection"
# Clear selection
if [ -p "$NNN_PIPE" ]; then
printf "-" > "$NNN_PIPE"
fi
fi

52
.config/nnn/plugins/umounttree Executable file
View File

@ -0,0 +1,52 @@
#!/usr/bin/env sh
# Description: Autodetects a nnn remote mountpoint (mounted with `c`)
# from any of its subfolders and allows unmounting it
# from the subdir without navigating to the mountppoint
# or entering the remote name. Also works when hovering
# the mountpoint directly like vanilla `u`.
#
# Dependencies: fusermount
#
# Shell: POSIX compliant
# Authors: Kabouik & 0xACE
#
# TODO:
# - Avoid lazy unmount by forcing nnn context to leave the subfolder before fusermount.
# Tried `printf "%s" "0c$m" > "$NNN_PIPE"` but it breaks the nnn interface, see #854.
err=0
m=$HOME/.config/nnn/mounts
if [ "$PWD" = "$m" ]; then
# Allow running the script on hovered directory if user is in ~/.config/nnn/mounts
d="$1"
else
d=$(dirname "$(readlink -f "$1")" | grep -oP "^$m\K.*" | cut -d"/" -f2)
fi
# Test if user is within $m or a subdir, abort if not
if [ "$d" = "" ]; then
clear && printf "You are not in a remote folder mounted with nnn. Press return to continue. " && read -r _
else
# Test if $m/$d is a mountpoint and try unmounting if it is
mountpoint -q -- "$m/$d"
if [ "$?" -eq "1" ]; then
clear && printf "Parent '%s' is not a mountpoint. Press return to continue. " "$d" && read -r _
else
cd "$m" && fusermount -uq "$m/$d" || err=1
if [ "$err" -eq "0" ]; then
rmdir "$m/$d" && clear && printf "Parent '%s' unmounted." "$d"
else
clear && printf "Failed to unmount. Try lazy unmount? [Yy/Nn] " && read -r
fi
fi
fi
# If unmount fails, offer lazy unmount
if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ]; then
err=0
cd "$m" && fusermount -uqz "$m/$d" || err=1
if [ "$err" -eq "0" ]; then
rmdir "$m/$d" && clear && printf "Parent '%s' unmounted with lazy unmount. " "$d"
fi
fi

45
.config/nnn/plugins/upload Executable file
View File

@ -0,0 +1,45 @@
#!/usr/bin/env sh
# Description: Selections are uploaded using Firefox Send
# For single files:
# Upload to Firefox Send if ffsend is found, else
# Paste contents of a text a file http://ix.io
# Upload a binary file to file.io
#
# Dependencies: ffsend (https://github.com/timvisee/ffsend), curl, jq, tr
#
# Note: Binary file set to expire after a week
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
if [ -s "$selection" ]; then
if type ffsend >/dev/null 2>&1; then
# File name will be randomized foo.tar
xargs -0 < "$selection" ffsend u
else
printf "ffsend is required to upload selection."
fi
# Clear selection
printf "-" > "$NNN_PIPE"
else
if [ -n "$1" ] && [ -s "$1" ]; then
if type ffsend >/dev/null 2>&1; then
ffsend -fiq u "$1"
elif [ "$(mimetype --output-format %m "$1" | awk -F '/' '{print $1}')" = "text" ]; then
curl -F "f:1=@$1" ix.io
else
# Upload the file, show the download link and wait till user presses any key
curl -s -F "file=@$1" https://file.io/?expires=1w | jq '.link' | tr -d '"'
# To write download link to "$1".loc and exit
# curl -s -F "file=@$1" https://file.io/?expires=1w -o `basename "$1"`.loc
fi
else
printf "empty file!"
fi
fi
read -r _

37
.config/nnn/plugins/wallpaper Executable file
View File

@ -0,0 +1,37 @@
#!/usr/bin/env sh
# Description: Set the selected image as wallpaper.
# Uses nitrogen or pywal on X11, swww on wayland.
#
# Usage: Hover on an image and run the script to set it as wallpaper.
#
# Shell: POSIX compliant
# Author: juacq97
if [ -n "$1" ]; then
if [ "$(file --mime-type "$1" | awk '{print $NF}' | awk -F '/' '{print $1}')" = "image" ]; then
if [ "$XDG_SESSION_TYPE" = "x11" ]; then
if type nitrogen >/dev/null 2>&1; then
nitrogen --set-zoom-fill --save "$1"
elif type wal >/dev/null 2>&1; then
wal -i "$1"
else
printf "nitrogen or pywal missing"
read -r _
fi
else
if type swww >/dev/null 2>&1; then
swww img "$1"
else
printf "swww missing"
read -r _
fi
fi
# If you want a system notification, uncomment the next 3 lines.
# notify-send -a "nnn" "Wallpaper changed!"
# else
# notify-send -a "nnn" "No image selected"
fi
fi

62
.config/nnn/plugins/x2sel Executable file
View File

@ -0,0 +1,62 @@
#!/usr/bin/env sh
# Description: Copy system clipboard newline-separated file list to selection
#
# Dependencies:
# - tr
# - xclip/xsel (Linux)
# - pbpaste (macOS)
# - termux-clipboard-get (Termux)
# - powershell (WSL)
# - cygwim's /dev/clipboard (Cygwin)
# - wl-paste (Wayland)
# - clipboard (Haiku)
#
# Note:
# - Limitation: breaks if a filename has newline in it
#
# Shell: POSIX compliant
# Author: Léo Villeveygoux, after Arun Prakash Jana's .cbcp
IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" # protect trailing \n
selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
getclip () {
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
# Wayland
wl-paste
elif type xsel >/dev/null 2>&1; then
# Linux
xsel -bo
elif type xclip >/dev/null 2>&1; then
# Linux
xclip -sel clip -o
elif type pbpaste >/dev/null 2>&1; then
# macOS
pbpaste
elif type termux-clipboard-get >/dev/null 2>&1; then
# Termux
termux-clipboard-get
elif type powershell.exe >/dev/null 2>&1; then
# WSL
powershell.exe Get-Clipboard
elif [ -r /dev/clipboard ] ; then
# Cygwin
cat /dev/clipboard
elif type clipboard >/dev/null 2>&1; then
# Haiku
clipboard --print
fi
}
CLIPBOARD=$(getclip)
# Check if clipboard actually contains a file list
for file in $CLIPBOARD ; do
if [ ! -e "$file" ] ; then
exit 1;
fi
done
printf "%s" "$CLIPBOARD" | tr '\n' '\0' > "$selection"

53
.config/nnn/plugins/xdgdefault Executable file
View File

@ -0,0 +1,53 @@
#!/usr/bin/env sh
# Description: Sets the xdg-open's default application for the current entry's file
# type. ${XDG_DATA_DIRS} and ${XDG_DATA_HOME} are set to the recommended
# defaults if unset, as specified in XDG Base Directory Specification
# - http://specifications.freedesktop.org/basedir-spec/.
#
# Dependencies: xdg-utils, fzf or dmenu (GUI)
#
# Shell: POSIX compliant
# Author: lwnctd
# set to 1 to enable GUI apps
GUI="${GUI:-0}"
if [ "$GUI" -ne 0 ] && command -v dmenu > /dev/null 2>& 1; then
menu="dmenu -i -l 7"
elif command -v fzf > /dev/null 2>& 1; then
menu="fzf -e --tiebreak=begin"
fi
if [ -z "$1" ] || [ -z "$menu" ] > /dev/null 2>& 1; then
exit 1
fi
ftype=$(xdg-mime query filetype "$2/$1")
if [ -z "$ftype" ]; then
exit 1
fi
dirs=${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
dirs=${dirs}:${XDG_DATA_HOME:-$HOME/.local/share}:
while [ -n "$dirs" ]; do
d=${dirs%%:*}
if [ -n "$d" ] && [ -d "$d"/applications ]; then
set -- "$@" "$d"/applications
fi
dirs=${dirs#*:}
done
app=$(find "$@" -iname '*.desktop' -exec grep '^Name=' {} + \
| sort -u -t ':' -k 1,1 \
| sed -e 's;..*/\(..*desktop\):Name=\(..*\);\2:\1;' \
| sort -t ':' -k 1,1 \
| column -t -s ':' -o "$(printf '\t')" \
| $menu \
| cut -f 2)
if [ -n "$app" ]; then
xdg-mime default "${app%%[[:blank:]]*}" "$ftype"
fi

14
.config/notmuch-config Executable file
View File

@ -0,0 +1,14 @@
[database]
path=/home/javier/.local/share/mail
[user]
name=jpacheco
primary_email=jpacheco@cock.li
[new]
tags=unread;inbox;
ignore=.mbsyncstate;.uidvalidity
[search]
exclude_tags=deleted;spam;
[maildir]
synchronize_flags=true
[crypto]
gpg_path=gpg

Some files were not shown because too many files have changed in this diff Show More