From 0aaa47da1e229c5a8602e7a6e261ca8fdf7d3ece Mon Sep 17 00:00:00 2001 From: Hektor Misplon Date: Thu, 7 May 2020 00:22:35 +0000 Subject: [PATCH] Remove bloat --- .config/coc/commands | 2 - .config/coc/extensions/db.json | 3 - .config/coc/extensions/package.json | 12 - .config/coc/extensions/test.js | 1 - .config/coc/extensions/yarn.lock | 4207 ----------------- .config/coc/history.json | 30 - .config/coc/lists | 4 - .config/coc/memos.json | 1 - .config/coc/mru | 0 .suckless/dmenu/.gitignore | 1 - .suckless/dmenu/LICENSE | 30 - .suckless/dmenu/Makefile | 64 - .suckless/dmenu/README | 24 - .suckless/dmenu/arg.h | 49 - .suckless/dmenu/config.def.h | 23 - .suckless/dmenu/config.h | 23 - .suckless/dmenu/config.mk | 31 - .suckless/dmenu/dmenu | Bin 43840 -> 0 bytes .suckless/dmenu/dmenu.1 | 194 - .suckless/dmenu/dmenu.c | 771 --- .suckless/dmenu/dmenu.o | Bin 32504 -> 0 bytes .suckless/dmenu/dmenu_path | 13 - .suckless/dmenu/dmenu_run | 2 - .suckless/dmenu/drw.c | 435 -- .suckless/dmenu/drw.h | 57 - .suckless/dmenu/drw.o | Bin 10472 -> 0 bytes .suckless/dmenu/stest | Bin 17688 -> 0 bytes .suckless/dmenu/stest.1 | 90 - .suckless/dmenu/stest.c | 109 - .suckless/dmenu/stest.o | Bin 5296 -> 0 bytes .suckless/dmenu/util.c | 35 - .suckless/dmenu/util.h | 8 - .suckless/dmenu/util.o | Bin 2224 -> 0 bytes .suckless/dwm/.gitignore | 1 - .suckless/dwm/LICENSE | 37 - .suckless/dwm/Makefile | 51 - .suckless/dwm/README | 48 - .suckless/dwm/config.def.h | 118 - .suckless/dwm/config.h | 121 - .suckless/dwm/config.mk | 38 - .suckless/dwm/drw.c | 435 -- .suckless/dwm/drw.h | 57 - .suckless/dwm/drw.o | Bin 10472 -> 0 bytes .suckless/dwm/dwm | Bin 66592 -> 0 bytes .suckless/dwm/dwm.1 | 176 - .suckless/dwm/dwm.c | 2363 --------- .suckless/dwm/dwm.o | Bin 60008 -> 0 bytes .suckless/dwm/dwm.png | Bin 373 -> 0 bytes .suckless/dwm/patches/centeredmaster.diff | 142 - .suckless/dwm/patches/dwm-notitle-6.2.diff | 81 - .../patches/dwm-pertag-20170513-ceac8c9.diff | 177 - .../patches/dwm-ru_centeredmaster-6.2.diff | 157 - .suckless/dwm/patches/dwm-ru_gaps-6.2.diff | 126 - .suckless/dwm/transient.c | 42 - .suckless/dwm/util.c | 35 - .suckless/dwm/util.h | 8 - .suckless/dwm/util.o | Bin 2224 -> 0 bytes .suckless/sselp/.gitignore | 1 - .suckless/sselp/.hgtags | 2 - .suckless/sselp/LICENSE | 21 - .suckless/sselp/Makefile | 48 - .suckless/sselp/README | 24 - .suckless/sselp/config.mk | 23 - .suckless/sselp/sselp | Bin 14480 -> 0 bytes .suckless/sselp/sselp.c | 45 - .suckless/sselp/sselp.o | Bin 3256 -> 0 bytes .suckless/st/.gitignore | 1 - .suckless/st/FAQ | 195 - .suckless/st/LEGACY | 17 - .suckless/st/LICENSE | 34 - .suckless/st/Makefile | 57 - .suckless/st/README | 34 - .suckless/st/TODO | 28 - .suckless/st/arg.h | 50 - .suckless/st/config.def.h | 459 -- .suckless/st/config.h | 460 -- .suckless/st/config.mk | 35 - .suckless/st/st | Bin 102208 -> 0 bytes .suckless/st/st-anysize-0.8.1.diff | 152 - .suckless/st/st-nordtheme-0.8.2.diff | 100 - .suckless/st/st.1 | 176 - .suckless/st/st.c | 2599 ---------- .suckless/st/st.h | 123 - .suckless/st/st.info | 222 - .suckless/st/st.o | Bin 73184 -> 0 bytes .suckless/st/win.h | 39 - .suckless/st/x.c | 2045 -------- .suckless/st/x.o | Bin 73896 -> 0 bytes .vim/autoload/plug.vim | 2664 ----------- .vim/autoload/plug.vim.old | 2597 ---------- .vim/coc-settings.json | 50 - .vim/plugged/coc.nvim | 1 - .vim/plugged/fzf | 1 - .vim/plugged/fzf.vim | 1 - .vim/plugged/nerdcommenter | 1 - .vim/plugged/nerdtree | 1 - .vim/plugged/scvim | 1 - .vim/plugged/typescript-vim | 1 - .vim/plugged/vim-devicons | 1 - .vim/plugged/vim-js | 1 - .vim/plugged/vim-jsx-pretty | 1 - .vim/plugged/vim-jsx-typescript | 1 - .vim/plugged/vim-tidal | 1 - .xinitrc | 45 - README.md | 33 - etc/xorg.conf.d/10-monitor.conf | 10 - screenshot.png | Bin 144910 -> 0 bytes 107 files changed, 22833 deletions(-) delete mode 100644 .config/coc/commands delete mode 100644 .config/coc/extensions/db.json delete mode 100644 .config/coc/extensions/package.json delete mode 100644 .config/coc/extensions/test.js delete mode 100644 .config/coc/extensions/yarn.lock delete mode 100644 .config/coc/history.json delete mode 100644 .config/coc/lists delete mode 100644 .config/coc/memos.json delete mode 100644 .config/coc/mru delete mode 100644 .suckless/dmenu/.gitignore delete mode 100644 .suckless/dmenu/LICENSE delete mode 100644 .suckless/dmenu/Makefile delete mode 100644 .suckless/dmenu/README delete mode 100644 .suckless/dmenu/arg.h delete mode 100644 .suckless/dmenu/config.def.h delete mode 100644 .suckless/dmenu/config.h delete mode 100644 .suckless/dmenu/config.mk delete mode 100755 .suckless/dmenu/dmenu delete mode 100644 .suckless/dmenu/dmenu.1 delete mode 100644 .suckless/dmenu/dmenu.c delete mode 100644 .suckless/dmenu/dmenu.o delete mode 100755 .suckless/dmenu/dmenu_path delete mode 100755 .suckless/dmenu/dmenu_run delete mode 100644 .suckless/dmenu/drw.c delete mode 100644 .suckless/dmenu/drw.h delete mode 100644 .suckless/dmenu/drw.o delete mode 100755 .suckless/dmenu/stest delete mode 100644 .suckless/dmenu/stest.1 delete mode 100644 .suckless/dmenu/stest.c delete mode 100644 .suckless/dmenu/stest.o delete mode 100644 .suckless/dmenu/util.c delete mode 100644 .suckless/dmenu/util.h delete mode 100644 .suckless/dmenu/util.o delete mode 100644 .suckless/dwm/.gitignore delete mode 100644 .suckless/dwm/LICENSE delete mode 100644 .suckless/dwm/Makefile delete mode 100644 .suckless/dwm/README delete mode 100644 .suckless/dwm/config.def.h delete mode 100644 .suckless/dwm/config.h delete mode 100644 .suckless/dwm/config.mk delete mode 100644 .suckless/dwm/drw.c delete mode 100644 .suckless/dwm/drw.h delete mode 100644 .suckless/dwm/drw.o delete mode 100755 .suckless/dwm/dwm delete mode 100644 .suckless/dwm/dwm.1 delete mode 100644 .suckless/dwm/dwm.c delete mode 100644 .suckless/dwm/dwm.o delete mode 100644 .suckless/dwm/dwm.png delete mode 100644 .suckless/dwm/patches/centeredmaster.diff delete mode 100644 .suckless/dwm/patches/dwm-notitle-6.2.diff delete mode 100644 .suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff delete mode 100644 .suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff delete mode 100644 .suckless/dwm/patches/dwm-ru_gaps-6.2.diff delete mode 100644 .suckless/dwm/transient.c delete mode 100644 .suckless/dwm/util.c delete mode 100644 .suckless/dwm/util.h delete mode 100644 .suckless/dwm/util.o delete mode 100644 .suckless/sselp/.gitignore delete mode 100644 .suckless/sselp/.hgtags delete mode 100644 .suckless/sselp/LICENSE delete mode 100644 .suckless/sselp/Makefile delete mode 100644 .suckless/sselp/README delete mode 100644 .suckless/sselp/config.mk delete mode 100755 .suckless/sselp/sselp delete mode 100644 .suckless/sselp/sselp.c delete mode 100644 .suckless/sselp/sselp.o delete mode 100644 .suckless/st/.gitignore delete mode 100644 .suckless/st/FAQ delete mode 100644 .suckless/st/LEGACY delete mode 100644 .suckless/st/LICENSE delete mode 100644 .suckless/st/Makefile delete mode 100644 .suckless/st/README delete mode 100644 .suckless/st/TODO delete mode 100644 .suckless/st/arg.h delete mode 100644 .suckless/st/config.def.h delete mode 100644 .suckless/st/config.h delete mode 100644 .suckless/st/config.mk delete mode 100755 .suckless/st/st delete mode 100644 .suckless/st/st-anysize-0.8.1.diff delete mode 100644 .suckless/st/st-nordtheme-0.8.2.diff delete mode 100644 .suckless/st/st.1 delete mode 100644 .suckless/st/st.c delete mode 100644 .suckless/st/st.h delete mode 100644 .suckless/st/st.info delete mode 100644 .suckless/st/st.o delete mode 100644 .suckless/st/win.h delete mode 100644 .suckless/st/x.c delete mode 100644 .suckless/st/x.o delete mode 100644 .vim/autoload/plug.vim delete mode 100644 .vim/autoload/plug.vim.old delete mode 100644 .vim/coc-settings.json delete mode 160000 .vim/plugged/coc.nvim delete mode 160000 .vim/plugged/fzf delete mode 160000 .vim/plugged/fzf.vim delete mode 160000 .vim/plugged/nerdcommenter delete mode 160000 .vim/plugged/nerdtree delete mode 160000 .vim/plugged/scvim delete mode 160000 .vim/plugged/typescript-vim delete mode 160000 .vim/plugged/vim-devicons delete mode 160000 .vim/plugged/vim-js delete mode 160000 .vim/plugged/vim-jsx-pretty delete mode 160000 .vim/plugged/vim-jsx-typescript delete mode 160000 .vim/plugged/vim-tidal delete mode 100644 .xinitrc delete mode 100644 README.md delete mode 100644 etc/xorg.conf.d/10-monitor.conf delete mode 100644 screenshot.png diff --git a/.config/coc/commands b/.config/coc/commands deleted file mode 100644 index 250f698..0000000 --- a/.config/coc/commands +++ /dev/null @@ -1,2 +0,0 @@ -prettier.formatFile -workspace.showOutput \ No newline at end of file diff --git a/.config/coc/extensions/db.json b/.config/coc/extensions/db.json deleted file mode 100644 index 05a83cb..0000000 --- a/.config/coc/extensions/db.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "lastUpdate": 1586260042078 -} \ No newline at end of file diff --git a/.config/coc/extensions/package.json b/.config/coc/extensions/package.json deleted file mode 100644 index d4cd066..0000000 --- a/.config/coc/extensions/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "dependencies": { - "coc-css": ">=1.2.2", - "coc-emmet": "^1.1.4", - "coc-eslint": ">=1.2.6", - "coc-html": ">=1.2.4", - "coc-json": ">=1.2.5", - "coc-prettier": ">=1.1.12", - "coc-svelte": "^0.0.2", - "coc-tsserver": ">=1.4.12" - } -} diff --git a/.config/coc/extensions/test.js b/.config/coc/extensions/test.js deleted file mode 100644 index 4b388a9..0000000 --- a/.config/coc/extensions/test.js +++ /dev/null @@ -1 +0,0 @@ -console.log("testing"); diff --git a/.config/coc/extensions/yarn.lock b/.config/coc/extensions/yarn.lock deleted file mode 100644 index d123f08..0000000 --- a/.config/coc/extensions/yarn.lock +++ /dev/null @@ -1,4207 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@emmetio/extract-abbreviation@0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@emmetio/extract-abbreviation/-/extract-abbreviation-0.1.6.tgz#e4a9856c1057f0aff7d443b8536477c243abe28c" - integrity sha512-Ce3xE2JvTSEbASFbRbA1gAIcMcZWdS2yUYRaQbeM0nbOzaZrUYfa3ePtcriYRZOZmr+CkKA+zbjhvTpIOAYVcw== - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.1.tgz#da5fd19a5f71177a53778073978873964f49acf1" - integrity sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/formatio@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" - integrity sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg== - dependencies: - samsam "1.3.0" - -"@sinonjs/formatio@^3.2.1": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" - integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" - -"@sinonjs/samsam@^3.1.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== - dependencies: - "@sinonjs/commons" "^1.3.0" - array-from "^2.1.1" - lodash "^4.17.15" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - -"@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== - -"@typescript-eslint/experimental-utils@1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e" - integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "1.13.0" - eslint-scope "^4.0.0" - -"@typescript-eslint/parser@^1.10.2": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.13.0.tgz#61ac7811ea52791c47dc9fd4dd4a184fae9ac355" - integrity sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "1.13.0" - "@typescript-eslint/typescript-estree" "1.13.0" - eslint-visitor-keys "^1.0.0" - -"@typescript-eslint/typescript-estree@1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e" - integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw== - dependencies: - lodash.unescape "4.0.1" - semver "5.5.0" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" - -acorn-jsx@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - -acorn@^5.5.0: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -acorn@^6.0.7: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== - -ajv-keywords@^3.0.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv@^6.0.1, ajv@^6.10.2, ajv@^6.9.1: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^7.1.2: - version "7.2.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" - integrity sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ== - dependencies: - browserslist "^2.11.3" - caniuse-lite "^1.0.30000805" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^6.0.17" - postcss-value-parser "^3.2.3" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -browserslist@^2.11.3: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== - dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805: - version "1.0.30001039" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" - integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== - -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - -ccount@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" - integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -character-entities-html4@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" - integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -clone-regexp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f" - integrity sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw== - dependencies: - is-regexp "^1.0.0" - is-supported-regexp-flag "^1.0.0" - -coc-css@>=1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/coc-css/-/coc-css-1.2.2.tgz#9b62ac96a9db8c687396ab4648c0c67dc3897a2f" - integrity sha512-JvZnKZZJZemS70o972OEjfnMGGO2sLpJA3iX1OT3CXmaymPb8CmufboyCVnzGMDMbFL/qHgfjbdw9kOg5ZtzzQ== - -coc-emmet@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/coc-emmet/-/coc-emmet-1.1.4.tgz#776465b1563e953acc1779168a70fb01825a4863" - integrity sha512-hxpldh4WYgq7JOQeAynEy+uM2M12RnxTlmY3cCDpZrkCJGZwz4BRYseXhuwieaFiut0OzqBEtWIcZLLrzROKMA== - dependencies: - vscode-emmet-helper "^1.2.15" - -coc-eslint@>=1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/coc-eslint/-/coc-eslint-1.2.6.tgz#c452993af9a6de89ea83fcaa29ea5bb891ebb8a7" - integrity sha512-2vOL35E7kIig1evMUj/bIij9AjtEdTI35sshaf1VeLSqTnFc9Owbd4glHVeY4q76t0EsTyLkuqm7Q1QsGR/7iw== - -coc-html@>=1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/coc-html/-/coc-html-1.2.4.tgz#242d83381f7fae95209d82d7ab7a919f5a174855" - integrity sha512-gr0GBKeew88n8hcn4fkzIcBruhih7YAqBd7ldsYjoG2qZhjPEj/arYESFOYgooX1jYuxCpQYH526EXXzs4BGRQ== - dependencies: - typescript "^3" - -coc-json@>=1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/coc-json/-/coc-json-1.2.5.tgz#c49b38991d52edb8d792a6e47b219a4d69119df2" - integrity sha512-j8EAdxXxKxc5zHwCzdGAcnXzDXjtfbL6fNb9QIlBi2CkMIoARFyU4uZsIkMoROTMPaffHDFyzyAW2UJpbIJ0WQ== - -coc-prettier@>=1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/coc-prettier/-/coc-prettier-1.1.12.tgz#f854d95813bd8fe9cfeda09aab0ee980c4d16c96" - integrity sha512-NHEbnnWjVoWCi9B6o6pzOLiXyntqG0ywvfSWuaBiJZP8eNPl/MP+LlwhGEcfR0f7PVCLjZzb/2a/3giYBXYpEQ== - dependencies: - prettier "^2.0.2" - prettier-eslint "^9.0.1" - prettier-stylelint "^0.4.2" - prettier-tslint "^0.4.2" - -coc-svelte@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/coc-svelte/-/coc-svelte-0.0.2.tgz#bf373510a208e3c59d24bb03d4452fe31ff6a4c7" - integrity sha512-dESrx8Ti8w4qkuByMXwnrpWKCxtG4aXGHsGLd9s0xSuTE8cowOk9FEDDqMyoum1IHVVtZ29GRyfKJ5uicZs0hA== - dependencies: - svelte-language-server "0.10.3" - vscode-languageserver-protocol "^3.14.1" - -coc-tsserver@>=1.4.12: - version "1.4.12" - resolved "https://registry.yarnpkg.com/coc-tsserver/-/coc-tsserver-1.4.12.tgz#5107c32dc4060a02db86bb26e57704654cec07c0" - integrity sha512-JMlIDCgTBXAWh6jsY1c6aMXw50jGRMZoiAYKhX0sYVKrDZznS2ocjKw4m/9yoNPWHIH6gk89BGXXT+7XhtsGWw== - dependencies: - typescript "3.8.3" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -common-tags@^1.4.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" - integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js@^3.1.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== - -cosmiconfig@^3.0.1, cosmiconfig@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397" - integrity sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q== - dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^3.0.0" - require-from-string "^2.0.1" - -cosmiconfig@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" - integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== - dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" - require-from-string "^2.0.1" - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.0.0, debug@^3.0.1, debug@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -dir-glob@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - -dlv@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -domelementtype@1, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - dependencies: - is-obj "^1.0.0" - -dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -electron-to-chromium@^1.3.30: - version "1.3.398" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.398.tgz#4c01e29091bf39e578ac3f66c1f157d92fa5725d" - integrity sha512-BJjxuWLKFbM5axH3vES7HKMQgAknq9PZHBkMK/rEXUQG9i1Iw5R+6hGkm6GtsQSANjSUrh/a6m32nzCNDNo/+w== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.0, eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -eslint@^5.0.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -espree@^3.5.2: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.0, esquery@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" - integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== - dependencies: - estraverse "^5.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" - integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== - -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execall@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" - integrity sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M= - dependencies: - clone-regexp "^1.0.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== - -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== - dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -get-stdin@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" - integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globby@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globjoin@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" - integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= - -gonzales-pe@^4.0.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" - integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== - dependencies: - minimist "^1.2.5" - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - -html-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" - integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= - -htmlparser2@^3.9.2: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore@^3.3.3, ignore@^3.3.5, ignore@^3.3.7: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -import-fresh@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -import-local@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8" - integrity sha1-sReVcqrNwRxqkQCftDDbyrX2aKg= - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumeric@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" - integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.1.4, is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-supported-regexp-flag@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" - integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -js-base64@^2.1.9: - version "2.5.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" - integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -jsonc-parser@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.3.tgz#1d53d7160e401a783dbceabaad82473f80e6ad7e" - integrity sha512-hk/69oAeaIzchq/v3lS50PXuzn5O2ynldopMC+SWBql7J2WtdptfB9dy8Y7+Og5rPkTCpn83zTiO8FMcqlXJ/g== - -just-extend@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" - integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -known-css-properties@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.5.0.tgz#6ff66943ed4a5b55657ee095779a91f4536f8084" - integrity sha512-LOS0CoS8zcZnB1EjLw4LLqDXw8nvt3AGH5dXLQP3D9O1nLLA+9GC5GnPl5mmF+JiQAtSX4VyZC7KvEtcA4kUtA== - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - dependencies: - package-json "^4.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.merge@^4.6.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.unescape@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" - integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= - -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-symbols@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -loglevel-colored-level-prefix@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" - integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4= - dependencies: - chalk "^1.1.3" - loglevel "^1.4.1" - -loglevel@^1.4.1: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== - -lolex@^2.2.0: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" - integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== - -lolex@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" - -longest-streak@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -magic-string@^0.25.3: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -markdown-table@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" - integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== - -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -mathml-tag-names@^2.0.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" - integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== - -mdast-util-compact@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz#d531bb7667b5123abf20859be086c4d06c894593" - integrity sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg== - dependencies: - unist-util-visit "^1.1.0" - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -meow@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" - integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - -merge2@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nise@^1.2.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" - integrity sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ== - dependencies: - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^5.0.1" - path-to-regexp "^1.7.0" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-selector@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" - integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" - integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-3.0.0.tgz#fa6f47b18e23826ead32f263e744d0e1e847fb13" - integrity sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM= - dependencies: - error-ex "^1.3.1" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-html@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.12.0.tgz#39b6adb4005dfc5464df7999c0f81c95bced7e50" - integrity sha512-KxKUpj7AY7nlCbLcTOYxdfJnGE7QFAfU2n95ADj1Q90RM/pOLdz8k3n4avOyRFs7MDQHcRzJQWM1dehCwJxisQ== - dependencies: - htmlparser2 "^3.9.2" - remark "^8.0.0" - unist-util-find-all-after "^1.0.1" - -postcss-less@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609" - integrity sha512-QQIiIqgEjNnquc0d4b6HDOSFZxbFQoy4MPpli2lSLpKhMyBkKwwca2HFqu4xzxlKID/F2fxSOowwtKpgczhF7A== - dependencies: - postcss "^5.2.16" - -postcss-media-query-parser@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" - integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= - -postcss-reporter@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-5.0.0.tgz#a14177fd1342829d291653f2786efd67110332c3" - integrity sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg== - dependencies: - chalk "^2.0.1" - lodash "^4.17.4" - log-symbols "^2.0.0" - postcss "^6.0.8" - -postcss-resolve-nested-selector@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" - integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= - -postcss-safe-parser@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-3.0.1.tgz#b753eff6c7c0aea5e8375fbe4cde8bf9063ff142" - integrity sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI= - dependencies: - postcss "^6.0.6" - -postcss-sass@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.2.0.tgz#e55516441e9526ba4b380a730d3a02e9eaa78c7a" - integrity sha512-cUmYzkP747fPCQE6d+CH2l1L4VSyIlAzZsok3HPjb5Gzsq3jE+VjpAdGlPsnQ310WKWI42sw+ar0UNN59/f3hg== - dependencies: - gonzales-pe "^4.0.3" - postcss "^6.0.6" - -postcss-scss@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.6.tgz#ab903f3bb20161bc177896462293a53d4bff5f7a" - integrity sha512-4EFYGHcEw+H3E06PT/pQQri06u/1VIIPjeJQaM8skB80vZuXMhp4cSNV5azmdNkontnOID/XYWEvEEELLFB1ww== - dependencies: - postcss "^6.0.23" - -postcss-selector-parser@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.23, postcss@^6.0.6, postcss@^6.0.8: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -prettier-eslint@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-9.0.1.tgz#fbf507cde7329141cd368c6aeb54a70715d02cf4" - integrity sha512-KZT65QTosSAqBBqmrC+RpXbsMRe7Os2YSR9cAfFbDlyPAopzA/S5bioiZ3rpziNQNSJaOxmtXSx07EQ+o2Dlug== - dependencies: - "@typescript-eslint/parser" "^1.10.2" - common-tags "^1.4.0" - core-js "^3.1.4" - dlv "^1.1.0" - eslint "^5.0.0" - indent-string "^4.0.0" - lodash.merge "^4.6.0" - loglevel-colored-level-prefix "^1.0.0" - prettier "^1.7.0" - pretty-format "^23.0.1" - require-relative "^0.8.7" - typescript "^3.2.1" - vue-eslint-parser "^2.0.2" - -prettier-plugin-svelte@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-0.7.0.tgz#5ac0b9f194e0450c88ff1e167cbf3b32d2642df2" - integrity sha512-SuZSeMh48rx42kCFEpI/xE1XgjxQcS3r22Yo7jIhBYRhwbAa8laNxiIHsfeWWkX8BdyELkEayaTQp4ricckwTQ== - dependencies: - tslib "^1.9.3" - -prettier-stylelint@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/prettier-stylelint/-/prettier-stylelint-0.4.2.tgz#62845e342f786218b008da69eef14f0a5c05bcfb" - integrity sha512-CmatjDsW8xKMtWg/Tc6/W02wC59p50kkItrXmkgbhR4b2EKMU5Pm55x1WuCahkkZeZoNVReWRxA8VL/s69mkBg== - dependencies: - cosmiconfig "^3.0.1" - debug "^3.0.1" - get-stdin "^5.0.1" - globby "^6.1.0" - ignore "^3.3.5" - import-local "^0.1.1" - meow "^3.7.0" - pify "^3.0.0" - prettier "^1.7.0" - resolve-from "^4.0.0" - stylelint "^8.1.1" - temp-write "^3.3.0" - tempy "^0.2.1" - update-notifier "^2.2.0" - -prettier-tslint@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/prettier-tslint/-/prettier-tslint-0.4.2.tgz#37dd009ad6a482ea8101f40cf70b777bc86f3438" - integrity sha512-urhX7U/F+fu8sztEs/Z7CxNS8PdEytEwGKhQaH5fxxCdRmHGT45FoClyDlcZrMk9cK/8JpX/asFmTOHtSGJfLg== - dependencies: - chalk "^2.4.0" - globby "^8.0.1" - ignore "^3.3.7" - require-relative "^0.8.7" - tslint "^5.9.1" - yargs "^11.0.0" - -prettier@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== - -prettier@^1.7.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" - integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== - -pretty-format@^23.0.1: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -rc@^1.0.1, rc@^1.1.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readable-stream@^3.1.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" - -remark-parse@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-4.0.0.tgz#99f1f049afac80382366e2e0d0bd55429dd45d8b" - integrity sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw== - dependencies: - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^1.0.2" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^1.0.0" - vfile-location "^2.0.0" - xtend "^4.0.1" - -remark-stringify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-4.0.0.tgz#4431884c0418f112da44991b4e356cfe37facd87" - integrity sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w== - dependencies: - ccount "^1.0.0" - is-alphanumeric "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - longest-streak "^2.0.1" - markdown-escapes "^1.0.0" - markdown-table "^1.1.0" - mdast-util-compact "^1.0.0" - parse-entities "^1.0.2" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - stringify-entities "^1.0.1" - unherit "^1.0.4" - xtend "^4.0.1" - -remark@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/remark/-/remark-8.0.0.tgz#287b6df2fe1190e263c1d15e486d3fa835594d6d" - integrity sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw== - dependencies: - remark-parse "^4.0.0" - remark-stringify "^4.0.0" - unified "^6.0.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -replace-ext@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-relative@^0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" - integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.10.0, resolve@^1.3.2: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@2.6.3, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -run-async@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" - -rxjs@^6.4.0: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -samsam@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" - integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.5.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -sinon@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" - integrity sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w== - dependencies: - "@sinonjs/formatio" "^2.0.0" - diff "^3.1.0" - lodash.get "^4.4.2" - lolex "^2.2.0" - nise "^1.2.0" - supports-color "^5.1.0" - type-detect "^4.0.5" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - dependencies: - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -sourcemap-codec@^1.4.4: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -specificity@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.3.2.tgz#99e6511eceef0f8d9b57924937aac2cb13d13c42" - integrity sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -stringify-entities@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7" - integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A== - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - is-alphanumerical "^1.0.0" - is-hexadecimal "^1.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -style-search@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" - integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= - -stylelint@^8.1.1: - version "8.4.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-8.4.0.tgz#c2dbaeb17236917819f9206e1c0df5fddf6f83c3" - integrity sha512-56hPH5mTFnk8LzlEuTWq0epa34fHuS54UFYQidBOFt563RJBNi1nz1F2HK2MoT1X1waq47milvRsRahFCCJs/Q== - dependencies: - autoprefixer "^7.1.2" - balanced-match "^1.0.0" - chalk "^2.0.1" - cosmiconfig "^3.1.0" - debug "^3.0.0" - execall "^1.0.0" - file-entry-cache "^2.0.0" - get-stdin "^5.0.1" - globby "^7.0.0" - globjoin "^0.1.4" - html-tags "^2.0.0" - ignore "^3.3.3" - imurmurhash "^0.1.4" - known-css-properties "^0.5.0" - lodash "^4.17.4" - log-symbols "^2.0.0" - mathml-tag-names "^2.0.1" - meow "^4.0.0" - micromatch "^2.3.11" - normalize-selector "^0.2.0" - pify "^3.0.0" - postcss "^6.0.6" - postcss-html "^0.12.0" - postcss-less "^1.1.0" - postcss-media-query-parser "^0.2.3" - postcss-reporter "^5.0.0" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^3.0.1" - postcss-sass "^0.2.0" - postcss-scss "^1.0.2" - postcss-selector-parser "^3.1.0" - postcss-value-parser "^3.3.0" - resolve-from "^4.0.0" - specificity "^0.3.1" - string-width "^2.1.0" - style-search "^0.1.0" - sugarss "^1.0.0" - svg-tags "^1.0.0" - table "^4.0.1" - -sugarss@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-1.0.1.tgz#be826d9003e0f247735f92365dc3fd7f1bae9e44" - integrity sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA== - dependencies: - postcss "^6.0.14" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - -supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -svelte-language-server@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/svelte-language-server/-/svelte-language-server-0.10.3.tgz#945b0d93306219dc01a3e1afe95bf34fc36e3942" - integrity sha512-kXwwX+t/snSmORKkp/Gx5XBVFfhFQXLCQCBthk7pb/SNXQX7tGptiKgvfyF0kFrMO7OVP3eaUVfSPDQlFwJSYA== - dependencies: - cosmiconfig "^4.0.0" - estree-walker "^0.6.1" - lodash "^4.17.10" - magic-string "^0.25.3" - prettier "1.18.2" - prettier-plugin-svelte "0.7.0" - sinon "^4.5.0" - source-map "^0.7.3" - svelte "3.6.7" - typescript "3.5.3" - vscode-css-languageservice "4.0.2" - vscode-emmet-helper "1.2.15" - vscode-html-languageservice "3.0.2" - vscode-languageserver "5.2.1" - vscode-languageserver-types "3.14.0" - vscode-uri "2.0.3" - -svelte@3.6.7: - version "3.6.7" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.6.7.tgz#20e814b79aac4009d4bc1ecf0c9287a6bf7e96fb" - integrity sha512-9HzhPxWNLi+ZBhxL3HJ8jwwu+u+XfHtVF3uEJ2m8/JOdnaTC9D2qiEwOncgI7z/pN+VumgKQtZoHtvYCW6fHqg== - -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= - -table@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" - integrity sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg== - dependencies: - ajv "^6.0.1" - ajv-keywords "^3.0.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -temp-write@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" - integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI= - dependencies: - graceful-fs "^4.1.2" - is-stream "^1.1.0" - make-dir "^1.0.0" - pify "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.0.1" - -tempy@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.2.1.tgz#9038e4dbd1c201b74472214179bc2c6f7776e54c" - integrity sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw== - dependencies: - temp-dir "^1.0.0" - unique-string "^1.0.0" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-trailing-lines@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94" - integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== - -tslint@^5.9.1: - version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.1" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typescript@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" - integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== - -typescript@3.8.3, typescript@^3, typescript@^3.2.1: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unified@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" - integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-plain-obj "^1.1.0" - trough "^1.0.0" - vfile "^2.0.0" - x-is-string "^0.1.0" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - -unist-util-find-all-after@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz#5751a8608834f41d117ad9c577770c5f2f1b2899" - integrity sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw== - dependencies: - unist-util-is "^3.0.0" - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-remove-position@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" - integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== - dependencies: - unist-util-visit "^1.1.0" - -unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" - integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - -update-notifier@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vfile-location@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" - integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== - -vfile-message@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" - integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== - dependencies: - unist-util-stringify-position "^1.1.1" - -vfile@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" - integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w== - dependencies: - is-buffer "^1.1.4" - replace-ext "1.0.0" - unist-util-stringify-position "^1.0.0" - vfile-message "^1.0.0" - -vscode-css-languageservice@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.0.2.tgz#7496e538b0c151feac16d5888cc0b1b104f4c736" - integrity sha512-pTnfXbsME3pl+yDfhUp/mtvPyIJk0Le4zqJxDn56s9GY9LqY0RmkSEh0oHH6D0HXR3Ni6wKosIaqu8a2G0+jdw== - dependencies: - vscode-languageserver-types "^3.15.0-next.2" - vscode-nls "^4.1.1" - -vscode-emmet-helper@1.2.15: - version "1.2.15" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.15.tgz#62dbfbf49bb9ebe329cb7bffdda5aaac725eea7a" - integrity sha512-JplvmMMWSvm/6/dZezix2ADPM49u6YahPYjs/QToohUpomW/2Eb27ecCrkCyOGBPfKLKGiOPHCssss8TSDA9ag== - dependencies: - "@emmetio/extract-abbreviation" "0.1.6" - jsonc-parser "^1.0.0" - vscode-languageserver-types "^3.6.0-next.1" - -vscode-emmet-helper@^1.2.15: - version "1.2.17" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.17.tgz#f0c6bfcebc4285d081fb2618e6e5b9a08c567afa" - integrity sha512-X4pzcrJ8dE7M3ArFuySF5fgipKDd/EauXkiJwtjBIVRWpVNq0tF9+lNCyuC7iDUwP3Oq7ow/TGssD3GdG96Jow== - dependencies: - "@emmetio/extract-abbreviation" "0.1.6" - jsonc-parser "^1.0.0" - vscode-languageserver-types "^3.6.0-next.1" - -vscode-html-languageservice@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-3.0.2.tgz#1fb9f1bf25094ad10c5b64931083d841ce6e6e0c" - integrity sha512-MP9al7nk1SqQwW4GdDy6Ec3UU1GKy0Wf4pzo3nQ5lgdScb2pajV7iyXZIGJk7jQbifkZWnG0jB7CKecTNFynJw== - dependencies: - vscode-languageserver-types "^3.15.0-next.2" - vscode-nls "^4.1.1" - vscode-uri "^2.0.1" - -vscode-jsonrpc@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" - integrity sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg== - -vscode-jsonrpc@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" - integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== - -vscode-languageserver-protocol@3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz#b8aab6afae2849c84a8983d39a1cf742417afe2f" - integrity sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g== - dependencies: - vscode-jsonrpc "^4.0.0" - vscode-languageserver-types "3.14.0" - -vscode-languageserver-protocol@^3.14.1: - version "3.15.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb" - integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw== - dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" - -vscode-languageserver-types@3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" - integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== - -vscode-languageserver-types@3.15.1, vscode-languageserver-types@^3.15.0-next.2, vscode-languageserver-types@^3.6.0-next.1: - version "3.15.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" - integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== - -vscode-languageserver@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz#0d2feddd33f92aadf5da32450df498d52f6f14eb" - integrity sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A== - dependencies: - vscode-languageserver-protocol "3.14.1" - vscode-uri "^1.0.6" - -vscode-nls@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" - integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== - -vscode-uri@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.0.3.tgz#25e5f37f552fbee3cec7e5f80cef8469cefc6543" - integrity sha512-4D3DI3F4uRy09WNtDGD93H9q034OHImxiIcSq664Hq1Y1AScehlP3qqZyTkX/RWxeu0MRMHGkrxYqm2qlDF/aw== - -vscode-uri@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" - integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== - -vscode-uri@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.1.tgz#5aa1803391b6ebdd17d047f51365cf62c38f6e90" - integrity sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A== - -vue-eslint-parser@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" - integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw== - dependencies: - debug "^3.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" - lodash "^4.17.4" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - dependencies: - mkdirp "^0.5.1" - -x-is-string@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" - integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - -yargs@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" diff --git a/.config/coc/history.json b/.config/coc/history.json deleted file mode 100644 index 8c94505..0000000 --- a/.config/coc/history.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "diagnostics": { - "%2Fhome%2Fh%2Fdev%2Fforks%2Fhydra": [ - ":q" - ], - "%2Fhome%2Fh%2F": { - "config%2Fcoc%2Fextensions": [ - "es" - ] - }, - "%2Fhome%2Fh%2Fgdm": [ - " k" - ] - }, - "lists": { - "%2Fhome%2Fh%2Fdev%2Fforks%2Fhydra": [ - "diagno" - ], - "%2Fhome%2Fh%2Fgdm%2Fouderenraad-gent%2Fclient": [ - "output" - ] - }, - "extensions": { - "%2Fhome%2Fh%2F": { - "config%2Fcoc%2Fextensions": [ - "t:" - ] - } - } -} \ No newline at end of file diff --git a/.config/coc/lists b/.config/coc/lists deleted file mode 100644 index 044e444..0000000 --- a/.config/coc/lists +++ /dev/null @@ -1,4 +0,0 @@ -output -extensions -services -diagnostics \ No newline at end of file diff --git a/.config/coc/memos.json b/.config/coc/memos.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.config/coc/memos.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.config/coc/mru b/.config/coc/mru deleted file mode 100644 index e69de29..0000000 diff --git a/.suckless/dmenu/.gitignore b/.suckless/dmenu/.gitignore deleted file mode 100644 index c190512..0000000 --- a/.suckless/dmenu/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.backup diff --git a/.suckless/dmenu/LICENSE b/.suckless/dmenu/LICENSE deleted file mode 100644 index 9762166..0000000 --- a/.suckless/dmenu/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2008 Sander van Dijk -© 2006-2007 Michał Janeczek -© 2007 Kris Maglione -© 2009 Gottox -© 2009 Markus Schnalke -© 2009 Evan Gates -© 2010-2012 Connor Lane Smith -© 2014-2019 Hiltjo Posthuma -© 2015-2019 Quentin Rameau - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/.suckless/dmenu/Makefile b/.suckless/dmenu/Makefile deleted file mode 100644 index a03a95c..0000000 --- a/.suckless/dmenu/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# dmenu - dynamic menu -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dmenu.c stest.c util.c -OBJ = $(SRC:.c=.o) - -all: options dmenu stest - -options: - @echo dmenu build options: - @echo "CFLAGS = $(CFLAGS)" - @echo "LDFLAGS = $(LDFLAGS)" - @echo "CC = $(CC)" - -.c.o: - $(CC) -c $(CFLAGS) $< - -config.h: - cp config.def.h $@ - -$(OBJ): arg.h config.h config.mk drw.h - -dmenu: dmenu.o drw.o util.o - $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) - -stest: stest.o - $(CC) -o $@ stest.o $(LDFLAGS) - -clean: - rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz - -dist: clean - mkdir -p dmenu-$(VERSION) - cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\ - drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\ - dmenu-$(VERSION) - tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION) - gzip dmenu-$(VERSION).tar - rm -rf dmenu-$(VERSION) - -install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run - chmod 755 $(DESTDIR)$(PREFIX)/bin/stest - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\ - $(DESTDIR)$(PREFIX)/bin/dmenu_path\ - $(DESTDIR)$(PREFIX)/bin/dmenu_run\ - $(DESTDIR)$(PREFIX)/bin/stest\ - $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ - $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -.PHONY: all options clean dist install uninstall diff --git a/.suckless/dmenu/README b/.suckless/dmenu/README deleted file mode 100644 index a8fcdfe..0000000 --- a/.suckless/dmenu/README +++ /dev/null @@ -1,24 +0,0 @@ -dmenu - dynamic menu -==================== -dmenu is an efficient dynamic menu for X. - - -Requirements ------------- -In order to build dmenu you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dmenu is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dmenu -(if necessary as root): - - make clean install - - -Running dmenu -------------- -See the man page for details. diff --git a/.suckless/dmenu/arg.h b/.suckless/dmenu/arg.h deleted file mode 100644 index e94e02b..0000000 --- a/.suckless/dmenu/arg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/.suckless/dmenu/config.def.h b/.suckless/dmenu/config.def.h deleted file mode 100644 index 1edb647..0000000 --- a/.suckless/dmenu/config.def.h +++ /dev/null @@ -1,23 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "monospace:size=10" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/.suckless/dmenu/config.h b/.suckless/dmenu/config.h deleted file mode 100644 index 5543f2a..0000000 --- a/.suckless/dmenu/config.h +++ /dev/null @@ -1,23 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 0; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "Iosevka:size=10" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/.suckless/dmenu/config.mk b/.suckless/dmenu/config.mk deleted file mode 100644 index 0929b4a..0000000 --- a/.suckless/dmenu/config.mk +++ /dev/null @@ -1,31 +0,0 @@ -# dmenu version -VERSION = 4.9 - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = $(X11INC)/freetype2 - -# includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) -LDFLAGS = $(LIBS) - -# compiler and linker -CC = cc diff --git a/.suckless/dmenu/dmenu b/.suckless/dmenu/dmenu deleted file mode 100755 index cf40be43136370e70b71244803582c9b22a3f71a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43840 zcmeHwdwf*Y_3z1JARx>{1dIwY%0Lq(F#&=Jc4~%9!Wo@FAORw%lgVTPkz{6?IRlCH z5ln&}$Fcm>T54^7*xHtQ`=HjJKST?G@bXn7T8g5GRPl^KO?^PX%G~eTXPGi$H!UVH7e*IxT^UX#1a+~uh$DS~#S3EvZl%fD7dN_a;1FL?r_L?{w2 z!1v|CWMKsObcU(JJtM6v7vM$Ge!`)r>nSDj@&`z zw(xRWcsY$)xxX~3`IBs<&u*TdOr6N1L!%^1N9Bi7J*E5W8T&2jCdc8>s8((f%8{M_ z-Gg_7u$b3pT5<}dCpIi5Y!VSn;L|8K5%=Pt6FY#@CkLkG$8>R5UOc*>`C-RH2Tw5ODe zChQh`=-Bp;hwdmX``d|zCEm;dp`7iy?7k?hrLR1w>`knxV+8sHNR`YQlk!};@926}cI z_+hz${T&8+RvO4(Z-75&fG;+%zumyj-x}z7*Z{x4!2XvF@ZARX6d34#z@T6D80a5o zpywHb_WsF0{yl?w4;$$D$iSW=1O2p^4Hs9J8`N86AV1TGtj@yKu@B9@Yx~LfxSnMBdw>rYpFiMwYLoN`*tgXb z6wpR(j^J@sS9t3EE&i2_VaeZ8T~XQ;4EU?PbxnT3<5}4p40ytlw?*=JRMBAtYv%hU zS0EIT%7ea0Sg0v)Y=W+`HU5Ak)HqwbYZv={k~gptI%^h&`~hcUIMn2A6KYCZ{9egl z9t=pOk(O|iFt7&oSNWUZhsI!lneT24`1RJpX-zsm zE%3KW+=HdTP@4mu5^5Gj{4H(O%)Y9&fRFT$O6Gf}v^2f(4egc$>WxF$F>m=a{Z4AB+ivNvZ+8 z=nDoK8ds`vn^sZm0o2<5&?uS6Y;u9+7MHk|_;_4PvmXC&0r=tFcs zrgW9Jg?fNR3-|@zW`Cu(CCu_zl|$;_;!b~9Y6-TTD~~!T>s+PhB)C~z0(G%=H%RK) zOihDSP2JHdA)>=eq=q5^5CyjCBt627L_XD3){0?;P;9`^K#)^R5mOp$3br_!nu4q; znljBCE=~Q%?a~wwM2*+@3a{i_MW*`H(ToQBLT!S-wNVnnehK<1%7F%a%^?9}pao+r z;0*-BO@4n!&49dz#<*{_$G2*=r@`CUB*4*R90ckc10+@-VbW4?HE|Mpt}%?BY!ez* z`q4gAql&j6S7^XY;A7umsP;*1A-|{2!}Y-iwO()7PeysAU?Ty(RV^gk>h&}<2E0v; zxBG==e{*wi4YQvlJsxT(pN^WnFllTn3^@1nweKPbn@jKrg)r((l;IFQYts}Ta%)**K=u2hRUj_Mzu3sOwTNba@9Po zv_?sXnx|<{5&BNSzf|_oq*GA;>sW)d^ZN0PjW{Jq7y8+{AqW>SK212o`N*Y>qey!? zzwV)357E{eD{cI7Z06THG`yEzhuZ&;ny=v+FC?uumO3t%gkQ|@%p`mY$Fq{~?{M6j zgkQt)>?HhJj^`)g*K@r0hpJt4ZQ%kn$-WQiaQ(V^REJ-xlUH>3R2|;0!>8-;0Uhqq z;fJ_Cu^ka|b@)*oexVN6_6O8`+Vv31*4BH%YYE^-)&?~(5`^l|4yz7N)j-f}9geUX zJo0ro#jti1>2MxWEUQF^>#t9VI-G3Mj!GS_#TMn&=x_w?;8Cl?M-QTcuu6xI(cvK- zPUq~}(W=AwB}A6huEQ;wFz9_cJX42n(BT*9@Qpg0u8nEOCLKOO13@?I@QFHniw?h7 zhi}#4SvtI1hhL(@_v`S>ba<~0*I!6Gq{Aoc8!*ejRSr;R8DS3LP%| zo61m(T&cq|bhu52XX@~2Iy_5 z7j<}^4zJYV*XZyX9iFelYjt>m4qv6iXX@~f4xgpNTXpzs9p0|P^{eH5I(&{!euEC@ zO9ji_sKfcv!thNxyjZ7avksrD!?)=0>vZ^59sXS%-mSy!I()wl|DF!-)#2Cc@IyMh zM28>M;SL?H=hJ*_?$qG|pZ_WT%XD~#4lmc?nL2#F4$sozq7Jv}aF-6x z*5Nnk@O&M9qYf|9;cgvXqQfh6xTwPy=F`xLe6bD>>F_EY z-m1f^b$GiDSMO4&nfK}Nr8@ZyI((T9->AcDboeG6ev=O0tizY<@bk&@9ysrT|9?I3 zh2`=yV#kRLF>2Zw6a=xWTS`sziXFQ%dRU_qg~tFVrhR~K%ajtNh+jo{@uLYG)7~bY zw)pX0#vdS_w)XLE#=k^7ZRz7%7{7~n+RDc_F@78Iw1tmvVEog>)7CxS&iJQ@r{yRf zV*D?Nr>%Otmhq1fPh0eOCF36=p0?)k62{+8Je_jI^BI2+@w7#cTN!^l@w7FMXEMHp zc-oT31;*b-yoLDwvjC>m5uZu?QN}MP{zBq=8NZnLam05s{s!V{YaZXi_<6+BmOQ?R z@pFl%t$2I`<7X02Tkv>0s@cqQW>BA&L&@e;=0Pdsgrg>p0=j({;yg86JJ97QO3VbJZ(key^KFV zJZ(Ya-Hd;Uc-nf#w=jMe@wDZPZ({s5;%TcH-@y2%iKi`Qyq)n+5l>soc!=@8AfC3A z@mj_|Mm%jLA6jOR1{9^z@s7`HP1cH%3D&t!ZH@e7C-7=Ih_ z3yJSP!}_0i+7iZ(GJZMnv=xl^GJY}fi;3@M{6n`1Lc<2|>~Jh|$LuCd2acs>1t%R# z9Dkvy(^0*oN|e74*PYmpnNz;QHl|*Trca|N7v)adR)7WF&g+_NV=OVc^XBsH5o3ij z(W_!~MvpsY+e6Al`7`AO#B5i0`jz(sz&_eQ%*{I4`_L<06bi{uK zrI6@H+>pc?CSmDpSK)U!>`@C|ipAoEMm!TF+kezV1x$~E#BYMIBeBO>3^OApB^7fZ zRQ{5eovN0da6|NtsToQcLQ6JXfa>E{s&(AO<-SG^8o=cyGr8}O`ZKT-`flQKZ>Vw? z-Vk+8&439#By&)eDdIAJOp>{tWS&-Kvban%N#={yka`}6r5C6 zp+@Lm$8u3642n=X_K0mi6@~{*YWpuj)^e6*Ka43%S;{P!unUr&xfEQ7*zLRCZXO9y8B0Fs&eN`$RsxxYD zg`g&}n@N}|$fOcA`zBrXf2i4WDEkUEyAJ7s15kb?Dne_nq`VlpGHNf^@-o#t;+5~K zZk~xW2H@AEQEgwWGBs-20bZW44w;E=%O7{irhqE<1<4hgJ^-omnPpN^vfntU* zXA})9I4Q;|(w)&qY&C!i5(S6L3O;cnoT{0`{zI~?gw z%Z|3xlwN0Xufwu%m$P`6!{YAE>9y=wG{RvK_c&9|IE&v#)*EHTua#Ncr=2-xfd38t zF7Cf8UEV8yo!BRK>>ShgREPchE75j~{4Bn^PFlMDK%Sr`F2WeN6^=wxJVfNz#hBAJ zqta3BsCLKPXffFDDu0H@u?@GP-D}XINpPZ-+Ej4Z8HMx93Jy49Dw&&4vVV~j}cS)EIUfmEjy}4AowR0ba&WqrKUwj10H>~X#^UP(u+Zk zTq__9w^PVhuKW`7kPnS*1c%195aIo%e5DRTnh$PZxcy~piIj5e1F3><8c@ML)CM9% z#-eAbzpget23e{G0QIYEiZR`Vdm&%YEn zb=tO|1WZ7^%@FJUe&wd4j4c~|vv-+plW)^fS z0$S~kn&N({Wm^W?U(oH2jr|vL#n{*sI2yg>sKnHhN>0!DoYWR>gE+LmOhh(438K74 z!?nYH4Js6BmRmZzKq0wNm3#tZ8}8f)%HPq|B0^Uk!_xj!ZnwJY_odCevGN~2kQT*ttLmd+LEq>h0pmd>J)WXuaTdIAu_|A4St zKC7&TQ!)E>eTZyW{tSZ?$}?~Z2EtzvX;h$Nz+&lq93po=)iE&2(s?Vx##lNhvqWm- zS5O&3*$Vl6Xm!V)v2Db3>W-;%(sNdL&Mkkg+=+%D2*zLztmzm?wRDzHc_j@qrsdvS zvAx8MmCfd1wcyEJ>6Xr&kineVW?4U%Que9@CYH`z#H{6BFGI!>(&eNy45nF7v@av< z-iIM2+846)QkEXYN*^&HcRfu`qFpUrL%C5?pASU-j8=rM@eop;>Q5w2b~3BdEnOEA zRF2bKtfZTegA(hgL~*B$?k`)qeu52*G7SPdV1>~4cE=00Ok^PEZscIJ9E7+tYI*~N zq8L6eAq9wQ5T)=^Y`>O35{k14hvETff~QFFm@&wnL)rEW){al1TUmy<5G~suVLlh5 z!pZc?R7=-CV5;boY-8N=srYenYR7=fvVMT}O&!V&;I6UU`!R8`v1K@c6MgCH#FYJs zqoREg(@lPlzeoc17z6$t700&{fU!+pCb_sw=5XLL0$O!If`F9(+K*)*Y$&H=V7{fR z4W+e0)Kl?NT_Nh=_)Hx@ZH-@{1E>?(`MRcq`mp2J*RmQu@vn47R+H=pI$$vYZx9eQ z&8`!Ky-w=XS2KbBg`tI)1I14B)Dfi}d!qPnfOfo=PzK1OF}oGcvTT=3f=k|~JWoM@ zQC)$sN0FQ(N(I|SO@7-8;jY7xy?ryO> zwjWEulr|9<+YY;<6Rtv98j0}9A;GA997tKgi*EUKw|qdceTuFci(RLZz|N{DpKhFI&{Nm%e{R##S>!_M!+g`|2<+#FS?)iWhJ@kcTk}LO9}X?4p>6K{RHGv zBtYc|%e@z+AQhYN-Zgrab_xtj*J89JeuN6}h@!I((M~~P=_*7fdgK?ig3x{kyk+UE zfOTvbDfIpVX65zBLyPYwf=xx|32N{d?)+1n@#hhyzL#k!dhXCTgpfM9QokkkaF%V_Z2nHQdq1Ood z9zh-UZAc5!Um*V+Wzsq*oBlvaOrvl2J&BC1#1)%l5KGsuATI7RZ2?0^ypRo0`!9)? zY>=)aX#`fL*wLCHNTWLJhi|34321P92T~pOmk6+QO=p{CQ-NB*()lqp3j2PV!#dw3 zMmCM7%;@CFM2c%NaiYb97#{D28q_!db$y5^QvwNA_!afc=_BH0Q!hyTr;z2-VTz^e z2&=j%eo!^x4_d*M(7vxE3*SPVRv;)PV_CmS6V*O_idrn2o+ho=LZ-uh<`&3Xx|UL{ zQIl6wb}3T;hf;gS5_6r&O_{RE4r1v#P4>&C5-`di5ejjIfT(GTrXiha%tz;MOH6@K zIY!4|JnS_sxeM~Tuz;>fq-z_^wvRJi6P|}{V(}wvGPiWm?$ogaq1Xu+qpsjZM>WRa zgWw!nQ!?;fO}p9}Y%)4+A(&jbSb5@OG^=BGKH}j!>?br)pX*{L0oIp1A zJLqzgJLe?MEm^=KYtXV-2(!c~%VTE3CN1akJwV$E^-ePeYz% zN+%$wo#GS(x?W!JiA#R{R#84Cc6`uZiA}p{;v`fQ8~g8<5wT~%yNL<6*9gLw8^FH4 zf>6^-M2ZI_oUfZ2kVg$2l{jjd(oV{IIEDNZOuq0jA~|P8xnJD*>Gk5yfiy8?ulV{| zX*?9%W8sN|%W--*VE{J@6(4NeYpRD} z$}PG^_B7}lT*BHLUkO<;Iw6DH>BD?!nog;dGng)2axW6C<1O1W#FT+`?{}lNb*J0$ zEq&mYyL&3p4FjkZ?fTJoQ0)wKgBt#I3PPxw<|LQ=uY&F+qI^n}zp6rKpTZf@O$kT) zcWr`nu_(VS%AdOBkCZ>5li;%qS7LYHv9bcFKT7@7<5=cc>R5vFJ4ZFpB~{p7t~-%! zr5@H@L(2kC(2aA7@vsf%G}*GyBs-ZVf3{sfu2Kt&;G|2)@if%FfFLSy$9|9^?o>>! z;(aYwxz_C_S+{&#`F>l6hxbSpnWkWy!-?WOJES@hn2 zs?Q<9sv&zX-bYAA|CO@F_Mv){@7&ukW5#>X!ogbQT4ag+!OUDQkgd3u>uYr5+fl|ec8xm=z1d_5T1;wML>#45d zL!zbpkUV)NtGLsaWgR-s&XR}M?WWGr4KZ8=#r4m{(aB#UR=W;Mqbz@%ycHVyXiB+= zRK*G}LF=QFe-6eOo%TZ_Y12AEl+KCNM*9gAh1i$VNFcWXIr1KbZlgHUa%)IDr_Y)5 zkDR`o9{A;A00p0*??xbjC`eG@t^?BI4*Oap(VAjpMC@X8CRG0$AZ0RCMJJd6<0O*K z9CsDJ9i9YTJybSoZ(<~0`3fhAX{O`gQuY-0-8l{tzXii;+l)ltd>}t$!fb`?L^9sS z##bd4tOHVOhy4qTPuTDu$daa$nmceBZMsb@MAte!ENQACf-u?LSE^e25e@7xEQn61 zN1o2o=b#{mm9p=G5L+Fi`O17|Z4om1eq5vWNDr<=cbv%9jUA^gi>6|GHpH-GBTzwE zBC}+kMTmHwS7=X#5rw;m_9)b2LBJ{iq37sJy>REd_bAfpHN|_?^(mC8{Qe_0rYGTg z4MxgBaEX^A&mr1#Z4|{yAv@=W1^U@~>v2R;$L{PEx4_uv>q%|LiJ~DEXTxF`G=|L0 zf&equ+WzQ9>MLa_nJd|_L-|;F`9m6Wg)b0R3`{D3#9nX(FS2WU%4pO^my_I#1)*7z23o;kWfJr{mOzmUiV62oA+6ADhMRu;|ziwgQd$Wk}x zsngN1y`TjL$kq|C71Oue(_v2qDBzw&hy4*sVTAu4G%^~A-yz}1c?UIqUd>vPM!;Xl z6FBkzIT&Rjt3Hh6ZGuyNpPF?$82Jd*`zA^`PJN?R`7oLdteZ69%At$yP(%w0APn>= zlEnTaJ&xiNYcSsIw=;VRSAZz5V6Kmv(jlq3 zFgE+@We{10JmwA-Nw6+f@-O8n$U15qH+9%AK(-(i;}ZOOq_B30#kmqv(Xr3s+tT?o zMh~XB--E&E$azaXf^JrxVy6ksnSHOrU-ig?bLmkcWIk+7V_n{5X^3qxK&{0+-BiR`U>4%kjmk zJDqU+O}DzEx%-fx@~%5JErM)!aqb_%qgV}yrE?uDbVVbA@-|K|qmvH`Dl@*_ymBHRT$r%!(C z>ai_UVkd1CJ}Wq&bmGLSBHElO?}@L*n62pgL~4L*-lW~{B9uY%pIFRldKx6nG#jNI z@@^${6!qkEaLfm{;UZHG82ExPil}=a&wOzobUAa5BjmV0X2XXy%W;Y03y7?siyJ7` z$7(6OnGtW=AZ$MSp9*tcDY@5)IaX|y`MsUib@6n`WPb@-u?opQhn$me{`V^(F zRMTHj`W-q4i`p$Hi~BM6z0XRdfLk8F8e&T@RKnn@79(UFNZ=AFoi=9E^}U$A@(T15 zozIJMkJ3kKX={pmJQqW>?-dlDg9M6>I9K!&y7CyaPtX_Lq84Shhu(o%eXn3mq4gv- z`75xC5rBI@E!$_Om2{rO2|&#LHw28*%B#Fc-55T^E^3+{V;WHTpCE&x_v?yUX|-_h z>UgmgYB3)b>!pev%h2I>fTfAg9n1aIWF*=Ahy7s@l*1y2duah*L z!bgkP{*JcE4iv+JjC;xtQx(W9=*CXiEkkN@B_P~nrio>r=^8L}AUT64)vdPd#zNS2 z*wXnW<#t?$A^R~>1qX_&ZRvMijf!ii;^=jvTupoC*}aJgKVLuyv58&Ot~cX*sC4cADVSj;3#zlz<(^<*L6gq<(;gWC7>`N1A0~^k8$wxE|eUoX_Bl{L) zyX1E?+%2z$*t=p!k2Ri#xqICUR)HjmZvI_fyvJ6}hkaN$XKDS)>8AwIf z2e`k`VgDFuL82zU#WHI%UDOkOBi-_}*BFx94TAigL}b%LD)}jhGMZu)=b;pI`i;Yp zcY&|lO~E;2e_YUwz!l|h*h2!b!rws0B067E&kZOLoEOk_B+N)_m!isBA+Sw=7BOcR zo({-&$7ZCVkGH~P!4tp!Fl;>u!~Odeh$W^3S-M_-!UkBNEKdy{Jzzqe2{j^IaCFLUD6qSVEf~KpsXQQAxP2Er1jwR{XkI2}$N2}1Z`9GtbHyP@TmKHhX ze5c%+t{j48O#HKg7b%FXSUpz`=T}Oo1xskZ z3)>v>mlPoKwPJLwRbGa9^CVUj^p|oOxq-auE6r3lu3|Ktr8_Th;-2r%OjWv zKe0U0ov|x2kJayvE<_vWV^-)Fk_~Lh2aIQVnmx__0o-W{G7i%X(*A@+?^7+LT)~8FVsxW(( zpkhnsJ*ZKP&d;Yw0ClcGe2kTrR#GPa)3Krqg8~~VzBO`q;!i?6@oHIYK>}IGAxQ_HkLbEw{Fe~ma}v8wNB)>w z`J&4q=Dex#<7A%$X@Rp;}A@|a~feaL7A&A@S1t(X;YcS|~XlDRlTZhbN zbm9xWB`!RZfM6!_EUQQTVu z=tQ5+U>&P7xzi>htDu|CNJsUL+GXjSjynmg6_(CxkQ6)a%*P6ELlURPwiNUu#lRgn zskd~RRe>TT(~tyeqti0&9QxE7v<2$B6I+ZfY*i!Z$U8F-^9b&AF|8~g-L1UyH}dTg zWJRnF@;NM-jf*cNTImE+gd5)Z${r?$G3+Zth(xTq@h?V2435eY<@@lcGliZEp~(kT zk9XXJv$Bq}xD(V|Bwo@@fsThyVE?IVNOjcP@}W$!VNt-ap!0iNB+k75;?4t>&gaom z`Sp(XyW3BI?(UnUiu}2~Z=7QXos9nZXkUh72d;w%f9^l^2D?Xf#T%~JvV`SX-0eP- zX1Nzv{{&a@DNE=5NQm$PP01si_oo-2Ydem0x1VX3=9G1Iw_VHlqwQz9r9zhMZ$EQX znuX*JbPBFZbQ~LKKhqz{XEr@O&^M(Z@pO0JCCuoj+xs$^K~Ep;8_Dc>y8qMx=M}pw z&%Pv%dKu9isSp!;#g4Pssx{MW5G&j|5f}H0C!M`}4$kmatIU}@a>UrfLN)}}ok`&O z-!^g#uI|0vH$ms4KJ27UG2R{Z7g79Qhv{GvyZBR4{9z>5oq{eXOF7FBOsjpDxzI!C znL9J&x0Sp%*!&Q^*x5&|~@0&VufYmvGx2vn-pC5p$N#&&YQeawWW< zyRp)V@=luR5DG<(9SL-SLJzt+)}1{|m!&A=$}9`cR`?R|d3rG(uvvrWLs*n_qo`9p zqm@<$a68SF!1RnVk=NsFl0#);g%9D55^ni4&Ii7Da^7C&cSWJ1`0SdAZg~K`{Eb+= zD?A!E)b={l#k|Nr*~pQKUC||(&^5zxby)@}$bVf)OBK^1`HLLO5SnZ#IAiIUR&drq z4@%T154@g8-0DH0k`ye&IZo_Mz+~dG3-0zI5DU7=$=G%xek$Y-MeN=);v=z?DG#Bf ze8eHY2NPYm4OrJpBeARq=lfX#dpu;?cq*^F4>c?!+M1>O4pMk90Z~wnTr7ih!gDP~ zC$?ki`X4KtjT~hvx(XP3V(poW0E}b6aXg2TQ0BbJGL;3O*tt;evQ3`b=2R{{KzX>f zk0nUSRkc*eCzJ!Pk$rTryX!z?G>eb;Gz27#-OrRCVTVlCAezuyA*K>trTh!_0-MMh zAn(G3OeNn4bNyJF77=B*WzO#DJ zOAb~xv>o@~9aI%Io!H!W+KxhKUpl)~%zB;%trf0K&qoF!naYI-fc85n77GuS;9M$O zJ$*$R*okTT9b?bVja;p75@F^_ z2Z7U=IhN~gZ4KVPW6xmIbIFdSF8LtsroW;c>%ZtS$s>TP+&SN1E0CeQ_XSe`Qy9?&U@gz z2hMxoya&#E;JgRUd*HkW&U@gz2mWt+fPU94685h2&$ZS!`vVc{irl(}#x=KqHd*mg z>;5n$L)K7BusI}Ax*=etUtgqTvlTzt*(e2DZW(RWA1iVLbygq!>>x=68qTG|Iy|hy z*IL)IU({@@zhyLj;4cseN>={6fL1(JP}hdv*qp0ns6P>?!@r9^TEGj@PhwhEYrov7 z2OHSWg<6H&H3DmC?(Do`A-7J*Z4h!Bh1@0~w^_&yfei>SA0OahP`tR4yH;51Z3*BP zD(6}QL96;pht{zA^PYqD;%7et)_VSHqrPCIsUE_T6~9?%^*7h~>+$P`D|s`m_&G!V z%b|0v`K{BMS_SAOw}#;>Dp}`8HQsuEeV%HqQ0jJ7&RghM>=c$%mlt`esu#N!%-4Q* z(@H<2=&zs43sbesnnwDaRBOF|O{32*FbD7-;Pf>$;@2fP!=$RDHvD?y)H-$uQ)jY6 znCfSTFf~8Fu<+VziPAx|0f*qiZ%nRP?VTIOPbk_8aBd&MS^3X#+DspPTEqS;T7wH0 zlyAcM{BUwT$Uly}Q}|?{o*DSq@gaTzs0Saa^Y{2rc}hol`f*P6dV4rFlGjW1zYgrk z%jZ6a!KVR#2XzoW9_eZLybOL3t~k*3x~p+j;%0mfBK;~pn~-l6*zaG?u<{V3&SV{I zZNNyf2JpL@bFJT*7XHrYB*75<)Tk;+LRKkg4XHn4I=p<6VlJCES_>#^IOO*=HZ)Qs zu_2jMANw&){PL+fMwv;1vRdok(m3Z3le@SM^HJm-LG!#kg46P5Gd2f<6eUfW84b9vA%| z!DZ4~&?|8>=W)>2K<7Zla&wNlT=v$y0K`+7MiMv4`0sRv6rW1)oJ^Xb)Xea24pj$u{&|c6(pP)UU z!lxK_cxWjES_w)AE)BCI<@UuwN^54yWn)HWY=Dml$NhAn7h~ZXl5mb>9ce>yHa?r5 zOC(C@c7{2#+?;iT<$|>t?ZWk!UU$_j+m%3B`I|wzx1&x1_(4h}e7=uycC8M(59vpM zT~3(8oS6;sI6glIRz}!7bLIo7H<+{5r_DE8JJJK@EJ)2WlWq~8{rLPRWa*tRlKo-o zJag8AY4gn1SbCW``vH^FoWFjA!(7xc(q%qclJ>I{bCJWG?=WXW1fnRylog@)c<7jc z7%`g9cNFri>tdx|+5h~r#QdTmpnx61CqRrKE@P3>5p3W<(1r@18c zNoKOcoI!G}kV`}SJuy_yWv)zpSd;rM@-{*44#?p;D{EIQwTx_Wk}aiV3)0$BW~W3ItN8aE<# z)ONG@XEDd(f4;dStpM>4L?8e3P);SvD)3nz(n2}Kf8Aahq)xC+$UB2P7V~V3B9y2$ z1^MrgJc}_en>T146EKI#$iq|b`nC=k>#5~Kn@T#1P;N8L|5T2(vy!!w_-dY4LwQc} zL2AWla|T652GxltHHD)nOYb+i3Hs~p@Xn)VB>Tc z>3kDd2C(0f5c4zoPd^u)8v_p1bkk_&Xw=c^@u4^-(Qm`qsEXFKV$@qg z^};6|sZ}&It@F&;qB+0HoLSn#{7!w?3fT(C{(xj*;{!BLuBUO|kxtDIu+TzhVODN} z$Y#iIg!~?~&A3fYHFh?PO5JVVILd9_Gz!z*#!>Uk8%Cw=O=YP~qizOu5VF}|4WK^E z!n*ni*69MIg=%vqR-RI`^+sktwUypRKa2e9DWBPoxq;g+u?b0Cn@CqZWG}?pK80ji ztW>dBA(mpP6Zx6Q?w<&KE@;*S`B|L8#vp^kBFCecUd49@+Uj3YMZq38o z-7yj)HZWYbu^39n_{_rIf?Rw4IPZb;9ysrT^By?wf%6_X?}76kIPZb;9ysrT^By?w zf%6{t-}iv_cd@j;gGHCr=t!n{biGoCS10k)>H4iMpZ<0i9b;4?2v#+Lm-5-M3U52p z!LA#CYJacmGKS*%5T|%$i5=SC?PAxnfN1$&olOKuAcNPZT_dRF72~oDJ4Bv8cx{Rc z;w3wF(6tOYCa7fan->#=4JyQ&E$qj&4LZiFMBuD&G3RS|hK9G|iD5c4yXpD~9sD*2 zyOu&c-Vk8zL6V7{<$Mt@j|bRUzSckeoDb1;TO6l3ueDP}|KELUe^)-)f;mp(>a~PX*s7$Ic?x{4X5ileU#H* zbNVc&dpSMG>2Xd^aysHlUO%VPIi164Ij2iGZQyhbr|UU=l+#~x`Yfk=IX%efaZXQi zI$|oXpVR4_&f&D2)1{m?aJq)m^_)J+>909`meakQ9^~{mrzbfbVdM34I-S!woR)LC zl+y-I*KoR?(?>b|HK)&Vx|h>~oF3=&B&Q>$@%lNP&gmRZ=@((?Sjwr&efxX=Ln?;x z$L}0}TV^;!`+I@f-v`wG9-#L3|FpmNr~Q3D?eF=`FD;#G&351~Nm}u@RU@s|;=EaT z`MCu-YGSym2C+2E-gG}I`Jlh(NcWGEk2L(PMP*n#eQ;jYmr27-32iY}ZCL-7g1aPw-KFj3I{4&+ez ziwD=Qp?H?i&Et9~e#zk9YaWVgtMNHB1<7>bpWhl2w0I4N(>ZmRG>OQ zlK+s)Ywe0N`Anh4hXf97Iv!wYvrspW!9tr#gbU#}(sP*O?0Ev@UCjM?AFo$y*A*OZ zPqOD~j$4!3HJjmC!XZ9CXz}x1jvr0J%Yc(TPx1j5<95=sP~?Y=N%mB6J-u9yX6G`F zC;y$>TR1LoJ^5UJJ=Z^wq<=NXdz0E5;dp-%emlpNB>ZlUcPHT;z=xaPXdIItYPE@t z+eyzX5xyY_|0Tz@^Di#We%X%vwu;vaF?Q@nB4wC$;WMsBJD=0^e9h#)y}n$E02|JJ zD{!*2pj_3!p0PkOm*aQLS8?|I1d>I-Q?L$p*Q!Jx z09ULd!|7Q8dECwZ*7{3-nIeVG&Nk>2Alb>}FZ$Lx`y-BP=cQUH+E=CEEHQcgeG=oG4`adwxy&i)B{#tju^-17$bD+c(x2KeU&czW9K^^P{cCo&xIT%{U| z=CFg#_lL8;6awQAKlwb)Y2Bq`mVtaZ*T2!F%1J5_mKex40=IG*J(1x5;p}NO&~v{5 zZY4bR+xxvAGkLS%!tZ_2!JfMS{hfiH?FKkq7a7jZ;|9116XS657aQPL8sPZ``1cI( z1q?R}Px0~o1Zy>(JnJo2)0Y_FQ-NE*EiTxBXAUzD++d)mhT&%6McP>6C}H0?-Qf7Eq6#eIc-TPC z1HiB3GJ3MvK>j}s@VyK-3%};|eupc2jpGx!o!WJ$cY$As^{XUl-Rw8ePe1)XT>OkQ z7}w(r@F~DAOwAICc)ePiuV(UQq4P!+Vb5tHIom*wXn?Qa`nBr;ntu9=k~Ht#$o<2f z{X=HhK+k#u{4uVlf3d3B&ntM!K>h_TZ{_}{{V^ST4CLQ5z>gc?UmM_-k;C`bB?kC( z1H6#oX5l$LuTD|T7v>qrF9n{7xJvHdIs^Hz0p4bSKV*Ra!2sWGfFEGES+MbSO}lRW z503BW{fjdhcJy(46pv5#+#z!QWuSj-#_;~X!T`@P!0iTjwE<4g@eemn@h239#W!Fd zLj6_y3~wkWQ3LrO8{oe(z_%IT`wj5J26#Wi&BB}@GZyu%2Z?#GD z+m*nF^G~4x?l8cY7~r=V;Oh+V9|5OzCwaU)ZXo}Z0sg4L`uHDA-YneC$1hzsp<}m! zo&yH>yIjv9uBTsBBfM`Q{|T4ZuGg{W)=}nj1Nk&8OvCky(1;fd^L*+{aG(KytJD$+ z_yu32B^+!~-(3`Zjd=G6{{_4=SRa<~rk&6z`J2N+eal*Cz)Nszg{GE}w_aecG}7BZ zzFU0*Z9{4Tkv+@N`D?+_>%JS1>)=d zO^waa))F2n;tK}C5-bcsjwuwR;OanL@tircDYb@Dvv^g3dZB?kgJ{6l9D)bJ{uT+M zp*n91R0jn1s-gNmSQzhVwfOx30fyk6K)i_V+88qziMp~h}In?Br@Y>n6vx;X8FXU-J z?|Qr~E#5W{s%~i$8d~tqo2Nd~+}wsDI?h9JFhmqx3yWH*B_1>Yuds2Z0j(kHo6!;? z-d2#tCJ1{x<%=B^WuCGHPLBuN`~^!qWg-Vf=VHM#-@S02!|hpEUS3sJ?WuOmbC;3e zkjm?a0$~XqD0rMVEpSx0N`;zIW(!i~zEZphSLK%+_4SkjP^rGj=k%jzf^9+#-mgW2 zy^A9LmbNO^3t>$`IoegK#&}IRwTOLl#N%mdtn+z%;Rth~P}3kW`6j%MsjDUuYHIY6 zW8f=K*oPid{nQwS9c?8g^WCm_rJk92GxG}3rj-Z`4{Hsa<8N)0h6>ay_BMw7{FPBs z$YRJZdGLbk+Qxcm6)X=1)*#TT{7rtJ)QB*vneXQ>nN}itk<}*fm>jB`w@0nK+1nTx znvLc;F|?}K`-Mv=E^C$qXlUN(hZEu9(k5>>EH(xt&3oL;!7flch53Q|paEuwld4&W zH+Y@=1zwMLrM@2=b_X%t zp#K^qih{CMjGwU3fH}!Gw0uo@V-rSJ*%}N53~1VDKel= z3N{VZs2hVcJqTVY*f>;z3~GT7*f4O>DpbziL8nNdm*XAuO6mekctW$knbw4%#Zjqm zRdO@bKqd#Nql~F#V?b8{Rg8rU^Cw&mHT99uP}Lq!T{z6+VsKW%G&L_6Y=W}3fKMH# z-mo9*M{-#VQ{QTjZ`EoKy>@;sceXYU(Kur5q9!DlC*!n;V+Q)wcXJ0rktP&$WBA+z zs>M913nk54HB_0ag6zdoc+MD_(*oW=Fx=$#C$*raxy~I7u8xGN*o4C04IWw)eN;^$ z*D7H&hSfR86~OQeIHX`RdQ_c#>Vn>udev9oGK|gYl|f7t{uaGw_#&X29CblS-U<69 z?jYt9UsH=Vabv*Xweq2sVvY+28X8wtMe4#*qZGk(&z6eH##S2OX*OB&5;=n6H=FV$=| zXr$GOBBhev7{?9^1^M+lD7^N{m$qrEyWxj67ujX2>!g4 zfk<9mq_L?!x3Qi>j(M(J$-7cud8@qPRYG2UTLAi0id`hj!AcgUHB8TVkk{gG@=^hw z3N=YW9-9F2kjz_&?Oh(5h4N@~1EC=ERi1wp-_ES6hZ2obi>mt?ftAqGsKMKe-4|&j z%`lF9o`-=esmyw|_Z{_7RTA~@w6=WvS zN0Q2G&z)#gYcDT0XupR4EUCP9zN^u%aMF=C+t9`zP$GQj7GCGM{y-dtneamGd?ti z=+N%xZQ?iHljSvDqjbOCf{#{Sdmd-=f3y7iC`+-YmDlbYZsFyv+%Z~wYV~UUxDjQk z{aShL`JP^SFat-vN(R5R@*4dZIr{R0_dna!B3rbM;Tp7Z8vP=vymlY6`yRDGD=()J ztCryOG$`rP?APuG6m_Tq)+@LmC)S~?a27n-pWM#D@=5X}ONX8&HIe1l@cKpmz%Q*s wEAi3Vt<4`aJ!`hJg8XX}bqtP+aa~D&X!UB?g-8rn{y%@AN{mb@ki-iA6N${P)c^nh diff --git a/.suckless/dmenu/dmenu.1 b/.suckless/dmenu/dmenu.1 deleted file mode 100644 index 323f93c..0000000 --- a/.suckless/dmenu/dmenu.1 +++ /dev/null @@ -1,194 +0,0 @@ -.TH DMENU 1 dmenu\-VERSION -.SH NAME -dmenu \- dynamic menu -.SH SYNOPSIS -.B dmenu -.RB [ \-bfiv ] -.RB [ \-l -.IR lines ] -.RB [ \-m -.IR monitor ] -.RB [ \-p -.IR prompt ] -.RB [ \-fn -.IR font ] -.RB [ \-nb -.IR color ] -.RB [ \-nf -.IR color ] -.RB [ \-sb -.IR color ] -.RB [ \-sf -.IR color ] -.RB [ \-w -.IR windowid ] -.P -.BR dmenu_run " ..." -.SH DESCRIPTION -.B dmenu -is a dynamic menu for X, which reads a list of newline\-separated items from -stdin. When the user selects an item and presses Return, their choice is printed -to stdout and dmenu terminates. Entering text will narrow the items to those -matching the tokens in the input. -.P -.B dmenu_run -is a script used by -.IR dwm (1) -which lists programs in the user's $PATH and runs the result in their $SHELL. -.SH OPTIONS -.TP -.B \-b -dmenu appears at the bottom of the screen. -.TP -.B \-f -dmenu grabs the keyboard before reading stdin if not reading from a tty. This -is faster, but will lock up X until stdin reaches end\-of\-file. -.TP -.B \-i -dmenu matches menu items case insensitively. -.TP -.BI \-l " lines" -dmenu lists items vertically, with the given number of lines. -.TP -.BI \-m " monitor" -dmenu is displayed on the monitor number supplied. Monitor numbers are starting -from 0. -.TP -.BI \-p " prompt" -defines the prompt to be displayed to the left of the input field. -.TP -.BI \-fn " font" -defines the font or font set used. -.TP -.BI \-nb " color" -defines the normal background color. -.IR #RGB , -.IR #RRGGBB , -and X color names are supported. -.TP -.BI \-nf " color" -defines the normal foreground color. -.TP -.BI \-sb " color" -defines the selected background color. -.TP -.BI \-sf " color" -defines the selected foreground color. -.TP -.B \-v -prints version information to stdout, then exits. -.TP -.BI \-w " windowid" -embed into windowid. -.SH USAGE -dmenu is completely controlled by the keyboard. Items are selected using the -arrow keys, page up, page down, home, and end. -.TP -.B Tab -Copy the selected item to the input field. -.TP -.B Return -Confirm selection. Prints the selected item to stdout and exits, returning -success. -.TP -.B Ctrl-Return -Confirm selection. Prints the selected item to stdout and continues. -.TP -.B Shift\-Return -Confirm input. Prints the input text to stdout and exits, returning success. -.TP -.B Escape -Exit without selecting an item, returning failure. -.TP -.B Ctrl-Left -Move cursor to the start of the current word -.TP -.B Ctrl-Right -Move cursor to the end of the current word -.TP -.B C\-a -Home -.TP -.B C\-b -Left -.TP -.B C\-c -Escape -.TP -.B C\-d -Delete -.TP -.B C\-e -End -.TP -.B C\-f -Right -.TP -.B C\-g -Escape -.TP -.B C\-h -Backspace -.TP -.B C\-i -Tab -.TP -.B C\-j -Return -.TP -.B C\-J -Shift-Return -.TP -.B C\-k -Delete line right -.TP -.B C\-m -Return -.TP -.B C\-M -Shift-Return -.TP -.B C\-n -Down -.TP -.B C\-p -Up -.TP -.B C\-u -Delete line left -.TP -.B C\-w -Delete word left -.TP -.B C\-y -Paste from primary X selection -.TP -.B C\-Y -Paste from X clipboard -.TP -.B M\-b -Move cursor to the start of the current word -.TP -.B M\-f -Move cursor to the end of the current word -.TP -.B M\-g -Home -.TP -.B M\-G -End -.TP -.B M\-h -Up -.TP -.B M\-j -Page down -.TP -.B M\-k -Page up -.TP -.B M\-l -Down -.SH SEE ALSO -.IR dwm (1), -.IR stest (1) diff --git a/.suckless/dmenu/dmenu.c b/.suckless/dmenu/dmenu.c deleted file mode 100644 index 65f25ce..0000000 --- a/.suckless/dmenu/dmenu.c +++ /dev/null @@ -1,771 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef XINERAMA -#include -#endif -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ - -struct item { - char *text; - struct item *left, *right; - int out; -}; - -static char text[BUFSIZ] = ""; -static char *embed; -static int bh, mw, mh; -static int inputw = 0, promptw; -static int lrpad; /* sum of left and right padding */ -static size_t cursor; -static struct item *items = NULL; -static struct item *matches, *matchend; -static struct item *prev, *curr, *next, *sel; -static int mon = -1, screen; - -static Atom clip, utf8; -static Display *dpy; -static Window root, parentwin, win; -static XIC xic; - -static Drw *drw; -static Clr *scheme[SchemeLast]; - -#include "config.h" - -static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; -static char *(*fstrstr)(const char *, const char *) = strstr; - -static void -appenditem(struct item *item, struct item **list, struct item **last) -{ - if (*last) - (*last)->right = item; - else - *list = item; - - item->left = *last; - item->right = NULL; - *last = item; -} - -static void -calcoffsets(void) -{ - int i, n; - - if (lines > 0) - n = lines * bh; - else - n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); - /* calculate which items will begin the next page and previous page */ - for (i = 0, next = curr; next; next = next->right) - if ((i += (lines > 0) ? bh : MIN(TEXTW(next->text), n)) > n) - break; - for (i = 0, prev = curr; prev && prev->left; prev = prev->left) - if ((i += (lines > 0) ? bh : MIN(TEXTW(prev->left->text), n)) > n) - break; -} - -static void -cleanup(void) -{ - size_t i; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - drw_free(drw); - XSync(dpy, False); - XCloseDisplay(dpy); -} - -static char * -cistrstr(const char *s, const char *sub) -{ - size_t len; - - for (len = strlen(sub); *s; s++) - if (!strncasecmp(s, sub, len)) - return (char *)s; - return NULL; -} - -static int -drawitem(struct item *item, int x, int y, int w) -{ - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else - drw_setscheme(drw, scheme[SchemeNorm]); - - return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); -} - -static void -drawmenu(void) -{ - unsigned int curpos; - struct item *item; - int x = 0, y = 0, w; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); - - if (prompt && *prompt) { - drw_setscheme(drw, scheme[SchemeSel]); - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); - } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); - } - - if (lines > 0) { - /* draw vertical list */ - for (item = curr; item != next; item = item->right) - drawitem(item, x, y += bh, mw - x); - } else if (matches) { - /* draw horizontal list */ - x += inputw; - w = TEXTW("<"); - if (curr->left) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); - } - x += w; - for (item = curr; item != next; item = item->right) - x = drawitem(item, x, 0, MIN(TEXTW(item->text), mw - x - TEXTW(">"))); - if (next) { - w = TEXTW(">"); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); - } - } - drw_map(drw, win, 0, 0, mw, mh); -} - -static void -grabfocus(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - Window focuswin; - int i, revertwin; - - for (i = 0; i < 100; ++i) { - XGetInputFocus(dpy, &focuswin, &revertwin); - if (focuswin == win) - return; - XSetInputFocus(dpy, win, RevertToParent, CurrentTime); - nanosleep(&ts, NULL); - } - die("cannot grab focus"); -} - -static void -grabkeyboard(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; - int i; - - if (embed) - return; - /* try to grab keyboard, we may have to wait for another process to ungrab */ - for (i = 0; i < 1000; i++) { - if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, - GrabModeAsync, CurrentTime) == GrabSuccess) - return; - nanosleep(&ts, NULL); - } - die("cannot grab keyboard"); -} - -static void -match(void) -{ - static char **tokv = NULL; - static int tokn = 0; - - char buf[sizeof text], *s; - int i, tokc = 0; - size_t len, textsize; - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; - - strcpy(buf, text); - /* separate input text into tokens to be matched individually */ - for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) - if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) - die("cannot realloc %u bytes:", tokn * sizeof *tokv); - len = tokc ? strlen(tokv[0]) : 0; - - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; - textsize = strlen(text) + 1; - for (item = items; item && item->text; item++) { - for (i = 0; i < tokc; i++) - if (!fstrstr(item->text, tokv[i])) - break; - if (i != tokc) /* not all tokens match */ - continue; - /* exact matches go first, then prefixes, then substrings */ - if (!tokc || !fstrncmp(text, item->text, textsize)) - appenditem(item, &matches, &matchend); - else if (!fstrncmp(tokv[0], item->text, len)) - appenditem(item, &lprefix, &prefixend); - else - appenditem(item, &lsubstr, &substrend); - } - if (lprefix) { - if (matches) { - matchend->right = lprefix; - lprefix->left = matchend; - } else - matches = lprefix; - matchend = prefixend; - } - if (lsubstr) { - if (matches) { - matchend->right = lsubstr; - lsubstr->left = matchend; - } else - matches = lsubstr; - matchend = substrend; - } - curr = sel = matches; - calcoffsets(); -} - -static void -insert(const char *str, ssize_t n) -{ - if (strlen(text) + n > sizeof text - 1) - return; - /* move existing text out of the way, insert new text, and update cursor */ - memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); - if (n > 0) - memcpy(&text[cursor], str, n); - cursor += n; - match(); -} - -static size_t -nextrune(int inc) -{ - ssize_t n; - - /* return location of next utf8 rune in the given direction (+1 or -1) */ - for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) - ; - return n; -} - -static void -movewordedge(int dir) -{ - if (dir < 0) { /* move cursor to the start of the word*/ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - } else { /* move cursor to the end of the word */ - while (text[cursor] && strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - while (text[cursor] && !strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - } -} - -static void -keypress(XKeyEvent *ev) -{ - char buf[32]; - int len; - KeySym ksym; - Status status; - - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - switch (status) { - default: /* XLookupNone, XBufferOverflow */ - return; - case XLookupChars: - goto insert; - case XLookupKeySym: - case XLookupBoth: - break; - } - - if (ev->state & ControlMask) { - switch(ksym) { - case XK_a: ksym = XK_Home; break; - case XK_b: ksym = XK_Left; break; - case XK_c: ksym = XK_Escape; break; - case XK_d: ksym = XK_Delete; break; - case XK_e: ksym = XK_End; break; - case XK_f: ksym = XK_Right; break; - case XK_g: ksym = XK_Escape; break; - case XK_h: ksym = XK_BackSpace; break; - case XK_i: ksym = XK_Tab; break; - case XK_j: /* fallthrough */ - case XK_J: /* fallthrough */ - case XK_m: /* fallthrough */ - case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; - case XK_n: ksym = XK_Down; break; - case XK_p: ksym = XK_Up; break; - - case XK_k: /* delete right */ - text[cursor] = '\0'; - match(); - break; - case XK_u: /* delete left */ - insert(NULL, 0 - cursor); - break; - case XK_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - break; - case XK_y: /* paste selection */ - case XK_Y: - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - return; - case XK_Left: - movewordedge(-1); - goto draw; - case XK_Right: - movewordedge(+1); - goto draw; - case XK_Return: - case XK_KP_Enter: - break; - case XK_bracketleft: - cleanup(); - exit(1); - default: - return; - } - } else if (ev->state & Mod1Mask) { - switch(ksym) { - case XK_b: - movewordedge(-1); - goto draw; - case XK_f: - movewordedge(+1); - goto draw; - case XK_g: ksym = XK_Home; break; - case XK_G: ksym = XK_End; break; - case XK_h: ksym = XK_Up; break; - case XK_j: ksym = XK_Next; break; - case XK_k: ksym = XK_Prior; break; - case XK_l: ksym = XK_Down; break; - default: - return; - } - } - - switch(ksym) { - default: -insert: - if (!iscntrl(*buf)) - insert(buf, len); - break; - case XK_Delete: - if (text[cursor] == '\0') - return; - cursor = nextrune(+1); - /* fallthrough */ - case XK_BackSpace: - if (cursor == 0) - return; - insert(NULL, nextrune(-1) - cursor); - break; - case XK_End: - if (text[cursor] != '\0') { - cursor = strlen(text); - break; - } - if (next) { - /* jump to end of list and position items in reverse */ - curr = matchend; - calcoffsets(); - curr = prev; - calcoffsets(); - while (next && (curr = curr->right)) - calcoffsets(); - } - sel = matchend; - break; - case XK_Escape: - cleanup(); - exit(1); - case XK_Home: - if (sel == matches) { - cursor = 0; - break; - } - sel = curr = matches; - calcoffsets(); - break; - case XK_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; - case XK_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; - case XK_Prior: - if (!prev) - return; - sel = curr = prev; - calcoffsets(); - break; - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); - if (!(ev->state & ControlMask)) { - cleanup(); - exit(0); - } - if (sel) - sel->out = 1; - break; - case XK_Right: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; - case XK_Tab: - if (!sel) - return; - strncpy(text, sel->text, sizeof text - 1); - text[sizeof text - 1] = '\0'; - cursor = strlen(text); - match(); - break; - } - -draw: - drawmenu(); -} - -static void -paste(void) -{ - char *p, *q; - int di; - unsigned long dl; - Atom da; - - /* we have been given the current selection, now insert it into input */ - if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, - utf8, &da, &di, &dl, &dl, (unsigned char **)&p) - == Success && p) { - insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); - XFree(p); - } - drawmenu(); -} - -static void -readstdin(void) -{ - char buf[sizeof text], *p; - size_t i, imax = 0, size = 0; - unsigned int tmpmax = 0; - - /* read each line from stdin and add it to the item list */ - for (i = 0; fgets(buf, sizeof buf, stdin); i++) { - if (i + 1 >= size / sizeof *items) - if (!(items = realloc(items, (size += BUFSIZ)))) - die("cannot realloc %u bytes:", size); - if ((p = strchr(buf, '\n'))) - *p = '\0'; - if (!(items[i].text = strdup(buf))) - die("cannot strdup %u bytes:", strlen(buf) + 1); - items[i].out = 0; - drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL); - if (tmpmax > inputw) { - inputw = tmpmax; - imax = i; - } - } - if (items) - items[i].text = NULL; - inputw = items ? TEXTW(items[imax].text) : 0; - lines = MIN(lines, i); -} - -static void -run(void) -{ - XEvent ev; - - while (!XNextEvent(dpy, &ev)) { - if (XFilterEvent(&ev, win)) - continue; - switch(ev.type) { - case DestroyNotify: - if (ev.xdestroywindow.window != win) - break; - cleanup(); - exit(1); - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); - break; - case FocusIn: - /* regrab focus from parent window */ - if (ev.xfocus.window != win) - grabfocus(); - break; - case KeyPress: - keypress(&ev.xkey); - break; - case SelectionNotify: - if (ev.xselection.property == utf8) - paste(); - break; - case VisibilityNotify: - if (ev.xvisibility.state != VisibilityUnobscured) - XRaiseWindow(dpy, win); - break; - } - } -} - -static void -setup(void) -{ - int x, y, i, j; - unsigned int du; - XSetWindowAttributes swa; - XIM xim; - Window w, dw, *dws; - XWindowAttributes wa; - XClassHint ch = {"dmenu", "dmenu"}; -#ifdef XINERAMA - XineramaScreenInfo *info; - Window pw; - int a, di, n, area = 0; -#endif - /* init appearance */ - for (j = 0; j < SchemeLast; j++) - scheme[j] = drw_scm_create(drw, colors[j], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - - /* calculate menu geometry */ - bh = drw->fonts->h + 2; - lines = MAX(lines, 0); - mh = (lines + 1) * bh; -#ifdef XINERAMA - i = 0; - if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { - XGetInputFocus(dpy, &w, &di); - if (mon >= 0 && mon < n) - i = mon; - else if (w != root && w != PointerRoot && w != None) { - /* find top-level window containing current input focus */ - do { - if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) - XFree(dws); - } while (w != root && w != pw); - /* find xinerama screen with which the window intersects most */ - if (XGetWindowAttributes(dpy, pw, &wa)) - for (j = 0; j < n; j++) - if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { - area = a; - i = j; - } - } - /* no focused window is on screen, so use pointer location instead */ - if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) - for (i = 0; i < n; i++) - if (INTERSECT(x, y, 1, 1, info[i])) - break; - - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; - } - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = MIN(inputw, mw/3); - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); - XSetClassHint(dpy, win, &ch); - - - /* input methods */ - if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) - die("XOpenIM failed: could not open input device"); - - xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, win, XNFocusWindow, win, NULL); - - XMapRaised(dpy, win); - if (embed) { - XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); - if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { - for (i = 0; i < du && dws[i] != win; ++i) - XSelectInput(dpy, dws[i], FocusChangeMask); - XFree(dws); - } - grabfocus(); - } - drw_resize(drw, mw, mh); - drawmenu(); -} - -static void -usage(void) -{ - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); - exit(1); -} - -int -main(int argc, char *argv[]) -{ - XWindowAttributes wa; - int i, fast = 0; - - for (i = 1; i < argc; i++) - /* these options take no arguments */ - if (!strcmp(argv[i], "-v")) { /* prints version information */ - puts("dmenu-"VERSION); - exit(0); - } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; - } else if (i + 1 == argc) - usage(); - /* these options take one argument */ - else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ - lines = atoi(argv[++i]); - else if (!strcmp(argv[i], "-m")) - mon = atoi(argv[++i]); - else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ - prompt = argv[++i]; - else if (!strcmp(argv[i], "-fn")) /* font or font set */ - fonts[0] = argv[++i]; - else if (!strcmp(argv[i], "-nb")) /* normal background color */ - colors[SchemeNorm][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ - colors[SchemeNorm][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-sb")) /* selected background color */ - colors[SchemeSel][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ - colors[SchemeSel][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-w")) /* embedding window id */ - embed = argv[++i]; - else - usage(); - - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("cannot open display"); - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - if (!embed || !(parentwin = strtol(embed, NULL, 0))) - parentwin = root; - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - drw = drw_create(dpy, screen, root, wa.width, wa.height); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - -#ifdef __OpenBSD__ - if (pledge("stdio rpath", NULL) == -1) - die("pledge"); -#endif - - if (fast && !isatty(0)) { - grabkeyboard(); - readstdin(); - } else { - readstdin(); - grabkeyboard(); - } - setup(); - run(); - - return 1; /* unreachable */ -} diff --git a/.suckless/dmenu/dmenu.o b/.suckless/dmenu/dmenu.o deleted file mode 100644 index 826665fc6d7d965a02f92f81fec6468882d3fcd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32504 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 UZyWo|pRq<~dQ#-YO*8-h2G|?Ab^rhX diff --git a/.suckless/dmenu/dmenu_path b/.suckless/dmenu/dmenu_path deleted file mode 100755 index 3a7cda7..0000000 --- a/.suckless/dmenu/dmenu_path +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" -cache="$cachedir/dmenu_run" - -[ ! -e "$cachedir" ] && mkdir -p "$cachedir" - -IFS=: -if stest -dqr -n "$cache" $PATH; then - stest -flx $PATH | sort -u | tee "$cache" -else - cat "$cache" -fi diff --git a/.suckless/dmenu/dmenu_run b/.suckless/dmenu/dmenu_run deleted file mode 100755 index 834ede5..0000000 --- a/.suckless/dmenu/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/.suckless/dmenu/drw.c b/.suckless/dmenu/drw.c deleted file mode 100644 index 8fd1ca4..0000000 --- a/.suckless/dmenu/drw.c +++ /dev/null @@ -1,435 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - /* Do not allow using color fonts. This is a workaround for a BadLength - * error from Xft with color glyphs. Modelled on the Xterm workaround. See - * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 - * https://lists.suckless.org/dev/1701/30932.html - * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 - * and lots more all over the internet. - */ - FcBool iscol; - if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { - XftFontClose(drw->dpy, xfont); - return NULL; - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - char buf[1024]; - int ty; - unsigned int ew; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - size_t i, len; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0; - - if (!drw || (render && !drw->scheme) || !text || !drw->fonts) - return 0; - - if (!render) { - w = ~w; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - while (1) { - utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - } else { - nextfont = curfont; - } - break; - } - } - - if (!charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); - /* shorten text if necessary */ - for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) - drw_font_getexts(usedfont, utf8str, len, &ew, NULL); - - if (len) { - memcpy(buf, utf8str, len); - buf[len] = '\0'; - if (len < utf8strlen) - for (i = len; i && i > len - 3; buf[--i] = '.') - ; /* NOP */ - - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)buf, len); - } - x += ew; - w -= ew; - } - } - - if (!*text) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/.suckless/dmenu/drw.h b/.suckless/dmenu/drw.h deleted file mode 100644 index 4c67419..0000000 --- a/.suckless/dmenu/drw.h +++ /dev/null @@ -1,57 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/.suckless/dmenu/drw.o b/.suckless/dmenu/drw.o deleted file mode 100644 index db93e5e92a628b3c0d2ed4735a7dbec3d34f07f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10472 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 G+y4(;tavd1 diff --git a/.suckless/dmenu/stest b/.suckless/dmenu/stest deleted file mode 100755 index 60c69a1991d444747aeebf013d5a8cf003844789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17688 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 YkVyH8R9qXB*8kaULc(HDFtF_Z0EGRqDF6Tf diff --git a/.suckless/dmenu/stest.1 b/.suckless/dmenu/stest.1 deleted file mode 100644 index 2667d8a..0000000 --- a/.suckless/dmenu/stest.1 +++ /dev/null @@ -1,90 +0,0 @@ -.TH STEST 1 dmenu\-VERSION -.SH NAME -stest \- filter a list of files by properties -.SH SYNOPSIS -.B stest -.RB [ -abcdefghlpqrsuwx ] -.RB [ -n -.IR file ] -.RB [ -o -.IR file ] -.RI [ file ...] -.SH DESCRIPTION -.B stest -takes a list of files and filters by the files' properties, analogous to -.IR test (1). -Files which pass all tests are printed to stdout. If no files are given, stest -reads files from stdin. -.SH OPTIONS -.TP -.B \-a -Test hidden files. -.TP -.B \-b -Test that files are block specials. -.TP -.B \-c -Test that files are character specials. -.TP -.B \-d -Test that files are directories. -.TP -.B \-e -Test that files exist. -.TP -.B \-f -Test that files are regular files. -.TP -.B \-g -Test that files have their set-group-ID flag set. -.TP -.B \-h -Test that files are symbolic links. -.TP -.B \-l -Test the contents of a directory given as an argument. -.TP -.BI \-n " file" -Test that files are newer than -.IR file . -.TP -.BI \-o " file" -Test that files are older than -.IR file . -.TP -.B \-p -Test that files are named pipes. -.TP -.B \-q -No files are printed, only the exit status is returned. -.TP -.B \-r -Test that files are readable. -.TP -.B \-s -Test that files are not empty. -.TP -.B \-u -Test that files have their set-user-ID flag set. -.TP -.B \-v -Invert the sense of tests, only failing files pass. -.TP -.B \-w -Test that files are writable. -.TP -.B \-x -Test that files are executable. -.SH EXIT STATUS -.TP -.B 0 -At least one file passed all tests. -.TP -.B 1 -No files passed all tests. -.TP -.B 2 -An error occurred. -.SH SEE ALSO -.IR dmenu (1), -.IR test (1) diff --git a/.suckless/dmenu/stest.c b/.suckless/dmenu/stest.c deleted file mode 100644 index 7a7b0bc..0000000 --- a/.suckless/dmenu/stest.c +++ /dev/null @@ -1,109 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include - -#include -#include -#include -#include -#include -#include - -#include "arg.h" -char *argv0; - -#define FLAG(x) (flag[(x)-'a']) - -static void test(const char *, const char *); -static void usage(void); - -static int match = 0; -static int flag[26]; -static struct stat old, new; - -static void -test(const char *path, const char *name) -{ - struct stat st, ln; - - if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */ - && (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */ - && (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */ - && (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */ - && (!FLAG('e') || access(path, F_OK) == 0) /* exists */ - && (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */ - && (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */ - && (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */ - && (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */ - && (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */ - && (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */ - && (!FLAG('r') || access(path, R_OK) == 0) /* readable */ - && (!FLAG('s') || st.st_size > 0) /* not empty */ - && (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */ - && (!FLAG('w') || access(path, W_OK) == 0) /* writable */ - && (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */ - if (FLAG('q')) - exit(0); - match = 1; - puts(name); - } -} - -static void -usage(void) -{ - fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] " - "[-n file] [-o file] [file...]\n", argv0); - exit(2); /* like test(1) return > 1 on error */ -} - -int -main(int argc, char *argv[]) -{ - struct dirent *d; - char path[PATH_MAX], *line = NULL, *file; - size_t linesiz = 0; - ssize_t n; - DIR *dir; - int r; - - ARGBEGIN { - case 'n': /* newer than file */ - case 'o': /* older than file */ - file = EARGF(usage()); - if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old)))) - perror(file); - break; - default: - /* miscellaneous operators */ - if (strchr("abcdefghlpqrsuvwx", ARGC())) - FLAG(ARGC()) = 1; - else - usage(); /* unknown flag */ - } ARGEND; - - if (!argc) { - /* read list from stdin */ - while ((n = getline(&line, &linesiz, stdin)) > 0) { - if (n && line[n - 1] == '\n') - line[n - 1] = '\0'; - test(line, line); - } - free(line); - } else { - for (; argc; argc--, argv++) { - if (FLAG('l') && (dir = opendir(*argv))) { - /* test directory contents */ - while ((d = readdir(dir))) { - r = snprintf(path, sizeof path, "%s/%s", - *argv, d->d_name); - if (r >= 0 && (size_t)r < sizeof path) - test(path, d->d_name); - } - closedir(dir); - } else { - test(*argv, *argv); - } - } - } - return match ? 0 : 1; -} diff --git a/.suckless/dmenu/stest.o b/.suckless/dmenu/stest.o deleted file mode 100644 index f3d919245e6349c6d04b5a070963273e6939475b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5296 zcmbW5Z){sv6~M3Uv@uEXOV`q+6qwV!utZu++`*J~E#&1-`@A`{khBw8GS{`A6Kjs0 z+0RYJhMEz3lHLBbIyJD z#5b>gUpUpvz2|q&IrrRq&->$^7!B`tyIhRK#Xip(8d1hpI~x5#-W_BL^RYvEc^|5J z<#X5st9tok*tv;+UUgGXn+TQOJFJ)ft3Ug<0f-;h%PrkKFshddY7YQ#teC2oyA`Wu zYp}X<74Q-d&ho9=;$Agit_a=iD37TAZnnzUK6aF`{Pku7ei*pWY+w)uUZT+LWYJsO z61=6C-lZJgUYW1g>(WGvj48z!F!E@>HKKO4D20O!mR}1uS_|rxpR3?Xjq%X)bOaHj7bQI9I8KDgbO>aKM|l|M;CTcs4?l$2t%G1y2)t!=y5 zg0a_fG2dGGCRplA&!_`TIknvIGWo*1O5u2e<-5hIU%~P)`z~VB2&SB=D!;749C+jn zZ2o3t7sS}jmu2pxjcX0o`7U4O93zEGZ*!u<-e5h%^#`m1F*jKJ*~?frQ`+Puux>~` z7o9ft_`7rd$NHkjVsRreJ(HSyGMmdEpI?{)nD!@LCaO0#j}54iDCy`%HI^ zX^)00yz;ao+F@r0os_19N^i_Z0GsPyJ2mZWE_e7~wK z-EwKmqpVO>UVKd}{81@<53EAF-&Bfcprc$|tsHq_q;mZGOCP%Cr?kbdxmaEqE2mWN zSn-{F8{frH{Yq_P{q@k&W$)g!xMjnocgJG4^oo_LGP=qwgKt2_XI>jFZM~rJqc(fN zkPp@F(XGwl8m!Db2LXn!wp_r2goH!&7Ih^A1r0M*CROjszo7&mhgKc5j#^h3?)1)D zO0SHx))xob@}6JAYRk{4UcGeNifKJV^a^Kx77UeQ^~5zRiKq1PL%bI%UBMhCDLqi~ zJJuAwpJtc}@4?!&aOLP0z1)ru9R8#lE8V!r;JCu2_j$a1b%n9{pN30+B~tq#%tg7? zUJh18G^lyKd{V^%fO6f$pJ$D7#X@-u>Q$T49@iq5*n#2UJ^mgo8=LWmlj;0|e|O-4 zK!0Db*XqF5p=`Ap=KAWFnQNiLwPRDO_cZJ)1Y@5NWA|aJ`8s-_=@%@F_uY`Mx|J=qA-@sDq zBfcAcPp{iI07&!ofXR@r6TI1Nu+*G6Hz zzVR^3_D=DzwmYDe_nqs#pIdH#xAl4n3Vvuk=9-5=A=uvS@e?;&rHhxg>KM0Pw;2J6a_igs$ z!oFR!l;@*D-)iF-q4$aw<9}R=|0SFKgqZJ`jpu}(vhnwXJ$$`zp?v0r{v8`XA@p-L zz9jTth}OOj*KPJ?p}%G0-w^scHvTQrF+mV}{Ou0BM{rsfzS~jyZTxA$_egQ%Ivljw zpB47>e#3lrz(waCm*U`e1aW$^;4u2^6>%PhJ_>UAexbTTju*wb34IibL;Rl>UgP-O zM7eD>d`|g3+AikDTs{RC#n~x1#>e*$@%tqEdn8W#M|sly{BSc{oG+-JFCJV%) zW|Rev!8;|8&7gwj!2rCT){KBevu1vd1!9@mStAWz>5ORv4t()&AAk111!+Get3-1vWJagp2 z3=x-~+2$oK%7s*h-;Eg4?q3!DFWVgaYo1mIzc0~bmyMJE5gVs))Q$>&`~Gbc3DNf$ zg&{xE2cgq!|KPu(xX|+z_Ydc=@838ujM)#DEJ^Vo?2;k$X?|)aB_^9L3xAnmpZtj9 z_W&~cah(?a=gCmClt1AVbegRne{G`ZR>N@pSW@Iq_0w!_bQur_a$cOnM}gsYmE9kI ix!7w55W69M() -#include -#include -#include - -#include "util.h" - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} - -void -die(const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} diff --git a/.suckless/dmenu/util.h b/.suckless/dmenu/util.h deleted file mode 100644 index f633b51..0000000 --- a/.suckless/dmenu/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/.suckless/dmenu/util.o b/.suckless/dmenu/util.o deleted file mode 100644 index 59a07457a785bae0ce4bed63b5ac76e960595509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2224 zcmbVM&rcIU6n>>u3Iav+fWbpeM$;y;X*C8UYFa3;kd1(r7(G}^yM)G;HruVKMk7Wv zX$T2_fCm#j8sfpD2~9kpC-q`H5>6x%e{k`l;CtJdbh2(Qyk`2n`QG>5%)Z&#hr`-P zlgkCdTyP2MGr>W7ug2R);-K?kul~~mt)Mo9%G&mXF9jgfrST{v~-SKGoU{Hu!p58KXz8t z-=7!mx9<*=j;#4HW@*EF7JO@6YZcTQwZvkltbg@MwbZ6ATYIsH8}CxdY&M@702mz_ z8t@0AMrzKlW#&s||9R!C66y^HYYrA7J6Z#9-Ma#=a;K}Ot=YSRt8^oOoX36=Mmsv6 zHjQ^|@K`^O9pkZU9bV2j18v*`zxJG>ZpV`baO2O(+*rxU+#tOilE4kk(yZ>f;r~6? zm_~ID)|0u{j@Tvb-|7`|hjDarjSSRRCthj5_ch?@$errM8t`Mt(>}%itaC$dyn!A{ zW+tnoK+%Rmkk05(G}F3aKw?yz7>sI(iII`3!|_BsI;agN;LdEp$jqCwFk2{@DJY;a zZ-8FTn4s5QNL1hbNz#YMha{;AzH)kei5KW_obHX$9 zY*I1xvI$B$X(mCLDHcI7@-!iNSP6rY%I9+WJWA&Crml=$p6)H0$<%GsQMNvpm^G3) zU2J3D=*LWYWc!VXAV=21`%#;E-*LUwP3F>LryDHY4GALcdBAj&4z7yA`4vA)0v2FMQy0mmsWIAP;OokG?9X!@V@~Jyl}I%4Ty%bvEAqwp(K7b6k%ISpeS!3i5H%<+@>|fi epB=?lI5|ZV$?R>R@3T|Bmw)=_q+D|C`TqcZ6$B~( diff --git a/.suckless/dwm/.gitignore b/.suckless/dwm/.gitignore deleted file mode 100644 index c190512..0000000 --- a/.suckless/dwm/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.backup diff --git a/.suckless/dwm/LICENSE b/.suckless/dwm/LICENSE deleted file mode 100644 index d221f09..0000000 --- a/.suckless/dwm/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2009 Jukka Salmi -© 2006-2007 Sander van Dijk -© 2007-2011 Peter Hartlich -© 2007-2009 Szabolcs Nagy -© 2007-2009 Christof Musik -© 2007-2009 Premysl Hruby -© 2007-2008 Enno Gottox Boland -© 2008 Martin Hurton -© 2008 Neale Pickett -© 2009 Mate Nagy -© 2010-2016 Hiltjo Posthuma -© 2010-2012 Connor Lane Smith -© 2011 Christoph Lohmann <20h@r-36.net> -© 2015-2016 Quentin Rameau -© 2015-2016 Eric Pruitt -© 2016-2017 Markus Teich - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/.suckless/dwm/Makefile b/.suckless/dwm/Makefile deleted file mode 100644 index 77bcbc0..0000000 --- a/.suckless/dwm/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# dwm - dynamic window manager -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dwm.c util.c -OBJ = ${SRC:.c=.o} - -all: options dwm - -options: - @echo dwm build options: - @echo "CFLAGS = ${CFLAGS}" - @echo "LDFLAGS = ${LDFLAGS}" - @echo "CC = ${CC}" - -.c.o: - ${CC} -c ${CFLAGS} $< - -${OBJ}: config.h config.mk - -config.h: - cp config.def.h $@ - -dwm: ${OBJ} - ${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz - -dist: clean - mkdir -p dwm-${VERSION} - cp -R LICENSE Makefile README config.def.h config.mk\ - dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} - tar -cf dwm-${VERSION}.tar dwm-${VERSION} - gzip dwm-${VERSION}.tar - rm -rf dwm-${VERSION} - -install: all - mkdir -p ${DESTDIR}${PREFIX}/bin - cp -f dwm ${DESTDIR}${PREFIX}/bin - chmod 755 ${DESTDIR}${PREFIX}/bin/dwm - mkdir -p ${DESTDIR}${MANPREFIX}/man1 - sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 - chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/dwm\ - ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -.PHONY: all options clean dist install uninstall diff --git a/.suckless/dwm/README b/.suckless/dwm/README deleted file mode 100644 index 95d4fd0..0000000 --- a/.suckless/dwm/README +++ /dev/null @@ -1,48 +0,0 @@ -dwm - dynamic window manager -============================ -dwm is an extremely fast, small, and dynamic window manager for X. - - -Requirements ------------- -In order to build dwm you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dwm is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dwm (if -necessary as root): - - make clean install - - -Running dwm ------------ -Add the following line to your .xinitrc to start dwm using startx: - - exec dwm - -In order to connect dwm to a specific display, make sure that -the DISPLAY environment variable is set correctly, e.g.: - - DISPLAY=foo.bar:1 exec dwm - -(This will start dwm on display :1 of the host foo.bar.) - -In order to display status info in the bar, you can do something -like this in your .xinitrc: - - while xsetroot -name "`date` `uptime | sed 's/.*,//'`" - do - sleep 1 - done & - exec dwm - - -Configuration -------------- -The configuration of dwm is done by creating a custom config.h -and (re)compiling the source code. diff --git a/.suckless/dwm/config.def.h b/.suckless/dwm/config.def.h deleted file mode 100644 index f256a6d..0000000 --- a/.suckless/dwm/config.def.h +++ /dev/null @@ -1,118 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, - { "|M|", centeredmaster }, - { ">M>", centeredfloatingmaster }, -}; - -/* key definitions */ -#define MODKEY Mod1Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, - { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/.suckless/dwm/config.h b/.suckless/dwm/config.h deleted file mode 100644 index 18ef6bb..0000000 --- a/.suckless/dwm/config.h +++ /dev/null @@ -1,121 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 2; /* border pixel of windows */ -static const unsigned int gappx = 5; /* gaps between windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 0; /* 0 means bottom bar */ -static const char *fonts[] = { "Iosevka:size=10" }; -static const char dmenufont[] = "Iosevka:size=10"; -static const char col_gray1[] = "#000000"; -static const char col_gray2[] = "#222222"; -static const char col_gray3[] = "#444444"; -static const char col_gray4[] = "#eeeeee"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_gray1, col_gray3 }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.62; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, - { "|M|", centeredmaster }, - { ">M>", centeredfloatingmaster }, -}; - -/* key definitions */ -#define MODKEY Mod4Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray2, "-sb", col_gray2, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, - { MODKEY|ShiftMask, XK_u, setlayout, {.v = &layouts[4]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - { MODKEY, XK_minus, setgaps, {.i = -5 } }, - { MODKEY, XK_equal, setgaps, {.i = +5 } }, - { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/.suckless/dwm/config.mk b/.suckless/dwm/config.mk deleted file mode 100644 index 6d36cb7..0000000 --- a/.suckless/dwm/config.mk +++ /dev/null @@ -1,38 +0,0 @@ -# dwm version -VERSION = 6.2 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = ${X11INC}/freetype2 - -# includes and libs -INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} -CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} -LDFLAGS = ${LIBS} - -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} - -# compiler and linker -CC = cc diff --git a/.suckless/dwm/drw.c b/.suckless/dwm/drw.c deleted file mode 100644 index 8fd1ca4..0000000 --- a/.suckless/dwm/drw.c +++ /dev/null @@ -1,435 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - /* Do not allow using color fonts. This is a workaround for a BadLength - * error from Xft with color glyphs. Modelled on the Xterm workaround. See - * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 - * https://lists.suckless.org/dev/1701/30932.html - * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 - * and lots more all over the internet. - */ - FcBool iscol; - if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { - XftFontClose(drw->dpy, xfont); - return NULL; - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - char buf[1024]; - int ty; - unsigned int ew; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - size_t i, len; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0; - - if (!drw || (render && !drw->scheme) || !text || !drw->fonts) - return 0; - - if (!render) { - w = ~w; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - while (1) { - utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - } else { - nextfont = curfont; - } - break; - } - } - - if (!charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); - /* shorten text if necessary */ - for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) - drw_font_getexts(usedfont, utf8str, len, &ew, NULL); - - if (len) { - memcpy(buf, utf8str, len); - buf[len] = '\0'; - if (len < utf8strlen) - for (i = len; i && i > len - 3; buf[--i] = '.') - ; /* NOP */ - - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)buf, len); - } - x += ew; - w -= ew; - } - } - - if (!*text) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/.suckless/dwm/drw.h b/.suckless/dwm/drw.h deleted file mode 100644 index 4bcd5ad..0000000 --- a/.suckless/dwm/drw.h +++ /dev/null @@ -1,57 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/.suckless/dwm/drw.o b/.suckless/dwm/drw.o deleted file mode 100644 index db93e5e92a628b3c0d2ed4735a7dbec3d34f07f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10472 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 G+y4(;tavd1 diff --git a/.suckless/dwm/dwm b/.suckless/dwm/dwm deleted file mode 100755 index a53b513d855902d3b467d9ce7e0fa80342031e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66592 zcmeFadwf$x8b5r}HWHvDL0heg5;d-^0=5d+0MQ(p&=W`@&;kWST1v5n(#AG{q6o#b z!toI4dRftRS9aBv-F0_auZRkPaw&MB)Kw906>ld*q=0f$$?yBjIVp!oe((Ev|9Jm0 z(#(0j^UO0d&pb2p%;m&oF3*@0osNrtQn_0>qFQfL5QiGE_Gk40frHEE`r`Xa?h5V# z&}j@);vGtWSmjfda&Bl)@l=GAZk-yR7!FYR;$ggm6jHimpEWlsG4YTyD>S9k(_^ke zCx*|KDR?~8repc7RnsMe@?{Dh54Gt?H{REkc<)>1hV2(B^!iLCjHe@YP`b5mD)`!W z&J8W9zT#nApHxQr+or}RhE7Ec7Y~V-KHjhWbLiRm3?qLP`l+GtiHGrY6OoR}`TzE# zHUl?F%`cf=)~gxB!+5*jSW`WF_|O|`<_xZ>t_?H}Zp?<`*QE%0Tjnhd#uws*620f~I(?*Gk?(k9`Qc z8-MiK_~k=O3S94hx9_gf0k)%3+%%QQgzsx$Y-$sq6EidkUXKEvkN@9DeLj353VuG^ znMBV1B>bCD+4ISHGztE)ljPf)B;V0V@XjQ1o=bv1ouoXCN%Vhtl6+|#IG^4sli)*=wBwgaaGDm*C;vrs zuJhroN%;E#x8N`F^KueBe4RvZYm(^ajwEt+Cc(ESkuxtzz4|86XFe)qNvsrTcM>_v z5O+SkZAenzsY&v^AN9KWJo!G8B;RY2;D1jd|CJ>8s3dkWJ4wABN|LWH3I9z=_)jEh zuc=Ae*PKKSO={=U|NTkyKRt<@ok{qIC(+vtN%DO$Nxd4A@c)=3-%B2Ti>UAoK{4bJ}^OYp>A4t-Ub)<<@_A=GIN)5993NNd7I%`T-IkA5RdPv{E7HH;Qb-TqVmVrMI6=*rFnU@P#Dh5 za+eg%np0U{d1rNlzp}ohsGz2S|{-_{;14vt}u*=VdG%Q(swG z?60q`z0(6RTe`;{M+f}=x>~MuYI(iSTZagewqUk4?~*#Alrk&%c&i&1l>4X{ zwR2nxA(WK}N@=Kc)-9?ns+&VKK;_0&Dus2|`U1$gBG7=MR-uZOQ>$y|)Ggxu(8uh6 zzY;iV{A-Y}si|AUvQRi6x_WMPWqnb(&j&?vOsR2@mC0Gz;IFS+tcc=D!5Dw+$>6L~ zivvDiUA@1-Q&&+=T34!9SfG@?r)er{D*csbQ&G)&bmgp^TU}cj*E;1mG&aD4xMxasx z)(A!A4fEBeqQvKvcYIy_g7O-*)RQXb)>k%EA<^u*^7=VFiiXK~P*H7*jj67w(U|Ob zSjkyy=ura_Dy17;SC2kK22fcsUsIlfI^SX*_REz{3{=)HE@65qUR+y2R#k&8!K?>O zS+}rqQe{K+-92i6Xqa>5o%MBr+BxyoE3RJPtLb534T7fg*HzTjpixk-hQ$j?>JU~i zGgTiLf*58oOxGlknd;ewXXWc@&~d1KK@Ih(c-HY&APtidQHfQIh7+i-zI;JBjVXCt zoN_nt75?glFby@DWl~%L5w#683e82Qu3*-nBpg!#lPeF@_=^Lx8~oLN^d4?Zg}2;K z{TwJ?w0H zQ>sK~lO6Rgc&eiCL5*sG_=jL;OXe3m|NiCul67iIms}Vye znsY7;0An6?Dk2K%YU=7~%wScC3yT*=<))ETEmvFsK~(uTT~zL`sG_1)C=&pNlnUQs zuClS(&oxx~A)kf|jLaB=xrXXHYs+gm@YE91+`9Vtm=!P~RLq}MQ8jeK!C?uc(LY%8G?PZc%x)-&Z|{t6)`{HLIerd=>_n@*0>uW!-={D$N2P z@}L5$GtYwZ>RN8$Tpy+v|6H!2R((KU#uQaKr`%r-{@D!;3OgWlm_ms$a+c8lhB#o{c$|Ql!EKQF+egi=!<1oUb_F z+49Dbvurw!{)^-El*W7og(IW78e0sh+*c|VxU9N2mGgVh^oj4!#{GsS2ZOm%b>B9Q z=c;&F0{*9`75=IOeC{*__a)$eQTdw^@Ml$gWdc5Ih9ajm0sp(oza{~HYl_0ZHUa;a z%D*lF-%z6PhZFGss{C>S{)&oQ$g##JuAfaRo}GXX`K!X0n}CN^{`>@dtBN}k@NFtC zB;Y$#+?#;6t9WSwzFWo167aWGyfpzoGFK`8+5~*)y$ZfQ0qa1_~r8y+@PKV#PvK}m19o8Q&ilNfbV!vk&~N%|97#1=O^HQpQGSq33zm+g0D=# z`_?FUYXbgGm4dgwr-bqH$La0_{12)e^Z(A}kKL$M^08JkEbI0gv0Q`NMPd5a-WI zz~ke7ZUP?X&riVDs^#}4;BkIm0^Vci33yze>l5&}-F774O=`dBPJ)~Fom<}=l|MHL z?oGh|ppJ*WBzS8Qe0>5QuUAI`-qTML@OXXAADvtNo_?Bu$K`ty@VIr)uLh6z8Hy{_;8?i!e9AOB${4x!`PlI2s!Mim001Yl{@GCTUw+6pbgP+vk12s6eS0Tto zEE?RP!LQQbW(|I|2G7#qRt;{^;MZ#KYz_W94W6sPuhZc98a!KrJ2W`m$%%gi4Sszb zMCjGvH)!xu4L(?dmuc`J8oWw_->AWT8a!8nH)`;kGkEgRj%z`5Jt^2DfSO4H|re1`liSks7>RgOAeS9U9!O!S`wKTQzu>23N0) zvRGMzJ2d>=8l2bQCpGwJ4bF8c1lfOq1~+JMrv^7`aF+(p(%@q>xJ82(YVd3gE@<#v z4er+9`5Jtz26t%iaT;9E;Hs;{V!ax?NW)*M!N+UxG7UaKgI8&AuLk#N@QE6{QG-v? z;7uC5Sc9+B;3XQoRfA8~;A=Ga6b-&sgHP4q>oj<&24Anir)lsF8hpA24{Pul8oXVD z->$(sH26#nzE6YSp~1T}_$&=BYw$7+-mSsQHTX#lK3juxs-H{tU!lPb8hnlhH*4@p z4W6aJ=W1|^2ES8-XKU~(4W6sPt2KDO23MEpEY_jH=WF-{4PK+cy&7EI5@NBX8eH9y zV|bYcuhYn>(%?P~?$h9RY4Ao3Ua!HMGH^4Zcu=uhrm-H2D8t zkH<_`o)&`N83alH-={cEXbJmMVjV(oo1u*rAvWv);Mlca;oCIOfhVGwMMSz{_*}c6 zXdRd%9gOZInq28fn9;k5CKo!gp3z&0Cf7N#meCuDCYL$V%IFt}CRaJq#OQwzP39l* zG5W7W8;CAr^by zZiHj>Jfg|PjdY&@aP4fO%|v%GdOFeliSA(ZB%&`QI?U*?L|;VodPa{Xnq1n*T1Jl` znq1jPE2D2Bnq1gO6Qi#unq1e2kI`2XO)hJsjM0}7O-reWm(dpzO|EOi!RS6jlgk>( zWpoPBUq52;n+Cp>}qxTa{E@-5K(Vaw- z>lq0%dN-t|yvY$q2{jc|?;78R`C+ zwLj71I!3w}J)P)0qB|HpiRhb%4l{Zz(Ki#lp3$R;CYLd?meC`KCRZ`i%IKSjCKoZ% z#OUjZCf6|HWAxQTlS>#WWAtT2lPehUGWtTI$pwr!7~O|xa{VH?j7}k%T)v2f(Wn0e z+D^2Y(MO5Cm1vI92Z_Fo=oYz7=1U<qO*FYok+qB-K{UBakyb|EL^QcbktRl8Pc*qk5g((kCYoHL zNExFqBbr>Hh?mh95=|~p#KGu3M3d_i$z^m3(d6<(EQ~(=Bsi6&Pi(#q%; zh$a^$(!}V05KXR0#K-8r5=|3Oq>Rx|5M52Qm(dRqJ&$MyqaPr8KGC_1zK>{fIU*KD z-%T{R8WA(2>xm{8Bf>Fy9?|4lM7mG1_9vQLibxlurxQ)CM5F^WKZT#nmrO1emVf8N zq&P>A(ypb!N)Vf^G)v}%gRzvr6@s+TAcXAyMmc3Sh8a9Rf#;TR;DTts*dD(Tz#{L2k&tgoJzrTaEUX7of>7g&)X^$)oWoi256z zW3zf79h|kqnF)D#UX3Y6Hj*^S-U~b%=^iHdUnKsD6M$C;Hlk|UQWafhB!>)ua^ z8%%NeO5EOfoL-5$isA++aWBW?(v-M<6i4GJ^7}pFHaV$9Mg1>$mdC<-0=}5=Mg?yn z{3Zo2C!8is@COLL4EQDkfX(D)0=<*a!5Bj!iqu>?99sC9hkYXgJEq)Yf9s<^1g^)ft7tAO{=F0$) z!LTBPkm3=)K!Pd|{06G9Y^P4GzNE*{?N*B?Gv@u zezcJjSfa;?l+AW%N5P63L3HZnwYg$7+FMfw| zTu%wb{bQw}UGirbp)ov`1mCc(p|pXqj2&EQBv(AhxU!)G3@bx|ORP&$0v9PP;%8%} zQC;%e@EoEU3}W;;tOSJM$yEPGvF*_yWxqttzKXJE`F;!e&-?`?ouy>olj&-J@l0P- z;?A4t)PziL)@B+KT4H{^{Pa=Ms(lnh<{kHhu6_DJWcVN&C}@v9N>vqL2qR`wh9{u9 z0aSfKbXqN>N6c$6QfM}z^8X4DCFws}%W;xd5X2`tsNK*<_5g{F5JJye*D=8UE&xIN zUjE&WOk;l%Dw*>uzoTvL z5YxbB2&d(>ljCSTo_EMC?!7}04+z1py1gZykp3GliWllv#{&Brbd*?TpH`0hp%qi# z#6MG{p4J(H?W7-`f&TbvJVXDzV_l|!O(eWc4Z(jE;~z%r1|jE+Aa)B|zQ0Y_axzuW z?GW~!@x!|HZ>jf%S=E*|P{scH-17G|5L1POa#$G|@N(no73K)mGTS>KnNeyyP~y#UJ1~i9caOB1_{rIjx4gu+Vbce}}ZlEJ(`? z9`S&j`UA8nZm0Pl-juxr83D$iKV%l^SN;;(j_g6%JmRE0~z7-*OZ4a+5lZO8#dy#!-Q8s|qX?lGX_Ad``YA?f-})blnoBdf&PLzEpxw}C}gjH->gOZH?z`~?-sQbvc#-;+h(i!uhx zayt>?;hB-T?pUmipXw5K!fh4bQZv)PgAp0`U*NBne;*cI;|{47?T$uJKp8!!Gq1|r@fNQ*4u)HJdROl->xaxv?5 z&}v12*(pYxum!0hOXFz5!_1feL|kHlWd`-Wwl+mci!4k+ex z#l4=8)0*xPcgz2TkfN5a{Jl+^oz@IqOtZou{1-?C2GIpoVe-}v2JfKsls#2I)v-%_ zN9ohW;#*jimcr)~q-JX?Lb1e}?G(3)eygSTZm0B;bqzo#+H??WSWS_etpcL*!pJYX zcX#itrsm)2iDr#2@-r0v4Whj*<*@=0u6r>jaT6d91ne zV8(_%T;YO=1T32VFGvD9hu0y01dTd%HC7lIYJ;pZ_-XufK6pmwkrw0&mxjsEoz`5G z|3nG6f^)375azdHQb4!xTR|+bnjg5Nxzp7AI%+EJ4So@BI@RPK+1$DKR-(F^PKEvK zsk`Y^7d^fHOAJ0X8&-o~oNPMPZECq1NqKtDntSnN^cq)Q?8R_&fWq=(Q}jZft!`fI ziW>OM@J_fFyHC8w+>oo@bBCtJOs{+_1W%`$R_s8W+jhd#`~V&VXn}_03!D$6<)LYV z2f|IKoBYFF&EdtjFuJShbl5+PJ$5&p?(*M^$IWOI48FkwC!0=p2Xa}NUN{*Ym=}8? z9KDnk`h}*bnHA`Tu4pe-o)@}LbULrvYI;{g1?O zFn}$#ifms8277d90+;R#LolpHFL$Gb&@%TL#QpNZ2pj)8iljMKOEetp){!c7kYjpu zOJ3Np+ti$oQI-wJusKunVbUGCoI`ErFlIVI+(IKAOd+4&977Yxw1LVmKXZmTi-29G z@n?!EV$gY-&0}>eygr^9NuA>9cxw417QXHnhG(P+?2WKN4w(r>6)<<$l}9{Fh$qp?zX-Oi4Sj@I`wnNCFeGq<^&G#=EloB<)*$`{mw^Q2?v+zh zgw#OpM1CqvlXV4WC=J8P5^FZCmP+N9zKzB1n1w_R9VX%&Cp;4n<|gWsgJ6hxVNx=j zbGGLCS`a-}L!=j`GI=*ril6b~=P06E+##R-ntGxuUkEm4aRJ(>T7+#EcwBEd$^H-_ zHD<~FZ)om63M*KHSWJURE$>0^ggX}B&bc2k^2cZ@U~Gfs0s?k3;G4WoECX+ivPk)F z2;sR<>oO2BilSd#W zYnKhMAI(5@vFVKhS->-*8LNF0%`*!uTLHlkwe9>Deou|DXJier611GHxT zQBvm!!DacJe;~~kmwDkhx$?q!yXIkEY6>l*NFwIjw!Cl~CLDAJxY3wjZor%({>b_- z+b@xOqlwhon`oxO(rw09q>wbL>T{9f;lC6f!jCk`3DR(R9vGM>#G^^u1ZhPR%tZ)! z%b=q&Wx)Z(nT1d*t!xCTiGnB=VJjFdrXbB@ER8hUCxpiOv}sm0DrqQSX&5c)1l!$J zfk6VLfbfBWw2~x9cR3}`e?2WLy&wYc` z_*`D%^LeRys8biVb(kh>_UU&?-$B6kJxqVPEDU%p!$D#R;SQS4oRXbN2FL z7(~nQKpOh7!6_CFK(nOiI>6L+V!t?b0F;{PKq+a#auxJcMs>eXux(gLmFusm`=rL` ze%J;6@g;(I2DZa*NI|9HdAU*-br%am&^)t(QPiKE`sf3j6Vi{n$z^kb#m$f#G+GVYu%MAVNx*MTo@nx6-cuG zfRhu9B|Zn-g!b6?nR8Zq2uwk<%wz)rwB)?AGBNk=@;TomzFWv@W$Af#6g^v6hI9kHX z4wa(K^sA7O;_^>zL`T3rzL?nvEP4t26Ce=`D`GnhJ%^(=3!=ACkX~*=J}6^3*yP(u z$vx0`f_f7~%el3rVlm^|M(~^Z@+F(r;z3=>k)OiR-$Xghf$dWP&nybV!G@gMS3f1_ z!fyCN9$Jx^v7JzG4-FN{mYom`o87R05)#1U!9flK#X>QhduN(;#!Ndx)kfsMLIKBk zlNpkVBt=ACC$X;~cIge4Oc1kNm~Aq6Oke_!rxK^=F&mDV`a8`qi00NNFbm=vtt%0V zesig~%4|Uagy7aRcs|(y_}pF7v5;#kmI{T9v{n(MCwCIJAl)oK&4#U=0vu)P8mTj4 zT{GHX?N#XBmtb!!uk$r}|MMJcFNFz6D-4v0^eS~Ex7dZsUCassj}Vb&pdL()SZecW9Q7pqbG+_|Q@2Bv7-D(*A@^k}60CM53+!uFffB#iIFK|m|1)O2a=CI8 zwFGgP(cb?8XyRzmO&~^#nQa>&h-=wZ%!{3-@$Igbu+ua?tTYBMzNN!DVwc|~WyT=P zcJ$tKNm0WGx-B{HN||2+b=o@b?I*3Kask{8IeaMn=DbebmV!{a*(4m*ZNc!}8J(ui zT~29it~55^soP~cvMgPCm8z!Ok#j_RR~kE1nm$VRmbl+(dvBT9DLqC)dEHiLPA3za zakCDy#omHYhM6}N9np2zAi8L;)NdN8L3%73>@X|`0;jZ^C^nCHw(z#Mkl-z+^b|R0 z@C5xAICFNna`qiFnO9I>Hcjm`-MDq(6ws^Fh`w?6LiaJ#^&g?{UEg8K{_>dVjsvC} zzgT$jG1Ii&$4t|A9W|BqyBZdG)HG;U^h!j(XS%UtVJ4#65FJLeK9!=Kra@t37*I2m zp2~%IY~J<~+aEviQ_f!Lsi6wc+bM>D@HrjQihMw%pw(0rQxOYXx_wUD3Ma*widYCs z(%ZI}CbUZ{Mv)9`l<+pR--NJ@S#jVpr;QnSpudeZTc9^2kWT%`taCV?j{Y%)@I|@XO-T=01sD;93`Q)QWMrnr>n($H~ z>Ng?7rE8~Zx^&@@Sh9=>Wf&Hgpp#*r;oBUvQ-n7azLVE^1LAa_oj5W&lx{#QR=vBN zsDCIU1v@6tff$yT&_YOhgsF+tMcpBk=H*ih9lEyYc;tsoz=$HssXGq&&YbQON6>yG z6w#v;p{lsS$;I)y9W-H3Gs>621CODuXx>N$EisiXCbo}`eL{6hNp*kOE;6hSkt2hr&ME2M?5LrDbBH)Auxg| z85vYkslnlt#toJ3$#sS@dOJtnZXIB{|1U5D^iOQAnUUP!62EcTzI2(!9CPLz;B_D5 zb@C^UJ99d6y3wSR=a|q?132pYVH6i--L9N=aZ5ChkF^18xLE8)ljadwe?D@A&g3M;ixH-??07SJlx5ZQ!; z$k@yzI72=iq&?2>{r8LbMD&W#%luokUp<^ontb2(JT>=Heg zc^j}(j~JsGQ@b=b`VUY#-814%&7d^GZ zWqRc}AKO7Al^nfTnxD_J4JK#KA#6Ia$Gk&M?2x9%2b?0>qdiQm*5KGkJ|Hh`W@eak zR2r9o@|gbffm50>6tzeoqvmPtV7d+Rn6=v`>PUhJPH26_0x(^;n2DZT-83X5=d?i?yJn(&3iga(8>_C2W zQ2|XfL<+LLQk0Lw1lG!~QPSk0y08?;#n_V*mSY$O1?hDvXmmTas>!R(c4NN?o5_-W zBo<2NIJLCb9KsNQ6Rg;MlJA9fWTLwG$Y%+>U|bEzA`h56Q0~}2v6gtog;YSw(wdl0OhrdQpkVqk z<5<|#{4aunuY&>3L(3nClI*oq;0is}i4K;eaRW3Px>9lOE<{D;7oZzCFm3k&^g~AzVT98w@2LJK~b}056Y6N4`Y=dDQ{dH!{~C3ft|%iH=|wbUZXg{sen>Y%*|(2b|*fl72Ac zxUM>l>}F7QlRTIbENreRu@2y|@vpxK9AvoAvbaU=joR@uN}Vlptm)Xe!6an6qCZli zUs^K)SYsDdQC*GHv0B!8QFO}6n(c(t2`Cnw5x8SJ zoT)V!7J_Gbn_7-2E0(QDg@ZA<7@M1^`Xy8+$^I`Ah4WFpkI{Of1u0kl39C{`KNa9S z=;wP@SGp5)FXA6ZZCr?-d zh*xw{6xIMnI^?{HUHF^P7(FzjjTtp{;dYKH8Ek@9B|4L7^|S;@#s0gchYbWuv~We< zD_LM~g+%$MJ!H;mA_1LBxoi?_G{E5xzFrDe&ObQ#dKEnctdeBLgY+;-qUIGpmtG{< zPAN#!gnWQTQt6M4cxKlMFi_I7JQY1wdRV}t6l4;#WeH(0l5g~kG#j$$-%o(4_r`SqYiqV1toyF ze2wccJ{tV8qPPvTURB7ldr{Ke$XzNRO|&TzpozdHl&>7I*u=&itZez^PB;it;_5M~ zHAeFUqS62Ls8ibppPbcu76jq!cw-rgB1hk4`e!9z<#`cV9bZBm`;`OWzwc#-DKZUs zRCn!wHxuQ+fJZu_0guk-ncl=#X#`PsQ6TVH2$Y*3h#HTWGG5PbFVt0mz^!jMr@pE>;-#1n1FGQk0uiNUr2_%z1}n%8Vt}HZE|21 z+=>&U-~sdUFF0i3??s0?LbMNU?xJnk*3ygFh>7+Ub_VHzKIysSH2aMb?-1FV zF7iHLskIc}I2%H*)c?2`fR8#`cTZDM+!9|;H7C6NYVK(ky;F(#g;65<3K>S zPh8|XSPANoLW2R~gWn8J-V%xiPkgNG)|8>ejhu@e2MPpg@IDg`_xJB${;f|bl zb)ShZQ$j^PFS!RvFH;dmhca}!9kvga4kjttsuVUCDN;`1o_0H=oD#R>U_)<<7@}k- zY^vYrX!MQvy)L7JG0aR~D<4~xvOf`%uIfl}hV)QzxZX%NXFm;?d9EppCoDu;bE zXzU#R5k2fzJBP0j7~GamV-#J_hyPxTJH7*JIc}2al|?0aou1Is7W7BRIlTx4`x*&w zVa#KjkNr(4^AC_MrQYoF26v~N=)7uc(}7l()B6}l&j-kEE&cx+z=-omiJ zZWpmdA6rE!_lNR6#)85AM~L64=OK_j@+VX>y591m_z}+S`1ih+T-crLT9|A456%lF z8#XPAv0_yqom1E4d|*_Hd;*F1{GEYbPI2&0!1>s=XnU+J_>&>Q%$7GSR2fX0en#e~m|Gm?H=7P5lurvQpKNcv^So7yVa zo`N7lu0v+Hbzwj?Ujmmr0p)DQcn{an^vXVIGFQ;IxK zE7z&zxkxyD8r-b3z%C)U9eVvb@HcAJb1u7dy~SG960a^BjOFXwaUOe5wk~kNj7SP< zf?aOOQ-*;+}TRGv95w0Vn{QeBb)9z+UzBe8NgKu zKMv|~_%E5czvlRtnO507r6XkObl%x06BiBnIao zP?qF7*}@zkP!G_!n!e_Zfnji=xAK61wbpY2l z80dgP*8o7AbOBB=(f4$4FEg;zS2&|r;*^DP^btbo4@eVBgGY7Z#8PppK>dHi+0(;j z_4F`TuEZdM3ocdA{Z2nDzCYGGrI8!hrBGZmi1`DKcrxTg>g}siMN(;?VvvR<4yZ!~>N7-SEIrHCm2Hrl`bmQJd*WkO~Dj}*FlkdxSfk5k#; zle4kTL>?8CN3_3^3W<=1eFCt^gV<`P+mvkX7LQ>ws*A)96`tZ=oBe zU-`FTYC~!C)yRxi&B*uNIyj0L>$5QWXI(|b!K}dC6$cQ(!jRjoUYZ?BLE!x;rb(rM z+J#gG;mfymfd{+&${HuQxs22%g#NP5nzpiO2%en&(Hg42PlBx% zy|1Ic67iBFD;UmQsXsUyC2=7gN(SZVFQd%R;s&YFEPuKgLf7F-kWvK+Ew@9yj1>)( zouiGe(6EEK2qZI>{HrPVkX;5K7vLE;)P6=EvfsVea71 zX@PddwT%W|{go>-6HP#w_PAg)8Z4SD{+M^1t&BsP$uM}Yyq_7G{#k0Lo(-VYi~``b z$k#ya@Dk9Qhm|teeiwqckw1$*2*ZAb#SFVeVelfDhPC)Uv;nQfX;&clouC;Aa76>7 zK#yyNMPIMHFul*o?MQ*W98vbFnG=^vGR5}<@gTDY7|8o{i7A)!zeAyAU;yh@y!o~f z?l>4fmq(-OQS?dsuK56ZMjBijlAqf|*4B7E(xr1tuMu#rhxH5w4_xBPL|P_8){*Yu z_=u?6jv$GJCUCP*-uFh2tzhA;b82v$38 z2$jk{0C93Jraij>?4^;pxMqlcFl;O(Cf|)U5!L%mB{k~#ChPs;K}G7bz?-mVMDG(E zhUk4a()$E2pe*WgN_m+;vTvSu&M=HM0y@n`YFPL_M_>pj^B=*(+*-W*vgdWS%0j0M z5K5hrd{(?kcTA|ji!z(iQK`I-w`|jvdWHFW(}fB+2|GNxgFK5-=FxrQwB3;w=mWxlCxiboxarXkh56xhLAoi{=FxQtVy-mFK=0SYwnYDd zd%E#0A$BC)*)YBsu+#gAW)rBC#bTWTz$ zj{64u4j*z=vUZCOoJ@UyCX)CvkGQ&t)s-;-@wvstWrDb(5hxyg$|cz=V7jMjwpchyEF2_% zi0ok=QHOtQ zL{wSw*Q0K~BkZn(hBBz_zUeh(g^qcIikX7{T;4t$J0c?Uo!XAy$<$oEfZ z6eHgoEM}NpVVHtI{$e8rpqk+8%z^gzq5I9B%Zm?EeLt61vZE@NtKy!AUT1w;^7^pP zM~x) z&y_BbmXjiuABf@G*5SW0uVYGHOk|+^1R4ajTaFZbX=D?2>fu#n)`OHrJK>t&C-su< z@?6W3?l3j~8+MboW2$(UN09C#cQ|+^7U(M(cH$8oLr9Yhp~W%N(`V|lKqxy0IMxw& zzV~fxOUnuWkD@`!6+)xd3%cWYX$t;qDg5%nTyboMN8ExAn`;gp(T$hV+nwTQydCQ| zlDj<`BXwH$cyX0-&rNLJy%M=e>~5WHbcw$gCjDoAU~~U&EDBJc|5nnldYIm&gLC>L zQ#Vb1UimPNu}OD3u}dx=$Cu=C3gSP>Zs?Xri$`SVBZA~YPYP1c!z0>fCXq@T&Gg9? z$Yy#T_Prw#tv@7vJ~9++h1sT-P84l&F}vG2QJR`RGP55kvv5?PZ{Ei?{mOFs0oyX}Mp<8kEaV63tJx3ZlXIjUeuY4D_`{lLx!u>x}3yn6? z3T0hxAC6qekCF$!f}BG37&X9E7~kWU5ZQb6W^l24qw+T|Q&dRlA@-9MXrJTEFOyfX zL~K4pU;XkB@!3CQ407&kO!zdM9mw0Ln@ILI5hKg5;u#aW86hh8^iLF(c_C?28g>sj z!1xF;4kSita3eubFBY(9c_`c=go0ES_WJ?*5zDj9SuE#assu{)c*eVhJv$Ujo@lJ2vb( zdEW79kqAyV^NvrC&^67{Hrf=*mKUoDuzj;rUA~WI(ZOY2?4K7}0vBMxnG)#j!MF#P zG*CVnlTz_S*+B_$0EC$cBjy@v-KatS9$8>6g@MlkvtZljzl26nCRu(4{<9!n;X(|~ z7oe>E!pQkm{=U{)g`%L$}fD}S(J6`PU9q3HG;yW?+bCDw!8~n{BRxdV(Pjp<>vF?|^MQ{vy2k*&(YjOfF zgwn40-uTkurKnkqu!%hH(0g5Cnl<`+GF#f3OpCuD(@kZ-)@09OBYv$4?Xdhi8O21Q zuR)U&*7u*vX+_#7o^ARNV zfF)~_r^yV3oR*Ki1S!~)$O@iJ_g}WGPw?ageoLeUr3s$Qz<$cfOH3_`K;bSEA1m3; zMdlF!8}Z^@F;7l6Hr~vp`zHfL;je&r?Ch3e#d5n-^5yD2x&gP-oVssrK+$kLFK4&- z;g;CIywf?SgQo{BwM&nhk&s@ImfjTb`;e?%buCzw~6B*a?ZDieXyQg>JCH)AJD|unn zoqns-i@8ny%O|34_jxJ%K}?|iBCy>NnTW$tN~8xR-Gbvf@x=0P$;)^xjRp)ZAkKJK|m5}1mCw@mJ!gDP7a9CO4uu@g@7 zro53*4AU5{bIENp6Rmpg65e+cA0{?y10lh9h8+t1s3AO72QYg)nV$veSd6~|N6Z*!Q{e59lKZ< z-H$~JPKnO*ew&61^$C1J%e#?Y`4U!c`uF%zb7&ci9SZ6eee!$VRG99+ecW> zON*<}`&!8x6R*evH{9dM$fK+o&NnF-!Sa8b6n4X$dnSc9LC9x5M$cvg3LEZeW?*OM zFuaeZojWnW(Zo_ozaQ`vOc75YoQL@V6T^h(Q9$gD(Zp~kq)O}-0=8=D?akvJ=}~g> zCK7o_86qM59whgK>|c$+jJ`Ftdr~SpFvrge#MkcUo`9>|wys3SK-z zY|a*wu-lc>EiKK(eNoQxNp=zDv&2{Py^Rck)L({5OSbM5BACIeB@Fhh30%zNVV^FSG`J{|?b)1Tfgx-x;z72wr1WZdZ+i zji7_dNvDxA+H|(*$B~%xO(QFhsMAOeIOO42L!ECLd5KK%SJMc+5lUC}m0uU53Vwwh zRJbOr@vb4IFwA6vdK;y@0IQH7|Kej8Y8S0szA@wgF`)5RdKJrx>z5 z&`ofY@x%1p?X>8b=XJRzkqLx*WPe<;JQE``AKY~M7E-W z!F%#`rsfTJl2_uWMOn9)nx6xJ8z9-}G}-=2d^@qV8$5YUpq!R|w||5+;SOwGMJL70 z${k;OO7_Q)6Mo)F-ptzGj|pOwRlWhjaj1l`;?b?*qvQzD+vsmnhm#-bf+Tk7W)%dh z*`Mpn4xEgsv{ ziYI6aSFtqrtOQs;?si*xnqH;#C zo-7JrW*q4N=;Rs!`F6NegC`H3L$TsgHZahOF{gK|SSTufY4Qr@&2jO;xi)@;rDp^o@c8w#O9{95dka#4i z^pOw2cs=-0iENxX?S=iLN8*hux5);o~f5BK;m5ssws0N zaYyDHj{q7ZQ{<(m1PVmPi3HS$F6G5kX{kjTpB>7$9Pg}~b*Ef9yu!F^X&-udOk{7a zO5<@!V$2}0lP&P6>Z_9Nyl$@xFVOYDYlJSvPI%j9vLC$vsDvU5MvfnVUw>h5uj6*w zNoh*1?xd|_Nx#%7`L>RGFOd3O0FCoDMLOO1h7fv+%oS}))xeyL zsxUr}7=aPw5+Z;2G^s{^aw4;n2n8enMuQE}yPt&#pdHuah>XGs*xsS===(}oju4r> zh*ZdXHYJrm_#65*+n?>k(wdJSl4q)B3HD~N%X^S-bdd7%5*tuF4i_oH;ASW3rbolj zI^73R4FN;zX0?qlI$i?-$~IBY&QLC(*RFyXl)DU_!iThY^m)WaA{!Z*c{jL#_~z+~ z<NPuh z4Ntj+i+iDX!A6?E8f_>^ISjRm8uzSRA znErx&gbq>|y~#~i4Y3Zu5gfhQ;Gnm@1>9!4#gv1$x=lGAYndsh#OgEUJZWu08dJ_Q z?7enV&hyr_jDE?wo`r8%!wAnAOX&icWPb{qIb>NPez&gK+65+T8yOI=QG@1E3v4ni zS4GV7(!VMvacJ)fq{T28+!cc;@$k`q3n%tAE$Me=MBt*$79^1G120tgN9Z8hXLBEd z>Hx7pUUvN@7Mm#FMw)~s=m&If%mBkF%ofu%zt%Umm45G!p9+Wcnvt-EDQ@ut`jxmJ zX@~ab$+%IN0l3(cL)X|0@_(L!ye+?^`UmEHtp460egg(S0f$!~;c$MA%^v)+$ESgV zXg-5xHLLkeK+3NTWu=g05+~8WeSXuxZyNYb1HWnDHx2xzf!{Rnn+ATMF|pl@=Dsip2S=P=f0E1{9V`TwQA+q@uh6-wOhOXIHWcRia8%n{qWLe|>fB zoyew&>fq-ZD#~lhXV>70TH+@bGc#zJ8bLon)3_Yvy4`^#%Ato24% z>MQRGRHDKab#p51*UlNF;Bm4Kht|E06x4t;HI`y`VS(UrTB^!x=hRfzkKkrpJ7*?I zRU}t7R#q(ZS@71EWo~(OP30Vd2M-@|6E}Dv7id7KMp%GYW(;09lUr0?Ph}cmK|4|l z)l^y<0zO||y}yqlO*O1KUuCUjPIZH?rhIX{%^Og_K+T-9%`}9YTrwtqR&mKB_xM6? zYSAq3qzNSx3MP1piEz3+t`gU*sqXR42~!Cu;m5gVjhRp|xtNS-FDP+O>0w|{ z@no-e!lV+HQ{h0O@qCf1hbS(=59TVA%886;fvZ4p6^uKVZPu8{9#3(>B$sP^PlQsI zStZlFXJu-zSxz_anNX;(7kJ#R@g=i7?&1=z!OzWEP+1$8g(l?&FW?5xMNm5%e{;FP z4G0_N;=+fWyLHs9+>D}`+>)Xt+^t2oa)s3keB7Ao`pUU=ja(jgGdGkQ#tr9g;qo~f z=dNq0TsXgcL__u6mG(T^H@v2jeYk6evJZF7P3*&6lgmE8N-?{>ZhmDgGf8}P-S*Dg z^!e^K1?j%+iO1>l8tA6m(9~$}5uEPw)RDeaj$W7HK9ORvXYic;AK@H?uOe(jxE0|lgu`);xgKEv;WmWNBHV{?9m4Mr3OGumx2bPOn2+!f~BW%J^-~SN)1K|${c^nR>_vW~I9NFh0^y4N`3Bnb)?y~{m)i0x**t9)@ z3#?5Dn{ZWh9l|dVb|B1pEf&k_%W(%@kHyv^j3Imj;Rm=b{t3d~o1kaBKGA^Cf$(R9 zeuS0bSZoc#f8pe88^TL)it#hTwFsU4aBCK)kgW*UB3zGfFT!mIZQF66iSR>&1|!Fv zM3{|m(hh9-BCJPvJHnki(T;?-$6{fGhY)rltl5QnBYYg8!G!%?gcgMJcSCOor@jR{ zK)4yV7FR)iCAM*B9xO&_9M7vjxKgo6;_@4&ryGbUn6`8;ixXOJHiJMoqhR0&D8;Qf&3)vZOjk$avL2fb;f+BF&7z*Hd;^sC7VG=`ZNBbkb}!s99Kx?gB(`AU>ZFtoP68c z?Qa$PL%7JvGYo(rE zR!^eor67tcr8p<$mr~TnXmIuAjRwl|4a7Gh-cRu;?1QA=P%6vQN&0o7_GQLw06prZ zM*IQkUP3x_fA%5FfCI~aXfTpF0N7e!e8M#nI}E-$Z1+1rfB4>RkW+` zB;crhLIY4O&I4y7t4EOUUgYbbe9`v7lwxBRDlyuaEf{l)jpl+jrgv(?FnGTP?>)qe zGOkKNRqrPq1kNaZPWJacys?c1`cm z#@61cJ5t!w+TOP# zW5MwwJyRc?go5Pbu^spT;13f%p~ns|CZtsMF=iF+fFj>E8pgot&;X=Ve#hHjB{^xZ zg$AS@L1`hg5i&{N1AspYd;#IC{wY&f{{v~o-zdZ%K>R_9XXPJ9`Wc5j-;FmN$ss@E znWtm1>xmEYgH$BLXzIo+|7OJh8}W}(ywm7QdB|w6;PFY|gP%b=p}$hP`%}hZz_jXA z^>f4%2G59RW3d$2HI*@#l6p)RA0z;k;qNQ(WWi6lhVdW zQqJF(D39ln#~JuVdq^Lw9{-m-yeSivdK4J5VFlns3N$6guU1vGAvekU8NrW<_|ssEIvY%o?$F#4u4Vu`V8Gzk$ny+$EuMz*JxoZ!Sv#RoUx25J6$>$xJ2_m`R2_ zTR?hxx_f5Y^o#DVCo@Wx$UroR5KD~_d_>sF##$dxY{jSxL>_^afULwAEZB{T6e#6} zWzC`>?C;$BJ3U{2>2DwZZ0%PyeeV68bI*O9d+wvZzJoR9I}vuae5F*?j+Z_JJ_O#+ z8@$Lqm}0LO`aEC-@c#|`1&y}AV4RFz8ru>Ps}^Tx{mS`}-3Hk|-YwTr;<00E$}ftA zidEX)gbJiX5M_htlb~l~?Ymjh*)e1DfR#nYk;-Kua}R@Yh)u&fc_Y%~S+2>*l2|30 zYSVEx4>I#0^YA@bt4aG?y(rHl)-nUpizBKGEGfIJzki8!x0e00ZruYL+Jrd?^D<_! z$cpB9S#0HIq&o@g^vwwS?7LUy+o?XbW2g<ej7@rWZ-~L(eMcd69a!F2H!dS=L>f zB>&0jmtm-n#ggdyOe_hj9ks*JPO}^;;=AIBPL>KBk8Cl-&E;7F)z<&XG>0A;A zwhGuW*k6nyEMsE>$Hs-QQ5hJbcN{WHA@ennvF*78UGxRpRjYe)(uA46_ z;2-mYH{ZNY_;{qOHvp>uJJ%v^PTB@+Gcc`RWEJN>;Ew?x7uku}tYOqw?EX>UXJha7 zlHhi{z{EGnT6=QZrLm2X$WyU6EEc7E4uMWJud`y0kGQySdDsan5w7vi6r>n1%Fcb&^;N6d{V~fRfx*|@zi^<{*-<| zS&y<$*v#Z~tO6pJ$CArqg9FxQEsYI$vE<^|;8KkqZLx0Ou^;;PK>r5G+pd!^!%Rl| z(5+X94|ot(hJ};Q3v@oX7oy_VXJK#JhCS{}lGe5f{l{SB*UltdKU@g8haq^9^pYnVsD`@sWv>keU)i_Ka?{1EV81OJKO8T8W*H-Ehf{5I^>GlJWCVm=Xn7LWAV z6%stLlsAsO_Rk>qoXD+^HHdAG9?0E`w!})jbz4eW*~f2q2I^UV?K!>vuqLgV#V za#?IJ6-)NU2J*gjdK_uDA?0i1LM$vixuAdQ)504tYz$c&h^svNMvbjCnoi~FlFyXcn|)z zN1}tR7fWIf2ciE=oQYh3utD8d(;f~3PXK>f@D%Lf@7-E+1_pW?&Pp~>9^*B8JhoZZ zv2{LZZR{M#WFYg;A``hYHmg52Lwtdpqnw5F6}$HxalYEEZec&*XTcu?e+9y_HlK`q z!mrw{Z$1r~TOf0eY!KiRZk0Kcd(FVyw**zk@@Oa8;4Vn*#-D4CtASk&tj~uO zeKfYMtuwa0EwUVeUOUKsi2X+;(USJtueZW=%TTQGcsRyF54lL3A>ki~- z{oPkkhI??{c31%0R+nOR?0CDu`xMH58hLAB-|}?hZ$Efjz{?2$|9>kirRjXg?nQdt zS~*c_)kJn)eh1Fkc0&)gPygr7#)QkVgY>I+y7(}DtR>Gk7|~=9e_M6hDnf*rM-RrLFIjKNgDseSH2>G$ zboBvfMc-ijAkN_B!ML&Y)pkD2_%B%SKQbOLBbWI9!RPkJTNh#>?W2cu4e2oH80jX` zt)x3hcaiQTJwWk{%#^p7aRm^o4AH(z&DyNqb1wkPefM zk!~X0O1gt|7wKNo1EkNB9wD9n0p?FSmvkX%52=$1|9tc*$CF{DzDN)aE8WU@#z{}{ z)vqdlBmKMjSEUbDT*}0=j!L=&{#5_Hf9-JnRKBMFKuI}{Dqr*e=?%?%jj8^ZKB-7E z)%4emH{%jZ;7`+kuSI&{Yx=(mq!*q%thUkm53>H9j%{YzRTlo0aG-q>uFuj&9 z$lo5&9}lEw)M$F;2kk#W!46VwAMGDauY9#%;uYAp4 z`I^7-HGk!6{>s<6L&VpgRyJL-$eT4Q%+*Dru!Qg|19ILl75c# zFzFWq@h>xeh%}h5#$O;`^{PHir?|>JLHQ+JT_23k>#Sx*<9+#3eLQ|q`-1k4bLXGs z0;;|xjiT{(ssr;$L`}pz)Dn-H7h2-e8s`W;HCU@1(>On9#-|%SXK2QcHM$>f#%CDa z$2a5089g6p#*c5DBQ)c0abIHlL4>0?ZHadTK#R{b13KV*?5K$uJ%{nZ(1XMO?S90C zqh^-rrv3Q2Q8U}@{#!qy@+UUVb^P3@ImzgGPBVV8(REfceu`;zZV)x6nms@9OS*8> zysdFw?7UXhI;L1y`~Wt|0elP?{|Pld=Y4yInBJv`s%#5 zl(_j9C#d)`L`BcXsprFvZRGe^^cRn^@lC{M5!Z6w1YGprECt4MvLj|IsNma)f1dbPK}G+g0X;h@zhJo&{2=A;B3>k3 zB>qFPv{6hrZPy8V9-xL25@m~?Y@p1>)cf1h%SK@k(f2(7g zYmRsI-L=92_I)n|{{w$g-$Sgg_Sc_?KNGc)9PzYWEe=YLQ1)KqqJK^RUqg9wh>8)H=PHYzY~uS|yw?$vru>tEa*hz+ zAHd~b|4Dn!9drubNj)C%F5*8YzJd7L(+-e!lt=Du6+Qh!F8(n`%&o+~M|?B!uM$sW z9AMvRLh#$f_4@|<9usi6W=Hhv_a&WP-;y-hGD) z#jNNR#M_DMzA{dHA@N<5x9<*t*9~0kD#3P8JL#jmeh>2*>bXMo7aVXq@hovY54nzb zk+`12oJ)M1xSs!L`L8Fg=K|xD{~Yn}mK^XB@jHm$UUq=C=id>JRvbQ;^7jzebCuhO z%dO60KYCs@NnF-vVn2GmMRn$J;<|oC)IJBOr-ut<`)&|8FH-&x=fMQ*L!Or@KTvh? z4UU*U5`Uby)^|20CMoClYfkVI%D;>F5#pB;e?Raxte0kSU34t*`IJv^;#L3i3iCaF zy%V(W=pcA8<#j*MNj*Kpb)WGQ;+GR&HsOE_@j>GHz2S4j<@ZujuP=Vw0rp)R1Sg2= z_mH|ixskYjPx)@@`8;v`KJ*jBzfN4gFU=DF7I16-0YATs^7?(NeMbgq9w4sgy7s*n z;QOqelg&o@+c^7o5#@ECrTgkW;<|r(n&sI~T+a<-MqT=Jkb^oaN^~7}_srb#nTdl*t1YFvG&xe^I$(M;A z4&dJ+-jQgQe*n1H^E|c#&CvXl#gE?Cyh=SA1A64Q1a0Q%{n44gTb2JT;8On0)MI}u zg`zDazMl@GoyG06`cE)}-*CV@;=RP<0em^|R{4gt=NhYLwt4OcRO}x;i9-ZD=|8XJsDIxe77N2RhY;lD|cJ`ScBEKXAzcK`$f%Z8O_O^xN z;xDOxG(`RrA^0sJ_}48y(;V({igkbboe=rGA^1;2@aKTXS!O?ZB}D#MOx&&d{j?DL z>@ZyPM~*&Mk>7zxdw%0GR~lWf_J`=XDg-Zw;2T5muZQ4whv4^x;Qttc|2zc$O$h#n z5c~u#0v$I5{QeO9i4go?2>t@_ILquO5scqiE&SUFc3k@epd*7pT%dIH)wC~W9E+#FLgTr(}#V27NY0b z5d3!`_@6`Yw<4ofcJ;Op{5`;DN9LG0T!*ljro+n5G|#a8?eAB?yeLFZe+WKE{raAV z>Mv6NooqKA>)7Avv?~8+LiBH=o;c^P95awR2gDDIv;DtG{O%AvKMKM3h2ZjgpH}6R z-~6<~-w44^!jhtu{5wPN_lMvYS$w9M-RCN*`>Y<|v*bJ~(7!7}^khQtdxPCXkWCM_F4UxYi1pi(L{%{C>Fa&=w1ph+_e*8>nfB4l; zxq^R*-RF4=IqmJ$bT&M9+#4 z{G-(K7LNDB?8|hBd@%%{2*Gcpe*NCl{yqhH+!P{zM+kmT2yXJFyw{$Q3#a5W=iv%4 z65M!|S!YVQanG|?SzS}ldqywPs^&7DS1y)Irj{!R!C%ePD_LALHk7Vb$~7}IYH%T! zSI!jjxsqqb?S)&}da*cRMsgmsdpWbdn1&XUtxS*)xT>;*#tZo&Q_GKJMhjV!Ddf_n zdPQ=~;A$@~Cm~#nRjzwAlde|Nr4b8d%BA7_NWGdf)tubw#6mzC<;j`adQ%%U8I&tm z&1Hvi#hQn!xQgi-;tiNlslAlAS}uDPuWE!&)wE_Z^=b{5u4Sv~^{6>0bbDwueUfxB-eoJi=${bZB8k^i#IC8OUul<+(ZTS zQ^``jSSV-Kq1@}tNHskKcFh#il?v*HE7J1A6DFIl+HPydEp%Rc2YSzQO=J6`JzuM) zf!cnPmd%Z$Cv)1cB0Z9>pawZ_xLzpK&;_{kssyW%UUZ6zC=V_=6B*Yp5-JX-GahU$ zQ_@B)kBk(=QjBLq+653UWpiU_3oVP}RnF9F#(w5YW?jBeV0YFk>GdUdA6TY{%hu## zFe$cFey9!uE!9*FqxdIzP8&K@I;m1ESK868H5ck&4@heuOV=G<-h&13hA#(=y^SOXpi z)528ig`Bk^HM#X^DZ_aeK%JPVy;HD;ag3V-GwWbC1|z80=nN4OnG||tVtylZUL$mV zBeVbm8eXA}e`+9(sG1we%VZ*I$?&ZxOy?=yiqFUi>1UNHi=?DqeSCUm6Y>2j10s2 zP2C$VqSivv;~@D0gj1=W6}T)fwRl-~DuvjRWvf$*dkOY-uP~`4eajbh_NA8h^sL17 zd#gGZ^(_{`rp&X=fOCzh?vLOezNKBJC)0&n7+2=J&TLjf00!JOlHJanOfp}}p_=K- z>$&R0N;_6-CfQ}(W)Eu9<*ZYl-$n@MGAb=!!hR;u6*NN+fi zSkkw2QCI4`_Vd~=kRe{nXPdF)uxE2AhzFS}T)k4rXTrVG8+jiyp!|0&yk z=ni*DV{^v2@x0fJB+;^6Qo`=?`cgkGheYP-d`+833MLkTil^X8*5|X{s7bCaiRT$8 zBU>$rZP5V^D%Y~mCf9YMfEDzxZC+QlVme<6lw#QH#=Nr9-n+Tl8@|w0wUL9%5Y1s+ zdDFF;)LDC(t=KRX*Y_q_99jk6r=?m|mRKK#n@nDfwsyiRac^QlYn@z`N-&%fQ&(S;UZGVh+fjA_NW6xM)(T58d7D_cD{_3!3-A5 z+$&unW4Ax;VL6yep~2|OBqNzOvBbgcvDKsNfwvxWogVBJbCmPhwQ|bMOtzG6^0B>J z3#9JEwV3N|{^IK!Zby6~lVS~#?2?J5A4?pT6h1(!V@JLl^H?vUr2`qjzT|#f$tSZ6 z{vTJc=Do^Me#;rYwBJe?QN~+Zf+xYDO2QD$8#GrBG%H^xpC_MS9Nq$Lv}K*n0Bn9bL}Igdizj4U&x-D&l2ifwDeqA z#9Q8I8vDZb>_kZn-cs!NEC*|g8rI@Xkra5fzvb1B@a)7TUmmQ<1j6xiaVi}?(SfE}oOwAQcct-w zd@#Kn&mF;U$hG|XyLzSieh`i+?W5;%jGAQ#;Apl{{zTMqlx`O$9(+w|+ey>wdzr0ifD`w;(KSBIUD> z7MN7*)Bi|b{%12H{`C5L0;TpYUtfY*3@iOYAibWyDP8;#Ut$C`oucx-pg({8eS%Up zpNiYIYD5s&jz3AS?Qa3Zm39Xz92cJN*@>_}y}qxa)T2FXl7Kq1E0A7)7ooJ{Bu(k4 z_P?Tg5Wtb69Rq^tdoBY%l-N{%yVz7*_3Q%!Z(TLg>+dX*|HJeLkyh%j)ztUb2bn(6 zXjlm0iQCVqkKZ6Dwx{X!cN^R9buw|LSNqg*s~!9vV*dQ~_Z@rgcj@Oj()iT$N?!@2 zZ@gEu$0gaR1)~N{r}Xte`aMrM!95Q;n#A{k{wMB_ARIyAMVDry-(Spm!U-PwZ`$uz zq?h`4IPu1(rjIue7Z6!_{4|h-P< bk51*Q=xhYE?urS$^)(lhf8XnW0#Wmy2uxby diff --git a/.suckless/dwm/dwm.1 b/.suckless/dwm/dwm.1 deleted file mode 100644 index 13b3729..0000000 --- a/.suckless/dwm/dwm.1 +++ /dev/null @@ -1,176 +0,0 @@ -.TH DWM 1 dwm\-VERSION -.SH NAME -dwm \- dynamic window manager -.SH SYNOPSIS -.B dwm -.RB [ \-v ] -.SH DESCRIPTION -dwm is a dynamic window manager for X. It manages windows in tiled, monocle -and floating layouts. Either layout can be applied dynamically, optimising the -environment for the application in use and the task performed. -.P -In tiled layouts windows are managed in a master and stacking area. The master -area on the left contains one window by default, and the stacking area on the -right contains all other windows. The number of master area windows can be -adjusted from zero to an arbitrary number. In monocle layout all windows are -maximised to the screen size. In floating layout windows can be resized and -moved freely. Dialog windows are always managed floating, regardless of the -layout applied. -.P -Windows are grouped by tags. Each window can be tagged with one or multiple -tags. Selecting certain tags displays all windows with these tags. -.P -Each screen contains a small status bar which displays all available tags, the -layout, the title of the focused window, and the text read from the root window -name property, if the screen is focused. A floating window is indicated with an -empty square and a maximised floating window is indicated with a filled square -before the windows title. The selected tags are indicated with a different -color. The tags of the focused window are indicated with a filled square in the -top left corner. The tags which are applied to one or more windows are -indicated with an empty square in the top left corner. -.P -dwm draws a small border around windows to indicate the focus state. -.SH OPTIONS -.TP -.B \-v -prints version information to standard output, then exits. -.SH USAGE -.SS Status bar -.TP -.B X root window name -is read and displayed in the status text area. It can be set with the -.BR xsetroot (1) -command. -.TP -.B Button1 -click on a tag label to display all windows with that tag, click on the layout -label toggles between tiled and floating layout. -.TP -.B Button3 -click on a tag label adds/removes all windows with that tag to/from the view. -.TP -.B Mod1\-Button1 -click on a tag label applies that tag to the focused window. -.TP -.B Mod1\-Button3 -click on a tag label adds/removes that tag to/from the focused window. -.SS Keyboard commands -.TP -.B Mod1\-Shift\-Return -Start -.BR st(1). -.TP -.B Mod1\-p -Spawn -.BR dmenu(1) -for launching other programs. -.TP -.B Mod1\-, -Focus previous screen, if any. -.TP -.B Mod1\-. -Focus next screen, if any. -.TP -.B Mod1\-Shift\-, -Send focused window to previous screen, if any. -.TP -.B Mod1\-Shift\-. -Send focused window to next screen, if any. -.TP -.B Mod1\-b -Toggles bar on and off. -.TP -.B Mod1\-t -Sets tiled layout. -.TP -.B Mod1\-f -Sets floating layout. -.TP -.B Mod1\-m -Sets monocle layout. -.TP -.B Mod1\-space -Toggles between current and previous layout. -.TP -.B Mod1\-j -Focus next window. -.TP -.B Mod1\-k -Focus previous window. -.TP -.B Mod1\-i -Increase number of windows in master area. -.TP -.B Mod1\-d -Decrease number of windows in master area. -.TP -.B Mod1\-l -Increase master area size. -.TP -.B Mod1\-h -Decrease master area size. -.TP -.B Mod1\-Return -Zooms/cycles focused window to/from master area (tiled layouts only). -.TP -.B Mod1\-Shift\-c -Close focused window. -.TP -.B Mod1\-Shift\-space -Toggle focused window between tiled and floating state. -.TP -.B Mod1\-Tab -Toggles to the previously selected tags. -.TP -.B Mod1\-Shift\-[1..n] -Apply nth tag to focused window. -.TP -.B Mod1\-Shift\-0 -Apply all tags to focused window. -.TP -.B Mod1\-Control\-Shift\-[1..n] -Add/remove nth tag to/from focused window. -.TP -.B Mod1\-[1..n] -View all windows with nth tag. -.TP -.B Mod1\-0 -View all windows with any tag. -.TP -.B Mod1\-Control\-[1..n] -Add/remove all windows with nth tag to/from the view. -.TP -.B Mod1\-Shift\-q -Quit dwm. -.SS Mouse commands -.TP -.B Mod1\-Button1 -Move focused window while dragging. Tiled windows will be toggled to the floating state. -.TP -.B Mod1\-Button2 -Toggles focused window between floating and tiled state. -.TP -.B Mod1\-Button3 -Resize focused window while dragging. Tiled windows will be toggled to the floating state. -.SH CUSTOMIZATION -dwm is customized by creating a custom config.h and (re)compiling the source -code. This keeps it fast, secure and simple. -.SH SEE ALSO -.BR dmenu (1), -.BR st (1) -.SH ISSUES -Java applications which use the XToolkit/XAWT backend may draw grey windows -only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early -JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds -are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the -environment variable -.BR AWT_TOOLKIT=MToolkit -(to use the older Motif backend instead) or running -.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D -or -.B wmname LG3D -(to pretend that a non-reparenting window manager is running that the -XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable -.BR _JAVA_AWT_WM_NONREPARENTING=1 . -.SH BUGS -Send all bug reports with a patch to hackers@suckless.org. diff --git a/.suckless/dwm/dwm.c b/.suckless/dwm/dwm.c deleted file mode 100644 index 7e39e0c..0000000 --- a/.suckless/dwm/dwm.c +++ /dev/null @@ -1,2363 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin, - ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -typedef struct Pertag Pertag; -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - int gappx; /* gaps between windows */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; - Pertag *pertag; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -static void expose(XEvent *e); -static void focus(Client *c); -static void focusin(XEvent *e); -static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void manage(Window w, XWindowAttributes *wa); -static void mappingnotify(XEvent *e); -static void maprequest(XEvent *e); -static void monocle(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void scan(void); -static int sendevent(Client *c, Atom proto); -static void sendmon(Client *c, Monitor *m); -static void setclientstate(Client *c, long state); -static void setfocus(Client *c); -static void setfullscreen(Client *c, int fullscreen); -static void setgaps(const Arg *arg); -static void setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setup(void); -static void seturgent(Client *c, int urg); -static void showhide(Client *c); -static void sigchld(int unused); -static void spawn(const Arg *arg); -static void tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void tile(Monitor *); -static void togglebar(const Arg *arg); -static void togglefloating(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static int updategeom(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatetitle(Client *c); -static void updatewindowtype(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -static int xerror(Display *dpy, XErrorEvent *ee); -static int xerrordummy(Display *dpy, XErrorEvent *ee); -static int xerrorstart(Display *dpy, XErrorEvent *ee); -static void zoom(const Arg *arg); -static void centeredmaster(Monitor *m); -static void centeredfloatingmaster(Monitor *m); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh, blw = 0; /* bar geometry */ -static int lrpad; /* sum of left and right padding for text */ -static int (*xerrorxlib)(Display *, XErrorEvent *); -static unsigned int numlockmask = 0; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int running = 1; -static Cur *cursor[CurLast]; -static Clr **scheme; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root, wmcheckwin; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -struct Pertag { - unsigned int curtag, prevtag; /* current and previous tag */ - int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ - float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ - unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ - const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ - int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -}; - -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - XGetClassHint(dpy, c->win, &ch); - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) - && (!r->class || strstr(class, r->class)) - && (!r->instance || strstr(instance, r->instance))) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; - } - } - if (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + blw) - click = ClkLtSymbol; - else - click = ClkStatusText; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - click = ClkClientWin; - } - for (i = 0; i < LENGTH(buttons); i++) - if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - unsigned int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->gappx = gappx; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - m->pertag = ecalloc(1, sizeof(Pertag)); - m->pertag->curtag = m->pertag->prevtag = 1; - - for (i = 0; i <= LENGTH(tags); i++) { - m->pertag->nmasters[i] = m->nmaster; - m->pertag->mfacts[i] = m->mfact; - - m->pertag->ltidxs[i][0] = m->lt[0]; - m->pertag->ltidxs[i][1] = m->lt[1]; - m->pertag->sellts[i] = m->sellt; - - m->pertag->showbars[i] = m->showbar; - } - - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, w, sw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = blw = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - sw - x) > bh) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) - return 0; - if (name.encoding == XA_STRING) - strncpy(text, (char *)name.value, size - 1); - else { - if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (!focused) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - KeyCode code; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < LENGTH(keys); i++) - if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, - True, GrabModeAsync, GrabModeAsync); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - - if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw) - c->x = c->mon->mx + c->mon->mw - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh) - c->y = c->mon->my + c->mon->mh - HEIGHT(c); - c->x = MAX(c->x, c->mon->mx); - /* only fix client y-offset, if the client center might cover the bar */ - c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) - && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); - c->bw = borderpx; - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attach(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa)) - return; - if (wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->wx - nx) < snap) - nx = selmon->wx; - else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) - ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - updatesizehints(c); - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) - updatetitle(c); - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) - || &monocle == c->mon->lt[c->mon->sellt]->arrange)) - { - c->w = wc.width += c->bw * 2; - c->h = wc.height += c->bw * 2; - wc.border_width = 0; - } - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - XUngrabPointer(dpy, CurrentTime); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setgaps(const Arg *arg) -{ - if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) - selmon->gappx = 0; - else - selmon->gappx += arg->i; - arrange(selmon); -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) -{ - float f; - - if (!arg || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.1 || f > 0.9) - return; - selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - - /* clean up any zombies immediately */ - sigchld(0); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); - netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask - |ButtonPressMask|PointerMotionMask|EnterWindowMask - |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - - -void -seturgent(Client *c, int urg) -{ - XWMHints *wmh; - - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -sigchld(int unused) -{ - if (signal(SIGCHLD, sigchld) == SIG_ERR) - die("can't install SIGCHLD handler:"); - while (0 < waitpid(-1, NULL, WNOHANG)); -} - -void -spawn(const Arg *arg) -{ - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); - fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); - perror(" failed"); - exit(EXIT_SUCCESS); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty, ns; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - if(n == 1){ - c = nexttiled(m->clients); - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); - return; - } - - if (n > m->nmaster){ - mw = m->nmaster ? m->ww * m->mfact : 0; - ns = m->nmaster > 0 ? 2 : 1; - } - else{ - mw = m->ww - m->gappx; - ns = 1; - } - for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; - resize(c, m->wx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*(5-ns)/2, h - 2*c->bw, 0); - my += HEIGHT(c) + m->gappx; - } else { - h = (m->wh - ty) / (n - i) - m->gappx; - resize(c, m->wx + mw + m->gappx/ns, m->wy + ty, m->ww - mw - (2*c->bw) - m->gappx*(5-ns)/2, h - 2*c->bw, 0); - ty += HEIGHT(c) + m->gappx; - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - int i; - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - - if (newtagset == ~0) { - selmon->pertag->prevtag = selmon->pertag->curtag; - selmon->pertag->curtag = 0; - } - - /* test if the user did not select the same tag */ - if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { - selmon->pertag->prevtag = selmon->pertag->curtag; - for (i = 0; !(newtagset & 1 << i); i++) ; - selmon->pertag->curtag = i + 1; - } - - /* apply settings for this view */ - selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; - selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; - selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; - selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; - - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - if (n <= nn) { /* new monitors available */ - for (i = 0; i < (nn - n); i++) { - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - } else { /* less monitors available nn < n */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - } - free(unique); - } else -#endif /* XINERAMA */ - { /* default monitor setup */ - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); -} - -void -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatetitle(Client *c) -{ - if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); - if (c->name[0] == '\0') /* hack to mark broken clients */ - strcpy(c->name, broken); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - int i; - unsigned int tmptag; - - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - selmon->pertag->prevtag = selmon->pertag->curtag; - - if (arg->ui == ~0) - selmon->pertag->curtag = 0; - else { - for (i = 0; !(arg->ui & 1 << i); i++) ; - selmon->pertag->curtag = i + 1; - } - } else { - tmptag = selmon->pertag->prevtag; - selmon->pertag->prevtag = selmon->pertag->curtag; - selmon->pertag->curtag = tmptag; - } - - selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; - selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; - selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; - selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; - - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - - focus(NULL); - arrange(selmon); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange - || (selmon->sel && selmon->sel->isfloating)) - return; - if (c == nexttiled(selmon->clients)) - if (!c || !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} - -void -centeredmaster(Monitor *m) -{ - unsigned int i, n, h, mw, mx, my, oty, ety, tw; - Client *c; - - /* count number of clients in the selected monitor */ - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - - if (n == 0) - return; - if(n == 1){ - c = nexttiled(m->clients); - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); - return; - } - - /* initialize areas */ - mw = m->ww; - mx = 0; - my = m->gappx; - tw = mw; - - if (n > m->nmaster) { - /* go mfact box in the center if more than nmaster clients */ - mw = m->nmaster ? m->ww * m->mfact : 0; - tw = m->ww - mw; - - if (n - m->nmaster > 1) { - /* only one client */ - mx = (m->ww - mw) / 2; - tw = (m->ww - mw) / 2; - } - } - - oty = m->gappx; - ety = m->gappx; - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - /* nmaster clients are stacked vertically, in the center - * of the screen */ - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - if(m->nmaster >= n) - resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*(c->bw + m->gappx), - h - (2*c->bw) - m->gappx, 0); - else if(m->nmaster + 1 < n) - resize(c, m->wx + mx + m->gappx/2, m->wy + my, mw - 2*c->bw - m->gappx, h - 2*c->bw - m->gappx, 0); - else - resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); - my += HEIGHT(c) + m->gappx; - } else { - /* stack clients are stacked vertically */ - if ((i - m->nmaster) % 2) { - h = (m->wh - ety) / ( (1 + n - i) / 2); - resize(c, m->wx + m->gappx, m->wy + ety, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); - ety += HEIGHT(c) + m->gappx; - } else { - h = (m->wh - oty) / ((1 + n - i) / 2); - resize(c, m->wx + mx + mw + m->gappx/2, m->wy + oty, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); - oty += HEIGHT(c) + m->gappx; - } - } -} - -void -centeredfloatingmaster(Monitor *m) -{ - unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; - Client *c; - - /* count number of clients in the selected monitor */ - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - if(n == 1){ - c = nexttiled(m->clients); - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); - return; - } - - /* initialize nmaster area */ - if (n > m->nmaster) { - /* go mfact box in the center if more than nmaster clients */ - if (m->ww > m->wh) { - mw = m->nmaster ? m->ww * m->mfact : 0; - mh = m->nmaster ? m->wh * 0.9 : 0; - } else { - mh = m->nmaster ? m->wh * m->mfact : 0; - mw = m->nmaster ? m->ww * 0.9 : 0; - } - mx = mxo = (m->ww - mw + m->gappx) / 2; - my = myo = (m->wh - mh) / 2; - } else { - /* go fullscreen if all clients are in the master area */ - mh = m->wh; - mw = m->ww; - mx = m->gappx; - mxo = 0; - my = myo = 0; - } - - tx = m->gappx; - for(i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - /* nmaster clients are stacked horizontally, in the center - * of the screen */ - w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i) + m->gappx; - resize(c, m->wx + mx, m->wy + my + m->gappx, w - 2*(c->bw + m->gappx), - mh - 2*(c->bw + m->gappx), 0); - mx += WIDTH(c) + m->gappx; - } else { - /* stack clients are stacked horizontally */ - w = (m->ww - tx) / (n - i) + m->gappx; - resize(c, m->wx + tx, m->wy + m->gappx, w - 2*(c->bw + m->gappx), - m->wh - 2*(c->bw + m->gappx), 0); - tx += WIDTH(c) + m->gappx; - } -} diff --git a/.suckless/dwm/dwm.o b/.suckless/dwm/dwm.o deleted file mode 100644 index 395b096cf0bd367cbe22fd73f39171236177ccaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60008 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 r|9{f8yiE2Vx`7I;J! zGca%iWx0hJ8D`Cq01C2~c>21sUt<^MF=V?Ztt9{yk}YwKC~?lu%}vcKVQ?-=O)N=G zQ7F$W$xsN%NL6t6^bL5QqM8R(c+=CxF{I+w+q;fj4F)_6j>`Z3pZ>_($QEQ&92OXP z%lpEKGwG8$G-U1H{@Y%;mx-mNK|p|siBVAj$Z~Mt-~h6K0!}~{PyozQ07(f5fTdVi zm=-zT`NweeJ#%S&{fequZGmkDDC*%x$$Sa*fAP=$`nJkhx1Y~k<8b2;Hq)FOdV=P$ q&oWzoxz_&nv&n0)xBzV8k*jsxheTIy&cCY600f?{elF{r5}E*x)opSB diff --git a/.suckless/dwm/patches/centeredmaster.diff b/.suckless/dwm/patches/centeredmaster.diff deleted file mode 100644 index 6926892..0000000 --- a/.suckless/dwm/patches/centeredmaster.diff +++ /dev/null @@ -1,142 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 7054c06..527b214 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -39,6 +39,8 @@ static const Layout layouts[] = { - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "|M|", centeredmaster }, -+ { ">M>", centeredfloatingmaster }, - }; - - /* key definitions */ -@@ -74,6 +76,8 @@ static Key keys[] = { - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, -+ { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, -diff --git a/dwm.c b/dwm.c -index 0362114..1e81412 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -233,6 +233,8 @@ static int xerror(Display *dpy, XErrorEvent *ee); - static int xerrordummy(Display *dpy, XErrorEvent *ee); - static int xerrorstart(Display *dpy, XErrorEvent *ee); - static void zoom(const Arg *arg); -+static void centeredmaster(Monitor *m); -+static void centeredfloatingmaster(Monitor *m); - - /* variables */ - static const char broken[] = "broken"; -@@ -2139,3 +2141,106 @@ main(int argc, char *argv[]) - XCloseDisplay(dpy); - return EXIT_SUCCESS; - } -+ -+void -+centeredmaster(Monitor *m) -+{ -+ unsigned int i, n, h, mw, mx, my, oty, ety, tw; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ -+ /* initialize areas */ -+ mw = m->ww; -+ mx = 0; -+ my = 0; -+ tw = mw; -+ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ tw = m->ww - mw; -+ -+ if (n - m->nmaster > 1) { -+ /* only one client */ -+ mx = (m->ww - mw) / 2; -+ tw = (m->ww - mw) / 2; -+ } -+ } -+ -+ oty = 0; -+ ety = 0; -+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked vertically, in the center -+ * of the screen */ -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i); -+ resize(c, m->wx + mx, m->wy + my, mw - (2*c->bw), -+ h - (2*c->bw), 0); -+ my += HEIGHT(c); -+ } else { -+ /* stack clients are stacked vertically */ -+ if ((i - m->nmaster) % 2 ) { -+ h = (m->wh - ety) / ( (1 + n - i) / 2); -+ resize(c, m->wx, m->wy + ety, tw - (2*c->bw), -+ h - (2*c->bw), 0); -+ ety += HEIGHT(c); -+ } else { -+ h = (m->wh - oty) / ((1 + n - i) / 2); -+ resize(c, m->wx + mx + mw, m->wy + oty, -+ tw - (2*c->bw), h - (2*c->bw), 0); -+ oty += HEIGHT(c); -+ } -+ } -+} -+ -+void -+centeredfloatingmaster(Monitor *m) -+{ -+ unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ -+ /* initialize nmaster area */ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ if (m->ww > m->wh) { -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ mh = m->nmaster ? m->wh * 0.9 : 0; -+ } else { -+ mh = m->nmaster ? m->wh * m->mfact : 0; -+ mw = m->nmaster ? m->ww * 0.9 : 0; -+ } -+ mx = mxo = (m->ww - mw) / 2; -+ my = myo = (m->wh - mh) / 2; -+ } else { -+ /* go fullscreen if all clients are in the master area */ -+ mh = m->wh; -+ mw = m->ww; -+ mx = mxo = 0; -+ my = myo = 0; -+ } -+ -+ for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked horizontally, in the center -+ * of the screen */ -+ w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i); -+ resize(c, m->wx + mx, m->wy + my, w - (2*c->bw), -+ mh - (2*c->bw), 0); -+ mx += WIDTH(c); -+ } else { -+ /* stack clients are stacked horizontally */ -+ w = (m->ww - tx) / (n - i); -+ resize(c, m->wx + tx, m->wy, w - (2*c->bw), -+ m->wh - (2*c->bw), 0); -+ tx += WIDTH(c); -+ } -+} diff --git a/.suckless/dwm/patches/dwm-notitle-6.2.diff b/.suckless/dwm/patches/dwm-notitle-6.2.diff deleted file mode 100644 index efd5ebc..0000000 --- a/.suckless/dwm/patches/dwm-notitle-6.2.diff +++ /dev/null @@ -1,81 +0,0 @@ -From 969dbbc548f16da5d94630e3d54e9c96c5296520 Mon Sep 17 00:00:00 2001 -From: Ryan Kes -Date: Thu, 28 Mar 2019 14:36:07 +0100 -Subject: [PATCH] dwm-notitle-6.2 - ---- - config.def.h | 1 - - dwm.c | 20 ++++---------------- - 2 files changed, 4 insertions(+), 17 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1c0b587..19330cd 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -102,7 +102,6 @@ static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, -- { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, -diff --git a/dwm.c b/dwm.c -index 4465af1..bcf5cb1 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -64,8 +64,8 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ - enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ --enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, -- ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ -+enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin, -+ ClkRootWin, ClkLast }; /* clicks */ - - typedef union { - int i; -@@ -439,10 +439,8 @@ buttonpress(XEvent *e) - arg.ui = 1 << i; - } else if (ev->x < x + blw) - click = ClkLtSymbol; -- else if (ev->x > selmon->ww - TEXTW(stext)) -- click = ClkStatusText; - else -- click = ClkWinTitle; -+ click = ClkStatusText; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); -@@ -729,15 +727,8 @@ drawbar(Monitor *m) - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - sw - x) > bh) { -- if (m->sel) { -- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); -- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -- if (m->sel->isfloating) -- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); -- } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); -- } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); - } -@@ -1235,11 +1226,8 @@ propertynotify(XEvent *e) - drawbars(); - break; - } -- if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { -+ if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) - updatetitle(c); -- if (c == c->mon->sel) -- drawbar(c->mon); -- } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } --- -2.21.0 - diff --git a/.suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff b/.suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff deleted file mode 100644 index 1a2a3cf..0000000 --- a/.suckless/dwm/patches/dwm-pertag-20170513-ceac8c9.diff +++ /dev/null @@ -1,177 +0,0 @@ -diff --git a/dwm.c b/dwm.c -index a5ce993..45f1e27 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -112,6 +112,7 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+typedef struct Pertag Pertag; - struct Monitor { - char ltsymbol[16]; - float mfact; -@@ -131,6 +132,7 @@ struct Monitor { - Monitor *next; - Window barwin; - const Layout *lt[2]; -+ Pertag *pertag; - }; - - typedef struct { -@@ -272,6 +274,15 @@ static Window root, wmcheckwin; - /* configuration, allows nested code to access above variables */ - #include "config.h" - -+struct Pertag { -+ unsigned int curtag, prevtag; /* current and previous tag */ -+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ -+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ -+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ -+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ -+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -+}; -+ - /* compile-time check if all tags fit into an unsigned int bit array. */ - struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -@@ -632,6 +643,7 @@ Monitor * - createmon(void) - { - Monitor *m; -+ unsigned int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; -@@ -642,6 +654,20 @@ createmon(void) - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -+ m->pertag = ecalloc(1, sizeof(Pertag)); -+ m->pertag->curtag = m->pertag->prevtag = 1; -+ -+ for (i = 0; i <= LENGTH(tags); i++) { -+ m->pertag->nmasters[i] = m->nmaster; -+ m->pertag->mfacts[i] = m->mfact; -+ -+ m->pertag->ltidxs[i][0] = m->lt[0]; -+ m->pertag->ltidxs[i][1] = m->lt[1]; -+ m->pertag->sellts[i] = m->sellt; -+ -+ m->pertag->showbars[i] = m->showbar; -+ } -+ - return m; - } - -@@ -968,7 +994,7 @@ grabkeys(void) - void - incnmaster(const Arg *arg) - { -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); - } - -@@ -1503,9 +1529,9 @@ void - setlayout(const Arg *arg) - { - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -- selmon->sellt ^= 1; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - if (arg && arg->v) -- selmon->lt[selmon->sellt] = (Layout *)arg->v; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); -@@ -1524,7 +1550,7 @@ setmfact(const Arg *arg) - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.1 || f > 0.9) - return; -- selmon->mfact = f; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); - } - -@@ -1701,7 +1727,7 @@ tile(Monitor *m) - void - togglebar(const Arg *arg) - { -- selmon->showbar = !selmon->showbar; -+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -@@ -1740,9 +1766,33 @@ void - toggleview(const Arg *arg) - { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); -+ int i; - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; -+ -+ if (newtagset == ~0) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = 0; -+ } -+ -+ /* test if the user did not select the same tag */ -+ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ for (i = 0; !(newtagset & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } -+ -+ /* apply settings for this view */ -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } -@@ -2036,11 +2086,37 @@ updatewmhints(Client *c) - void - view(const Arg *arg) - { -+ int i; -+ unsigned int tmptag; -+ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ -- if (arg->ui & TAGMASK) -+ if (arg->ui & TAGMASK) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ -+ if (arg->ui == ~0) -+ selmon->pertag->curtag = 0; -+ else { -+ for (i = 0; !(arg->ui & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } -+ } else { -+ tmptag = selmon->pertag->prevtag; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = tmptag; -+ } -+ -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } diff --git a/.suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff b/.suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff deleted file mode 100644 index e6a9e69..0000000 --- a/.suckless/dwm/patches/dwm-ru_centeredmaster-6.2.diff +++ /dev/null @@ -1,157 +0,0 @@ -diff -up a/config.h b/config.h ---- a/config.h 2019-07-24 08:59:14.429282151 +0200 -+++ b/config.h 2019-07-24 09:30:18.841019314 +0200 -@@ -42,6 +42,8 @@ static const Layout layouts[] = { - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "|M|", centeredmaster }, -+ { ">M>", centeredfloatingmaster }, - }; - - /* key definitions */ -@@ -77,6 +79,8 @@ static Key keys[] = { - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, -+ { MODKEY|ShiftMask, XK_u, setlayout, {.v = &layouts[4]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, -diff -up a/dwm.c b/dwm.c ---- a/dwm.c 2019-07-24 08:59:14.432615503 +0200 -+++ b/dwm.c 2019-07-24 09:24:16.192110897 +0200 -@@ -235,6 +235,8 @@ static int xerror(Display *dpy, XErrorEv - static int xerrordummy(Display *dpy, XErrorEvent *ee); - static int xerrorstart(Display *dpy, XErrorEvent *ee); - static void zoom(const Arg *arg); -+static void centeredmaster(Monitor *m); -+static void centeredfloatingmaster(Monitor *m); - - /* variables */ - static const char broken[] = "broken"; -@@ -2176,3 +2178,122 @@ main(int argc, char *argv[]) - XCloseDisplay(dpy); - return EXIT_SUCCESS; - } -+ -+void -+centeredmaster(Monitor *m) -+{ -+ unsigned int i, n, h, mw, mx, my, oty, ety, tw; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ -+ if (n == 0) -+ return; -+ if(n == 1){ -+ c = nexttiled(m->clients); -+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -+ return; -+ } -+ -+ /* initialize areas */ -+ mw = m->ww; -+ mx = 0; -+ my = m->gappx; -+ tw = mw; -+ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ tw = m->ww - mw; -+ -+ if (n - m->nmaster > 1) { -+ /* only one client */ -+ mx = (m->ww - mw) / 2; -+ tw = (m->ww - mw) / 2; -+ } -+ } -+ -+ oty = m->gappx; -+ ety = m->gappx; -+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked vertically, in the center -+ * of the screen */ -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i); -+ if(m->nmaster >= n) -+ resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*(c->bw + m->gappx), -+ h - (2*c->bw) - m->gappx, 0); -+ else if(m->nmaster + 1 < n) -+ resize(c, m->wx + mx + m->gappx/2, m->wy + my, mw - 2*c->bw - m->gappx, h - 2*c->bw - m->gappx, 0); -+ else -+ resize(c, m->wx + mx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); -+ my += HEIGHT(c) + m->gappx; -+ } else { -+ /* stack clients are stacked vertically */ -+ if ((i - m->nmaster) % 2) { -+ h = (m->wh - ety) / ( (1 + n - i) / 2); -+ resize(c, m->wx + m->gappx, m->wy + ety, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); -+ ety += HEIGHT(c) + m->gappx; -+ } else { -+ h = (m->wh - oty) / ((1 + n - i) / 2); -+ resize(c, m->wx + mx + mw + m->gappx/2, m->wy + oty, tw - (2*c->bw) - m->gappx*3/2, h - 2*c->bw - m->gappx, 0); -+ oty += HEIGHT(c) + m->gappx; -+ } -+ } -+} -+ -+void -+centeredfloatingmaster(Monitor *m) -+{ -+ unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ if(n == 1){ -+ c = nexttiled(m->clients); -+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -+ return; -+ } -+ -+ /* initialize nmaster area */ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ if (m->ww > m->wh) { -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ mh = m->nmaster ? m->wh * 0.9 : 0; -+ } else { -+ mh = m->nmaster ? m->wh * m->mfact : 0; -+ mw = m->nmaster ? m->ww * 0.9 : 0; -+ } -+ mx = mxo = (m->ww - mw + m->gappx) / 2; -+ my = myo = (m->wh - mh) / 2; -+ } else { -+ /* go fullscreen if all clients are in the master area */ -+ mh = m->wh; -+ mw = m->ww; -+ mx = m->gappx; -+ mxo = 0; -+ my = myo = 0; -+ } -+ -+ tx = m->gappx; -+ for(i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked horizontally, in the center -+ * of the screen */ -+ w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i) + m->gappx; -+ resize(c, m->wx + mx, m->wy + my + m->gappx, w - 2*(c->bw + m->gappx), -+ mh - 2*(c->bw + m->gappx), 0); -+ mx += WIDTH(c) + m->gappx; -+ } else { -+ /* stack clients are stacked horizontally */ -+ w = (m->ww - tx) / (n - i) + m->gappx; -+ resize(c, m->wx + tx, m->wy + m->gappx, w - 2*(c->bw + m->gappx), -+ m->wh - 2*(c->bw + m->gappx), 0); -+ tx += WIDTH(c) + m->gappx; -+ } -+} - diff --git a/.suckless/dwm/patches/dwm-ru_gaps-6.2.diff b/.suckless/dwm/patches/dwm-ru_gaps-6.2.diff deleted file mode 100644 index 7ed05f6..0000000 --- a/.suckless/dwm/patches/dwm-ru_gaps-6.2.diff +++ /dev/null @@ -1,126 +0,0 @@ -diff -up a/config.h b/config.h ---- a/config.h 2019-07-21 22:43:04.535873031 +0200 -+++ b/config.h 2019-07-24 08:48:08.038433535 +0200 -@@ -2,6 +2,7 @@ - - /* appearance */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int gappx = 5; /* gaps between windows */ - static const unsigned int snap = 32; /* snap pixel */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 0; /* 0 means bottom bar */ -@@ -84,6 +85,9 @@ static Key keys[] = { - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ { MODKEY, XK_minus, setgaps, {.i = -5 } }, -+ { MODKEY, XK_equal, setgaps, {.i = +5 } }, -+ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) -diff -up a/dwm.c b/dwm.c ---- a/dwm.c 2019-07-21 22:43:04.535873031 +0200 -+++ b/dwm.c 2019-07-24 08:50:44.989360476 +0200 -@@ -119,6 +119,7 @@ struct Monitor { - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ -+ int gappx; /* gaps between windows */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; -@@ -199,6 +200,7 @@ static void sendmon(Client *c, Monitor * - static void setclientstate(Client *c, long state); - static void setfocus(Client *c); - static void setfullscreen(Client *c, int fullscreen); -+static void setgaps(const Arg *arg); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setup(void); -@@ -638,6 +640,7 @@ createmon(void) - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; -+ m->gappx = gappx; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -@@ -1282,6 +1285,13 @@ resizeclient(Client *c, int x, int y, in - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; -+ if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) -+ || &monocle == c->mon->lt[c->mon->sellt]->arrange)) -+ { -+ c->w = wc.width += c->bw * 2; -+ c->h = wc.height += c->bw * 2; -+ wc.border_width = 0; -+ } - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -@@ -1498,6 +1508,16 @@ setfullscreen(Client *c, int fullscreen) - } - - void -+setgaps(const Arg *arg) -+{ -+ if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) -+ selmon->gappx = 0; -+ else -+ selmon->gappx += arg->i; -+ arrange(selmon); -+} -+ -+void - setlayout(const Arg *arg) - { - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -@@ -1673,26 +1693,35 @@ tagmon(const Arg *arg) - void - tile(Monitor *m) - { -- unsigned int i, n, h, mw, my, ty; -+ unsigned int i, n, h, mw, my, ty, ns; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; -+ if(n == 1){ -+ c = nexttiled(m->clients); -+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -+ return; -+ } - -- if (n > m->nmaster) -+ if (n > m->nmaster){ - mw = m->nmaster ? m->ww * m->mfact : 0; -- else -- mw = m->ww; -- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ ns = m->nmaster > 0 ? 2 : 1; -+ } -+ else{ -+ mw = m->ww - m->gappx; -+ ns = 1; -+ } -+ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { -- h = (m->wh - my) / (MIN(n, m->nmaster) - i); -- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); -- my += HEIGHT(c); -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; -+ resize(c, m->wx + m->gappx, m->wy + my, mw - 2*c->bw - m->gappx*(5-ns)/2, h - 2*c->bw, 0); -+ my += HEIGHT(c) + m->gappx; - } else { -- h = (m->wh - ty) / (n - i); -- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); -- ty += HEIGHT(c); -+ h = (m->wh - ty) / (n - i) - m->gappx; -+ resize(c, m->wx + mw + m->gappx/ns, m->wy + ty, m->ww - mw - (2*c->bw) - m->gappx*(5-ns)/2, h - 2*c->bw, 0); -+ ty += HEIGHT(c) + m->gappx; - } - } - diff --git a/.suckless/dwm/transient.c b/.suckless/dwm/transient.c deleted file mode 100644 index 040adb5..0000000 --- a/.suckless/dwm/transient.c +++ /dev/null @@ -1,42 +0,0 @@ -/* cc transient.c -o transient -lX11 */ - -#include -#include -#include -#include - -int main(void) { - Display *d; - Window r, f, t = None; - XSizeHints h; - XEvent e; - - d = XOpenDisplay(NULL); - if (!d) - exit(1); - r = DefaultRootWindow(d); - - f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0); - h.min_width = h.max_width = h.min_height = h.max_height = 400; - h.flags = PMinSize | PMaxSize; - XSetWMNormalHints(d, f, &h); - XStoreName(d, f, "floating"); - XMapWindow(d, f); - - XSelectInput(d, f, ExposureMask); - while (1) { - XNextEvent(d, &e); - - if (t == None) { - sleep(5); - t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0); - XSetTransientForHint(d, t, f); - XStoreName(d, t, "transient"); - XMapWindow(d, t); - XSelectInput(d, t, ExposureMask); - } - } - - XCloseDisplay(d); - exit(0); -} diff --git a/.suckless/dwm/util.c b/.suckless/dwm/util.c deleted file mode 100644 index fe044fc..0000000 --- a/.suckless/dwm/util.c +++ /dev/null @@ -1,35 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} - -void -die(const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} diff --git a/.suckless/dwm/util.h b/.suckless/dwm/util.h deleted file mode 100644 index f633b51..0000000 --- a/.suckless/dwm/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/.suckless/dwm/util.o b/.suckless/dwm/util.o deleted file mode 100644 index 59a07457a785bae0ce4bed63b5ac76e960595509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2224 zcmbVM&rcIU6n>>u3Iav+fWbpeM$;y;X*C8UYFa3;kd1(r7(G}^yM)G;HruVKMk7Wv zX$T2_fCm#j8sfpD2~9kpC-q`H5>6x%e{k`l;CtJdbh2(Qyk`2n`QG>5%)Z&#hr`-P zlgkCdTyP2MGr>W7ug2R);-K?kul~~mt)Mo9%G&mXF9jgfrST{v~-SKGoU{Hu!p58KXz8t z-=7!mx9<*=j;#4HW@*EF7JO@6YZcTQwZvkltbg@MwbZ6ATYIsH8}CxdY&M@702mz_ z8t@0AMrzKlW#&s||9R!C66y^HYYrA7J6Z#9-Ma#=a;K}Ot=YSRt8^oOoX36=Mmsv6 zHjQ^|@K`^O9pkZU9bV2j18v*`zxJG>ZpV`baO2O(+*rxU+#tOilE4kk(yZ>f;r~6? zm_~ID)|0u{j@Tvb-|7`|hjDarjSSRRCthj5_ch?@$errM8t`Mt(>}%itaC$dyn!A{ zW+tnoK+%Rmkk05(G}F3aKw?yz7>sI(iII`3!|_BsI;agN;LdEp$jqCwFk2{@DJY;a zZ-8FTn4s5QNL1hbNz#YMha{;AzH)kei5KW_obHX$9 zY*I1xvI$B$X(mCLDHcI7@-!iNSP6rY%I9+WJWA&Crml=$p6)H0$<%GsQMNvpm^G3) zU2J3D=*LWYWc!VXAV=21`%#;E-*LUwP3F>LryDHY4GALcdBAj&4z7yA`4vA)0v2FMQy0mmsWIAP;OokG?9X!@V@~Jyl}I%4Ty%bvEAqwp(K7b6k%ISpeS!3i5H%<+@>|fi epB=?lI5|ZV$?R>R@3T|Bmw)=_q+D|C`TqcZ6$B~( diff --git a/.suckless/sselp/.gitignore b/.suckless/sselp/.gitignore deleted file mode 100644 index c190512..0000000 --- a/.suckless/sselp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.backup diff --git a/.suckless/sselp/.hgtags b/.suckless/sselp/.hgtags deleted file mode 100644 index 07c9150..0000000 --- a/.suckless/sselp/.hgtags +++ /dev/null @@ -1,2 +0,0 @@ -effa85f232313bdd7855a83941d42e28ccaf8808 0.1 -5293716fdc7c4c31e2936ec52d684b403356e747 0.2 diff --git a/.suckless/sselp/LICENSE b/.suckless/sselp/LICENSE deleted file mode 100644 index faf1c09..0000000 --- a/.suckless/sselp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT/X Consortium License - -© 2006-2008 Anselm R Garbe - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/.suckless/sselp/Makefile b/.suckless/sselp/Makefile deleted file mode 100644 index bc23d57..0000000 --- a/.suckless/sselp/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -# sselp - simple print selection - -include config.mk - -SRC = sselp.c -OBJ = ${SRC:.c=.o} - -all: options sselp - -options: - @echo sselp build options: - @echo "CFLAGS = ${CFLAGS}" - @echo "LDFLAGS = ${LDFLAGS}" - @echo "CC = ${CC}" - -.c.o: - @echo CC $< - @${CC} -c ${CFLAGS} $< - -${OBJ}: config.mk - -sselp: ${OBJ} - @echo CC -o $@ - @${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - @echo cleaning - @rm -f sselp ${OBJ} sselp-${VERSION}.tar.gz - -dist: clean - @echo creating dist tarball - @mkdir -p sselp-${VERSION} - @cp -R LICENSE Makefile README config.mk ${SRC} sselp-${VERSION} - @tar -cf sselp-${VERSION}.tar sselp-${VERSION} - @gzip sselp-${VERSION}.tar - @rm -rf sselp-${VERSION} - -install: all - @echo installing executable file to ${DESTDIR}${PREFIX}/bin - @mkdir -p ${DESTDIR}${PREFIX}/bin - @cp -f sselp ${DESTDIR}${PREFIX}/bin - @chmod 755 ${DESTDIR}${PREFIX}/bin/sselp - -uninstall: - @echo removing executable file from ${DESTDIR}${PREFIX}/bin - @rm -f ${DESTDIR}${PREFIX}/bin/sselp - -.PHONY: all options clean dist install uninstall diff --git a/.suckless/sselp/README b/.suckless/sselp/README deleted file mode 100644 index f76ab9f..0000000 --- a/.suckless/sselp/README +++ /dev/null @@ -1,24 +0,0 @@ -sselp - simple print selection -============================== -Prints X selection to standard out. - - -Requirements ------------- -In order to build sselp you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (sselp is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install sselp -(if necessary as root): - - make clean install - - -Running sselp -------------- -Simply invoke the 'sselp' command. diff --git a/.suckless/sselp/config.mk b/.suckless/sselp/config.mk deleted file mode 100644 index ede4ad1..0000000 --- a/.suckless/sselp/config.mk +++ /dev/null @@ -1,23 +0,0 @@ -# sselp version -VERSION = 0.2 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# includes and libs -INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 - -# flags -CPPFLAGS = -DVERSION=\"${VERSION}\" -CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} -LDFLAGS = -s ${LIBS} - -# compiler and linker -CC = cc diff --git a/.suckless/sselp/sselp b/.suckless/sselp/sselp deleted file mode 100755 index cfae47920ef085ea43bda977af2be3d1b6e0c94c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14480 zcmeHOZ)_aJ6(67N#1L{mXj0rHkZt5tmx3>MPHZ_)mtDty_R!(Fu^mhyTrR$KeC2$1 zy;}zdpm86I(%tg%EAAbe%KfSdSaL2npZW3GtBKm^>|zdRHclS`KplnGHh7DZ%E4x!65NsyGw7$GbHxRU+r3-C8Bz;`adcPzj^y8wRxcm+0RDTf4I zDbAx{cqQJufIUtpSF-;R@Ct0s@*)sdvVU^{z6tm>&PG7~`vUg0z+cO1*rW;-C^W9t zK>R*-eTf%Z#u_+Z!w#v$2wW$5YNw=y>$e{-*G3kN=FC|CebN5G`=SG}M3QBO&Hlky zmgUTNde~$GAm`Y?{n>p@$~&&*>uLpnxJma8V2iwZgNJ+Wpg^U3$)!v(&#r6=@jehG)By} zT}H|T)2tCQjqb!yCTWPqSk#Ee%oqf?BbO8L0hNlgj!3v=bF@CNu~e%MG(cK$kqOK0p00OC*+}|1JD{F*dv+0e21$Yegd{G+)zoFpU!dlvz0+ z6Q7a%0hOyu*A2;MZWBDtDHItpvo_v7kLGQ>yp{0==4`x|Gh+9Njlb5$)AfhcC9#XV!l^ZP277;92R1$o@4sH&(TN4Y~rS8*?F zuNGCl?^1<;_Bc0E=~G1w`D=&-+^z}%c{s79GN_6w^3^4lv5bwUdlRZhZ2WadxW&zY zn*lciZU)>8{2ylEV)c#x)W^Eo5Ju7}(4zG>4_Jf)AFsG8wNTWmNBbaCxlu&-XN zLJj3X)D>onP}aVNGCoQaPI38Vl<`rgFwNx`QN~A#!eK5SM;RX_3WvD-8geYw1@=s94N2Nj+mmfzNA0-MZmmftLA0Y}sEkhQH^uh!Gstv`Hz4!F2JUa{5>72Vofn+FU{7yr0ty*|FDN}p)>6Fhn4Z$U5X z#J=g_8hyMW0hU0e-f{`6;P*jihoAIp2fWzS&<3LCb5hvzN-Bx$KJzwm#B&H0xiz`b6D%pt~dMKEpAeFMbMHJoZ_+xjOV0=^wE^h*UObQ&PZnJf`R&*mE%8C>Vv_?y82)!sAwrr3@KZbj#zewaW(7h zX>W>l_iPDwcCcu7cUz>3BsiwBmF2ev0r6%2l?%mU9PpQO#o|H0y&n{d5yXqdVg8xEXLW;AX(hz(N_I^=h;}4PSwQy11267H>TaR)UK{>*Hu~Ea^YGR7|5qm0Vm#?=<|&FYvSmPL+CE z3)UqArZr$Sq8qkcB7t;cOce}%fX31!{pDel)}&o8)NBsFEJKmNYGj4tJ|ol&KQLpV z{^83RKOUgCDST4oa$X(?e39ca!4lYR*3@= zcS+nY@rM$hlK3l$CncVi__oB4B~rf!R8i~Ly!jTz4=c3SDVqZIfe`!_0l!9sHUyc_ zXxaWjC4x)9h5jbe*VTW{g9UPfuwd4V?O=ffE?~{DKq_q-ft{)0z>eVrEGAFHC8f25 z>&)0r#&v_S+#n0Ycc*f@hXk5gp@9{xIb6%i&7=?oUDim(&_UKRNfWzFz}|#KuPguy zcoU#Y^ChkUV=y|9jSU&m!8rJmBs`+AY!+7Bau2FQ!?B@6KlGZ0wqO_F9f-zYxhxCx zr-z1cVeNlhaGc>aOXKHhSs|oxO&!toO){=E#UVug&i_Ne-*4=t!Y)AlYp~h<^RgjA z#bNLC-w67TVQf+VG~W=S9t+JsG|mOf;J;tQdQo zX+EU>oyU)tAfA&J*&xlYgft(cKmK2Z(|-?em=lbT7n&y|(tU^2&hx(;6n1|_`Vr2O zqeMsZY_G!~{wY8diEWMvoBX8}d(`1i_fNv5WGK-Y|D^P%{4+%wN(@Vp!0G=aDDe2n zKcWarLc0D1d-MtaWc+k}ksqDMm%tZI$e-5lpIHwi6u*Gd zp8N?_~kJjoANHHh9ra+Wd(AH%6GgL;wH) diff --git a/.suckless/sselp/sselp.c b/.suckless/sselp/sselp.c deleted file mode 100644 index bf7643e..0000000 --- a/.suckless/sselp/sselp.c +++ /dev/null @@ -1,45 +0,0 @@ -/* See LICENSE file for license details. */ -#include -#include -#include -#include - -int -main(int argc, char *argv[]) { - Atom clip, utf8, type; - Display *dpy; - Window win; - XEvent ev; - int fmt; - long off = 0; - unsigned char *data; - unsigned long len, more; - - if(argc > 1 && !strcmp(argv[1], "-v")) { - fputs("sselp-"VERSION", © 2006-2010 Anselm R Garbe\n", stdout); - return 0; - } - if(!(dpy = XOpenDisplay(NULL))) - return 1; - - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - clip = XInternAtom(dpy, "_SSELP_STRING", False); - win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 1, 1, 0, - CopyFromParent, CopyFromParent); - XConvertSelection(dpy, XA_PRIMARY, utf8, clip, win, CurrentTime); - - XNextEvent(dpy, &ev); - if(ev.type == SelectionNotify && ev.xselection.property != None) { - do { - XGetWindowProperty(dpy, win, ev.xselection.property, off, BUFSIZ, - False, utf8, &type, &fmt, &len, &more, &data); - fwrite(data, 1, len, stdout); - XFree(data); - off += len/4; - } - while(more > 0); - putchar('\n'); - } - XCloseDisplay(dpy); - return 0; -} diff --git a/.suckless/sselp/sselp.o b/.suckless/sselp/sselp.o deleted file mode 100644 index 8a5efbbe5c83611918732bef8a31940eea16e5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3256 zcmbuBO>7%Q6o8-Yq$#D{gz^_?5eqWHsLf(KDijdlO=5eEOcK>jYXqs;IvZl@Kdm=u z0##9!q+(@KawuHk*xt$of`p1oQ?->4R6Qag<$xfSKm~~-Qh0B7#@TMX7kJUky!qbG z%&gze=7V@T;rID~iw|Cb%^9Zv2k+U`W0o2N0d_&(4Akpdsn!>kqWi_~E{M@^__@Al zI1(1+3L47dAu*}y$FviF*!SyQBMEdyBwkt~qXmNrdo2!e>>0YH_A!X_1mgV*^9wD+Je?up+d=>Mm zve@iiI6#J5EQ?}Zvy2XKM=`J1>_+64{58d=Fto6^hMK%WbH%))Twd!^0*mCRG-^Gg z?*jeV3(c>J@yLy|c{^n`74xS{EF@*F+V&+Q7{V0RWd39@^mzB;CzJ>Ex1oE%L_Hq) zBaLo7@?p#*uYd@E`O@aEwDi(YFf_W^?`3*MX`Bl#W3atSV;8Epxol8T=2yc?<7BYM z+6pt{lxai3Ugh$-KjphhTM%K|{B}nxjd>>?`Gq;!KgER7Z~rz%r_E2V(oZ&IuDv-f zza@{$N3TF~aPUPjB;+e0B!1y_N;w2YQwRLeE+MfY7@X7!bsdI%FYqrc)Ne^V^cb=YIbe!g(}a z#I}O1=}!@S4Pg#p0$~DSLb&dig`56yGO9v&NC?S-h&eI$fUupd)_$NZbiiL5?W}>e zZw^2J{O#P42RwL(2k-RY?e`o2$4kp1ZL&4LVA(si?C5^R_qkT?W&C*;r)dDXw$R6r z?1s(#TfZf;C$aTx@y7ecgTLy*6COP6!Qb%Ung^fr;0+J{sRzH{!7qC7FFp7r5B|Le zw{K~w08)A|OkIS!D0Tf%R*MzLC(|PXaymbfNMz#Kd{!Pv$MaA(^g_9Y!$fu3fXUjl zQHR_}O{)wQ>$Q?P2f0+m(DaIIRLhVX)HT)6GR1POq#Y?%CaNcpRVy=^Ze+BQRxpay z3gm{hStCB9RSd`_HN*BB)vGo1nuEy`deP7zm(Vp0aJj;is$-H;wXX3c^ZB}=7LMl& zQ^)g@YO#bzhCb?0=uM*<|7XLNC_xmec&anbW2lpm|9#jvPZC5SPWK?^R7WI~XE!#^ zj}k;7PVWlmb%H3A=U!}_zfTZ_{OQi)e1RYe`R~NW`NsrN-2T^WZ1D$C=l;Jr_(Kl< zw}U_I;IGq#hC=!2o#uJ6jJuyt$>INq!+*xXA9e6^4!+01KXY)p-}$;ndX*;R8IiF5b*-dIg(+34h9)J4$NH>NW4_u{eo|M, so it is mandatory that -applications which want to test against keypad keys send these -sequences. - -But buggy applications (like bash and irssi, for example) don't do this. A fast -solution for them is to use the following command: - - $ printf '\033[?1h\033=' >/dev/tty - -or - $ tput smkx - -In the case of bash, readline is used. Readline has a different note in its -manpage about this issue: - - enable-keypad (Off) - When set to On, readline will try to enable the - application keypad when it is called. Some systems - need this to enable arrow keys. - -Adding this option to your .inputrc will fix the keypad problem for all -applications using readline. - -If you are using zsh, then read the zsh FAQ -: - - It should be noted that the O / [ confusion can occur with other keys - such as Home and End. Some systems let you query the key sequences - sent by these keys from the system's terminal database, terminfo. - Unfortunately, the key sequences given there typically apply to the - mode that is not the one zsh uses by default (it's the "application" - mode rather than the "raw" mode). Explaining the use of terminfo is - outside of the scope of this FAQ, but if you wish to use the key - sequences given there you can tell the line editor to turn on - "application" mode when it starts and turn it off when it stops: - - function zle-line-init () { echoti smkx } - function zle-line-finish () { echoti rmkx } - zle -N zle-line-init - zle -N zle-line-finish - -Putting these lines into your .zshrc will fix the problems. - -## How can I use meta in 8bit mode? - -St supports meta in 8bit mode, but the default terminfo entry doesn't -use this capability. If you want it, you have to use the 'st-meta' value -in TERM. - -## I cannot compile st in OpenBSD - -OpenBSD lacks librt, despite it being mandatory in POSIX -. -If you want to compile st for OpenBSD you have to remove -lrt from config.mk, and -st will compile without any loss of functionality, because all the functions are -included in libc on this platform. - -## The Backspace Case - -St is emulating the Linux way of handling backspace being delete and delete being -backspace. - -This is an issue that was discussed in suckless mailing list -. Here is why some old grumpy -terminal users wants its backspace to be how he feels it: - - Well, I am going to comment why I want to change the behaviour - of this key. When ASCII was defined in 1968, communication - with computers was done using punched cards, or hardcopy - terminals (basically a typewriter machine connected with the - computer using a serial port). ASCII defines DELETE as 7F, - because, in punched-card terms, it means all the holes of the - card punched; it is thus a kind of 'physical delete'. In the - same way, the BACKSPACE key was a non-destructive backspace, - as on a typewriter. So, if you wanted to delete a character, - you had to BACKSPACE and then DELETE. Another use of BACKSPACE - was to type accented characters, for example 'a BACKSPACE `'. - The VT100 had no BACKSPACE key; it was generated using the - CONTROL key as another control character (CONTROL key sets to - 0 b7 b6 b5, so it converts H (code 0x48) into BACKSPACE (code - 0x08)), but it had a DELETE key in a similar position where - the BACKSPACE key is located today on common PC keyboards. - All the terminal emulators emulated the difference between - these keys correctly: the backspace key generated a BACKSPACE - (^H) and delete key generated a DELETE (^?). - - But a problem arose when Linus Torvalds wrote Linux. Unlike - earlier terminals, the Linux virtual terminal (the terminal - emulator integrated in the kernel) returned a DELETE when - backspace was pressed, due to the VT100 having a DELETE key in - the same position. This created a lot of problems (see [1] - and [2]). Since Linux has become the king, a lot of terminal - emulators today generate a DELETE when the backspace key is - pressed in order to avoid problems with Linux. The result is - that the only way of generating a BACKSPACE on these systems - is by using CONTROL + H. (I also think that emacs had an - important point here because the CONTROL + H prefix is used - in emacs in some commands (help commands).) - - From point of view of the kernel, you can change the key - for deleting a previous character with stty erase. When you - connect a real terminal into a machine you describe the type - of terminal, so getty configures the correct value of stty - erase for this terminal. In the case of terminal emulators, - however, you don't have any getty that can set the correct - value of stty erase, so you always get the default value. - For this reason, it is necessary to add 'stty erase ^H' to your - profile if you have changed the value of the backspace key. - Of course, another solution is for st itself to modify the - value of stty erase. I usually have the inverse problem: - when I connect to non-Unix machines, I have to press CONTROL + - h to get a BACKSPACE. The inverse problem occurs when a user - connects to my Unix machines from a different system with a - correct backspace key. - - [1] http://www.ibb.net/~anne/keyboard.html - [2] http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html - -## But I really want the old grumpy behaviour of my terminal - -Apply [1]. - -[1] https://st.suckless.org/patches/delkey - -## Why do images not work in st (in programs such as w3m)? - -This is a terrible hack that overdraws an image on top of the terminal emulator -window. It also relies on a very specific way the terminal draws it's contents. - -A more proper (but limited way) would be using sixels. Which st doesn't -support. - -## BadLength X error in Xft when trying to render emoji - -Xft makes st crash when rendering color emojis with the following error: - -"X Error of failed request: BadLength (poly request too large or internal Xlib length error)" - Major opcode of failed request: 139 (RENDER) - Minor opcode of failed request: 20 (RenderAddGlyphs) - Serial number of failed request: 1595 - Current serial number in output stream: 1818" - -This is a known bug in Xft (not st) which happens on some platforms and -combination of particular fonts and fontconfig settings. - -See also: -https://gitlab.freedesktop.org/xorg/lib/libxft/issues/6 -https://bugs.freedesktop.org/show_bug.cgi?id=107534 -https://bugzilla.redhat.com/show_bug.cgi?id=1498269 - -The solution is to remove color emoji fonts or disable this in the fontconfig -XML configuration. As an ugly workaround (which may work only on newer -fontconfig versions (FC_COLOR)), the following code can be used to mask color -fonts: - - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); - -Please don't bother reporting this bug to st, but notify the upstream Xft -developers about fixing this bug. diff --git a/.suckless/st/LEGACY b/.suckless/st/LEGACY deleted file mode 100644 index bf28b1e..0000000 --- a/.suckless/st/LEGACY +++ /dev/null @@ -1,17 +0,0 @@ -A STATEMENT ON LEGACY SUPPORT - -In the terminal world there is much cruft that comes from old and unsup‐ -ported terminals that inherit incompatible modes and escape sequences -which noone is able to know, except when he/she comes from that time and -developed a graphical vt100 emulator at that time. - -One goal of st is to only support what is really needed. When you en‐ -counter a sequence which you really need, implement it. But while you -are at it, do not add the other cruft you might encounter while sneek‐ -ing at other terminal emulators. History has bloated them and there is -no real evidence that most of the sequences are used today. - - -Christoph Lohmann <20h@r-36.net> -2012-09-13T07:00:36.081271045+02:00 - diff --git a/.suckless/st/LICENSE b/.suckless/st/LICENSE deleted file mode 100644 index c356c39..0000000 --- a/.suckless/st/LICENSE +++ /dev/null @@ -1,34 +0,0 @@ -MIT/X Consortium License - -© 2014-2018 Hiltjo Posthuma -© 2018 Devin J. Pohly -© 2014-2017 Quentin Rameau -© 2009-2012 Aurélien APTEL -© 2008-2017 Anselm R Garbe -© 2012-2017 Roberto E. Vargas Caballero -© 2012-2016 Christoph Lohmann <20h at r-36 dot net> -© 2013 Eon S. Jeon -© 2013 Alexander Sedov -© 2013 Mark Edgar -© 2013-2014 Eric Pruitt -© 2013 Michael Forney -© 2013-2014 Markus Teich -© 2014-2015 Laslo Hunhold - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/.suckless/st/Makefile b/.suckless/st/Makefile deleted file mode 100644 index 470ac86..0000000 --- a/.suckless/st/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# st - simple terminal -# See LICENSE file for copyright and license details. -.POSIX: - -include config.mk - -SRC = st.c x.c -OBJ = $(SRC:.c=.o) - -all: options st - -options: - @echo st build options: - @echo "CFLAGS = $(STCFLAGS)" - @echo "LDFLAGS = $(STLDFLAGS)" - @echo "CC = $(CC)" - -config.h: - cp config.def.h config.h - -.c.o: - $(CC) $(STCFLAGS) -c $< - -st.o: config.h st.h win.h -x.o: arg.h config.h st.h win.h - -$(OBJ): config.h config.mk - -st: $(OBJ) - $(CC) -o $@ $(OBJ) $(STLDFLAGS) - -clean: - rm -f st $(OBJ) st-$(VERSION).tar.gz - -dist: clean - mkdir -p st-$(VERSION) - cp -R FAQ LEGACY TODO LICENSE Makefile README config.mk\ - config.def.h st.info st.1 arg.h st.h win.h $(SRC)\ - st-$(VERSION) - tar -cf - st-$(VERSION) | gzip > st-$(VERSION).tar.gz - rm -rf st-$(VERSION) - -install: st - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f st $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/st - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < st.1 > $(DESTDIR)$(MANPREFIX)/man1/st.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/st.1 - tic -sx st.info - @echo Please see the README file regarding the terminfo entry of st. - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/st - rm -f $(DESTDIR)$(MANPREFIX)/man1/st.1 - -.PHONY: all options clean dist install uninstall diff --git a/.suckless/st/README b/.suckless/st/README deleted file mode 100644 index 6a846ed..0000000 --- a/.suckless/st/README +++ /dev/null @@ -1,34 +0,0 @@ -st - simple terminal --------------------- -st is a simple terminal emulator for X which sucks less. - - -Requirements ------------- -In order to build st you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (st is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install st (if -necessary as root): - - make clean install - - -Running st ----------- -If you did not install st with make clean install, you must compile -the st terminfo entry with the following command: - - tic -sx st.info - -See the man page for additional details. - -Credits -------- -Based on Aurélien APTEL bt source code. - diff --git a/.suckless/st/TODO b/.suckless/st/TODO deleted file mode 100644 index 5f74cd5..0000000 --- a/.suckless/st/TODO +++ /dev/null @@ -1,28 +0,0 @@ -vt emulation ------------- - -* double-height support - -code & interface ----------------- - -* add a simple way to do multiplexing - -drawing -------- -* add diacritics support to xdraws() - * switch to a suckless font drawing library -* make the font cache simpler -* add better support for brightening of the upper colors - -bugs ----- - -* fix shift up/down (shift selection in emacs) -* remove DEC test sequence when appropriate - -misc ----- - - $ grep -nE 'XXX|TODO' st.c - diff --git a/.suckless/st/arg.h b/.suckless/st/arg.h deleted file mode 100644 index a22e019..0000000 --- a/.suckless/st/arg.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - int i_;\ - for (i_ = 1, brk_ = 0, argv_ = argv;\ - argv[0][i_] && !brk_;\ - i_++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][i_];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][i_+1] != '\0')?\ - (&argv[0][i_+1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][i_+1] != '\0')?\ - (&argv[0][i_+1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/.suckless/st/config.def.h b/.suckless/st/config.def.h deleted file mode 100644 index 013b9a6..0000000 --- a/.suckless/st/config.def.h +++ /dev/null @@ -1,459 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* - * appearance - * - * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html - */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; -static int borderpx = 2; - -/* - * What program is execed by st depends of these precedence rules: - * 1: program passed with -e - * 2: utmp option - * 3: SHELL environment variable - * 4: value of shell in /etc/passwd - * 5: value of shell in config.h - */ -static char *shell = "/bin/sh"; -char *utmp = NULL; -char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; - -/* identification sequence returned in DA and DECID */ -char *vtiden = "\033[?6c"; - -/* Kerning / character bounding-box multipliers */ -static float cwscale = 1.0; -static float chscale = 1.0; - -/* - * word delimiter string - * - * More advanced example: L" `'\"()[]{}" - */ -wchar_t *worddelimiters = L" "; - -/* selection timeouts (in milliseconds) */ -static unsigned int doubleclicktimeout = 300; -static unsigned int tripleclicktimeout = 600; - -/* alt screens */ -int allowaltscreen = 1; - -/* frames per second st should at maximum draw to the screen */ -static unsigned int xfps = 120; -static unsigned int actionfps = 30; - -/* - * blinking timeout (set to 0 to disable blinking) for the terminal blinking - * attribute. - */ -static unsigned int blinktimeout = 800; - -/* - * thickness of underline and bar cursors - */ -static unsigned int cursorthickness = 2; - -/* - * bell volume. It must be a value between -100 and 100. Use 0 for disabling - * it - */ -static int bellvolume = 0; - -/* default TERM value */ -char *termname = "st-256color"; - -/* - * spaces per tab - * - * When you are changing this value, don't forget to adapt the »it« value in - * the st.info and appropriately install the st.info in the environment where - * you use this st version. - * - * it#$tabspaces, - * - * Secondly make sure your kernel is not expanding tabs. When running `stty - * -a` »tab0« should appear. You can tell the terminal to not expand tabs by - * running following command: - * - * stty tabs - */ -unsigned int tabspaces = 8; - -/* Terminal colors (16 first used in escape sequence) */ -static const char *colorname[] = { - /* 8 normal colors */ - "#3b4252", /* black */ - "#bf616a", /* red */ - "#a3be8c", /* green */ - "#ebcb8b", /* yellow */ - "#81a1c1", /* blue */ - "#b48ead", /* magenta */ - "#88c0d0", /* cyan */ - "#e5e9f0", /* white */ - - /* 8 bright colors */ - "#4c566a", /* black */ - "#bf616a", /* red */ - "#a3be8c", /* green */ - "#ebcb8b", /* yellow */ - "#81a1c1", /* blue */ - "#b48ead", /* magenta */ - "#8fbcbb", /* cyan */ - "#eceff4", /* white */ - - [255] = 0, - - /* more colors can be added after 255 to use with DefaultXX */ - "#2e3440", /* background */ - "#d8dee9", /* foreground */ -}; - - -/* - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ -unsigned int defaultfg = 257; -unsigned int defaultbg = 256; -static unsigned int defaultcs = 257; -static unsigned int defaultrcs = 256; - -/* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") - * 7: Snowman ("☃") - */ -static unsigned int cursorshape = 2; - -/* - * Default columns and rows numbers - */ - -static unsigned int cols = 80; -static unsigned int rows = 24; - -/* - * Default colour and shape of the mouse cursor - */ -static unsigned int mouseshape = XC_xterm; -static unsigned int mousefg = 7; -static unsigned int mousebg = 0; - -/* - * Color used to display font attributes when fontconfig selected a font which - * doesn't match the ones requested. - */ -static unsigned int defaultattr = 11; - -/* - * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). - * Note that if you want to use ShiftMask with selmasks, set this to an other - * modifier, set to 0 to not use it. - */ -static uint forcemousemod = ShiftMask; - -/* - * Internal mouse shortcuts. - * Beware that overloading Button1 will disable the selection. - */ -static MouseShortcut mshortcuts[] = { - /* mask button function argument release */ - { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, - { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, - { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, -}; - -/* Internal keyboard shortcuts. */ -#define MODKEY Mod1Mask -#define TERMMOD (ControlMask|ShiftMask) - -static Shortcut shortcuts[] = { - /* mask keysym function argument */ - { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, - { ControlMask, XK_Print, toggleprinter, {.i = 0} }, - { ShiftMask, XK_Print, printscreen, {.i = 0} }, - { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, - { TERMMOD, XK_Prior, zoom, {.f = +1} }, - { TERMMOD, XK_Next, zoom, {.f = -1} }, - { TERMMOD, XK_Home, zoomreset, {.f = 0} }, - { TERMMOD, XK_C, clipcopy, {.i = 0} }, - { TERMMOD, XK_V, clippaste, {.i = 0} }, - { TERMMOD, XK_Y, selpaste, {.i = 0} }, - { ShiftMask, XK_Insert, selpaste, {.i = 0} }, - { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, -}; - -/* - * Special keys (change & recompile st.info accordingly) - * - * Mask value: - * * Use XK_ANY_MOD to match the key no matter modifiers state - * * Use XK_NO_MOD to match the key alone (no modifiers) - * appkey value: - * * 0: no value - * * > 0: keypad application mode enabled - * * = 2: term.numlock = 1 - * * < 0: keypad application mode disabled - * appcursor value: - * * 0: no value - * * > 0: cursor application mode enabled - * * < 0: cursor application mode disabled - * - * Be careful with the order of the definitions because st searches in - * this table sequentially, so any XK_ANY_MOD must be in the last - * position for a key. - */ - -/* - * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) - * to be mapped below, add them to this array. - */ -static KeySym mappedkeys[] = { -1 }; - -/* - * State bits to ignore when matching key or button events. By default, - * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. - */ -static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; - -/* - * This is the huge key array which defines all compatibility to the Linux - * world. Please decide about changes wisely. - */ -static Key key[] = { - /* keysym mask string appkey appcursor */ - { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, - { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, - { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, - { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, - { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, - { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, - { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, - { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, - { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, - { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, - { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, - { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, - { XK_KP_End, ControlMask, "\033[J", -1, 0}, - { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, - { XK_KP_End, ShiftMask, "\033[K", -1, 0}, - { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, - { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, - { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, - { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, - { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, - { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, - { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, - { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, - { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, - { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, - { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, - { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, - { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, - { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, - { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, - { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, - { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, - { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, - { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, - { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, - { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, - { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, - { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, - { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, - { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, - { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, - { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, - { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, - { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, - { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, - { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, - { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, - { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, - { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, - { XK_Up, ControlMask, "\033[1;5A", 0, 0}, - { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, - { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, - { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, - { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, - { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, - { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, - { XK_Down, ControlMask, "\033[1;5B", 0, 0}, - { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, - { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, - { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, - { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, - { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, - { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, - { XK_Left, ControlMask, "\033[1;5D", 0, 0}, - { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, - { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, - { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, - { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, - { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, - { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, - { XK_Right, ControlMask, "\033[1;5C", 0, 0}, - { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, - { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, - { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, - { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, - { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, - { XK_Return, Mod1Mask, "\033\r", 0, 0}, - { XK_Return, XK_ANY_MOD, "\r", 0, 0}, - { XK_Insert, ShiftMask, "\033[4l", -1, 0}, - { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, - { XK_Insert, ControlMask, "\033[L", -1, 0}, - { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, - { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, - { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, - { XK_Delete, ControlMask, "\033[M", -1, 0}, - { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, - { XK_Delete, ShiftMask, "\033[2K", -1, 0}, - { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, - { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, - { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, - { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, - { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, - { XK_Home, ShiftMask, "\033[2J", 0, -1}, - { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, - { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, - { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, - { XK_End, ControlMask, "\033[J", -1, 0}, - { XK_End, ControlMask, "\033[1;5F", +1, 0}, - { XK_End, ShiftMask, "\033[K", -1, 0}, - { XK_End, ShiftMask, "\033[1;2F", +1, 0}, - { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, - { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, - { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, - { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, - { XK_Next, ControlMask, "\033[6;5~", 0, 0}, - { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, - { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, - { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, - { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, - { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, - { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, - { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, - { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, - { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, - { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, - { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, - { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, - { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, - { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, - { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, - { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, - { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, - { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, - { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, - { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, - { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, - { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, - { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, - { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, - { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, - { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, - { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, - { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, - { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, - { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, - { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, - { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, - { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, - { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, - { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, - { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, - { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, - { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, - { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, - { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, - { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, - { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, - { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, - { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, - { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, - { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, - { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, - { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, - { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, - { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, - { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, - { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, - { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, - { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, - { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, - { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, - { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, - { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, - { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, - { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, - { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, - { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, - { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, - { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, - { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, - { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, - { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, - { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, - { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, - { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, - { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, - { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, - { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, - { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, - { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, - { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, - { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, - { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, - { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, - { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, - { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, - { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, - { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, - { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, - { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, - { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, - { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, - { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, -}; - -/* - * Selection types' masks. - * Use the same masks as usual. - * Button1Mask is always unset, to make masks match between ButtonPress. - * ButtonRelease and MotionNotify. - * If no match is found, regular selection is used. - */ -static uint selmasks[] = { - [SEL_RECTANGULAR] = Mod1Mask, -}; - -/* - * Printable characters in ASCII, used to estimate the advance width - * of single wide characters. - */ -static char ascii_printable[] = - " !\"#$%&'()*+,-./0123456789:;<=>?" - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" - "`abcdefghijklmnopqrstuvwxyz{|}~"; diff --git a/.suckless/st/config.h b/.suckless/st/config.h deleted file mode 100644 index 053be8b..0000000 --- a/.suckless/st/config.h +++ /dev/null @@ -1,460 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* - * appearance - * - * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html - */ -static char *font = "Iosevka:pixelsize=20:antialias=true:autohint:true"; -static int borderpx = 8; - -/* - * What program is execed by st depends of these precedence rules: - * 1: program passed with -e - * 2: utmp option - * 3: SHELL environment variable - * 4: value of shell in /etc/passwd - * 5: value of shell in config.h - */ -static char *shell = "/bin/sh"; -char *utmp = NULL; -char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; - -/* identification sequence returned in DA and DECID */ -char *vtiden = "\033[?6c"; - -/* Kerning / character bounding-box multipliers */ -static float cwscale = 1.0; -static float chscale = 1.0; - -/* - * word delimiter string - * - * More advanced example: L" `'\"()[]{}" - */ -wchar_t *worddelimiters = L" "; - -/* selection timeouts (in milliseconds) */ -static unsigned int doubleclicktimeout = 300; -static unsigned int tripleclicktimeout = 600; - -/* alt screens */ -int allowaltscreen = 1; - -/* frames per second st should at maximum draw to the screen */ -static unsigned int xfps = 120; -static unsigned int actionfps = 30; - -/* - * blinking timeout (set to 0 to disable blinking) for the terminal blinking - * attribute. - */ -static unsigned int blinktimeout = 800; - -/* - * thickness of underline and bar cursors - */ -static unsigned int cursorthickness = 2; - -/* - * bell volume. It must be a value between -100 and 100. Use 0 for disabling - * it - */ -static int bellvolume = 0; - -/* default TERM value */ -char *termname = "st-256color"; - -/* - * spaces per tab - * - * When you are changing this value, don't forget to adapt the »it« value in - * the st.info and appropriately install the st.info in the environment where - * you use this st version. - * - * it#$tabspaces, - * - * Secondly make sure your kernel is not expanding tabs. When running `stty - * -a` »tab0« should appear. You can tell the terminal to not expand tabs by - * running following command: - * - * stty tabs - */ -unsigned int tabspaces = 8; - -/* Terminal colors (16 first used in escape sequence) */ -static const char *colorname[] = { - /* 8 normal colors */ - "#000000", /* black */ - "#bf616a", /* red */ - "#a3be8c", /* green */ - "#ebcb8b", /* yellow */ - "#81a1c1", /* blue */ - "#b48ead", /* magenta */ - "#88c0d0", /* cyan */ - "#ffffff", /* white */ - - /* 8 bright colors */ - "#111111", /* black */ - "#bf616a", /* red */ - "#a3be8c", /* green */ - "#ebcb8b", /* yellow */ - "#81a1c1", /* blue */ - "#b48ead", /* magenta */ - "#8fbcbb", /* cyan */ - "#eeeeee", /* white */ - - [255] = 0, - - /* more colors can be added after 255 to use with DefaultXX */ - "#000000", /* background */ - "#d8dee9", /* foreground */ -}; - - -/* - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ -unsigned int defaultfg = 257; -unsigned int defaultbg = 256; -static unsigned int defaultcs = 257; -static unsigned int defaultrcs = 256; - - -/* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") - * 7: Snowman ("☃") - */ -static unsigned int cursorshape = 2; - -/* - * Default columns and rows numbers - */ - -static unsigned int cols = 80; -static unsigned int rows = 24; - -/* - * Default colour and shape of the mouse cursor - */ -static unsigned int mouseshape = XC_xterm; -static unsigned int mousefg = 7; -static unsigned int mousebg = 0; - -/* - * Color used to display font attributes when fontconfig selected a font which - * doesn't match the ones requested. - */ -static unsigned int defaultattr = 11; - -/* - * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). - * Note that if you want to use ShiftMask with selmasks, set this to an other - * modifier, set to 0 to not use it. - */ -static uint forcemousemod = ShiftMask; - -/* - * Internal mouse shortcuts. - * Beware that overloading Button1 will disable the selection. - */ -static MouseShortcut mshortcuts[] = { - /* mask button function argument release */ - { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, - { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, - { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, -}; - -/* Internal keyboard shortcuts. */ -#define MODKEY Mod1Mask -#define TERMMOD (ControlMask|ShiftMask) - -static Shortcut shortcuts[] = { - /* mask keysym function argument */ - { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, - { ControlMask, XK_Print, toggleprinter, {.i = 0} }, - { ShiftMask, XK_Print, printscreen, {.i = 0} }, - { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, - { TERMMOD, XK_Prior, zoom, {.f = +1} }, - { TERMMOD, XK_Next, zoom, {.f = -1} }, - { TERMMOD, XK_Home, zoomreset, {.f = 0} }, - { TERMMOD, XK_C, clipcopy, {.i = 0} }, - { TERMMOD, XK_V, clippaste, {.i = 0} }, - { TERMMOD, XK_Y, selpaste, {.i = 0} }, - { ShiftMask, XK_Insert, selpaste, {.i = 0} }, - { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, -}; - -/* - * Special keys (change & recompile st.info accordingly) - * - * Mask value: - * * Use XK_ANY_MOD to match the key no matter modifiers state - * * Use XK_NO_MOD to match the key alone (no modifiers) - * appkey value: - * * 0: no value - * * > 0: keypad application mode enabled - * * = 2: term.numlock = 1 - * * < 0: keypad application mode disabled - * appcursor value: - * * 0: no value - * * > 0: cursor application mode enabled - * * < 0: cursor application mode disabled - * - * Be careful with the order of the definitions because st searches in - * this table sequentially, so any XK_ANY_MOD must be in the last - * position for a key. - */ - -/* - * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) - * to be mapped below, add them to this array. - */ -static KeySym mappedkeys[] = { -1 }; - -/* - * State bits to ignore when matching key or button events. By default, - * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. - */ -static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; - -/* - * This is the huge key array which defines all compatibility to the Linux - * world. Please decide about changes wisely. - */ -static Key key[] = { - /* keysym mask string appkey appcursor */ - { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, - { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, - { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, - { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, - { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, - { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, - { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, - { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, - { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, - { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, - { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, - { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, - { XK_KP_End, ControlMask, "\033[J", -1, 0}, - { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, - { XK_KP_End, ShiftMask, "\033[K", -1, 0}, - { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, - { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, - { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, - { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, - { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, - { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, - { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, - { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, - { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, - { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, - { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, - { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, - { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, - { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, - { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, - { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, - { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, - { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, - { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, - { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, - { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, - { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, - { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, - { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, - { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, - { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, - { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, - { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, - { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, - { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, - { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, - { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, - { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, - { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, - { XK_Up, ControlMask, "\033[1;5A", 0, 0}, - { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, - { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, - { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, - { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, - { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, - { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, - { XK_Down, ControlMask, "\033[1;5B", 0, 0}, - { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, - { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, - { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, - { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, - { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, - { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, - { XK_Left, ControlMask, "\033[1;5D", 0, 0}, - { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, - { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, - { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, - { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, - { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, - { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, - { XK_Right, ControlMask, "\033[1;5C", 0, 0}, - { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, - { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, - { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, - { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, - { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, - { XK_Return, Mod1Mask, "\033\r", 0, 0}, - { XK_Return, XK_ANY_MOD, "\r", 0, 0}, - { XK_Insert, ShiftMask, "\033[4l", -1, 0}, - { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, - { XK_Insert, ControlMask, "\033[L", -1, 0}, - { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, - { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, - { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, - { XK_Delete, ControlMask, "\033[M", -1, 0}, - { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, - { XK_Delete, ShiftMask, "\033[2K", -1, 0}, - { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, - { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, - { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, - { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, - { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, - { XK_Home, ShiftMask, "\033[2J", 0, -1}, - { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, - { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, - { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, - { XK_End, ControlMask, "\033[J", -1, 0}, - { XK_End, ControlMask, "\033[1;5F", +1, 0}, - { XK_End, ShiftMask, "\033[K", -1, 0}, - { XK_End, ShiftMask, "\033[1;2F", +1, 0}, - { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, - { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, - { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, - { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, - { XK_Next, ControlMask, "\033[6;5~", 0, 0}, - { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, - { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, - { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, - { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, - { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, - { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, - { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, - { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, - { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, - { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, - { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, - { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, - { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, - { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, - { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, - { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, - { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, - { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, - { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, - { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, - { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, - { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, - { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, - { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, - { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, - { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, - { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, - { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, - { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, - { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, - { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, - { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, - { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, - { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, - { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, - { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, - { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, - { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, - { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, - { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, - { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, - { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, - { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, - { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, - { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, - { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, - { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, - { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, - { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, - { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, - { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, - { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, - { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, - { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, - { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, - { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, - { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, - { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, - { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, - { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, - { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, - { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, - { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, - { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, - { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, - { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, - { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, - { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, - { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, - { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, - { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, - { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, - { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, - { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, - { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, - { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, - { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, - { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, - { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, - { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, - { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, - { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, - { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, - { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, - { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, - { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, - { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, - { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, -}; - -/* - * Selection types' masks. - * Use the same masks as usual. - * Button1Mask is always unset, to make masks match between ButtonPress. - * ButtonRelease and MotionNotify. - * If no match is found, regular selection is used. - */ -static uint selmasks[] = { - [SEL_RECTANGULAR] = Mod1Mask, -}; - -/* - * Printable characters in ASCII, used to estimate the advance width - * of single wide characters. - */ -static char ascii_printable[] = - " !\"#$%&'()*+,-./0123456789:;<=>?" - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" - "`abcdefghijklmnopqrstuvwxyz{|}~"; diff --git a/.suckless/st/config.mk b/.suckless/st/config.mk deleted file mode 100644 index 0cbb002..0000000 --- a/.suckless/st/config.mk +++ /dev/null @@ -1,35 +0,0 @@ -# st version -VERSION = 0.8.2 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -PKG_CONFIG = pkg-config - -# includes and libs -INCS = -I$(X11INC) \ - `$(PKG_CONFIG) --cflags fontconfig` \ - `$(PKG_CONFIG) --cflags freetype2` -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ - `$(PKG_CONFIG) --libs fontconfig` \ - `$(PKG_CONFIG) --libs freetype2` - -# flags -STCPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600 -STCFLAGS = $(INCS) $(STCPPFLAGS) $(CPPFLAGS) $(CFLAGS) -STLDFLAGS = $(LIBS) $(LDFLAGS) - -# OpenBSD: -#CPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -#LIBS = -L$(X11LIB) -lm -lX11 -lutil -lXft \ -# `pkg-config --libs fontconfig` \ -# `pkg-config --libs freetype2` - -# compiler and linker -# CC = c99 diff --git a/.suckless/st/st b/.suckless/st/st deleted file mode 100755 index b05e62681b7d62e6635392257b59a227be37697b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102208 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 diff --git a/.suckless/st/st-anysize-0.8.1.diff b/.suckless/st/st-anysize-0.8.1.diff deleted file mode 100644 index 1eaf2ba..0000000 --- a/.suckless/st/st-anysize-0.8.1.diff +++ /dev/null @@ -1,152 +0,0 @@ -diff --git a/x.c b/x.c -index 00cb6b1..8f87c0f 100644 ---- a/x.c -+++ b/x.c -@@ -78,6 +78,7 @@ typedef XftGlyphFontSpec GlyphFontSpec; - typedef struct { - int tw, th; /* tty width and height */ - int w, h; /* window width and height */ -+ int hborderpx, vborderpx; - int ch; /* char height */ - int cw; /* char width */ - int mode; /* window state/mode flags */ -@@ -311,7 +312,7 @@ zoomreset(const Arg *arg) - int - evcol(XEvent *e) - { -- int x = e->xbutton.x - borderpx; -+ int x = e->xbutton.x - win.hborderpx; - LIMIT(x, 0, win.tw - 1); - return x / win.cw; - } -@@ -319,7 +320,7 @@ evcol(XEvent *e) - int - evrow(XEvent *e) - { -- int y = e->xbutton.y - borderpx; -+ int y = e->xbutton.y - win.vborderpx; - LIMIT(y, 0, win.th - 1); - return y / win.ch; - } -@@ -675,6 +676,9 @@ cresize(int width, int height) - col = MAX(1, col); - row = MAX(1, row); - -+ win.hborderpx = (win.w - col * win.cw) / 2; -+ win.vborderpx = (win.h - row * win.ch) / 2; -+ - tresize(col, row); - xresize(col, row); - ttyresize(win.tw, win.th); -@@ -793,8 +797,8 @@ xhints(void) - sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; - sizeh->height = win.h; - sizeh->width = win.w; -- sizeh->height_inc = win.ch; -- sizeh->width_inc = win.cw; -+ sizeh->height_inc = 1; -+ sizeh->width_inc = 1; - sizeh->base_height = 2 * borderpx; - sizeh->base_width = 2 * borderpx; - sizeh->min_height = win.ch + 2 * borderpx; -@@ -1022,8 +1026,8 @@ xinit(int cols, int rows) - xloadcols(); - - /* adjust fixed window geometry */ -- win.w = 2 * borderpx + cols * win.cw; -- win.h = 2 * borderpx + rows * win.ch; -+ win.w = 2 * win.hborderpx + cols * win.cw; -+ win.h = 2 * win.vborderpx + rows * win.ch; - if (xw.gm & XNegative) - xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; - if (xw.gm & YNegative) -@@ -1123,7 +1127,7 @@ xinit(int cols, int rows) - int - xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) - { -- float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; -+ float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp; - ushort mode, prevmode = USHRT_MAX; - Font *font = &dc.font; - int frcflags = FRC_NORMAL; -@@ -1259,7 +1263,7 @@ void - xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) - { - int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); -- int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, -+ int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, - width = charlen * win.cw; - Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; - XRenderColor colfg, colbg; -@@ -1349,17 +1353,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i - - /* Intelligent cleaning up of the borders. */ - if (x == 0) { -- xclear(0, (y == 0)? 0 : winy, borderpx, -+ xclear(0, (y == 0)? 0 : winy, win.vborderpx, - winy + win.ch + -- ((winy + win.ch >= borderpx + win.th)? win.h : 0)); -+ ((winy + win.ch >= win.vborderpx + win.th)? win.h : 0)); - } -- if (winx + width >= borderpx + win.tw) { -+ if (winx + width >= win.hborderpx + win.tw) { - xclear(winx + width, (y == 0)? 0 : winy, win.w, -- ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); -+ ((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch))); - } - if (y == 0) -- xclear(winx, 0, winx + width, borderpx); -- if (winy + win.ch >= borderpx + win.th) -+ xclear(winx, 0, winx + width, win.hborderpx); -+ if (winy + win.ch >= win.vborderpx + win.th) - xclear(winx, winy + win.ch, winx + width, win.h); - - /* Clean up the region we want to draw to. */ -@@ -1452,35 +1456,35 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) - case 3: /* Blinking Underline */ - case 4: /* Steady Underline */ - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + (cy + 1) * win.ch - \ -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + (cy + 1) * win.ch - \ - cursorthickness, - win.cw, cursorthickness); - break; - case 5: /* Blinking bar */ - case 6: /* Steady bar */ - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + cy * win.ch, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + cy * win.ch, - cursorthickness, win.ch); - break; - } - } else { - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + cy * win.ch, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + cy * win.ch, - win.cw - 1, 1); - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + cy * win.ch, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, -- borderpx + (cx + 1) * win.cw - 1, -- borderpx + cy * win.ch, -+ win.hborderpx + (cx + 1) * win.cw - 1, -+ win.vborderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + (cy + 1) * win.ch - 1, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + (cy + 1) * win.ch - 1, - win.cw, 1); - } - } diff --git a/.suckless/st/st-nordtheme-0.8.2.diff b/.suckless/st/st-nordtheme-0.8.2.diff deleted file mode 100644 index 01e9231..0000000 --- a/.suckless/st/st-nordtheme-0.8.2.diff +++ /dev/null @@ -1,100 +0,0 @@ -From 3e8f83d40c6fdd89653ef547aa16cffe1f3c1793 Mon Sep 17 00:00:00 2001 -From: aleks -Date: Sun, 4 Aug 2019 13:23:10 +0200 -Subject: [PATCH] Apply nord-theme - -*"Inspired by the beauty of the arctic, the colors reflect the cold, yet -harmonious world of ice and the colorfulness of the Aurora Borealis."* - [Nord -Theme](https://www.nordtheme.com/) - -There are also many [ports](https://www.nordtheme.com/ports) for other programs -like [vim](https://www.nordtheme.com/ports/vim) and -[tmux](https://www.nordtheme.com/ports/tmux) to make the overall appearance -coherent. I would recommend to use it in combination with the arc-theme for gtk -(fits perfectly). - -The default behaviour of st is to reverse the fore- and background colors of -each selected cell. If you want that the selection-colors are not reveresed but -instead have fixed fore- and background colors apply on top of this patch the -[selectioncolors](../selectioncolors/)-patch. Then set the following settings -in your config.h: - -static unsigned int defaultcs = 257; -static unsigned int defaultrcs = 257; -unsigned int selectionfg = 257; -unsigned int selectionbg = 0; ---- - config.def.h | 44 ++++++++++++++++++++++---------------------- - 1 file changed, 22 insertions(+), 22 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 0e01717..fb504d4 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -85,30 +85,30 @@ unsigned int tabspaces = 8; - /* Terminal colors (16 first used in escape sequence) */ - static const char *colorname[] = { - /* 8 normal colors */ -- "black", -- "red3", -- "green3", -- "yellow3", -- "blue2", -- "magenta3", -- "cyan3", -- "gray90", -+ "#3b4252", /* black */ -+ "#bf616a", /* red */ -+ "#a3be8c", /* green */ -+ "#ebcb8b", /* yellow */ -+ "#81a1c1", /* blue */ -+ "#b48ead", /* magenta */ -+ "#88c0d0", /* cyan */ -+ "#e5e9f0", /* white */ - - /* 8 bright colors */ -- "gray50", -- "red", -- "green", -- "yellow", -- "#5c5cff", -- "magenta", -- "cyan", -- "white", -+ "#4c566a", /* black */ -+ "#bf616a", /* red */ -+ "#a3be8c", /* green */ -+ "#ebcb8b", /* yellow */ -+ "#81a1c1", /* blue */ -+ "#b48ead", /* magenta */ -+ "#8fbcbb", /* cyan */ -+ "#eceff4", /* white */ - - [255] = 0, - - /* more colors can be added after 255 to use with DefaultXX */ -- "#cccccc", -- "#555555", -+ "#2e3440", /* background */ -+ "#d8dee9", /* foreground */ - }; - - -@@ -116,10 +116,10 @@ static const char *colorname[] = { - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ --unsigned int defaultfg = 7; --unsigned int defaultbg = 0; --static unsigned int defaultcs = 256; --static unsigned int defaultrcs = 257; -+unsigned int defaultfg = 257; -+unsigned int defaultbg = 256; -+static unsigned int defaultcs = 257; -+static unsigned int defaultrcs = 256; - - /* - * Default shape of cursor --- -2.22.0 - diff --git a/.suckless/st/st.1 b/.suckless/st/st.1 deleted file mode 100644 index e8d6059..0000000 --- a/.suckless/st/st.1 +++ /dev/null @@ -1,176 +0,0 @@ -.TH ST 1 st\-VERSION -.SH NAME -st \- simple terminal -.SH SYNOPSIS -.B st -.RB [ \-aiv ] -.RB [ \-c -.IR class ] -.RB [ \-f -.IR font ] -.RB [ \-g -.IR geometry ] -.RB [ \-n -.IR name ] -.RB [ \-o -.IR iofile ] -.RB [ \-T -.IR title ] -.RB [ \-t -.IR title ] -.RB [ \-l -.IR line ] -.RB [ \-w -.IR windowid ] -.RB [[ \-e ] -.IR command -.RI [ arguments ...]] -.PP -.B st -.RB [ \-aiv ] -.RB [ \-c -.IR class ] -.RB [ \-f -.IR font ] -.RB [ \-g -.IR geometry ] -.RB [ \-n -.IR name ] -.RB [ \-o -.IR iofile ] -.RB [ \-T -.IR title ] -.RB [ \-t -.IR title ] -.RB [ \-w -.IR windowid ] -.RB \-l -.IR line -.RI [ stty_args ...] -.SH DESCRIPTION -.B st -is a simple terminal emulator. -.SH OPTIONS -.TP -.B \-a -disable alternate screens in terminal -.TP -.BI \-c " class" -defines the window class (default $TERM). -.TP -.BI \-f " font" -defines the -.I font -to use when st is run. -.TP -.BI \-g " geometry" -defines the X11 geometry string. -The form is [=][{xX}][{+-}{+-}]. See -.BR XParseGeometry (3) -for further details. -.TP -.B \-i -will fixate the position given with the -g option. -.TP -.BI \-n " name" -defines the window instance name (default $TERM). -.TP -.BI \-o " iofile" -writes all the I/O to -.I iofile. -This feature is useful when recording st sessions. A value of "-" means -standard output. -.TP -.BI \-T " title" -defines the window title (default 'st'). -.TP -.BI \-t " title" -defines the window title (default 'st'). -.TP -.BI \-w " windowid" -embeds st within the window identified by -.I windowid -.TP -.BI \-l " line" -use a tty -.I line -instead of a pseudo terminal. -.I line -should be a (pseudo-)serial device (e.g. /dev/ttyS0 on Linux for serial port -0). -When this flag is given -remaining arguments are used as flags for -.BR stty(1). -By default st initializes the serial line to 8 bits, no parity, 1 stop bit -and a 38400 baud rate. The speed is set by appending it as last argument -(e.g. 'st -l /dev/ttyS0 115200'). Arguments before the last one are -.BR stty(1) -flags. If you want to set odd parity on 115200 baud use for example 'st -l -/dev/ttyS0 parenb parodd 115200'. Set the number of bits by using for -example 'st -l /dev/ttyS0 cs7 115200'. See -.BR stty(1) -for more arguments and cases. -.TP -.B \-v -prints version information to stderr, then exits. -.TP -.BI \-e " command " [ " arguments " "... ]" -st executes -.I command -instead of the shell. If this is used it -.B must be the last option -on the command line, as in xterm / rxvt. -This option is only intended for compatibility, -and all the remaining arguments are used as a command -even without it. -.SH SHORTCUTS -.TP -.B Break -Send a break in the serial line. -Break key is obtained in PC keyboards -pressing at the same time control and pause. -.TP -.B Ctrl-Print Screen -Toggle if st should print to the -.I iofile. -.TP -.B Shift-Print Screen -Print the full screen to the -.I iofile. -.TP -.B Print Screen -Print the selection to the -.I iofile. -.TP -.B Ctrl-Shift-Page Up -Increase font size. -.TP -.B Ctrl-Shift-Page Down -Decrease font size. -.TP -.B Ctrl-Shift-Home -Reset to default font size. -.TP -.B Ctrl-Shift-y -Paste from primary selection (middle mouse button). -.TP -.B Ctrl-Shift-c -Copy the selected text to the clipboard selection. -.TP -.B Ctrl-Shift-v -Paste from the clipboard selection. -.SH CUSTOMIZATION -.B st -can be customized by creating a custom config.h and (re)compiling the source -code. This keeps it fast, secure and simple. -.SH AUTHORS -See the LICENSE file for the authors. -.SH LICENSE -See the LICENSE file for the terms of redistribution. -.SH SEE ALSO -.BR tabbed (1), -.BR utmp (1), -.BR stty (1) -.SH BUGS -See the TODO file in the distribution. - diff --git a/.suckless/st/st.c b/.suckless/st/st.c deleted file mode 100644 index 3e48410..0000000 --- a/.suckless/st/st.c +++ /dev/null @@ -1,2599 +0,0 @@ -/* See LICENSE for license details. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "st.h" -#include "win.h" - -#if defined(__linux) - #include -#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) - #include -#elif defined(__FreeBSD__) || defined(__DragonFly__) - #include -#endif - -/* Arbitrary sizes */ -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 -#define ESC_BUF_SIZ (128*UTF_SIZ) -#define ESC_ARG_SIZ 16 -#define STR_BUF_SIZ ESC_BUF_SIZ -#define STR_ARG_SIZ ESC_ARG_SIZ - -/* macros */ -#define IS_SET(flag) ((term.mode & (flag)) != 0) -#define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177') -#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) -#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) -#define ISDELIM(u) (u && wcschr(worddelimiters, u)) - -enum term_mode { - MODE_WRAP = 1 << 0, - MODE_INSERT = 1 << 1, - MODE_ALTSCREEN = 1 << 2, - MODE_CRLF = 1 << 3, - MODE_ECHO = 1 << 4, - MODE_PRINT = 1 << 5, - MODE_UTF8 = 1 << 6, - MODE_SIXEL = 1 << 7, -}; - -enum cursor_movement { - CURSOR_SAVE, - CURSOR_LOAD -}; - -enum cursor_state { - CURSOR_DEFAULT = 0, - CURSOR_WRAPNEXT = 1, - CURSOR_ORIGIN = 2 -}; - -enum charset { - CS_GRAPHIC0, - CS_GRAPHIC1, - CS_UK, - CS_USA, - CS_MULTI, - CS_GER, - CS_FIN -}; - -enum escape_state { - ESC_START = 1, - ESC_CSI = 2, - ESC_STR = 4, /* OSC, PM, APC */ - ESC_ALTCHARSET = 8, - ESC_STR_END = 16, /* a final string was encountered */ - ESC_TEST = 32, /* Enter in test mode */ - ESC_UTF8 = 64, - ESC_DCS =128, -}; - -typedef struct { - Glyph attr; /* current char attributes */ - int x; - int y; - char state; -} TCursor; - -typedef struct { - int mode; - int type; - int snap; - /* - * Selection variables: - * nb – normalized coordinates of the beginning of the selection - * ne – normalized coordinates of the end of the selection - * ob – original coordinates of the beginning of the selection - * oe – original coordinates of the end of the selection - */ - struct { - int x, y; - } nb, ne, ob, oe; - - int alt; -} Selection; - -/* Internal representation of the screen */ -typedef struct { - int row; /* nb row */ - int col; /* nb col */ - Line *line; /* screen */ - Line *alt; /* alternate screen */ - int *dirty; /* dirtyness of lines */ - TCursor c; /* cursor */ - int ocx; /* old cursor col */ - int ocy; /* old cursor row */ - int top; /* top scroll limit */ - int bot; /* bottom scroll limit */ - int mode; /* terminal mode flags */ - int esc; /* escape state flags */ - char trantbl[4]; /* charset table translation */ - int charset; /* current charset */ - int icharset; /* selected charset for sequence */ - int *tabs; -} Term; - -/* CSI Escape sequence structs */ -/* ESC '[' [[ [] [;]] []] */ -typedef struct { - char buf[ESC_BUF_SIZ]; /* raw string */ - size_t len; /* raw string length */ - char priv; - int arg[ESC_ARG_SIZ]; - int narg; /* nb of args */ - char mode[2]; -} CSIEscape; - -/* STR Escape sequence structs */ -/* ESC type [[ [] [;]] ] ESC '\' */ -typedef struct { - char type; /* ESC type ... */ - char *buf; /* allocated raw string */ - size_t siz; /* allocation size */ - size_t len; /* raw string length */ - char *args[STR_ARG_SIZ]; - int narg; /* nb of args */ -} STREscape; - -static void execsh(char *, char **); -static void stty(char **); -static void sigchld(int); -static void ttywriteraw(const char *, size_t); - -static void csidump(void); -static void csihandle(void); -static void csiparse(void); -static void csireset(void); -static int eschandle(uchar); -static void strdump(void); -static void strhandle(void); -static void strparse(void); -static void strreset(void); - -static void tprinter(char *, size_t); -static void tdumpsel(void); -static void tdumpline(int); -static void tdump(void); -static void tclearregion(int, int, int, int); -static void tcursor(int); -static void tdeletechar(int); -static void tdeleteline(int); -static void tinsertblank(int); -static void tinsertblankline(int); -static int tlinelen(int); -static void tmoveto(int, int); -static void tmoveato(int, int); -static void tnewline(int); -static void tputtab(int); -static void tputc(Rune); -static void treset(void); -static void tscrollup(int, int); -static void tscrolldown(int, int); -static void tsetattr(int *, int); -static void tsetchar(Rune, Glyph *, int, int); -static void tsetdirt(int, int); -static void tsetscroll(int, int); -static void tswapscreen(void); -static void tsetmode(int, int, int *, int); -static int twrite(const char *, int, int); -static void tfulldirt(void); -static void tcontrolcode(uchar ); -static void tdectest(char ); -static void tdefutf8(char); -static int32_t tdefcolor(int *, int *, int); -static void tdeftran(char); -static void tstrsequence(uchar); - -static void drawregion(int, int, int, int); - -static void selnormalize(void); -static void selscroll(int, int); -static void selsnap(int *, int *, int); - -static size_t utf8decode(const char *, Rune *, size_t); -static Rune utf8decodebyte(char, size_t *); -static char utf8encodebyte(Rune, size_t); -static size_t utf8validate(Rune *, size_t); - -static char *base64dec(const char *); -static char base64dec_getc(const char **); - -static ssize_t xwrite(int, const char *, size_t); - -/* Globals */ -static Term term; -static Selection sel; -static CSIEscape csiescseq; -static STREscape strescseq; -static int iofd = 1; -static int cmdfd; -static pid_t pid; - -static uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -ssize_t -xwrite(int fd, const char *s, size_t len) -{ - size_t aux = len; - ssize_t r; - - while (len > 0) { - r = write(fd, s, len); - if (r < 0) - return r; - len -= r; - s += r; - } - - return aux; -} - -void * -xmalloc(size_t len) -{ - void *p; - - if (!(p = malloc(len))) - die("malloc: %s\n", strerror(errno)); - - return p; -} - -void * -xrealloc(void *p, size_t len) -{ - if ((p = realloc(p, len)) == NULL) - die("realloc: %s\n", strerror(errno)); - - return p; -} - -char * -xstrdup(char *s) -{ - if ((s = strdup(s)) == NULL) - die("strdup: %s\n", strerror(errno)); - - return s; -} - -size_t -utf8decode(const char *c, Rune *u, size_t clen) -{ - size_t i, j, len, type; - Rune udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type != 0) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Rune -utf8decodebyte(char c, size_t *i) -{ - for (*i = 0; *i < LEN(utfmask); ++(*i)) - if (((uchar)c & utfmask[*i]) == utfbyte[*i]) - return (uchar)c & ~utfmask[*i]; - - return 0; -} - -size_t -utf8encode(Rune u, char *c) -{ - size_t len, i; - - len = utf8validate(&u, 0); - if (len > UTF_SIZ) - return 0; - - for (i = len - 1; i != 0; --i) { - c[i] = utf8encodebyte(u, 0); - u >>= 6; - } - c[0] = utf8encodebyte(u, len); - - return len; -} - -char -utf8encodebyte(Rune u, size_t i) -{ - return utfbyte[i] | (u & ~utfmask[i]); -} - -size_t -utf8validate(Rune *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - - return i; -} - -static const char base64_digits[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, - 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, -1, 0, 0, 0, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -char -base64dec_getc(const char **src) -{ - while (**src && !isprint(**src)) (*src)++; - return **src ? *((*src)++) : '='; /* emulate padding if string ends */ -} - -char * -base64dec(const char *src) -{ - size_t in_len = strlen(src); - char *result, *dst; - - if (in_len % 4) - in_len += 4 - (in_len % 4); - result = dst = xmalloc(in_len / 4 * 3 + 1); - while (*src) { - int a = base64_digits[(unsigned char) base64dec_getc(&src)]; - int b = base64_digits[(unsigned char) base64dec_getc(&src)]; - int c = base64_digits[(unsigned char) base64dec_getc(&src)]; - int d = base64_digits[(unsigned char) base64dec_getc(&src)]; - - /* invalid input. 'a' can be -1, e.g. if src is "\n" (c-str) */ - if (a == -1 || b == -1) - break; - - *dst++ = (a << 2) | ((b & 0x30) >> 4); - if (c == -1) - break; - *dst++ = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2); - if (d == -1) - break; - *dst++ = ((c & 0x03) << 6) | d; - } - *dst = '\0'; - return result; -} - -void -selinit(void) -{ - sel.mode = SEL_IDLE; - sel.snap = 0; - sel.ob.x = -1; -} - -int -tlinelen(int y) -{ - int i = term.col; - - if (term.line[y][i - 1].mode & ATTR_WRAP) - return i; - - while (i > 0 && term.line[y][i - 1].u == ' ') - --i; - - return i; -} - -void -selstart(int col, int row, int snap) -{ - selclear(); - sel.mode = SEL_EMPTY; - sel.type = SEL_REGULAR; - sel.alt = IS_SET(MODE_ALTSCREEN); - sel.snap = snap; - sel.oe.x = sel.ob.x = col; - sel.oe.y = sel.ob.y = row; - selnormalize(); - - if (sel.snap != 0) - sel.mode = SEL_READY; - tsetdirt(sel.nb.y, sel.ne.y); -} - -void -selextend(int col, int row, int type, int done) -{ - int oldey, oldex, oldsby, oldsey, oldtype; - - if (sel.mode == SEL_IDLE) - return; - if (done && sel.mode == SEL_EMPTY) { - selclear(); - return; - } - - oldey = sel.oe.y; - oldex = sel.oe.x; - oldsby = sel.nb.y; - oldsey = sel.ne.y; - oldtype = sel.type; - - sel.oe.x = col; - sel.oe.y = row; - selnormalize(); - sel.type = type; - - if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type || sel.mode == SEL_EMPTY) - tsetdirt(MIN(sel.nb.y, oldsby), MAX(sel.ne.y, oldsey)); - - sel.mode = done ? SEL_IDLE : SEL_READY; -} - -void -selnormalize(void) -{ - int i; - - if (sel.type == SEL_REGULAR && sel.ob.y != sel.oe.y) { - sel.nb.x = sel.ob.y < sel.oe.y ? sel.ob.x : sel.oe.x; - sel.ne.x = sel.ob.y < sel.oe.y ? sel.oe.x : sel.ob.x; - } else { - sel.nb.x = MIN(sel.ob.x, sel.oe.x); - sel.ne.x = MAX(sel.ob.x, sel.oe.x); - } - sel.nb.y = MIN(sel.ob.y, sel.oe.y); - sel.ne.y = MAX(sel.ob.y, sel.oe.y); - - selsnap(&sel.nb.x, &sel.nb.y, -1); - selsnap(&sel.ne.x, &sel.ne.y, +1); - - /* expand selection over line breaks */ - if (sel.type == SEL_RECTANGULAR) - return; - i = tlinelen(sel.nb.y); - if (i < sel.nb.x) - sel.nb.x = i; - if (tlinelen(sel.ne.y) <= sel.ne.x) - sel.ne.x = term.col - 1; -} - -int -selected(int x, int y) -{ - if (sel.mode == SEL_EMPTY || sel.ob.x == -1 || - sel.alt != IS_SET(MODE_ALTSCREEN)) - return 0; - - if (sel.type == SEL_RECTANGULAR) - return BETWEEN(y, sel.nb.y, sel.ne.y) - && BETWEEN(x, sel.nb.x, sel.ne.x); - - return BETWEEN(y, sel.nb.y, sel.ne.y) - && (y != sel.nb.y || x >= sel.nb.x) - && (y != sel.ne.y || x <= sel.ne.x); -} - -void -selsnap(int *x, int *y, int direction) -{ - int newx, newy, xt, yt; - int delim, prevdelim; - Glyph *gp, *prevgp; - - switch (sel.snap) { - case SNAP_WORD: - /* - * Snap around if the word wraps around at the end or - * beginning of a line. - */ - prevgp = &term.line[*y][*x]; - prevdelim = ISDELIM(prevgp->u); - for (;;) { - newx = *x + direction; - newy = *y; - if (!BETWEEN(newx, 0, term.col - 1)) { - newy += direction; - newx = (newx + term.col) % term.col; - if (!BETWEEN(newy, 0, term.row - 1)) - break; - - if (direction > 0) - yt = *y, xt = *x; - else - yt = newy, xt = newx; - if (!(term.line[yt][xt].mode & ATTR_WRAP)) - break; - } - - if (newx >= tlinelen(newy)) - break; - - gp = &term.line[newy][newx]; - delim = ISDELIM(gp->u); - if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim - || (delim && gp->u != prevgp->u))) - break; - - *x = newx; - *y = newy; - prevgp = gp; - prevdelim = delim; - } - break; - case SNAP_LINE: - /* - * Snap around if the the previous line or the current one - * has set ATTR_WRAP at its end. Then the whole next or - * previous line will be selected. - */ - *x = (direction < 0) ? 0 : term.col - 1; - if (direction < 0) { - for (; *y > 0; *y += direction) { - if (!(term.line[*y-1][term.col-1].mode - & ATTR_WRAP)) { - break; - } - } - } else if (direction > 0) { - for (; *y < term.row-1; *y += direction) { - if (!(term.line[*y][term.col-1].mode - & ATTR_WRAP)) { - break; - } - } - } - break; - } -} - -char * -getsel(void) -{ - char *str, *ptr; - int y, bufsize, lastx, linelen; - Glyph *gp, *last; - - if (sel.ob.x == -1) - return NULL; - - bufsize = (term.col+1) * (sel.ne.y-sel.nb.y+1) * UTF_SIZ; - ptr = str = xmalloc(bufsize); - - /* append every set & selected glyph to the selection */ - for (y = sel.nb.y; y <= sel.ne.y; y++) { - if ((linelen = tlinelen(y)) == 0) { - *ptr++ = '\n'; - continue; - } - - if (sel.type == SEL_RECTANGULAR) { - gp = &term.line[y][sel.nb.x]; - lastx = sel.ne.x; - } else { - gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; - lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; - } - last = &term.line[y][MIN(lastx, linelen-1)]; - while (last >= gp && last->u == ' ') - --last; - - for ( ; gp <= last; ++gp) { - if (gp->mode & ATTR_WDUMMY) - continue; - - ptr += utf8encode(gp->u, ptr); - } - - /* - * Copy and pasting of line endings is inconsistent - * in the inconsistent terminal and GUI world. - * The best solution seems like to produce '\n' when - * something is copied from st and convert '\n' to - * '\r', when something to be pasted is received by - * st. - * FIXME: Fix the computer world. - */ - if ((y < sel.ne.y || lastx >= linelen) && !(last->mode & ATTR_WRAP)) - *ptr++ = '\n'; - } - *ptr = 0; - return str; -} - -void -selclear(void) -{ - if (sel.ob.x == -1) - return; - sel.mode = SEL_IDLE; - sel.ob.x = -1; - tsetdirt(sel.nb.y, sel.ne.y); -} - -void -die(const char *errstr, ...) -{ - va_list ap; - - va_start(ap, errstr); - vfprintf(stderr, errstr, ap); - va_end(ap); - exit(1); -} - -void -execsh(char *cmd, char **args) -{ - char *sh, *prog; - const struct passwd *pw; - - errno = 0; - if ((pw = getpwuid(getuid())) == NULL) { - if (errno) - die("getpwuid: %s\n", strerror(errno)); - else - die("who are you?\n"); - } - - if ((sh = getenv("SHELL")) == NULL) - sh = (pw->pw_shell[0]) ? pw->pw_shell : cmd; - - if (args) - prog = args[0]; - else if (utmp) - prog = utmp; - else - prog = sh; - DEFAULT(args, ((char *[]) {prog, NULL})); - - unsetenv("COLUMNS"); - unsetenv("LINES"); - unsetenv("TERMCAP"); - setenv("LOGNAME", pw->pw_name, 1); - setenv("USER", pw->pw_name, 1); - setenv("SHELL", sh, 1); - setenv("HOME", pw->pw_dir, 1); - setenv("TERM", termname, 1); - - signal(SIGCHLD, SIG_DFL); - signal(SIGHUP, SIG_DFL); - signal(SIGINT, SIG_DFL); - signal(SIGQUIT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - signal(SIGALRM, SIG_DFL); - - execvp(prog, args); - _exit(1); -} - -void -sigchld(int a) -{ - int stat; - pid_t p; - - if ((p = waitpid(pid, &stat, WNOHANG)) < 0) - die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); - - if (pid != p) - return; - - if (WIFEXITED(stat) && WEXITSTATUS(stat)) - die("child exited with status %d\n", WEXITSTATUS(stat)); - else if (WIFSIGNALED(stat)) - die("child terminated due to signal %d\n", WTERMSIG(stat)); - exit(0); -} - -void -stty(char **args) -{ - char cmd[_POSIX_ARG_MAX], **p, *q, *s; - size_t n, siz; - - if ((n = strlen(stty_args)) > sizeof(cmd)-1) - die("incorrect stty parameters\n"); - memcpy(cmd, stty_args, n); - q = cmd + n; - siz = sizeof(cmd) - n; - for (p = args; p && (s = *p); ++p) { - if ((n = strlen(s)) > siz-1) - die("stty parameter length too long\n"); - *q++ = ' '; - memcpy(q, s, n); - q += n; - siz -= n + 1; - } - *q = '\0'; - if (system(cmd) != 0) - perror("Couldn't call stty"); -} - -int -ttynew(char *line, char *cmd, char *out, char **args) -{ - int m, s; - - if (out) { - term.mode |= MODE_PRINT; - iofd = (!strcmp(out, "-")) ? - 1 : open(out, O_WRONLY | O_CREAT, 0666); - if (iofd < 0) { - fprintf(stderr, "Error opening %s:%s\n", - out, strerror(errno)); - } - } - - if (line) { - if ((cmdfd = open(line, O_RDWR)) < 0) - die("open line '%s' failed: %s\n", - line, strerror(errno)); - dup2(cmdfd, 0); - stty(args); - return cmdfd; - } - - /* seems to work fine on linux, openbsd and freebsd */ - if (openpty(&m, &s, NULL, NULL, NULL) < 0) - die("openpty failed: %s\n", strerror(errno)); - - switch (pid = fork()) { - case -1: - die("fork failed: %s\n", strerror(errno)); - break; - case 0: - close(iofd); - setsid(); /* create a new process group */ - dup2(s, 0); - dup2(s, 1); - dup2(s, 2); - if (ioctl(s, TIOCSCTTY, NULL) < 0) - die("ioctl TIOCSCTTY failed: %s\n", strerror(errno)); - close(s); - close(m); -#ifdef __OpenBSD__ - if (pledge("stdio getpw proc exec", NULL) == -1) - die("pledge\n"); -#endif - execsh(cmd, args); - break; - default: -#ifdef __OpenBSD__ - if (pledge("stdio rpath tty proc", NULL) == -1) - die("pledge\n"); -#endif - close(s); - cmdfd = m; - signal(SIGCHLD, sigchld); - break; - } - return cmdfd; -} - -size_t -ttyread(void) -{ - static char buf[BUFSIZ]; - static int buflen = 0; - int written; - int ret; - - /* append read bytes to unprocessed bytes */ - if ((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0) - die("couldn't read from shell: %s\n", strerror(errno)); - buflen += ret; - - written = twrite(buf, buflen, 0); - buflen -= written; - /* keep any uncomplete utf8 char for the next call */ - if (buflen > 0) - memmove(buf, buf + written, buflen); - - return ret; -} - -void -ttywrite(const char *s, size_t n, int may_echo) -{ - const char *next; - - if (may_echo && IS_SET(MODE_ECHO)) - twrite(s, n, 1); - - if (!IS_SET(MODE_CRLF)) { - ttywriteraw(s, n); - return; - } - - /* This is similar to how the kernel handles ONLCR for ttys */ - while (n > 0) { - if (*s == '\r') { - next = s + 1; - ttywriteraw("\r\n", 2); - } else { - next = memchr(s, '\r', n); - DEFAULT(next, s + n); - ttywriteraw(s, next - s); - } - n -= next - s; - s = next; - } -} - -void -ttywriteraw(const char *s, size_t n) -{ - fd_set wfd, rfd; - ssize_t r; - size_t lim = 256; - - /* - * Remember that we are using a pty, which might be a modem line. - * Writing too much will clog the line. That's why we are doing this - * dance. - * FIXME: Migrate the world to Plan 9. - */ - while (n > 0) { - FD_ZERO(&wfd); - FD_ZERO(&rfd); - FD_SET(cmdfd, &wfd); - FD_SET(cmdfd, &rfd); - - /* Check if we can write. */ - if (pselect(cmdfd+1, &rfd, &wfd, NULL, NULL, NULL) < 0) { - if (errno == EINTR) - continue; - die("select failed: %s\n", strerror(errno)); - } - if (FD_ISSET(cmdfd, &wfd)) { - /* - * Only write the bytes written by ttywrite() or the - * default of 256. This seems to be a reasonable value - * for a serial line. Bigger values might clog the I/O. - */ - if ((r = write(cmdfd, s, (n < lim)? n : lim)) < 0) - goto write_error; - if (r < n) { - /* - * We weren't able to write out everything. - * This means the buffer is getting full - * again. Empty it. - */ - if (n < lim) - lim = ttyread(); - n -= r; - s += r; - } else { - /* All bytes have been written. */ - break; - } - } - if (FD_ISSET(cmdfd, &rfd)) - lim = ttyread(); - } - return; - -write_error: - die("write error on tty: %s\n", strerror(errno)); -} - -void -ttyresize(int tw, int th) -{ - struct winsize w; - - w.ws_row = term.row; - w.ws_col = term.col; - w.ws_xpixel = tw; - w.ws_ypixel = th; - if (ioctl(cmdfd, TIOCSWINSZ, &w) < 0) - fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno)); -} - -void -ttyhangup() -{ - /* Send SIGHUP to shell */ - kill(pid, SIGHUP); -} - -int -tattrset(int attr) -{ - int i, j; - - for (i = 0; i < term.row-1; i++) { - for (j = 0; j < term.col-1; j++) { - if (term.line[i][j].mode & attr) - return 1; - } - } - - return 0; -} - -void -tsetdirt(int top, int bot) -{ - int i; - - LIMIT(top, 0, term.row-1); - LIMIT(bot, 0, term.row-1); - - for (i = top; i <= bot; i++) - term.dirty[i] = 1; -} - -void -tsetdirtattr(int attr) -{ - int i, j; - - for (i = 0; i < term.row-1; i++) { - for (j = 0; j < term.col-1; j++) { - if (term.line[i][j].mode & attr) { - tsetdirt(i, i); - break; - } - } - } -} - -void -tfulldirt(void) -{ - tsetdirt(0, term.row-1); -} - -void -tcursor(int mode) -{ - static TCursor c[2]; - int alt = IS_SET(MODE_ALTSCREEN); - - if (mode == CURSOR_SAVE) { - c[alt] = term.c; - } else if (mode == CURSOR_LOAD) { - term.c = c[alt]; - tmoveto(c[alt].x, c[alt].y); - } -} - -void -treset(void) -{ - uint i; - - term.c = (TCursor){{ - .mode = ATTR_NULL, - .fg = defaultfg, - .bg = defaultbg - }, .x = 0, .y = 0, .state = CURSOR_DEFAULT}; - - memset(term.tabs, 0, term.col * sizeof(*term.tabs)); - for (i = tabspaces; i < term.col; i += tabspaces) - term.tabs[i] = 1; - term.top = 0; - term.bot = term.row - 1; - term.mode = MODE_WRAP|MODE_UTF8; - memset(term.trantbl, CS_USA, sizeof(term.trantbl)); - term.charset = 0; - - for (i = 0; i < 2; i++) { - tmoveto(0, 0); - tcursor(CURSOR_SAVE); - tclearregion(0, 0, term.col-1, term.row-1); - tswapscreen(); - } -} - -void -tnew(int col, int row) -{ - term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } }; - tresize(col, row); - treset(); -} - -void -tswapscreen(void) -{ - Line *tmp = term.line; - - term.line = term.alt; - term.alt = tmp; - term.mode ^= MODE_ALTSCREEN; - tfulldirt(); -} - -void -tscrolldown(int orig, int n) -{ - int i; - Line temp; - - LIMIT(n, 0, term.bot-orig+1); - - tsetdirt(orig, term.bot-n); - tclearregion(0, term.bot-n+1, term.col-1, term.bot); - - for (i = term.bot; i >= orig+n; i--) { - temp = term.line[i]; - term.line[i] = term.line[i-n]; - term.line[i-n] = temp; - } - - selscroll(orig, n); -} - -void -tscrollup(int orig, int n) -{ - int i; - Line temp; - - LIMIT(n, 0, term.bot-orig+1); - - tclearregion(0, orig, term.col-1, orig+n-1); - tsetdirt(orig+n, term.bot); - - for (i = orig; i <= term.bot-n; i++) { - temp = term.line[i]; - term.line[i] = term.line[i+n]; - term.line[i+n] = temp; - } - - selscroll(orig, -n); -} - -void -selscroll(int orig, int n) -{ - if (sel.ob.x == -1) - return; - - if (BETWEEN(sel.ob.y, orig, term.bot) || BETWEEN(sel.oe.y, orig, term.bot)) { - if ((sel.ob.y += n) > term.bot || (sel.oe.y += n) < term.top) { - selclear(); - return; - } - if (sel.type == SEL_RECTANGULAR) { - if (sel.ob.y < term.top) - sel.ob.y = term.top; - if (sel.oe.y > term.bot) - sel.oe.y = term.bot; - } else { - if (sel.ob.y < term.top) { - sel.ob.y = term.top; - sel.ob.x = 0; - } - if (sel.oe.y > term.bot) { - sel.oe.y = term.bot; - sel.oe.x = term.col; - } - } - selnormalize(); - } -} - -void -tnewline(int first_col) -{ - int y = term.c.y; - - if (y == term.bot) { - tscrollup(term.top, 1); - } else { - y++; - } - tmoveto(first_col ? 0 : term.c.x, y); -} - -void -csiparse(void) -{ - char *p = csiescseq.buf, *np; - long int v; - - csiescseq.narg = 0; - if (*p == '?') { - csiescseq.priv = 1; - p++; - } - - csiescseq.buf[csiescseq.len] = '\0'; - while (p < csiescseq.buf+csiescseq.len) { - np = NULL; - v = strtol(p, &np, 10); - if (np == p) - v = 0; - if (v == LONG_MAX || v == LONG_MIN) - v = -1; - csiescseq.arg[csiescseq.narg++] = v; - p = np; - if (*p != ';' || csiescseq.narg == ESC_ARG_SIZ) - break; - p++; - } - csiescseq.mode[0] = *p++; - csiescseq.mode[1] = (p < csiescseq.buf+csiescseq.len) ? *p : '\0'; -} - -/* for absolute user moves, when decom is set */ -void -tmoveato(int x, int y) -{ - tmoveto(x, y + ((term.c.state & CURSOR_ORIGIN) ? term.top: 0)); -} - -void -tmoveto(int x, int y) -{ - int miny, maxy; - - if (term.c.state & CURSOR_ORIGIN) { - miny = term.top; - maxy = term.bot; - } else { - miny = 0; - maxy = term.row - 1; - } - term.c.state &= ~CURSOR_WRAPNEXT; - term.c.x = LIMIT(x, 0, term.col-1); - term.c.y = LIMIT(y, miny, maxy); -} - -void -tsetchar(Rune u, Glyph *attr, int x, int y) -{ - static char *vt100_0[62] = { /* 0x41 - 0x7e */ - "↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */ - 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ - 0, 0, 0, 0, 0, 0, 0, 0, /* P - W */ - 0, 0, 0, 0, 0, 0, 0, " ", /* X - _ */ - "◆", "▒", "␉", "␌", "␍", "␊", "°", "±", /* ` - g */ - "␤", "␋", "┘", "┐", "┌", "└", "┼", "⎺", /* h - o */ - "⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */ - "│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */ - }; - - /* - * The table is proudly stolen from rxvt. - */ - if (term.trantbl[term.charset] == CS_GRAPHIC0 && - BETWEEN(u, 0x41, 0x7e) && vt100_0[u - 0x41]) - utf8decode(vt100_0[u - 0x41], &u, UTF_SIZ); - - if (term.line[y][x].mode & ATTR_WIDE) { - if (x+1 < term.col) { - term.line[y][x+1].u = ' '; - term.line[y][x+1].mode &= ~ATTR_WDUMMY; - } - } else if (term.line[y][x].mode & ATTR_WDUMMY) { - term.line[y][x-1].u = ' '; - term.line[y][x-1].mode &= ~ATTR_WIDE; - } - - term.dirty[y] = 1; - term.line[y][x] = *attr; - term.line[y][x].u = u; -} - -void -tclearregion(int x1, int y1, int x2, int y2) -{ - int x, y, temp; - Glyph *gp; - - if (x1 > x2) - temp = x1, x1 = x2, x2 = temp; - if (y1 > y2) - temp = y1, y1 = y2, y2 = temp; - - LIMIT(x1, 0, term.col-1); - LIMIT(x2, 0, term.col-1); - LIMIT(y1, 0, term.row-1); - LIMIT(y2, 0, term.row-1); - - for (y = y1; y <= y2; y++) { - term.dirty[y] = 1; - for (x = x1; x <= x2; x++) { - gp = &term.line[y][x]; - if (selected(x, y)) - selclear(); - gp->fg = term.c.attr.fg; - gp->bg = term.c.attr.bg; - gp->mode = 0; - gp->u = ' '; - } - } -} - -void -tdeletechar(int n) -{ - int dst, src, size; - Glyph *line; - - LIMIT(n, 0, term.col - term.c.x); - - dst = term.c.x; - src = term.c.x + n; - size = term.col - src; - line = term.line[term.c.y]; - - memmove(&line[dst], &line[src], size * sizeof(Glyph)); - tclearregion(term.col-n, term.c.y, term.col-1, term.c.y); -} - -void -tinsertblank(int n) -{ - int dst, src, size; - Glyph *line; - - LIMIT(n, 0, term.col - term.c.x); - - dst = term.c.x + n; - src = term.c.x; - size = term.col - dst; - line = term.line[term.c.y]; - - memmove(&line[dst], &line[src], size * sizeof(Glyph)); - tclearregion(src, term.c.y, dst - 1, term.c.y); -} - -void -tinsertblankline(int n) -{ - if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n); -} - -void -tdeleteline(int n) -{ - if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n); -} - -int32_t -tdefcolor(int *attr, int *npar, int l) -{ - int32_t idx = -1; - uint r, g, b; - - switch (attr[*npar + 1]) { - case 2: /* direct color in RGB space */ - if (*npar + 4 >= l) { - fprintf(stderr, - "erresc(38): Incorrect number of parameters (%d)\n", - *npar); - break; - } - r = attr[*npar + 2]; - g = attr[*npar + 3]; - b = attr[*npar + 4]; - *npar += 4; - if (!BETWEEN(r, 0, 255) || !BETWEEN(g, 0, 255) || !BETWEEN(b, 0, 255)) - fprintf(stderr, "erresc: bad rgb color (%u,%u,%u)\n", - r, g, b); - else - idx = TRUECOLOR(r, g, b); - break; - case 5: /* indexed color */ - if (*npar + 2 >= l) { - fprintf(stderr, - "erresc(38): Incorrect number of parameters (%d)\n", - *npar); - break; - } - *npar += 2; - if (!BETWEEN(attr[*npar], 0, 255)) - fprintf(stderr, "erresc: bad fgcolor %d\n", attr[*npar]); - else - idx = attr[*npar]; - break; - case 0: /* implemented defined (only foreground) */ - case 1: /* transparent */ - case 3: /* direct color in CMY space */ - case 4: /* direct color in CMYK space */ - default: - fprintf(stderr, - "erresc(38): gfx attr %d unknown\n", attr[*npar]); - break; - } - - return idx; -} - -void -tsetattr(int *attr, int l) -{ - int i; - int32_t idx; - - for (i = 0; i < l; i++) { - switch (attr[i]) { - case 0: - term.c.attr.mode &= ~( - ATTR_BOLD | - ATTR_FAINT | - ATTR_ITALIC | - ATTR_UNDERLINE | - ATTR_BLINK | - ATTR_REVERSE | - ATTR_INVISIBLE | - ATTR_STRUCK ); - term.c.attr.fg = defaultfg; - term.c.attr.bg = defaultbg; - break; - case 1: - term.c.attr.mode |= ATTR_BOLD; - break; - case 2: - term.c.attr.mode |= ATTR_FAINT; - break; - case 3: - term.c.attr.mode |= ATTR_ITALIC; - break; - case 4: - term.c.attr.mode |= ATTR_UNDERLINE; - break; - case 5: /* slow blink */ - /* FALLTHROUGH */ - case 6: /* rapid blink */ - term.c.attr.mode |= ATTR_BLINK; - break; - case 7: - term.c.attr.mode |= ATTR_REVERSE; - break; - case 8: - term.c.attr.mode |= ATTR_INVISIBLE; - break; - case 9: - term.c.attr.mode |= ATTR_STRUCK; - break; - case 22: - term.c.attr.mode &= ~(ATTR_BOLD | ATTR_FAINT); - break; - case 23: - term.c.attr.mode &= ~ATTR_ITALIC; - break; - case 24: - term.c.attr.mode &= ~ATTR_UNDERLINE; - break; - case 25: - term.c.attr.mode &= ~ATTR_BLINK; - break; - case 27: - term.c.attr.mode &= ~ATTR_REVERSE; - break; - case 28: - term.c.attr.mode &= ~ATTR_INVISIBLE; - break; - case 29: - term.c.attr.mode &= ~ATTR_STRUCK; - break; - case 38: - if ((idx = tdefcolor(attr, &i, l)) >= 0) - term.c.attr.fg = idx; - break; - case 39: - term.c.attr.fg = defaultfg; - break; - case 48: - if ((idx = tdefcolor(attr, &i, l)) >= 0) - term.c.attr.bg = idx; - break; - case 49: - term.c.attr.bg = defaultbg; - break; - default: - if (BETWEEN(attr[i], 30, 37)) { - term.c.attr.fg = attr[i] - 30; - } else if (BETWEEN(attr[i], 40, 47)) { - term.c.attr.bg = attr[i] - 40; - } else if (BETWEEN(attr[i], 90, 97)) { - term.c.attr.fg = attr[i] - 90 + 8; - } else if (BETWEEN(attr[i], 100, 107)) { - term.c.attr.bg = attr[i] - 100 + 8; - } else { - fprintf(stderr, - "erresc(default): gfx attr %d unknown\n", - attr[i]); - csidump(); - } - break; - } - } -} - -void -tsetscroll(int t, int b) -{ - int temp; - - LIMIT(t, 0, term.row-1); - LIMIT(b, 0, term.row-1); - if (t > b) { - temp = t; - t = b; - b = temp; - } - term.top = t; - term.bot = b; -} - -void -tsetmode(int priv, int set, int *args, int narg) -{ - int alt, *lim; - - for (lim = args + narg; args < lim; ++args) { - if (priv) { - switch (*args) { - case 1: /* DECCKM -- Cursor key */ - xsetmode(set, MODE_APPCURSOR); - break; - case 5: /* DECSCNM -- Reverse video */ - xsetmode(set, MODE_REVERSE); - break; - case 6: /* DECOM -- Origin */ - MODBIT(term.c.state, set, CURSOR_ORIGIN); - tmoveato(0, 0); - break; - case 7: /* DECAWM -- Auto wrap */ - MODBIT(term.mode, set, MODE_WRAP); - break; - case 0: /* Error (IGNORED) */ - case 2: /* DECANM -- ANSI/VT52 (IGNORED) */ - case 3: /* DECCOLM -- Column (IGNORED) */ - case 4: /* DECSCLM -- Scroll (IGNORED) */ - case 8: /* DECARM -- Auto repeat (IGNORED) */ - case 18: /* DECPFF -- Printer feed (IGNORED) */ - case 19: /* DECPEX -- Printer extent (IGNORED) */ - case 42: /* DECNRCM -- National characters (IGNORED) */ - case 12: /* att610 -- Start blinking cursor (IGNORED) */ - break; - case 25: /* DECTCEM -- Text Cursor Enable Mode */ - xsetmode(!set, MODE_HIDE); - break; - case 9: /* X10 mouse compatibility mode */ - xsetpointermotion(0); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEX10); - break; - case 1000: /* 1000: report button press */ - xsetpointermotion(0); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEBTN); - break; - case 1002: /* 1002: report motion on button press */ - xsetpointermotion(0); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEMOTION); - break; - case 1003: /* 1003: enable all mouse motions */ - xsetpointermotion(set); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEMANY); - break; - case 1004: /* 1004: send focus events to tty */ - xsetmode(set, MODE_FOCUS); - break; - case 1006: /* 1006: extended reporting mode */ - xsetmode(set, MODE_MOUSESGR); - break; - case 1034: - xsetmode(set, MODE_8BIT); - break; - case 1049: /* swap screen & set/restore cursor as xterm */ - if (!allowaltscreen) - break; - tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); - /* FALLTHROUGH */ - case 47: /* swap screen */ - case 1047: - if (!allowaltscreen) - break; - alt = IS_SET(MODE_ALTSCREEN); - if (alt) { - tclearregion(0, 0, term.col-1, - term.row-1); - } - if (set ^ alt) /* set is always 1 or 0 */ - tswapscreen(); - if (*args != 1049) - break; - /* FALLTHROUGH */ - case 1048: - tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); - break; - case 2004: /* 2004: bracketed paste mode */ - xsetmode(set, MODE_BRCKTPASTE); - break; - /* Not implemented mouse modes. See comments there. */ - case 1001: /* mouse highlight mode; can hang the - terminal by design when implemented. */ - case 1005: /* UTF-8 mouse mode; will confuse - applications not supporting UTF-8 - and luit. */ - case 1015: /* urxvt mangled mouse mode; incompatible - and can be mistaken for other control - codes. */ - break; - default: - fprintf(stderr, - "erresc: unknown private set/reset mode %d\n", - *args); - break; - } - } else { - switch (*args) { - case 0: /* Error (IGNORED) */ - break; - case 2: - xsetmode(set, MODE_KBDLOCK); - break; - case 4: /* IRM -- Insertion-replacement */ - MODBIT(term.mode, set, MODE_INSERT); - break; - case 12: /* SRM -- Send/Receive */ - MODBIT(term.mode, !set, MODE_ECHO); - break; - case 20: /* LNM -- Linefeed/new line */ - MODBIT(term.mode, set, MODE_CRLF); - break; - default: - fprintf(stderr, - "erresc: unknown set/reset mode %d\n", - *args); - break; - } - } - } -} - -void -csihandle(void) -{ - char buf[40]; - int len; - - switch (csiescseq.mode[0]) { - default: - unknown: - fprintf(stderr, "erresc: unknown csi "); - csidump(); - /* die(""); */ - break; - case '@': /* ICH -- Insert blank char */ - DEFAULT(csiescseq.arg[0], 1); - tinsertblank(csiescseq.arg[0]); - break; - case 'A': /* CUU -- Cursor Up */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x, term.c.y-csiescseq.arg[0]); - break; - case 'B': /* CUD -- Cursor Down */ - case 'e': /* VPR --Cursor Down */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x, term.c.y+csiescseq.arg[0]); - break; - case 'i': /* MC -- Media Copy */ - switch (csiescseq.arg[0]) { - case 0: - tdump(); - break; - case 1: - tdumpline(term.c.y); - break; - case 2: - tdumpsel(); - break; - case 4: - term.mode &= ~MODE_PRINT; - break; - case 5: - term.mode |= MODE_PRINT; - break; - } - break; - case 'c': /* DA -- Device Attributes */ - if (csiescseq.arg[0] == 0) - ttywrite(vtiden, strlen(vtiden), 0); - break; - case 'C': /* CUF -- Cursor Forward */ - case 'a': /* HPR -- Cursor Forward */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x+csiescseq.arg[0], term.c.y); - break; - case 'D': /* CUB -- Cursor Backward */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x-csiescseq.arg[0], term.c.y); - break; - case 'E': /* CNL -- Cursor Down and first col */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(0, term.c.y+csiescseq.arg[0]); - break; - case 'F': /* CPL -- Cursor Up and first col */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(0, term.c.y-csiescseq.arg[0]); - break; - case 'g': /* TBC -- Tabulation clear */ - switch (csiescseq.arg[0]) { - case 0: /* clear current tab stop */ - term.tabs[term.c.x] = 0; - break; - case 3: /* clear all the tabs */ - memset(term.tabs, 0, term.col * sizeof(*term.tabs)); - break; - default: - goto unknown; - } - break; - case 'G': /* CHA -- Move to */ - case '`': /* HPA */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(csiescseq.arg[0]-1, term.c.y); - break; - case 'H': /* CUP -- Move to */ - case 'f': /* HVP */ - DEFAULT(csiescseq.arg[0], 1); - DEFAULT(csiescseq.arg[1], 1); - tmoveato(csiescseq.arg[1]-1, csiescseq.arg[0]-1); - break; - case 'I': /* CHT -- Cursor Forward Tabulation tab stops */ - DEFAULT(csiescseq.arg[0], 1); - tputtab(csiescseq.arg[0]); - break; - case 'J': /* ED -- Clear screen */ - switch (csiescseq.arg[0]) { - case 0: /* below */ - tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); - if (term.c.y < term.row-1) { - tclearregion(0, term.c.y+1, term.col-1, - term.row-1); - } - break; - case 1: /* above */ - if (term.c.y > 1) - tclearregion(0, 0, term.col-1, term.c.y-1); - tclearregion(0, term.c.y, term.c.x, term.c.y); - break; - case 2: /* all */ - tclearregion(0, 0, term.col-1, term.row-1); - break; - default: - goto unknown; - } - break; - case 'K': /* EL -- Clear line */ - switch (csiescseq.arg[0]) { - case 0: /* right */ - tclearregion(term.c.x, term.c.y, term.col-1, - term.c.y); - break; - case 1: /* left */ - tclearregion(0, term.c.y, term.c.x, term.c.y); - break; - case 2: /* all */ - tclearregion(0, term.c.y, term.col-1, term.c.y); - break; - } - break; - case 'S': /* SU -- Scroll line up */ - DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0]); - break; - case 'T': /* SD -- Scroll line down */ - DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0]); - break; - case 'L': /* IL -- Insert blank lines */ - DEFAULT(csiescseq.arg[0], 1); - tinsertblankline(csiescseq.arg[0]); - break; - case 'l': /* RM -- Reset Mode */ - tsetmode(csiescseq.priv, 0, csiescseq.arg, csiescseq.narg); - break; - case 'M': /* DL -- Delete lines */ - DEFAULT(csiescseq.arg[0], 1); - tdeleteline(csiescseq.arg[0]); - break; - case 'X': /* ECH -- Erase char */ - DEFAULT(csiescseq.arg[0], 1); - tclearregion(term.c.x, term.c.y, - term.c.x + csiescseq.arg[0] - 1, term.c.y); - break; - case 'P': /* DCH -- Delete char */ - DEFAULT(csiescseq.arg[0], 1); - tdeletechar(csiescseq.arg[0]); - break; - case 'Z': /* CBT -- Cursor Backward Tabulation tab stops */ - DEFAULT(csiescseq.arg[0], 1); - tputtab(-csiescseq.arg[0]); - break; - case 'd': /* VPA -- Move to */ - DEFAULT(csiescseq.arg[0], 1); - tmoveato(term.c.x, csiescseq.arg[0]-1); - break; - case 'h': /* SM -- Set terminal mode */ - tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg); - break; - case 'm': /* SGR -- Terminal attribute (color) */ - tsetattr(csiescseq.arg, csiescseq.narg); - break; - case 'n': /* DSR – Device Status Report (cursor position) */ - if (csiescseq.arg[0] == 6) { - len = snprintf(buf, sizeof(buf),"\033[%i;%iR", - term.c.y+1, term.c.x+1); - ttywrite(buf, len, 0); - } - break; - case 'r': /* DECSTBM -- Set Scrolling Region */ - if (csiescseq.priv) { - goto unknown; - } else { - DEFAULT(csiescseq.arg[0], 1); - DEFAULT(csiescseq.arg[1], term.row); - tsetscroll(csiescseq.arg[0]-1, csiescseq.arg[1]-1); - tmoveato(0, 0); - } - break; - case 's': /* DECSC -- Save cursor position (ANSI.SYS) */ - tcursor(CURSOR_SAVE); - break; - case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ - tcursor(CURSOR_LOAD); - break; - case ' ': - switch (csiescseq.mode[1]) { - case 'q': /* DECSCUSR -- Set Cursor Style */ - if (xsetcursor(csiescseq.arg[0])) - goto unknown; - break; - default: - goto unknown; - } - break; - } -} - -void -csidump(void) -{ - size_t i; - uint c; - - fprintf(stderr, "ESC["); - for (i = 0; i < csiescseq.len; i++) { - c = csiescseq.buf[i] & 0xff; - if (isprint(c)) { - putc(c, stderr); - } else if (c == '\n') { - fprintf(stderr, "(\\n)"); - } else if (c == '\r') { - fprintf(stderr, "(\\r)"); - } else if (c == 0x1b) { - fprintf(stderr, "(\\e)"); - } else { - fprintf(stderr, "(%02x)", c); - } - } - putc('\n', stderr); -} - -void -csireset(void) -{ - memset(&csiescseq, 0, sizeof(csiescseq)); -} - -void -strhandle(void) -{ - char *p = NULL, *dec; - int j, narg, par; - - term.esc &= ~(ESC_STR_END|ESC_STR); - strparse(); - par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0; - - switch (strescseq.type) { - case ']': /* OSC -- Operating System Command */ - switch (par) { - case 0: - case 1: - case 2: - if (narg > 1) - xsettitle(strescseq.args[1]); - return; - case 52: - if (narg > 2) { - dec = base64dec(strescseq.args[2]); - if (dec) { - xsetsel(dec); - xclipcopy(); - } else { - fprintf(stderr, "erresc: invalid base64\n"); - } - } - return; - case 4: /* color set */ - if (narg < 3) - break; - p = strescseq.args[2]; - /* FALLTHROUGH */ - case 104: /* color reset, here p = NULL */ - j = (narg > 1) ? atoi(strescseq.args[1]) : -1; - if (xsetcolorname(j, p)) { - if (par == 104 && narg <= 1) - return; /* color reset without parameter */ - fprintf(stderr, "erresc: invalid color j=%d, p=%s\n", - j, p ? p : "(null)"); - } else { - /* - * TODO if defaultbg color is changed, borders - * are dirty - */ - redraw(); - } - return; - } - break; - case 'k': /* old title set compatibility */ - xsettitle(strescseq.args[0]); - return; - case 'P': /* DCS -- Device Control String */ - term.mode |= ESC_DCS; - case '_': /* APC -- Application Program Command */ - case '^': /* PM -- Privacy Message */ - return; - } - - fprintf(stderr, "erresc: unknown str "); - strdump(); -} - -void -strparse(void) -{ - int c; - char *p = strescseq.buf; - - strescseq.narg = 0; - strescseq.buf[strescseq.len] = '\0'; - - if (*p == '\0') - return; - - while (strescseq.narg < STR_ARG_SIZ) { - strescseq.args[strescseq.narg++] = p; - while ((c = *p) != ';' && c != '\0') - ++p; - if (c == '\0') - return; - *p++ = '\0'; - } -} - -void -strdump(void) -{ - size_t i; - uint c; - - fprintf(stderr, "ESC%c", strescseq.type); - for (i = 0; i < strescseq.len; i++) { - c = strescseq.buf[i] & 0xff; - if (c == '\0') { - putc('\n', stderr); - return; - } else if (isprint(c)) { - putc(c, stderr); - } else if (c == '\n') { - fprintf(stderr, "(\\n)"); - } else if (c == '\r') { - fprintf(stderr, "(\\r)"); - } else if (c == 0x1b) { - fprintf(stderr, "(\\e)"); - } else { - fprintf(stderr, "(%02x)", c); - } - } - fprintf(stderr, "ESC\\\n"); -} - -void -strreset(void) -{ - strescseq = (STREscape){ - .buf = xrealloc(strescseq.buf, STR_BUF_SIZ), - .siz = STR_BUF_SIZ, - }; -} - -void -sendbreak(const Arg *arg) -{ - if (tcsendbreak(cmdfd, 0)) - perror("Error sending break"); -} - -void -tprinter(char *s, size_t len) -{ - if (iofd != -1 && xwrite(iofd, s, len) < 0) { - perror("Error writing to output file"); - close(iofd); - iofd = -1; - } -} - -void -toggleprinter(const Arg *arg) -{ - term.mode ^= MODE_PRINT; -} - -void -printscreen(const Arg *arg) -{ - tdump(); -} - -void -printsel(const Arg *arg) -{ - tdumpsel(); -} - -void -tdumpsel(void) -{ - char *ptr; - - if ((ptr = getsel())) { - tprinter(ptr, strlen(ptr)); - free(ptr); - } -} - -void -tdumpline(int n) -{ - char buf[UTF_SIZ]; - Glyph *bp, *end; - - bp = &term.line[n][0]; - end = &bp[MIN(tlinelen(n), term.col) - 1]; - if (bp != end || bp->u != ' ') { - for ( ;bp <= end; ++bp) - tprinter(buf, utf8encode(bp->u, buf)); - } - tprinter("\n", 1); -} - -void -tdump(void) -{ - int i; - - for (i = 0; i < term.row; ++i) - tdumpline(i); -} - -void -tputtab(int n) -{ - uint x = term.c.x; - - if (n > 0) { - while (x < term.col && n--) - for (++x; x < term.col && !term.tabs[x]; ++x) - /* nothing */ ; - } else if (n < 0) { - while (x > 0 && n++) - for (--x; x > 0 && !term.tabs[x]; --x) - /* nothing */ ; - } - term.c.x = LIMIT(x, 0, term.col-1); -} - -void -tdefutf8(char ascii) -{ - if (ascii == 'G') - term.mode |= MODE_UTF8; - else if (ascii == '@') - term.mode &= ~MODE_UTF8; -} - -void -tdeftran(char ascii) -{ - static char cs[] = "0B"; - static int vcs[] = {CS_GRAPHIC0, CS_USA}; - char *p; - - if ((p = strchr(cs, ascii)) == NULL) { - fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); - } else { - term.trantbl[term.icharset] = vcs[p - cs]; - } -} - -void -tdectest(char c) -{ - int x, y; - - if (c == '8') { /* DEC screen alignment test. */ - for (x = 0; x < term.col; ++x) { - for (y = 0; y < term.row; ++y) - tsetchar('E', &term.c.attr, x, y); - } - } -} - -void -tstrsequence(uchar c) -{ - strreset(); - - switch (c) { - case 0x90: /* DCS -- Device Control String */ - c = 'P'; - term.esc |= ESC_DCS; - break; - case 0x9f: /* APC -- Application Program Command */ - c = '_'; - break; - case 0x9e: /* PM -- Privacy Message */ - c = '^'; - break; - case 0x9d: /* OSC -- Operating System Command */ - c = ']'; - break; - } - strescseq.type = c; - term.esc |= ESC_STR; -} - -void -tcontrolcode(uchar ascii) -{ - switch (ascii) { - case '\t': /* HT */ - tputtab(1); - return; - case '\b': /* BS */ - tmoveto(term.c.x-1, term.c.y); - return; - case '\r': /* CR */ - tmoveto(0, term.c.y); - return; - case '\f': /* LF */ - case '\v': /* VT */ - case '\n': /* LF */ - /* go to first col if the mode is set */ - tnewline(IS_SET(MODE_CRLF)); - return; - case '\a': /* BEL */ - if (term.esc & ESC_STR_END) { - /* backwards compatibility to xterm */ - strhandle(); - } else { - xbell(); - } - break; - case '\033': /* ESC */ - csireset(); - term.esc &= ~(ESC_CSI|ESC_ALTCHARSET|ESC_TEST); - term.esc |= ESC_START; - return; - case '\016': /* SO (LS1 -- Locking shift 1) */ - case '\017': /* SI (LS0 -- Locking shift 0) */ - term.charset = 1 - (ascii - '\016'); - return; - case '\032': /* SUB */ - tsetchar('?', &term.c.attr, term.c.x, term.c.y); - case '\030': /* CAN */ - csireset(); - break; - case '\005': /* ENQ (IGNORED) */ - case '\000': /* NUL (IGNORED) */ - case '\021': /* XON (IGNORED) */ - case '\023': /* XOFF (IGNORED) */ - case 0177: /* DEL (IGNORED) */ - return; - case 0x80: /* TODO: PAD */ - case 0x81: /* TODO: HOP */ - case 0x82: /* TODO: BPH */ - case 0x83: /* TODO: NBH */ - case 0x84: /* TODO: IND */ - break; - case 0x85: /* NEL -- Next line */ - tnewline(1); /* always go to first col */ - break; - case 0x86: /* TODO: SSA */ - case 0x87: /* TODO: ESA */ - break; - case 0x88: /* HTS -- Horizontal tab stop */ - term.tabs[term.c.x] = 1; - break; - case 0x89: /* TODO: HTJ */ - case 0x8a: /* TODO: VTS */ - case 0x8b: /* TODO: PLD */ - case 0x8c: /* TODO: PLU */ - case 0x8d: /* TODO: RI */ - case 0x8e: /* TODO: SS2 */ - case 0x8f: /* TODO: SS3 */ - case 0x91: /* TODO: PU1 */ - case 0x92: /* TODO: PU2 */ - case 0x93: /* TODO: STS */ - case 0x94: /* TODO: CCH */ - case 0x95: /* TODO: MW */ - case 0x96: /* TODO: SPA */ - case 0x97: /* TODO: EPA */ - case 0x98: /* TODO: SOS */ - case 0x99: /* TODO: SGCI */ - break; - case 0x9a: /* DECID -- Identify Terminal */ - ttywrite(vtiden, strlen(vtiden), 0); - break; - case 0x9b: /* TODO: CSI */ - case 0x9c: /* TODO: ST */ - break; - case 0x90: /* DCS -- Device Control String */ - case 0x9d: /* OSC -- Operating System Command */ - case 0x9e: /* PM -- Privacy Message */ - case 0x9f: /* APC -- Application Program Command */ - tstrsequence(ascii); - return; - } - /* only CAN, SUB, \a and C1 chars interrupt a sequence */ - term.esc &= ~(ESC_STR_END|ESC_STR); -} - -/* - * returns 1 when the sequence is finished and it hasn't to read - * more characters for this sequence, otherwise 0 - */ -int -eschandle(uchar ascii) -{ - switch (ascii) { - case '[': - term.esc |= ESC_CSI; - return 0; - case '#': - term.esc |= ESC_TEST; - return 0; - case '%': - term.esc |= ESC_UTF8; - return 0; - case 'P': /* DCS -- Device Control String */ - case '_': /* APC -- Application Program Command */ - case '^': /* PM -- Privacy Message */ - case ']': /* OSC -- Operating System Command */ - case 'k': /* old title set compatibility */ - tstrsequence(ascii); - return 0; - case 'n': /* LS2 -- Locking shift 2 */ - case 'o': /* LS3 -- Locking shift 3 */ - term.charset = 2 + (ascii - 'n'); - break; - case '(': /* GZD4 -- set primary charset G0 */ - case ')': /* G1D4 -- set secondary charset G1 */ - case '*': /* G2D4 -- set tertiary charset G2 */ - case '+': /* G3D4 -- set quaternary charset G3 */ - term.icharset = ascii - '('; - term.esc |= ESC_ALTCHARSET; - return 0; - case 'D': /* IND -- Linefeed */ - if (term.c.y == term.bot) { - tscrollup(term.top, 1); - } else { - tmoveto(term.c.x, term.c.y+1); - } - break; - case 'E': /* NEL -- Next line */ - tnewline(1); /* always go to first col */ - break; - case 'H': /* HTS -- Horizontal tab stop */ - term.tabs[term.c.x] = 1; - break; - case 'M': /* RI -- Reverse index */ - if (term.c.y == term.top) { - tscrolldown(term.top, 1); - } else { - tmoveto(term.c.x, term.c.y-1); - } - break; - case 'Z': /* DECID -- Identify Terminal */ - ttywrite(vtiden, strlen(vtiden), 0); - break; - case 'c': /* RIS -- Reset to initial state */ - treset(); - resettitle(); - xloadcols(); - break; - case '=': /* DECPAM -- Application keypad */ - xsetmode(1, MODE_APPKEYPAD); - break; - case '>': /* DECPNM -- Normal keypad */ - xsetmode(0, MODE_APPKEYPAD); - break; - case '7': /* DECSC -- Save Cursor */ - tcursor(CURSOR_SAVE); - break; - case '8': /* DECRC -- Restore Cursor */ - tcursor(CURSOR_LOAD); - break; - case '\\': /* ST -- String Terminator */ - if (term.esc & ESC_STR_END) - strhandle(); - break; - default: - fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n", - (uchar) ascii, isprint(ascii)? ascii:'.'); - break; - } - return 1; -} - -void -tputc(Rune u) -{ - char c[UTF_SIZ]; - int control; - int width, len; - Glyph *gp; - - control = ISCONTROL(u); - if (!IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) { - c[0] = u; - width = len = 1; - } else { - len = utf8encode(u, c); - if (!control && (width = wcwidth(u)) == -1) { - memcpy(c, "\357\277\275", 4); /* UTF_INVALID */ - width = 1; - } - } - - if (IS_SET(MODE_PRINT)) - tprinter(c, len); - - /* - * STR sequence must be checked before anything else - * because it uses all following characters until it - * receives a ESC, a SUB, a ST or any other C1 control - * character. - */ - if (term.esc & ESC_STR) { - if (u == '\a' || u == 030 || u == 032 || u == 033 || - ISCONTROLC1(u)) { - term.esc &= ~(ESC_START|ESC_STR|ESC_DCS); - if (IS_SET(MODE_SIXEL)) { - /* TODO: render sixel */; - term.mode &= ~MODE_SIXEL; - return; - } - term.esc |= ESC_STR_END; - goto check_control_code; - } - - if (IS_SET(MODE_SIXEL)) { - /* TODO: implement sixel mode */ - return; - } - if (term.esc&ESC_DCS && strescseq.len == 0 && u == 'q') - term.mode |= MODE_SIXEL; - - if (strescseq.len+len >= strescseq.siz) { - /* - * Here is a bug in terminals. If the user never sends - * some code to stop the str or esc command, then st - * will stop responding. But this is better than - * silently failing with unknown characters. At least - * then users will report back. - * - * In the case users ever get fixed, here is the code: - */ - /* - * term.esc = 0; - * strhandle(); - */ - if (strescseq.siz > (SIZE_MAX - UTF_SIZ) / 2) - return; - strescseq.siz *= 2; - strescseq.buf = xrealloc(strescseq.buf, strescseq.siz); - } - - memmove(&strescseq.buf[strescseq.len], c, len); - strescseq.len += len; - return; - } - -check_control_code: - /* - * Actions of control codes must be performed as soon they arrive - * because they can be embedded inside a control sequence, and - * they must not cause conflicts with sequences. - */ - if (control) { - tcontrolcode(u); - /* - * control codes are not shown ever - */ - return; - } else if (term.esc & ESC_START) { - if (term.esc & ESC_CSI) { - csiescseq.buf[csiescseq.len++] = u; - if (BETWEEN(u, 0x40, 0x7E) - || csiescseq.len >= \ - sizeof(csiescseq.buf)-1) { - term.esc = 0; - csiparse(); - csihandle(); - } - return; - } else if (term.esc & ESC_UTF8) { - tdefutf8(u); - } else if (term.esc & ESC_ALTCHARSET) { - tdeftran(u); - } else if (term.esc & ESC_TEST) { - tdectest(u); - } else { - if (!eschandle(u)) - return; - /* sequence already finished */ - } - term.esc = 0; - /* - * All characters which form part of a sequence are not - * printed - */ - return; - } - if (sel.ob.x != -1 && BETWEEN(term.c.y, sel.ob.y, sel.oe.y)) - selclear(); - - gp = &term.line[term.c.y][term.c.x]; - if (IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) { - gp->mode |= ATTR_WRAP; - tnewline(1); - gp = &term.line[term.c.y][term.c.x]; - } - - if (IS_SET(MODE_INSERT) && term.c.x+width < term.col) - memmove(gp+width, gp, (term.col - term.c.x - width) * sizeof(Glyph)); - - if (term.c.x+width > term.col) { - tnewline(1); - gp = &term.line[term.c.y][term.c.x]; - } - - tsetchar(u, &term.c.attr, term.c.x, term.c.y); - - if (width == 2) { - gp->mode |= ATTR_WIDE; - if (term.c.x+1 < term.col) { - gp[1].u = '\0'; - gp[1].mode = ATTR_WDUMMY; - } - } - if (term.c.x+width < term.col) { - tmoveto(term.c.x+width, term.c.y); - } else { - term.c.state |= CURSOR_WRAPNEXT; - } -} - -int -twrite(const char *buf, int buflen, int show_ctrl) -{ - int charsize; - Rune u; - int n; - - for (n = 0; n < buflen; n += charsize) { - if (IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) { - /* process a complete utf8 char */ - charsize = utf8decode(buf + n, &u, buflen - n); - if (charsize == 0) - break; - } else { - u = buf[n] & 0xFF; - charsize = 1; - } - if (show_ctrl && ISCONTROL(u)) { - if (u & 0x80) { - u &= 0x7f; - tputc('^'); - tputc('['); - } else if (u != '\n' && u != '\r' && u != '\t') { - u ^= 0x40; - tputc('^'); - } - } - tputc(u); - } - return n; -} - -void -tresize(int col, int row) -{ - int i; - int minrow = MIN(row, term.row); - int mincol = MIN(col, term.col); - int *bp; - TCursor c; - - if (col < 1 || row < 1) { - fprintf(stderr, - "tresize: error resizing to %dx%d\n", col, row); - return; - } - - /* - * slide screen to keep cursor where we expect it - - * tscrollup would work here, but we can optimize to - * memmove because we're freeing the earlier lines - */ - for (i = 0; i <= term.c.y - row; i++) { - free(term.line[i]); - free(term.alt[i]); - } - /* ensure that both src and dst are not NULL */ - if (i > 0) { - memmove(term.line, term.line + i, row * sizeof(Line)); - memmove(term.alt, term.alt + i, row * sizeof(Line)); - } - for (i += row; i < term.row; i++) { - free(term.line[i]); - free(term.alt[i]); - } - - /* resize to new height */ - term.line = xrealloc(term.line, row * sizeof(Line)); - term.alt = xrealloc(term.alt, row * sizeof(Line)); - term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); - term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); - - /* resize each row to new width, zero-pad if needed */ - for (i = 0; i < minrow; i++) { - term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); - term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph)); - } - - /* allocate any new rows */ - for (/* i = minrow */; i < row; i++) { - term.line[i] = xmalloc(col * sizeof(Glyph)); - term.alt[i] = xmalloc(col * sizeof(Glyph)); - } - if (col > term.col) { - bp = term.tabs + term.col; - - memset(bp, 0, sizeof(*term.tabs) * (col - term.col)); - while (--bp > term.tabs && !*bp) - /* nothing */ ; - for (bp += tabspaces; bp < term.tabs + col; bp += tabspaces) - *bp = 1; - } - /* update terminal size */ - term.col = col; - term.row = row; - /* reset scrolling region */ - tsetscroll(0, row-1); - /* make use of the LIMIT in tmoveto */ - tmoveto(term.c.x, term.c.y); - /* Clearing both screens (it makes dirty all lines) */ - c = term.c; - for (i = 0; i < 2; i++) { - if (mincol < col && 0 < minrow) { - tclearregion(mincol, 0, col - 1, minrow - 1); - } - if (0 < col && minrow < row) { - tclearregion(0, minrow, col - 1, row - 1); - } - tswapscreen(); - tcursor(CURSOR_LOAD); - } - term.c = c; -} - -void -resettitle(void) -{ - xsettitle(NULL); -} - -void -drawregion(int x1, int y1, int x2, int y2) -{ - int y; - for (y = y1; y < y2; y++) { - if (!term.dirty[y]) - continue; - - term.dirty[y] = 0; - xdrawline(term.line[y], x1, y, x2); - } -} - -void -draw(void) -{ - int cx = term.c.x; - - if (!xstartdraw()) - return; - - /* adjust cursor position */ - LIMIT(term.ocx, 0, term.col-1); - LIMIT(term.ocy, 0, term.row-1); - if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY) - term.ocx--; - if (term.line[term.c.y][cx].mode & ATTR_WDUMMY) - cx--; - - drawregion(0, 0, term.col, term.row); - xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], - term.ocx, term.ocy, term.line[term.ocy][term.ocx]); - term.ocx = cx, term.ocy = term.c.y; - xfinishdraw(); - xximspot(term.ocx, term.ocy); -} - -void -redraw(void) -{ - tfulldirt(); - draw(); -} diff --git a/.suckless/st/st.h b/.suckless/st/st.h deleted file mode 100644 index a1928ca..0000000 --- a/.suckless/st/st.h +++ /dev/null @@ -1,123 +0,0 @@ -/* See LICENSE for license details. */ - -#include -#include - -/* macros */ -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) < (b) ? (b) : (a)) -#define LEN(a) (sizeof(a) / sizeof(a)[0]) -#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) -#define DIVCEIL(n, d) (((n) + ((d) - 1)) / (d)) -#define DEFAULT(a, b) (a) = (a) ? (a) : (b) -#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) -#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || \ - (a).bg != (b).bg) -#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \ - (t1.tv_nsec-t2.tv_nsec)/1E6) -#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) - -#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b)) -#define IS_TRUECOL(x) (1 << 24 & (x)) - -enum glyph_attribute { - ATTR_NULL = 0, - ATTR_BOLD = 1 << 0, - ATTR_FAINT = 1 << 1, - ATTR_ITALIC = 1 << 2, - ATTR_UNDERLINE = 1 << 3, - ATTR_BLINK = 1 << 4, - ATTR_REVERSE = 1 << 5, - ATTR_INVISIBLE = 1 << 6, - ATTR_STRUCK = 1 << 7, - ATTR_WRAP = 1 << 8, - ATTR_WIDE = 1 << 9, - ATTR_WDUMMY = 1 << 10, - ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, -}; - -enum selection_mode { - SEL_IDLE = 0, - SEL_EMPTY = 1, - SEL_READY = 2 -}; - -enum selection_type { - SEL_REGULAR = 1, - SEL_RECTANGULAR = 2 -}; - -enum selection_snap { - SNAP_WORD = 1, - SNAP_LINE = 2 -}; - -typedef unsigned char uchar; -typedef unsigned int uint; -typedef unsigned long ulong; -typedef unsigned short ushort; - -typedef uint_least32_t Rune; - -#define Glyph Glyph_ -typedef struct { - Rune u; /* character code */ - ushort mode; /* attribute flags */ - uint32_t fg; /* foreground */ - uint32_t bg; /* background */ -} Glyph; - -typedef Glyph *Line; - -typedef union { - int i; - uint ui; - float f; - const void *v; - const char *s; -} Arg; - -void die(const char *, ...); -void redraw(void); -void draw(void); - -void printscreen(const Arg *); -void printsel(const Arg *); -void sendbreak(const Arg *); -void toggleprinter(const Arg *); - -int tattrset(int); -void tnew(int, int); -void tresize(int, int); -void tsetdirtattr(int); -void ttyhangup(void); -int ttynew(char *, char *, char *, char **); -size_t ttyread(void); -void ttyresize(int, int); -void ttywrite(const char *, size_t, int); - -void resettitle(void); - -void selclear(void); -void selinit(void); -void selstart(int, int, int); -void selextend(int, int, int, int); -int selected(int, int); -char *getsel(void); - -size_t utf8encode(Rune, char *); - -void *xmalloc(size_t); -void *xrealloc(void *, size_t); -char *xstrdup(char *); - -/* config.h globals */ -extern char *utmp; -extern char *stty_args; -extern char *vtiden; -extern wchar_t *worddelimiters; -extern int allowaltscreen; -extern char *termname; -extern unsigned int tabspaces; -extern unsigned int defaultfg; -extern unsigned int defaultbg; diff --git a/.suckless/st/st.info b/.suckless/st/st.info deleted file mode 100644 index 78ffd30..0000000 --- a/.suckless/st/st.info +++ /dev/null @@ -1,222 +0,0 @@ -st| simpleterm, - acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, - am, - bce, - bel=^G, - blink=\E[5m, - bold=\E[1m, - cbt=\E[Z, - cvvis=\E[?25h, - civis=\E[?25l, - clear=\E[H\E[2J, - cnorm=\E[?12l\E[?25h, - colors#8, - cols#80, - cr=^M, - csr=\E[%i%p1%d;%p2%dr, - cub=\E[%p1%dD, - cub1=^H, - cud1=^J, - cud=\E[%p1%dB, - cuf1=\E[C, - cuf=\E[%p1%dC, - cup=\E[%i%p1%d;%p2%dH, - cuu1=\E[A, - cuu=\E[%p1%dA, - dch=\E[%p1%dP, - dch1=\E[P, - dim=\E[2m, - dl=\E[%p1%dM, - dl1=\E[M, - ech=\E[%p1%dX, - ed=\E[J, - el=\E[K, - el1=\E[1K, - enacs=\E)0, - flash=\E[?5h$<80/>\E[?5l, - fsl=^G, - home=\E[H, - hpa=\E[%i%p1%dG, - hs, - ht=^I, - hts=\EH, - ich=\E[%p1%d@, - il1=\E[L, - il=\E[%p1%dL, - ind=^J, - indn=\E[%p1%dS, - invis=\E[8m, - is2=\E[4l\E>\E[?1034l, - it#8, - kel=\E[1;2F, - ked=\E[1;5F, - ka1=\E[1~, - ka3=\E[5~, - kc1=\E[4~, - kc3=\E[6~, - kbs=\177, - kcbt=\E[Z, - kb2=\EOu, - kcub1=\EOD, - kcud1=\EOB, - kcuf1=\EOC, - kcuu1=\EOA, - kDC=\E[3;2~, - kent=\EOM, - kEND=\E[1;2F, - kIC=\E[2;2~, - kNXT=\E[6;2~, - kPRV=\E[5;2~, - kHOM=\E[1;2H, - kLFT=\E[1;2D, - kRIT=\E[1;2C, - kind=\E[1;2B, - kri=\E[1;2A, - kclr=\E[3;5~, - kdl1=\E[3;2~, - kdch1=\E[3~, - kich1=\E[2~, - kend=\E[4~, - kf1=\EOP, - kf2=\EOQ, - kf3=\EOR, - kf4=\EOS, - kf5=\E[15~, - kf6=\E[17~, - kf7=\E[18~, - kf8=\E[19~, - kf9=\E[20~, - kf10=\E[21~, - kf11=\E[23~, - kf12=\E[24~, - kf13=\E[1;2P, - kf14=\E[1;2Q, - kf15=\E[1;2R, - kf16=\E[1;2S, - kf17=\E[15;2~, - kf18=\E[17;2~, - kf19=\E[18;2~, - kf20=\E[19;2~, - kf21=\E[20;2~, - kf22=\E[21;2~, - kf23=\E[23;2~, - kf24=\E[24;2~, - kf25=\E[1;5P, - kf26=\E[1;5Q, - kf27=\E[1;5R, - kf28=\E[1;5S, - kf29=\E[15;5~, - kf30=\E[17;5~, - kf31=\E[18;5~, - kf32=\E[19;5~, - kf33=\E[20;5~, - kf34=\E[21;5~, - kf35=\E[23;5~, - kf36=\E[24;5~, - kf37=\E[1;6P, - kf38=\E[1;6Q, - kf39=\E[1;6R, - kf40=\E[1;6S, - kf41=\E[15;6~, - kf42=\E[17;6~, - kf43=\E[18;6~, - kf44=\E[19;6~, - kf45=\E[20;6~, - kf46=\E[21;6~, - kf47=\E[23;6~, - kf48=\E[24;6~, - kf49=\E[1;3P, - kf50=\E[1;3Q, - kf51=\E[1;3R, - kf52=\E[1;3S, - kf53=\E[15;3~, - kf54=\E[17;3~, - kf55=\E[18;3~, - kf56=\E[19;3~, - kf57=\E[20;3~, - kf58=\E[21;3~, - kf59=\E[23;3~, - kf60=\E[24;3~, - kf61=\E[1;4P, - kf62=\E[1;4Q, - kf63=\E[1;4R, - khome=\E[1~, - kil1=\E[2;5~, - krmir=\E[2;2~, - knp=\E[6~, - kmous=\E[M, - kpp=\E[5~, - lines#24, - mir, - msgr, - npc, - op=\E[39;49m, - pairs#64, - mc0=\E[i, - mc4=\E[4i, - mc5=\E[5i, - rc=\E8, - rev=\E[7m, - ri=\EM, - ritm=\E[23m, - rmacs=\E(B, - rmcup=\E[?1049l, - rmir=\E[4l, - rmkx=\E[?1l\E>, - rmso=\E[27m, - rmul=\E[24m, - rs1=\Ec, - rs2=\E[4l\E>\E[?1034l, - sc=\E7, - setab=\E[4%p1%dm, - setaf=\E[3%p1%dm, - setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, - setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, - sgr0=\E[0m, - sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, - sitm=\E[3m, - smacs=\E(0, - smcup=\E[?1049h, - smir=\E[4h, - smkx=\E[?1h\E=, - smso=\E[7m, - smul=\E[4m, - tbc=\E[3g, - tsl=\E]0;, - xenl, - vpa=\E[%i%p1%dd, -# XTerm extensions - rmxx=\E[29m, - smxx=\E[9m, -# tmux extensions, see TERMINFO EXTENSIONS in tmux(1) - Tc, - Ms=\E]52;%p1%s;%p2%s\007, - Se=\E[2 q, - Ss=\E[%p1%d q, - -st-256color| simpleterm with 256 colors, - use=st, - ccc, - colors#256, - oc=\E]104\007, - pairs#32767, -# Nicked from xterm-256color - initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, - setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, - setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, - -st-meta| simpleterm with meta key, - use=st, - km, - rmm=\E[?1034l, - smm=\E[?1034h, - rs2=\E[4l\E>\E[?1034h, - is2=\E[4l\E>\E[?1034h, - -st-meta-256color| simpleterm with meta key and 256 colors, - use=st-256color, - km, - rmm=\E[?1034l, - smm=\E[?1034h, - rs2=\E[4l\E>\E[?1034h, - is2=\E[4l\E>\E[?1034h, diff --git a/.suckless/st/st.o b/.suckless/st/st.o deleted file mode 100644 index 90f6a064ac8ec9a2646bf031abf48e33cbf054be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73184 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≈y6pWvCxBs4Mh!P*FH3D|uMH+$OQ#-)k4 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 diff --git a/.suckless/st/win.h b/.suckless/st/win.h deleted file mode 100644 index a6ef1b9..0000000 --- a/.suckless/st/win.h +++ /dev/null @@ -1,39 +0,0 @@ -/* See LICENSE for license details. */ - -enum win_mode { - MODE_VISIBLE = 1 << 0, - MODE_FOCUSED = 1 << 1, - MODE_APPKEYPAD = 1 << 2, - MODE_MOUSEBTN = 1 << 3, - MODE_MOUSEMOTION = 1 << 4, - MODE_REVERSE = 1 << 5, - MODE_KBDLOCK = 1 << 6, - MODE_HIDE = 1 << 7, - MODE_APPCURSOR = 1 << 8, - MODE_MOUSESGR = 1 << 9, - MODE_8BIT = 1 << 10, - MODE_BLINK = 1 << 11, - MODE_FBLINK = 1 << 12, - MODE_FOCUS = 1 << 13, - MODE_MOUSEX10 = 1 << 14, - MODE_MOUSEMANY = 1 << 15, - MODE_BRCKTPASTE = 1 << 16, - MODE_NUMLOCK = 1 << 17, - MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ - |MODE_MOUSEMANY, -}; - -void xbell(void); -void xclipcopy(void); -void xdrawcursor(int, int, Glyph, int, int, Glyph); -void xdrawline(Line, int, int, int); -void xfinishdraw(void); -void xloadcols(void); -int xsetcolorname(int, const char *); -void xsettitle(char *); -int xsetcursor(int); -void xsetmode(int, unsigned int); -void xsetpointermotion(int); -void xsetsel(char *); -int xstartdraw(void); -void xximspot(int, int); diff --git a/.suckless/st/x.c b/.suckless/st/x.c deleted file mode 100644 index 78a4044..0000000 --- a/.suckless/st/x.c +++ /dev/null @@ -1,2045 +0,0 @@ -/* See LICENSE for license details. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static char *argv0; -#include "arg.h" -#include "st.h" -#include "win.h" - -/* types used in config.h */ -typedef struct { - uint mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Shortcut; - -typedef struct { - uint mod; - uint button; - void (*func)(const Arg *); - const Arg arg; - uint release; -} MouseShortcut; - -typedef struct { - KeySym k; - uint mask; - char *s; - /* three-valued logic variables: 0 indifferent, 1 on, -1 off */ - signed char appkey; /* application keypad */ - signed char appcursor; /* application cursor */ -} Key; - -/* X modifiers */ -#define XK_ANY_MOD UINT_MAX -#define XK_NO_MOD 0 -#define XK_SWITCH_MOD (1<<13) - -/* function definitions used in config.h */ -static void clipcopy(const Arg *); -static void clippaste(const Arg *); -static void numlock(const Arg *); -static void selpaste(const Arg *); -static void zoom(const Arg *); -static void zoomabs(const Arg *); -static void zoomreset(const Arg *); -static void ttysend(const Arg *); - -/* config.h for applying patches and the configuration. */ -#include "config.h" - -/* XEMBED messages */ -#define XEMBED_FOCUS_IN 4 -#define XEMBED_FOCUS_OUT 5 - -/* macros */ -#define IS_SET(flag) ((win.mode & (flag)) != 0) -#define TRUERED(x) (((x) & 0xff0000) >> 8) -#define TRUEGREEN(x) (((x) & 0xff00)) -#define TRUEBLUE(x) (((x) & 0xff) << 8) - -typedef XftDraw *Draw; -typedef XftColor Color; -typedef XftGlyphFontSpec GlyphFontSpec; - -/* Purely graphic info */ -typedef struct { - int tw, th; /* tty width and height */ - int w, h; /* window width and height */ - int hborderpx, vborderpx; - int ch; /* char height */ - int cw; /* char width */ - int mode; /* window state/mode flags */ - int cursor; /* cursor style */ -} TermWindow; - -typedef struct { - Display *dpy; - Colormap cmap; - Window win; - Drawable buf; - GlyphFontSpec *specbuf; /* font spec buffer used for rendering */ - Atom xembed, wmdeletewin, netwmname, netwmpid; - struct { - XIM xim; - XIC xic; - XPoint spot; - XVaNestedList spotlist; - } ime; - Draw draw; - Visual *vis; - XSetWindowAttributes attrs; - int scr; - int isfixed; /* is fixed geometry? */ - int l, t; /* left and top offset */ - int gm; /* geometry mask */ -} XWindow; - -typedef struct { - Atom xtarget; - char *primary, *clipboard; - struct timespec tclick1; - struct timespec tclick2; -} XSelection; - -/* Font structure */ -#define Font Font_ -typedef struct { - int height; - int width; - int ascent; - int descent; - int badslant; - int badweight; - short lbearing; - short rbearing; - XftFont *match; - FcFontSet *set; - FcPattern *pattern; -} Font; - -/* Drawing Context */ -typedef struct { - Color *col; - size_t collen; - Font font, bfont, ifont, ibfont; - GC gc; -} DC; - -static inline ushort sixd_to_16bit(int); -static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); -static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); -static void xdrawglyph(Glyph, int, int); -static void xclear(int, int, int, int); -static int xgeommasktogravity(int); -static int ximopen(Display *); -static void ximinstantiate(Display *, XPointer, XPointer); -static void ximdestroy(XIM, XPointer, XPointer); -static int xicdestroy(XIC, XPointer, XPointer); -static void xinit(int, int); -static void cresize(int, int); -static void xresize(int, int); -static void xhints(void); -static int xloadcolor(int, const char *, Color *); -static int xloadfont(Font *, FcPattern *); -static void xloadfonts(char *, double); -static void xunloadfont(Font *); -static void xunloadfonts(void); -static void xsetenv(void); -static void xseturgency(int); -static int evcol(XEvent *); -static int evrow(XEvent *); - -static void expose(XEvent *); -static void visibility(XEvent *); -static void unmap(XEvent *); -static void kpress(XEvent *); -static void cmessage(XEvent *); -static void resize(XEvent *); -static void focus(XEvent *); -static int mouseaction(XEvent *, uint); -static void brelease(XEvent *); -static void bpress(XEvent *); -static void bmotion(XEvent *); -static void propnotify(XEvent *); -static void selnotify(XEvent *); -static void selclear_(XEvent *); -static void selrequest(XEvent *); -static void setsel(char *, Time); -static void mousesel(XEvent *, int); -static void mousereport(XEvent *); -static char *kmap(KeySym, uint); -static int match(uint, uint); - -static void run(void); -static void usage(void); - -static void (*handler[LASTEvent])(XEvent *) = { - [KeyPress] = kpress, - [ClientMessage] = cmessage, - [ConfigureNotify] = resize, - [VisibilityNotify] = visibility, - [UnmapNotify] = unmap, - [Expose] = expose, - [FocusIn] = focus, - [FocusOut] = focus, - [MotionNotify] = bmotion, - [ButtonPress] = bpress, - [ButtonRelease] = brelease, -/* - * Uncomment if you want the selection to disappear when you select something - * different in another window. - */ -/* [SelectionClear] = selclear_, */ - [SelectionNotify] = selnotify, -/* - * PropertyNotify is only turned on when there is some INCR transfer happening - * for the selection retrieval. - */ - [PropertyNotify] = propnotify, - [SelectionRequest] = selrequest, -}; - -/* Globals */ -static DC dc; -static XWindow xw; -static XSelection xsel; -static TermWindow win; - -/* Font Ring Cache */ -enum { - FRC_NORMAL, - FRC_ITALIC, - FRC_BOLD, - FRC_ITALICBOLD -}; - -typedef struct { - XftFont *font; - int flags; - Rune unicodep; -} Fontcache; - -/* Fontcache is an array now. A new font will be appended to the array. */ -static Fontcache *frc = NULL; -static int frclen = 0; -static int frccap = 0; -static char *usedfont = NULL; -static double usedfontsize = 0; -static double defaultfontsize = 0; - -static char *opt_class = NULL; -static char **opt_cmd = NULL; -static char *opt_embed = NULL; -static char *opt_font = NULL; -static char *opt_io = NULL; -static char *opt_line = NULL; -static char *opt_name = NULL; -static char *opt_title = NULL; - -static int oldbutton = 3; /* button event on startup: 3 = release */ - -void -clipcopy(const Arg *dummy) -{ - Atom clipboard; - - free(xsel.clipboard); - xsel.clipboard = NULL; - - if (xsel.primary != NULL) { - xsel.clipboard = xstrdup(xsel.primary); - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); - } -} - -void -clippaste(const Arg *dummy) -{ - Atom clipboard; - - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - XConvertSelection(xw.dpy, clipboard, xsel.xtarget, clipboard, - xw.win, CurrentTime); -} - -void -selpaste(const Arg *dummy) -{ - XConvertSelection(xw.dpy, XA_PRIMARY, xsel.xtarget, XA_PRIMARY, - xw.win, CurrentTime); -} - -void -numlock(const Arg *dummy) -{ - win.mode ^= MODE_NUMLOCK; -} - -void -zoom(const Arg *arg) -{ - Arg larg; - - larg.f = usedfontsize + arg->f; - zoomabs(&larg); -} - -void -zoomabs(const Arg *arg) -{ - xunloadfonts(); - xloadfonts(usedfont, arg->f); - cresize(0, 0); - redraw(); - xhints(); -} - -void -zoomreset(const Arg *arg) -{ - Arg larg; - - if (defaultfontsize > 0) { - larg.f = defaultfontsize; - zoomabs(&larg); - } -} - -void -ttysend(const Arg *arg) -{ - ttywrite(arg->s, strlen(arg->s), 1); -} - -int -evcol(XEvent *e) -{ - int x = e->xbutton.x - win.hborderpx; - LIMIT(x, 0, win.tw - 1); - return x / win.cw; -} - -int -evrow(XEvent *e) -{ - int y = e->xbutton.y - win.vborderpx; - LIMIT(y, 0, win.th - 1); - return y / win.ch; -} - -void -mousesel(XEvent *e, int done) -{ - int type, seltype = SEL_REGULAR; - uint state = e->xbutton.state & ~(Button1Mask | forcemousemod); - - for (type = 1; type < LEN(selmasks); ++type) { - if (match(selmasks[type], state)) { - seltype = type; - break; - } - } - selextend(evcol(e), evrow(e), seltype, done); - if (done) - setsel(getsel(), e->xbutton.time); -} - -void -mousereport(XEvent *e) -{ - int len, x = evcol(e), y = evrow(e), - button = e->xbutton.button, state = e->xbutton.state; - char buf[40]; - static int ox, oy; - - /* from urxvt */ - if (e->xbutton.type == MotionNotify) { - if (x == ox && y == oy) - return; - if (!IS_SET(MODE_MOUSEMOTION) && !IS_SET(MODE_MOUSEMANY)) - return; - /* MOUSE_MOTION: no reporting if no button is pressed */ - if (IS_SET(MODE_MOUSEMOTION) && oldbutton == 3) - return; - - button = oldbutton + 32; - ox = x; - oy = y; - } else { - if (!IS_SET(MODE_MOUSESGR) && e->xbutton.type == ButtonRelease) { - button = 3; - } else { - button -= Button1; - if (button >= 3) - button += 64 - 3; - } - if (e->xbutton.type == ButtonPress) { - oldbutton = button; - ox = x; - oy = y; - } else if (e->xbutton.type == ButtonRelease) { - oldbutton = 3; - /* MODE_MOUSEX10: no button release reporting */ - if (IS_SET(MODE_MOUSEX10)) - return; - if (button == 64 || button == 65) - return; - } - } - - if (!IS_SET(MODE_MOUSEX10)) { - button += ((state & ShiftMask ) ? 4 : 0) - + ((state & Mod4Mask ) ? 8 : 0) - + ((state & ControlMask) ? 16 : 0); - } - - if (IS_SET(MODE_MOUSESGR)) { - len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", - button, x+1, y+1, - e->xbutton.type == ButtonRelease ? 'm' : 'M'); - } else if (x < 223 && y < 223) { - len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", - 32+button, 32+x+1, 32+y+1); - } else { - return; - } - - ttywrite(buf, len, 0); -} - -int -mouseaction(XEvent *e, uint release) -{ - MouseShortcut *ms; - - for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { - if (ms->release == release && - ms->button == e->xbutton.button && - (match(ms->mod, e->xbutton.state) || /* exact or forced */ - match(ms->mod, e->xbutton.state & ~forcemousemod))) { - ms->func(&(ms->arg)); - return 1; - } - } - - return 0; -} - -void -bpress(XEvent *e) -{ - struct timespec now; - int snap; - - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - if (mouseaction(e, 0)) - return; - - if (e->xbutton.button == Button1) { - /* - * If the user clicks below predefined timeouts specific - * snapping behaviour is exposed. - */ - clock_gettime(CLOCK_MONOTONIC, &now); - if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) { - snap = SNAP_LINE; - } else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) { - snap = SNAP_WORD; - } else { - snap = 0; - } - xsel.tclick2 = xsel.tclick1; - xsel.tclick1 = now; - - selstart(evcol(e), evrow(e), snap); - } -} - -void -propnotify(XEvent *e) -{ - XPropertyEvent *xpev; - Atom clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - - xpev = &e->xproperty; - if (xpev->state == PropertyNewValue && - (xpev->atom == XA_PRIMARY || - xpev->atom == clipboard)) { - selnotify(e); - } -} - -void -selnotify(XEvent *e) -{ - ulong nitems, ofs, rem; - int format; - uchar *data, *last, *repl; - Atom type, incratom, property = None; - - incratom = XInternAtom(xw.dpy, "INCR", 0); - - ofs = 0; - if (e->type == SelectionNotify) - property = e->xselection.property; - else if (e->type == PropertyNotify) - property = e->xproperty.atom; - - if (property == None) - return; - - do { - if (XGetWindowProperty(xw.dpy, xw.win, property, ofs, - BUFSIZ/4, False, AnyPropertyType, - &type, &format, &nitems, &rem, - &data)) { - fprintf(stderr, "Clipboard allocation failed\n"); - return; - } - - if (e->type == PropertyNotify && nitems == 0 && rem == 0) { - /* - * If there is some PropertyNotify with no data, then - * this is the signal of the selection owner that all - * data has been transferred. We won't need to receive - * PropertyNotify events anymore. - */ - MODBIT(xw.attrs.event_mask, 0, PropertyChangeMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, - &xw.attrs); - } - - if (type == incratom) { - /* - * Activate the PropertyNotify events so we receive - * when the selection owner does send us the next - * chunk of data. - */ - MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, - &xw.attrs); - - /* - * Deleting the property is the transfer start signal. - */ - XDeleteProperty(xw.dpy, xw.win, (int)property); - continue; - } - - /* - * As seen in getsel: - * Line endings are inconsistent in the terminal and GUI world - * copy and pasting. When receiving some selection data, - * replace all '\n' with '\r'. - * FIXME: Fix the computer world. - */ - repl = data; - last = data + nitems * format / 8; - while ((repl = memchr(repl, '\n', last - repl))) { - *repl++ = '\r'; - } - - if (IS_SET(MODE_BRCKTPASTE) && ofs == 0) - ttywrite("\033[200~", 6, 0); - ttywrite((char *)data, nitems * format / 8, 1); - if (IS_SET(MODE_BRCKTPASTE) && rem == 0) - ttywrite("\033[201~", 6, 0); - XFree(data); - /* number of 32-bit chunks returned */ - ofs += nitems * format / 32; - } while (rem > 0); - - /* - * Deleting the property again tells the selection owner to send the - * next data chunk in the property. - */ - XDeleteProperty(xw.dpy, xw.win, (int)property); -} - -void -xclipcopy(void) -{ - clipcopy(NULL); -} - -void -selclear_(XEvent *e) -{ - selclear(); -} - -void -selrequest(XEvent *e) -{ - XSelectionRequestEvent *xsre; - XSelectionEvent xev; - Atom xa_targets, string, clipboard; - char *seltext; - - xsre = (XSelectionRequestEvent *) e; - xev.type = SelectionNotify; - xev.requestor = xsre->requestor; - xev.selection = xsre->selection; - xev.target = xsre->target; - xev.time = xsre->time; - if (xsre->property == None) - xsre->property = xsre->target; - - /* reject */ - xev.property = None; - - xa_targets = XInternAtom(xw.dpy, "TARGETS", 0); - if (xsre->target == xa_targets) { - /* respond with the supported type */ - string = xsel.xtarget; - XChangeProperty(xsre->display, xsre->requestor, xsre->property, - XA_ATOM, 32, PropModeReplace, - (uchar *) &string, 1); - xev.property = xsre->property; - } else if (xsre->target == xsel.xtarget || xsre->target == XA_STRING) { - /* - * xith XA_STRING non ascii characters may be incorrect in the - * requestor. It is not our problem, use utf8. - */ - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - if (xsre->selection == XA_PRIMARY) { - seltext = xsel.primary; - } else if (xsre->selection == clipboard) { - seltext = xsel.clipboard; - } else { - fprintf(stderr, - "Unhandled clipboard selection 0x%lx\n", - xsre->selection); - return; - } - if (seltext != NULL) { - XChangeProperty(xsre->display, xsre->requestor, - xsre->property, xsre->target, - 8, PropModeReplace, - (uchar *)seltext, strlen(seltext)); - xev.property = xsre->property; - } - } - - /* all done, send a notification to the listener */ - if (!XSendEvent(xsre->display, xsre->requestor, 1, 0, (XEvent *) &xev)) - fprintf(stderr, "Error sending SelectionNotify event\n"); -} - -void -setsel(char *str, Time t) -{ - if (!str) - return; - - free(xsel.primary); - xsel.primary = str; - - XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); - if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) - selclear(); -} - -void -xsetsel(char *str) -{ - setsel(str, CurrentTime); -} - -void -brelease(XEvent *e) -{ - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - if (mouseaction(e, 1)) - return; - if (e->xbutton.button == Button1) - mousesel(e, 1); -} - -void -bmotion(XEvent *e) -{ - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - mousesel(e, 0); -} - -void -cresize(int width, int height) -{ - int col, row; - - if (width != 0) - win.w = width; - if (height != 0) - win.h = height; - - col = (win.w - 2 * borderpx) / win.cw; - row = (win.h - 2 * borderpx) / win.ch; - col = MAX(1, col); - row = MAX(1, row); - - win.hborderpx = (win.w - col * win.cw) / 2; - win.vborderpx = (win.h - row * win.ch) / 2; - - tresize(col, row); - xresize(col, row); - ttyresize(win.tw, win.th); -} - -void -xresize(int col, int row) -{ - win.tw = col * win.cw; - win.th = row * win.ch; - - XFreePixmap(xw.dpy, xw.buf); - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, - DefaultDepth(xw.dpy, xw.scr)); - XftDrawChange(xw.draw, xw.buf); - xclear(0, 0, win.w, win.h); - - /* resize to new width */ - xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec)); -} - -ushort -sixd_to_16bit(int x) -{ - return x == 0 ? 0 : 0x3737 + 0x2828 * x; -} - -int -xloadcolor(int i, const char *name, Color *ncolor) -{ - XRenderColor color = { .alpha = 0xffff }; - - if (!name) { - if (BETWEEN(i, 16, 255)) { /* 256 color */ - if (i < 6*6*6+16) { /* same colors as xterm */ - color.red = sixd_to_16bit( ((i-16)/36)%6 ); - color.green = sixd_to_16bit( ((i-16)/6) %6 ); - color.blue = sixd_to_16bit( ((i-16)/1) %6 ); - } else { /* greyscale */ - color.red = 0x0808 + 0x0a0a * (i - (6*6*6+16)); - color.green = color.blue = color.red; - } - return XftColorAllocValue(xw.dpy, xw.vis, - xw.cmap, &color, ncolor); - } else - name = colorname[i]; - } - - return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); -} - -void -xloadcols(void) -{ - int i; - static int loaded; - Color *cp; - - if (loaded) { - for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) - XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); - } else { - dc.collen = MAX(LEN(colorname), 256); - dc.col = xmalloc(dc.collen * sizeof(Color)); - } - - for (i = 0; i < dc.collen; i++) - if (!xloadcolor(i, NULL, &dc.col[i])) { - if (colorname[i]) - die("could not allocate color '%s'\n", colorname[i]); - else - die("could not allocate color %d\n", i); - } - loaded = 1; -} - -int -xsetcolorname(int x, const char *name) -{ - Color ncolor; - - if (!BETWEEN(x, 0, dc.collen)) - return 1; - - if (!xloadcolor(x, name, &ncolor)) - return 1; - - XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); - dc.col[x] = ncolor; - - return 0; -} - -/* - * Absolute coordinates. - */ -void -xclear(int x1, int y1, int x2, int y2) -{ - XftDrawRect(xw.draw, - &dc.col[IS_SET(MODE_REVERSE)? defaultfg : defaultbg], - x1, y1, x2-x1, y2-y1); -} - -void -xhints(void) -{ - XClassHint class = {opt_name ? opt_name : termname, - opt_class ? opt_class : termname}; - XWMHints wm = {.flags = InputHint, .input = 1}; - XSizeHints *sizeh; - - sizeh = XAllocSizeHints(); - - sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; - sizeh->height = win.h; - sizeh->width = win.w; - sizeh->height_inc = 1; - sizeh->width_inc = 1; - sizeh->base_height = 2 * borderpx; - sizeh->base_width = 2 * borderpx; - sizeh->min_height = win.ch + 2 * borderpx; - sizeh->min_width = win.cw + 2 * borderpx; - if (xw.isfixed) { - sizeh->flags |= PMaxSize; - sizeh->min_width = sizeh->max_width = win.w; - sizeh->min_height = sizeh->max_height = win.h; - } - if (xw.gm & (XValue|YValue)) { - sizeh->flags |= USPosition | PWinGravity; - sizeh->x = xw.l; - sizeh->y = xw.t; - sizeh->win_gravity = xgeommasktogravity(xw.gm); - } - - XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, - &class); - XFree(sizeh); -} - -int -xgeommasktogravity(int mask) -{ - switch (mask & (XNegative|YNegative)) { - case 0: - return NorthWestGravity; - case XNegative: - return NorthEastGravity; - case YNegative: - return SouthWestGravity; - } - - return SouthEastGravity; -} - -int -xloadfont(Font *f, FcPattern *pattern) -{ - FcPattern *configured; - FcPattern *match; - FcResult result; - XGlyphInfo extents; - int wantattr, haveattr; - - /* - * Manually configure instead of calling XftMatchFont - * so that we can use the configured pattern for - * "missing glyph" lookups. - */ - configured = FcPatternDuplicate(pattern); - if (!configured) - return 1; - - FcConfigSubstitute(NULL, configured, FcMatchPattern); - XftDefaultSubstitute(xw.dpy, xw.scr, configured); - - match = FcFontMatch(NULL, configured, &result); - if (!match) { - FcPatternDestroy(configured); - return 1; - } - - if (!(f->match = XftFontOpenPattern(xw.dpy, match))) { - FcPatternDestroy(configured); - FcPatternDestroy(match); - return 1; - } - - if ((XftPatternGetInteger(pattern, "slant", 0, &wantattr) == - XftResultMatch)) { - /* - * Check if xft was unable to find a font with the appropriate - * slant but gave us one anyway. Try to mitigate. - */ - if ((XftPatternGetInteger(f->match->pattern, "slant", 0, - &haveattr) != XftResultMatch) || haveattr < wantattr) { - f->badslant = 1; - fputs("font slant does not match\n", stderr); - } - } - - if ((XftPatternGetInteger(pattern, "weight", 0, &wantattr) == - XftResultMatch)) { - if ((XftPatternGetInteger(f->match->pattern, "weight", 0, - &haveattr) != XftResultMatch) || haveattr != wantattr) { - f->badweight = 1; - fputs("font weight does not match\n", stderr); - } - } - - XftTextExtentsUtf8(xw.dpy, f->match, - (const FcChar8 *) ascii_printable, - strlen(ascii_printable), &extents); - - f->set = NULL; - f->pattern = configured; - - f->ascent = f->match->ascent; - f->descent = f->match->descent; - f->lbearing = 0; - f->rbearing = f->match->max_advance_width; - - f->height = f->ascent + f->descent; - f->width = DIVCEIL(extents.xOff, strlen(ascii_printable)); - - return 0; -} - -void -xloadfonts(char *fontstr, double fontsize) -{ - FcPattern *pattern; - double fontval; - - if (fontstr[0] == '-') - pattern = XftXlfdParse(fontstr, False, False); - else - pattern = FcNameParse((FcChar8 *)fontstr); - - if (!pattern) - die("can't open font %s\n", fontstr); - - if (fontsize > 1) { - FcPatternDel(pattern, FC_PIXEL_SIZE); - FcPatternDel(pattern, FC_SIZE); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)fontsize); - usedfontsize = fontsize; - } else { - if (FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == - FcResultMatch) { - usedfontsize = fontval; - } else if (FcPatternGetDouble(pattern, FC_SIZE, 0, &fontval) == - FcResultMatch) { - usedfontsize = -1; - } else { - /* - * Default font size is 12, if none given. This is to - * have a known usedfontsize value. - */ - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, 12); - usedfontsize = 12; - } - defaultfontsize = usedfontsize; - } - - if (xloadfont(&dc.font, pattern)) - die("can't open font %s\n", fontstr); - - if (usedfontsize < 0) { - FcPatternGetDouble(dc.font.match->pattern, - FC_PIXEL_SIZE, 0, &fontval); - usedfontsize = fontval; - if (fontsize == 0) - defaultfontsize = fontval; - } - - /* Setting character width and height. */ - win.cw = ceilf(dc.font.width * cwscale); - win.ch = ceilf(dc.font.height * chscale); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); - if (xloadfont(&dc.ifont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDel(pattern, FC_WEIGHT); - FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); - if (xloadfont(&dc.ibfont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); - if (xloadfont(&dc.bfont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDestroy(pattern); -} - -void -xunloadfont(Font *f) -{ - XftFontClose(xw.dpy, f->match); - FcPatternDestroy(f->pattern); - if (f->set) - FcFontSetDestroy(f->set); -} - -void -xunloadfonts(void) -{ - /* Free the loaded fonts in the font cache. */ - while (frclen > 0) - XftFontClose(xw.dpy, frc[--frclen].font); - - xunloadfont(&dc.font); - xunloadfont(&dc.bfont); - xunloadfont(&dc.ifont); - xunloadfont(&dc.ibfont); -} - -int -ximopen(Display *dpy) -{ - XIMCallback imdestroy = { .client_data = NULL, .callback = ximdestroy }; - XICCallback icdestroy = { .client_data = NULL, .callback = xicdestroy }; - - xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL); - if (xw.ime.xim == NULL) - return 0; - - if (XSetIMValues(xw.ime.xim, XNDestroyCallback, &imdestroy, NULL)) - fprintf(stderr, "XSetIMValues: " - "Could not set XNDestroyCallback.\n"); - - xw.ime.spotlist = XVaCreateNestedList(0, XNSpotLocation, &xw.ime.spot, - NULL); - - if (xw.ime.xic == NULL) { - xw.ime.xic = XCreateIC(xw.ime.xim, XNInputStyle, - XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, xw.win, - XNFocusWindow, xw.win, - XNDestroyCallback, &icdestroy, - NULL); - } - if (xw.ime.xic == NULL) - fprintf(stderr, "XCreateIC: Could not create input context.\n"); - - return 1; -} - -void -ximinstantiate(Display *dpy, XPointer client, XPointer call) -{ - if (ximopen(dpy)) - XUnregisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); -} - -void -ximdestroy(XIM xim, XPointer client, XPointer call) -{ - xw.ime.xim = NULL; - XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); - XFree(xw.ime.spotlist); -} - -int -xicdestroy(XIC xim, XPointer client, XPointer call) -{ - xw.ime.xic = NULL; - return 1; -} - -void -xinit(int cols, int rows) -{ - XGCValues gcvalues; - Cursor cursor; - Window parent; - pid_t thispid = getpid(); - XColor xmousefg, xmousebg; - - if (!(xw.dpy = XOpenDisplay(NULL))) - die("can't open display\n"); - xw.scr = XDefaultScreen(xw.dpy); - xw.vis = XDefaultVisual(xw.dpy, xw.scr); - - /* font */ - if (!FcInit()) - die("could not init fontconfig.\n"); - - usedfont = (opt_font == NULL)? font : opt_font; - xloadfonts(usedfont, 0); - - /* colors */ - xw.cmap = XDefaultColormap(xw.dpy, xw.scr); - xloadcols(); - - /* adjust fixed window geometry */ - win.w = 2 * win.hborderpx + cols * win.cw; - win.h = 2 * win.vborderpx + rows * win.ch; - if (xw.gm & XNegative) - xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; - if (xw.gm & YNegative) - xw.t += DisplayHeight(xw.dpy, xw.scr) - win.h - 2; - - /* Events */ - xw.attrs.background_pixel = dc.col[defaultbg].pixel; - xw.attrs.border_pixel = dc.col[defaultbg].pixel; - xw.attrs.bit_gravity = NorthWestGravity; - xw.attrs.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask - | ExposureMask | VisibilityChangeMask | StructureNotifyMask - | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; - xw.attrs.colormap = xw.cmap; - - if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) - parent = XRootWindow(xw.dpy, xw.scr); - xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, - win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, - xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity - | CWEventMask | CWColormap, &xw.attrs); - - memset(&gcvalues, 0, sizeof(gcvalues)); - gcvalues.graphics_exposures = False; - dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, - &gcvalues); - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, - DefaultDepth(xw.dpy, xw.scr)); - XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); - XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); - - /* font spec buffer */ - xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec)); - - /* Xft rendering context */ - xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap); - - /* input methods */ - if (!ximopen(xw.dpy)) { - XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); - } - - /* white cursor, black outline */ - cursor = XCreateFontCursor(xw.dpy, mouseshape); - XDefineCursor(xw.dpy, xw.win, cursor); - - if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) { - xmousefg.red = 0xffff; - xmousefg.green = 0xffff; - xmousefg.blue = 0xffff; - } - - if (XParseColor(xw.dpy, xw.cmap, colorname[mousebg], &xmousebg) == 0) { - xmousebg.red = 0x0000; - xmousebg.green = 0x0000; - xmousebg.blue = 0x0000; - } - - XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg); - - xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); - xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); - xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False); - XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); - - xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False); - XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32, - PropModeReplace, (uchar *)&thispid, 1); - - win.mode = MODE_NUMLOCK; - resettitle(); - xhints(); - XMapWindow(xw.dpy, xw.win); - XSync(xw.dpy, False); - - clock_gettime(CLOCK_MONOTONIC, &xsel.tclick1); - clock_gettime(CLOCK_MONOTONIC, &xsel.tclick2); - xsel.primary = NULL; - xsel.clipboard = NULL; - xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); - if (xsel.xtarget == None) - xsel.xtarget = XA_STRING; -} - -int -xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) -{ - float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp; - ushort mode, prevmode = USHRT_MAX; - Font *font = &dc.font; - int frcflags = FRC_NORMAL; - float runewidth = win.cw; - Rune rune; - FT_UInt glyphidx; - FcResult fcres; - FcPattern *fcpattern, *fontpattern; - FcFontSet *fcsets[] = { NULL }; - FcCharSet *fccharset; - int i, f, numspecs = 0; - - for (i = 0, xp = winx, yp = winy + font->ascent; i < len; ++i) { - /* Fetch rune and mode for current glyph. */ - rune = glyphs[i].u; - mode = glyphs[i].mode; - - /* Skip dummy wide-character spacing. */ - if (mode == ATTR_WDUMMY) - continue; - - /* Determine font for glyph if different from previous glyph. */ - if (prevmode != mode) { - prevmode = mode; - font = &dc.font; - frcflags = FRC_NORMAL; - runewidth = win.cw * ((mode & ATTR_WIDE) ? 2.0f : 1.0f); - if ((mode & ATTR_ITALIC) && (mode & ATTR_BOLD)) { - font = &dc.ibfont; - frcflags = FRC_ITALICBOLD; - } else if (mode & ATTR_ITALIC) { - font = &dc.ifont; - frcflags = FRC_ITALIC; - } else if (mode & ATTR_BOLD) { - font = &dc.bfont; - frcflags = FRC_BOLD; - } - yp = winy + font->ascent; - } - - /* Lookup character index with default font. */ - glyphidx = XftCharIndex(xw.dpy, font->match, rune); - if (glyphidx) { - specs[numspecs].font = font->match; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; - continue; - } - - /* Fallback on font cache, search the font cache for match. */ - for (f = 0; f < frclen; f++) { - glyphidx = XftCharIndex(xw.dpy, frc[f].font, rune); - /* Everything correct. */ - if (glyphidx && frc[f].flags == frcflags) - break; - /* We got a default font for a not found glyph. */ - if (!glyphidx && frc[f].flags == frcflags - && frc[f].unicodep == rune) { - break; - } - } - - /* Nothing was found. Use fontconfig to find matching font. */ - if (f >= frclen) { - if (!font->set) - font->set = FcFontSort(0, font->pattern, - 1, 0, &fcres); - fcsets[0] = font->set; - - /* - * Nothing was found in the cache. Now use - * some dozen of Fontconfig calls to get the - * font for one single character. - * - * Xft and fontconfig are design failures. - */ - fcpattern = FcPatternDuplicate(font->pattern); - fccharset = FcCharSetCreate(); - - FcCharSetAddChar(fccharset, rune); - FcPatternAddCharSet(fcpattern, FC_CHARSET, - fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, 1); - - FcConfigSubstitute(0, fcpattern, - FcMatchPattern); - FcDefaultSubstitute(fcpattern); - - fontpattern = FcFontSetMatch(0, fcsets, 1, - fcpattern, &fcres); - - /* Allocate memory for the new cache entry. */ - if (frclen >= frccap) { - frccap += 16; - frc = xrealloc(frc, frccap * sizeof(Fontcache)); - } - - frc[frclen].font = XftFontOpenPattern(xw.dpy, - fontpattern); - if (!frc[frclen].font) - die("XftFontOpenPattern failed seeking fallback font: %s\n", - strerror(errno)); - frc[frclen].flags = frcflags; - frc[frclen].unicodep = rune; - - glyphidx = XftCharIndex(xw.dpy, frc[frclen].font, rune); - - f = frclen; - frclen++; - - FcPatternDestroy(fcpattern); - FcCharSetDestroy(fccharset); - } - - specs[numspecs].font = frc[f].font; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; - } - - return numspecs; -} - -void -xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) -{ - int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); - int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, - width = charlen * win.cw; - Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; - XRenderColor colfg, colbg; - XRectangle r; - - /* Fallback on color display for attributes not supported by the font */ - if (base.mode & ATTR_ITALIC && base.mode & ATTR_BOLD) { - if (dc.ibfont.badslant || dc.ibfont.badweight) - base.fg = defaultattr; - } else if ((base.mode & ATTR_ITALIC && dc.ifont.badslant) || - (base.mode & ATTR_BOLD && dc.bfont.badweight)) { - base.fg = defaultattr; - } - - if (IS_TRUECOL(base.fg)) { - colfg.alpha = 0xffff; - colfg.red = TRUERED(base.fg); - colfg.green = TRUEGREEN(base.fg); - colfg.blue = TRUEBLUE(base.fg); - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &truefg); - fg = &truefg; - } else { - fg = &dc.col[base.fg]; - } - - if (IS_TRUECOL(base.bg)) { - colbg.alpha = 0xffff; - colbg.green = TRUEGREEN(base.bg); - colbg.red = TRUERED(base.bg); - colbg.blue = TRUEBLUE(base.bg); - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &truebg); - bg = &truebg; - } else { - bg = &dc.col[base.bg]; - } - - /* Change basic system colors [0-7] to bright system colors [8-15] */ - if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7)) - fg = &dc.col[base.fg + 8]; - - if (IS_SET(MODE_REVERSE)) { - if (fg == &dc.col[defaultfg]) { - fg = &dc.col[defaultbg]; - } else { - colfg.red = ~fg->color.red; - colfg.green = ~fg->color.green; - colfg.blue = ~fg->color.blue; - colfg.alpha = fg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, - &revfg); - fg = &revfg; - } - - if (bg == &dc.col[defaultbg]) { - bg = &dc.col[defaultfg]; - } else { - colbg.red = ~bg->color.red; - colbg.green = ~bg->color.green; - colbg.blue = ~bg->color.blue; - colbg.alpha = bg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, - &revbg); - bg = &revbg; - } - } - - if ((base.mode & ATTR_BOLD_FAINT) == ATTR_FAINT) { - colfg.red = fg->color.red / 2; - colfg.green = fg->color.green / 2; - colfg.blue = fg->color.blue / 2; - colfg.alpha = fg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg); - fg = &revfg; - } - - if (base.mode & ATTR_REVERSE) { - temp = fg; - fg = bg; - bg = temp; - } - - if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK) - fg = bg; - - if (base.mode & ATTR_INVISIBLE) - fg = bg; - - /* Intelligent cleaning up of the borders. */ - if (x == 0) { - xclear(0, (y == 0)? 0 : winy, win.vborderpx, - winy + win.ch + - ((winy + win.ch >= win.vborderpx + win.th)? win.h : 0)); - } - if (winx + width >= win.hborderpx + win.tw) { - xclear(winx + width, (y == 0)? 0 : winy, win.w, - ((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch))); - } - if (y == 0) - xclear(winx, 0, winx + width, win.hborderpx); - if (winy + win.ch >= win.vborderpx + win.th) - xclear(winx, winy + win.ch, winx + width, win.h); - - /* Clean up the region we want to draw to. */ - XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); - - /* Set the clip region because Xft is sometimes dirty. */ - r.x = 0; - r.y = 0; - r.height = win.ch; - r.width = width; - XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); - - /* Render the glyphs. */ - XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - - /* Render underline and strikethrough. */ - if (base.mode & ATTR_UNDERLINE) { - XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, - width, 1); - } - - if (base.mode & ATTR_STRUCK) { - XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, - width, 1); - } - - /* Reset clip to none. */ - XftDrawSetClip(xw.draw, 0); -} - -void -xdrawglyph(Glyph g, int x, int y) -{ - int numspecs; - XftGlyphFontSpec spec; - - numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); - xdrawglyphfontspecs(&spec, g, numspecs, x, y); -} - -void -xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) -{ - Color drawcol; - - /* remove the old cursor */ - if (selected(ox, oy)) - og.mode ^= ATTR_REVERSE; - xdrawglyph(og, ox, oy); - - if (IS_SET(MODE_HIDE)) - return; - - /* - * Select the right color for the right mode. - */ - g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; - - if (IS_SET(MODE_REVERSE)) { - g.mode |= ATTR_REVERSE; - g.bg = defaultfg; - if (selected(cx, cy)) { - drawcol = dc.col[defaultcs]; - g.fg = defaultrcs; - } else { - drawcol = dc.col[defaultrcs]; - g.fg = defaultcs; - } - } else { - if (selected(cx, cy)) { - g.fg = defaultfg; - g.bg = defaultrcs; - } else { - g.fg = defaultbg; - g.bg = defaultcs; - } - drawcol = dc.col[g.bg]; - } - - /* draw the new one */ - if (IS_SET(MODE_FOCUSED)) { - switch (win.cursor) { - case 7: /* st extension: snowman (U+2603) */ - g.u = 0x2603; - case 0: /* Blinking Block */ - case 1: /* Blinking Block (Default) */ - case 2: /* Steady Block */ - xdrawglyph(g, cx, cy); - break; - case 3: /* Blinking Underline */ - case 4: /* Steady Underline */ - XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + (cy + 1) * win.ch - \ - cursorthickness, - win.cw, cursorthickness); - break; - case 5: /* Blinking bar */ - case 6: /* Steady bar */ - XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, - cursorthickness, win.ch); - break; - } - } else { - XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, - win.cw - 1, 1); - XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, - win.hborderpx + (cx + 1) * win.cw - 1, - win.vborderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + (cy + 1) * win.ch - 1, - win.cw, 1); - } -} - -void -xsetenv(void) -{ - char buf[sizeof(long) * 8 + 1]; - - snprintf(buf, sizeof(buf), "%lu", xw.win); - setenv("WINDOWID", buf, 1); -} - -void -xsettitle(char *p) -{ - XTextProperty prop; - DEFAULT(p, opt_title); - - Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, - &prop); - XSetWMName(xw.dpy, xw.win, &prop); - XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname); - XFree(prop.value); -} - -int -xstartdraw(void) -{ - return IS_SET(MODE_VISIBLE); -} - -void -xdrawline(Line line, int x1, int y1, int x2) -{ - int i, x, ox, numspecs; - Glyph base, new; - XftGlyphFontSpec *specs = xw.specbuf; - - numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); - i = ox = 0; - for (x = x1; x < x2 && i < numspecs; x++) { - new = line[x]; - if (new.mode == ATTR_WDUMMY) - continue; - if (selected(x, y1)) - new.mode ^= ATTR_REVERSE; - if (i > 0 && ATTRCMP(base, new)) { - xdrawglyphfontspecs(specs, base, i, ox, y1); - specs += i; - numspecs -= i; - i = 0; - } - if (i == 0) { - ox = x; - base = new; - } - i++; - } - if (i > 0) - xdrawglyphfontspecs(specs, base, i, ox, y1); -} - -void -xfinishdraw(void) -{ - XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, - win.h, 0, 0); - XSetForeground(xw.dpy, dc.gc, - dc.col[IS_SET(MODE_REVERSE)? - defaultfg : defaultbg].pixel); -} - -void -xximspot(int x, int y) -{ - if (xw.ime.xic == NULL) - return; - - xw.ime.spot.x = borderpx + x * win.cw; - xw.ime.spot.y = borderpx + (y + 1) * win.ch; - - XSetICValues(xw.ime.xic, XNPreeditAttributes, xw.ime.spotlist, NULL); -} - -void -expose(XEvent *ev) -{ - redraw(); -} - -void -visibility(XEvent *ev) -{ - XVisibilityEvent *e = &ev->xvisibility; - - MODBIT(win.mode, e->state != VisibilityFullyObscured, MODE_VISIBLE); -} - -void -unmap(XEvent *ev) -{ - win.mode &= ~MODE_VISIBLE; -} - -void -xsetpointermotion(int set) -{ - MODBIT(xw.attrs.event_mask, set, PointerMotionMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); -} - -void -xsetmode(int set, unsigned int flags) -{ - int mode = win.mode; - MODBIT(win.mode, set, flags); - if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE)) - redraw(); -} - -int -xsetcursor(int cursor) -{ - DEFAULT(cursor, 1); - if (!BETWEEN(cursor, 0, 6)) - return 1; - win.cursor = cursor; - return 0; -} - -void -xseturgency(int add) -{ - XWMHints *h = XGetWMHints(xw.dpy, xw.win); - - MODBIT(h->flags, add, XUrgencyHint); - XSetWMHints(xw.dpy, xw.win, h); - XFree(h); -} - -void -xbell(void) -{ - if (!(IS_SET(MODE_FOCUSED))) - xseturgency(1); - if (bellvolume) - XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); -} - -void -focus(XEvent *ev) -{ - XFocusChangeEvent *e = &ev->xfocus; - - if (e->mode == NotifyGrab) - return; - - if (ev->type == FocusIn) { - if (xw.ime.xic) - XSetICFocus(xw.ime.xic); - win.mode |= MODE_FOCUSED; - xseturgency(0); - if (IS_SET(MODE_FOCUS)) - ttywrite("\033[I", 3, 0); - } else { - if (xw.ime.xic) - XUnsetICFocus(xw.ime.xic); - win.mode &= ~MODE_FOCUSED; - if (IS_SET(MODE_FOCUS)) - ttywrite("\033[O", 3, 0); - } -} - -int -match(uint mask, uint state) -{ - return mask == XK_ANY_MOD || mask == (state & ~ignoremod); -} - -char* -kmap(KeySym k, uint state) -{ - Key *kp; - int i; - - /* Check for mapped keys out of X11 function keys. */ - for (i = 0; i < LEN(mappedkeys); i++) { - if (mappedkeys[i] == k) - break; - } - if (i == LEN(mappedkeys)) { - if ((k & 0xFFFF) < 0xFD00) - return NULL; - } - - for (kp = key; kp < key + LEN(key); kp++) { - if (kp->k != k) - continue; - - if (!match(kp->mask, state)) - continue; - - if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) - continue; - if (IS_SET(MODE_NUMLOCK) && kp->appkey == 2) - continue; - - if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) - continue; - - return kp->s; - } - - return NULL; -} - -void -kpress(XEvent *ev) -{ - XKeyEvent *e = &ev->xkey; - KeySym ksym; - char buf[64], *customkey; - int len; - Rune c; - Status status; - Shortcut *bp; - - if (IS_SET(MODE_KBDLOCK)) - return; - - if (xw.ime.xic) - len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); - else - len = XLookupString(e, buf, sizeof buf, &ksym, NULL); - /* 1. shortcuts */ - for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { - if (ksym == bp->keysym && match(bp->mod, e->state)) { - bp->func(&(bp->arg)); - return; - } - } - - /* 2. custom keys from config.h */ - if ((customkey = kmap(ksym, e->state))) { - ttywrite(customkey, strlen(customkey), 1); - return; - } - - /* 3. composed string from input method */ - if (len == 0) - return; - if (len == 1 && e->state & Mod1Mask) { - if (IS_SET(MODE_8BIT)) { - if (*buf < 0177) { - c = *buf | 0x80; - len = utf8encode(c, buf); - } - } else { - buf[1] = buf[0]; - buf[0] = '\033'; - len = 2; - } - } - ttywrite(buf, len, 1); -} - -void -cmessage(XEvent *e) -{ - /* - * See xembed specs - * http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html - */ - if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) { - if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { - win.mode |= MODE_FOCUSED; - xseturgency(0); - } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { - win.mode &= ~MODE_FOCUSED; - } - } else if (e->xclient.data.l[0] == xw.wmdeletewin) { - ttyhangup(); - exit(0); - } -} - -void -resize(XEvent *e) -{ - if (e->xconfigure.width == win.w && e->xconfigure.height == win.h) - return; - - cresize(e->xconfigure.width, e->xconfigure.height); -} - -void -run(void) -{ - XEvent ev; - int w = win.w, h = win.h; - fd_set rfd; - int xfd = XConnectionNumber(xw.dpy), xev, blinkset = 0, dodraw = 0; - int ttyfd; - struct timespec drawtimeout, *tv = NULL, now, last, lastblink; - long deltatime; - - /* Waiting for window mapping */ - do { - XNextEvent(xw.dpy, &ev); - /* - * This XFilterEvent call is required because of XOpenIM. It - * does filter out the key event and some client message for - * the input method too. - */ - if (XFilterEvent(&ev, None)) - continue; - if (ev.type == ConfigureNotify) { - w = ev.xconfigure.width; - h = ev.xconfigure.height; - } - } while (ev.type != MapNotify); - - ttyfd = ttynew(opt_line, shell, opt_io, opt_cmd); - cresize(w, h); - - clock_gettime(CLOCK_MONOTONIC, &last); - lastblink = last; - - for (xev = actionfps;;) { - FD_ZERO(&rfd); - FD_SET(ttyfd, &rfd); - FD_SET(xfd, &rfd); - - if (pselect(MAX(xfd, ttyfd)+1, &rfd, NULL, NULL, tv, NULL) < 0) { - if (errno == EINTR) - continue; - die("select failed: %s\n", strerror(errno)); - } - if (FD_ISSET(ttyfd, &rfd)) { - ttyread(); - if (blinktimeout) { - blinkset = tattrset(ATTR_BLINK); - if (!blinkset) - MODBIT(win.mode, 0, MODE_BLINK); - } - } - - if (FD_ISSET(xfd, &rfd)) - xev = actionfps; - - clock_gettime(CLOCK_MONOTONIC, &now); - drawtimeout.tv_sec = 0; - drawtimeout.tv_nsec = (1000 * 1E6)/ xfps; - tv = &drawtimeout; - - dodraw = 0; - if (blinktimeout && TIMEDIFF(now, lastblink) > blinktimeout) { - tsetdirtattr(ATTR_BLINK); - win.mode ^= MODE_BLINK; - lastblink = now; - dodraw = 1; - } - deltatime = TIMEDIFF(now, last); - if (deltatime > 1000 / (xev ? xfps : actionfps)) { - dodraw = 1; - last = now; - } - - if (dodraw) { - while (XPending(xw.dpy)) { - XNextEvent(xw.dpy, &ev); - if (XFilterEvent(&ev, None)) - continue; - if (handler[ev.type]) - (handler[ev.type])(&ev); - } - - draw(); - XFlush(xw.dpy); - - if (xev && !FD_ISSET(xfd, &rfd)) - xev--; - if (!FD_ISSET(ttyfd, &rfd) && !FD_ISSET(xfd, &rfd)) { - if (blinkset) { - if (TIMEDIFF(now, lastblink) \ - > blinktimeout) { - drawtimeout.tv_nsec = 1000; - } else { - drawtimeout.tv_nsec = (1E6 * \ - (blinktimeout - \ - TIMEDIFF(now, - lastblink))); - } - drawtimeout.tv_sec = \ - drawtimeout.tv_nsec / 1E9; - drawtimeout.tv_nsec %= (long)1E9; - } else { - tv = NULL; - } - } - } - } -} - -void -usage(void) -{ - die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]" - " [-n name] [-o file]\n" - " [-T title] [-t title] [-w windowid]" - " [[-e] command [args ...]]\n" - " %s [-aiv] [-c class] [-f font] [-g geometry]" - " [-n name] [-o file]\n" - " [-T title] [-t title] [-w windowid] -l line" - " [stty_args ...]\n", argv0, argv0); -} - -int -main(int argc, char *argv[]) -{ - xw.l = xw.t = 0; - xw.isfixed = False; - win.cursor = cursorshape; - - ARGBEGIN { - case 'a': - allowaltscreen = 0; - break; - case 'c': - opt_class = EARGF(usage()); - break; - case 'e': - if (argc > 0) - --argc, ++argv; - goto run; - case 'f': - opt_font = EARGF(usage()); - break; - case 'g': - xw.gm = XParseGeometry(EARGF(usage()), - &xw.l, &xw.t, &cols, &rows); - break; - case 'i': - xw.isfixed = 1; - break; - case 'o': - opt_io = EARGF(usage()); - break; - case 'l': - opt_line = EARGF(usage()); - break; - case 'n': - opt_name = EARGF(usage()); - break; - case 't': - case 'T': - opt_title = EARGF(usage()); - break; - case 'w': - opt_embed = EARGF(usage()); - break; - case 'v': - die("%s " VERSION "\n", argv0); - break; - default: - usage(); - } ARGEND; - -run: - if (argc > 0) /* eat all remaining arguments */ - opt_cmd = argv; - - if (!opt_title) - opt_title = (opt_line || !opt_cmd) ? "st" : opt_cmd[0]; - - setlocale(LC_CTYPE, ""); - XSetLocaleModifiers(""); - cols = MAX(cols, 1); - rows = MAX(rows, 1); - tnew(cols, rows); - xinit(cols, rows); - xsetenv(); - selinit(); - run(); - - return 0; -} diff --git a/.suckless/st/x.o b/.suckless/st/x.o deleted file mode 100644 index ce343e4f75995097b5318af633a960f1171f2050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73896 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�;S_7O^4`NFa?p=YW?C-EHrTYV_$_^sVk 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 diff --git a/.vim/autoload/plug.vim b/.vim/autoload/plug.vim deleted file mode 100644 index bc02f03..0000000 --- a/.vim/autoload/plug.vim +++ /dev/null @@ -1,2664 +0,0 @@ -" vim-plug: Vim plugin manager -" ============================ -" -" Download plug.vim and put it in ~/.vim/autoload -" -" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ -" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim -" -" Edit your .vimrc -" -" call plug#begin('~/.vim/plugged') -" -" " Make sure you use single quotes -" -" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align -" Plug 'junegunn/vim-easy-align' -" -" " Any valid git URL is allowed -" Plug 'https://github.com/junegunn/vim-github-dashboard.git' -" -" " Multiple Plug commands can be written in a single line using | separators -" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' -" -" " On-demand loading -" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } -" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } -" -" " Using a non-master branch -" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } -" -" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) -" Plug 'fatih/vim-go', { 'tag': '*' } -" -" " Plugin options -" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } -" -" " Plugin outside ~/.vim/plugged with post-update hook -" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } -" -" " Unmanaged plugin (manually installed and updated) -" Plug '~/my-prototype-plugin' -" -" " Initialize plugin system -" call plug#end() -" -" Then reload .vimrc and :PlugInstall to install plugins. -" -" Plug options: -" -"| Option | Description | -"| ----------------------- | ------------------------------------------------ | -"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | -"| `rtp` | Subdirectory that contains Vim plugin | -"| `dir` | Custom directory for the plugin | -"| `as` | Use different name for the plugin | -"| `do` | Post-update hook (string or funcref) | -"| `on` | On-demand loading: Commands or ``-mappings | -"| `for` | On-demand loading: File types | -"| `frozen` | Do not update unless explicitly specified | -" -" More information: https://github.com/junegunn/vim-plug -" -" -" Copyright (c) 2017 Junegunn Choi -" -" MIT License -" -" Permission is hereby granted, free of charge, to any person obtaining -" a copy of this software and associated documentation files (the -" "Software"), to deal in the Software without restriction, including -" without limitation the rights to use, copy, modify, merge, publish, -" distribute, sublicense, and/or sell copies of the Software, and to -" permit persons to whom the Software is furnished to do so, subject to -" the following conditions: -" -" The above copyright notice and this permission notice shall be -" included in all copies or substantial portions of the Software. -" -" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -if exists('g:loaded_plug') - finish -endif -let g:loaded_plug = 1 - -let s:cpo_save = &cpo -set cpo&vim - -let s:plug_src = 'https://github.com/junegunn/vim-plug.git' -let s:plug_tab = get(s:, 'plug_tab', -1) -let s:plug_buf = get(s:, 'plug_buf', -1) -let s:mac_gui = has('gui_macvim') && has('gui_running') -let s:is_win = has('win32') -let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) -let s:vim8 = has('patch-8.0.0039') && exists('*job_start') -if s:is_win && &shellslash - set noshellslash - let s:me = resolve(expand(':p')) - set shellslash -else - let s:me = resolve(expand(':p')) -endif -let s:base_spec = { 'branch': 'master', 'frozen': 0 } -let s:TYPE = { -\ 'string': type(''), -\ 'list': type([]), -\ 'dict': type({}), -\ 'funcref': type(function('call')) -\ } -let s:loaded = get(s:, 'loaded', {}) -let s:triggers = get(s:, 'triggers', {}) - -if s:is_win - function! s:plug_call(fn, ...) - let shellslash = &shellslash - try - set noshellslash - return call(a:fn, a:000) - finally - let &shellslash = shellslash - endtry - endfunction -else - function! s:plug_call(fn, ...) - return call(a:fn, a:000) - endfunction -endif - -function! s:plug_getcwd() - return s:plug_call('getcwd') -endfunction - -function! s:plug_fnamemodify(fname, mods) - return s:plug_call('fnamemodify', a:fname, a:mods) -endfunction - -function! s:plug_expand(fmt) - return s:plug_call('expand', a:fmt, 1) -endfunction - -function! s:plug_tempname() - return s:plug_call('tempname') -endfunction - -function! plug#begin(...) - if a:0 > 0 - let s:plug_home_org = a:1 - let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) - elseif exists('g:plug_home') - let home = s:path(g:plug_home) - elseif !empty(&rtp) - let home = s:path(split(&rtp, ',')[0]) . '/plugged' - else - return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') - endif - if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp - return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') - endif - - let g:plug_home = home - let g:plugs = {} - let g:plugs_order = [] - let s:triggers = {} - - call s:define_commands() - return 1 -endfunction - -function! s:define_commands() - command! -nargs=+ -bar Plug call plug#() - if !executable('git') - return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') - endif - if has('win32') - \ && &shellslash - \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe') - return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') - endif - if !has('nvim') - \ && (has('win32') || has('win32unix')) - \ && !has('multi_byte') - return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') - endif - command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) - command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) - command! -nargs=0 -bar -bang PlugClean call s:clean(0) - command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif - command! -nargs=0 -bar PlugStatus call s:status() - command! -nargs=0 -bar PlugDiff call s:diff() - command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) -endfunction - -function! s:to_a(v) - return type(a:v) == s:TYPE.list ? a:v : [a:v] -endfunction - -function! s:to_s(v) - return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" -endfunction - -function! s:glob(from, pattern) - return s:lines(globpath(a:from, a:pattern)) -endfunction - -function! s:source(from, ...) - let found = 0 - for pattern in a:000 - for vim in s:glob(a:from, pattern) - execute 'source' s:esc(vim) - let found = 1 - endfor - endfor - return found -endfunction - -function! s:assoc(dict, key, val) - let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) -endfunction - -function! s:ask(message, ...) - call inputsave() - echohl WarningMsg - let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) - echohl None - call inputrestore() - echo "\r" - return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 -endfunction - -function! s:ask_no_interrupt(...) - try - return call('s:ask', a:000) - catch - return 0 - endtry -endfunction - -function! s:lazy(plug, opt) - return has_key(a:plug, a:opt) && - \ (empty(s:to_a(a:plug[a:opt])) || - \ !isdirectory(a:plug.dir) || - \ len(s:glob(s:rtp(a:plug), 'plugin')) || - \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) -endfunction - -function! plug#end() - if !exists('g:plugs') - return s:err('plug#end() called without calling plug#begin() first') - endif - - if exists('#PlugLOD') - augroup PlugLOD - autocmd! - augroup END - augroup! PlugLOD - endif - let lod = { 'ft': {}, 'map': {}, 'cmd': {} } - - if exists('g:did_load_filetypes') - filetype off - endif - for name in g:plugs_order - if !has_key(g:plugs, name) - continue - endif - let plug = g:plugs[name] - if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') - let s:loaded[name] = 1 - continue - endif - - if has_key(plug, 'on') - let s:triggers[name] = { 'map': [], 'cmd': [] } - for cmd in s:to_a(plug.on) - if cmd =~? '^.\+' - if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) - call s:assoc(lod.map, cmd, name) - endif - call add(s:triggers[name].map, cmd) - elseif cmd =~# '^[A-Z]' - let cmd = substitute(cmd, '!*$', '', '') - if exists(':'.cmd) != 2 - call s:assoc(lod.cmd, cmd, name) - endif - call add(s:triggers[name].cmd, cmd) - else - call s:err('Invalid `on` option: '.cmd. - \ '. Should start with an uppercase letter or ``.') - endif - endfor - endif - - if has_key(plug, 'for') - let types = s:to_a(plug.for) - if !empty(types) - augroup filetypedetect - call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') - augroup END - endif - for type in types - call s:assoc(lod.ft, type, name) - endfor - endif - endfor - - for [cmd, names] in items(lod.cmd) - execute printf( - \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', - \ cmd, string(cmd), string(names)) - endfor - - for [map, names] in items(lod.map) - for [mode, map_prefix, key_prefix] in - \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] - execute printf( - \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', - \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) - endfor - endfor - - for [ft, names] in items(lod.ft) - augroup PlugLOD - execute printf('autocmd FileType %s call lod_ft(%s, %s)', - \ ft, string(ft), string(names)) - augroup END - endfor - - call s:reorg_rtp() - filetype plugin indent on - if has('vim_starting') - if has('syntax') && !exists('g:syntax_on') - syntax enable - end - else - call s:reload_plugins() - endif -endfunction - -function! s:loaded_names() - return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') -endfunction - -function! s:load_plugin(spec) - call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') -endfunction - -function! s:reload_plugins() - for name in s:loaded_names() - call s:load_plugin(g:plugs[name]) - endfor -endfunction - -function! s:trim(str) - return substitute(a:str, '[\/]\+$', '', '') -endfunction - -function! s:version_requirement(val, min) - for idx in range(0, len(a:min) - 1) - let v = get(a:val, idx, 0) - if v < a:min[idx] | return 0 - elseif v > a:min[idx] | return 1 - endif - endfor - return 1 -endfunction - -function! s:git_version_requirement(...) - if !exists('s:git_version') - let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') - endif - return s:version_requirement(s:git_version, a:000) -endfunction - -function! s:progress_opt(base) - return a:base && !s:is_win && - \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' -endfunction - -function! s:rtp(spec) - return s:path(a:spec.dir . get(a:spec, 'rtp', '')) -endfunction - -if s:is_win - function! s:path(path) - return s:trim(substitute(a:path, '/', '\', 'g')) - endfunction - - function! s:dirpath(path) - return s:path(a:path) . '\' - endfunction - - function! s:is_local_plug(repo) - return a:repo =~? '^[a-z]:\|^[%~]' - endfunction - - " Copied from fzf - function! s:wrap_cmds(cmds) - let cmds = [ - \ '@echo off', - \ 'setlocal enabledelayedexpansion'] - \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) - \ + ['endlocal'] - if has('iconv') - if !exists('s:codepage') - let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) - endif - return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) - endif - return map(cmds, 'v:val."\r"') - endfunction - - function! s:batchfile(cmd) - let batchfile = s:plug_tempname().'.bat' - call writefile(s:wrap_cmds(a:cmd), batchfile) - let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) - if &shell =~# 'powershell\.exe' - let cmd = '& ' . cmd - endif - return [batchfile, cmd] - endfunction -else - function! s:path(path) - return s:trim(a:path) - endfunction - - function! s:dirpath(path) - return substitute(a:path, '[/\\]*$', '/', '') - endfunction - - function! s:is_local_plug(repo) - return a:repo[0] =~ '[/$~]' - endfunction -endif - -function! s:err(msg) - echohl ErrorMsg - echom '[vim-plug] '.a:msg - echohl None -endfunction - -function! s:warn(cmd, msg) - echohl WarningMsg - execute a:cmd 'a:msg' - echohl None -endfunction - -function! s:esc(path) - return escape(a:path, ' ') -endfunction - -function! s:escrtp(path) - return escape(a:path, ' ,') -endfunction - -function! s:remove_rtp() - for name in s:loaded_names() - let rtp = s:rtp(g:plugs[name]) - execute 'set rtp-='.s:escrtp(rtp) - let after = globpath(rtp, 'after') - if isdirectory(after) - execute 'set rtp-='.s:escrtp(after) - endif - endfor -endfunction - -function! s:reorg_rtp() - if !empty(s:first_rtp) - execute 'set rtp-='.s:first_rtp - execute 'set rtp-='.s:last_rtp - endif - - " &rtp is modified from outside - if exists('s:prtp') && s:prtp !=# &rtp - call s:remove_rtp() - unlet! s:middle - endif - - let s:middle = get(s:, 'middle', &rtp) - let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') - let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') - let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') - \ . ','.s:middle.',' - \ . join(map(afters, 'escape(v:val, ",")'), ',') - let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') - let s:prtp = &rtp - - if !empty(s:first_rtp) - execute 'set rtp^='.s:first_rtp - execute 'set rtp+='.s:last_rtp - endif -endfunction - -function! s:doautocmd(...) - if exists('#'.join(a:000, '#')) - execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) - endif -endfunction - -function! s:dobufread(names) - for name in a:names - let path = s:rtp(g:plugs[name]) - for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] - if len(finddir(dir, path)) - if exists('#BufRead') - doautocmd BufRead - endif - return - endif - endfor - endfor -endfunction - -function! plug#load(...) - if a:0 == 0 - return s:err('Argument missing: plugin name(s) required') - endif - if !exists('g:plugs') - return s:err('plug#begin was not called') - endif - let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 - let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') - if !empty(unknowns) - let s = len(unknowns) > 1 ? 's' : '' - return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) - end - let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') - if !empty(unloaded) - for name in unloaded - call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) - endfor - call s:dobufread(unloaded) - return 1 - end - return 0 -endfunction - -function! s:remove_triggers(name) - if !has_key(s:triggers, a:name) - return - endif - for cmd in s:triggers[a:name].cmd - execute 'silent! delc' cmd - endfor - for map in s:triggers[a:name].map - execute 'silent! unmap' map - execute 'silent! iunmap' map - endfor - call remove(s:triggers, a:name) -endfunction - -function! s:lod(names, types, ...) - for name in a:names - call s:remove_triggers(name) - let s:loaded[name] = 1 - endfor - call s:reorg_rtp() - - for name in a:names - let rtp = s:rtp(g:plugs[name]) - for dir in a:types - call s:source(rtp, dir.'/**/*.vim') - endfor - if a:0 - if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) - execute 'runtime' a:1 - endif - call s:source(rtp, a:2) - endif - call s:doautocmd('User', name) - endfor -endfunction - -function! s:lod_ft(pat, names) - let syn = 'syntax/'.a:pat.'.vim' - call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) - execute 'autocmd! PlugLOD FileType' a:pat - call s:doautocmd('filetypeplugin', 'FileType') - call s:doautocmd('filetypeindent', 'FileType') -endfunction - -function! s:lod_cmd(cmd, bang, l1, l2, args, names) - call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) - call s:dobufread(a:names) - execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) -endfunction - -function! s:lod_map(map, names, with_prefix, prefix) - call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) - call s:dobufread(a:names) - let extra = '' - while 1 - let c = getchar(0) - if c == 0 - break - endif - let extra .= nr2char(c) - endwhile - - if a:with_prefix - let prefix = v:count ? v:count : '' - let prefix .= '"'.v:register.a:prefix - if mode(1) == 'no' - if v:operator == 'c' - let prefix = "\" . prefix - endif - let prefix .= v:operator - endif - call feedkeys(prefix, 'n') - endif - call feedkeys(substitute(a:map, '^', "\", '') . extra) -endfunction - -function! plug#(repo, ...) - if a:0 > 1 - return s:err('Invalid number of arguments (1..2)') - endif - - try - let repo = s:trim(a:repo) - let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec - let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) - let spec = extend(s:infer_properties(name, repo), opts) - if !has_key(g:plugs, name) - call add(g:plugs_order, name) - endif - let g:plugs[name] = spec - let s:loaded[name] = get(s:loaded, name, 0) - catch - return s:err(v:exception) - endtry -endfunction - -function! s:parse_options(arg) - let opts = copy(s:base_spec) - let type = type(a:arg) - if type == s:TYPE.string - let opts.tag = a:arg - elseif type == s:TYPE.dict - call extend(opts, a:arg) - if has_key(opts, 'dir') - let opts.dir = s:dirpath(s:plug_expand(opts.dir)) - endif - else - throw 'Invalid argument type (expected: string or dictionary)' - endif - return opts -endfunction - -function! s:infer_properties(name, repo) - let repo = a:repo - if s:is_local_plug(repo) - return { 'dir': s:dirpath(s:plug_expand(repo)) } - else - if repo =~ ':' - let uri = repo - else - if repo !~ '/' - throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) - endif - let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') - let uri = printf(fmt, repo) - endif - return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } - endif -endfunction - -function! s:install(force, names) - call s:update_impl(0, a:force, a:names) -endfunction - -function! s:update(force, names) - call s:update_impl(1, a:force, a:names) -endfunction - -function! plug#helptags() - if !exists('g:plugs') - return s:err('plug#begin was not called') - endif - for spec in values(g:plugs) - let docd = join([s:rtp(spec), 'doc'], '/') - if isdirectory(docd) - silent! execute 'helptags' s:esc(docd) - endif - endfor - return 1 -endfunction - -function! s:syntax() - syntax clear - syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber - syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX - syn match plugNumber /[0-9]\+[0-9.]*/ contained - syn match plugBracket /[[\]]/ contained - syn match plugX /x/ contained - syn match plugDash /^-/ - syn match plugPlus /^+/ - syn match plugStar /^*/ - syn match plugMessage /\(^- \)\@<=.*/ - syn match plugName /\(^- \)\@<=[^ ]*:/ - syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ - syn match plugTag /(tag: [^)]\+)/ - syn match plugInstall /\(^+ \)\@<=[^:]*/ - syn match plugUpdate /\(^* \)\@<=[^:]*/ - syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag - syn match plugEdge /^ \X\+$/ - syn match plugEdge /^ \X*/ contained nextgroup=plugSha - syn match plugSha /[0-9a-f]\{7,9}/ contained - syn match plugRelDate /([^)]*)$/ contained - syn match plugNotLoaded /(not loaded)$/ - syn match plugError /^x.*/ - syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ - syn match plugH2 /^.*:\n-\+$/ - syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean - hi def link plug1 Title - hi def link plug2 Repeat - hi def link plugH2 Type - hi def link plugX Exception - hi def link plugBracket Structure - hi def link plugNumber Number - - hi def link plugDash Special - hi def link plugPlus Constant - hi def link plugStar Boolean - - hi def link plugMessage Function - hi def link plugName Label - hi def link plugInstall Function - hi def link plugUpdate Type - - hi def link plugError Error - hi def link plugDeleted Ignore - hi def link plugRelDate Comment - hi def link plugEdge PreProc - hi def link plugSha Identifier - hi def link plugTag Constant - - hi def link plugNotLoaded Comment -endfunction - -function! s:lpad(str, len) - return a:str . repeat(' ', a:len - len(a:str)) -endfunction - -function! s:lines(msg) - return split(a:msg, "[\r\n]") -endfunction - -function! s:lastline(msg) - return get(s:lines(a:msg), -1, '') -endfunction - -function! s:new_window() - execute get(g:, 'plug_window', 'vertical topleft new') -endfunction - -function! s:plug_window_exists() - let buflist = tabpagebuflist(s:plug_tab) - return !empty(buflist) && index(buflist, s:plug_buf) >= 0 -endfunction - -function! s:switch_in() - if !s:plug_window_exists() - return 0 - endif - - if winbufnr(0) != s:plug_buf - let s:pos = [tabpagenr(), winnr(), winsaveview()] - execute 'normal!' s:plug_tab.'gt' - let winnr = bufwinnr(s:plug_buf) - execute winnr.'wincmd w' - call add(s:pos, winsaveview()) - else - let s:pos = [winsaveview()] - endif - - setlocal modifiable - return 1 -endfunction - -function! s:switch_out(...) - call winrestview(s:pos[-1]) - setlocal nomodifiable - if a:0 > 0 - execute a:1 - endif - - if len(s:pos) > 1 - execute 'normal!' s:pos[0].'gt' - execute s:pos[1] 'wincmd w' - call winrestview(s:pos[2]) - endif -endfunction - -function! s:finish_bindings() - nnoremap R :call retry() - nnoremap D :PlugDiff - nnoremap S :PlugStatus - nnoremap U :call status_update() - xnoremap U :call status_update() - nnoremap ]] :silent! call section('') - nnoremap [[ :silent! call section('b') -endfunction - -function! s:prepare(...) - if empty(s:plug_getcwd()) - throw 'Invalid current working directory. Cannot proceed.' - endif - - for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] - if exists(evar) - throw evar.' detected. Cannot proceed.' - endif - endfor - - call s:job_abort() - if s:switch_in() - if b:plug_preview == 1 - pc - endif - enew - else - call s:new_window() - endif - - nnoremap q :if b:plug_preview==1pcendifbd - if a:0 == 0 - call s:finish_bindings() - endif - let b:plug_preview = -1 - let s:plug_tab = tabpagenr() - let s:plug_buf = winbufnr(0) - call s:assign_name() - - for k in ['', 'L', 'o', 'X', 'd', 'dd'] - execute 'silent! unmap ' k - endfor - setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell - if exists('+colorcolumn') - setlocal colorcolumn= - endif - setf vim-plug - if exists('g:syntax_on') - call s:syntax() - endif -endfunction - -function! s:assign_name() - " Assign buffer name - let prefix = '[Plugins]' - let name = prefix - let idx = 2 - while bufexists(name) - let name = printf('%s (%s)', prefix, idx) - let idx = idx + 1 - endwhile - silent! execute 'f' fnameescape(name) -endfunction - -function! s:chsh(swap) - let prev = [&shell, &shellcmdflag, &shellredir] - if !s:is_win - set shell=sh - endif - if a:swap - if &shell =~# 'powershell\.exe' || &shell =~# 'pwsh$' - let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' - elseif &shell =~# 'sh' || &shell =~# 'cmd\.exe' - set shellredir=>%s\ 2>&1 - endif - endif - return prev -endfunction - -function! s:bang(cmd, ...) - let batchfile = '' - try - let [sh, shellcmdflag, shrd] = s:chsh(a:0) - " FIXME: Escaping is incomplete. We could use shellescape with eval, - " but it won't work on Windows. - let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd - if s:is_win - let [batchfile, cmd] = s:batchfile(cmd) - endif - let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') - execute "normal! :execute g:_plug_bang\\" - finally - unlet g:_plug_bang - let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] - if s:is_win && filereadable(batchfile) - call delete(batchfile) - endif - endtry - return v:shell_error ? 'Exit status: ' . v:shell_error : '' -endfunction - -function! s:regress_bar() - let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') - call s:progress_bar(2, bar, len(bar)) -endfunction - -function! s:is_updated(dir) - return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) -endfunction - -function! s:do(pull, force, todo) - for [name, spec] in items(a:todo) - if !isdirectory(spec.dir) - continue - endif - let installed = has_key(s:update.new, name) - let updated = installed ? 0 : - \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) - if a:force || installed || updated - execute 'cd' s:esc(spec.dir) - call append(3, '- Post-update hook for '. name .' ... ') - let error = '' - let type = type(spec.do) - if type == s:TYPE.string - if spec.do[0] == ':' - if !get(s:loaded, name, 0) - let s:loaded[name] = 1 - call s:reorg_rtp() - endif - call s:load_plugin(spec) - try - execute spec.do[1:] - catch - let error = v:exception - endtry - if !s:plug_window_exists() - cd - - throw 'Warning: vim-plug was terminated by the post-update hook of '.name - endif - else - let error = s:bang(spec.do) - endif - elseif type == s:TYPE.funcref - try - let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') - call spec.do({ 'name': name, 'status': status, 'force': a:force }) - catch - let error = v:exception - endtry - else - let error = 'Invalid hook type' - endif - call s:switch_in() - call setline(4, empty(error) ? (getline(4) . 'OK') - \ : ('x' . getline(4)[1:] . error)) - if !empty(error) - call add(s:update.errors, name) - call s:regress_bar() - endif - cd - - endif - endfor -endfunction - -function! s:hash_match(a, b) - return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 -endfunction - -function! s:checkout(spec) - let sha = a:spec.commit - let output = s:system(['git', 'rev-parse', 'HEAD'], a:spec.dir) - if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) - let output = s:system( - \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) - endif - return output -endfunction - -function! s:finish(pull) - let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) - if new_frozen - let s = new_frozen > 1 ? 's' : '' - call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) - endif - call append(3, '- Finishing ... ') | 4 - redraw - call plug#helptags() - call plug#end() - call setline(4, getline(4) . 'Done!') - redraw - let msgs = [] - if !empty(s:update.errors) - call add(msgs, "Press 'R' to retry.") - endif - if a:pull && len(s:update.new) < len(filter(getline(5, '$'), - \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) - call add(msgs, "Press 'D' to see the updated changes.") - endif - echo join(msgs, ' ') - call s:finish_bindings() -endfunction - -function! s:retry() - if empty(s:update.errors) - return - endif - echo - call s:update_impl(s:update.pull, s:update.force, - \ extend(copy(s:update.errors), [s:update.threads])) -endfunction - -function! s:is_managed(name) - return has_key(g:plugs[a:name], 'uri') -endfunction - -function! s:names(...) - return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) -endfunction - -function! s:check_ruby() - silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") - if !exists('g:plug_ruby') - redraw! - return s:warn('echom', 'Warning: Ruby interface is broken') - endif - let ruby_version = split(g:plug_ruby, '\.') - unlet g:plug_ruby - return s:version_requirement(ruby_version, [1, 8, 7]) -endfunction - -function! s:update_impl(pull, force, args) abort - let sync = index(a:args, '--sync') >= 0 || has('vim_starting') - let args = filter(copy(a:args), 'v:val != "--sync"') - let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? - \ remove(args, -1) : get(g:, 'plug_threads', 16) - - let managed = filter(copy(g:plugs), 's:is_managed(v:key)') - let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : - \ filter(managed, 'index(args, v:key) >= 0') - - if empty(todo) - return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) - endif - - if !s:is_win && s:git_version_requirement(2, 3) - let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' - let $GIT_TERMINAL_PROMPT = 0 - for plug in values(todo) - let plug.uri = substitute(plug.uri, - \ '^https://git::@github\.com', 'https://github.com', '') - endfor - endif - - if !isdirectory(g:plug_home) - try - call mkdir(g:plug_home, 'p') - catch - return s:err(printf('Invalid plug directory: %s. '. - \ 'Try to call plug#begin with a valid directory', g:plug_home)) - endtry - endif - - if has('nvim') && !exists('*jobwait') && threads > 1 - call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') - endif - - let use_job = s:nvim || s:vim8 - let python = (has('python') || has('python3')) && !use_job - let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() - - let s:update = { - \ 'start': reltime(), - \ 'all': todo, - \ 'todo': copy(todo), - \ 'errors': [], - \ 'pull': a:pull, - \ 'force': a:force, - \ 'new': {}, - \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, - \ 'bar': '', - \ 'fin': 0 - \ } - - call s:prepare(1) - call append(0, ['', '']) - normal! 2G - silent! redraw - - let s:clone_opt = [] - if get(g:, 'plug_shallow', 1) - call extend(s:clone_opt, ['--depth', '1']) - if s:git_version_requirement(1, 7, 10) - call add(s:clone_opt, '--no-single-branch') - endif - endif - - if has('win32unix') || has('wsl') - call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) - endif - - let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' - - " Python version requirement (>= 2.7) - if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 - redir => pyv - silent python import platform; print platform.python_version() - redir END - let python = s:version_requirement( - \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) - endif - - if (python || ruby) && s:update.threads > 1 - try - let imd = &imd - if s:mac_gui - set noimd - endif - if ruby - call s:update_ruby() - else - call s:update_python() - endif - catch - let lines = getline(4, '$') - let printed = {} - silent! 4,$d _ - for line in lines - let name = s:extract_name(line, '.', '') - if empty(name) || !has_key(printed, name) - call append('$', line) - if !empty(name) - let printed[name] = 1 - if line[0] == 'x' && index(s:update.errors, name) < 0 - call add(s:update.errors, name) - end - endif - endif - endfor - finally - let &imd = imd - call s:update_finish() - endtry - else - call s:update_vim() - while use_job && sync - sleep 100m - if s:update.fin - break - endif - endwhile - endif -endfunction - -function! s:log4(name, msg) - call setline(4, printf('- %s (%s)', a:msg, a:name)) - redraw -endfunction - -function! s:update_finish() - if exists('s:git_terminal_prompt') - let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt - endif - if s:switch_in() - call append(3, '- Updating ...') | 4 - for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) - let [pos, _] = s:logpos(name) - if !pos - continue - endif - if has_key(spec, 'commit') - call s:log4(name, 'Checking out '.spec.commit) - let out = s:checkout(spec) - elseif has_key(spec, 'tag') - let tag = spec.tag - if tag =~ '\*' - let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) - if !v:shell_error && !empty(tags) - let tag = tags[0] - call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) - call append(3, '') - endif - endif - call s:log4(name, 'Checking out '.tag) - let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) - else - let branch = get(spec, 'branch', 'master') - call s:log4(name, 'Merging origin/'.s:esc(branch)) - let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' - \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) - endif - if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && - \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) - call s:log4(name, 'Updating submodules. This may take a while.') - let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) - endif - let msg = s:format_message(v:shell_error ? 'x': '-', name, out) - if v:shell_error - call add(s:update.errors, name) - call s:regress_bar() - silent execute pos 'd _' - call append(4, msg) | 4 - elseif !empty(out) - call setline(pos, msg[0]) - endif - redraw - endfor - silent 4 d _ - try - call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) - catch - call s:warn('echom', v:exception) - call s:warn('echo', '') - return - endtry - call s:finish(s:update.pull) - call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') - call s:switch_out('normal! gg') - endif -endfunction - -function! s:job_abort() - if (!s:nvim && !s:vim8) || !exists('s:jobs') - return - endif - - for [name, j] in items(s:jobs) - if s:nvim - silent! call jobstop(j.jobid) - elseif s:vim8 - silent! call job_stop(j.jobid) - endif - if j.new - call s:rm_rf(g:plugs[name].dir) - endif - endfor - let s:jobs = {} -endfunction - -function! s:last_non_empty_line(lines) - let len = len(a:lines) - for idx in range(len) - let line = a:lines[len-idx-1] - if !empty(line) - return line - endif - endfor - return '' -endfunction - -function! s:job_out_cb(self, data) abort - let self = a:self - let data = remove(self.lines, -1) . a:data - let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') - call extend(self.lines, lines) - " To reduce the number of buffer updates - let self.tick = get(self, 'tick', -1) + 1 - if !self.running || self.tick % len(s:jobs) == 0 - let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') - let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) - call s:log(bullet, self.name, result) - endif -endfunction - -function! s:job_exit_cb(self, data) abort - let a:self.running = 0 - let a:self.error = a:data != 0 - call s:reap(a:self.name) - call s:tick() -endfunction - -function! s:job_cb(fn, job, ch, data) - if !s:plug_window_exists() " plug window closed - return s:job_abort() - endif - call call(a:fn, [a:job, a:data]) -endfunction - -function! s:nvim_cb(job_id, data, event) dict abort - return (a:event == 'stdout' || a:event == 'stderr') ? - \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : - \ s:job_cb('s:job_exit_cb', self, 0, a:data) -endfunction - -function! s:spawn(name, cmd, opts) - let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], - \ 'new': get(a:opts, 'new', 0) } - let s:jobs[a:name] = job - - if s:nvim - if has_key(a:opts, 'dir') - let job.cwd = a:opts.dir - endif - let argv = a:cmd - call extend(job, { - \ 'on_stdout': function('s:nvim_cb'), - \ 'on_stderr': function('s:nvim_cb'), - \ 'on_exit': function('s:nvim_cb'), - \ }) - let jid = s:plug_call('jobstart', argv, job) - if jid > 0 - let job.jobid = jid - else - let job.running = 0 - let job.error = 1 - let job.lines = [jid < 0 ? argv[0].' is not executable' : - \ 'Invalid arguments (or job table is full)'] - endif - elseif s:vim8 - let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) - if has_key(a:opts, 'dir') - let cmd = s:with_cd(cmd, a:opts.dir, 0) - endif - let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] - let jid = job_start(s:is_win ? join(argv, ' ') : argv, { - \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), - \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), - \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), - \ 'err_mode': 'raw', - \ 'out_mode': 'raw' - \}) - if job_status(jid) == 'run' - let job.jobid = jid - else - let job.running = 0 - let job.error = 1 - let job.lines = ['Failed to start job'] - endif - else - let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) - let job.error = v:shell_error != 0 - let job.running = 0 - endif -endfunction - -function! s:reap(name) - let job = s:jobs[a:name] - if job.error - call add(s:update.errors, a:name) - elseif get(job, 'new', 0) - let s:update.new[a:name] = 1 - endif - let s:update.bar .= job.error ? 'x' : '=' - - let bullet = job.error ? 'x' : '-' - let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) - call s:log(bullet, a:name, empty(result) ? 'OK' : result) - call s:bar() - - call remove(s:jobs, a:name) -endfunction - -function! s:bar() - if s:switch_in() - let total = len(s:update.all) - call setline(1, (s:update.pull ? 'Updating' : 'Installing'). - \ ' plugins ('.len(s:update.bar).'/'.total.')') - call s:progress_bar(2, s:update.bar, total) - call s:switch_out() - endif -endfunction - -function! s:logpos(name) - let max = line('$') - for i in range(4, max > 4 ? max : 4) - if getline(i) =~# '^[-+x*] '.a:name.':' - for j in range(i + 1, max > 5 ? max : 5) - if getline(j) !~ '^ ' - return [i, j - 1] - endif - endfor - return [i, i] - endif - endfor - return [0, 0] -endfunction - -function! s:log(bullet, name, lines) - if s:switch_in() - let [b, e] = s:logpos(a:name) - if b > 0 - silent execute printf('%d,%d d _', b, e) - if b > winheight('.') - let b = 4 - endif - else - let b = 4 - endif - " FIXME For some reason, nomodifiable is set after :d in vim8 - setlocal modifiable - call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) - call s:switch_out() - endif -endfunction - -function! s:update_vim() - let s:jobs = {} - - call s:bar() - call s:tick() -endfunction - -function! s:tick() - let pull = s:update.pull - let prog = s:progress_opt(s:nvim || s:vim8) -while 1 " Without TCO, Vim stack is bound to explode - if empty(s:update.todo) - if empty(s:jobs) && !s:update.fin - call s:update_finish() - let s:update.fin = 1 - endif - return - endif - - let name = keys(s:update.todo)[0] - let spec = remove(s:update.todo, name) - let new = empty(globpath(spec.dir, '.git', 1)) - - call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') - redraw - - let has_tag = has_key(spec, 'tag') - if !new - let [error, _] = s:git_validate(spec, 0) - if empty(error) - if pull - let cmd = ['git', 'fetch'] - if has_tag && !empty(globpath(spec.dir, '.git/shallow')) - call extend(cmd, ['--depth', '99999999']) - endif - if !empty(prog) - call add(cmd, prog) - endif - call s:spawn(name, cmd, { 'dir': spec.dir }) - else - let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } - endif - else - let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } - endif - else - let cmd = ['git', 'clone'] - if !has_tag - call extend(cmd, s:clone_opt) - endif - if !empty(prog) - call add(cmd, prog) - endif - call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) - endif - - if !s:jobs[name].running - call s:reap(name) - endif - if len(s:jobs) >= s:update.threads - break - endif -endwhile -endfunction - -function! s:update_python() -let py_exe = has('python') ? 'python' : 'python3' -execute py_exe "<< EOF" -import datetime -import functools -import os -try: - import queue -except ImportError: - import Queue as queue -import random -import re -import shutil -import signal -import subprocess -import tempfile -import threading as thr -import time -import traceback -import vim - -G_NVIM = vim.eval("has('nvim')") == '1' -G_PULL = vim.eval('s:update.pull') == '1' -G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 -G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) -G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) -G_PROGRESS = vim.eval('s:progress_opt(1)') -G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) -G_STOP = thr.Event() -G_IS_WIN = vim.eval('s:is_win') == '1' - -class PlugError(Exception): - def __init__(self, msg): - self.msg = msg -class CmdTimedOut(PlugError): - pass -class CmdFailed(PlugError): - pass -class InvalidURI(PlugError): - pass -class Action(object): - INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] - -class Buffer(object): - def __init__(self, lock, num_plugs, is_pull): - self.bar = '' - self.event = 'Updating' if is_pull else 'Installing' - self.lock = lock - self.maxy = int(vim.eval('winheight(".")')) - self.num_plugs = num_plugs - - def __where(self, name): - """ Find first line with name in current buffer. Return line num. """ - found, lnum = False, 0 - matcher = re.compile('^[-+x*] {0}:'.format(name)) - for line in vim.current.buffer: - if matcher.search(line) is not None: - found = True - break - lnum += 1 - - if not found: - lnum = -1 - return lnum - - def header(self): - curbuf = vim.current.buffer - curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) - - num_spaces = self.num_plugs - len(self.bar) - curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') - - with self.lock: - vim.command('normal! 2G') - vim.command('redraw') - - def write(self, action, name, lines): - first, rest = lines[0], lines[1:] - msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] - msg.extend([' ' + line for line in rest]) - - try: - if action == Action.ERROR: - self.bar += 'x' - vim.command("call add(s:update.errors, '{0}')".format(name)) - elif action == Action.DONE: - self.bar += '=' - - curbuf = vim.current.buffer - lnum = self.__where(name) - if lnum != -1: # Found matching line num - del curbuf[lnum] - if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): - lnum = 3 - else: - lnum = 3 - curbuf.append(msg, lnum) - - self.header() - except vim.error: - pass - -class Command(object): - CD = 'cd /d' if G_IS_WIN else 'cd' - - def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): - self.cmd = cmd - if cmd_dir: - self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) - self.timeout = timeout - self.callback = cb if cb else (lambda msg: None) - self.clean = clean if clean else (lambda: None) - self.proc = None - - @property - def alive(self): - """ Returns true only if command still running. """ - return self.proc and self.proc.poll() is None - - def execute(self, ntries=3): - """ Execute the command with ntries if CmdTimedOut. - Returns the output of the command if no Exception. - """ - attempt, finished, limit = 0, False, self.timeout - - while not finished: - try: - attempt += 1 - result = self.try_command() - finished = True - return result - except CmdTimedOut: - if attempt != ntries: - self.notify_retry() - self.timeout += limit - else: - raise - - def notify_retry(self): - """ Retry required for command, notify user. """ - for count in range(3, 0, -1): - if G_STOP.is_set(): - raise KeyboardInterrupt - msg = 'Timeout. Will retry in {0} second{1} ...'.format( - count, 's' if count != 1 else '') - self.callback([msg]) - time.sleep(1) - self.callback(['Retrying ...']) - - def try_command(self): - """ Execute a cmd & poll for callback. Returns list of output. - Raises CmdFailed -> return code for Popen isn't 0 - Raises CmdTimedOut -> command exceeded timeout without new output - """ - first_line = True - - try: - tfile = tempfile.NamedTemporaryFile(mode='w+b') - preexec_fn = not G_IS_WIN and os.setsid or None - self.proc = subprocess.Popen(self.cmd, stdout=tfile, - stderr=subprocess.STDOUT, - stdin=subprocess.PIPE, shell=True, - preexec_fn=preexec_fn) - thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) - thrd.start() - - thread_not_started = True - while thread_not_started: - try: - thrd.join(0.1) - thread_not_started = False - except RuntimeError: - pass - - while self.alive: - if G_STOP.is_set(): - raise KeyboardInterrupt - - if first_line or random.random() < G_LOG_PROB: - first_line = False - line = '' if G_IS_WIN else nonblock_read(tfile.name) - if line: - self.callback([line]) - - time_diff = time.time() - os.path.getmtime(tfile.name) - if time_diff > self.timeout: - raise CmdTimedOut(['Timeout!']) - - thrd.join(0.5) - - tfile.seek(0) - result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] - - if self.proc.returncode != 0: - raise CmdFailed([''] + result) - - return result - except: - self.terminate() - raise - - def terminate(self): - """ Terminate process and cleanup. """ - if self.alive: - if G_IS_WIN: - os.kill(self.proc.pid, signal.SIGINT) - else: - os.killpg(self.proc.pid, signal.SIGTERM) - self.clean() - -class Plugin(object): - def __init__(self, name, args, buf_q, lock): - self.name = name - self.args = args - self.buf_q = buf_q - self.lock = lock - self.tag = args.get('tag', 0) - - def manage(self): - try: - if os.path.exists(self.args['dir']): - self.update() - else: - self.install() - with self.lock: - thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) - except PlugError as exc: - self.write(Action.ERROR, self.name, exc.msg) - except KeyboardInterrupt: - G_STOP.set() - self.write(Action.ERROR, self.name, ['Interrupted!']) - except: - # Any exception except those above print stack trace - msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) - self.write(Action.ERROR, self.name, msg.split('\n')) - raise - - def install(self): - target = self.args['dir'] - if target[-1] == '\\': - target = target[0:-1] - - def clean(target): - def _clean(): - try: - shutil.rmtree(target) - except OSError: - pass - return _clean - - self.write(Action.INSTALL, self.name, ['Installing ...']) - callback = functools.partial(self.write, Action.INSTALL, self.name) - cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( - '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], - esc(target)) - com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) - result = com.execute(G_RETRIES) - self.write(Action.DONE, self.name, result[-1:]) - - def repo_uri(self): - cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' - command = Command(cmd, self.args['dir'], G_TIMEOUT,) - result = command.execute(G_RETRIES) - return result[-1] - - def update(self): - actual_uri = self.repo_uri() - expect_uri = self.args['uri'] - regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') - ma = regex.match(actual_uri) - mb = regex.match(expect_uri) - if ma is None or mb is None or ma.groups() != mb.groups(): - msg = ['', - 'Invalid URI: {0}'.format(actual_uri), - 'Expected {0}'.format(expect_uri), - 'PlugClean required.'] - raise InvalidURI(msg) - - if G_PULL: - self.write(Action.UPDATE, self.name, ['Updating ...']) - callback = functools.partial(self.write, Action.UPDATE, self.name) - fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' - cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) - com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) - result = com.execute(G_RETRIES) - self.write(Action.DONE, self.name, result[-1:]) - else: - self.write(Action.DONE, self.name, ['Already installed']) - - def write(self, action, name, msg): - self.buf_q.put((action, name, msg)) - -class PlugThread(thr.Thread): - def __init__(self, tname, args): - super(PlugThread, self).__init__() - self.tname = tname - self.args = args - - def run(self): - thr.current_thread().name = self.tname - buf_q, work_q, lock = self.args - - try: - while not G_STOP.is_set(): - name, args = work_q.get_nowait() - plug = Plugin(name, args, buf_q, lock) - plug.manage() - work_q.task_done() - except queue.Empty: - pass - -class RefreshThread(thr.Thread): - def __init__(self, lock): - super(RefreshThread, self).__init__() - self.lock = lock - self.running = True - - def run(self): - while self.running: - with self.lock: - thread_vim_command('noautocmd normal! a') - time.sleep(0.33) - - def stop(self): - self.running = False - -if G_NVIM: - def thread_vim_command(cmd): - vim.session.threadsafe_call(lambda: vim.command(cmd)) -else: - def thread_vim_command(cmd): - vim.command(cmd) - -def esc(name): - return '"' + name.replace('"', '\"') + '"' - -def nonblock_read(fname): - """ Read a file with nonblock flag. Return the last line. """ - fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) - buf = os.read(fread, 100000).decode('utf-8', 'replace') - os.close(fread) - - line = buf.rstrip('\r\n') - left = max(line.rfind('\r'), line.rfind('\n')) - if left != -1: - left += 1 - line = line[left:] - - return line - -def main(): - thr.current_thread().name = 'main' - nthreads = int(vim.eval('s:update.threads')) - plugs = vim.eval('s:update.todo') - mac_gui = vim.eval('s:mac_gui') == '1' - - lock = thr.Lock() - buf = Buffer(lock, len(plugs), G_PULL) - buf_q, work_q = queue.Queue(), queue.Queue() - for work in plugs.items(): - work_q.put(work) - - start_cnt = thr.active_count() - for num in range(nthreads): - tname = 'PlugT-{0:02}'.format(num) - thread = PlugThread(tname, (buf_q, work_q, lock)) - thread.start() - if mac_gui: - rthread = RefreshThread(lock) - rthread.start() - - while not buf_q.empty() or thr.active_count() != start_cnt: - try: - action, name, msg = buf_q.get(True, 0.25) - buf.write(action, name, ['OK'] if not msg else msg) - buf_q.task_done() - except queue.Empty: - pass - except KeyboardInterrupt: - G_STOP.set() - - if mac_gui: - rthread.stop() - rthread.join() - -main() -EOF -endfunction - -function! s:update_ruby() - ruby << EOF - module PlugStream - SEP = ["\r", "\n", nil] - def get_line - buffer = '' - loop do - char = readchar rescue return - if SEP.include? char.chr - buffer << $/ - break - else - buffer << char - end - end - buffer - end - end unless defined?(PlugStream) - - def esc arg - %["#{arg.gsub('"', '\"')}"] - end - - def killall pid - pids = [pid] - if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM - pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } - else - unless `which pgrep 2> /dev/null`.empty? - children = pids - until children.empty? - children = children.map { |pid| - `pgrep -P #{pid}`.lines.map { |l| l.chomp } - }.flatten - pids += children - end - end - pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } - end - end - - def compare_git_uri a, b - regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} - regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) - end - - require 'thread' - require 'fileutils' - require 'timeout' - running = true - iswin = VIM::evaluate('s:is_win').to_i == 1 - pull = VIM::evaluate('s:update.pull').to_i == 1 - base = VIM::evaluate('g:plug_home') - all = VIM::evaluate('s:update.todo') - limit = VIM::evaluate('get(g:, "plug_timeout", 60)') - tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 - nthr = VIM::evaluate('s:update.threads').to_i - maxy = VIM::evaluate('winheight(".")').to_i - vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ - cd = iswin ? 'cd /d' : 'cd' - tot = VIM::evaluate('len(s:update.todo)') || 0 - bar = '' - skip = 'Already installed' - mtx = Mutex.new - take1 = proc { mtx.synchronize { running && all.shift } } - logh = proc { - cnt = bar.length - $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" - $curbuf[2] = '[' + bar.ljust(tot) + ']' - VIM::command('normal! 2G') - VIM::command('redraw') - } - where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } - log = proc { |name, result, type| - mtx.synchronize do - ing = ![true, false].include?(type) - bar += type ? '=' : 'x' unless ing - b = case type - when :install then '+' when :update then '*' - when true, nil then '-' else - VIM::command("call add(s:update.errors, '#{name}')") - 'x' - end - result = - if type || type.nil? - ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] - elsif result =~ /^Interrupted|^Timeout/ - ["#{b} #{name}: #{result}"] - else - ["#{b} #{name}"] + result.lines.map { |l| " " << l } - end - if lnum = where.call(name) - $curbuf.delete lnum - lnum = 4 if ing && lnum > maxy - end - result.each_with_index do |line, offset| - $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) - end - logh.call - end - } - bt = proc { |cmd, name, type, cleanup| - tried = timeout = 0 - begin - tried += 1 - timeout += limit - fd = nil - data = '' - if iswin - Timeout::timeout(timeout) do - tmp = VIM::evaluate('tempname()') - system("(#{cmd}) > #{tmp}") - data = File.read(tmp).chomp - File.unlink tmp rescue nil - end - else - fd = IO.popen(cmd).extend(PlugStream) - first_line = true - log_prob = 1.0 / nthr - while line = Timeout::timeout(timeout) { fd.get_line } - data << line - log.call name, line.chomp, type if name && (first_line || rand < log_prob) - first_line = false - end - fd.close - end - [$? == 0, data.chomp] - rescue Timeout::Error, Interrupt => e - if fd && !fd.closed? - killall fd.pid - fd.close - end - cleanup.call if cleanup - if e.is_a?(Timeout::Error) && tried < tries - 3.downto(1) do |countdown| - s = countdown > 1 ? 's' : '' - log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type - sleep 1 - end - log.call name, 'Retrying ...', type - retry - end - [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] - end - } - main = Thread.current - threads = [] - watcher = Thread.new { - if vim7 - while VIM::evaluate('getchar(1)') - sleep 0.1 - end - else - require 'io/console' # >= Ruby 1.9 - nil until IO.console.getch == 3.chr - end - mtx.synchronize do - running = false - threads.each { |t| t.raise Interrupt } unless vim7 - end - threads.each { |t| t.join rescue nil } - main.kill - } - refresh = Thread.new { - while true - mtx.synchronize do - break unless running - VIM::command('noautocmd normal! a') - end - sleep 0.2 - end - } if VIM::evaluate('s:mac_gui') == 1 - - clone_opt = VIM::evaluate('s:clone_opt').join(' ') - progress = VIM::evaluate('s:progress_opt(1)') - nthr.times do - mtx.synchronize do - threads << Thread.new { - while pair = take1.call - name = pair.first - dir, uri, tag = pair.last.values_at *%w[dir uri tag] - exists = File.directory? dir - ok, result = - if exists - chdir = "#{cd} #{iswin ? dir : esc(dir)}" - ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil - current_uri = data.lines.to_a.last - if !ret - if data =~ /^Interrupted|^Timeout/ - [false, data] - else - [false, [data.chomp, "PlugClean required."].join($/)] - end - elsif !compare_git_uri(current_uri, uri) - [false, ["Invalid URI: #{current_uri}", - "Expected: #{uri}", - "PlugClean required."].join($/)] - else - if pull - log.call name, 'Updating ...', :update - fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' - bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil - else - [true, skip] - end - end - else - d = esc dir.sub(%r{[\\/]+$}, '') - log.call name, 'Installing ...', :install - bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { - FileUtils.rm_rf dir - } - end - mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok - log.call name, result, ok - end - } if running - end - end - threads.each { |t| t.join rescue nil } - logh.call - refresh.kill if refresh - watcher.kill -EOF -endfunction - -function! s:shellesc_cmd(arg, script) - let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') - return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') -endfunction - -function! s:shellesc_ps1(arg) - return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" -endfunction - -function! s:shellesc_sh(arg) - return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" -endfunction - -" Escape the shell argument based on the shell. -" Vim and Neovim's shellescape() are insufficient. -" 1. shellslash determines whether to use single/double quotes. -" Double-quote escaping is fragile for cmd.exe. -" 2. It does not work for powershell. -" 3. It does not work for *sh shells if the command is executed -" via cmd.exe (ie. cmd.exe /c sh -c command command_args) -" 4. It does not support batchfile syntax. -" -" Accepts an optional dictionary with the following keys: -" - shell: same as Vim/Neovim 'shell' option. -" If unset, fallback to 'cmd.exe' on Windows or 'sh'. -" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. -function! plug#shellescape(arg, ...) - if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' - return a:arg - endif - let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} - let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') - let script = get(opts, 'script', 1) - if shell =~# 'cmd\.exe' - return s:shellesc_cmd(a:arg, script) - elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$' - return s:shellesc_ps1(a:arg) - endif - return s:shellesc_sh(a:arg) -endfunction - -function! s:glob_dir(path) - return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') -endfunction - -function! s:progress_bar(line, bar, total) - call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') -endfunction - -function! s:compare_git_uri(a, b) - " See `git help clone' - " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] - " [git@] github.com[:port] : junegunn/vim-plug [.git] - " file:// / junegunn/vim-plug [/] - " / junegunn/vim-plug [/] - let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' - let ma = matchlist(a:a, pat) - let mb = matchlist(a:b, pat) - return ma[1:2] ==# mb[1:2] -endfunction - -function! s:format_message(bullet, name, message) - if a:bullet != 'x' - return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] - else - let lines = map(s:lines(a:message), '" ".v:val') - return extend([printf('x %s:', a:name)], lines) - endif -endfunction - -function! s:with_cd(cmd, dir, ...) - let script = a:0 > 0 ? a:1 : 1 - return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) -endfunction - -function! s:system(cmd, ...) - let batchfile = '' - try - let [sh, shellcmdflag, shrd] = s:chsh(1) - if type(a:cmd) == s:TYPE.list - " Neovim's system() supports list argument to bypass the shell - " but it cannot set the working directory for the command. - " Assume that the command does not rely on the shell. - if has('nvim') && a:0 == 0 - return system(a:cmd) - endif - let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) - if &shell =~# 'powershell\.exe' - let cmd = '& ' . cmd - endif - else - let cmd = a:cmd - endif - if a:0 > 0 - let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) - endif - if s:is_win && type(a:cmd) != s:TYPE.list - let [batchfile, cmd] = s:batchfile(cmd) - endif - return system(cmd) - finally - let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] - if s:is_win && filereadable(batchfile) - call delete(batchfile) - endif - endtry -endfunction - -function! s:system_chomp(...) - let ret = call('s:system', a:000) - return v:shell_error ? '' : substitute(ret, '\n$', '', '') -endfunction - -function! s:git_validate(spec, check_branch) - let err = '' - if isdirectory(a:spec.dir) - let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) - let remote = result[-1] - if v:shell_error - let err = join([remote, 'PlugClean required.'], "\n") - elseif !s:compare_git_uri(remote, a:spec.uri) - let err = join(['Invalid URI: '.remote, - \ 'Expected: '.a:spec.uri, - \ 'PlugClean required.'], "\n") - elseif a:check_branch && has_key(a:spec, 'commit') - let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) - let sha = result[-1] - if v:shell_error - let err = join(add(result, 'PlugClean required.'), "\n") - elseif !s:hash_match(sha, a:spec.commit) - let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', - \ a:spec.commit[:6], sha[:6]), - \ 'PlugUpdate required.'], "\n") - endif - elseif a:check_branch - let branch = result[0] - " Check tag - if has_key(a:spec, 'tag') - let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) - if a:spec.tag !=# tag && a:spec.tag !~ '\*' - let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', - \ (empty(tag) ? 'N/A' : tag), a:spec.tag) - endif - " Check branch - elseif a:spec.branch !=# branch - let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', - \ branch, a:spec.branch) - endif - if empty(err) - let [ahead, behind] = split(s:lastline(s:system([ - \ 'git', 'rev-list', '--count', '--left-right', - \ printf('HEAD...origin/%s', a:spec.branch) - \ ], a:spec.dir)), '\t') - if !v:shell_error && ahead - if behind - " Only mention PlugClean if diverged, otherwise it's likely to be - " pushable (and probably not that messed up). - let err = printf( - \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" - \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) - else - let err = printf("Ahead of origin/%s by %d commit(s).\n" - \ .'Cannot update until local changes are pushed.', - \ a:spec.branch, ahead) - endif - endif - endif - endif - else - let err = 'Not found' - endif - return [err, err =~# 'PlugClean'] -endfunction - -function! s:rm_rf(dir) - if isdirectory(a:dir) - call s:system(s:is_win - \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) - \ : ['rm', '-rf', a:dir]) - endif -endfunction - -function! s:clean(force) - call s:prepare() - call append(0, 'Searching for invalid plugins in '.g:plug_home) - call append(1, '') - - " List of valid directories - let dirs = [] - let errs = {} - let [cnt, total] = [0, len(g:plugs)] - for [name, spec] in items(g:plugs) - if !s:is_managed(name) - call add(dirs, spec.dir) - else - let [err, clean] = s:git_validate(spec, 1) - if clean - let errs[spec.dir] = s:lines(err)[0] - else - call add(dirs, spec.dir) - endif - endif - let cnt += 1 - call s:progress_bar(2, repeat('=', cnt), total) - normal! 2G - redraw - endfor - - let allowed = {} - for dir in dirs - let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 - let allowed[dir] = 1 - for child in s:glob_dir(dir) - let allowed[child] = 1 - endfor - endfor - - let todo = [] - let found = sort(s:glob_dir(g:plug_home)) - while !empty(found) - let f = remove(found, 0) - if !has_key(allowed, f) && isdirectory(f) - call add(todo, f) - call append(line('$'), '- ' . f) - if has_key(errs, f) - call append(line('$'), ' ' . errs[f]) - endif - let found = filter(found, 'stridx(v:val, f) != 0') - end - endwhile - - 4 - redraw - if empty(todo) - call append(line('$'), 'Already clean.') - else - let s:clean_count = 0 - call append(3, ['Directories to delete:', '']) - redraw! - if a:force || s:ask_no_interrupt('Delete all directories?') - call s:delete([6, line('$')], 1) - else - call setline(4, 'Cancelled.') - nnoremap d :set opfunc=delete_opg@ - nmap dd d_ - xnoremap d :call delete_op(visualmode(), 1) - echo 'Delete the lines (d{motion}) to delete the corresponding directories' - endif - endif - 4 - setlocal nomodifiable -endfunction - -function! s:delete_op(type, ...) - call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) -endfunction - -function! s:delete(range, force) - let [l1, l2] = a:range - let force = a:force - while l1 <= l2 - let line = getline(l1) - if line =~ '^- ' && isdirectory(line[2:]) - execute l1 - redraw! - let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) - let force = force || answer > 1 - if answer - call s:rm_rf(line[2:]) - setlocal modifiable - call setline(l1, '~'.line[1:]) - let s:clean_count += 1 - call setline(4, printf('Removed %d directories.', s:clean_count)) - setlocal nomodifiable - endif - endif - let l1 += 1 - endwhile -endfunction - -function! s:upgrade() - echo 'Downloading the latest version of vim-plug' - redraw - let tmp = s:plug_tempname() - let new = tmp . '/plug.vim' - - try - let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) - if v:shell_error - return s:err('Error upgrading vim-plug: '. out) - endif - - if readfile(s:me) ==# readfile(new) - echo 'vim-plug is already up-to-date' - return 0 - else - call rename(s:me, s:me . '.old') - call rename(new, s:me) - unlet g:loaded_plug - echo 'vim-plug has been upgraded' - return 1 - endif - finally - silent! call s:rm_rf(tmp) - endtry -endfunction - -function! s:upgrade_specs() - for spec in values(g:plugs) - let spec.frozen = get(spec, 'frozen', 0) - endfor -endfunction - -function! s:status() - call s:prepare() - call append(0, 'Checking plugins') - call append(1, '') - - let ecnt = 0 - let unloaded = 0 - let [cnt, total] = [0, len(g:plugs)] - for [name, spec] in items(g:plugs) - let is_dir = isdirectory(spec.dir) - if has_key(spec, 'uri') - if is_dir - let [err, _] = s:git_validate(spec, 1) - let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] - else - let [valid, msg] = [0, 'Not found. Try PlugInstall.'] - endif - else - if is_dir - let [valid, msg] = [1, 'OK'] - else - let [valid, msg] = [0, 'Not found.'] - endif - endif - let cnt += 1 - let ecnt += !valid - " `s:loaded` entry can be missing if PlugUpgraded - if is_dir && get(s:loaded, name, -1) == 0 - let unloaded = 1 - let msg .= ' (not loaded)' - endif - call s:progress_bar(2, repeat('=', cnt), total) - call append(3, s:format_message(valid ? '-' : 'x', name, msg)) - normal! 2G - redraw - endfor - call setline(1, 'Finished. '.ecnt.' error(s).') - normal! gg - setlocal nomodifiable - if unloaded - echo "Press 'L' on each line to load plugin, or 'U' to update" - nnoremap L :call status_load(line('.')) - xnoremap L :call status_load(line('.')) - end -endfunction - -function! s:extract_name(str, prefix, suffix) - return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') -endfunction - -function! s:status_load(lnum) - let line = getline(a:lnum) - let name = s:extract_name(line, '-', '(not loaded)') - if !empty(name) - call plug#load(name) - setlocal modifiable - call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) - setlocal nomodifiable - endif -endfunction - -function! s:status_update() range - let lines = getline(a:firstline, a:lastline) - let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') - if !empty(names) - echo - execute 'PlugUpdate' join(names) - endif -endfunction - -function! s:is_preview_window_open() - silent! wincmd P - if &previewwindow - wincmd p - return 1 - endif -endfunction - -function! s:find_name(lnum) - for lnum in reverse(range(1, a:lnum)) - let line = getline(lnum) - if empty(line) - return '' - endif - let name = s:extract_name(line, '-', '') - if !empty(name) - return name - endif - endfor - return '' -endfunction - -function! s:preview_commit() - if b:plug_preview < 0 - let b:plug_preview = !s:is_preview_window_open() - endif - - let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') - if empty(sha) - return - endif - - let name = s:find_name(line('.')) - if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) - return - endif - - if exists('g:plug_pwindow') && !s:is_preview_window_open() - execute g:plug_pwindow - execute 'e' sha - else - execute 'pedit' sha - wincmd P - endif - setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable - let batchfile = '' - try - let [sh, shellcmdflag, shrd] = s:chsh(1) - let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha - if s:is_win - let [batchfile, cmd] = s:batchfile(cmd) - endif - execute 'silent %!' cmd - finally - let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] - if s:is_win && filereadable(batchfile) - call delete(batchfile) - endif - endtry - setlocal nomodifiable - nnoremap q :q - wincmd p -endfunction - -function! s:section(flags) - call search('\(^[x-] \)\@<=[^:]\+:', a:flags) -endfunction - -function! s:format_git_log(line) - let indent = ' ' - let tokens = split(a:line, nr2char(1)) - if len(tokens) != 5 - return indent.substitute(a:line, '\s*$', '', '') - endif - let [graph, sha, refs, subject, date] = tokens - let tag = matchstr(refs, 'tag: [^,)]\+') - let tag = empty(tag) ? ' ' : ' ('.tag.') ' - return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) -endfunction - -function! s:append_ul(lnum, text) - call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) -endfunction - -function! s:diff() - call s:prepare() - call append(0, ['Collecting changes ...', '']) - let cnts = [0, 0] - let bar = '' - let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') - call s:progress_bar(2, bar, len(total)) - for origin in [1, 0] - let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) - if empty(plugs) - continue - endif - call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') - for [k, v] in plugs - let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' - let cmd = ['git', 'log', '--graph', '--color=never'] - if s:git_version_requirement(2, 10, 0) - call add(cmd, '--no-show-signature') - endif - call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) - if has_key(v, 'rtp') - call extend(cmd, ['--', v.rtp]) - endif - let diff = s:system_chomp(cmd, v.dir) - if !empty(diff) - let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' - call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) - let cnts[origin] += 1 - endif - let bar .= '=' - call s:progress_bar(2, bar, len(total)) - normal! 2G - redraw - endfor - if !cnts[origin] - call append(5, ['', 'N/A']) - endif - endfor - call setline(1, printf('%d plugin(s) updated.', cnts[0]) - \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) - - if cnts[0] || cnts[1] - nnoremap (plug-preview) :silent! call preview_commit() - if empty(maparg("\", 'n')) - nmap (plug-preview) - endif - if empty(maparg('o', 'n')) - nmap o (plug-preview) - endif - endif - if cnts[0] - nnoremap X :call revert() - echo "Press 'X' on each block to revert the update" - endif - normal! gg - setlocal nomodifiable -endfunction - -function! s:revert() - if search('^Pending updates', 'bnW') - return - endif - - let name = s:find_name(line('.')) - if empty(name) || !has_key(g:plugs, name) || - \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' - return - endif - - call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) - setlocal modifiable - normal! "_dap - setlocal nomodifiable - echo 'Reverted' -endfunction - -function! s:snapshot(force, ...) abort - call s:prepare() - setf vim - call append(0, ['" Generated by vim-plug', - \ '" '.strftime("%c"), - \ '" :source this file in vim to restore the snapshot', - \ '" or execute: vim -S snapshot.vim', - \ '', '', 'PlugUpdate!']) - 1 - let anchor = line('$') - 3 - let names = sort(keys(filter(copy(g:plugs), - \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) - for name in reverse(names) - let sha = s:system_chomp(['git', 'rev-parse', '--short', 'HEAD'], g:plugs[name].dir) - if !empty(sha) - call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) - redraw - endif - endfor - - if a:0 > 0 - let fn = s:plug_expand(a:1) - if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) - return - endif - call writefile(getline(1, '$'), fn) - echo 'Saved as '.a:1 - silent execute 'e' s:esc(fn) - setf vim - endif -endfunction - -function! s:split_rtp() - return split(&rtp, '\\\@`-mappings | -"| `for` | On-demand loading: File types | -"| `frozen` | Do not update unless explicitly specified | -" -" More information: https://github.com/junegunn/vim-plug -" -" -" Copyright (c) 2017 Junegunn Choi -" -" MIT License -" -" Permission is hereby granted, free of charge, to any person obtaining -" a copy of this software and associated documentation files (the -" "Software"), to deal in the Software without restriction, including -" without limitation the rights to use, copy, modify, merge, publish, -" distribute, sublicense, and/or sell copies of the Software, and to -" permit persons to whom the Software is furnished to do so, subject to -" the following conditions: -" -" The above copyright notice and this permission notice shall be -" included in all copies or substantial portions of the Software. -" -" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -if exists('g:loaded_plug') - finish -endif -let g:loaded_plug = 1 - -let s:cpo_save = &cpo -set cpo&vim - -let s:plug_src = 'https://github.com/junegunn/vim-plug.git' -let s:plug_tab = get(s:, 'plug_tab', -1) -let s:plug_buf = get(s:, 'plug_buf', -1) -let s:mac_gui = has('gui_macvim') && has('gui_running') -let s:is_win = has('win32') -let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) -let s:vim8 = has('patch-8.0.0039') && exists('*job_start') -if s:is_win && &shellslash - set noshellslash - let s:me = resolve(expand(':p')) - set shellslash -else - let s:me = resolve(expand(':p')) -endif -let s:base_spec = { 'branch': 'master', 'frozen': 0 } -let s:TYPE = { -\ 'string': type(''), -\ 'list': type([]), -\ 'dict': type({}), -\ 'funcref': type(function('call')) -\ } -let s:loaded = get(s:, 'loaded', {}) -let s:triggers = get(s:, 'triggers', {}) - -if s:is_win - function! s:plug_call(fn, ...) - let shellslash = &shellslash - try - set noshellslash - return call(a:fn, a:000) - finally - let &shellslash = shellslash - endtry - endfunction -else - function! s:plug_call(fn, ...) - return call(a:fn, a:000) - endfunction -endif - -function! s:plug_getcwd() - return s:plug_call('getcwd') -endfunction - -function! s:plug_fnamemodify(fname, mods) - return s:plug_call('fnamemodify', a:fname, a:mods) -endfunction - -function! s:plug_expand(fmt) - return s:plug_call('expand', a:fmt, 1) -endfunction - -function! s:plug_tempname() - return s:plug_call('tempname') -endfunction - -function! plug#begin(...) - if a:0 > 0 - let s:plug_home_org = a:1 - let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) - elseif exists('g:plug_home') - let home = s:path(g:plug_home) - elseif !empty(&rtp) - let home = s:path(split(&rtp, ',')[0]) . '/plugged' - else - return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') - endif - if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp - return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') - endif - - let g:plug_home = home - let g:plugs = {} - let g:plugs_order = [] - let s:triggers = {} - - call s:define_commands() - return 1 -endfunction - -function! s:define_commands() - command! -nargs=+ -bar Plug call plug#() - if !executable('git') - return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') - endif - if has('win32') - \ && &shellslash - \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe') - return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') - endif - if !has('nvim') - \ && (has('win32') || has('win32unix')) - \ && !has('multi_byte') - return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') - endif - command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) - command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) - command! -nargs=0 -bar -bang PlugClean call s:clean(0) - command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif - command! -nargs=0 -bar PlugStatus call s:status() - command! -nargs=0 -bar PlugDiff call s:diff() - command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) -endfunction - -function! s:to_a(v) - return type(a:v) == s:TYPE.list ? a:v : [a:v] -endfunction - -function! s:to_s(v) - return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" -endfunction - -function! s:glob(from, pattern) - return s:lines(globpath(a:from, a:pattern)) -endfunction - -function! s:source(from, ...) - let found = 0 - for pattern in a:000 - for vim in s:glob(a:from, pattern) - execute 'source' s:esc(vim) - let found = 1 - endfor - endfor - return found -endfunction - -function! s:assoc(dict, key, val) - let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) -endfunction - -function! s:ask(message, ...) - call inputsave() - echohl WarningMsg - let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) - echohl None - call inputrestore() - echo "\r" - return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 -endfunction - -function! s:ask_no_interrupt(...) - try - return call('s:ask', a:000) - catch - return 0 - endtry -endfunction - -function! s:lazy(plug, opt) - return has_key(a:plug, a:opt) && - \ (empty(s:to_a(a:plug[a:opt])) || - \ !isdirectory(a:plug.dir) || - \ len(s:glob(s:rtp(a:plug), 'plugin')) || - \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) -endfunction - -function! plug#end() - if !exists('g:plugs') - return s:err('plug#end() called without calling plug#begin() first') - endif - - if exists('#PlugLOD') - augroup PlugLOD - autocmd! - augroup END - augroup! PlugLOD - endif - let lod = { 'ft': {}, 'map': {}, 'cmd': {} } - - if exists('g:did_load_filetypes') - filetype off - endif - for name in g:plugs_order - if !has_key(g:plugs, name) - continue - endif - let plug = g:plugs[name] - if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') - let s:loaded[name] = 1 - continue - endif - - if has_key(plug, 'on') - let s:triggers[name] = { 'map': [], 'cmd': [] } - for cmd in s:to_a(plug.on) - if cmd =~? '^.\+' - if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) - call s:assoc(lod.map, cmd, name) - endif - call add(s:triggers[name].map, cmd) - elseif cmd =~# '^[A-Z]' - let cmd = substitute(cmd, '!*$', '', '') - if exists(':'.cmd) != 2 - call s:assoc(lod.cmd, cmd, name) - endif - call add(s:triggers[name].cmd, cmd) - else - call s:err('Invalid `on` option: '.cmd. - \ '. Should start with an uppercase letter or ``.') - endif - endfor - endif - - if has_key(plug, 'for') - let types = s:to_a(plug.for) - if !empty(types) - augroup filetypedetect - call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') - augroup END - endif - for type in types - call s:assoc(lod.ft, type, name) - endfor - endif - endfor - - for [cmd, names] in items(lod.cmd) - execute printf( - \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', - \ cmd, string(cmd), string(names)) - endfor - - for [map, names] in items(lod.map) - for [mode, map_prefix, key_prefix] in - \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] - execute printf( - \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', - \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) - endfor - endfor - - for [ft, names] in items(lod.ft) - augroup PlugLOD - execute printf('autocmd FileType %s call lod_ft(%s, %s)', - \ ft, string(ft), string(names)) - augroup END - endfor - - call s:reorg_rtp() - filetype plugin indent on - if has('vim_starting') - if has('syntax') && !exists('g:syntax_on') - syntax enable - end - else - call s:reload_plugins() - endif -endfunction - -function! s:loaded_names() - return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') -endfunction - -function! s:load_plugin(spec) - call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') -endfunction - -function! s:reload_plugins() - for name in s:loaded_names() - call s:load_plugin(g:plugs[name]) - endfor -endfunction - -function! s:trim(str) - return substitute(a:str, '[\/]\+$', '', '') -endfunction - -function! s:version_requirement(val, min) - for idx in range(0, len(a:min) - 1) - let v = get(a:val, idx, 0) - if v < a:min[idx] | return 0 - elseif v > a:min[idx] | return 1 - endif - endfor - return 1 -endfunction - -function! s:git_version_requirement(...) - if !exists('s:git_version') - let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') - endif - return s:version_requirement(s:git_version, a:000) -endfunction - -function! s:progress_opt(base) - return a:base && !s:is_win && - \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' -endfunction - -function! s:rtp(spec) - return s:path(a:spec.dir . get(a:spec, 'rtp', '')) -endfunction - -if s:is_win - function! s:path(path) - return s:trim(substitute(a:path, '/', '\', 'g')) - endfunction - - function! s:dirpath(path) - return s:path(a:path) . '\' - endfunction - - function! s:is_local_plug(repo) - return a:repo =~? '^[a-z]:\|^[%~]' - endfunction - - " Copied from fzf - function! s:wrap_cmds(cmds) - let cmds = [ - \ '@echo off', - \ 'setlocal enabledelayedexpansion'] - \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) - \ + ['endlocal'] - if has('iconv') - if !exists('s:codepage') - let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) - endif - return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) - endif - return map(cmds, 'v:val."\r"') - endfunction - - function! s:batchfile(cmd) - let batchfile = s:plug_tempname().'.bat' - call writefile(s:wrap_cmds(a:cmd), batchfile) - let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) - if &shell =~# 'powershell\.exe' - let cmd = '& ' . cmd - endif - return [batchfile, cmd] - endfunction -else - function! s:path(path) - return s:trim(a:path) - endfunction - - function! s:dirpath(path) - return substitute(a:path, '[/\\]*$', '/', '') - endfunction - - function! s:is_local_plug(repo) - return a:repo[0] =~ '[/$~]' - endfunction -endif - -function! s:err(msg) - echohl ErrorMsg - echom '[vim-plug] '.a:msg - echohl None -endfunction - -function! s:warn(cmd, msg) - echohl WarningMsg - execute a:cmd 'a:msg' - echohl None -endfunction - -function! s:esc(path) - return escape(a:path, ' ') -endfunction - -function! s:escrtp(path) - return escape(a:path, ' ,') -endfunction - -function! s:remove_rtp() - for name in s:loaded_names() - let rtp = s:rtp(g:plugs[name]) - execute 'set rtp-='.s:escrtp(rtp) - let after = globpath(rtp, 'after') - if isdirectory(after) - execute 'set rtp-='.s:escrtp(after) - endif - endfor -endfunction - -function! s:reorg_rtp() - if !empty(s:first_rtp) - execute 'set rtp-='.s:first_rtp - execute 'set rtp-='.s:last_rtp - endif - - " &rtp is modified from outside - if exists('s:prtp') && s:prtp !=# &rtp - call s:remove_rtp() - unlet! s:middle - endif - - let s:middle = get(s:, 'middle', &rtp) - let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') - let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') - let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') - \ . ','.s:middle.',' - \ . join(map(afters, 'escape(v:val, ",")'), ',') - let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') - let s:prtp = &rtp - - if !empty(s:first_rtp) - execute 'set rtp^='.s:first_rtp - execute 'set rtp+='.s:last_rtp - endif -endfunction - -function! s:doautocmd(...) - if exists('#'.join(a:000, '#')) - execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) - endif -endfunction - -function! s:dobufread(names) - for name in a:names - let path = s:rtp(g:plugs[name]) - for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] - if len(finddir(dir, path)) - if exists('#BufRead') - doautocmd BufRead - endif - return - endif - endfor - endfor -endfunction - -function! plug#load(...) - if a:0 == 0 - return s:err('Argument missing: plugin name(s) required') - endif - if !exists('g:plugs') - return s:err('plug#begin was not called') - endif - let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 - let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') - if !empty(unknowns) - let s = len(unknowns) > 1 ? 's' : '' - return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) - end - let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') - if !empty(unloaded) - for name in unloaded - call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) - endfor - call s:dobufread(unloaded) - return 1 - end - return 0 -endfunction - -function! s:remove_triggers(name) - if !has_key(s:triggers, a:name) - return - endif - for cmd in s:triggers[a:name].cmd - execute 'silent! delc' cmd - endfor - for map in s:triggers[a:name].map - execute 'silent! unmap' map - execute 'silent! iunmap' map - endfor - call remove(s:triggers, a:name) -endfunction - -function! s:lod(names, types, ...) - for name in a:names - call s:remove_triggers(name) - let s:loaded[name] = 1 - endfor - call s:reorg_rtp() - - for name in a:names - let rtp = s:rtp(g:plugs[name]) - for dir in a:types - call s:source(rtp, dir.'/**/*.vim') - endfor - if a:0 - if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) - execute 'runtime' a:1 - endif - call s:source(rtp, a:2) - endif - call s:doautocmd('User', name) - endfor -endfunction - -function! s:lod_ft(pat, names) - let syn = 'syntax/'.a:pat.'.vim' - call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) - execute 'autocmd! PlugLOD FileType' a:pat - call s:doautocmd('filetypeplugin', 'FileType') - call s:doautocmd('filetypeindent', 'FileType') -endfunction - -function! s:lod_cmd(cmd, bang, l1, l2, args, names) - call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) - call s:dobufread(a:names) - execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) -endfunction - -function! s:lod_map(map, names, with_prefix, prefix) - call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) - call s:dobufread(a:names) - let extra = '' - while 1 - let c = getchar(0) - if c == 0 - break - endif - let extra .= nr2char(c) - endwhile - - if a:with_prefix - let prefix = v:count ? v:count : '' - let prefix .= '"'.v:register.a:prefix - if mode(1) == 'no' - if v:operator == 'c' - let prefix = "\" . prefix - endif - let prefix .= v:operator - endif - call feedkeys(prefix, 'n') - endif - call feedkeys(substitute(a:map, '^', "\", '') . extra) -endfunction - -function! plug#(repo, ...) - if a:0 > 1 - return s:err('Invalid number of arguments (1..2)') - endif - - try - let repo = s:trim(a:repo) - let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec - let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) - let spec = extend(s:infer_properties(name, repo), opts) - if !has_key(g:plugs, name) - call add(g:plugs_order, name) - endif - let g:plugs[name] = spec - let s:loaded[name] = get(s:loaded, name, 0) - catch - return s:err(v:exception) - endtry -endfunction - -function! s:parse_options(arg) - let opts = copy(s:base_spec) - let type = type(a:arg) - if type == s:TYPE.string - let opts.tag = a:arg - elseif type == s:TYPE.dict - call extend(opts, a:arg) - if has_key(opts, 'dir') - let opts.dir = s:dirpath(s:plug_expand(opts.dir)) - endif - else - throw 'Invalid argument type (expected: string or dictionary)' - endif - return opts -endfunction - -function! s:infer_properties(name, repo) - let repo = a:repo - if s:is_local_plug(repo) - return { 'dir': s:dirpath(s:plug_expand(repo)) } - else - if repo =~ ':' - let uri = repo - else - if repo !~ '/' - throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) - endif - let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') - let uri = printf(fmt, repo) - endif - return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } - endif -endfunction - -function! s:install(force, names) - call s:update_impl(0, a:force, a:names) -endfunction - -function! s:update(force, names) - call s:update_impl(1, a:force, a:names) -endfunction - -function! plug#helptags() - if !exists('g:plugs') - return s:err('plug#begin was not called') - endif - for spec in values(g:plugs) - let docd = join([s:rtp(spec), 'doc'], '/') - if isdirectory(docd) - silent! execute 'helptags' s:esc(docd) - endif - endfor - return 1 -endfunction - -function! s:syntax() - syntax clear - syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber - syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX - syn match plugNumber /[0-9]\+[0-9.]*/ contained - syn match plugBracket /[[\]]/ contained - syn match plugX /x/ contained - syn match plugDash /^-/ - syn match plugPlus /^+/ - syn match plugStar /^*/ - syn match plugMessage /\(^- \)\@<=.*/ - syn match plugName /\(^- \)\@<=[^ ]*:/ - syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ - syn match plugTag /(tag: [^)]\+)/ - syn match plugInstall /\(^+ \)\@<=[^:]*/ - syn match plugUpdate /\(^* \)\@<=[^:]*/ - syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag - syn match plugEdge /^ \X\+$/ - syn match plugEdge /^ \X*/ contained nextgroup=plugSha - syn match plugSha /[0-9a-f]\{7,9}/ contained - syn match plugRelDate /([^)]*)$/ contained - syn match plugNotLoaded /(not loaded)$/ - syn match plugError /^x.*/ - syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ - syn match plugH2 /^.*:\n-\+$/ - syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean - hi def link plug1 Title - hi def link plug2 Repeat - hi def link plugH2 Type - hi def link plugX Exception - hi def link plugBracket Structure - hi def link plugNumber Number - - hi def link plugDash Special - hi def link plugPlus Constant - hi def link plugStar Boolean - - hi def link plugMessage Function - hi def link plugName Label - hi def link plugInstall Function - hi def link plugUpdate Type - - hi def link plugError Error - hi def link plugDeleted Ignore - hi def link plugRelDate Comment - hi def link plugEdge PreProc - hi def link plugSha Identifier - hi def link plugTag Constant - - hi def link plugNotLoaded Comment -endfunction - -function! s:lpad(str, len) - return a:str . repeat(' ', a:len - len(a:str)) -endfunction - -function! s:lines(msg) - return split(a:msg, "[\r\n]") -endfunction - -function! s:lastline(msg) - return get(s:lines(a:msg), -1, '') -endfunction - -function! s:new_window() - execute get(g:, 'plug_window', 'vertical topleft new') -endfunction - -function! s:plug_window_exists() - let buflist = tabpagebuflist(s:plug_tab) - return !empty(buflist) && index(buflist, s:plug_buf) >= 0 -endfunction - -function! s:switch_in() - if !s:plug_window_exists() - return 0 - endif - - if winbufnr(0) != s:plug_buf - let s:pos = [tabpagenr(), winnr(), winsaveview()] - execute 'normal!' s:plug_tab.'gt' - let winnr = bufwinnr(s:plug_buf) - execute winnr.'wincmd w' - call add(s:pos, winsaveview()) - else - let s:pos = [winsaveview()] - endif - - setlocal modifiable - return 1 -endfunction - -function! s:switch_out(...) - call winrestview(s:pos[-1]) - setlocal nomodifiable - if a:0 > 0 - execute a:1 - endif - - if len(s:pos) > 1 - execute 'normal!' s:pos[0].'gt' - execute s:pos[1] 'wincmd w' - call winrestview(s:pos[2]) - endif -endfunction - -function! s:finish_bindings() - nnoremap R :call retry() - nnoremap D :PlugDiff - nnoremap S :PlugStatus - nnoremap U :call status_update() - xnoremap U :call status_update() - nnoremap ]] :silent! call section('') - nnoremap [[ :silent! call section('b') -endfunction - -function! s:prepare(...) - if empty(s:plug_getcwd()) - throw 'Invalid current working directory. Cannot proceed.' - endif - - for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] - if exists(evar) - throw evar.' detected. Cannot proceed.' - endif - endfor - - call s:job_abort() - if s:switch_in() - if b:plug_preview == 1 - pc - endif - enew - else - call s:new_window() - endif - - nnoremap q :if b:plug_preview==1pcendifbd - if a:0 == 0 - call s:finish_bindings() - endif - let b:plug_preview = -1 - let s:plug_tab = tabpagenr() - let s:plug_buf = winbufnr(0) - call s:assign_name() - - for k in ['', 'L', 'o', 'X', 'd', 'dd'] - execute 'silent! unmap ' k - endfor - setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell - if exists('+colorcolumn') - setlocal colorcolumn= - endif - setf vim-plug - if exists('g:syntax_on') - call s:syntax() - endif -endfunction - -function! s:assign_name() - " Assign buffer name - let prefix = '[Plugins]' - let name = prefix - let idx = 2 - while bufexists(name) - let name = printf('%s (%s)', prefix, idx) - let idx = idx + 1 - endwhile - silent! execute 'f' fnameescape(name) -endfunction - -function! s:chsh(swap) - let prev = [&shell, &shellcmdflag, &shellredir] - if !s:is_win && a:swap - set shell=sh shellredir=>%s\ 2>&1 - endif - return prev -endfunction - -function! s:bang(cmd, ...) - let batchfile = '' - try - let [sh, shellcmdflag, shrd] = s:chsh(a:0) - " FIXME: Escaping is incomplete. We could use shellescape with eval, - " but it won't work on Windows. - let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd - if s:is_win - let [batchfile, cmd] = s:batchfile(cmd) - endif - let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') - execute "normal! :execute g:_plug_bang\\" - finally - unlet g:_plug_bang - let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] - if s:is_win && filereadable(batchfile) - call delete(batchfile) - endif - endtry - return v:shell_error ? 'Exit status: ' . v:shell_error : '' -endfunction - -function! s:regress_bar() - let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') - call s:progress_bar(2, bar, len(bar)) -endfunction - -function! s:is_updated(dir) - return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) -endfunction - -function! s:do(pull, force, todo) - for [name, spec] in items(a:todo) - if !isdirectory(spec.dir) - continue - endif - let installed = has_key(s:update.new, name) - let updated = installed ? 0 : - \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) - if a:force || installed || updated - execute 'cd' s:esc(spec.dir) - call append(3, '- Post-update hook for '. name .' ... ') - let error = '' - let type = type(spec.do) - if type == s:TYPE.string - if spec.do[0] == ':' - if !get(s:loaded, name, 0) - let s:loaded[name] = 1 - call s:reorg_rtp() - endif - call s:load_plugin(spec) - try - execute spec.do[1:] - catch - let error = v:exception - endtry - if !s:plug_window_exists() - cd - - throw 'Warning: vim-plug was terminated by the post-update hook of '.name - endif - else - let error = s:bang(spec.do) - endif - elseif type == s:TYPE.funcref - try - let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') - call spec.do({ 'name': name, 'status': status, 'force': a:force }) - catch - let error = v:exception - endtry - else - let error = 'Invalid hook type' - endif - call s:switch_in() - call setline(4, empty(error) ? (getline(4) . 'OK') - \ : ('x' . getline(4)[1:] . error)) - if !empty(error) - call add(s:update.errors, name) - call s:regress_bar() - endif - cd - - endif - endfor -endfunction - -function! s:hash_match(a, b) - return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 -endfunction - -function! s:checkout(spec) - let sha = a:spec.commit - let output = s:system('git rev-parse HEAD', a:spec.dir) - if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) - let output = s:system( - \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) - endif - return output -endfunction - -function! s:finish(pull) - let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) - if new_frozen - let s = new_frozen > 1 ? 's' : '' - call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) - endif - call append(3, '- Finishing ... ') | 4 - redraw - call plug#helptags() - call plug#end() - call setline(4, getline(4) . 'Done!') - redraw - let msgs = [] - if !empty(s:update.errors) - call add(msgs, "Press 'R' to retry.") - endif - if a:pull && len(s:update.new) < len(filter(getline(5, '$'), - \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) - call add(msgs, "Press 'D' to see the updated changes.") - endif - echo join(msgs, ' ') - call s:finish_bindings() -endfunction - -function! s:retry() - if empty(s:update.errors) - return - endif - echo - call s:update_impl(s:update.pull, s:update.force, - \ extend(copy(s:update.errors), [s:update.threads])) -endfunction - -function! s:is_managed(name) - return has_key(g:plugs[a:name], 'uri') -endfunction - -function! s:names(...) - return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) -endfunction - -function! s:check_ruby() - silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") - if !exists('g:plug_ruby') - redraw! - return s:warn('echom', 'Warning: Ruby interface is broken') - endif - let ruby_version = split(g:plug_ruby, '\.') - unlet g:plug_ruby - return s:version_requirement(ruby_version, [1, 8, 7]) -endfunction - -function! s:update_impl(pull, force, args) abort - let sync = index(a:args, '--sync') >= 0 || has('vim_starting') - let args = filter(copy(a:args), 'v:val != "--sync"') - let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? - \ remove(args, -1) : get(g:, 'plug_threads', 16) - - let managed = filter(copy(g:plugs), 's:is_managed(v:key)') - let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : - \ filter(managed, 'index(args, v:key) >= 0') - - if empty(todo) - return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) - endif - - if !s:is_win && s:git_version_requirement(2, 3) - let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' - let $GIT_TERMINAL_PROMPT = 0 - for plug in values(todo) - let plug.uri = substitute(plug.uri, - \ '^https://git::@github\.com', 'https://github.com', '') - endfor - endif - - if !isdirectory(g:plug_home) - try - call mkdir(g:plug_home, 'p') - catch - return s:err(printf('Invalid plug directory: %s. '. - \ 'Try to call plug#begin with a valid directory', g:plug_home)) - endtry - endif - - if has('nvim') && !exists('*jobwait') && threads > 1 - call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') - endif - - let use_job = s:nvim || s:vim8 - let python = (has('python') || has('python3')) && !use_job - let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() - - let s:update = { - \ 'start': reltime(), - \ 'all': todo, - \ 'todo': copy(todo), - \ 'errors': [], - \ 'pull': a:pull, - \ 'force': a:force, - \ 'new': {}, - \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, - \ 'bar': '', - \ 'fin': 0 - \ } - - call s:prepare(1) - call append(0, ['', '']) - normal! 2G - silent! redraw - - let s:clone_opt = get(g:, 'plug_shallow', 1) ? - \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' - - if has('win32unix') || has('wsl') - let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' - endif - - let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' - - " Python version requirement (>= 2.7) - if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 - redir => pyv - silent python import platform; print platform.python_version() - redir END - let python = s:version_requirement( - \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) - endif - - if (python || ruby) && s:update.threads > 1 - try - let imd = &imd - if s:mac_gui - set noimd - endif - if ruby - call s:update_ruby() - else - call s:update_python() - endif - catch - let lines = getline(4, '$') - let printed = {} - silent! 4,$d _ - for line in lines - let name = s:extract_name(line, '.', '') - if empty(name) || !has_key(printed, name) - call append('$', line) - if !empty(name) - let printed[name] = 1 - if line[0] == 'x' && index(s:update.errors, name) < 0 - call add(s:update.errors, name) - end - endif - endif - endfor - finally - let &imd = imd - call s:update_finish() - endtry - else - call s:update_vim() - while use_job && sync - sleep 100m - if s:update.fin - break - endif - endwhile - endif -endfunction - -function! s:log4(name, msg) - call setline(4, printf('- %s (%s)', a:msg, a:name)) - redraw -endfunction - -function! s:update_finish() - if exists('s:git_terminal_prompt') - let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt - endif - if s:switch_in() - call append(3, '- Updating ...') | 4 - for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) - let [pos, _] = s:logpos(name) - if !pos - continue - endif - if has_key(spec, 'commit') - call s:log4(name, 'Checking out '.spec.commit) - let out = s:checkout(spec) - elseif has_key(spec, 'tag') - let tag = spec.tag - if tag =~ '\*' - let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) - if !v:shell_error && !empty(tags) - let tag = tags[0] - call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) - call append(3, '') - endif - endif - call s:log4(name, 'Checking out '.tag) - let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) - else - let branch = get(spec, 'branch', 'master') - call s:log4(name, 'Merging origin/'.s:esc(branch)) - let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' - \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) - endif - if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && - \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) - call s:log4(name, 'Updating submodules. This may take a while.') - let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) - endif - let msg = s:format_message(v:shell_error ? 'x': '-', name, out) - if v:shell_error - call add(s:update.errors, name) - call s:regress_bar() - silent execute pos 'd _' - call append(4, msg) | 4 - elseif !empty(out) - call setline(pos, msg[0]) - endif - redraw - endfor - silent 4 d _ - try - call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) - catch - call s:warn('echom', v:exception) - call s:warn('echo', '') - return - endtry - call s:finish(s:update.pull) - call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') - call s:switch_out('normal! gg') - endif -endfunction - -function! s:job_abort() - if (!s:nvim && !s:vim8) || !exists('s:jobs') - return - endif - - for [name, j] in items(s:jobs) - if s:nvim - silent! call jobstop(j.jobid) - elseif s:vim8 - silent! call job_stop(j.jobid) - endif - if j.new - call s:rm_rf(g:plugs[name].dir) - endif - endfor - let s:jobs = {} -endfunction - -function! s:last_non_empty_line(lines) - let len = len(a:lines) - for idx in range(len) - let line = a:lines[len-idx-1] - if !empty(line) - return line - endif - endfor - return '' -endfunction - -function! s:job_out_cb(self, data) abort - let self = a:self - let data = remove(self.lines, -1) . a:data - let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') - call extend(self.lines, lines) - " To reduce the number of buffer updates - let self.tick = get(self, 'tick', -1) + 1 - if !self.running || self.tick % len(s:jobs) == 0 - let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') - let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) - call s:log(bullet, self.name, result) - endif -endfunction - -function! s:job_exit_cb(self, data) abort - let a:self.running = 0 - let a:self.error = a:data != 0 - call s:reap(a:self.name) - call s:tick() -endfunction - -function! s:job_cb(fn, job, ch, data) - if !s:plug_window_exists() " plug window closed - return s:job_abort() - endif - call call(a:fn, [a:job, a:data]) -endfunction - -function! s:nvim_cb(job_id, data, event) dict abort - return a:event == 'stdout' ? - \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : - \ s:job_cb('s:job_exit_cb', self, 0, a:data) -endfunction - -function! s:spawn(name, cmd, opts) - let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], - \ 'new': get(a:opts, 'new', 0) } - let s:jobs[a:name] = job - let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd - let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] - - if s:nvim - call extend(job, { - \ 'on_stdout': function('s:nvim_cb'), - \ 'on_exit': function('s:nvim_cb'), - \ }) - let jid = s:plug_call('jobstart', argv, job) - if jid > 0 - let job.jobid = jid - else - let job.running = 0 - let job.error = 1 - let job.lines = [jid < 0 ? argv[0].' is not executable' : - \ 'Invalid arguments (or job table is full)'] - endif - elseif s:vim8 - let jid = job_start(s:is_win ? join(argv, ' ') : argv, { - \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), - \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), - \ 'out_mode': 'raw' - \}) - if job_status(jid) == 'run' - let job.jobid = jid - else - let job.running = 0 - let job.error = 1 - let job.lines = ['Failed to start job'] - endif - else - let job.lines = s:lines(call('s:system', [cmd])) - let job.error = v:shell_error != 0 - let job.running = 0 - endif -endfunction - -function! s:reap(name) - let job = s:jobs[a:name] - if job.error - call add(s:update.errors, a:name) - elseif get(job, 'new', 0) - let s:update.new[a:name] = 1 - endif - let s:update.bar .= job.error ? 'x' : '=' - - let bullet = job.error ? 'x' : '-' - let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) - call s:log(bullet, a:name, empty(result) ? 'OK' : result) - call s:bar() - - call remove(s:jobs, a:name) -endfunction - -function! s:bar() - if s:switch_in() - let total = len(s:update.all) - call setline(1, (s:update.pull ? 'Updating' : 'Installing'). - \ ' plugins ('.len(s:update.bar).'/'.total.')') - call s:progress_bar(2, s:update.bar, total) - call s:switch_out() - endif -endfunction - -function! s:logpos(name) - let max = line('$') - for i in range(4, max > 4 ? max : 4) - if getline(i) =~# '^[-+x*] '.a:name.':' - for j in range(i + 1, max > 5 ? max : 5) - if getline(j) !~ '^ ' - return [i, j - 1] - endif - endfor - return [i, i] - endif - endfor - return [0, 0] -endfunction - -function! s:log(bullet, name, lines) - if s:switch_in() - let [b, e] = s:logpos(a:name) - if b > 0 - silent execute printf('%d,%d d _', b, e) - if b > winheight('.') - let b = 4 - endif - else - let b = 4 - endif - " FIXME For some reason, nomodifiable is set after :d in vim8 - setlocal modifiable - call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) - call s:switch_out() - endif -endfunction - -function! s:update_vim() - let s:jobs = {} - - call s:bar() - call s:tick() -endfunction - -function! s:tick() - let pull = s:update.pull - let prog = s:progress_opt(s:nvim || s:vim8) -while 1 " Without TCO, Vim stack is bound to explode - if empty(s:update.todo) - if empty(s:jobs) && !s:update.fin - call s:update_finish() - let s:update.fin = 1 - endif - return - endif - - let name = keys(s:update.todo)[0] - let spec = remove(s:update.todo, name) - let new = empty(globpath(spec.dir, '.git', 1)) - - call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') - redraw - - let has_tag = has_key(spec, 'tag') - if !new - let [error, _] = s:git_validate(spec, 0) - if empty(error) - if pull - let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' - call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) - else - let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } - endif - else - let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } - endif - else - call s:spawn(name, - \ printf('git clone %s %s %s %s 2>&1', - \ has_tag ? '' : s:clone_opt, - \ prog, - \ plug#shellescape(spec.uri, {'script': 0}), - \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 }) - endif - - if !s:jobs[name].running - call s:reap(name) - endif - if len(s:jobs) >= s:update.threads - break - endif -endwhile -endfunction - -function! s:update_python() -let py_exe = has('python') ? 'python' : 'python3' -execute py_exe "<< EOF" -import datetime -import functools -import os -try: - import queue -except ImportError: - import Queue as queue -import random -import re -import shutil -import signal -import subprocess -import tempfile -import threading as thr -import time -import traceback -import vim - -G_NVIM = vim.eval("has('nvim')") == '1' -G_PULL = vim.eval('s:update.pull') == '1' -G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 -G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) -G_CLONE_OPT = vim.eval('s:clone_opt') -G_PROGRESS = vim.eval('s:progress_opt(1)') -G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) -G_STOP = thr.Event() -G_IS_WIN = vim.eval('s:is_win') == '1' - -class PlugError(Exception): - def __init__(self, msg): - self.msg = msg -class CmdTimedOut(PlugError): - pass -class CmdFailed(PlugError): - pass -class InvalidURI(PlugError): - pass -class Action(object): - INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] - -class Buffer(object): - def __init__(self, lock, num_plugs, is_pull): - self.bar = '' - self.event = 'Updating' if is_pull else 'Installing' - self.lock = lock - self.maxy = int(vim.eval('winheight(".")')) - self.num_plugs = num_plugs - - def __where(self, name): - """ Find first line with name in current buffer. Return line num. """ - found, lnum = False, 0 - matcher = re.compile('^[-+x*] {0}:'.format(name)) - for line in vim.current.buffer: - if matcher.search(line) is not None: - found = True - break - lnum += 1 - - if not found: - lnum = -1 - return lnum - - def header(self): - curbuf = vim.current.buffer - curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) - - num_spaces = self.num_plugs - len(self.bar) - curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') - - with self.lock: - vim.command('normal! 2G') - vim.command('redraw') - - def write(self, action, name, lines): - first, rest = lines[0], lines[1:] - msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] - msg.extend([' ' + line for line in rest]) - - try: - if action == Action.ERROR: - self.bar += 'x' - vim.command("call add(s:update.errors, '{0}')".format(name)) - elif action == Action.DONE: - self.bar += '=' - - curbuf = vim.current.buffer - lnum = self.__where(name) - if lnum != -1: # Found matching line num - del curbuf[lnum] - if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): - lnum = 3 - else: - lnum = 3 - curbuf.append(msg, lnum) - - self.header() - except vim.error: - pass - -class Command(object): - CD = 'cd /d' if G_IS_WIN else 'cd' - - def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): - self.cmd = cmd - if cmd_dir: - self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) - self.timeout = timeout - self.callback = cb if cb else (lambda msg: None) - self.clean = clean if clean else (lambda: None) - self.proc = None - - @property - def alive(self): - """ Returns true only if command still running. """ - return self.proc and self.proc.poll() is None - - def execute(self, ntries=3): - """ Execute the command with ntries if CmdTimedOut. - Returns the output of the command if no Exception. - """ - attempt, finished, limit = 0, False, self.timeout - - while not finished: - try: - attempt += 1 - result = self.try_command() - finished = True - return result - except CmdTimedOut: - if attempt != ntries: - self.notify_retry() - self.timeout += limit - else: - raise - - def notify_retry(self): - """ Retry required for command, notify user. """ - for count in range(3, 0, -1): - if G_STOP.is_set(): - raise KeyboardInterrupt - msg = 'Timeout. Will retry in {0} second{1} ...'.format( - count, 's' if count != 1 else '') - self.callback([msg]) - time.sleep(1) - self.callback(['Retrying ...']) - - def try_command(self): - """ Execute a cmd & poll for callback. Returns list of output. - Raises CmdFailed -> return code for Popen isn't 0 - Raises CmdTimedOut -> command exceeded timeout without new output - """ - first_line = True - - try: - tfile = tempfile.NamedTemporaryFile(mode='w+b') - preexec_fn = not G_IS_WIN and os.setsid or None - self.proc = subprocess.Popen(self.cmd, stdout=tfile, - stderr=subprocess.STDOUT, - stdin=subprocess.PIPE, shell=True, - preexec_fn=preexec_fn) - thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) - thrd.start() - - thread_not_started = True - while thread_not_started: - try: - thrd.join(0.1) - thread_not_started = False - except RuntimeError: - pass - - while self.alive: - if G_STOP.is_set(): - raise KeyboardInterrupt - - if first_line or random.random() < G_LOG_PROB: - first_line = False - line = '' if G_IS_WIN else nonblock_read(tfile.name) - if line: - self.callback([line]) - - time_diff = time.time() - os.path.getmtime(tfile.name) - if time_diff > self.timeout: - raise CmdTimedOut(['Timeout!']) - - thrd.join(0.5) - - tfile.seek(0) - result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] - - if self.proc.returncode != 0: - raise CmdFailed([''] + result) - - return result - except: - self.terminate() - raise - - def terminate(self): - """ Terminate process and cleanup. """ - if self.alive: - if G_IS_WIN: - os.kill(self.proc.pid, signal.SIGINT) - else: - os.killpg(self.proc.pid, signal.SIGTERM) - self.clean() - -class Plugin(object): - def __init__(self, name, args, buf_q, lock): - self.name = name - self.args = args - self.buf_q = buf_q - self.lock = lock - self.tag = args.get('tag', 0) - - def manage(self): - try: - if os.path.exists(self.args['dir']): - self.update() - else: - self.install() - with self.lock: - thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) - except PlugError as exc: - self.write(Action.ERROR, self.name, exc.msg) - except KeyboardInterrupt: - G_STOP.set() - self.write(Action.ERROR, self.name, ['Interrupted!']) - except: - # Any exception except those above print stack trace - msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) - self.write(Action.ERROR, self.name, msg.split('\n')) - raise - - def install(self): - target = self.args['dir'] - if target[-1] == '\\': - target = target[0:-1] - - def clean(target): - def _clean(): - try: - shutil.rmtree(target) - except OSError: - pass - return _clean - - self.write(Action.INSTALL, self.name, ['Installing ...']) - callback = functools.partial(self.write, Action.INSTALL, self.name) - cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( - '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], - esc(target)) - com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) - result = com.execute(G_RETRIES) - self.write(Action.DONE, self.name, result[-1:]) - - def repo_uri(self): - cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' - command = Command(cmd, self.args['dir'], G_TIMEOUT,) - result = command.execute(G_RETRIES) - return result[-1] - - def update(self): - actual_uri = self.repo_uri() - expect_uri = self.args['uri'] - regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') - ma = regex.match(actual_uri) - mb = regex.match(expect_uri) - if ma is None or mb is None or ma.groups() != mb.groups(): - msg = ['', - 'Invalid URI: {0}'.format(actual_uri), - 'Expected {0}'.format(expect_uri), - 'PlugClean required.'] - raise InvalidURI(msg) - - if G_PULL: - self.write(Action.UPDATE, self.name, ['Updating ...']) - callback = functools.partial(self.write, Action.UPDATE, self.name) - fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' - cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) - com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) - result = com.execute(G_RETRIES) - self.write(Action.DONE, self.name, result[-1:]) - else: - self.write(Action.DONE, self.name, ['Already installed']) - - def write(self, action, name, msg): - self.buf_q.put((action, name, msg)) - -class PlugThread(thr.Thread): - def __init__(self, tname, args): - super(PlugThread, self).__init__() - self.tname = tname - self.args = args - - def run(self): - thr.current_thread().name = self.tname - buf_q, work_q, lock = self.args - - try: - while not G_STOP.is_set(): - name, args = work_q.get_nowait() - plug = Plugin(name, args, buf_q, lock) - plug.manage() - work_q.task_done() - except queue.Empty: - pass - -class RefreshThread(thr.Thread): - def __init__(self, lock): - super(RefreshThread, self).__init__() - self.lock = lock - self.running = True - - def run(self): - while self.running: - with self.lock: - thread_vim_command('noautocmd normal! a') - time.sleep(0.33) - - def stop(self): - self.running = False - -if G_NVIM: - def thread_vim_command(cmd): - vim.session.threadsafe_call(lambda: vim.command(cmd)) -else: - def thread_vim_command(cmd): - vim.command(cmd) - -def esc(name): - return '"' + name.replace('"', '\"') + '"' - -def nonblock_read(fname): - """ Read a file with nonblock flag. Return the last line. """ - fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) - buf = os.read(fread, 100000).decode('utf-8', 'replace') - os.close(fread) - - line = buf.rstrip('\r\n') - left = max(line.rfind('\r'), line.rfind('\n')) - if left != -1: - left += 1 - line = line[left:] - - return line - -def main(): - thr.current_thread().name = 'main' - nthreads = int(vim.eval('s:update.threads')) - plugs = vim.eval('s:update.todo') - mac_gui = vim.eval('s:mac_gui') == '1' - - lock = thr.Lock() - buf = Buffer(lock, len(plugs), G_PULL) - buf_q, work_q = queue.Queue(), queue.Queue() - for work in plugs.items(): - work_q.put(work) - - start_cnt = thr.active_count() - for num in range(nthreads): - tname = 'PlugT-{0:02}'.format(num) - thread = PlugThread(tname, (buf_q, work_q, lock)) - thread.start() - if mac_gui: - rthread = RefreshThread(lock) - rthread.start() - - while not buf_q.empty() or thr.active_count() != start_cnt: - try: - action, name, msg = buf_q.get(True, 0.25) - buf.write(action, name, ['OK'] if not msg else msg) - buf_q.task_done() - except queue.Empty: - pass - except KeyboardInterrupt: - G_STOP.set() - - if mac_gui: - rthread.stop() - rthread.join() - -main() -EOF -endfunction - -function! s:update_ruby() - ruby << EOF - module PlugStream - SEP = ["\r", "\n", nil] - def get_line - buffer = '' - loop do - char = readchar rescue return - if SEP.include? char.chr - buffer << $/ - break - else - buffer << char - end - end - buffer - end - end unless defined?(PlugStream) - - def esc arg - %["#{arg.gsub('"', '\"')}"] - end - - def killall pid - pids = [pid] - if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM - pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } - else - unless `which pgrep 2> /dev/null`.empty? - children = pids - until children.empty? - children = children.map { |pid| - `pgrep -P #{pid}`.lines.map { |l| l.chomp } - }.flatten - pids += children - end - end - pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } - end - end - - def compare_git_uri a, b - regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} - regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) - end - - require 'thread' - require 'fileutils' - require 'timeout' - running = true - iswin = VIM::evaluate('s:is_win').to_i == 1 - pull = VIM::evaluate('s:update.pull').to_i == 1 - base = VIM::evaluate('g:plug_home') - all = VIM::evaluate('s:update.todo') - limit = VIM::evaluate('get(g:, "plug_timeout", 60)') - tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 - nthr = VIM::evaluate('s:update.threads').to_i - maxy = VIM::evaluate('winheight(".")').to_i - vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ - cd = iswin ? 'cd /d' : 'cd' - tot = VIM::evaluate('len(s:update.todo)') || 0 - bar = '' - skip = 'Already installed' - mtx = Mutex.new - take1 = proc { mtx.synchronize { running && all.shift } } - logh = proc { - cnt = bar.length - $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" - $curbuf[2] = '[' + bar.ljust(tot) + ']' - VIM::command('normal! 2G') - VIM::command('redraw') - } - where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } - log = proc { |name, result, type| - mtx.synchronize do - ing = ![true, false].include?(type) - bar += type ? '=' : 'x' unless ing - b = case type - when :install then '+' when :update then '*' - when true, nil then '-' else - VIM::command("call add(s:update.errors, '#{name}')") - 'x' - end - result = - if type || type.nil? - ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] - elsif result =~ /^Interrupted|^Timeout/ - ["#{b} #{name}: #{result}"] - else - ["#{b} #{name}"] + result.lines.map { |l| " " << l } - end - if lnum = where.call(name) - $curbuf.delete lnum - lnum = 4 if ing && lnum > maxy - end - result.each_with_index do |line, offset| - $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) - end - logh.call - end - } - bt = proc { |cmd, name, type, cleanup| - tried = timeout = 0 - begin - tried += 1 - timeout += limit - fd = nil - data = '' - if iswin - Timeout::timeout(timeout) do - tmp = VIM::evaluate('tempname()') - system("(#{cmd}) > #{tmp}") - data = File.read(tmp).chomp - File.unlink tmp rescue nil - end - else - fd = IO.popen(cmd).extend(PlugStream) - first_line = true - log_prob = 1.0 / nthr - while line = Timeout::timeout(timeout) { fd.get_line } - data << line - log.call name, line.chomp, type if name && (first_line || rand < log_prob) - first_line = false - end - fd.close - end - [$? == 0, data.chomp] - rescue Timeout::Error, Interrupt => e - if fd && !fd.closed? - killall fd.pid - fd.close - end - cleanup.call if cleanup - if e.is_a?(Timeout::Error) && tried < tries - 3.downto(1) do |countdown| - s = countdown > 1 ? 's' : '' - log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type - sleep 1 - end - log.call name, 'Retrying ...', type - retry - end - [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] - end - } - main = Thread.current - threads = [] - watcher = Thread.new { - if vim7 - while VIM::evaluate('getchar(1)') - sleep 0.1 - end - else - require 'io/console' # >= Ruby 1.9 - nil until IO.console.getch == 3.chr - end - mtx.synchronize do - running = false - threads.each { |t| t.raise Interrupt } unless vim7 - end - threads.each { |t| t.join rescue nil } - main.kill - } - refresh = Thread.new { - while true - mtx.synchronize do - break unless running - VIM::command('noautocmd normal! a') - end - sleep 0.2 - end - } if VIM::evaluate('s:mac_gui') == 1 - - clone_opt = VIM::evaluate('s:clone_opt') - progress = VIM::evaluate('s:progress_opt(1)') - nthr.times do - mtx.synchronize do - threads << Thread.new { - while pair = take1.call - name = pair.first - dir, uri, tag = pair.last.values_at *%w[dir uri tag] - exists = File.directory? dir - ok, result = - if exists - chdir = "#{cd} #{iswin ? dir : esc(dir)}" - ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil - current_uri = data.lines.to_a.last - if !ret - if data =~ /^Interrupted|^Timeout/ - [false, data] - else - [false, [data.chomp, "PlugClean required."].join($/)] - end - elsif !compare_git_uri(current_uri, uri) - [false, ["Invalid URI: #{current_uri}", - "Expected: #{uri}", - "PlugClean required."].join($/)] - else - if pull - log.call name, 'Updating ...', :update - fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' - bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil - else - [true, skip] - end - end - else - d = esc dir.sub(%r{[\\/]+$}, '') - log.call name, 'Installing ...', :install - bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { - FileUtils.rm_rf dir - } - end - mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok - log.call name, result, ok - end - } if running - end - end - threads.each { |t| t.join rescue nil } - logh.call - refresh.kill if refresh - watcher.kill -EOF -endfunction - -function! s:shellesc_cmd(arg, script) - let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') - return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') -endfunction - -function! s:shellesc_ps1(arg) - return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" -endfunction - -function! s:shellesc_sh(arg) - return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" -endfunction - -function! plug#shellescape(arg, ...) - let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} - let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') - let script = get(opts, 'script', 1) - if shell =~# 'cmd\.exe' - return s:shellesc_cmd(a:arg, script) - elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$' - return s:shellesc_ps1(a:arg) - endif - return s:shellesc_sh(a:arg) -endfunction - -function! s:glob_dir(path) - return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') -endfunction - -function! s:progress_bar(line, bar, total) - call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') -endfunction - -function! s:compare_git_uri(a, b) - " See `git help clone' - " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] - " [git@] github.com[:port] : junegunn/vim-plug [.git] - " file:// / junegunn/vim-plug [/] - " / junegunn/vim-plug [/] - let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' - let ma = matchlist(a:a, pat) - let mb = matchlist(a:b, pat) - return ma[1:2] ==# mb[1:2] -endfunction - -function! s:format_message(bullet, name, message) - if a:bullet != 'x' - return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] - else - let lines = map(s:lines(a:message), '" ".v:val') - return extend([printf('x %s:', a:name)], lines) - endif -endfunction - -function! s:with_cd(cmd, dir, ...) - let script = a:0 > 0 ? a:1 : 1 - return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) -endfunction - -function! s:system(cmd, ...) - let batchfile = '' - try - let [sh, shellcmdflag, shrd] = s:chsh(1) - let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd - if s:is_win - let [batchfile, cmd] = s:batchfile(cmd) - endif - return system(cmd) - finally - let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] - if s:is_win && filereadable(batchfile) - call delete(batchfile) - endif - endtry -endfunction - -function! s:system_chomp(...) - let ret = call('s:system', a:000) - return v:shell_error ? '' : substitute(ret, '\n$', '', '') -endfunction - -function! s:git_validate(spec, check_branch) - let err = '' - if isdirectory(a:spec.dir) - let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) - let remote = result[-1] - if v:shell_error - let err = join([remote, 'PlugClean required.'], "\n") - elseif !s:compare_git_uri(remote, a:spec.uri) - let err = join(['Invalid URI: '.remote, - \ 'Expected: '.a:spec.uri, - \ 'PlugClean required.'], "\n") - elseif a:check_branch && has_key(a:spec, 'commit') - let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) - let sha = result[-1] - if v:shell_error - let err = join(add(result, 'PlugClean required.'), "\n") - elseif !s:hash_match(sha, a:spec.commit) - let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', - \ a:spec.commit[:6], sha[:6]), - \ 'PlugUpdate required.'], "\n") - endif - elseif a:check_branch - let branch = result[0] - " Check tag - if has_key(a:spec, 'tag') - let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) - if a:spec.tag !=# tag && a:spec.tag !~ '\*' - let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', - \ (empty(tag) ? 'N/A' : tag), a:spec.tag) - endif - " Check branch - elseif a:spec.branch !=# branch - let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', - \ branch, a:spec.branch) - endif - if empty(err) - let [ahead, behind] = split(s:lastline(s:system(printf( - \ 'git rev-list --count --left-right HEAD...origin/%s', - \ a:spec.branch), a:spec.dir)), '\t') - if !v:shell_error && ahead - if behind - " Only mention PlugClean if diverged, otherwise it's likely to be - " pushable (and probably not that messed up). - let err = printf( - \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" - \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) - else - let err = printf("Ahead of origin/%s by %d commit(s).\n" - \ .'Cannot update until local changes are pushed.', - \ a:spec.branch, ahead) - endif - endif - endif - endif - else - let err = 'Not found' - endif - return [err, err =~# 'PlugClean'] -endfunction - -function! s:rm_rf(dir) - if isdirectory(a:dir) - call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir)) - endif -endfunction - -function! s:clean(force) - call s:prepare() - call append(0, 'Searching for invalid plugins in '.g:plug_home) - call append(1, '') - - " List of valid directories - let dirs = [] - let errs = {} - let [cnt, total] = [0, len(g:plugs)] - for [name, spec] in items(g:plugs) - if !s:is_managed(name) - call add(dirs, spec.dir) - else - let [err, clean] = s:git_validate(spec, 1) - if clean - let errs[spec.dir] = s:lines(err)[0] - else - call add(dirs, spec.dir) - endif - endif - let cnt += 1 - call s:progress_bar(2, repeat('=', cnt), total) - normal! 2G - redraw - endfor - - let allowed = {} - for dir in dirs - let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 - let allowed[dir] = 1 - for child in s:glob_dir(dir) - let allowed[child] = 1 - endfor - endfor - - let todo = [] - let found = sort(s:glob_dir(g:plug_home)) - while !empty(found) - let f = remove(found, 0) - if !has_key(allowed, f) && isdirectory(f) - call add(todo, f) - call append(line('$'), '- ' . f) - if has_key(errs, f) - call append(line('$'), ' ' . errs[f]) - endif - let found = filter(found, 'stridx(v:val, f) != 0') - end - endwhile - - 4 - redraw - if empty(todo) - call append(line('$'), 'Already clean.') - else - let s:clean_count = 0 - call append(3, ['Directories to delete:', '']) - redraw! - if a:force || s:ask_no_interrupt('Delete all directories?') - call s:delete([6, line('$')], 1) - else - call setline(4, 'Cancelled.') - nnoremap d :set opfunc=delete_opg@ - nmap dd d_ - xnoremap d :call delete_op(visualmode(), 1) - echo 'Delete the lines (d{motion}) to delete the corresponding directories' - endif - endif - 4 - setlocal nomodifiable -endfunction - -function! s:delete_op(type, ...) - call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) -endfunction - -function! s:delete(range, force) - let [l1, l2] = a:range - let force = a:force - while l1 <= l2 - let line = getline(l1) - if line =~ '^- ' && isdirectory(line[2:]) - execute l1 - redraw! - let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) - let force = force || answer > 1 - if answer - call s:rm_rf(line[2:]) - setlocal modifiable - call setline(l1, '~'.line[1:]) - let s:clean_count += 1 - call setline(4, printf('Removed %d directories.', s:clean_count)) - setlocal nomodifiable - endif - endif - let l1 += 1 - endwhile -endfunction - -function! s:upgrade() - echo 'Downloading the latest version of vim-plug' - redraw - let tmp = s:plug_tempname() - let new = tmp . '/plug.vim' - - try - let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp))) - if v:shell_error - return s:err('Error upgrading vim-plug: '. out) - endif - - if readfile(s:me) ==# readfile(new) - echo 'vim-plug is already up-to-date' - return 0 - else - call rename(s:me, s:me . '.old') - call rename(new, s:me) - unlet g:loaded_plug - echo 'vim-plug has been upgraded' - return 1 - endif - finally - silent! call s:rm_rf(tmp) - endtry -endfunction - -function! s:upgrade_specs() - for spec in values(g:plugs) - let spec.frozen = get(spec, 'frozen', 0) - endfor -endfunction - -function! s:status() - call s:prepare() - call append(0, 'Checking plugins') - call append(1, '') - - let ecnt = 0 - let unloaded = 0 - let [cnt, total] = [0, len(g:plugs)] - for [name, spec] in items(g:plugs) - let is_dir = isdirectory(spec.dir) - if has_key(spec, 'uri') - if is_dir - let [err, _] = s:git_validate(spec, 1) - let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] - else - let [valid, msg] = [0, 'Not found. Try PlugInstall.'] - endif - else - if is_dir - let [valid, msg] = [1, 'OK'] - else - let [valid, msg] = [0, 'Not found.'] - endif - endif - let cnt += 1 - let ecnt += !valid - " `s:loaded` entry can be missing if PlugUpgraded - if is_dir && get(s:loaded, name, -1) == 0 - let unloaded = 1 - let msg .= ' (not loaded)' - endif - call s:progress_bar(2, repeat('=', cnt), total) - call append(3, s:format_message(valid ? '-' : 'x', name, msg)) - normal! 2G - redraw - endfor - call setline(1, 'Finished. '.ecnt.' error(s).') - normal! gg - setlocal nomodifiable - if unloaded - echo "Press 'L' on each line to load plugin, or 'U' to update" - nnoremap L :call status_load(line('.')) - xnoremap L :call status_load(line('.')) - end -endfunction - -function! s:extract_name(str, prefix, suffix) - return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') -endfunction - -function! s:status_load(lnum) - let line = getline(a:lnum) - let name = s:extract_name(line, '-', '(not loaded)') - if !empty(name) - call plug#load(name) - setlocal modifiable - call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) - setlocal nomodifiable - endif -endfunction - -function! s:status_update() range - let lines = getline(a:firstline, a:lastline) - let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') - if !empty(names) - echo - execute 'PlugUpdate' join(names) - endif -endfunction - -function! s:is_preview_window_open() - silent! wincmd P - if &previewwindow - wincmd p - return 1 - endif -endfunction - -function! s:find_name(lnum) - for lnum in reverse(range(1, a:lnum)) - let line = getline(lnum) - if empty(line) - return '' - endif - let name = s:extract_name(line, '-', '') - if !empty(name) - return name - endif - endfor - return '' -endfunction - -function! s:preview_commit() - if b:plug_preview < 0 - let b:plug_preview = !s:is_preview_window_open() - endif - - let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') - if empty(sha) - return - endif - - let name = s:find_name(line('.')) - if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) - return - endif - - if exists('g:plug_pwindow') && !s:is_preview_window_open() - execute g:plug_pwindow - execute 'e' sha - else - execute 'pedit' sha - wincmd P - endif - setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable - let batchfile = '' - try - let [sh, shellcmdflag, shrd] = s:chsh(1) - let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha - if s:is_win - let [batchfile, cmd] = s:batchfile(cmd) - endif - execute 'silent %!' cmd - finally - let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] - if s:is_win && filereadable(batchfile) - call delete(batchfile) - endif - endtry - setlocal nomodifiable - nnoremap q :q - wincmd p -endfunction - -function! s:section(flags) - call search('\(^[x-] \)\@<=[^:]\+:', a:flags) -endfunction - -function! s:format_git_log(line) - let indent = ' ' - let tokens = split(a:line, nr2char(1)) - if len(tokens) != 5 - return indent.substitute(a:line, '\s*$', '', '') - endif - let [graph, sha, refs, subject, date] = tokens - let tag = matchstr(refs, 'tag: [^,)]\+') - let tag = empty(tag) ? ' ' : ' ('.tag.') ' - return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) -endfunction - -function! s:append_ul(lnum, text) - call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) -endfunction - -function! s:diff() - call s:prepare() - call append(0, ['Collecting changes ...', '']) - let cnts = [0, 0] - let bar = '' - let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') - call s:progress_bar(2, bar, len(total)) - for origin in [1, 0] - let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) - if empty(plugs) - continue - endif - call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') - for [k, v] in plugs - let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' - let cmd = 'git log --graph --color=never ' - \ . (s:git_version_requirement(2, 10, 0) ? '--no-show-signature ' : '') - \ . join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)')) - if has_key(v, 'rtp') - let cmd .= ' -- '.plug#shellescape(v.rtp) - endif - let diff = s:system_chomp(cmd, v.dir) - if !empty(diff) - let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' - call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) - let cnts[origin] += 1 - endif - let bar .= '=' - call s:progress_bar(2, bar, len(total)) - normal! 2G - redraw - endfor - if !cnts[origin] - call append(5, ['', 'N/A']) - endif - endfor - call setline(1, printf('%d plugin(s) updated.', cnts[0]) - \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) - - if cnts[0] || cnts[1] - nnoremap (plug-preview) :silent! call preview_commit() - if empty(maparg("\", 'n')) - nmap (plug-preview) - endif - if empty(maparg('o', 'n')) - nmap o (plug-preview) - endif - endif - if cnts[0] - nnoremap X :call revert() - echo "Press 'X' on each block to revert the update" - endif - normal! gg - setlocal nomodifiable -endfunction - -function! s:revert() - if search('^Pending updates', 'bnW') - return - endif - - let name = s:find_name(line('.')) - if empty(name) || !has_key(g:plugs, name) || - \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' - return - endif - - call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) - setlocal modifiable - normal! "_dap - setlocal nomodifiable - echo 'Reverted' -endfunction - -function! s:snapshot(force, ...) abort - call s:prepare() - setf vim - call append(0, ['" Generated by vim-plug', - \ '" '.strftime("%c"), - \ '" :source this file in vim to restore the snapshot', - \ '" or execute: vim -S snapshot.vim', - \ '', '', 'PlugUpdate!']) - 1 - let anchor = line('$') - 3 - let names = sort(keys(filter(copy(g:plugs), - \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) - for name in reverse(names) - let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) - if !empty(sha) - call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) - redraw - endif - endfor - - if a:0 > 0 - let fn = s:plug_expand(a:1) - if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) - return - endif - call writefile(getline(1, '$'), fn) - echo 'Saved as '.a:1 - silent execute 'e' s:esc(fn) - setf vim - endif -endfunction - -function! s:split_rtp() - return split(&rtp, '\\\@", - "diagnostic.warningSign": ".", - "diagnostic.infoSign": ".", - "suggest.autoTrigger": "trigger", - - "emmet.includeLanguages": { "javascript": "javascriptreact" } -} diff --git a/.vim/plugged/coc.nvim b/.vim/plugged/coc.nvim deleted file mode 160000 index 8256e5f..0000000 --- a/.vim/plugged/coc.nvim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8256e5fb646f83c8126ff607ac8d05ff1e219d1a diff --git a/.vim/plugged/fzf b/.vim/plugged/fzf deleted file mode 160000 index dea206b..0000000 --- a/.vim/plugged/fzf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dea206b023a695b75540f642a0b19a3ba1e38eec diff --git a/.vim/plugged/fzf.vim b/.vim/plugged/fzf.vim deleted file mode 160000 index f86ef1b..0000000 --- a/.vim/plugged/fzf.vim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f86ef1bce602713fe0b5b68f4bdca8c6943ecb59 diff --git a/.vim/plugged/nerdcommenter b/.vim/plugged/nerdcommenter deleted file mode 160000 index c62e618..0000000 --- a/.vim/plugged/nerdcommenter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c62e618a1ab5a50a4028e3296500ba29d9b033d8 diff --git a/.vim/plugged/nerdtree b/.vim/plugged/nerdtree deleted file mode 160000 index 0257d64..0000000 --- a/.vim/plugged/nerdtree +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0257d64248e43f3ff70e9a1fce3b2aa10ba57bb9 diff --git a/.vim/plugged/scvim b/.vim/plugged/scvim deleted file mode 160000 index d80cf6e..0000000 --- a/.vim/plugged/scvim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d80cf6e84ed4de3fa0cc1560bf3c1de5adad80fe diff --git a/.vim/plugged/typescript-vim b/.vim/plugged/typescript-vim deleted file mode 160000 index 17d85d8..0000000 --- a/.vim/plugged/typescript-vim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 17d85d8051ba21283e62a9101734981e10b732fd diff --git a/.vim/plugged/vim-devicons b/.vim/plugged/vim-devicons deleted file mode 160000 index 58e57b6..0000000 --- a/.vim/plugged/vim-devicons +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 58e57b6eeb407dba7ff6e607342c08c32b6fd398 diff --git a/.vim/plugged/vim-js b/.vim/plugged/vim-js deleted file mode 160000 index 3ab7c66..0000000 --- a/.vim/plugged/vim-js +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3ab7c66ad874008c8f0d7516e005c7a056fa10ab diff --git a/.vim/plugged/vim-jsx-pretty b/.vim/plugged/vim-jsx-pretty deleted file mode 160000 index 496c44d..0000000 --- a/.vim/plugged/vim-jsx-pretty +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 496c44d89281d1e13c9bb4c75a2e69daba48b47b diff --git a/.vim/plugged/vim-jsx-typescript b/.vim/plugged/vim-jsx-typescript deleted file mode 160000 index 007a4e3..0000000 --- a/.vim/plugged/vim-jsx-typescript +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 007a4e3856a90c3ce0f2e2079992e798a0175043 diff --git a/.vim/plugged/vim-tidal b/.vim/plugged/vim-tidal deleted file mode 160000 index 5213497..0000000 --- a/.vim/plugged/vim-tidal +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 52134979252757a5736ae09cb9fc6ae3cc04daef diff --git a/.xinitrc b/.xinitrc deleted file mode 100644 index 41ecb50..0000000 --- a/.xinitrc +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -userresources=$HOME/.Xresources -usermodmap=$HOME/.Xmodmap -sysresources=/etc/X11/xinit/.Xresources -sysmodmap=/etc/X11/xinit/.Xmodmap - -# merge in defaults and keymaps -if [ -f $sysresources ]; then - xrdb -merge $sysresources -fi - -if [ -f $sysmodmap ]; then - xmodmap $sysmodmap -fi - -if [ -f "$userresources" ]; then - xrdb -merge "$userresources" -fi - -if [ -f "$usermodmap" ]; then - xmodmap "$usermodmap" -fi - -# start some nice programs -if [ -d /etc/X11/xinit/xinitrc.d ] ; then - for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do - [ -x "$f" ] && . "$f" - done - unset f -fi - -# ______________________________ - -# disable bell -xset -b - -#exec dwm -# execute dwm in a loop -while true; do - /usr/local/bin/dwm 2> /dev/null -done - -# adjust typematic delay & rate -xset r rate 200 30 diff --git a/README.md b/README.md deleted file mode 100644 index fe8da40..0000000 --- a/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# dotfiles - -## tools - -### suckless - -- dwm -- dmenu -- st -- sselp - -### vim - -- vim-plug -- NERDTree -- FZF -- coc -- javascript, typescript & react - - typescript-vim - - vim-jsx-pretty - - vim-jsx-typescript - -## themes - -- nord - -## scripts - -[] display toggle script - -## screenshot - -![Screenshot](screenshot.png) diff --git a/etc/xorg.conf.d/10-monitor.conf b/etc/xorg.conf.d/10-monitor.conf deleted file mode 100644 index 609e5d5..0000000 --- a/etc/xorg.conf.d/10-monitor.conf +++ /dev/null @@ -1,10 +0,0 @@ -Section "Screen" - Identifier "eDP1" - Option "Primary" "true" -Endsection - -Section "Monitor" - Identifier "HDMI1" - Option "PreferredMode" "3840x2160" - Option "LeftOf" "eDP1" -Endsection diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index bb1cdc215a96b3d4c87d4a1e34423a46e4b33628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144910 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