From 9b942398411bb216ba7a275dc9e422d09831b47b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=98=99=E2=97=A6=20The=20Tablet=20=E2=9D=80=20GamerGirla?= =?UTF-8?q?ndCo=20=E2=97=A6=E2=9D=A7?= Date: Sat, 7 Sep 2024 11:49:53 -0400 Subject: [PATCH] powerline --- .aliases.ps1 | 0 .gitignore | 0 .gitmodules | 0 .poshrc.ps1 | 0 .psrc.ps1 | 0 .tmux/.tmux-powerlinerc | 0 htop/htoprc | 0 micro/buffers/history | Bin micro/settings.json | 0 neofetch/config.conf | 0 powerline-bin/bin/powerline | Bin 0 -> 16896 bytes powerline-bin/bin/powerline-config | 22 + powerline-bin/bin/powerline-daemon | 495 +++++++++ powerline-bin/bin/powerline-lint | 13 + powerline-bin/bin/powerline-render | 31 + powerline-bin/powerline/__init__.py | 991 ++++++++++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 44508 bytes .../__pycache__/colorscheme.cpython-312.pyc | Bin 0 -> 6671 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 816 bytes .../__pycache__/ipython.cpython-312.pyc | Bin 0 -> 4225 bytes .../__pycache__/lemonbar.cpython-312.pyc | Bin 0 -> 1606 bytes .../powerline/__pycache__/pdb.cpython-312.pyc | Bin 0 -> 3187 bytes .../__pycache__/renderer.cpython-312.pyc | Bin 0 -> 21426 bytes .../__pycache__/segment.cpython-312.pyc | Bin 0 -> 17689 bytes .../__pycache__/shell.cpython-312.pyc | Bin 0 -> 2829 bytes .../__pycache__/theme.cpython-312.pyc | Bin 0 -> 8300 bytes .../powerline/__pycache__/vim.cpython-312.pyc | Bin 0 -> 16788 bytes powerline-bin/powerline/bindings/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 163 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 15044 bytes .../powerline-awesome.cpython-312.pyc | Bin 0 -> 862 bytes .../bindings/awesome/powerline-awesome.py | 20 + .../powerline/bindings/awesome/powerline.lua | 15 + .../__pycache__/powerline-bar.cpython-312.pyc | Bin 0 -> 3118 bytes .../powerline/bindings/bar/powerline-bar.py | 60 ++ .../powerline/bindings/bash/powerline.sh | 153 +++ powerline-bin/powerline/bindings/config.py | 286 +++++ .../bindings/fish/powerline-setup.fish | 109 ++ .../__pycache__/powerline-i3.cpython-312.pyc | Bin 0 -> 2063 bytes .../powerline/bindings/i3/powerline-i3.py | 52 + .../powerline/bindings/ipython/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 171 bytes .../__pycache__/post_0_11.cpython-312.pyc | Bin 0 -> 5962 bytes .../__pycache__/pre_0_11.cpython-312.pyc | Bin 0 -> 8361 bytes .../__pycache__/since_5.cpython-312.pyc | Bin 0 -> 4458 bytes .../powerline/bindings/ipython/post_0_11.py | 123 +++ .../powerline/bindings/ipython/pre_0_11.py | 146 +++ .../powerline/bindings/ipython/since_5.py | 81 ++ .../powerline-lemonbar.cpython-312.pyc | Bin 0 -> 3494 bytes .../bindings/lemonbar/powerline-lemonbar.py | 61 ++ .../powerline/bindings/pdb/__init__.py | 183 ++++ .../powerline/bindings/pdb/__main__.py | 9 + .../pdb/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 9392 bytes .../pdb/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 415 bytes .../powerline/bindings/qtile/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 169 bytes .../qtile/__pycache__/widget.cpython-312.pyc | Bin 0 -> 3334 bytes .../powerline/bindings/qtile/widget.py | 61 ++ .../powerline/bindings/rc/powerline.rc | 92 ++ .../powerline/bindings/shell/powerline.sh | 239 +++++ .../powerline/bindings/tcsh/powerline.tcsh | 60 ++ .../powerline/bindings/tmux/__init__.py | 84 ++ .../tmux/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3615 bytes .../bindings/tmux/powerline-base.conf | 11 + .../powerline/bindings/tmux/powerline.conf | 2 + .../tmux/powerline_tmux_1.7_plus.conf | 3 + .../bindings/tmux/powerline_tmux_1.8.conf | 5 + .../tmux/powerline_tmux_1.8_minus.conf | 11 + .../tmux/powerline_tmux_1.8_plus.conf | 5 + .../tmux/powerline_tmux_1.9_plus.conf | 8 + .../tmux/powerline_tmux_2.1_plus.conf | 3 + .../powerline/bindings/vim/__init__.py | 482 +++++++++ .../vim/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 25389 bytes .../bindings/vim/autoload/powerline/debug.vim | 20 + .../bindings/vim/plugin/powerline.vim | 169 +++ .../powerline/bindings/wm/__init__.py | 85 ++ .../wm/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3382 bytes .../wm/__pycache__/awesome.cpython-312.pyc | Bin 0 -> 3286 bytes .../powerline/bindings/wm/awesome.py | 59 ++ .../powerline/bindings/zsh/__init__.py | 228 ++++ .../zsh/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 11143 bytes .../powerline/bindings/zsh/powerline.zsh | 216 ++++ powerline-bin/powerline/colorscheme.py | 147 +++ powerline-bin/powerline/commands/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 163 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 5624 bytes .../__pycache__/daemon.cpython-312.pyc | Bin 0 -> 1597 bytes .../__pycache__/lemonbar.cpython-312.pyc | Bin 0 -> 1402 bytes .../commands/__pycache__/lint.cpython-312.pyc | Bin 0 -> 1108 bytes .../commands/__pycache__/main.cpython-312.pyc | Bin 0 -> 10180 bytes powerline-bin/powerline/commands/config.py | 109 ++ powerline-bin/powerline/commands/daemon.py | 24 + powerline-bin/powerline/commands/lemonbar.py | 35 + powerline-bin/powerline/commands/lint.py | 21 + powerline-bin/powerline/commands/main.py | 190 ++++ powerline-bin/powerline/config.py | 10 + .../powerline/config_files/colors.json | 124 +++ .../config_files/colorschemes/default.json | 56 + .../colorschemes/ipython/__main__.json | 6 + .../colorschemes/pdb/__main__.json | 8 + .../colorschemes/pdb/default.json | 5 + .../colorschemes/pdb/solarized.json | 5 + .../colorschemes/shell/__main__.json | 10 + .../colorschemes/shell/default.json | 16 + .../colorschemes/shell/solarized.json | 13 + .../config_files/colorschemes/solarized.json | 40 + .../colorschemes/tmux/default.json | 14 + .../colorschemes/tmux/solarized.json | 14 + .../colorschemes/vim/__main__.json | 50 + .../colorschemes/vim/default.json | 154 +++ .../colorschemes/vim/solarized.json | 121 +++ .../colorschemes/vim/solarizedlight.json | 122 +++ .../powerline/config_files/config.json | 53 + .../powerline/config_files/themes/ascii.json | 153 +++ .../config_files/themes/ipython/in.json | 25 + .../config_files/themes/ipython/in2.json | 12 + .../config_files/themes/ipython/out.json | 24 + .../config_files/themes/ipython/rewrite.json | 23 + .../config_files/themes/pdb/default.json | 27 + .../config_files/themes/powerline.json | 151 +++ .../themes/powerline_terminus.json | 151 +++ .../themes/powerline_unicode7.json | 165 +++ .../config_files/themes/shell/__main__.json | 14 + .../themes/shell/continuation.json | 12 + .../config_files/themes/shell/default.json | 43 + .../themes/shell/default_leftonly.json | 34 + .../config_files/themes/shell/select.json | 13 + .../config_files/themes/tmux/default.json | 28 + .../config_files/themes/unicode.json | 151 +++ .../config_files/themes/unicode_terminus.json | 151 +++ .../themes/unicode_terminus_condensed.json | 151 +++ .../config_files/themes/vim/__main__.json | 10 + .../config_files/themes/vim/cmdwin.json | 18 + .../config_files/themes/vim/default.json | 128 +++ .../config_files/themes/vim/help.json | 36 + .../themes/vim/plugin_commandt.json | 26 + .../themes/vim/plugin_gundo-preview.json | 18 + .../config_files/themes/vim/plugin_gundo.json | 18 + .../themes/vim/plugin_nerdtree.json | 17 + .../config_files/themes/vim/quickfix.json | 40 + .../config_files/themes/vim/tabline.json | 93 ++ .../config_files/themes/wm/default.json | 29 + .../dist/systemd/powerline-daemon.service | 10 + powerline-bin/powerline/ipython.py | 68 ++ powerline-bin/powerline/lemonbar.py | 21 + powerline-bin/powerline/lib/__init__.py | 28 + .../lib/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1383 bytes .../lib/__pycache__/config.cpython-312.pyc | Bin 0 -> 11862 bytes .../lib/__pycache__/debug.cpython-312.pyc | Bin 0 -> 4344 bytes .../lib/__pycache__/dict.cpython-312.pyc | Bin 0 -> 3592 bytes .../lib/__pycache__/encoding.cpython-312.pyc | Bin 0 -> 4965 bytes .../humanize_bytes.cpython-312.pyc | Bin 0 -> 1357 bytes .../lib/__pycache__/inotify.cpython-312.pyc | Bin 0 -> 7744 bytes .../lib/__pycache__/memoize.cpython-312.pyc | Bin 0 -> 2137 bytes .../lib/__pycache__/monotonic.cpython-312.pyc | Bin 0 -> 4191 bytes .../lib/__pycache__/overrides.cpython-312.pyc | Bin 0 -> 2933 bytes .../lib/__pycache__/path.cpython-312.pyc | Bin 0 -> 1298 bytes .../lib/__pycache__/shell.cpython-312.pyc | Bin 0 -> 5561 bytes .../lib/__pycache__/threaded.cpython-312.pyc | Bin 0 -> 13624 bytes .../lib/__pycache__/unicode.cpython-312.pyc | Bin 0 -> 12992 bytes .../lib/__pycache__/url.cpython-312.pyc | Bin 0 -> 916 bytes powerline-bin/powerline/lib/config.py | 218 ++++ powerline-bin/powerline/lib/debug.py | 97 ++ powerline-bin/powerline/lib/dict.py | 88 ++ powerline-bin/powerline/lib/encoding.py | 125 +++ powerline-bin/powerline/lib/humanize_bytes.py | 25 + powerline-bin/powerline/lib/inotify.py | 184 ++++ powerline-bin/powerline/lib/memoize.py | 42 + powerline-bin/powerline/lib/monotonic.py | 100 ++ powerline-bin/powerline/lib/overrides.py | 80 ++ powerline-bin/powerline/lib/path.py | 18 + powerline-bin/powerline/lib/shell.py | 133 +++ powerline-bin/powerline/lib/threaded.py | 262 +++++ powerline-bin/powerline/lib/unicode.py | 283 +++++ powerline-bin/powerline/lib/url.py | 17 + powerline-bin/powerline/lib/vcs/__init__.py | 276 +++++ .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 11832 bytes .../lib/vcs/__pycache__/bzr.cpython-312.pyc | Bin 0 -> 5391 bytes .../lib/vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 9880 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 4245 bytes powerline-bin/powerline/lib/vcs/bzr.py | 108 ++ powerline-bin/powerline/lib/vcs/git.py | 208 ++++ powerline-bin/powerline/lib/vcs/mercurial.py | 88 ++ .../powerline/lib/watcher/__init__.py | 76 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3501 bytes .../__pycache__/inotify.cpython-312.pyc | Bin 0 -> 14132 bytes .../watcher/__pycache__/stat.cpython-312.pyc | Bin 0 -> 2885 bytes .../watcher/__pycache__/tree.cpython-312.pyc | Bin 0 -> 4829 bytes .../watcher/__pycache__/uv.cpython-312.pyc | Bin 0 -> 12021 bytes .../powerline/lib/watcher/inotify.py | 268 +++++ powerline-bin/powerline/lib/watcher/stat.py | 44 + powerline-bin/powerline/lib/watcher/tree.py | 90 ++ powerline-bin/powerline/lib/watcher/uv.py | 207 ++++ powerline-bin/powerline/lint/__init__.py | 625 +++++++++++ .../lint/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 34659 bytes .../lint/__pycache__/checks.cpython-312.pyc | Bin 0 -> 36955 bytes .../lint/__pycache__/context.cpython-312.pyc | Bin 0 -> 4446 bytes .../lint/__pycache__/imp.cpython-312.pyc | Bin 0 -> 3416 bytes .../lint/__pycache__/inspect.cpython-312.pyc | Bin 0 -> 2688 bytes .../__pycache__/selfcheck.cpython-312.pyc | Bin 0 -> 1261 bytes .../lint/__pycache__/spec.cpython-312.pyc | Bin 0 -> 33257 bytes powerline-bin/powerline/lint/checks.py | 866 +++++++++++++++ powerline-bin/powerline/lint/context.py | 68 ++ powerline-bin/powerline/lint/imp.py | 56 + powerline-bin/powerline/lint/inspect.py | 63 ++ .../powerline/lint/markedjson/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 971 bytes .../__pycache__/composer.cpython-312.pyc | Bin 0 -> 6230 bytes .../__pycache__/constructor.cpython-312.pyc | Bin 0 -> 13186 bytes .../__pycache__/error.cpython-312.pyc | Bin 0 -> 12238 bytes .../__pycache__/events.cpython-312.pyc | Bin 0 -> 4622 bytes .../__pycache__/loader.cpython-312.pyc | Bin 0 -> 1670 bytes .../__pycache__/markedvalue.cpython-312.pyc | Bin 0 -> 8021 bytes .../__pycache__/nodes.cpython-312.pyc | Bin 0 -> 2320 bytes .../__pycache__/parser.cpython-312.pyc | Bin 0 -> 13326 bytes .../__pycache__/reader.cpython-312.pyc | Bin 0 -> 7390 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 6084 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 17136 bytes .../__pycache__/tokens.cpython-312.pyc | Bin 0 -> 3448 bytes .../powerline/lint/markedjson/composer.py | 119 +++ .../powerline/lint/markedjson/constructor.py | 285 +++++ .../powerline/lint/markedjson/error.py | 241 +++++ .../powerline/lint/markedjson/events.py | 97 ++ .../powerline/lint/markedjson/loader.py | 25 + .../powerline/lint/markedjson/markedvalue.py | 151 +++ .../powerline/lint/markedjson/nodes.py | 55 + .../powerline/lint/markedjson/parser.py | 255 +++++ .../powerline/lint/markedjson/reader.py | 141 +++ .../powerline/lint/markedjson/resolver.py | 131 +++ .../powerline/lint/markedjson/scanner.py | 499 +++++++++ .../powerline/lint/markedjson/tokens.py | 72 ++ powerline-bin/powerline/lint/selfcheck.py | 16 + powerline-bin/powerline/lint/spec.py | 759 ++++++++++++++ powerline-bin/powerline/listers/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 162 bytes .../listers/__pycache__/i3wm.cpython-312.pyc | Bin 0 -> 2865 bytes .../listers/__pycache__/pdb.cpython-312.pyc | Bin 0 -> 1406 bytes .../listers/__pycache__/vim.cpython-312.pyc | Bin 0 -> 5278 bytes powerline-bin/powerline/listers/i3wm.py | 68 ++ powerline-bin/powerline/listers/pdb.py | 37 + powerline-bin/powerline/listers/vim.py | 123 +++ powerline-bin/powerline/matchers/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 386 bytes .../powerline/matchers/vim/__init__.py | 19 + .../vim/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1011 bytes .../powerline/matchers/vim/plugin/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 397 bytes .../__pycache__/commandt.cpython-312.pyc | Bin 0 -> 776 bytes .../plugin/__pycache__/gundo.cpython-312.pyc | Bin 0 -> 930 bytes .../__pycache__/nerdtree.cpython-312.pyc | Bin 0 -> 815 bytes .../powerline/matchers/vim/plugin/commandt.py | 14 + .../powerline/matchers/vim/plugin/gundo.py | 16 + .../powerline/matchers/vim/plugin/nerdtree.py | 15 + powerline-bin/powerline/pdb.py | 48 + powerline-bin/powerline/renderer.py | 594 +++++++++++ powerline-bin/powerline/renderers/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 164 bytes .../__pycache__/i3bar.cpython-312.pyc | Bin 0 -> 1443 bytes .../__pycache__/lemonbar.cpython-312.pyc | Bin 0 -> 2920 bytes .../__pycache__/pango_markup.cpython-312.pyc | Bin 0 -> 1877 bytes .../renderers/__pycache__/pdb.cpython-312.pyc | Bin 0 -> 2616 bytes .../__pycache__/tmux.cpython-312.pyc | Bin 0 -> 3509 bytes .../renderers/__pycache__/vim.cpython-312.pyc | Bin 0 -> 8832 bytes powerline-bin/powerline/renderers/i3bar.py | 36 + .../powerline/renderers/ipython/__init__.py | 34 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1907 bytes .../ipython/__pycache__/pre_5.cpython-312.pyc | Bin 0 -> 3367 bytes .../__pycache__/since_5.cpython-312.pyc | Bin 0 -> 6347 bytes .../powerline/renderers/ipython/pre_5.py | 56 + .../powerline/renderers/ipython/since_5.py | 130 +++ powerline-bin/powerline/renderers/lemonbar.py | 61 ++ .../powerline/renderers/pango_markup.py | 39 + powerline-bin/powerline/renderers/pdb.py | 50 + .../powerline/renderers/shell/__init__.py | 182 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7880 bytes .../shell/__pycache__/bash.cpython-312.pyc | Bin 0 -> 922 bytes .../shell/__pycache__/ksh.cpython-312.pyc | Bin 0 -> 981 bytes .../shell/__pycache__/rcsh.cpython-312.pyc | Bin 0 -> 390 bytes .../__pycache__/readline.cpython-312.pyc | Bin 0 -> 697 bytes .../shell/__pycache__/tcsh.cpython-312.pyc | Bin 0 -> 1654 bytes .../shell/__pycache__/zsh.cpython-312.pyc | Bin 0 -> 831 bytes .../powerline/renderers/shell/bash.py | 18 + .../powerline/renderers/shell/ksh.py | 19 + .../powerline/renderers/shell/rcsh.py | 7 + .../powerline/renderers/shell/readline.py | 14 + .../powerline/renderers/shell/tcsh.py | 31 + .../powerline/renderers/shell/zsh.py | 16 + powerline-bin/powerline/renderers/tmux.py | 79 ++ powerline-bin/powerline/renderers/vim.py | 188 ++++ powerline-bin/powerline/segment.py | 450 ++++++++ powerline-bin/powerline/segments/__init__.py | 63 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2641 bytes .../segments/__pycache__/i3wm.cpython-312.pyc | Bin 0 -> 6397 bytes .../__pycache__/ipython.cpython-312.pyc | Bin 0 -> 581 bytes .../segments/__pycache__/pdb.cpython-312.pyc | Bin 0 -> 2564 bytes .../__pycache__/shell.cpython-312.pyc | Bin 0 -> 6100 bytes .../segments/__pycache__/tmux.cpython-312.pyc | Bin 0 -> 1208 bytes .../powerline/segments/common/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 170 bytes .../common/__pycache__/bat.cpython-312.pyc | Bin 0 -> 15643 bytes .../common/__pycache__/env.cpython-312.pyc | Bin 0 -> 8079 bytes .../common/__pycache__/mail.cpython-312.pyc | Bin 0 -> 3705 bytes .../common/__pycache__/net.cpython-312.pyc | Bin 0 -> 14017 bytes .../__pycache__/players.cpython-312.pyc | Bin 0 -> 23167 bytes .../common/__pycache__/sys.cpython-312.pyc | Bin 0 -> 8578 bytes .../common/__pycache__/time.cpython-312.pyc | Bin 0 -> 3189 bytes .../common/__pycache__/vcs.cpython-312.pyc | Bin 0 -> 3752 bytes .../common/__pycache__/wthr.cpython-312.pyc | Bin 0 -> 7798 bytes .../powerline/segments/common/bat.py | 302 ++++++ .../powerline/segments/common/env.py | 197 ++++ .../powerline/segments/common/mail.py | 78 ++ .../powerline/segments/common/net.py | 315 ++++++ .../powerline/segments/common/players.py | 607 +++++++++++ .../powerline/segments/common/sys.py | 183 ++++ .../powerline/segments/common/time.py | 94 ++ .../powerline/segments/common/vcs.py | 89 ++ .../powerline/segments/common/wthr.py | 235 +++++ powerline-bin/powerline/segments/i3wm.py | 155 +++ powerline-bin/powerline/segments/ipython.py | 9 + powerline-bin/powerline/segments/pdb.py | 61 ++ powerline-bin/powerline/segments/shell.py | 174 +++ powerline-bin/powerline/segments/tmux.py | 22 + .../powerline/segments/vim/__init__.py | 793 ++++++++++++++ .../vim/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31035 bytes .../powerline/segments/vim/plugin/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 397 bytes .../plugin/__pycache__/ale.cpython-312.pyc | Bin 0 -> 2219 bytes .../__pycache__/capslock.cpython-312.pyc | Bin 0 -> 1220 bytes .../__pycache__/commandt.cpython-312.pyc | Bin 0 -> 3330 bytes .../__pycache__/nerdtree.cpython-312.pyc | Bin 0 -> 1061 bytes .../__pycache__/syntastic.cpython-312.pyc | Bin 0 -> 2006 bytes .../plugin/__pycache__/tagbar.cpython-312.pyc | Bin 0 -> 1931 bytes .../powerline/segments/vim/plugin/ale.py | 52 + .../powerline/segments/vim/plugin/capslock.py | 30 + .../powerline/segments/vim/plugin/commandt.py | 97 ++ .../powerline/segments/vim/plugin/nerdtree.py | 25 + .../segments/vim/plugin/syntastic.py | 43 + .../powerline/segments/vim/plugin/tagbar.py | 51 + powerline-bin/powerline/selectors/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 164 bytes .../selectors/__pycache__/vim.cpython-312.pyc | Bin 0 -> 593 bytes powerline-bin/powerline/selectors/vim.py | 10 + powerline-bin/powerline/shell.py | 38 + powerline-bin/powerline/theme.py | 182 ++++ powerline-bin/powerline/vim.py | 347 ++++++ .../powerline_status-2.7.dist-info/INSTALLER | 1 + .../powerline_status-2.7.dist-info/METADATA | 123 +++ .../powerline_status-2.7.dist-info/RECORD | 341 ++++++ .../powerline_status-2.7.dist-info/REQUESTED | 0 .../powerline_status-2.7.dist-info/WHEEL | 5 + .../top_level.txt | 1 + tmux-powerline/config.sh | 0 tmux-powerline/themes/tablet.sh | 0 tmux.conf.not | 0 tmux/tmux.conf | 0 355 files changed, 22593 insertions(+) mode change 100755 => 100644 .aliases.ps1 mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .gitmodules mode change 100755 => 100644 .poshrc.ps1 mode change 100755 => 100644 .psrc.ps1 mode change 100755 => 100644 .tmux/.tmux-powerlinerc mode change 100755 => 100644 htop/htoprc mode change 100755 => 100644 micro/buffers/history mode change 100755 => 100644 micro/settings.json mode change 100755 => 100644 neofetch/config.conf create mode 100644 powerline-bin/bin/powerline create mode 100644 powerline-bin/bin/powerline-config create mode 100644 powerline-bin/bin/powerline-daemon create mode 100644 powerline-bin/bin/powerline-lint create mode 100644 powerline-bin/bin/powerline-render create mode 100644 powerline-bin/powerline/__init__.py create mode 100644 powerline-bin/powerline/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/colorscheme.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/config.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/ipython.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/lemonbar.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/pdb.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/renderer.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/segment.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/shell.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/theme.cpython-312.pyc create mode 100644 powerline-bin/powerline/__pycache__/vim.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/__init__.py create mode 100644 powerline-bin/powerline/bindings/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/__pycache__/config.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/awesome/__pycache__/powerline-awesome.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/awesome/powerline-awesome.py create mode 100644 powerline-bin/powerline/bindings/awesome/powerline.lua create mode 100644 powerline-bin/powerline/bindings/bar/__pycache__/powerline-bar.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/bar/powerline-bar.py create mode 100644 powerline-bin/powerline/bindings/bash/powerline.sh create mode 100644 powerline-bin/powerline/bindings/config.py create mode 100644 powerline-bin/powerline/bindings/fish/powerline-setup.fish create mode 100644 powerline-bin/powerline/bindings/i3/__pycache__/powerline-i3.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/i3/powerline-i3.py create mode 100644 powerline-bin/powerline/bindings/ipython/__init__.py create mode 100644 powerline-bin/powerline/bindings/ipython/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/ipython/__pycache__/post_0_11.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/ipython/__pycache__/pre_0_11.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/ipython/__pycache__/since_5.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/ipython/post_0_11.py create mode 100644 powerline-bin/powerline/bindings/ipython/pre_0_11.py create mode 100644 powerline-bin/powerline/bindings/ipython/since_5.py create mode 100644 powerline-bin/powerline/bindings/lemonbar/__pycache__/powerline-lemonbar.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/lemonbar/powerline-lemonbar.py create mode 100644 powerline-bin/powerline/bindings/pdb/__init__.py create mode 100644 powerline-bin/powerline/bindings/pdb/__main__.py create mode 100644 powerline-bin/powerline/bindings/pdb/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/pdb/__pycache__/__main__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/qtile/__init__.py create mode 100644 powerline-bin/powerline/bindings/qtile/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/qtile/__pycache__/widget.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/qtile/widget.py create mode 100644 powerline-bin/powerline/bindings/rc/powerline.rc create mode 100644 powerline-bin/powerline/bindings/shell/powerline.sh create mode 100644 powerline-bin/powerline/bindings/tcsh/powerline.tcsh create mode 100644 powerline-bin/powerline/bindings/tmux/__init__.py create mode 100644 powerline-bin/powerline/bindings/tmux/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/tmux/powerline-base.conf create mode 100644 powerline-bin/powerline/bindings/tmux/powerline.conf create mode 100644 powerline-bin/powerline/bindings/tmux/powerline_tmux_1.7_plus.conf create mode 100644 powerline-bin/powerline/bindings/tmux/powerline_tmux_1.8.conf create mode 100644 powerline-bin/powerline/bindings/tmux/powerline_tmux_1.8_minus.conf create mode 100644 powerline-bin/powerline/bindings/tmux/powerline_tmux_1.8_plus.conf create mode 100644 powerline-bin/powerline/bindings/tmux/powerline_tmux_1.9_plus.conf create mode 100644 powerline-bin/powerline/bindings/tmux/powerline_tmux_2.1_plus.conf create mode 100644 powerline-bin/powerline/bindings/vim/__init__.py create mode 100644 powerline-bin/powerline/bindings/vim/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/vim/autoload/powerline/debug.vim create mode 100644 powerline-bin/powerline/bindings/vim/plugin/powerline.vim create mode 100644 powerline-bin/powerline/bindings/wm/__init__.py create mode 100644 powerline-bin/powerline/bindings/wm/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/wm/__pycache__/awesome.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/wm/awesome.py create mode 100644 powerline-bin/powerline/bindings/zsh/__init__.py create mode 100644 powerline-bin/powerline/bindings/zsh/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/bindings/zsh/powerline.zsh create mode 100644 powerline-bin/powerline/colorscheme.py create mode 100644 powerline-bin/powerline/commands/__init__.py create mode 100644 powerline-bin/powerline/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/commands/__pycache__/config.cpython-312.pyc create mode 100644 powerline-bin/powerline/commands/__pycache__/daemon.cpython-312.pyc create mode 100644 powerline-bin/powerline/commands/__pycache__/lemonbar.cpython-312.pyc create mode 100644 powerline-bin/powerline/commands/__pycache__/lint.cpython-312.pyc create mode 100644 powerline-bin/powerline/commands/__pycache__/main.cpython-312.pyc create mode 100644 powerline-bin/powerline/commands/config.py create mode 100644 powerline-bin/powerline/commands/daemon.py create mode 100644 powerline-bin/powerline/commands/lemonbar.py create mode 100644 powerline-bin/powerline/commands/lint.py create mode 100644 powerline-bin/powerline/commands/main.py create mode 100644 powerline-bin/powerline/config.py create mode 100644 powerline-bin/powerline/config_files/colors.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/default.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/ipython/__main__.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/pdb/__main__.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/pdb/default.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/pdb/solarized.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/shell/__main__.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/shell/default.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/shell/solarized.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/solarized.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/tmux/default.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/tmux/solarized.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/vim/__main__.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/vim/default.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/vim/solarized.json create mode 100644 powerline-bin/powerline/config_files/colorschemes/vim/solarizedlight.json create mode 100644 powerline-bin/powerline/config_files/config.json create mode 100644 powerline-bin/powerline/config_files/themes/ascii.json create mode 100644 powerline-bin/powerline/config_files/themes/ipython/in.json create mode 100644 powerline-bin/powerline/config_files/themes/ipython/in2.json create mode 100644 powerline-bin/powerline/config_files/themes/ipython/out.json create mode 100644 powerline-bin/powerline/config_files/themes/ipython/rewrite.json create mode 100644 powerline-bin/powerline/config_files/themes/pdb/default.json create mode 100644 powerline-bin/powerline/config_files/themes/powerline.json create mode 100644 powerline-bin/powerline/config_files/themes/powerline_terminus.json create mode 100644 powerline-bin/powerline/config_files/themes/powerline_unicode7.json create mode 100644 powerline-bin/powerline/config_files/themes/shell/__main__.json create mode 100644 powerline-bin/powerline/config_files/themes/shell/continuation.json create mode 100644 powerline-bin/powerline/config_files/themes/shell/default.json create mode 100644 powerline-bin/powerline/config_files/themes/shell/default_leftonly.json create mode 100644 powerline-bin/powerline/config_files/themes/shell/select.json create mode 100644 powerline-bin/powerline/config_files/themes/tmux/default.json create mode 100644 powerline-bin/powerline/config_files/themes/unicode.json create mode 100644 powerline-bin/powerline/config_files/themes/unicode_terminus.json create mode 100644 powerline-bin/powerline/config_files/themes/unicode_terminus_condensed.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/__main__.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/cmdwin.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/default.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/help.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/plugin_commandt.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/plugin_gundo-preview.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/plugin_gundo.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/plugin_nerdtree.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/quickfix.json create mode 100644 powerline-bin/powerline/config_files/themes/vim/tabline.json create mode 100644 powerline-bin/powerline/config_files/themes/wm/default.json create mode 100644 powerline-bin/powerline/dist/systemd/powerline-daemon.service create mode 100644 powerline-bin/powerline/ipython.py create mode 100644 powerline-bin/powerline/lemonbar.py create mode 100644 powerline-bin/powerline/lib/__init__.py create mode 100644 powerline-bin/powerline/lib/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/config.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/debug.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/dict.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/encoding.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/humanize_bytes.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/inotify.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/memoize.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/monotonic.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/overrides.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/path.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/shell.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/threaded.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/unicode.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/__pycache__/url.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/config.py create mode 100644 powerline-bin/powerline/lib/debug.py create mode 100644 powerline-bin/powerline/lib/dict.py create mode 100644 powerline-bin/powerline/lib/encoding.py create mode 100644 powerline-bin/powerline/lib/humanize_bytes.py create mode 100644 powerline-bin/powerline/lib/inotify.py create mode 100644 powerline-bin/powerline/lib/memoize.py create mode 100644 powerline-bin/powerline/lib/monotonic.py create mode 100644 powerline-bin/powerline/lib/overrides.py create mode 100644 powerline-bin/powerline/lib/path.py create mode 100644 powerline-bin/powerline/lib/shell.py create mode 100644 powerline-bin/powerline/lib/threaded.py create mode 100644 powerline-bin/powerline/lib/unicode.py create mode 100644 powerline-bin/powerline/lib/url.py create mode 100644 powerline-bin/powerline/lib/vcs/__init__.py create mode 100644 powerline-bin/powerline/lib/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/vcs/__pycache__/bzr.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/vcs/__pycache__/git.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/vcs/bzr.py create mode 100644 powerline-bin/powerline/lib/vcs/git.py create mode 100644 powerline-bin/powerline/lib/vcs/mercurial.py create mode 100644 powerline-bin/powerline/lib/watcher/__init__.py create mode 100644 powerline-bin/powerline/lib/watcher/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/watcher/__pycache__/inotify.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/watcher/__pycache__/stat.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/watcher/__pycache__/tree.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/watcher/__pycache__/uv.cpython-312.pyc create mode 100644 powerline-bin/powerline/lib/watcher/inotify.py create mode 100644 powerline-bin/powerline/lib/watcher/stat.py create mode 100644 powerline-bin/powerline/lib/watcher/tree.py create mode 100644 powerline-bin/powerline/lib/watcher/uv.py create mode 100644 powerline-bin/powerline/lint/__init__.py create mode 100644 powerline-bin/powerline/lint/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/__pycache__/checks.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/__pycache__/context.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/__pycache__/imp.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/__pycache__/inspect.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/__pycache__/selfcheck.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/__pycache__/spec.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/checks.py create mode 100644 powerline-bin/powerline/lint/context.py create mode 100644 powerline-bin/powerline/lint/imp.py create mode 100644 powerline-bin/powerline/lint/inspect.py create mode 100644 powerline-bin/powerline/lint/markedjson/__init__.py create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/composer.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/constructor.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/error.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/events.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/loader.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/markedvalue.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/nodes.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/parser.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/reader.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/resolver.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/scanner.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/__pycache__/tokens.cpython-312.pyc create mode 100644 powerline-bin/powerline/lint/markedjson/composer.py create mode 100644 powerline-bin/powerline/lint/markedjson/constructor.py create mode 100644 powerline-bin/powerline/lint/markedjson/error.py create mode 100644 powerline-bin/powerline/lint/markedjson/events.py create mode 100644 powerline-bin/powerline/lint/markedjson/loader.py create mode 100644 powerline-bin/powerline/lint/markedjson/markedvalue.py create mode 100644 powerline-bin/powerline/lint/markedjson/nodes.py create mode 100644 powerline-bin/powerline/lint/markedjson/parser.py create mode 100644 powerline-bin/powerline/lint/markedjson/reader.py create mode 100644 powerline-bin/powerline/lint/markedjson/resolver.py create mode 100644 powerline-bin/powerline/lint/markedjson/scanner.py create mode 100644 powerline-bin/powerline/lint/markedjson/tokens.py create mode 100644 powerline-bin/powerline/lint/selfcheck.py create mode 100644 powerline-bin/powerline/lint/spec.py create mode 100644 powerline-bin/powerline/listers/__init__.py create mode 100644 powerline-bin/powerline/listers/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/listers/__pycache__/i3wm.cpython-312.pyc create mode 100644 powerline-bin/powerline/listers/__pycache__/pdb.cpython-312.pyc create mode 100644 powerline-bin/powerline/listers/__pycache__/vim.cpython-312.pyc create mode 100644 powerline-bin/powerline/listers/i3wm.py create mode 100644 powerline-bin/powerline/listers/pdb.py create mode 100644 powerline-bin/powerline/listers/vim.py create mode 100644 powerline-bin/powerline/matchers/__init__.py create mode 100644 powerline-bin/powerline/matchers/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/matchers/vim/__init__.py create mode 100644 powerline-bin/powerline/matchers/vim/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/matchers/vim/plugin/__init__.py create mode 100644 powerline-bin/powerline/matchers/vim/plugin/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/matchers/vim/plugin/__pycache__/commandt.cpython-312.pyc create mode 100644 powerline-bin/powerline/matchers/vim/plugin/__pycache__/gundo.cpython-312.pyc create mode 100644 powerline-bin/powerline/matchers/vim/plugin/__pycache__/nerdtree.cpython-312.pyc create mode 100644 powerline-bin/powerline/matchers/vim/plugin/commandt.py create mode 100644 powerline-bin/powerline/matchers/vim/plugin/gundo.py create mode 100644 powerline-bin/powerline/matchers/vim/plugin/nerdtree.py create mode 100644 powerline-bin/powerline/pdb.py create mode 100644 powerline-bin/powerline/renderer.py create mode 100644 powerline-bin/powerline/renderers/__init__.py create mode 100644 powerline-bin/powerline/renderers/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/__pycache__/i3bar.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/__pycache__/lemonbar.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/__pycache__/pango_markup.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/__pycache__/pdb.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/__pycache__/tmux.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/__pycache__/vim.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/i3bar.py create mode 100644 powerline-bin/powerline/renderers/ipython/__init__.py create mode 100644 powerline-bin/powerline/renderers/ipython/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/ipython/__pycache__/pre_5.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/ipython/__pycache__/since_5.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/ipython/pre_5.py create mode 100644 powerline-bin/powerline/renderers/ipython/since_5.py create mode 100644 powerline-bin/powerline/renderers/lemonbar.py create mode 100644 powerline-bin/powerline/renderers/pango_markup.py create mode 100644 powerline-bin/powerline/renderers/pdb.py create mode 100644 powerline-bin/powerline/renderers/shell/__init__.py create mode 100644 powerline-bin/powerline/renderers/shell/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/shell/__pycache__/bash.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/shell/__pycache__/ksh.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/shell/__pycache__/rcsh.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/shell/__pycache__/readline.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/shell/__pycache__/tcsh.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/shell/__pycache__/zsh.cpython-312.pyc create mode 100644 powerline-bin/powerline/renderers/shell/bash.py create mode 100644 powerline-bin/powerline/renderers/shell/ksh.py create mode 100644 powerline-bin/powerline/renderers/shell/rcsh.py create mode 100644 powerline-bin/powerline/renderers/shell/readline.py create mode 100644 powerline-bin/powerline/renderers/shell/tcsh.py create mode 100644 powerline-bin/powerline/renderers/shell/zsh.py create mode 100644 powerline-bin/powerline/renderers/tmux.py create mode 100644 powerline-bin/powerline/renderers/vim.py create mode 100644 powerline-bin/powerline/segment.py create mode 100644 powerline-bin/powerline/segments/__init__.py create mode 100644 powerline-bin/powerline/segments/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/__pycache__/i3wm.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/__pycache__/ipython.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/__pycache__/pdb.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/__pycache__/shell.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/__pycache__/tmux.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__init__.py create mode 100644 powerline-bin/powerline/segments/common/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/bat.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/env.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/mail.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/net.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/players.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/sys.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/time.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/vcs.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/__pycache__/wthr.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/common/bat.py create mode 100644 powerline-bin/powerline/segments/common/env.py create mode 100644 powerline-bin/powerline/segments/common/mail.py create mode 100644 powerline-bin/powerline/segments/common/net.py create mode 100644 powerline-bin/powerline/segments/common/players.py create mode 100644 powerline-bin/powerline/segments/common/sys.py create mode 100644 powerline-bin/powerline/segments/common/time.py create mode 100644 powerline-bin/powerline/segments/common/vcs.py create mode 100644 powerline-bin/powerline/segments/common/wthr.py create mode 100644 powerline-bin/powerline/segments/i3wm.py create mode 100644 powerline-bin/powerline/segments/ipython.py create mode 100644 powerline-bin/powerline/segments/pdb.py create mode 100644 powerline-bin/powerline/segments/shell.py create mode 100644 powerline-bin/powerline/segments/tmux.py create mode 100644 powerline-bin/powerline/segments/vim/__init__.py create mode 100644 powerline-bin/powerline/segments/vim/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/__init__.py create mode 100644 powerline-bin/powerline/segments/vim/plugin/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/__pycache__/ale.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/__pycache__/capslock.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/__pycache__/commandt.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/__pycache__/nerdtree.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/__pycache__/syntastic.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/__pycache__/tagbar.cpython-312.pyc create mode 100644 powerline-bin/powerline/segments/vim/plugin/ale.py create mode 100644 powerline-bin/powerline/segments/vim/plugin/capslock.py create mode 100644 powerline-bin/powerline/segments/vim/plugin/commandt.py create mode 100644 powerline-bin/powerline/segments/vim/plugin/nerdtree.py create mode 100644 powerline-bin/powerline/segments/vim/plugin/syntastic.py create mode 100644 powerline-bin/powerline/segments/vim/plugin/tagbar.py create mode 100644 powerline-bin/powerline/selectors/__init__.py create mode 100644 powerline-bin/powerline/selectors/__pycache__/__init__.cpython-312.pyc create mode 100644 powerline-bin/powerline/selectors/__pycache__/vim.cpython-312.pyc create mode 100644 powerline-bin/powerline/selectors/vim.py create mode 100644 powerline-bin/powerline/shell.py create mode 100644 powerline-bin/powerline/theme.py create mode 100644 powerline-bin/powerline/vim.py create mode 100644 powerline-bin/powerline_status-2.7.dist-info/INSTALLER create mode 100644 powerline-bin/powerline_status-2.7.dist-info/METADATA create mode 100644 powerline-bin/powerline_status-2.7.dist-info/RECORD create mode 100644 powerline-bin/powerline_status-2.7.dist-info/REQUESTED create mode 100644 powerline-bin/powerline_status-2.7.dist-info/WHEEL create mode 100644 powerline-bin/powerline_status-2.7.dist-info/top_level.txt mode change 100755 => 100644 tmux-powerline/config.sh mode change 100755 => 100644 tmux-powerline/themes/tablet.sh mode change 100755 => 100644 tmux.conf.not mode change 100755 => 100644 tmux/tmux.conf diff --git a/.aliases.ps1 b/.aliases.ps1 old mode 100755 new mode 100644 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.gitmodules b/.gitmodules old mode 100755 new mode 100644 diff --git a/.poshrc.ps1 b/.poshrc.ps1 old mode 100755 new mode 100644 diff --git a/.psrc.ps1 b/.psrc.ps1 old mode 100755 new mode 100644 diff --git a/.tmux/.tmux-powerlinerc b/.tmux/.tmux-powerlinerc old mode 100755 new mode 100644 diff --git a/htop/htoprc b/htop/htoprc old mode 100755 new mode 100644 diff --git a/micro/buffers/history b/micro/buffers/history old mode 100755 new mode 100644 diff --git a/micro/settings.json b/micro/settings.json old mode 100755 new mode 100644 diff --git a/neofetch/config.conf b/neofetch/config.conf old mode 100755 new mode 100644 diff --git a/powerline-bin/bin/powerline b/powerline-bin/bin/powerline new file mode 100644 index 0000000000000000000000000000000000000000..2c519bee3964d8073ad4e5b2a3a309e69329d281 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/bin/powerline-config b/powerline-bin/bin/powerline-config new file mode 100644 index 0000000..b37517f --- /dev/null +++ b/powerline-bin/bin/powerline-config @@ -0,0 +1,22 @@ +#!/opt/python/bin/python3 +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +try: + from powerline.commands.config import get_argparser +except ImportError: + import sys + import os + sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(os.path.realpath(__file__))))) + from powerline.commands.config import get_argparser + +import powerline.bindings.config as config + + +if __name__ == '__main__': + parser = get_argparser() + args = parser.parse_args() + + pl = config.create_powerline_logger(args) + + args.function(pl, args) diff --git a/powerline-bin/bin/powerline-daemon b/powerline-bin/bin/powerline-daemon new file mode 100644 index 0000000..620b671 --- /dev/null +++ b/powerline-bin/bin/powerline-daemon @@ -0,0 +1,495 @@ +#!/opt/python/bin/python3 +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import socket +import os +import errno +import sys +import fcntl +import atexit +import stat + +from argparse import ArgumentParser +from select import select +from signal import signal, SIGTERM +from time import sleep +from functools import partial +from io import BytesIO +from threading import Event +from itertools import chain +from logging import StreamHandler + +from powerline.shell import ShellPowerline +from powerline.commands.main import finish_args, write_output +from powerline.lib.monotonic import monotonic +from powerline.lib.encoding import get_preferred_output_encoding, get_preferred_arguments_encoding, get_unicode_writer +from powerline.bindings.wm import wm_threads + +from powerline.commands.main import get_argparser as get_main_argparser +from powerline.commands.daemon import get_argparser as get_daemon_argparser + + +USE_FILESYSTEM = not sys.platform.lower().startswith('linux') + + +class NonInteractiveArgParser(ArgumentParser): + def print_usage(self, file=None): + raise Exception(self.format_usage()) + + def print_help(self, file=None): + raise Exception(self.format_help()) + + def exit(self, status=0, message=None): + pass + + def error(self, message): + raise Exception(self.format_usage()) + + +EOF = b'EOF\0\0' + + +class State(object): + __slots__ = ('powerlines', 'logger', 'config_loader', 'started_wm_threads', + 'ts_shutdown_event') + + def __init__(self, **kwargs): + self.logger = None + self.config_loader = None + self.started_wm_threads = {} + self.powerlines = {} + self.ts_shutdown_event = Event() + + +HOME = os.path.expanduser('~') + + +class NonDaemonShellPowerline(ShellPowerline): + def get_log_handler(self): + return StreamHandler() + + +def start_wm(args, environ, cwd, is_daemon, state): + wm_name = args.ext[0][3:] + if wm_name in state.started_wm_threads: + return b'' + thread_shutdown_event = Event() + thread = wm_threads[wm_name]( + thread_shutdown_event=thread_shutdown_event, + pl_shutdown_event=state.ts_shutdown_event, + pl_config_loader=state.config_loader, + ) + thread.start() + state.started_wm_threads[wm_name] = (thread, thread_shutdown_event) + return b'' + + +def render(args, environ, cwd, is_daemon, state): + segment_info = { + 'getcwd': lambda: cwd, + 'home': environ.get('HOME', HOME), + 'environ': environ, + 'args': args, + } + key = ( + args.ext[0], + args.renderer_module, + tuple(args.config_override) if args.config_override else None, + tuple(args.theme_override) if args.theme_override else None, + tuple(args.config_path) if args.config_path else None, + environ.get('POWERLINE_THEME_OVERRIDES', ''), + environ.get('POWERLINE_CONFIG_OVERRIDES', ''), + environ.get('POWERLINE_CONFIG_PATHS', ''), + ) + + PowerlineClass = ShellPowerline if is_daemon else NonDaemonShellPowerline + powerline = None + try: + powerline = state.powerlines[key] + except KeyError: + try: + powerline = state.powerlines[key] = PowerlineClass( + args, + logger=state.logger, + config_loader=state.config_loader, + run_once=False, + shutdown_event=state.ts_shutdown_event, + ) + if state.logger is None: + state.logger = powerline.logger + if state.config_loader is None: + state.config_loader = powerline.config_loader + except SystemExit: + # Somebody thought raising system exit was a good idea, + return '' + except Exception as e: + if powerline: + powerline.pl.exception('Failed to render {0}: {1}', str(key), str(e)) + else: + return 'Failed to render {0}: {1}'.format(str(key), str(e)) + s = BytesIO() + write_output(args, powerline, segment_info, get_unicode_writer(stream=s)) + s.seek(0) + return s.read() + + +def eintr_retry_call(func, *args, **kwargs): + while True: + try: + return func(*args, **kwargs) + except EnvironmentError as e: + if getattr(e, 'errno', None) == errno.EINTR: + continue + raise + + +def do_read(conn, timeout=2.0): + ''' Read data from the client. If the client fails to send data within + timeout seconds, abort. ''' + read = [] + end_time = monotonic() + timeout + while not read or not read[-1].endswith(b'\0\0'): + r, w, e = select((conn,), (), (conn,), timeout) + if e: + return + if monotonic() > end_time: + return + if not r: + continue + x = eintr_retry_call(conn.recv, 4096) + if x: + read.append(x) + else: + break + return b''.join(read) + + +def do_write(conn, result): + try: + eintr_retry_call(conn.sendall, result) + except Exception: + pass + + +def safe_bytes(o, encoding=get_preferred_output_encoding()): + '''Return bytes instance without ever throwing an exception.''' + try: + try: + # We are assuming that o is a unicode object + return o.encode(encoding, 'replace') + except Exception: + # Object may have defined __bytes__ (python 3) or __str__ method + # (python 2) + # This also catches problem with non_ascii_bytes.encode('utf-8') + # that first tries to decode to UTF-8 using ascii codec (and fails + # in this case) and then encode to given encoding: errors= argument + # is not used in the first stage. + return bytes(o) + except Exception as e: + return safe_bytes(str(e), encoding) + + +def parse_args(req, parser, encoding=get_preferred_arguments_encoding()): + args = [x.decode(encoding) for x in req.split(b'\0') if x] + numargs = int(args[0], 16) + shell_args = parser.parse_args(args[1:numargs + 1]) + cwd = args[numargs + 1] + environ = dict(((k, v) for k, v in (x.partition('=')[0::2] for x in args[numargs + 2:]))) + cwd = cwd or environ.get('PWD', '/') + return shell_args, environ, cwd + + +def get_answer(req, is_daemon, argparser, state): + try: + args, environ, cwd = parse_args(req, argparser) + finish_args(argparser, environ, args, is_daemon=True) + if args.ext[0].startswith('wm.'): + return safe_bytes(start_wm(args, environ, cwd, is_daemon, state)) + else: + return safe_bytes(render(args, environ, cwd, is_daemon, state)) + except Exception as e: + return safe_bytes(str(e)) + + +def do_one(sock, read_sockets, write_sockets, result_map, is_daemon, argparser, + state): + r, w, e = select( + tuple(read_sockets) + (sock,), + tuple(write_sockets), + tuple(read_sockets) + tuple(write_sockets) + (sock,), + 60.0 + ) + + if sock in e: + # We cannot accept any more connections, so we exit + raise SystemExit(1) + + for s in e: + # Discard all broken connections to clients + s.close() + read_sockets.discard(s) + write_sockets.discard(s) + + for s in r: + if s == sock: + # A client wants to connect + conn, _ = eintr_retry_call(sock.accept) + read_sockets.add(conn) + else: + # A client has sent some data + read_sockets.discard(s) + req = do_read(s) + if req == EOF: + raise SystemExit(0) + elif req: + ans = get_answer(req, is_daemon, argparser, state) + result_map[s] = ans + write_sockets.add(s) + else: + s.close() + + for s in w: + # A client is ready to receive the result + write_sockets.discard(s) + result = result_map.pop(s) + try: + do_write(s, result) + finally: + s.close() + + +def shutdown(sock, read_sockets, write_sockets, state): + '''Perform operations necessary for nicely shutting down daemon + + Specifically it + + #. Closes all sockets. + #. Notifies segments based on + :py:class:`powerline.lib.threaded.ThreadedSegment` and WM-specific + threads that daemon is shutting down. + #. Waits for threads to finish, but no more then 2 seconds total. + #. Waits so that total execution time of this function is 2 seconds in order + to allow ThreadedSegments to finish. + ''' + total_wait_time = 2 + shutdown_start_time = monotonic() + + for s in chain((sock,), read_sockets, write_sockets): + s.close() + + # Notify ThreadedSegments + state.ts_shutdown_event.set() + for thread, shutdown_event in state.started_wm_threads.values(): + shutdown_event.set() + + for thread, shutdown_event in state.started_wm_threads.values(): + wait_time = total_wait_time - (monotonic() - shutdown_start_time) + if wait_time > 0: + thread.join(wait_time) + + wait_time = total_wait_time - (monotonic() - shutdown_start_time) + sleep(wait_time) + + +def main_loop(sock, is_daemon): + sock.listen(128) + sock.setblocking(0) + + read_sockets, write_sockets = set(), set() + result_map = {} + parser = get_main_argparser(NonInteractiveArgParser) + state = State() + try: + try: + while True: + do_one( + sock, read_sockets, write_sockets, result_map, + is_daemon=is_daemon, + argparser=parser, + state=state, + ) + except KeyboardInterrupt: + raise SystemExit(0) + except SystemExit as e: + shutdown(sock, read_sockets, write_sockets, state) + raise e + return 0 + + +def daemonize(stdin=os.devnull, stdout=os.devnull, stderr=os.devnull): + try: + pid = os.fork() + if pid > 0: + # exit first parent + raise SystemExit(0) + except OSError as e: + sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) + raise SystemExit(1) + + # decouple from parent environment + os.chdir("/") + os.setsid() + os.umask(0) + + # do second fork + try: + pid = os.fork() + if pid > 0: + # exit from second parent + raise SystemExit(0) + except OSError as e: + sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) + raise SystemExit(1) + + # Redirect standard file descriptors. + si = open(stdin, 'rb') + so = open(stdout, 'a+b') + se = open(stderr, 'a+b', 0) + os.dup2(si.fileno(), sys.stdin.fileno()) + os.dup2(so.fileno(), sys.stdout.fileno()) + os.dup2(se.fileno(), sys.stderr.fileno()) + return True + + +def check_existing(address): + if USE_FILESYSTEM: + # We cannot bind if the socket file already exists so remove it, we + # already have a lock on pidfile, so this should be safe. + try: + os.unlink(address) + except EnvironmentError: + pass + + sock = socket.socket(family=socket.AF_UNIX) + try: + sock.bind(address) + except socket.error as e: + if getattr(e, 'errno', None) == errno.EADDRINUSE: + return None + raise + return sock + + +def kill_daemon(address): + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + try: + try: + eintr_retry_call(sock.connect, address) + except socket.error: + return False + else: + eintr_retry_call(sock.sendall, EOF) + finally: + sock.close() + return True + + +def cleanup_lockfile(pidfile, fd, *args): + try: + # Remove the directory entry for the lock file + os.unlink(pidfile) + # Close the file descriptor + os.close(fd) + except EnvironmentError: + pass + if args: + # Called in signal handler + raise SystemExit(1) + + +def lockpidfile(pidfile): + fd = os.open( + pidfile, + os.O_WRONLY | os.O_CREAT, + stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH + ) + try: + fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except EnvironmentError: + os.close(fd) + return None + os.lseek(fd, 0, os.SEEK_SET) + os.ftruncate(fd, 0) + os.write(fd, ('%d' % os.getpid()).encode('ascii')) + os.fsync(fd) + cleanup = partial(cleanup_lockfile, pidfile, fd) + signal(SIGTERM, cleanup) + atexit.register(cleanup) + return fd + + +def main(): + parser = get_daemon_argparser() + args = parser.parse_args() + is_daemon = False + address = None + pidfile = None + + if args.socket: + address = args.socket + if not USE_FILESYSTEM: + address = '\0' + address + else: + if USE_FILESYSTEM: + address = '/tmp/powerline-ipc-%d' + else: + # Use the abstract namespace for sockets rather than the filesystem + # (Available only in linux) + address = '\0powerline-ipc-%d' + + address = address % os.getuid() + + if USE_FILESYSTEM: + pidfile = address + '.pid' + + if args.kill: + if args.foreground or args.replace: + parser.error('--kill and --foreground/--replace cannot be used together') + if kill_daemon(address): + if not args.quiet: + print ('Kill command sent to daemon, if it does not die in a couple of seconds use kill to kill it') + raise SystemExit(0) + else: + if not args.quiet: + print ('No running daemon found') + raise SystemExit(1) + + if args.replace: + while kill_daemon(address): + if not args.quiet: + print ('Kill command sent to daemon, waiting for daemon to exit, press Ctrl-C to terminate wait and exit') + sleep(2) + + if USE_FILESYSTEM and not args.foreground: + # We must daemonize before creating the locked pidfile, unfortunately, + # this means further print statements are discarded + is_daemon = daemonize() + + if USE_FILESYSTEM: + # Create a locked pid file containing the daemon’s PID + if lockpidfile(pidfile) is None: + if not args.quiet: + sys.stderr.write( + 'The daemon is already running. Use %s -k to kill it.\n' % ( + os.path.basename(sys.argv[0]))) + raise SystemExit(1) + + # Bind to address or bail if we cannot bind + sock = check_existing(address) + if sock is None: + if not args.quiet: + sys.stderr.write( + 'The daemon is already running. Use %s -k to kill it.\n' % ( + os.path.basename(sys.argv[0]))) + raise SystemExit(1) + + if not USE_FILESYSTEM and not args.foreground: + # We daemonize on linux + is_daemon = daemonize() + + return main_loop(sock, is_daemon) + + +if __name__ == '__main__': + main() diff --git a/powerline-bin/bin/powerline-lint b/powerline-bin/bin/powerline-lint new file mode 100644 index 0000000..b41bf08 --- /dev/null +++ b/powerline-bin/bin/powerline-lint @@ -0,0 +1,13 @@ +#!/opt/python/bin/python3 +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys + +from powerline.lint import check +from powerline.commands.lint import get_argparser + + +if __name__ == '__main__': + args = get_argparser().parse_args() + sys.exit(check(args.config_path, args.debug)) diff --git a/powerline-bin/bin/powerline-render b/powerline-bin/bin/powerline-render new file mode 100644 index 0000000..d154c47 --- /dev/null +++ b/powerline-bin/bin/powerline-render @@ -0,0 +1,31 @@ +#!/opt/python/bin/python3 +# vim:fileencoding=utf-8:noet + +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import os + +try: + from powerline.shell import ShellPowerline +except ImportError: + sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(os.path.realpath(__file__))))) + from powerline.shell import ShellPowerline + +from powerline.commands.main import get_argparser, finish_args, write_output +from powerline.lib.encoding import get_unicode_writer + + +if sys.version_info < (3,): + write = sys.stdout.write +else: + write = sys.stdout.buffer.write + + +if __name__ == '__main__': + parser = get_argparser() + args = parser.parse_args() + finish_args(parser, os.environ, args) + powerline = ShellPowerline(args, run_once=True) + segment_info = {'args': args, 'environ': os.environ} + write_output(args, powerline, segment_info, get_unicode_writer()) diff --git a/powerline-bin/powerline/__init__.py b/powerline-bin/powerline/__init__.py new file mode 100644 index 0000000..7c781d9 --- /dev/null +++ b/powerline-bin/powerline/__init__.py @@ -0,0 +1,991 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import sys +import logging + +from threading import Lock, Event + +from powerline.colorscheme import Colorscheme +from powerline.lib.config import ConfigLoader +from powerline.lib.unicode import unicode, safe_unicode, FailedUnicode +from powerline.config import DEFAULT_SYSTEM_CONFIG_DIR +from powerline.lib.dict import mergedicts +from powerline.lib.encoding import get_preferred_output_encoding +from powerline.lib.path import join + + +class NotInterceptedError(BaseException): + pass + + +def _config_loader_condition(path): + if path and os.path.isfile(path): + return path + return None + + +def _find_config_files(search_paths, config_file, config_loader=None, loader_callback=None): + config_file += '.json' + found = False + for path in search_paths: + config_file_path = join(path, config_file) + if os.path.isfile(config_file_path): + yield config_file_path + found = True + elif config_loader: + config_loader.register_missing(_config_loader_condition, loader_callback, config_file_path) + if not found: + raise IOError('Config file not found in search paths ({0}): {1}'.format( + ', '.join(search_paths), + config_file + )) + + +class PowerlineLogger(object): + '''Proxy class for logging.Logger instance + + It emits messages in format ``{ext}:{prefix}:{message}`` where + + ``{ext}`` + is a used powerline extension (e.g. “vim”, “shell”, “ipython”). + ``{prefix}`` + is a local prefix, usually a segment name. + ``{message}`` + is the original message passed to one of the logging methods. + + Each of the methods (``critical``, ``exception``, ``info``, ``error``, + ``warn``, ``debug``) expects to receive message in an ``str.format`` format, + not in printf-like format. + + Log is saved to the location :ref:`specified by user `. + ''' + + def __init__(self, use_daemon_threads, logger, ext): + self.logger = logger + self.ext = ext + self.use_daemon_threads = use_daemon_threads + self.prefix = '' + self.last_msgs = {} + + def _log(self, attr, msg, *args, **kwargs): + prefix = kwargs.get('prefix') or self.prefix + prefix = self.ext + ((':' + prefix) if prefix else '') + msg = safe_unicode(msg) + if args or kwargs: + args = [safe_unicode(s) if isinstance(s, bytes) else s for s in args] + kwargs = dict(( + (k, safe_unicode(v) if isinstance(v, bytes) else v) + for k, v in kwargs.items() + )) + msg = msg.format(*args, **kwargs) + msg = prefix + ':' + msg + key = attr + ':' + prefix + if msg != self.last_msgs.get(key): + getattr(self.logger, attr)(msg) + self.last_msgs[key] = msg + + def critical(self, msg, *args, **kwargs): + self._log('critical', msg, *args, **kwargs) + + def exception(self, msg, *args, **kwargs): + self._log('exception', msg, *args, **kwargs) + + def info(self, msg, *args, **kwargs): + self._log('info', msg, *args, **kwargs) + + def error(self, msg, *args, **kwargs): + self._log('error', msg, *args, **kwargs) + + def warn(self, msg, *args, **kwargs): + self._log('warning', msg, *args, **kwargs) + + def debug(self, msg, *args, **kwargs): + self._log('debug', msg, *args, **kwargs) + + +_fallback_logger = None + + +def get_fallback_logger(stream=None): + global _fallback_logger + if _fallback_logger: + return _fallback_logger + + log_format = '%(asctime)s:%(levelname)s:%(message)s' + formatter = logging.Formatter(log_format) + + level = logging.WARNING + handler = logging.StreamHandler(stream) + handler.setLevel(level) + handler.setFormatter(formatter) + + logger = logging.Logger('powerline') + logger.setLevel(level) + logger.addHandler(handler) + _fallback_logger = PowerlineLogger(None, logger, '_fallback_') + return _fallback_logger + + +def _generate_change_callback(lock, key, dictionary): + def on_file_change(path): + with lock: + dictionary[key] = True + return on_file_change + + +def get_config_paths(): + '''Get configuration paths from environment variables. + + Uses $XDG_CONFIG_HOME and $XDG_CONFIG_DIRS according to the XDG specification. + + :return: list of paths + ''' + config_home = os.environ.get('XDG_CONFIG_HOME', os.path.join(os.path.expanduser('~'), '.config')) + config_path = join(config_home, 'powerline') + config_paths = [config_path] + config_dirs = os.environ.get('XDG_CONFIG_DIRS', DEFAULT_SYSTEM_CONFIG_DIR) + if config_dirs is not None: + config_paths[:0] = reversed([join(d, 'powerline') for d in config_dirs.split(':')]) + plugin_path = join(os.path.realpath(os.path.dirname(__file__)), 'config_files') + config_paths.insert(0, plugin_path) + return config_paths + + +def generate_config_finder(get_config_paths=get_config_paths): + '''Generate find_config_files function + + This function will find .json file given its path. + + :param function get_config_paths: + Function that being called with no arguments will return a list of paths + that should be searched for configuration files. + + :return: + Function that being given configuration file name will return full path + to it or raise IOError if it failed to find the file. + ''' + config_paths = get_config_paths() + return lambda *args: _find_config_files(config_paths, *args) + + +def load_config(cfg_path, find_config_files, config_loader, loader_callback=None): + '''Load configuration file and setup watches + + Watches are only set up if loader_callback is not None. + + :param str cfg_path: + Path for configuration file that should be loaded. + :param function find_config_files: + Function that finds configuration file. Check out the description of + the return value of ``generate_config_finder`` function. + :param ConfigLoader config_loader: + Configuration file loader class instance. + :param function loader_callback: + Function that will be called by config_loader when change to + configuration file is detected. + + :return: Configuration file contents. + ''' + found_files = find_config_files(cfg_path, config_loader, loader_callback) + ret = None + for path in found_files: + if loader_callback: + config_loader.register(loader_callback, path) + if ret is None: + ret = config_loader.load(path) + else: + mergedicts(ret, config_loader.load(path)) + return ret + + +def _set_log_handlers(common_config, logger, get_module_attr, stream=None): + '''Set log handlers + + :param dict common_config: + Configuration dictionary used to create handler. + :param logging.Logger logger: + Logger to which handlers will be attached. + :param func get_module_attr: + :py:func:`gen_module_attr_getter` output. + :param file stream: + Stream to use by default for :py:class:`logging.StreamHandler` in place + of :py:attr:`sys.stderr`. May be ``None``. + ''' + log_targets = common_config['log_file'] + num_handlers = 0 + for log_target in log_targets: + if log_target is None: + log_target = ['logging.StreamHandler', []] + elif isinstance(log_target, unicode): + log_target = os.path.expanduser(log_target) + log_dir = os.path.dirname(log_target) + if log_dir and not os.path.isdir(log_dir): + os.mkdir(log_dir) + log_target = ['logging.FileHandler', [[log_target]]] + module, handler_class_name = log_target[0].rpartition('.')[::2] + module = module or 'logging.handlers' + try: + handler_class_args = log_target[1][0] + except IndexError: + if module == 'logging' and handler_class_name == 'StreamHandler': + handler_class_args = [stream] + else: + handler_class_args = () + try: + handler_class_kwargs = log_target[1][1] + except IndexError: + handler_class_kwargs = {} + module = str(module) + handler_class_name = str(handler_class_name) + handler_class = get_module_attr(module, handler_class_name) + if not handler_class: + continue + handler = handler_class(*handler_class_args, **handler_class_kwargs) + try: + handler_level_name = log_target[2] + except IndexError: + handler_level_name = common_config['log_level'] + try: + handler_format = log_target[3] + except IndexError: + handler_format = common_config['log_format'] + handler.setLevel(getattr(logging, handler_level_name)) + handler.setFormatter(logging.Formatter(handler_format)) + logger.addHandler(handler) + num_handlers += 1 + if num_handlers == 0 and log_targets: + raise ValueError('Failed to set up any handlers') + + +def create_logger(common_config, use_daemon_threads=True, ext='__unknown__', + import_paths=None, imported_modules=None, stream=None): + '''Create logger according to provided configuration + + :param dict common_config: + Common configuration, from :py:func:`finish_common_config`. + :param bool use_daemon_threads: + Whether daemon threads should be used. Argument to + :py:class:`PowerlineLogger` constructor. + :param str ext: + Used extension. Argument to :py:class:`PowerlineLogger` constructor. + :param set imported_modules: + Set where imported modules are saved. Argument to + :py:func:`gen_module_attr_getter`. May be ``None``, in this case new + empty set is used. + :param file stream: + Stream to use by default for :py:class:`logging.StreamHandler` in place + of :py:attr:`sys.stderr`. May be ``None``. + + :return: Three objects: + + #. :py:class:`logging.Logger` instance. + #. :py:class:`PowerlineLogger` instance. + #. Function, output of :py:func:`gen_module_attr_getter`. + ''' + logger = logging.Logger('powerline') + level = getattr(logging, common_config['log_level']) + logger.setLevel(level) + + pl = PowerlineLogger(use_daemon_threads, logger, ext) + get_module_attr = gen_module_attr_getter( + pl, common_config['paths'], + set() if imported_modules is None else imported_modules) + + _set_log_handlers(common_config, logger, get_module_attr, stream) + + return logger, pl, get_module_attr + + +def get_default_theme(is_unicode=True): + '''Get default theme used by powerline + + :param bool is_unicode: + If true, return theme for unicode environments, otherwise return theme + that is supposed to be ASCII-only. + + :return: theme name. + ''' + return 'powerline_terminus' if is_unicode else 'ascii' + + +def finish_common_config(encoding, common_config): + '''Add default values to common config and expand ~ in paths + + :param dict common_config: + Common configuration, as it was just loaded. + + :return: + Copy of common configuration with all configuration keys and expanded + paths. + ''' + encoding = encoding.lower() + default_top_theme = get_default_theme( + encoding.startswith('utf') or encoding.startswith('ucs')) + + common_config = common_config.copy() + common_config.setdefault('default_top_theme', default_top_theme) + common_config.setdefault('paths', []) + common_config.setdefault('watcher', 'auto') + common_config.setdefault('log_level', 'WARNING') + common_config.setdefault('log_format', '%(asctime)s:%(levelname)s:%(message)s') + common_config.setdefault('term_truecolor', False) + common_config.setdefault('term_escape_style', 'auto') + common_config.setdefault('ambiwidth', 1) + common_config.setdefault('additional_escapes', None) + common_config.setdefault('reload_config', True) + common_config.setdefault('interval', None) + common_config.setdefault('log_file', [None]) + + if not isinstance(common_config['log_file'], list): + common_config['log_file'] = [common_config['log_file']] + + common_config['paths'] = [ + os.path.expanduser(path) for path in common_config['paths'] + ] + + return common_config + + +if sys.version_info < (3,): + # `raise exception[0], None, exception[1]` is a SyntaxError in python-3* + # Not using ('''…''') because this syntax does not work in python-2.6 + exec(( + 'def reraise(exception):\n' + ' if type(exception) is tuple:\n' + ' raise exception[0], None, exception[1]\n' + ' else:\n' + ' raise exception\n' + )) +else: + def reraise(exception): + if type(exception) is tuple: + raise exception[0].with_traceback(exception[1]) + else: + raise exception + + +def gen_module_attr_getter(pl, import_paths, imported_modules): + def get_module_attr(module, attr, prefix='powerline'): + '''Import module and get its attribute. + + Replaces ``from {module} import {attr}``. + + :param str module: + Module name, will be passed as first argument to ``__import__``. + :param str attr: + Module attribute, will be passed to ``__import__`` as the only value + in ``fromlist`` tuple. + + :return: + Attribute value or ``None``. Note: there is no way to distinguish + between successfull import of attribute equal to ``None`` and + unsuccessfull import. + ''' + oldpath = sys.path + sys.path = import_paths + sys.path + module = str(module) + attr = str(attr) + try: + imported_modules.add(module) + return getattr(__import__(module, fromlist=(attr,)), attr) + except Exception as e: + pl.exception('Failed to import attr {0} from module {1}: {2}', attr, module, str(e), prefix=prefix) + return None + finally: + sys.path = oldpath + + return get_module_attr + + +LOG_KEYS = set(('log_format', 'log_level', 'log_file', 'paths')) +'''List of keys related to logging +''' + + +def _get_log_keys(common_config): + '''Return a common configuration copy with only log-related config left + + :param dict common_config: + Common configuration. + + :return: + :py:class:`dict` instance which has only keys from + :py:attr:`powerline.LOG_KEYS` left. + ''' + return dict(( + (k, v) for k, v in common_config.items() if k in LOG_KEYS + )) + + +DEFAULT_UPDATE_INTERVAL = 2 +'''Default value for :ref:`update_interval ` +''' + + +class Powerline(object): + '''Main powerline class, entrance point for all powerline uses. Sets + powerline up and loads the configuration. + + :param str ext: + extension used. Determines where configuration files will + searched and what renderer module will be used. Affected: used ``ext`` + dictionary from :file:`powerline/config.json`, location of themes and + colorschemes, render module (``powerline.renders.{ext}``). + :param str renderer_module: + Overrides renderer module (defaults to ``ext``). Should be the name of + the package imported like this: ``powerline.renderers.{render_module}``. + If this parameter contains a dot ``powerline.renderers.`` is not + prepended. There is also a special case for renderers defined in + toplevel modules: ``foo.`` (note: dot at the end) tries to get renderer + from module ``foo`` (because ``foo`` (without dot) tries to get renderer + from module ``powerline.renderers.foo``). When ``.foo`` (with leading + dot) variant is used ``renderer_module`` will be + ``powerline.renderers.{ext}{renderer_module}``. + :param bool run_once: + Determines whether :py:meth:`render` method will be run only once + during python session. + :param Logger logger: + If present no new logger will be created and the provided logger will be + used. + :param bool use_daemon_threads: + When creating threads make them daemon ones. + :param Event shutdown_event: + Use this Event as shutdown_event instead of creating new event. + :param ConfigLoader config_loader: + Instance of the class that manages (re)loading of the configuration. + ''' + + def __init__(self, *args, **kwargs): + self.init_args = (args, kwargs) + self.init(*args, **kwargs) + + def init(self, + ext, + renderer_module=None, + run_once=False, + logger=None, + use_daemon_threads=True, + shutdown_event=None, + config_loader=None): + '''Do actual initialization. + + __init__ function only stores the arguments and runs this function. This + function exists for powerline to be able to reload itself: it is easier + to make ``__init__`` store arguments and call overriddable ``init`` than + tell developers that each time they override Powerline.__init__ in + subclasses they must store actual arguments. + ''' + self.ext = ext + self.run_once = run_once + self.logger = logger + self.had_logger = bool(self.logger) + self.use_daemon_threads = use_daemon_threads + + if not renderer_module: + self.renderer_module = 'powerline.renderers.' + ext + elif '.' not in renderer_module: + self.renderer_module = 'powerline.renderers.' + renderer_module + elif renderer_module.startswith('.'): + self.renderer_module = 'powerline.renderers.' + ext + renderer_module + elif renderer_module.endswith('.'): + self.renderer_module = renderer_module[:-1] + else: + self.renderer_module = renderer_module + + self.find_config_files = generate_config_finder(self.get_config_paths) + + self.cr_kwargs_lock = Lock() + self.cr_kwargs = {} + self.cr_callbacks = {} + for key in ('main', 'colors', 'colorscheme', 'theme'): + self.cr_kwargs['load_' + key] = True + self.cr_callbacks[key] = _generate_change_callback( + self.cr_kwargs_lock, + 'load_' + key, + self.cr_kwargs + ) + + self.shutdown_event = shutdown_event or Event() + self.config_loader = config_loader or ConfigLoader(shutdown_event=self.shutdown_event, run_once=run_once) + self.run_loader_update = False + + self.renderer_options = {} + + self.prev_common_config = None + self.prev_ext_config = None + self.pl = None + self.setup_args = () + self.setup_kwargs = {} + self.imported_modules = set() + self.update_interval = DEFAULT_UPDATE_INTERVAL + + get_encoding = staticmethod(get_preferred_output_encoding) + '''Get encoding used by the current application + + Usually returns encoding of the current locale. + ''' + + def create_logger(self): + '''Create logger + + This function is used to create logger unless it was already specified + at initialization. + + :return: Three objects: + + #. :py:class:`logging.Logger` instance. + #. :py:class:`PowerlineLogger` instance. + #. Function, output of :py:func:`gen_module_attr_getter`. + ''' + return create_logger( + common_config=self.common_config, + use_daemon_threads=self.use_daemon_threads, + ext=self.ext, + imported_modules=self.imported_modules, + stream=self.default_log_stream, + ) + + def create_renderer(self, load_main=False, load_colors=False, load_colorscheme=False, load_theme=False): + '''(Re)create renderer object. Can be used after Powerline object was + successfully initialized. If any of the below parameters except + ``load_main`` is True renderer object will be recreated. + + :param bool load_main: + Determines whether main configuration file (:file:`config.json`) + should be loaded. If appropriate configuration changes implies + ``load_colorscheme`` and ``load_theme`` and recreation of renderer + object. Won’t trigger recreation if only unrelated configuration + changed. + :param bool load_colors: + Determines whether colors configuration from :file:`colors.json` + should be (re)loaded. + :param bool load_colorscheme: + Determines whether colorscheme configuration should be (re)loaded. + :param bool load_theme: + Determines whether theme configuration should be reloaded. + ''' + common_config_differs = False + ext_config_differs = False + if load_main: + self._purge_configs('main') + config = self.load_main_config() + self.common_config = finish_common_config(self.get_encoding(), config['common']) + if self.common_config != self.prev_common_config: + common_config_differs = True + + load_theme = (load_theme + or not self.prev_common_config + or self.prev_common_config['default_top_theme'] != self.common_config['default_top_theme']) + + log_keys_differ = (not self.prev_common_config or ( + _get_log_keys(self.prev_common_config) != _get_log_keys(self.common_config) + )) + + self.prev_common_config = self.common_config + + if log_keys_differ: + if self.had_logger: + self.pl = PowerlineLogger(self.use_daemon_threads, self.logger, self.ext) + self.get_module_attr = gen_module_attr_getter( + self.pl, self.common_config['paths'], self.imported_modules) + else: + self.logger, self.pl, self.get_module_attr = self.create_logger() + self.config_loader.pl = self.pl + + if not self.run_once: + self.config_loader.set_watcher(self.common_config['watcher']) + + mergedicts(self.renderer_options, dict( + pl=self.pl, + term_truecolor=self.common_config['term_truecolor'], + term_escape_style=self.common_config['term_escape_style'], + ambiwidth=self.common_config['ambiwidth'], + tmux_escape=self.common_config['additional_escapes'] == 'tmux', + screen_escape=self.common_config['additional_escapes'] == 'screen', + theme_kwargs={ + 'ext': self.ext, + 'common_config': self.common_config, + 'run_once': self.run_once, + 'shutdown_event': self.shutdown_event, + 'get_module_attr': self.get_module_attr, + }, + )) + + if not self.run_once and self.common_config['reload_config']: + interval = self.common_config['interval'] + self.config_loader.set_interval(interval) + self.run_loader_update = (interval is None) + if interval is not None and not self.config_loader.is_alive(): + self.config_loader.start() + + self.ext_config = config['ext'][self.ext] + + top_theme = ( + self.ext_config.get('top_theme') + or self.common_config['default_top_theme'] + ) + self.theme_levels = ( + os.path.join('themes', top_theme), + os.path.join('themes', self.ext, '__main__'), + ) + self.renderer_options['theme_kwargs']['top_theme'] = top_theme + + if self.ext_config != self.prev_ext_config: + ext_config_differs = True + if ( + not self.prev_ext_config + or self.ext_config.get('components') != self.prev_ext_config.get('components') + ): + self.setup_components(self.ext_config.get('components')) + if ( + not self.prev_ext_config + or self.ext_config.get('local_themes') != self.prev_ext_config.get('local_themes') + ): + self.renderer_options['local_themes'] = self.get_local_themes(self.ext_config.get('local_themes')) + self.update_interval = self.ext_config.get('update_interval', 2) + load_colorscheme = ( + load_colorscheme + or not self.prev_ext_config + or self.prev_ext_config['colorscheme'] != self.ext_config['colorscheme'] + ) + load_theme = ( + load_theme + or not self.prev_ext_config + or self.prev_ext_config['theme'] != self.ext_config['theme'] + ) + self.prev_ext_config = self.ext_config + + create_renderer = load_colors or load_colorscheme or load_theme or common_config_differs or ext_config_differs + + if load_colors: + self._purge_configs('colors') + self.colors_config = self.load_colors_config() + + if load_colorscheme or load_colors: + self._purge_configs('colorscheme') + if load_colorscheme: + self.colorscheme_config = self.load_colorscheme_config(self.ext_config['colorscheme']) + self.renderer_options['theme_kwargs']['colorscheme'] = ( + Colorscheme(self.colorscheme_config, self.colors_config)) + + if load_theme: + self._purge_configs('theme') + self.renderer_options['theme_config'] = self.load_theme_config(self.ext_config.get('theme', 'default')) + + if create_renderer: + Renderer = self.get_module_attr(self.renderer_module, 'renderer') + if not Renderer: + if hasattr(self, 'renderer'): + return + else: + raise ImportError('Failed to obtain renderer') + + # Renderer updates configuration file via segments’ .startup thus it + # should be locked to prevent state when configuration was updated, + # but .render still uses old renderer. + try: + renderer = Renderer(**self.renderer_options) + except Exception as e: + self.exception('Failed to construct renderer object: {0}', str(e)) + if not hasattr(self, 'renderer'): + raise + else: + self.renderer = renderer + + default_log_stream = sys.stdout + '''Default stream for default log handler + + Usually it is ``sys.stderr``, but there is sometimes a reason to prefer + ``sys.stdout`` or a custom file-like object. It is not supposed to be used + to write to some file. + ''' + + def setup_components(self, components): + '''Run component-specific setup + + :param set components: + Set of the enabled componets or None. + + Should be overridden by subclasses. + ''' + pass + + @staticmethod + def get_config_paths(): + '''Get configuration paths. + + Should be overridden in subclasses in order to provide a way to override + used paths. + + :return: list of paths + ''' + return get_config_paths() + + def load_config(self, cfg_path, cfg_type): + '''Load configuration and setup watches + + :param str cfg_path: + Path to the configuration file without any powerline configuration + directory or ``.json`` suffix. + :param str cfg_type: + Configuration type. May be one of ``main`` (for ``config.json`` + file), ``colors``, ``colorscheme``, ``theme``. + + :return: dictionary with loaded configuration. + ''' + return load_config( + cfg_path, + self.find_config_files, + self.config_loader, + self.cr_callbacks[cfg_type] + ) + + def _purge_configs(self, cfg_type): + function = self.cr_callbacks[cfg_type] + self.config_loader.unregister_functions(set((function,))) + self.config_loader.unregister_missing(set(((self.find_config_files, function),))) + + def load_main_config(self): + '''Get top-level configuration. + + :return: dictionary with :ref:`top-level configuration `. + ''' + return self.load_config('config', 'main') + + def _load_hierarhical_config(self, cfg_type, levels, ignore_levels): + '''Load and merge multiple configuration files + + :param str cfg_type: + Type of the loaded configuration files (e.g. ``colorscheme``, + ``theme``). + :param list levels: + Configuration names resembling levels in hierarchy, sorted by + priority. Configuration file names with higher priority should go + last. + :param set ignore_levels: + If only files listed in this variable are present then configuration + file is considered not loaded: at least one file on the level not + listed in this variable must be present. + ''' + config = {} + loaded = 0 + exceptions = [] + for i, cfg_path in enumerate(levels): + try: + lvl_config = self.load_config(cfg_path, cfg_type) + except IOError as e: + if sys.version_info < (3,): + tb = sys.exc_info()[2] + exceptions.append((e, tb)) + else: + exceptions.append(e) + else: + if i not in ignore_levels: + loaded += 1 + mergedicts(config, lvl_config) + if not loaded: + for exception in exceptions: + if type(exception) is tuple: + e = exception[0] + else: + e = exception + self.exception('Failed to load %s: {0}' % cfg_type, e, exception=exception) + raise e + return config + + def load_colorscheme_config(self, name): + '''Get colorscheme. + + :param str name: + Name of the colorscheme to load. + + :return: dictionary with :ref:`colorscheme configuration `. + ''' + levels = ( + os.path.join('colorschemes', name), + os.path.join('colorschemes', self.ext, '__main__'), + os.path.join('colorschemes', self.ext, name), + ) + return self._load_hierarhical_config('colorscheme', levels, (1,)) + + def load_theme_config(self, name): + '''Get theme configuration. + + :param str name: + Name of the theme to load. + + :return: dictionary with :ref:`theme configuration ` + ''' + levels = self.theme_levels + ( + os.path.join('themes', self.ext, name), + ) + return self._load_hierarhical_config('theme', levels, (0, 1,)) + + def load_colors_config(self): + '''Get colorscheme. + + :return: dictionary with :ref:`colors configuration `. + ''' + return self.load_config('colors', 'colors') + + @staticmethod + def get_local_themes(local_themes): + '''Get local themes. No-op here, to be overridden in subclasses if + required. + + :param dict local_themes: + Usually accepts ``{matcher_name : theme_name}``. May also receive + None in case there is no local_themes configuration. + + :return: + anything accepted by ``self.renderer.get_theme`` and processable by + ``self.renderer.add_local_theme``. Renderer module is determined by + ``__init__`` arguments, refer to its documentation. + ''' + return None + + def update_renderer(self): + '''Updates/creates a renderer if needed.''' + if self.run_loader_update: + self.config_loader.update() + cr_kwargs = None + with self.cr_kwargs_lock: + if self.cr_kwargs: + cr_kwargs = self.cr_kwargs.copy() + if cr_kwargs: + try: + self.create_renderer(**cr_kwargs) + except Exception as e: + self.exception('Failed to create renderer: {0}', str(e)) + if hasattr(self, 'renderer'): + with self.cr_kwargs_lock: + self.cr_kwargs.clear() + else: + raise + else: + with self.cr_kwargs_lock: + self.cr_kwargs.clear() + + def render(self, *args, **kwargs): + '''Update/create renderer if needed and pass all arguments further to + ``self.renderer.render()``. + ''' + try: + self.update_renderer() + return self.renderer.render(*args, **kwargs) + except Exception as e: + exc = e + try: + self.exception('Failed to render: {0}', str(e)) + except Exception as e: + exc = e + ret = FailedUnicode(safe_unicode(exc)) + if kwargs.get('output_width', False): + ret = ret, len(ret) + return ret + + def render_above_lines(self, *args, **kwargs): + '''Like .render(), but for ``self.renderer.render_above_lines()`` + ''' + try: + self.update_renderer() + for line in self.renderer.render_above_lines(*args, **kwargs): + yield line + except Exception as e: + exc = e + try: + self.exception('Failed to render: {0}', str(e)) + except Exception as e: + exc = e + yield FailedUnicode(safe_unicode(exc)) + + def setup(self, *args, **kwargs): + '''Setup the environment to use powerline. + + Must not be overridden by subclasses. This one only saves setup + arguments for :py:meth:`reload` method and calls :py:meth:`do_setup`. + ''' + self.shutdown_event.clear() + self.setup_args = args + self.setup_kwargs.update(kwargs) + self.do_setup(*args, **kwargs) + + @staticmethod + def do_setup(): + '''Function that does initialization + + Should be overridden by subclasses. May accept any number of regular or + keyword arguments. + ''' + pass + + def reload(self): + '''Reload powerline after update. + + Should handle most (but not all) powerline updates. + + Purges out all powerline modules and modules imported by powerline for + segment and matcher functions. Requires defining ``setup`` function that + updates reference to main powerline object. + + .. warning:: + Not guaranteed to work properly, use it at your own risk. It + may break your python code. + ''' + import sys + modules = self.imported_modules | set((module for module in sys.modules if module.startswith('powerline'))) + modules_holder = [] + for module in modules: + try: + # Needs to hold module to prevent garbage collecting until they + # are all reloaded. + modules_holder.append(sys.modules.pop(module)) + except KeyError: + pass + PowerlineClass = getattr(__import__(self.__module__, fromlist=(self.__class__.__name__,)), self.__class__.__name__) + self.shutdown(set_event=True) + init_args, init_kwargs = self.init_args + powerline = PowerlineClass(*init_args, **init_kwargs) + powerline.setup(*self.setup_args, **self.setup_kwargs) + + def shutdown(self, set_event=True): + '''Shut down all background threads. + + :param bool set_event: + Set ``shutdown_event`` and call ``renderer.shutdown`` which should + shut down all threads. Set it to False unless you are exiting an + application. + + If set to False this does nothing more then resolving reference + cycle ``powerline → config_loader → bound methods → powerline`` by + unsubscribing from config_loader events. + ''' + if set_event: + self.shutdown_event.set() + try: + self.renderer.shutdown() + except AttributeError: + pass + functions = tuple(self.cr_callbacks.values()) + self.config_loader.unregister_functions(set(functions)) + self.config_loader.unregister_missing(set(((self.find_config_files, function) for function in functions))) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.shutdown() + + def exception(self, msg, *args, **kwargs): + if 'prefix' not in kwargs: + kwargs['prefix'] = 'powerline' + exception = kwargs.pop('exception', None) + pl = getattr(self, 'pl', None) or get_fallback_logger(self.default_log_stream) + if exception: + try: + reraise(exception) + except Exception: + return pl.exception(msg, *args, **kwargs) + return pl.exception(msg, *args, **kwargs) diff --git a/powerline-bin/powerline/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb3b2749b07f3b08022f0864196d3d75195f877e GIT binary patch literal 44508 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 a-TH>OP|ZT_yQ6NgZO-}k0{ya?{r>@{t$V=$ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/__pycache__/colorscheme.cpython-312.pyc b/powerline-bin/powerline/__pycache__/colorscheme.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0509c37da5e3d974cd50ea7a71bd135741fcf2d9 GIT binary patch literal 6671 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/__pycache__/ipython.cpython-312.pyc b/powerline-bin/powerline/__pycache__/ipython.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02994dd7b34296f751a760cf25b2139b19ab10cd GIT binary patch literal 4225 zcmaJ^U2Gd!6~1@=>~U--X%qJ+-ENXPZB4gHVY_YVW=pGf7YZU;(nx^CGPs^`;^05- zjGH*?2(ueRDi+qOWjB37ec+{vka*;Q2Y5r`fw&Gz7`oC*fPl9)HmLN8bMDMIcH(kn zojLc{_kQP`@7()`P$)p4g#P%K)S5!bU$Np9*;N|vfU-t(qSFk?(m2fuaUm&An;)d#Kqw$>1DRiQOt zD6O&KQco=SFPs>Y?7m_yoy_ZomPuO%OJq#jucz;%&2&Cz_a<(e`ApF=v~;$RXO+X=aToPe_JvZMhS#$Z^&0H#<^rqtw)baF<10dE&nU;wLno~;T z0iD7THE=^e3!bBlmIBO+f=ugsk*TwMJ8L?(TE zqQL)mqTn5HBJH${7fQBY)6%)LrD;n8ZTlPdTG0_YGE}KRnaGeI+SMx1i4V zKMo4)pUitbZQuF!6T9uV2n&H46Id8NcCWE$B#UScEtxOotOu0!Lc59U53_z85-hNM zwqQB^ONZNc+}?w$nuunFe5!`tAG$lVrABLNbVG=;gU~z`Q}E!qMApzWJD_RVyk5+p z9@Mn&6%!e!hv5>oA670H%qp=%P<=r73Vb`P2O79Qgv=ojD`ZEYLgcYR#GWUhjWtA1 zbLQcc4oC8kY#fK4y^e%#6qj@nq+F6>vK^W>78v;Vv|$!AR)-s*3Ah=ed?CwQ7#wQd z)xoh^t)&+DxOrP~@B>>Q=4=>*>s-!J5sIZq$G^9nWB>;v<`wd&FH*hpVHh2SpSQcC z9EGvZa}>`hDBlB%;M%xp*8_Z-2GI!aI=FW)yctbo20?(oI+ouM2ArL=JD>z3I95Lg zWsP*h%4&@-Qg%QE6z4tagE?N&Ti7mB3vJ5_gaGbgPbt$SXz^@ui<}@9kgHRog!w43 z{9gSXxJ_KUHjV9Y`3lrs3vs18>+k+?PY!y1Q=LWS4ZCc`p>S{fElAj3$Hkn8dPVl|B zqflY6p(w&>XEcuK2szKPjW0pZkJ^H6m82*zxIZp(O#saeK3nw~JSK#|rQGZMNv1G&NH@_9^zv`_@DVlTm8*b)+ZOymJ=E8ks!%wXE8rX@28 z(}Xa>02m&wIB0$rDocZV4=|2PM4`((4dN-7U+``E58sQ{gy^;yd?HGs^l9YiV;R1{ zc}lS118slg<6rT3`vxd@_U=i71-rN3BD)A#7`waxR=`#3Zq4Hj$qpv-xm0>qDXsaNC`Yyf;jO?> zEikkp4*f0AyV*B5qbqj#`DEpF7mt)m37T}By z*F&1YLpG*Bd_=!OD5u}IAfmnn!LUr1g)&@U?uzrR^sxJHWx-oGO;f_hbPe3`z2g!o z(O-&4PqyMCOu%xjlrqeY1%)UePd+>^?W3@^^rC(z;daPX zqy|5Eqy_3&t$*ykUh6-zDZca^WYN*MgI)y%A1^n^TX5`UK_EaJ(1vAMEQ=NTUTBxw z%8=j6#CymAp$q|`z)N7tR$I>$%xtD%CE$J&bD*&01!km7Tf&bm=5NpQFa{!VW7Dta zHJDN?EFIYgiPv=%HpE#QNIQIRhlpadqW@V9{Wwy2d0SC`kbflgtX{7U-P8Xhop|Dd zZXTAgz~1W#`X<9v!LFe|x8~+x$g+0GO|(gPwP{+6I>tkOz3OCK%+WkCodCrg1@Ux+ zGzD3Znqf(Jbtgz6|2Gv$=xGK){0D@y6FzAw){769RM9Fjc(^dM0Yled=<5v4!fvAQ zfv^v>Kplq%;W+Xgk5hZFv%`HtGv`SF_!=+}xP>@3NWSG`SUrfMAH*~Nr1N;X!e*d~ z=QA&XfGZxQ{~$AUGV^!x;wL2b2|3+V6gpNt*(C634ut6G>Kjc0pXTrgjaEzlCh*}a F{|^|Z@Rs6$LZ6tuvn|>@u#(3+v$He5{msmM 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/__pycache__/renderer.cpython-312.pyc b/powerline-bin/powerline/__pycache__/renderer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f53a04b049ea2cf6d367529ce26b839236d16d18 GIT binary patch literal 21426 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/__pycache__/segment.cpython-312.pyc b/powerline-bin/powerline/__pycache__/segment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..237b1666b5eb662739c607a6b32fc3753a556575 GIT binary patch literal 17689 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/__pycache__/shell.cpython-312.pyc b/powerline-bin/powerline/__pycache__/shell.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90ec20e2d580fbebc86e9cc3ce7d326e79e1dc03 GIT binary patch literal 2829 zcmb7G-ES0C6u_Qz=vP(=isUQxH$YiJI?}O)vN(yeBuTPDQpk!)5wmt;Nm)55 zb6v1P*>Ez95kapZU0guAWXLOmw^mXq$!h2?R#8QFOEG7r^SYr~ren~QWxHYBoHcDT zpL4rXC+xgcbPUbR7V^|_I}6mzIa;QeOFJ+?#jY}uKV?wM%o$K=%Nlgb(9N`Cr@g&A zN&HIvbx_X0F$|Q%I!cm7l)*Y)2qy)u5zs`g37|<_6G4-8X#piex(qVBh~{uonM7*H z?VOx8EURHbI@pJ8$AD{xf87Fc0WYC4E+Y+euQ)y!2sr?`SIX$)P6Xp-!a>W%SH}ZT zfj&;vMmy6o#6)Fs1%HAuDj}65C^JNrT`@(cY*(_21%pyH(G|^{>9~S1=eS+e$ms?( zsFuy^Mauv#MBA`3w1W+lPoCnF6-`T9DcjaGo7owSMl1LB$DM2;UN8&09T;OcyZ65^ zJyv*e?qJ+9Ps9r)XF8vY7Xn`5HUlYEC{Z{Zn(y6=S&SK^K!+UzakqljI(sU^3+gQr zI@ftotdgNi`@T4E`M~namk(VNYh&Y8_>rUE%B$pP9cG|3X3{UrL}fOU$JpHa!JPdAtR8$s_J*XrGThh`8omIN=j8w3)fR*Tz@n zgH7CRyCH46G`u|gwR%;pjlNQa-_R?Y$W*J{>hf^4JAP9bYhtwd9x*mKqi=)4gBO|s zt+mWF?$k!l9JYIKQ&4jncMI+v93i-O0kV?k?d`s|7gEl2^WA{(;)ATQE?XrWP!C16 zec=2%K)=uVTW7NvY7c>6fkugZI&gNNrVLhtx~~Zq7Jh zS)`0@h`f`?X+Rg`6Nu9czLpXkeY^oea2X(*ki@1)#!%Y}|9S$%1^gz$Y(w-exXL?l z?9&+T52UcO!c1fHjor#5SlGlF@;P3D#Bgpim@Aw# zO0F=QvN*(zc+Y+Go^p7~$Qg45dSrf2i>ES_t$aFVY201y*kN9?kHi{tqOgm-2gKb! z8TNOO&?Wv7>Z;g_uih4r6kgnQe!SKt*xVS@HZt=XXgIgyS>&s zQtcgC?R{olf(B@9lWrqHknZ;tW(L1NJ)kh+%6KF9m;9gtua`!a^!?fu@+W5aA)@{v z!g^k_4X0R`?{9%U=on!}vlI$G-Sb3c=SRD_J!+d9)-)D(G|g?({45W8ho-$>Oj%wJ zPs%)Va8ID@8qw#N7z5!({PdrO6s~FDE<6Y^mwU+zUF=oC(-_N6_D&FY7tlH(WCE{; zMbf_B!38F7;X87ONdNX=($DSVvl3t>*p?|eMGAIOh8bnSk+Sy_Ww(H`hXD{B46q%@|I<(@Lu?^_oz8SS*m09+S@?f7BI$tpku4(*zaijPe@&t2XX)T LxclRp|MWT_=M-qa zZ^)${ksDk`;ecGs6UulZ4dZ;c<_mlYiCw$pyxB`i?3M2*cGP%PKoeOi;&Rlj(qp4&@i&E{4e3EL_fuqUHaP|&oiHKN7 z=Anm&`;2t1FPF^q7%>XCdJZ2NIgmSY`DkA%d9g1yZj59zeN~oy#)y{IdUNAe!?w(6 z0GQ$y(0xFPq_l5;v3`NuU2=Mg!Br?Czulau7rMZtc2^OsPii=s()4lN(9+Sdm=Pb* zD8)g`^P;towSrZU+ca*37OX=BYVYF+wVOeubx;|HUp1lVnfN`BxkVE2r*iM|FOx7o zbceUZls0Tw5=|yXj5~w|p%LRz#?hG3#-ds}XN=pc4f`vj(Kcv?%c-N-isW;br{wl7 zOM)US5rG%VC~#CeRZ%oU3EKqR1e~h^uktNWG66q8Bn&;|LY6b0%^0u^b%y4SVDY(> zCCAd)e8#XGl|8B>$51F##_5ZxYE;j~V7EqbLbMBNaV|Ov3zk#yOkKL(Hq$iQYPRe* zo%`pw{oe=@z;Ospz)~mA}eG1XTd#DXNMp!kfett;`gyLv?|w zn=cB8GU4h}&r@QVPynu2#b1cjOe zu@OMaXQ8E!Ck0QzSE#YeCw&E<&fV}86g^PzsR5i9^(q9~Ro*~?F1s~{`*j=SY6IIP zOe)*WqTsXT%#j;sL~`Rb`2AQU<8bti>dxpQ)QxTrta^2~zDlOK8<8<`S$LI%FYlf zu}x+iH^~$5TO9`S0^#t`lM4W%qEkVmuIpTtz!B$1Q9*1;_HusxI1lshaJM)RR5u8S z`wL-=3-g;0paNkCP^DE7fN9+hL4miYUFF+|f=9l0xS=pdQU0Jk`Q8H-_qxSh+GLd; zD#yXe(=O-e$%$^J{(7U}StX5VwD))_8waQHWN)>}dhR4J)w_WF7x}VCRtQ(q_L;+7 zd}FF(Ng)2(KkS(9|7q8a)plB8>;dO1?5-!1D zC`sF#(4+7&(eaI_PCzpqNd=48EH2B$=`ZS2&n`(sa^9$CI7+_2&GGBwKY4Ra0931l zbG5AzPHbNmphpE{-$CvRRJ)cZo~L@2mK}&MR4l5g6ve@BPG@vWE;|>NHw$hwjpo4k zB{PWuipl^5KAf=liwR4L83xtEJo6ANWdyvc6na)xjj9dD@+l(LJ`SwtF(gkR)25A6jHUreGM7q%kMDdz8$Uy7mRbTh(X=0XoWdRgLWf*YZd{3_QxBi=v1v#mMHO ztQ#G|(QDC3DHqs$oHU<_W;1cks?kUChMFDAM72xcsaW2P`Il_hih2_C z#V%ydX*zo4uva&yvhV4%579);=Iwg``slT=LyBanku-J`yB7FBDX?Q^!VElC?7G_X zAker>U_UO&q`vvqiMLNI*6lIt_RQDqTXR71DiP}>Y`5eRguSKCU9*Mvhs?dt-iw=i zpEEn3FFv^-?1a88yBC}Hna%s=!bj(ukKrf{C4bw@E2e)B^zMGp)H-u~G1zSeyKjHz z?o0E*r{|lV!B+L9Ks~bm+*em>YMVXte!uBI3{HHr$ZD6I#Os6ly`{RH)4j!>&!onZ z;9nG)OrdG6IlLe|_Q2m+5~PwKLpl5REeds}P&ZfKH81Qg34xN}S@k(<#bWnbfCPfK zcD}uHc0ag%oyX=nj+Z)mZjYKBM;ALzm>nnXChpPsj^|eeF7P6^LTZHGV&ZebaqYyF z6XhWnntSJ)4=e}=OTN$waf`i0qg2;=>#4V&nlWa-2QphBE~$6Q@tLo6=E&^nd0)7A z-g5dr^EQ-RwbSAIuC^s!R01U>IMp=WVk*IzQ?oS-N*_$q;l7r>lAb!e-S?E|GB)NeCL5u`_+;JEgtHR!PfX0?;mI(AMW-H9FRY1@elL} zAMNLm9#955m5+|@9BfxUZkHgx$ztGPL(RGR2SCtXjly$l0v7?S*d$lr{%?DA0W8fV zU*MrVIA@ara~6bh*kfBYuwFhe@nC6~6+<&$HR)iu1vI@kLRDkSgR!;G8|ZwdJY-P! zc}=&JbK^OUX&VSMz}q1ZequO@jo4A!9Ai+NntiHlp07ih9t8qXT}|L-`g(eW$b!45 zmg<^tH~jR(3Xw#2@p7pyxI#q9J>^*91=(GaTZ)OPQB!XDR1PjnP_ZmPyJZ17f4Sx& z-bPqf+5MU9f)$nB57|Y)9oI4WZo zZx{SlGjJ9vej7)H0+--2aDG%i0cUEOyO6_Em>`qV_UE*`G0K|+&fwF~S_XGrR$1&0 zeQ=X)Ne}{ww%ZHtesDbqeMEZ?5NuT5!VF&RPzla?zeoxa!wq7XlmQ0|KDXz) z?$|4cSV9+l(g8V{<(vhF>Ue!0?B$bC=ESn%(e(gf+aRYJ_F)h7h^sx@w#P7vS72L` z>VojGA~y~$27refM>lY3S%MM|mRtd;lyezQt%i>iPy^*G0IK9Y6)bFyGzYaT2lG1u z^BaM8HfPn(<{PxRj^gdmmSp#}_b;|Z?wK=HF11^@Y!@I`5PXeGXO&BUacM>VIM>l? z7`+Y%>exKCaw*889qX;^oNW)@;W46tP_AA?3MzYC0hPwH-1>v?L8()P}QE>x&J86Ayf_Wok69 z8+{aM2tEYlz`IXsdI)@e2pm*4+_7AY#?m2(6hf#+k3mo6MaYE8dNu?+Lt`V!_{cgQ zeI%PtsW4tBd(i-&9XN%a(?fB*+||_3FwLez$Yw&L+0ed=StFf=@sWGD7s@Ga28zbY zs#TMEE)^R`e_u^vm_%R1a%n878Y2)_LFARO#8}?QS~5hvFsGq>KeXt_3J^>pj~_ci zX`CS7`9<+v`itV9?8i(BG9dsD**Gi9WDR_Q01RF&xh$@7lm{a+u}$n9h{4Ui8Zxpl zopcTYMSI%tUcS+WsO`WcMGHrJkn{qX*zw4ItT~un^ajFpW#fh?lj03tIq;ElR2xoS zw*2K8R=?@!^d)Tb3KF~(pyz>Die`tD^i?cGGiFI_rQsU@F100>FLNz1p3RL@1sllu zoEkHssPU0v;tfP?8%;vX|vui*lnWH~!k^lpRYFaDk|5^|Z%2!#uMJ)q zygIbR?*vBP`swqgx4roN4LPTGy7BjXGlR2d&9zvYAg6L%I%GkBZE0c2#ugpcF3y$Ae5@q=mS8ChEnEW+Y+Od0f)ZB4! zZpVq@*wn;*N9(=ER|Wo{bD8k%&d(wK*=xF5mnFVESn+|EY6uMBxbJM9IX`>eZ0~u$ z@qYUe9Ja|+T4r9puY^kNU9%Ch{lH@TVYB@(#4=;%k-_=)vy~A_?!fdB(+yuR?z=nx ze{GML?MLo9?m5hFotC){oQuH@OAlF6j5w+79Ar zz^I_UBq`Uv~J_YSs*ANaZkIPrrgPC4M^!($Gp`G`{n z8yz3H`uV|H$HyKCDn722py=a90rM@&*~c9pclJwXdmNwam7&KcJrWds^0)wb_#id_ z_h?M%!G%e7*a(Y5?9ORuD6Cj;^MLn1(WvE$+P5Q7%M*>hk&mUyHFN}!vN(!@D@v%2 za^&-kJ9c==Z8 zB>f|3ivEL+iV{LVj{6lkH&4#}lK6i`&YR@?f0BbMGS7KeT#SgEuu{WuJs<=mJoh5E gktEjQ0 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 K6hCtCDE}{8pY>A! literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/__init__.py b/powerline-bin/powerline/bindings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/powerline-bin/powerline/bindings/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/bindings/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..925c44c1a60ce0eba521a049e0976fe2ed9ce2a7 GIT binary patch literal 163 zcmX@j%ge<81ia^Or-A6lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxd<)mMdTcBT%S)f~z zSd^YxqHAWFVNhURVX2>!nWSG(S(1^Tr(cj?o?4WXnU|`cl$n>3nU`LyA0MBYmst`Y kuUAm{i^C>2KczG$)vkyYXe1*L7lRldnHd=widjJ3c literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/__pycache__/config.cpython-312.pyc b/powerline-bin/powerline/bindings/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b01f32da429469b7a912de852f6c742c8c50a8d3 GIT binary patch literal 15044 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/awesome/__pycache__/powerline-awesome.cpython-312.pyc b/powerline-bin/powerline/bindings/awesome/__pycache__/powerline-awesome.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1a62dcb2fb64ebf55de27943afe955566bcfdf4 GIT binary patch literal 862 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/bar/powerline-bar.py b/powerline-bin/powerline/bindings/bar/powerline-bar.py new file mode 100644 index 0000000..71e8ae3 --- /dev/null +++ b/powerline-bin/powerline/bindings/bar/powerline-bar.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import sys +import time + +from threading import Lock, Timer +from argparse import ArgumentParser + +from powerline.lemonbar import LemonbarPowerline +from powerline.lib.encoding import get_unicode_writer +from powerline.bindings.wm import DEFAULT_UPDATE_INTERVAL + + +if __name__ == '__main__': + parser = ArgumentParser(description='Powerline lemonbar bindings.') + parser.add_argument( + '--i3', action='store_true', + help='Subscribe for i3 events.' + ) + args = parser.parse_args() + powerline = LemonbarPowerline() + powerline.update_renderer() + powerline.pl.warn("The 'bar' bindings are deprecated, please switch to 'lemonbar'") + lock = Lock() + modes = ['default'] + write = get_unicode_writer(encoding='utf-8') + + def render(reschedule=False): + if reschedule: + Timer(DEFAULT_UPDATE_INTERVAL, render, kwargs={'reschedule': True}).start() + + global lock + with lock: + write(powerline.render(mode=modes[0])) + write('\n') + sys.stdout.flush() + + def update(evt): + modes[0] = evt.change + render() + + render(reschedule=True) + + if args.i3: + try: + import i3ipc + except ImportError: + import i3 + i3.Subscription(lambda evt, data, sub: print(render()), 'workspace') + else: + conn = i3ipc.Connection() + conn.on('workspace::focus', lambda conn, evt: render()) + conn.on('mode', lambda conn, evt: update(evt)) + conn.main() + + while True: + time.sleep(1e8) diff --git a/powerline-bin/powerline/bindings/bash/powerline.sh b/powerline-bin/powerline/bindings/bash/powerline.sh new file mode 100644 index 0000000..f4e933e --- /dev/null +++ b/powerline-bin/powerline/bindings/bash/powerline.sh @@ -0,0 +1,153 @@ +_powerline_columns_fallback() { + if which stty &>/dev/null ; then + local cols="$(stty size 2>/dev/null)" + if ! test -z "$cols" ; then + echo "${cols#* }" + return 0 + fi + fi + echo 0 + return 0 +} + +_powerline_tmux_pane() { + echo "${TMUX_PANE:-`TMUX="$_POWERLINE_TMUX" tmux display -p "#D"`}" | \ + tr -d ' %' +} + +_powerline_tmux_setenv() { + TMUX="$_POWERLINE_TMUX" tmux setenv -g TMUX_"$1"_`_powerline_tmux_pane` "$2" + TMUX="$_POWERLINE_TMUX" tmux refresh -S +} + +_powerline_tmux_set_pwd() { + if test "$_POWERLINE_SAVED_PWD" != "$PWD" ; then + _POWERLINE_SAVED_PWD="$PWD" + _powerline_tmux_setenv PWD "$PWD" + fi +} + +_powerline_return() { + return $1 +} + +_POWERLINE_HAS_PIPESTATUS="$( + _powerline_return 0 | _powerline_return 43 + test "${PIPESTATUS[*]}" = "0 43" + echo "$?" +)" + +_powerline_has_pipestatus() { + return $_POWERLINE_HAS_PIPESTATUS +} + +_powerline_status_wrapper() { + local last_exit_code=$? last_pipe_status=( "${PIPESTATUS[@]}" ) + + if ! _powerline_has_pipestatus \ + || test "${#last_pipe_status[@]}" -eq "0" \ + || test "$last_exit_code" != "${last_pipe_status[$(( ${#last_pipe_status[@]} - 1 ))]}" ; then + last_pipe_status=() + fi + "$@" $last_exit_code "${last_pipe_status[*]}" + return $last_exit_code +} + +_powerline_add_status_wrapped_command() { + local action="$1" ; shift + local cmd="$1" ; shift + full_cmd="_powerline_status_wrapper $cmd" + if test "$action" = "append" ; then + PROMPT_COMMAND="$PROMPT_COMMAND"$'\n'"$full_cmd" + else + PROMPT_COMMAND="$full_cmd"$'\n'"$PROMPT_COMMAND" + fi +} + +_powerline_tmux_set_columns() { + _powerline_tmux_setenv COLUMNS "${COLUMNS:-`_powerline_columns_fallback`}" +} + +_powerline_init_tmux_support() { + if test -n "$TMUX" && tmux refresh -S &>/dev/null ; then + # TMUX variable may be unset to create new tmux session inside this one + _POWERLINE_TMUX="$TMUX" + + trap '_powerline_tmux_set_columns' WINCH + _powerline_tmux_set_columns + + test "$PROMPT_COMMAND" != "${PROMPT_COMMAND/_powerline_tmux_set_pwd}" \ + || _powerline_add_status_wrapped_command append _powerline_tmux_set_pwd + fi +} + +_powerline_local_prompt() { + # Arguments: + # 1: side + # 2: renderer_module arg + # 3: last_exit_code + # 4: last_pipe_status + # 5: jobnum + # 6: local theme + "$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \ + $2 \ + --last-exit-code=$3 \ + --last-pipe-status="$4" \ + --jobnum=$5 \ + --renderer-arg="client_id=$$" \ + --renderer-arg="local_theme=$6" +} + +_powerline_prompt() { + # Arguments: + # 1: side + # 2: last_exit_code + # 3: last_pipe_status + # 4: jobnum + "$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \ + --width="${COLUMNS:-$(_powerline_columns_fallback)}" \ + -r.bash \ + --last-exit-code=$2 \ + --last-pipe-status="$3" \ + --jobnum=$4 \ + --renderer-arg="client_id=$$" +} + +_powerline_set_prompt() { + local last_exit_code=$1 ; shift + local last_pipe_status=$1 ; shift + local jobnum="$(jobs -p|wc -l)" + PS1="$(_powerline_prompt aboveleft $last_exit_code "$last_pipe_status" $jobnum)" + if test -n "$POWERLINE_SHELL_CONTINUATION$POWERLINE_BASH_CONTINUATION" ; then + PS2="$(_powerline_local_prompt left -r.bash $last_exit_code "$last_pipe_status" $jobnum continuation)" + fi + if test -n "$POWERLINE_SHELL_SELECT$POWERLINE_BASH_SELECT" ; then + PS3="$(_powerline_local_prompt left '' $last_exit_code "$last_pipe_status" $jobnum select)" + fi +} + +_powerline_setup_prompt() { + VIRTUAL_ENV_DISABLE_PROMPT=1 + if test -z "${POWERLINE_COMMAND}" ; then + POWERLINE_COMMAND="$("$POWERLINE_CONFIG_COMMAND" shell command)" + fi + test "$PROMPT_COMMAND" != "${PROMPT_COMMAND%_powerline_set_prompt*}" \ + || _powerline_add_status_wrapped_command prepend _powerline_set_prompt + PS2="$(_powerline_local_prompt left -r.bash 0 0 0 continuation)" + PS3="$(_powerline_local_prompt left '' 0 0 0 select)" +} + +if test -z "${POWERLINE_CONFIG_COMMAND}" ; then + if which powerline-config >/dev/null ; then + POWERLINE_CONFIG_COMMAND=powerline-config + else + POWERLINE_CONFIG_COMMAND="$(dirname "$BASH_SOURCE")/../../../scripts/powerline-config" + fi +fi + +if "${POWERLINE_CONFIG_COMMAND}" shell --shell=bash uses prompt ; then + _powerline_setup_prompt +fi +if "${POWERLINE_CONFIG_COMMAND}" shell --shell=bash uses tmux ; then + _powerline_init_tmux_support +fi diff --git a/powerline-bin/powerline/bindings/config.py b/powerline-bin/powerline/bindings/config.py new file mode 100644 index 0000000..3100633 --- /dev/null +++ b/powerline-bin/powerline/bindings/config.py @@ -0,0 +1,286 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import re +import sys +import subprocess +import shlex + +from powerline.config import POWERLINE_ROOT, TMUX_CONFIG_DIRECTORY +from powerline.lib.config import ConfigLoader +from powerline import generate_config_finder, load_config, create_logger, finish_common_config +from powerline.shell import ShellPowerline +from powerline.lib.shell import which +from powerline.bindings.tmux import (TmuxVersionInfo, run_tmux_command, set_tmux_environment, get_tmux_version, + source_tmux_file) +from powerline.lib.encoding import get_preferred_output_encoding +from powerline.renderers.tmux import attrs_to_tmux_attrs +from powerline.commands.main import finish_args + + +CONFIG_FILE_NAME = re.compile(r'powerline_tmux_(?P\d+)\.(?P\d+)(?P[a-z]+)?(?:_(?Pplus|minus))?\.conf') +CONFIG_MATCHERS = { + None: (lambda a, b: a.major == b.major and a.minor == b.minor), + 'plus': (lambda a, b: a[:2] <= b[:2]), + 'minus': (lambda a, b: a[:2] >= b[:2]), +} +CONFIG_PRIORITY = { + None: 3, + 'plus': 2, + 'minus': 1, +} + + +def list_all_tmux_configs(): + '''List all version-specific tmux configuration files''' + for root, dirs, files in os.walk(TMUX_CONFIG_DIRECTORY): + dirs[:] = () + for fname in files: + match = CONFIG_FILE_NAME.match(fname) + if match: + assert match.group('suffix') is None + yield ( + os.path.join(root, fname), + CONFIG_MATCHERS[match.group('mod')], + CONFIG_PRIORITY[match.group('mod')], + TmuxVersionInfo( + int(match.group('major')), + int(match.group('minor')), + match.group('suffix'), + ), + ) + + +def get_tmux_configs(version): + '''Get tmux configuration suffix given parsed tmux version + + :param TmuxVersionInfo version: Parsed tmux version. + ''' + for fname, matcher, priority, file_version in list_all_tmux_configs(): + if matcher(file_version, version): + yield (fname, priority + file_version.minor * 10 + file_version.major * 10000) + + +def source_tmux_files(pl, args, tmux_version=None, source_tmux_file=source_tmux_file): + '''Source relevant version-specific tmux configuration files + + Files are sourced in the following order: + * First relevant files with older versions are sourced. + * If files for same versions are to be sourced then first _minus files are + sourced, then _plus files and then files without _minus or _plus suffixes. + ''' + tmux_version = tmux_version or get_tmux_version(pl) + source_tmux_file(os.path.join(TMUX_CONFIG_DIRECTORY, 'powerline-base.conf')) + for fname, priority in sorted(get_tmux_configs(tmux_version), key=(lambda v: v[1])): + source_tmux_file(fname) + if not os.environ.get('POWERLINE_COMMAND'): + cmd = deduce_command() + if cmd: + set_tmux_environment('POWERLINE_COMMAND', deduce_command(), remove=False) + try: + run_tmux_command('refresh-client') + except subprocess.CalledProcessError: + # On tmux-2.0 this command may fail for whatever reason. Since it is + # critical just ignore the failure. + pass + + +class EmptyArgs(object): + def __init__(self, ext, config_path): + self.ext = [ext] + self.side = 'left' + self.config_path = None + + def __getattr__(self, attr): + return None + + +def init_tmux_environment(pl, args, set_tmux_environment=set_tmux_environment): + '''Initialize tmux environment from tmux configuration + ''' + powerline = ShellPowerline(finish_args(None, os.environ, EmptyArgs('tmux', args.config_path))) + # TODO Move configuration files loading out of Powerline object and use it + # directly + powerline.update_renderer() + # FIXME Use something more stable then `theme_kwargs` + colorscheme = powerline.renderer_options['theme_kwargs']['colorscheme'] + + def get_highlighting(group): + return colorscheme.get_highlighting([group], None) + + for varname, highlight_group in ( + ('_POWERLINE_BACKGROUND_COLOR', 'background'), + ('_POWERLINE_ACTIVE_WINDOW_STATUS_COLOR', 'active_window_status'), + ('_POWERLINE_WINDOW_STATUS_COLOR', 'window_status'), + ('_POWERLINE_ACTIVITY_STATUS_COLOR', 'activity_status'), + ('_POWERLINE_BELL_STATUS_COLOR', 'bell_status'), + ('_POWERLINE_WINDOW_COLOR', 'window'), + ('_POWERLINE_WINDOW_DIVIDER_COLOR', 'window:divider'), + ('_POWERLINE_WINDOW_CURRENT_COLOR', 'window:current'), + ('_POWERLINE_WINDOW_NAME_COLOR', 'window_name'), + ('_POWERLINE_SESSION_COLOR', 'session'), + ): + highlight = get_highlighting(highlight_group) + set_tmux_environment(varname, powerline.renderer.hlstyle(**highlight)[2:-1]) + for varname, prev_group, next_group in ( + ('_POWERLINE_WINDOW_CURRENT_HARD_DIVIDER_COLOR', 'window', 'window:current'), + ('_POWERLINE_WINDOW_CURRENT_HARD_DIVIDER_NEXT_COLOR', 'window:current', 'window'), + ('_POWERLINE_SESSION_HARD_DIVIDER_NEXT_COLOR', 'session', 'background'), + ): + prev_highlight = get_highlighting(prev_group) + next_highlight = get_highlighting(next_group) + set_tmux_environment( + varname, + powerline.renderer.hlstyle( + fg=prev_highlight['bg'], + bg=next_highlight['bg'], + attrs=0, + )[2:-1] + ) + for varname, attr, group in ( + ('_POWERLINE_ACTIVE_WINDOW_FG', 'fg', 'active_window_status'), + ('_POWERLINE_WINDOW_STATUS_FG', 'fg', 'window_status'), + ('_POWERLINE_ACTIVITY_STATUS_FG', 'fg', 'activity_status'), + ('_POWERLINE_ACTIVITY_STATUS_ATTR', 'attrs', 'activity_status'), + ('_POWERLINE_BELL_STATUS_FG', 'fg', 'bell_status'), + ('_POWERLINE_BELL_STATUS_ATTR', 'attrs', 'bell_status'), + ('_POWERLINE_BACKGROUND_FG', 'fg', 'background'), + ('_POWERLINE_BACKGROUND_BG', 'bg', 'background'), + ('_POWERLINE_SESSION_FG', 'fg', 'session'), + ('_POWERLINE_SESSION_BG', 'bg', 'session'), + ('_POWERLINE_SESSION_ATTR', 'attrs', 'session'), + ('_POWERLINE_SESSION_PREFIX_FG', 'fg', 'session:prefix'), + ('_POWERLINE_SESSION_PREFIX_BG', 'bg', 'session:prefix'), + ('_POWERLINE_SESSION_PREFIX_ATTR', 'attrs', 'session:prefix'), + ): + if attr == 'attrs': + attrs = attrs_to_tmux_attrs(get_highlighting(group)[attr]) + set_tmux_environment(varname, ']#['.join(attrs)) + set_tmux_environment(varname + '_LEGACY', (','.join( + # Tmux-1.6 does not accept no… attributes in + # window-status-…-attr options. + (attr for attr in attrs if not attr.startswith('no'))) + # But it does not support empty attributes as well. + or 'none')) + else: + if powerline.common_config['term_truecolor']: + set_tmux_environment(varname, '#{0:06x}'.format(get_highlighting(group)[attr][1])) + else: + set_tmux_environment(varname, 'colour' + str(get_highlighting(group)[attr][0])) + + left_dividers = powerline.renderer.theme.dividers['left'] + set_tmux_environment('_POWERLINE_LEFT_HARD_DIVIDER', left_dividers['hard']) + set_tmux_environment('_POWERLINE_LEFT_SOFT_DIVIDER', left_dividers['soft']) + set_tmux_environment('_POWERLINE_LEFT_HARD_DIVIDER_SPACES', ( + ' ' * powerline.renderer.strwidth(left_dividers['hard']))) + + +TMUX_VAR_RE = re.compile('\$(_POWERLINE_\w+)') + + +def tmux_setup(pl, args): + tmux_environ = {} + tmux_version = get_tmux_version(pl) + + def set_tmux_environment_nosource(varname, value, remove=True): + tmux_environ[varname] = value + + def replace_cb(match): + return tmux_environ[match.group(1)] + + def replace_env(s): + return TMUX_VAR_RE.subn(replace_cb, s)[0] + + def source_tmux_file_nosource(fname): + with open(fname) as fd: + for line in fd: + if line.startswith('#') or line == '\n': + continue + args = shlex.split(line) + args = [args[0]] + [replace_env(arg) for arg in args[1:]] + run_tmux_command(*args) + + if args.source is None: + args.source = tmux_version < (1, 9) + + if args.source: + ste = set_tmux_environment + stf = source_tmux_file + else: + ste = set_tmux_environment_nosource + stf = source_tmux_file_nosource + + init_tmux_environment(pl, args, set_tmux_environment=ste) + source_tmux_files(pl, args, tmux_version=tmux_version, source_tmux_file=stf) + + +def get_main_config(args): + find_config_files = generate_config_finder() + config_loader = ConfigLoader(run_once=True) + return load_config('config', find_config_files, config_loader) + + +def create_powerline_logger(args): + config = get_main_config(args) + common_config = finish_common_config(get_preferred_output_encoding(), config['common']) + logger, pl, get_module_attr = create_logger(common_config) + return pl + + +def check_command(cmd): + if which(cmd): + return cmd + + +def deduce_command(): + '''Deduce which command to use for ``powerline`` + + Candidates: + + * ``powerline``. Present only when installed system-wide. + * ``{powerline_root}/scripts/powerline``. Present after ``pip install -e`` + was run and C client was compiled (in this case ``pip`` does not install + binary file). + * ``{powerline_root}/client/powerline.sh``. Useful when ``sh``, ``sed`` and + ``socat`` are present, but ``pip`` or ``setup.py`` was not run. + * ``{powerline_root}/client/powerline.py``. Like above, but when one of + ``sh``, ``sed`` and ``socat`` was not present. + * ``powerline-render``. Should not really ever be used. + * ``{powerline_root}/scripts/powerline-render``. Same. + ''' + return ( + None + or check_command('powerline') + or check_command(os.path.join(POWERLINE_ROOT, 'scripts', 'powerline')) + or ((which('sh') and which('sed') and which('socat')) + and check_command(os.path.join(POWERLINE_ROOT, 'client', 'powerline.sh'))) + or check_command(os.path.join(POWERLINE_ROOT, 'client', 'powerline.py')) + or check_command('powerline-render') + or check_command(os.path.join(POWERLINE_ROOT, 'scripts', 'powerline-render')) + ) + + +def shell_command(pl, args): + cmd = deduce_command() + if cmd: + print(cmd) + else: + sys.exit(1) + + +def uses(pl, args): + component = args.component + if not component: + raise ValueError('Must specify component') + shell = args.shell + template = 'POWERLINE_NO_{shell}_{component}' + for sh in (shell, 'shell') if shell else ('shell'): + varname = template.format(shell=sh.upper(), component=component.upper()) + if os.environ.get(varname): + sys.exit(1) + config = get_main_config(args) + if component in config.get('ext', {}).get('shell', {}).get('components', ('tmux', 'prompt')): + sys.exit(0) + else: + sys.exit(1) diff --git a/powerline-bin/powerline/bindings/fish/powerline-setup.fish b/powerline-bin/powerline/bindings/fish/powerline-setup.fish new file mode 100644 index 0000000..3887138 --- /dev/null +++ b/powerline-bin/powerline/bindings/fish/powerline-setup.fish @@ -0,0 +1,109 @@ +function powerline-setup + function _powerline_columns_fallback + if which stty >/dev/null + if stty size >/dev/null + stty size | cut -d' ' -f2 + return 0 + end + end + echo 0 + return 0 + end + + function _powerline_columns + # Hack: `test "" -eq 0` is true, as well as `test 0 -eq 0` + # Note: at fish startup `$COLUMNS` is equal to zero, meaning that it may + # not be used. + if test "$COLUMNS" -eq 0 + _powerline_columns_fallback + else + echo "$COLUMNS" + end + end + + if test -z "$POWERLINE_CONFIG_COMMAND" + if which powerline-config >/dev/null + set -g POWERLINE_CONFIG_COMMAND powerline-config + else + set -g POWERLINE_CONFIG_COMMAND (dirname (status -f))/../../../scripts/powerline-config + end + end + + if env $POWERLINE_CONFIG_COMMAND shell --shell=fish uses prompt + if test -z "$POWERLINE_COMMAND" + set -g POWERLINE_COMMAND (env $POWERLINE_CONFIG_COMMAND shell command) + end + function _powerline_set_default_mode --on-variable fish_key_bindings + if test $fish_key_bindings != fish_vi_key_bindings + set -g _POWERLINE_DEFAULT_MODE default + else + set -g -e _POWERLINE_DEFAULT_MODE + end + end + function _powerline_update --on-variable POWERLINE_COMMAND + set -l addargs "--last-exit-code=\$status" + set -l addargs "$addargs --last-pipe-status=\$status" + set -l addargs "$addargs --jobnum=(jobs -p | wc -l)" + # One random value has an 1/32767 = 0.0031% probability of having + # the same value in two shells + set -l addargs "$addargs --renderer-arg=client_id="(random) + set -l addargs "$addargs --width=\$_POWERLINE_COLUMNS" + set -l addargs "$addargs --renderer-arg=mode=\$fish_bind_mode" + set -l addargs "$addargs --renderer-arg=default_mode=\$_POWERLINE_DEFAULT_MODE" + set -l promptside + set -l rpromptpast + set -l columnsexpr + if test -z "$POWERLINE_NO_FISH_ABOVE$POWERLINE_NO_SHELL_ABOVE" + set promptside aboveleft + set rpromptpast 'echo -n " "' + set columnsexpr '(math (_powerline_columns) - 1)' + else + set promptside left + set rpromptpast + set columnsexpr '(_powerline_columns)' + end + echo " + function fish_prompt + env \$POWERLINE_COMMAND $POWERLINE_COMMAND_ARGS shell $promptside $addargs + end + function fish_right_prompt + env \$POWERLINE_COMMAND $POWERLINE_COMMAND_ARGS shell right $addargs + $rpromptpast + end + function _powerline_set_columns --on-signal WINCH + set -g _POWERLINE_COLUMNS $columnsexpr + end + " | source + _powerline_set_columns + end + _powerline_set_default_mode + _powerline_update + end + if env $POWERLINE_CONFIG_COMMAND shell --shell=fish uses tmux + if test -n "$TMUX" + if tmux refresh -S ^/dev/null + set -g _POWERLINE_TMUX "$TMUX" + function _powerline_tmux_pane + if test -z "$TMUX_PANE" + env TMUX="$_POWERLINE_TMUX" tmux display -p "#D" | tr -d ' %' + else + echo "$TMUX_PANE" | tr -d ' %' + end + end + function _powerline_tmux_setenv + env TMUX="$_POWERLINE_TMUX" tmux setenv -g TMUX_$argv[1]_(_powerline_tmux_pane) "$argv[2]" + env TMUX="$_POWERLINE_TMUX" tmux refresh -S + end + function _powerline_tmux_set_pwd --on-variable PWD + _powerline_tmux_setenv PWD "$PWD" + end + function _powerline_tmux_set_columns --on-signal WINCH + _powerline_tmux_setenv COLUMNS (_powerline_columns) + end + _powerline_tmux_set_columns + _powerline_tmux_set_pwd + end + end + end +end +# vim: ft=fish diff --git a/powerline-bin/powerline/bindings/i3/__pycache__/powerline-i3.cpython-312.pyc b/powerline-bin/powerline/bindings/i3/__pycache__/powerline-i3.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d41e946d23b6b1c0fa4dd7501e6ab456a22194a GIT binary patch literal 2063 zcmZux-D?zA6u)=AcJ?cq&FAh$+l_{j)h1h6)EaChSSW%Gr5_JYkYTcOlgws5ws&R| z6Dh1TV1flxD5&j=kGAO_&_1@WeW+^|OhyZemDaaN1R*c&xs%K$6%Wk0_uM)6-1G4} z=l5hXhJccPJeWKxAoPR@Aw_mKTTP764WuI-o5;cnwm5~ec!jqFMZoNwGet!VR!Nay z<;{pCD{}BpFr!vXiCJ+a9>}7Zu#!qL*h^-cl~Pg|ap*&&M;4JTljJJD^RCiP(t31e z5Fz@b9#c9vL^_FB0r^#01^*c7@tF@mJN0@kJ)Q-fz)m~q&=Wr;SGnLCQW7LlIl8mo z&sTQ^@U>0pf%kj$RQMM28RYg?qBvj2fdT zvz%(_^nsKOrQlVm^6q{wclMxlkT4%xH%Z?D)RujER~YG@cVCz0xkAq~cDW$FXS;I9P+fQi|u4C3bq8e7!p`PDXrH1XPlQp~Sfx=h;`@(srJX7HO z^c3+_qokG{+a|$ZKLMg!n{dn2m>{4U{n(i!)HLisupHa*9C*CEKcwAyqAgbJ8;BqU z>qy~rtnfsr1c=?Q4po&P8s3keE48dIoNsOOI=2#$wU4HA;!?ne%za z23DTd>?z{ry=juy$)r{@y}ap6K8T5 z-2D?#RoyAWG4Ia1zT|p3q15l#wW)$l)%7URtRK)83t{_Q(X*<>s!<)-fY_F&}fP$e8T;Q_26=wYC6 zIkW&LI?wnXh&?$}e;p_)EFrH@Xfqf;FuKCVz-S&FM#qqg=QxZmfS>H-5`O{B;es%> zz`Z^G>|da5d=Zc!m;iTQ4En&2wyNVxJ6WS0@M=(er{?+Mq*-&P0i7b51<3h=u6Y{Z z1A2m`BA?IGURdcs$QbC|^T6upuSonk;`pA2yu38{_Vy=t(}RuJ z;GI$(+awQrGHyKz0=a~ z(^DX_ZgBqrw#j3RUrGpnj@Qs&aCt=_tgg;Co?y@?#wllC+pdD9J`Nm z4V-J@1CJ7^dgd{f?#h`a&Te37iC^qvi?Dd$v7ERj)w{L?f$MpmK#|Ovl&yDc;N;T8 z%F&y%P5joQNPHuexpujJWP_6z2iLhoec 1: + name = sys.argv[1] + + powerline = I3Powerline(name, renderer_module='i3bar') + powerline.update_renderer() + + interval = 0.5 + + print ('{"version": 1}') + print ('[') + print ('[]') + + lock = Lock() + + def render(event=None, data=None, sub=None): + global lock + with lock: + print (',[' + powerline.render()[:-1] + ']') + sys.stdout.flush() + + i3 = get_i3_connection() + i3_subscribe(i3, 'workspace', render) + + while True: + start_time = monotonic() + render() + time.sleep(max(interval - (monotonic() - start_time), 0.1)) diff --git a/powerline-bin/powerline/bindings/ipython/__init__.py b/powerline-bin/powerline/bindings/ipython/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/powerline-bin/powerline/bindings/ipython/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/bindings/ipython/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8741ddb5206f1a11a9749a8b005c9de96e6259ce GIT binary patch literal 171 zcmX@j%ge<81ia^Or-A6lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxd<)vSeTcBT%S)f~z zSd^YxqHAWFVNhURVX2>!nWSG(S(1^Tr(cj?o?4WXnU|`cl$n>3nU`Lyp9z(UkI&4@ nEQycTE2#X%VUwGmQks)$SHuc5nh}VLL5z>gjEsy$%s>_Za%wBR literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/ipython/__pycache__/post_0_11.cpython-312.pyc b/powerline-bin/powerline/bindings/ipython/__pycache__/post_0_11.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ac444bfdccfa09c2beb7a2fbdc17679b5fb7c8 GIT binary patch literal 5962 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/ipython/__pycache__/pre_0_11.cpython-312.pyc b/powerline-bin/powerline/bindings/ipython/__pycache__/pre_0_11.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3680e56ca7c49de1948727f4416326b9f1b8be41 GIT binary patch literal 8361 zcmb7JTW}lKc|Ln~aR&$xB0*53M2My?;8oNuc61qyZK;-=(u%F74aV&n!Y)Nnxb^HJ z5*adqTskD3rlu$35z{`@?R2K{$PeyQ^VI2MXZldWqzZT|cQO-aGJc~)*7fM6{r|HU zfDr69XMlgtp7WpU|NWP9_FqFGKY)Vy>*KayDNoGTrDXv1~z?r^|(m4h&OC!4R1`4G;hG zX-&Pxiusa`g*R3G1HtfIXLD2P9X&~n$dzkz`b@EKt$15yxokl-La(Z~8I1X=s+Dut z$gSzn`^}6cH~yg3%g!KV?h%!w1cjuiBET|4RZ{2@d0?@mTyr9&OI&VprdTe3*jN`7YS?*##elN?K<4Akvutj_xv{$n`IRs9PTy)@&3CBkJG4O$ zu{ab@CEd8#LOQR?vf-EId{HUqFdvlVKP{(oW)15BUc(DLmsFUbh>St$bvZQwmWD%A6T5w#u=eKCvf1HJm~>Dw;(FQ z1550z6IurCn#L1aIwLDMJC9vAN0Q={A!=&ra?)$~95@@DPFBvPH67r~#lgCvr4egX zYU<6r3RWTu8fbWC(pp;A85=?_Zz-+FIdxi3N*rbEFqE<*SmiI~6xqa;hO16MG6j#o zn2)#Yy`v}yPVM)BfTHZ{uM91X*ZW2*Lt8ZdC^2&XYHjpfb@be3;ye}|sE2!N;el#+ z0QiOUH_3ka#K)oaWPGPlBIkog`J=z1xHpcO@N7-VMJlEDbF4&XCfW*&jwq>P3~Miwv|Jx}iluXqLRukdJHADuk9^@Z>7M^x|E8~RgZ4eWJTElh%exPmueBx4qJYUt?U$zr3Po78gEy4o zXf5eO@qq=%*I^U@WJ5`spxOddY08igPS-&@eOb-I57_Rkq5`7Ida10-EPdMuTKU^q zMV~Q(dmtLjr**LTi~~05<(M?wOf4uXGxjxb?ex!%!rYDSMvY|-^*JzIV^|mBvXcwN zOfgqv&B|f1@_Dcp*|Je+JKx(XR|gk3tac3uSX$AueBtheni#K&@p?zJ)^ViTais1G z*Tehjo!#)Ob&gg$M|ozX+BvcvB2w=T@kp*Oz(`&|{I4im9f|jc9uA&2;Q$@)NgNIc z-FsxtbQmlFZze&@&ehZKqD}guYHK?+ERjydunpV0pCRcR=wR zrE-?+#7_bS5ROl1)X!oR(vlQvFIN$92fj8`ScjRI2{_TZwIsVY*dA%>b2O|^ z1pnv%0|_94{)LAF924x@@M^fU62z-UfIA{nr?}PR>i3jhA)ub}Ad}!ixWPnNX|Dn? z4d(FO;TrAznD(xJw@ME_q`eI*TJIaE^^H~g#%g^ht9>UwdU3PwxnB-e`@p#@Lo@U_ z|CgOb0dU3oPsqF{+#@n*` zUhNeiUscE>>e=$f*N3V!xkX1FMZ4FOd$-=bRf`>~#*W?ZswK}>lV>+$=W4O%tFh-d zV=rz-FM+ijs~;Wt`^CRmtPIs?yh`Ki`#+{brrm6g18~E*cz*&J5Ux`PTjhuss;tyb zAGzxkfxnF|ekeUagA7S=0f!?Vvkd7x0Bjzfwh%$1+*6m?aVRo8%sg>H@HGkV>;#fC zNKONJA|#S7hKg!NW#7Uax*SssExyVKrptO!wtAdD&}!1go2y@fUbL5i!1nuMYx=z( zz5AnD&uF!0v>uAqy&d&PZ#~jgi;PqwBilX_AKM{Pd~DlGCQp5&{A2zf^3~%neBqPg zmxLYS@=M#qB}#nnlfhO8@*Gb1Ss(^ws^Q7Nfi#;_83t_)zrtQahL8oOjGD{IGMsx5 zAw1N&Xu|3uHbR2^X=p^gS|at{0~FF>1ZfZ`EcaVX$PO@>ZgUD{@WVq`P!F9N}({Q6zG@>m#{7P9jM2KoGxAzx+3w{58 z&5Hs@;dW?KDB5;J)FN4J5xJ1JPocvnGSuxKzoQ@CTCk=*{mqRS+W>+!) zeI%&TT=h+hjz&Kznnu8FS`<@UsBDQncA)?1jcQneKLB>^5)j)G>|cMeN=LTnSUu3O z)>Z2~TJ1b~-(T%KSq+@596{4R{O0hQyGmnk4Z~ZFc705{*5Uo&ztb)ggPyO&pt%Z+ zCD1EffRi`IO%2Gqjs6#kh3V|gGE3jcsjc@%Q+rO|I2`_W{s;)- ze(&|p-t+eYSXbHBLZUl%R(J3X4j3X)MflK(a|Co~;?%r*yabmxr{St7Y@QI{++bd4 zz!4;p;S-jNKL9@mM-a^j>oY3cdo&7y7E39u&uAvz(=cU2!pk5K3ks7dNK_=#NVr`> zt-&*~-?c_+Msdl@dmJ&mJ5QL{lj<&?y2`4!)L4>8^q^6?h%LHSE}^*KgT!d z@rU%P>DX);LLUT&=NpVY!uG-y+^u6Uw@xq}HWHD~N_H%P+txS=E3}=%TW~hnc3N)= zcm)ARuv{^%%pbgTr=(_dRY|;Imb@{VxKY*uB={S3=UlG z=^}$uooz8_wqyiKX$DtNaK|ZY8mBpT3#R%nyI_rkYoIChrV%qYVRr z&2>fAUi#S8Ux$O)*}G@oI{%q(-$vJ|TG!cX*V$jbyxH~Artivzc;)GxMfmZZeHQi+ z?y2GAoD~*DMbx3fOw&}68qp!Vxpc?ePSa`eMe@hjKtTc0i_)S?Z$yi2O?F%3EZG-E zi*8C5Ah-Y}aoe}ai=L(c{&(ne!DIIzkUxJ_0;OyhcPehcP{dwq<7v+bE>rf|r3+4A zvp{9X$$)Blrpzz})!OiwCxS^kbHeaj=WcMAJi18+xL@XWi#r^{1NXUjQDx98*NlL9 zUBEAY4G+YTye6pLDHS!ldzCJXwt=@1NR?9It%) zlVE(kYyI|p|7P%H<;)||zjET8)2pXzf&OZse_eV1@M|UVp=LqM8M2)2c(#--Wmy2L4g)c~ zHoz?l+o;-WTH)S5lg8+}W$AYDkD)WmfPPA!fqN{xhTZHqSV`7h9UHFwbum~IyQ^aN zme})&H~dpyWr9nzO#p-QVn0EWK!SobqxcHukSxGo3j$dppM-iVy*rYNMomVn-XmVz zSX}N7e9a@vbXi=Mnoo1~mc31zom&=$_&eb*gtx`U4Zp)FtTwWM~vuS$*Hc_g%FyHE+xM(>;h@}78)tP1U- zf>oGUlT}At^JH(*n}YRS3hoNf=5bg7#L%dkhtfNc;}EM<%s|NK%%$P`B-|4+Xu$35 ze1bOy{VD?ZvL4^cy`b6ZW{f-k(> z(HUXe9$e!e3^j)SiY+1WA^9ni0Fb6{MPNJlcTt9#$FCQfZqCQyyXm;~0owfP;V#~o zg<#M8vNVWIE+WCxkLj$@mYV|L8<)UWN7=#Fn!)%5_8wHAK4?D#vMmaN@LO_ylU)Bb z@%@JM{DvI)l#G5#4*iy#|CAitb-RVZwIjO(9=p+g!Lv5IOW?74Atp#`Ki(zq*gfGD w2G$352|RXVROsL6N$wJO?)u}xk&S0g?h<(Jp79FNwKK>S-H8Q+aXz{K1?VHNvH$=8 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/ipython/__pycache__/since_5.cpython-312.pyc b/powerline-bin/powerline/bindings/ipython/__pycache__/since_5.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f18889a34364c2864d6d53b7bea445084454889c GIT binary patch literal 4458 zcmb_f+iw%u89#HgJ$8bf3xNbkh9p3o5+~svx=qt{6QZ8z>AQdHOA2wAhbrF5or>cKI-}=x{XN7l~RjCT9`o?ac-ELp{eRHuxU}>xN zNOR^~zw@2%`+b-5+xq%2fl~jwKV;s4)}OKC7r|?6`~(_HL?H^3B{?R^zsBVTc6vO+~%}{*=R17jO7}V z4Gdw)1)_vzi6W|X_c{0cWTP`0hS7)`s*W~I)y3=oic8|W9V_ZuI4}Txk8?r_O=4mbW_e0^|T2K;*8BvH3PrkC7RC_Oaq$2mHdQ? zQ?ZMerp&Rteknhx(yXSd_ZYjm+Hp5rHm9;`oVBCX@$aTawX|W^T^=i%N`6xRc0NCm zcCX{stk>D-hQ=I7S0zbCAxU5Of${aJMLkUCE)2e(FR2-$MuBcR{axSkFL6f2#a2MNRRiidHs+zPB zSfNc=HA7_!MzH_~#<0z6x@H0tc|*-+Y*s7K79193Ih{=zhAbN>2T78wuP*kRxk7(I zEA*Ku3S|3^9UU7e9KSi#pVdbC3l84;3qIibM>Jj0^iiW<^QJu36NM?-1~jMlz77}( z>XH@TEZubc- zFr}*D%>;n+9sW%1Ukdo=Fr>uM2D8>i_^Hdwv^i=jGXM`rRaSWGeNI521C)cB0%fRCRAF?P)Odnm9Fc26b!2Z~M6x`w{!cvi0U-mm3TnO^SvmVb)NFgT5B1|&5ALCh&A z!Ydx8yKtEUsbIm)TI_nm%QoaONH^>{gp-`p3^;Dop=bv@8Uwf)kw=}YpeK~R51<3s zojK#!3gl0o5lrv zZa%r%+P5YoDzUbQvAzefKI`N&p5vOIhDqYYD!XHi?R_jZ-8#E;@%F{Fj>Bu>kxHy_ zNxUs?M(d&3AzbwK&-s-rzqt0(Yd?#wi362}UDh|(V+X90kA�(gUHZ(tg-Fw8rgv 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 Nb{~z3U-e;_{|oGf0Hy!{ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/lemonbar/powerline-lemonbar.py b/powerline-bin/powerline/bindings/lemonbar/powerline-lemonbar.py new file mode 100644 index 0000000..7637254 --- /dev/null +++ b/powerline-bin/powerline/bindings/lemonbar/powerline-lemonbar.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import time +import re +import subprocess + +from threading import Lock, Timer + +from powerline.lemonbar import LemonbarPowerline +from powerline.commands.lemonbar import get_argparser +from powerline.bindings.wm import get_connected_xrandr_outputs + + +if __name__ == '__main__': + parser = get_argparser() + args = parser.parse_args() + + powerline = LemonbarPowerline() + powerline.update_renderer() + bars = [] + + for screen in get_connected_xrandr_outputs(powerline.pl): + command = [args.bar_command, '-g', '{0}x{1}+{2}'.format(screen['width'], args.height, screen['x'])] + args.args[1:] + process = subprocess.Popen(command, stdin=subprocess.PIPE) + bars.append((screen['name'], process, int(screen['width']) / 5)) + + lock = Lock() + modes = ['default'] + + def render(reschedule=False): + if reschedule: + Timer(args.interval, render, kwargs={'reschedule': True}).start() + + global lock + with lock: + for output, process, width in bars: + process.stdin.write(powerline.render(mode=modes[0], width=width, matcher_info=output).encode('utf-8') + b'\n') + process.stdin.flush() + + def update(evt): + modes[0] = evt.change + render() + + render(reschedule=True) + + if args.i3: + try: + import i3ipc + except ImportError: + import i3 + i3.Subscription(lambda evt, data, sub: render(), 'workspace') + else: + conn = i3ipc.Connection() + conn.on('workspace::focus', lambda conn, evt: render()) + conn.on('mode', lambda conn, evt: update(evt)) + conn.main() + + while True: + time.sleep(1e8) diff --git a/powerline-bin/powerline/bindings/pdb/__init__.py b/powerline-bin/powerline/bindings/pdb/__init__.py new file mode 100644 index 0000000..4033e61 --- /dev/null +++ b/powerline-bin/powerline/bindings/pdb/__init__.py @@ -0,0 +1,183 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import pdb + +from powerline.pdb import PDBPowerline +from powerline.lib.encoding import get_preferred_output_encoding +from powerline.lib.unicode import unicode + + +if sys.version_info < (3,): + # XXX The below classes make code compatible with PDBpp which uses pyrepl + # which does not expect unicode or something above ASCII. They are + # completely not needed if pdbpp is not used, but that’s not always the + # case. + class PowerlineRenderBytesResult(bytes): + def __new__(cls, s, encoding=None): + encoding = encoding or s.encoding + if isinstance(s, PowerlineRenderResult): + return s.encode(encoding) + self = bytes.__new__(cls, s.encode(encoding) if isinstance(s, unicode) else s) + self.encoding = encoding + return self + + for meth in ( + '__contains__', + 'partition', 'rpartition', + 'split', 'rsplit', + 'count', 'join', + ): + exec(( + 'def {0}(self, *args):\n' + ' if any((isinstance(arg, unicode) for arg in args)):\n' + ' return self.__unicode__().{0}(*args)\n' + ' else:\n' + ' return bytes.{0}(self, *args)' + ).format(meth)) + + for meth in ( + 'find', 'rfind', + 'index', 'rindex', + ): + exec(( + 'def {0}(self, *args):\n' + ' if any((isinstance(arg, unicode) for arg in args)):\n' + ' args = [arg.encode(self.encoding) if isinstance(arg, unicode) else arg for arg in args]\n' + ' return bytes.{0}(self, *args)' + ).format(meth)) + + def __len__(self): + return len(self.decode(self.encoding)) + + def __getitem__(self, *args): + return PowerlineRenderBytesResult(bytes.__getitem__(self, *args), encoding=self.encoding) + + def __getslice__(self, *args): + return PowerlineRenderBytesResult(bytes.__getslice__(self, *args), encoding=self.encoding) + + @staticmethod + def add(encoding, *args): + if any((isinstance(arg, unicode) for arg in args)): + return PowerlineRenderResult(''.join(( + arg + if isinstance(arg, unicode) + else arg.decode(encoding) + for arg in args + )), encoding) + else: + return PowerlineRenderBytesResult(b''.join(args), encoding=encoding) + + def __add__(self, other): + return self.add(self.encoding, self, other) + + def __radd__(self, other): + return self.add(self.encoding, other, self) + + def __unicode__(self): + return PowerlineRenderResult(self) + + class PowerlineRenderResult(unicode): + def __new__(cls, s, encoding=None): + encoding = ( + encoding + or getattr(s, 'encoding', None) + or get_preferred_output_encoding() + ) + if isinstance(s, unicode): + self = unicode.__new__(cls, s) + else: + self = unicode.__new__(cls, s, encoding, 'replace') + self.encoding = encoding + return self + + def __str__(self): + return PowerlineRenderBytesResult(self) + + def __getitem__(self, *args): + return PowerlineRenderResult(unicode.__getitem__(self, *args)) + + def __getslice__(self, *args): + return PowerlineRenderResult(unicode.__getslice__(self, *args)) + + @staticmethod + def add(encoding, *args): + return PowerlineRenderResult(''.join(( + arg + if isinstance(arg, unicode) + else arg.decode(encoding) + for arg in args + )), encoding) + + def __add__(self, other): + return self.add(self.encoding, self, other) + + def __radd__(self, other): + return self.add(self.encoding, other, self) + + def encode(self, *args, **kwargs): + return PowerlineRenderBytesResult(unicode.encode(self, *args, **kwargs), args[0]) +else: + PowerlineRenderResult = str + + +def use_powerline_prompt(cls): + '''Decorator that installs powerline prompt to the class + + :param pdb.Pdb cls: + Class that should be decorated. + + :return: + ``cls`` argument or a class derived from it. Latter is used to turn + old-style classes into new-style classes. + ''' + @property + def prompt(self): + try: + powerline = self.powerline + except AttributeError: + powerline = PDBPowerline() + powerline.setup(self) + self.powerline = powerline + return PowerlineRenderResult(powerline.render(side='left')) + + @prompt.setter + def prompt(self, _): + pass + + @prompt.deleter + def prompt(self): + pass + + if not hasattr(cls, '__class__'): + # Old-style class: make it new-style or @property will not work. + old_cls = cls + + class cls(cls, object): + __module__ = cls.__module__ + __doc__ = cls.__doc__ + + cls.__name__ = old_cls.__name__ + + cls.prompt = prompt + + return cls + + +def main(): + '''Run module as a script + + Uses :py:func:`pdb.main` function directly, but prior to that it mocks + :py:class:`pdb.Pdb` class with powerline-specific class instance. + ''' + orig_pdb = pdb.Pdb + + @use_powerline_prompt + class Pdb(pdb.Pdb, object): + def __init__(self): + orig_pdb.__init__(self) + + pdb.Pdb = Pdb + + return pdb.main() diff --git a/powerline-bin/powerline/bindings/pdb/__main__.py b/powerline-bin/powerline/bindings/pdb/__main__.py new file mode 100644 index 0000000..768b2f2 --- /dev/null +++ b/powerline-bin/powerline/bindings/pdb/__main__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.bindings.pdb import main + + +if __name__ == '__main__': + main() diff --git a/powerline-bin/powerline/bindings/pdb/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/bindings/pdb/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b683ce47d61e2bc5f54f43f005b9fee4aa95b10 GIT binary patch literal 9392 zcmc&)TWl0pnm$$4*Xs7&;bKB4f(>pDw%NrAgyD{7U@|i(AtWK4kj8YCahrB`=Ttdh zkI6PO)OVI-tswL1?h8QPgic-rqj z)m7bX3}m8cwxmAi)VZJk{Fm?ltN*>GMrC+vKKpI|TaAqUo?hI?Un&$oM&S(8nJ%T- zkQA4O}hyugDDFMag+} zbBVpV%*S+p)!4wFH5QbP2lWurkPiCB!-lG>@zaD!FP^WhPlr$htt;HWa-+(96_Y?Uc80m3>%Y=OD33LOd1r;)yWCj^2Uxymd|ay z2-cv7H((siIPV#gU6MSFULigqxO$QZ{G2_DA87ksvo1n){F zufwbDGmUh=NtDs>-2HC1HI(blrE;BC9|wbWKKaDJy4;52Pj#nLhr4ql)<8DXopZUk z`*12l%xZS$^uyhWL@JZA5{a(d2ye!OqmR$qUd5$$mG%TZ!OS?4JiA`I=xS~2*_H2i zyw{Q6cq33h*)Y=_n+bGWk3=Un7B)`qnT{-<@-4ri)=hL4I?pP<+H|?^-xklT|K8bW z-#_r)fpY^h%ey~$ZCZUc-*dfbS-xj{%XPIj|Lr1XXCPrTkw|7URv)OBNZ8?AAGcB@ zo3_f!Wxtt&c-sN)6d}G7|!jQ3C!U>AA8ycx<%fL zvymQ%`8eq=-h{-CBoYvPSh*o64Qjn03j)|ax_pzAr{>UsccDDG`hjxpP4y)DnyZiy z9a=wp{#x6USK6MuWKFg0x~yMq+x3b5+0ds$GwLf-$}9g*1mSD3y((HjYv2H8I+Zj^ z#Ngd@j!Gi@H7Z8eJd6mXIi8}?RaDq;rESAy-&9-gW$S8N?8*4Ya2X~hlQ4R1bTWQ^lEzIF7k9&k^6y56-polOGVZSC@g zY{l&6VkG~=zR0tyYR`G)%}tZZpKrJpS#?G2`BGTVAGbUz+0`QK9aG2HcO~zjYaV`3 zE{{o>dVrG!s9f;CNr@b>Dso&<%H-hfSQ!;hAmb!{LYhs|k(!nlnv8G2%hw>vHViX2 zBKbm4Qgw(Bw5xN9RS&pPx6}9UcZ|04&6UTfq(0GB+zr|CN{fmumioCE zKyp|xMw_Ij62rkRdN}PNM$hZFm*ybvi;UiibG~V{ZAxi#cwXR*IvYpN^bNth*lHp% zl+}mRREFVsZMZM(vq zda1{5N(e4pV9wga1CGfj86$}^{|?DGE6M?-ZnoZE=extAN>g6H9c8}ItnBlz{*%fA z(UUKn?)}LtpVtI@O|v!VF#D)NUBjYlNOV>FZGQ@tyGH!z8b*gZizKDvPC!x)N|e4T z%?6mS{-rbcF}3x*jlmOP}sT>eu~9 z14d8}RCuBxiVDQT!dF#=uNr|T8WA^N?Q#-`5{&a7VkO~nE|n@_r=-LCcKI9*DIyeQ zo9p_%a7I0C4rkPZX0CDLi_7+PFyx)nD~!RqyM0e6nI#YJJtph&MN+ePO0H#j2XHN8 z%3h&c>>xLC>As{93)n%Roj%LroOV!QNywpd^zb7nc@CpvLxi`te4gAo&Zz6??W0kL zk>uG;U-S->{cCOnYfry6*>P5%4z9YRpyF1rbvn3uHpqO@Ih6$)CL7+_Jrj8JMx=3K zTVdPT_2;DN$m1t_ZA!E4(3E86-?y;Iuu%RN`M?bGUxDP_lB{7j_Y?gPE&#~D1%D-;>G-U zT^Rtx3)KVSMH&F{d=1XkyG8}$zhNx5Fzn&ISm^#bMF67L(1m}85)mZ$rndN1k(q!F z_rPpV#2nCO(e}s?-z!1nGZKC;5)%44sxE~f?}yS`2y5sPp%&K$!hXqnIgul#I7mk5 zzDB2lK%Q_J?7-1uB5Xk>Tyx_V)NAz7g}KOyY8^ul6Rw(2gRLLF_|dB$yb2}Q_B51W z+ta^B=;G;5dZ(V<_v!9wb^nyIU!2@=NTZzaDJPY|e@KZio(HHzI#?hz{w$RQyeA%T z02=Lz@1umS+Oe&|8KQ&+m?R&B(IQISofb*?7Qv*Q0!{65(NsWbD1j-I?$lRespm`1 z7EM>Bcsz)69W6r5A$J}MD|iqFm#~oU0?1X}$LEeN=Lj%V^eKav0@Ho&m6~k@c0#6) zGeV8}$3uFcP!WN5!OTy=5`$`aZnsomi88>E@aBQ60(`1iaP)tB5!K^;76P)?K%a$( zEbwwVZE86;q^;$6b|`0QRu(-BEt&2!O;rtVLWsC;NJE&r>lytps!fW@?xI#_CUYP= zoYu9&hDL!yEMe$fG|mb0Qs+a5FzV1Dihd3c85v8XsIapD#_-hZhOYHvaV=$aX+Ho4 zGdSX?+OUaw+6_gEF-Jh_lmzla)yP;Id$n) zks|~{Vk911cEl~0b6xt_i$Ih?$SPJ2*R(R;1_bO~MHTyyKA88E9WeTkGsXx-InPV% z%{|B1apfg;OoGLQ{ zhl?*uur5M37-+BZKm*RrkG6v132$C}p(B1M8$0Ly6pelXNuJI6{K{k3>zXFsD7=w> z3cyueadza|itZ~bx-Y#jwW51^#pdbomMMA57jt2zF1f=L<*^%e%YKH=*Oln0Z6~)) z_RJ_tt~W2w_x$bF*&v$lnxrv*9F4IH-`cTQ`Iki!(qyIPN3(OABxz?54ilP3=#J6> zZ7ETCJf1?wuXeV#(X&XG2dFLw?$zjMx!>CJar2+C>bsbgrzs)bXNU2%hNKG_UcJXf z^~Ig2dRHp@eJ`?03x-wVl4$W1fj1M2EAaQ^yDJ}j-H_S62nbgzbPBoX*<>OSllUUc zD1ro~cpAO)9Fl*a26C3Z7-zq!Z#q-^c5QysZ))l%UM{?Ra)YDcsWW}u15@P;ZjIOh zFf0V$4(dkQ5QTw0ll(C|kUczTBrRtrbeXVvVl67$L8t`~%oGUjP|3>K%?q84AIE?b z_?ah>04B{fGbM6c4$50$H+zdtX zEe?NSC*DJnEBtNJRHtyqgf5(CA>;GYiVwTObV!J1OE4YsgU3~P;3aeA=_%;O^4NsS za}^%{LjJisn*8d~U+f#sXih9g>ocL}%_L9dELeo+O{nZmxsgru-+)br$f6A4o8%$Q z{jY$gr#LP;J+fAVHiJD%k+mXoL)c)vsq6cT|jf9{i%Wsdy*4QgV3Tfqi7 zm4$5a*HJ>S4rIbHM75Zg2&`>)P#uXLr{p|-CMh!##3+M$*j?D2Uvf)c^ha5im%X`u zVnboWJKrrbypR|!o~3HYQ?zcpX?*dmP-G%h2>nc*k{ZR9V$Bpq>>mbPpbu7b8=Tmi zlS1dD25rS0F?pU!HJ+L4q7w*{xu{%+PyXI#T@eqmAE|CEMLET%7d!eo;?nq@jyphX zl32h&<#Z2N6Cov1JmS#vFz(&ZW=B-E@&dXL{mqw<%qo&3{Wse`&G!GEslR3Ff3elS zW7~hnViY(GUQ?Q`C{2_4Ri$N4-72p>*EYwH&25+0$j?h>U;La=KD$q1Ez75*MRx-2 OQndJjR3|kFO8p1KJ?Ulo-(}C`y9q!_yB8Y>7qmwROLVL;G1)DUasakizf8cKre~N>k zgBV9~a67m`xXBdm{2=f5y~&#=d5+^Qa23CNj^17WYR$5|#V|W@!vmmz!U71GLgA&J z@Kax)6v1}iD*_RwAq1>L{mUHybmRdRJ}m$cG^jyI@YDJP+4WlTVM!S&xM4agDjQLL z#VcM)yO!luS=5FRE>x+FT~(S(Lq@e68W%{QMIz(UMufDTkh3JRUE%_!){GGCyGJx? zC1@pdVtcB*X1d^#4RS6im*Z-nXs$c$p(DvmxT}v~<~*36Vj~n*T=h++$ISHi_a?jQ z;N}n)JjbdrlTzY;B3=@)BjV++2CA7yN1~*4!H)Hs!$P;JEhkeSLiig3cmdzQ`8U{} Xh5)VH-@f`AA27J!nWSG(S(1^Tr(cj?o?4WXnU|`cl$n>3nU`LyUs#fvld2yd qpP83g5+AQuQ2C3)CO1E&G$+-rh!tosBM=vZ7$2D#85xV1fh+(8y(-TD literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/qtile/__pycache__/widget.cpython-312.pyc b/powerline-bin/powerline/bindings/qtile/__pycache__/widget.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..334316d142a648a9016c180ba7dff7f4cf8c9655 GIT binary patch literal 3334 zcmZ`*O>7&-6`q-0F3FWh$r5c@NgV%Bb;KwV+d8r1w2qtFbq+Oz22l>#6kSl9rL^pF z$;>VzQD6cQP$8#48~0GCry_?QBsf5P%(16ldZ=Z~5V1*t0!0wyCRh#{7?cx( zak@qfrNMGakbYy%cC3T1S#9QOsxT7s+ykV*J~?dhb^Az2nOJXUJ}SEX^)&(&HiqBAB~-bs3%O*EmSPi40O}1 zRC(RO`JidOTQ4}FL|}xrh!};JIEDoENrIsA;y~8OKBH_b+=JpnvF;-5CP>x~MVm8A z;R;tvv0J1>0Xs=UNQJ84tb!VZQ!Xjc!XS?FYTXZ1AAcJIu1?Hq)^bf#%Hu`F53j!QwlKlYg1m zW|Nzl&H6UG`k8j0U2UgFRwveS?eWR`;}1^-7JHC%ppGe{{XTl<9@NP95@ng;te!tzOIxf5*ztk9e~JC~y}Ei19QUz&ay@SumOsSAsT>Cr;W z$ZdgUxma*T4%7t7d_e>%7loxQD)a8iBP8<{Xd!l1#*U;e6g&kQyz4-qz$8;2o&Npl zww{JmedK=V?xwTb>Fj3a)A6nGd+F?h^o8B@E8FQ;KD+cFeNE<)Y3q}%$@S^h^jaQ1 zmqn!58}@Fx&ciQcx_XldJRD8h2__yLfd>!b@glyMbV&Lc72nV;y;$L9Hm}QuJpE2HyELgB38~{H2rf&cjwe^iBL%vhuFbhz^7{F2$ zn7CjdDkNrsb6GlMc8&xlT&{M6R1FhbVfyhAYCePkao^3ySZuP|-<>|H( z-&IDpmC@VRcQcdQnaRzGPp7t~9x502Vnja|hO5`r1n80BdI7R1`vNe+ai}jq?|_QW z4%~cl7|N)xZwT7JS|hJwhehRXpE%&dPQ+Z_0Pb)f3zope;@LNVo9Sc061XRhayf-s z6;-f9U5=Eoo%D^K%0qGrR-QnMx>HJ=gUw+N(#>uG3N)wCfG#4gfHcss&{!hSv86-; zS%&mdRagt6T6cM%ma48FB#?UciWPtiW{U-0T@pV5Er2W8pkneyBz}ayeF2DvScS$D zHJw*swQ}@$ADAY;@nP4Yw)6bvOLwz7>|#5XTz{wa&Tee%er)VNO0qqi*%gl}{IriK>i62v;-c9Wd6Tl`L*=8dTSw;deHy|)k z;y4maj=)Qm$RfcCCN3g*83{Tr(4`<1wc4WPIHn1;PWpi*=x1TK#k|QpV3a)6^X(eh z)5xi3KfZof|NGcI<2TG|EOFX$rgaKRv~c?-3x|O zsqRBVF-?J|MPRH2_CtZ-2?pWrD$_9o{X}{Z40T!IomJq;knKodPYiF9($+CtcCVS= zC4L%SNM9Ad1OYlGo!C<-rC*V`2W0L`lKnTyeo0P0))*bT{q|!5ugCiH^!V+i#{^z` NzosO0s+E*l{}1cWzT^M^ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/qtile/widget.py b/powerline-bin/powerline/bindings/qtile/widget.py new file mode 100644 index 0000000..92e3a27 --- /dev/null +++ b/powerline-bin/powerline/bindings/qtile/widget.py @@ -0,0 +1,61 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from libqtile.bar import CALCULATED +from libqtile.widget import TextBox + +from powerline import Powerline + + +class QTilePowerline(Powerline): + def do_setup(self, obj): + obj.powerline = self + + +class PowerlineTextBox(TextBox): + # TODO Replace timeout argument with update_interval argument in next major + # release. + def __init__(self, timeout=2, text=b' ', width=CALCULATED, side='right', update_interval=None, **config): + super(PowerlineTextBox, self).__init__(text, width, **config) + self.side = side + self.update_interval = update_interval or timeout + self.did_run_timer_setup = False + powerline = QTilePowerline(ext='wm', renderer_module='pango_markup') + powerline.setup(self) + + def update(self): + if not self.configured: + return True + self.text = self.powerline.render(side=self.side).encode('utf-8') + self.bar.draw() + return True + + def cmd_update(self, text): + self.update(text) + + def cmd_get(self): + return self.text + + def timer_setup(self): + if not self.did_run_timer_setup: + self.did_run_timer_setup = True + self.timeout_add(self.update_interval, self.update) + + def _configure(self, qtile, bar): + super(PowerlineTextBox, self)._configure(qtile, bar) + if self.layout.markup: + # QTile-0.9.1: no need to recreate layout or run timer_setup + return + self.layout = self.drawer.textlayout( + self.text, + self.foreground, + self.font, + self.fontsize, + self.fontshadow, + markup=True, + ) + self.timer_setup() + + +# TODO: Remove this at next major release +Powerline = PowerlineTextBox diff --git a/powerline-bin/powerline/bindings/rc/powerline.rc b/powerline-bin/powerline/bindings/rc/powerline.rc new file mode 100644 index 0000000..b2d6538 --- /dev/null +++ b/powerline-bin/powerline/bindings/rc/powerline.rc @@ -0,0 +1,92 @@ +fn _powerline_sigwinch { + _POWERLINE_COLUMNS = `{ + stty size | cut -d' ' -f2 + } + _powerline_tmux_setenv COLUMNS $_POWERLINE_COLUMNS +} +fn _powerline_update_pwd { + _POWERLINE_NEW_PWD = `{pwd} + if (test $^_POWERLINE_NEW_PWD '=' $^_POWERLINE_SAVED_PWD) { + _POWERLINE_SAVED_PWD = $_POWERLINE_NEW_PWD + _powerline_tmux_setenv PWD $_POWERLINE_SAVED_PWD + } +} +fn _powerline_continuation_prompt { + _powerline_prompt --renderer-arg 'local_theme=continuation' $* +} +fn _powerline_prompt { + $POWERLINE_COMMAND $POWERLINE_COMMAND_ARGS shell aboveleft -r.readline --last-pipe-status $^_POWERLINE_STATUS --last-exit-code $_POWERLINE_STATUS($#_POWERLINE_STATUS) --jobnum $_POWERLINE_JOBNUM --renderer-arg 'client_id='$pid $* +} +fn _powerline_set_prompt { + _POWERLINE_STATUS = ( $status ) + _POWERLINE_JOBNUM = $#apids + prompt = (``() { + _powerline_prompt + } ``() { + _powerline_continuation_prompt + }) + _powerline_update_pwd +} + +fn _powerline_common_setup { + fn sigwinch { + _powerline_sigwinch + } + _powerline_sigwinch + _POWERLINE_SAVED_PWD = '' +} + +fn _powerline_tmux_pane { + if (test -n $TMUX_PANE) { + echo $TMUX_PANE | tr -d ' %' + } else { + TMUX=$_POWERLINE_TMUX tmux display -p '#D' | tr -d ' %' + } +} + +fn _powerline_tmux_setenv { +} + +if (test -z $POWERLINE_CONFIG_COMMAND) { + if (which powerline-config >/dev/null) { + POWERLINE_CONFIG_COMMAND = powerline-config + } else { + echo powerline-config executable not found, unable to proceed >[2=1] + } +} +if (test -n $POWERLINE_CONFIG_COMMAND) { + if ($POWERLINE_CONFIG_COMMAND shell --shell rcsh uses prompt) { + if (test -n $POWERLINE_COMMAND_ARGS) { + # Perform splitting + POWERLINE_COMMAND_ARGS=( `{echo $POWERLINE_COMMAND_ARGS} ) + } + fn prompt { + _powerline_set_prompt + } + if (test -z $POWERLINE_SHELL_CONTINUATION$POWERLINE_RCSH_CONTINUATION) { + _POWERLINE_STATUS = 0 + _POWERLINE_JOBNUM = 0 + _POWERLINE_CONTINUATION = `{ + _powerline_continuation_prompt + } + fn _powerline_continuation_prompt { + echo -n $_POWERLINE_CONTINUATION + } + } + _powerline_common_setup + } + if (test -n $TMUX) { + if ($POWERLINE_CONFIG_COMMAND shell --shell rcsh uses tmux) { + _POWERLINE_TMUX=$TMUX + fn _powerline_tmux_setenv { + if (test -n $2) { + TMUX=$_POWERLINE_TMUX tmux setenv -g TMUX_$1^_`{ + _powerline_tmux_pane + } $2 + } + } + _powerline_common_setup + } + } +} +# vim: ft=rcshell diff --git a/powerline-bin/powerline/bindings/shell/powerline.sh b/powerline-bin/powerline/bindings/shell/powerline.sh new file mode 100644 index 0000000..15e13f2 --- /dev/null +++ b/powerline-bin/powerline/bindings/shell/powerline.sh @@ -0,0 +1,239 @@ +_POWERLINE_SOURCED="$_" +_powerline_columns_fallback() { + if which stty >/dev/null ; then + # Ksh does not have “local” built-in + _powerline_cols="$(stty size 2>/dev/null)" + if ! test -z "$_powerline_cols" ; then + echo "${_powerline_cols#* }" + return 0 + fi + fi + echo 0 + return 0 +} + +_powerline_has_jobs_in_subshell() { + if test -n "$_POWERLINE_HAS_JOBS_IN_SUBSHELL" ; then + return $_POWERLINE_HAS_JOBS_IN_SUBSHELL + elif test -z "$1" ; then + sleep 1 & + # Check whether shell outputs anything in a subshell when using jobs + # built-in. Shells like dash will not output anything meaning that + # I have to bother with temporary files. + test "$(jobs -p|wc -l)" -gt 0 + else + case "$1" in + dash|bb|ash) return 1 ;; + mksh|ksh|bash) return 0 ;; + *) _powerline_has_jobs_in_subshell ;; + esac + fi + _POWERLINE_HAS_JOBS_IN_SUBSHELL=$? + return $_POWERLINE_HAS_JOBS_IN_SUBSHELL +} + +_powerline_set_append_trap() { + if _powerline_has_jobs_in_subshell "$@" ; then + _powerline_append_trap() { + # Arguments: command, signal + # Ksh does not have “local” built-in + _powerline_traps="$(trap)" + if echo "$_powerline_traps" | grep -cm1 $2'$' >/dev/null ; then + _powerline_traps="$(echo "$_powerline_traps" | sed "s/ $2/'\\n$1' $2/")" + eval "$_powerline_traps" + else + trap "$1" $2 + fi + } + else + _powerline_append_trap() { + # Arguments: command, signal + _powerline_create_temp + trap > $_POWERLINE_TEMP + if grep -cm1 $2'$' $_POWERLINE_TEMP >/dev/null ; then + sed -i -e "s/ $2/'\\n$1' $2/" + . $_POWERLINE_TEMP + else + trap "$1" $2 + fi + echo -n > $_POWERLINE_TEMP + } + fi + _powerline_set_append_trap() { + return 0 + } +} + +_powerline_create_temp() { + if test -z "$_POWERLINE_TEMP" || ! test -e "$_POWERLINE_TEMP" ; then + _POWERLINE_TEMP="$(mktemp "${TMPDIR:-/tmp}/powerline.XXXXXXXX")" + _powerline_append_trap 'rm $_POWERLINE_TEMP' EXIT + fi +} + +_powerline_set_set_jobs() { + if _powerline_has_jobs_in_subshell "$@" ; then + _powerline_set_jobs() { + _POWERLINE_JOBS="$(jobs -p|wc -l|tr -d ' ')" + } + else + _powerline_set_append_trap "$@" + _POWERLINE_PID=$$ + _powerline_append_trap '_powerline_do_set_jobs' USR1 + _powerline_do_set_jobs() { + _powerline_create_temp + jobs -p > $_POWERLINE_TEMP + } + # This command will always be launched from a subshell, thus a hack is + # needed to run `jobs -p` outside of the subshell. + _powerline_set_jobs() { + kill -USR1 $_POWERLINE_PID + # Note: most likely this will read data from the previous run. Tests + # show that it is OK for some reasons. + _POWERLINE_JOBS="$(wc -l < $_POWERLINE_TEMP | tr -d ' ')" + } + fi + _powerline_set_set_jobs() { + return 0 + } +} + +_powerline_set_command() { + if test -z "${POWERLINE_COMMAND}" ; then + POWERLINE_COMMAND="$("$POWERLINE_CONFIG_COMMAND" shell command)" + fi +} + +_powerline_tmux_pane() { + echo "${TMUX_PANE:-`TMUX="$_POWERLINE_TMUX" tmux display -p "#D"`}" | \ + tr -d ' %' +} + +_powerline_tmux_setenv() { + TMUX="$_POWERLINE_TMUX" tmux setenv -g TMUX_"$1"_`_powerline_tmux_pane` "$2" + TMUX="$_POWERLINE_TMUX" tmux refresh -S +} + +_powerline_tmux_set_pwd() { + if test "$_POWERLINE_SAVED_PWD" != "$PWD" ; then + _POWERLINE_SAVED_PWD="$PWD" + _powerline_tmux_setenv PWD "$PWD" + fi +} + +_powerline_tmux_set_columns() { + _powerline_tmux_setenv COLUMNS "${COLUMNS:-$(_powerline_columns_fallback)}" +} + +_powerline_set_renderer_arg() { + case "$1" in + bb|ash) _POWERLINE_RENDERER_ARG="-r .bash" ;; + mksh|ksh) _POWERLINE_RENDERER_ARG="-r .ksh" ;; + bash|dash) _POWERLINE_RENDERER_ARG= ;; + esac +} + +_powerline_set_jobs() { + _powerline_set_set_jobs + _powerline_set_jobs +} + +_powerline_local_prompt() { + # Arguments: side, exit_code, local theme + _powerline_set_jobs + "$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \ + $_POWERLINE_RENDERER_ARG \ + --renderer-arg="client_id=$$" \ + --last-exit-code=$2 \ + --jobnum=$_POWERLINE_JOBS \ + --renderer-arg="local_theme=$3" +} + +_powerline_prompt() { + # Arguments: side, exit_code + _powerline_set_jobs + "$POWERLINE_COMMAND" $POWERLINE_COMMAND_ARGS shell $1 \ + --width="${COLUMNS:-$(_powerline_columns_fallback)}" \ + $_POWERLINE_RENDERER_ARG \ + --renderer-arg="client_id=$$" \ + --last-exit-code=$2 \ + --jobnum=$_POWERLINE_JOBS + _powerline_update_psN +} + +_powerline_setup_psN() { + case "$1" in + mksh|ksh|bash) + _POWERLINE_PID=$$ + _powerline_update_psN() { + kill -USR1 $_POWERLINE_PID + } + # No command substitution in PS2 and PS3 + _powerline_set_psN() { + if test -n "$POWERLINE_SHELL_CONTINUATION" ; then + PS2="$(_powerline_local_prompt left $? continuation)" + fi + if test -n "$POWERLINE_SHELL_SELECT" ; then + PS3="$(_powerline_local_prompt left $? select)" + fi + } + _powerline_append_trap '_powerline_set_psN' USR1 + _powerline_set_psN + ;; + bb|ash|dash) + _powerline_update_psN() { + # Do nothing + return + } + PS2='$(_powerline_local_prompt left $? continuation)' + # No select support + ;; + esac +} + +_powerline_setup_prompt() { + VIRTUAL_ENV_DISABLE_PROMPT=1 + _powerline_set_append_trap "$@" + _powerline_set_set_jobs "$@" + _powerline_set_command "$@" + _powerline_set_renderer_arg "$@" + PS1='$(_powerline_prompt aboveleft $?)' + PS2="$(_powerline_local_prompt left 0 continuation)" + PS3="$(_powerline_local_prompt left 0 select)" + _powerline_setup_psN "$@" +} + +_powerline_init_tmux_support() { + # Dash does not have &>/dev/null + if test -n "$TMUX" && tmux refresh -S >/dev/null 2>/dev/null ; then + # TMUX variable may be unset to create new tmux session inside this one + _POWERLINE_TMUX="$TMUX" + + _powerline_set_append_trap "$@" + + # If _powerline_tmux_set_pwd is used before _powerline_prompt it sets $? + # to zero in ksh. + PS1="$PS1"'$(_powerline_tmux_set_pwd)' + _powerline_append_trap '_powerline_tmux_set_columns' WINCH + _powerline_tmux_set_columns + fi +} + +if test -z "${POWERLINE_CONFIG_COMMAND}" ; then + if which powerline-config >/dev/null ; then + POWERLINE_CONFIG_COMMAND=powerline-config + else + POWERLINE_CONFIG_COMMAND="$(dirname "$_POWERLINE_SOURCED")/../../../scripts/powerline-config" + fi +fi + +# Strips the leading `-`: it may be present when shell is a login shell +_POWERLINE_USED_SHELL=${0#-} +_POWERLINE_USED_SHELL=${_POWERLINE_USED_SHELL##*/} + +if "${POWERLINE_CONFIG_COMMAND}" shell uses tmux ; then + _powerline_init_tmux_support $_POWERLINE_USED_SHELL +fi +if "${POWERLINE_CONFIG_COMMAND}" shell --shell=bash uses prompt ; then + _powerline_setup_prompt $_POWERLINE_USED_SHELL +fi diff --git a/powerline-bin/powerline/bindings/tcsh/powerline.tcsh b/powerline-bin/powerline/bindings/tcsh/powerline.tcsh new file mode 100644 index 0000000..4897b4c --- /dev/null +++ b/powerline-bin/powerline/bindings/tcsh/powerline.tcsh @@ -0,0 +1,60 @@ +# http://unix.stackexchange.com/questions/4650/determining-path-to-sourced-shell-script: +# > In tcsh, $_ at the beginning of the script will contain the location if the +# > file was sourced and $0 contains it if it was run. +# +# Guess this relies on `$_` being set as to last argument to previous command +# which must be `.` or `source` in this case +set POWERLINE_SOURCED=($_) +if ! $?POWERLINE_CONFIG_COMMAND then + if ( { which powerline-config > /dev/null } ) then + set POWERLINE_CONFIG_COMMAND="powerline-config" + else + set POWERLINE_CONFIG_COMMAND="$POWERLINE_SOURCED[2]:h:h:h:h/scripts/powerline-config" + endif +else + if "$POWERLINE_CONFIG_COMMAND" == "" then + if ( { which powerline-config > /dev/null } ) then + set POWERLINE_CONFIG_COMMAND="powerline-config" + else + set POWERLINE_CONFIG_COMMAND="$POWERLINE_SOURCED[2]:h:h:h:h/scripts/powerline-config" + endif + endif +endif +if ( { $POWERLINE_CONFIG_COMMAND shell --shell=tcsh uses tmux } ) then + if ( $?TMUX_PANE ) then + if ( "$TMUX_PANE" == "" ) then + set _POWERLINE_TMUX_PANE="`tmux display -p '#D'`" + else + set _POWERLINE_TMUX_PANE="$TMUX_PANE" + endif + else + set _POWERLINE_TMUX_PANE="`tmux display -p '#D'`" + endif + set _POWERLINE_TMUX_PANE="`echo $_POWERLINE_TMUX_PANE:q | tr -d '% '`" + alias _powerline_tmux_set_pwd 'if ( $?TMUX && { tmux refresh -S >&/dev/null } ) tmux setenv -g TMUX_PWD_$_POWERLINE_TMUX_PANE $PWD:q ; if ( $?TMUX ) tmux refresh -S >&/dev/null' + alias cwdcmd "`alias cwdcmd` ; _powerline_tmux_set_pwd" +endif +if ( { $POWERLINE_CONFIG_COMMAND shell --shell=tcsh uses prompt } ) then + if ! $?POWERLINE_COMMAND then + set POWERLINE_COMMAND="`$POWERLINE_CONFIG_COMMAND:q shell command`" + else + if "$POWERLINE_COMMAND" == "" then + set POWERLINE_COMMAND="`$POWERLINE_CONFIG_COMMAND:q shell command`" + endif + endif + if ! $?POWERLINE_COMMAND_ARGS then + set POWERLINE_COMMAND_ARGS="" + endif + + if ( $?POWERLINE_NO_TCSH_ABOVE || $?POWERLINE_NO_SHELL_ABOVE ) then + alias _powerline_above true + else + alias _powerline_above '$POWERLINE_COMMAND:q $POWERLINE_COMMAND_ARGS shell above --renderer-arg=client_id=$$ --last-exit-code=$POWERLINE_STATUS --width=$POWERLINE_COLUMNS' + endif + + alias _powerline_set_prompt 'set prompt="`$POWERLINE_COMMAND:q $POWERLINE_COMMAND_ARGS shell left -r .tcsh --renderer-arg=client_id=$$ --last-exit-code=$POWERLINE_STATUS --width=$POWERLINE_COLUMNS`"' + alias _powerline_set_rprompt 'set rprompt="`$POWERLINE_COMMAND:q $POWERLINE_COMMAND_ARGS shell right -r .tcsh --renderer-arg=client_id=$$ --last-exit-code=$POWERLINE_STATUS --width=$POWERLINE_COLUMNS`"' + alias _powerline_set_columns 'set POWERLINE_COLUMNS=`stty size|cut -d" " -f2` ; set POWERLINE_COLUMNS=`expr $POWERLINE_COLUMNS - 2`' + + alias precmd 'set POWERLINE_STATUS=$? ; '"`alias precmd`"' ; _powerline_set_columns ; _powerline_above ; _powerline_set_prompt ; _powerline_set_rprompt' +endif diff --git a/powerline-bin/powerline/bindings/tmux/__init__.py b/powerline-bin/powerline/bindings/tmux/__init__.py new file mode 100644 index 0000000..011cd68 --- /dev/null +++ b/powerline-bin/powerline/bindings/tmux/__init__.py @@ -0,0 +1,84 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import re +import os +import subprocess + +from collections import namedtuple + +from powerline.lib.shell import run_cmd + + +TmuxVersionInfo = namedtuple('TmuxVersionInfo', ('major', 'minor', 'suffix')) + + +def get_tmux_executable_name(): + '''Returns tmux executable name + + It should be defined in POWERLINE_TMUX_EXE environment variable, otherwise + it is simply “tmux”. + ''' + + return os.environ.get('POWERLINE_TMUX_EXE', 'tmux') + + +def _run_tmux(runner, args): + return runner([get_tmux_executable_name()] + list(args)) + + +def run_tmux_command(*args): + '''Run tmux command, ignoring the output''' + _run_tmux(subprocess.check_call, args) + + +def get_tmux_output(pl, *args): + '''Run tmux command and return its output''' + return _run_tmux(lambda cmd: run_cmd(pl, cmd), args) + + +def set_tmux_environment(varname, value, remove=True): + '''Set tmux global environment variable + + :param str varname: + Name of the variable to set. + :param str value: + Variable value. + :param bool remove: + True if variable should be removed from the environment prior to + attaching any client (runs ``tmux set-environment -r {varname}``). + ''' + run_tmux_command('set-environment', '-g', varname, value) + if remove: + try: + run_tmux_command('set-environment', '-r', varname) + except subprocess.CalledProcessError: + # On tmux-2.0 this command may fail for whatever reason. Since it is + # critical just ignore the failure. + pass + + +def source_tmux_file(fname): + '''Source tmux configuration file + + :param str fname: + Full path to the sourced file. + ''' + run_tmux_command('source', fname) + + +NON_DIGITS = re.compile('[^0-9]+') +DIGITS = re.compile('[0-9]+') +NON_LETTERS = re.compile('[^a-z]+') + + +def get_tmux_version(pl): + version_string = get_tmux_output(pl, '-V') + _, version_string = version_string.split(' ') + version_string = version_string.strip() + if version_string == 'master': + return TmuxVersionInfo(float('inf'), 0, version_string) + major, minor = version_string.split('.') + suffix = DIGITS.subn('', minor)[0] or None + minor = NON_DIGITS.subn('', minor)[0] + return TmuxVersionInfo(int(major), int(minor), suffix) diff --git a/powerline-bin/powerline/bindings/tmux/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/bindings/tmux/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a26c75ec31a1e3914868454693c75191825fae8d GIT binary patch literal 3615 zcma)8?Qayv8K2p`x81|%^V$Z2z$_SyFOJVtf*4bZl%{UtmN*eMB)K$Q_HOs=z3j_% zb{1^cs8^ZdQ1M?}zi{_$CPGlkF>>`$x3qRH-mU~(I2NW&(wZ~B7vAOtiqQ?$~BG)5fK1ud>6?r|ai!X7Po0~LC-6!aNQ zfWB7~q0ef4TKWbq^l5wGp9JUPm64Wkol)z#ha*k{-$|2c(+qwmO>diKua<=y_bqcd z>0gX>F6L)F+bB7ju9ybZiE6rjN;9q+uHo2zuUd2+)1$g#SXGBmKT{=!O_j1|mnaa- z=CCi?s-<>?et5D~0>9S53pBcOClbzE5!;n1NF?h^ddZ_| z(bQ!oxF`xURCX5~&(!3iE^B((uysu~Z27G>-=4mBVPg1Z?>ar*pR5o1M1#_9p^5?ZX?9R_?f5?l1FMXS#A7lGq8qRV3 zWW?R)7j$|T?J|v?yf#6t>O|G3j#HJu`uNMI7f)6vm!>96qc~Arri+d}QFX5A#00q~ ziiWKj_JRwiyrl_6F>He>O1`@6?}x(*TU9z1P?!bCKDZ|fpL+nh8u~heg!H<&Ca!1J zGL3y>o0prZQw@BI48nG)+Ybp?2)uO;CbuE{R}qZ@7NL8v#@Yg=j3#KSxD|*i@V_;m zLwE6Pjtk`QW2WKK9Oow>j%=OyG0@s|*{!ln_QK!`3JWo&2{{D+nb0nq)X=A?%qQ8= zX7DgQQ;euVJ!S8XmE!S|zUUP`N z00acU7;f@;1`=G=41HS*eETGI&Qz_Urk-Cp(hk?qfcbN#1BP!nB2E zGIeBEr+`;aoiV-O#N`O{fD5d2h>DJ5LX=p})qrfCc)Dzq+Ys4>uOX2pmx*Hq7k5J{ zJT4Al5`b_jrD|!BWszzx%O%rbm^%tN;mTL8ux>BP<S9fx7lqn3mIoI0PU$8S(PtfwF)|fqpJ?oZJGV0k|MS)y~sE z#(`uMK6eH>K-9g6lN!=+eSUND{`4pK?58pDF&F1k+kAgx;CP*GzWsnd{Wy-|>2JPH zAaUTKFtR0#>>!>`{X2nTsmDo}J#qH{x8L;~L4WL@XmbND;7d5e9=Jrf z07XGyT&NA=!QrP+Eu;x;#txG2fzUsIFUVyu)*dj{tiw~m z#Czcg3+njF`(sb(-_FPiq(!&>t5DswFzz~D#g* zjqPjv2jF9}m$FwRXjEv;v{;Lu76&YdZkz*Lc<$|q7Iknte?3Nn+Ldvu^t5<(MlHD- zYiXp#8K^E{mt(c)^*CjS7_|TIB;3`JpMhV{R{54hw6oUMX*J%_D3_Xrgu46$%YMRA zU8o>^-muGrq3si#_fbv=z}1htRVXlFpv0&WrXNIy>8R9C{AlL2nfWPPEZQyQxcJsKQ-IGEcS%)v7a2BhWF9I`Y$%~O<}6RO+CsEJkS0LAGgWIWncleFzkHkN}x*7k|Pwpq0smTVO zjGnXk+(%$btm*lTd_IS-P@RCEsWK(#%sArswCUFU|#~B?D}a zm5Hs_+;TL})X$UGVT~o2`zz=k^BCiQqWLD8{{ji0v0vX;=;&AI1b|)tp~j(nXU;Niy-%Iv>+alNos*btgMM{D9Eq5r0| keqimut=F5vp<3b*>=)N7Yn6=`nwjBRdN(29Gl78r1% 703 +): + if sys.version_info < (3,): + def get_vim_encoding(): + return vim.options['encoding'] or 'ascii' + else: + def get_vim_encoding(): + return vim.options['encoding'].decode('ascii') or 'ascii' +elif hasattr(vim, 'eval'): + def get_vim_encoding(): + return vim.eval('&encoding') or 'ascii' +else: + def get_vim_encoding(): + return 'utf-8' + +get_vim_encoding.__doc__ = ( + '''Get encoding used for Vim strings + + :return: + Value of ``&encoding``. If it is empty (i.e. Vim is compiled + without +multibyte) returns ``'ascii'``. When building documentation + outputs ``'utf-8'`` unconditionally. + ''' +) + + +vim_encoding = get_vim_encoding() + + +python_to_vim_types = { + unicode: ( + lambda o: b'\'' + (o.translate({ + ord('\''): '\'\'', + }).encode(vim_encoding)) + b'\'' + ), + list: ( + lambda o: b'[' + ( + b','.join((python_to_vim(i) for i in o)) + ) + b']' + ), + bytes: (lambda o: b'\'' + o.replace(b'\'', b'\'\'') + b'\''), + int: (str if str is bytes else (lambda o: unicode(o).encode('ascii'))), +} +python_to_vim_types[float] = python_to_vim_types[int] + + +def python_to_vim(o): + return python_to_vim_types[type(o)](o) + + +if sys.version_info < (3,): + def str_to_bytes(s): + return s + + def unicode_eval(expr): + ret = vim.eval(expr) + return ret.decode(vim_encoding, 'powerline_vim_strtrans_error') +else: + def str_to_bytes(s): + return s.encode(vim_encoding) + + def unicode_eval(expr): + return vim.eval(expr) + + +def safe_bytes_eval(expr): + return bytes(bytearray(( + int(chunk) for chunk in ( + vim.eval( + b'substitute(' + expr + b', ' + + b'\'^.*$\', \'\\=join(map(range(len(submatch(0))), ' + + b'"char2nr(submatch(0)[v:val])"))\', "")' + ).split() + ) + ))) + + +def eval_bytes(expr): + try: + return str_to_bytes(vim.eval(expr)) + except UnicodeDecodeError: + return safe_bytes_eval(expr) + + +def eval_unicode(expr): + try: + return unicode_eval(expr) + except UnicodeDecodeError: + return safe_bytes_eval(expr).decode(vim_encoding, 'powerline_vim_strtrans_error') + + +if hasattr(vim, 'bindeval'): + rettype_func = { + None: lambda f: f, + 'unicode': ( + lambda f: ( + lambda *args, **kwargs: ( + f(*args, **kwargs).decode( + vim_encoding, 'powerline_vim_strtrans_error' + )))) + } + rettype_func['int'] = rettype_func['bytes'] = rettype_func[None] + rettype_func['str'] = rettype_func['bytes'] if str is bytes else rettype_func['unicode'] + + def vim_get_func(f, rettype=None): + '''Return a vim function binding.''' + try: + func = vim.bindeval('function("' + f + '")') + except vim.error: + return None + else: + return rettype_func[rettype](func) +else: + rettype_eval = { + None: getattr(vim, 'eval', None), + 'int': lambda expr: int(vim.eval(expr)), + 'bytes': eval_bytes, + 'unicode': eval_unicode, + } + rettype_eval['str'] = rettype_eval[None] + + class VimFunc(object): + '''Evaluate a vim function using vim.eval(). + + This is a fallback class for older vim versions. + ''' + __slots__ = ('f', 'eval') + + def __init__(self, f, rettype=None): + self.f = f.encode('utf-8') + self.eval = rettype_eval[rettype] + + def __call__(self, *args): + return self.eval(self.f + b'(' + (b','.join(( + python_to_vim(o) for o in args + ))) + b')') + + vim_get_func = VimFunc + + +def vim_get_autoload_func(f, rettype=None): + func = vim_get_func(f) + if not func: + vim.command('runtime! ' + f.replace('#', '/')[:f.rindex('#')] + '.vim') + func = vim_get_func(f) + return func + + +if hasattr(vim, 'Function'): + def vim_func_exists(f): + try: + vim.Function(f) + except ValueError: + return False + else: + return True +else: + def vim_func_exists(f): + try: + return bool(int(vim.eval('exists("*{0}")'.format(f)))) + except vim.error: + return False + + +if type(vim) is object: + vim_get_func = lambda *args, **kwargs: None + + +_getbufvar = vim_get_func('getbufvar') +_vim_exists = vim_get_func('exists', rettype='int') + + +# It may crash on some old vim versions and I do not remember in which patch +# I fixed this crash. +if hasattr(vim, 'vvars') and vim.vvars[str('version')] > 703: + _vim_to_python_types = { + getattr(vim, 'Dictionary', None) or type(vim.bindeval('{}')): + lambda value: dict(( + (_vim_to_python(k), _vim_to_python(v)) + for k, v in value.items() + )), + getattr(vim, 'List', None) or type(vim.bindeval('[]')): + lambda value: [_vim_to_python(item) for item in value], + getattr(vim, 'Function', None) or type(vim.bindeval('function("mode")')): + lambda _: None, + } + + def vim_getvar(varname): + return _vim_to_python(vim.vars[str(varname)]) + + def bufvar_exists(buffer, varname): + buffer = buffer or vim.current.buffer + return varname in buffer.vars + + def vim_getwinvar(segment_info, varname): + return _vim_to_python(segment_info['window'].vars[str(varname)]) + + def vim_global_exists(name): + try: + vim.vars[name] + except KeyError: + return False + else: + return True +else: + _vim_to_python_types = { + dict: (lambda value: dict(((k, _vim_to_python(v)) for k, v in value.items()))), + list: (lambda value: [_vim_to_python(i) for i in value]), + } + + def vim_getvar(varname): + varname = 'g:' + varname + if _vim_exists(varname): + return vim.eval(varname) + else: + raise KeyError(varname) + + def bufvar_exists(buffer, varname): + if not buffer or buffer.number == vim.current.buffer.number: + return int(vim.eval('exists("b:{0}")'.format(varname))) + else: + return int(vim.eval( + 'has_key(getbufvar({0}, ""), {1})'.format(buffer.number, varname) + )) + + def vim_getwinvar(segment_info, varname): + result = vim.eval('getwinvar({0}, "{1}")'.format(segment_info['winnr'], varname)) + if result == '': + if not int(vim.eval('has_key(getwinvar({0}, ""), "{1}")'.format(segment_info['winnr'], varname))): + raise KeyError(varname) + return result + + def vim_global_exists(name): + return int(vim.eval('exists("g:' + name + '")')) + + +def vim_command_exists(name): + return _vim_exists(':' + name) + + +if sys.version_info < (3,): + getbufvar = _getbufvar +else: + _vim_to_python_types[bytes] = lambda value: value.decode(vim_encoding) + + def getbufvar(*args): + return _vim_to_python(_getbufvar(*args)) + + +_id = lambda value: value + + +def _vim_to_python(value): + return _vim_to_python_types.get(type(value), _id)(value) + + +if hasattr(vim, 'options'): + def vim_getbufoption(info, option): + return _vim_to_python(info['buffer'].options[str(option)]) + + def vim_getoption(option): + return vim.options[str(option)] + + def vim_setoption(option, value): + vim.options[str(option)] = value +else: + def vim_getbufoption(info, option): + return getbufvar(info['bufnr'], '&' + option) + + def vim_getoption(option): + return vim.eval('&g:' + option) + + def vim_setoption(option, value): + vim.command('let &g:{option} = {value}'.format( + option=option, value=python_to_vim(value))) + + +if hasattr(vim, 'tabpages'): + current_tabpage = lambda: vim.current.tabpage + list_tabpages = lambda: vim.tabpages + + def list_tabpage_buffers_segment_info(segment_info): + return ( + {'buffer': window.buffer, 'bufnr': window.buffer.number} + for window in segment_info['tabpage'].windows + ) +else: + class FalseObject(object): + @staticmethod + def __nonzero__(): + return False + + __bool__ = __nonzero__ + + def get_buffer(number): + for buffer in vim.buffers: + if buffer.number == number: + return buffer + raise KeyError(number) + + class WindowVars(object): + __slots__ = ('tabnr', 'winnr') + + def __init__(self, window): + self.tabnr = window.tabnr + self.winnr = window.number + + def __getitem__(self, key): + has_key = vim.eval('has_key(gettabwinvar({0}, {1}, ""), "{2}")'.format(self.tabnr, self.winnr, key)) + if has_key == '0': + raise KeyError + return vim.eval('gettabwinvar({0}, {1}, "{2}")'.format(self.tabnr, self.winnr, key)) + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + class Window(FalseObject): + __slots__ = ('tabnr', 'number', '_vars') + + def __init__(self, tabnr, number): + self.tabnr = tabnr + self.number = number + self.vars = WindowVars(self) + + @property + def buffer(self): + return get_buffer(int(vim.eval('tabpagebuflist({0})[{1}]'.format(self.tabnr, self.number - 1)))) + + class Tabpage(FalseObject): + __slots__ = ('number',) + + def __init__(self, number): + self.number = number + + def __eq__(self, tabpage): + if not isinstance(tabpage, Tabpage): + raise NotImplementedError + return self.number == tabpage.number + + @property + def window(self): + return Window(self.number, int(vim.eval('tabpagewinnr({0})'.format(self.number)))) + + def _last_tab_nr(): + return int(vim.eval('tabpagenr("$")')) + + def current_tabpage(): + return Tabpage(int(vim.eval('tabpagenr()'))) + + def list_tabpages(): + return [Tabpage(nr) for nr in range(1, _last_tab_nr() + 1)] + + class TabBufSegmentInfo(dict): + def __getitem__(self, key): + try: + return super(TabBufSegmentInfo, self).__getitem__(key) + except KeyError: + if key != 'buffer': + raise + else: + buffer = get_buffer(super(TabBufSegmentInfo, self).__getitem__('bufnr')) + self['buffer'] = buffer + return buffer + + def list_tabpage_buffers_segment_info(segment_info): + return ( + TabBufSegmentInfo(bufnr=int(bufnrstr)) + for bufnrstr in vim.eval('tabpagebuflist({0})'.format(segment_info['tabnr'])) + ) + + +class VimEnviron(object): + @staticmethod + def __getitem__(key): + return vim.eval('$' + key) + + @staticmethod + def get(key, default=None): + return vim.eval('$' + key) or default + + @staticmethod + def __setitem__(key, value): + return vim.command( + 'let ${0}="{1}"'.format( + key, + value.replace('"', '\\"') + .replace('\\', '\\\\') + .replace('\n', '\\n') + .replace('\0', '') + ) + ) + + +if sys.version_info < (3,): + def buffer_name(segment_info): + return segment_info['buffer'].name +else: + vim_bufname = vim_get_func('bufname', rettype='bytes') + + def buffer_name(segment_info): + try: + name = segment_info['buffer'].name + except UnicodeDecodeError: + return vim_bufname(segment_info['bufnr']) + else: + return name.encode(segment_info['encoding']) if name else None + + +vim_strtrans = vim_get_func('strtrans', rettype='unicode') + + +def powerline_vim_strtrans_error(e): + if not isinstance(e, UnicodeDecodeError): + raise NotImplementedError + text = vim_strtrans(e.object[e.start:e.end]) + return (text, e.end) + + +codecs.register_error('powerline_vim_strtrans_error', powerline_vim_strtrans_error) + + +did_autocmd = False +buffer_caches = [] + + +def register_buffer_cache(cachedict): + global did_autocmd + global buffer_caches + from powerline.vim import get_default_pycmd, pycmd + if not did_autocmd: + import __main__ + __main__.powerline_on_bwipe = on_bwipe + vim.command('augroup Powerline') + vim.command(' autocmd! BufWipeout * :{pycmd} powerline_on_bwipe()'.format( + pycmd=(pycmd or get_default_pycmd()))) + vim.command('augroup END') + did_autocmd = True + buffer_caches.append(cachedict) + return cachedict + + +def on_bwipe(): + global buffer_caches + bufnr = int(vim.eval('expand("")')) + for cachedict in buffer_caches: + cachedict.pop(bufnr, None) + + +environ = VimEnviron() + + +def create_ruby_dpowerline(): + vim.command(( + ''' + ruby + if $powerline == nil + class Powerline + end + $powerline = Powerline.new + end + ''' + )) diff --git a/powerline-bin/powerline/bindings/vim/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/bindings/vim/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..697841e6e22fa66e98e6ce996ade46edfcf43d7c GIT binary patch literal 25389 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 O+EDPKB>uU`1O9K>L&vfJ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/vim/autoload/powerline/debug.vim b/powerline-bin/powerline/bindings/vim/autoload/powerline/debug.vim new file mode 100644 index 0000000..244319a --- /dev/null +++ b/powerline-bin/powerline/bindings/vim/autoload/powerline/debug.vim @@ -0,0 +1,20 @@ +python import cProfile +python powerline_pr = cProfile.Profile() + +function powerline#debug#profile_pyeval(s) + python powerline_pr.enable() + try + let ret = pyeval(a:s) + finally + python powerline_pr.disable() + endtry + return ret +endfunction + +function powerline#debug#write_profile(fname) + python import vim + python powerline_pr.dump_stats(vim.eval('a:fname')) + python powerline_pr = cProfile.Profile() +endfunction + +command -nargs=1 -complete=file WriteProfiling :call powerline#debug#write_profile() diff --git a/powerline-bin/powerline/bindings/vim/plugin/powerline.vim b/powerline-bin/powerline/bindings/vim/plugin/powerline.vim new file mode 100644 index 0000000..11ec05e --- /dev/null +++ b/powerline-bin/powerline/bindings/vim/plugin/powerline.vim @@ -0,0 +1,169 @@ +if exists('g:powerline_loaded') + finish +endif +let g:powerline_loaded = 1 + +if exists('g:powerline_pycmd') + let s:pycmd = substitute(g:powerline_pycmd, '\v\C^(py)%[thon](3?)$', '\1\2', '') + if s:pycmd is# 'py' + let s:has_python = has('python') + let s:pyeval = get(g:, 'powerline_pyeval', 'pyeval') + elseif s:pycmd is# 'py3' + let s:has_python = has('python3') + let s:pyeval = 'py3eval' + let s:pyeval = get(g:, 'powerline_pyeval', 'py3eval') + else + if !exists('g:powerline_pyeval') + echohl ErrorMsg + echomsg 'g:powerline_pycmd was set to an unknown values, but g:powerline_pyeval' + echomsg 'was not set. You should either set g:powerline_pycmd to "py3" or "py",' + echomsg 'specify g:powerline_pyeval explicitly or unset both and let powerline' + echomsg 'figure them out.' + echohl None + unlet s:pycmd + finish + endif + let s:pyeval = g:powerline_pyeval + let s:has_python = 1 + endif +elseif has('python') + let s:has_python = 1 + let s:pycmd = 'py' + let s:pyeval = get(g:, 'powerline_pyeval', 'pyeval') +elseif has('python3') + let s:has_python = 1 + let s:pycmd = 'py3' + let s:pyeval = get(g:, 'powerline_pyeval', 'py3eval') +else + let s:has_python = 0 +endif + +if !s:has_python + if !exists('g:powerline_no_python_error') + echohl ErrorMsg + echomsg 'You need vim compiled with Python 2.6, 2.7 or 3.2 and later support' + echomsg 'for Powerline to work. Please consult the documentation for more' + echomsg 'details.' + echohl None + endif + unlet s:has_python + finish +endif +unlet s:has_python + +let s:import_cmd = 'from powerline.vim import VimPowerline' +function s:rcmd(s) + if !exists('s:pystr') + let s:pystr = a:s . "\n" + else + let s:pystr = s:pystr . a:s . "\n" + endif +endfunction +try + let s:can_replace_pyeval = !exists('g:powerline_pyeval') + call s:rcmd('try:') + call s:rcmd(' powerline_appended_path = None') + call s:rcmd(' try:') + call s:rcmd(' '.s:import_cmd.'') + call s:rcmd(' except ImportError:') + call s:rcmd(' import sys, vim') + call s:rcmd(' powerline_appended_path = vim.eval("expand(\":h:h:h:h:h\")")') + call s:rcmd(' sys.path.append(powerline_appended_path)') + call s:rcmd(' '.s:import_cmd.'') + call s:rcmd(' import vim') + call s:rcmd(' powerline_instance = VimPowerline()') + call s:rcmd(' powerline_instance.setup(pyeval=vim.eval("s:pyeval"), pycmd=vim.eval("s:pycmd"), can_replace_pyeval=int(vim.eval("s:can_replace_pyeval")))') + call s:rcmd(' del VimPowerline') + call s:rcmd(' del powerline_instance') + call s:rcmd('except Exception:') + call s:rcmd(' import traceback, sys') + call s:rcmd(' traceback.print_exc(file=sys.stdout)') + call s:rcmd(' raise') + execute s:pycmd s:pystr + unlet s:pystr + let s:launched = 1 +finally + unlet s:can_replace_pyeval + unlet s:import_cmd + if !exists('s:launched') + unlet s:pystr + echohl ErrorMsg + echomsg 'An error occurred while importing powerline module.' + echomsg 'This could be caused by invalid sys.path setting,' + echomsg 'or by an incompatible Python version (powerline requires' + echomsg 'Python 2.6, 2.7 or 3.2 and later to work). Please consult' + echomsg 'the troubleshooting section in the documentation for' + echomsg 'possible solutions.' + if s:pycmd is# 'py' && has('python3') + echomsg 'If powerline on your system is installed for python 3 only you' + echomsg 'should set g:powerline_pycmd to "py3" to make it load correctly.' + endif + echohl None + call s:rcmd('def powerline_troubleshoot():') + call s:rcmd(' import sys') + call s:rcmd(' import vim') + call s:rcmd(' if sys.version_info < (2, 6):') + call s:rcmd(' print("Too old python version: " + sys.version + " (first supported is 2.6)")') + call s:rcmd(' elif sys.version_info[0] == 3 and sys.version_info[1] < 2:') + call s:rcmd(' print("Too old python 3 version: " + sys.version + " (first supported is 3.2)")') + call s:rcmd(' try:') + call s:rcmd(' import powerline') + call s:rcmd(' except ImportError:') + call s:rcmd(' print("Unable to import powerline, is it installed?")') + call s:rcmd(' else:') + call s:rcmd(' if not vim.eval(''expand("")'').startswith("/usr/"):') + call s:rcmd(' import os') + call s:rcmd(' powerline_dir = os.path.realpath(os.path.normpath(powerline.__file__))') + call s:rcmd(' powerline_dir = os.path.dirname(powerline.__file__)') + call s:rcmd(' this_dir = os.path.realpath(os.path.normpath(vim.eval(''expand(":p")'')))') + call s:rcmd(' this_dir = os.path.dirname(this_dir)') " powerline/bindings/vim/plugin + call s:rcmd(' this_dir = os.path.dirname(this_dir)') " powerline/bindings/vim + call s:rcmd(' this_dir = os.path.dirname(this_dir)') " powerline/bindings + call s:rcmd(' this_dir = os.path.dirname(this_dir)') " powerline + call s:rcmd(' if os.path.basename(this_dir) != "powerline":') + call s:rcmd(' print("Check your installation:")') + call s:rcmd(' print("this script is not in powerline[/bindings/vim/plugin] directory,")') + call s:rcmd(' print("neither it is installed system-wide")') + call s:rcmd(' real_powerline_dir = os.path.realpath(powerline_dir)') + call s:rcmd(' real_this_dir = os.path.realpath(this_dir)') + call s:rcmd(' this_dir_par = os.path.dirname(real_this_dir)') + call s:rcmd(' powerline_appended_path = globals().get("powerline_appended_path")') + call s:rcmd(' if powerline_appended_path is not None and this_dir_par != powerline_appended_path:') + call s:rcmd(' print("Check your installation: this script is symlinked somewhere")') + call s:rcmd(' print("where powerline is not present: {0!r} != {1!r}.".format(') + call s:rcmd(' real_this_dir, powerline_appended_path))') + call s:rcmd(' elif real_powerline_dir != real_this_dir:') + call s:rcmd(' print("It appears that you have two powerline versions installed:")') + call s:rcmd(' print("one in " + real_powerline_dir + ", other in " + real_this_dir + ".")') + call s:rcmd(' print("You should remove one of this. Check out troubleshooting section,")') + call s:rcmd(' print("it contains some information about the alternatives.")') + call s:rcmd(' try:') + call s:rcmd(' from powerline.lint import check') + call s:rcmd(' except ImportError:') + call s:rcmd(' print("Failed to import powerline.lint.check, cannot run powerline-lint")') + call s:rcmd(' else:') + call s:rcmd(' try:') + call s:rcmd(' paths = powerline_instance.get_config_paths()') + call s:rcmd(' except NameError:') + call s:rcmd(' pass') + call s:rcmd(' else:') + call s:rcmd(' from powerline.lint.markedjson.error import echoerr') + call s:rcmd(' ee = lambda *args, **kwargs: echoerr(*args, stream=sys.stdout, **kwargs)') + call s:rcmd(' check(paths=paths, echoerr=ee, require_ext="vim")') + call s:rcmd('try:') + call s:rcmd(' powerline_troubleshoot()') + call s:rcmd('finally:') + call s:rcmd(' del powerline_troubleshoot') + execute s:pycmd s:pystr + unlet s:pystr + unlet s:pycmd + unlet s:pyeval + delfunction s:rcmd + finish + else + unlet s:launched + endif + unlet s:pycmd + unlet s:pyeval + delfunction s:rcmd +endtry diff --git a/powerline-bin/powerline/bindings/wm/__init__.py b/powerline-bin/powerline/bindings/wm/__init__.py new file mode 100644 index 0000000..646b701 --- /dev/null +++ b/powerline-bin/powerline/bindings/wm/__init__.py @@ -0,0 +1,85 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import re + +from powerline.theme import requires_segment_info +from powerline.lib.shell import run_cmd +from powerline.bindings.wm.awesome import AwesomeThread + + +DEFAULT_UPDATE_INTERVAL = 0.5 + + +conn = None + + +def i3_subscribe(conn, event, callback): + '''Subscribe to i3 workspace event + + :param conn: + Connection returned by :py:func:`get_i3_connection`. + :param str event: + Event to subscribe to, e.g. ``'workspace'``. + :param func callback: + Function to run on event. + ''' + try: + import i3ipc + except ImportError: + import i3 + conn.Subscription(callback, event) + return + else: + pass + + conn.on(event, callback) + + from threading import Thread + + class I3Thread(Thread): + daemon = True + + def __init__(self, conn): + super(I3Thread, self).__init__() + self.__conn = conn + + def run(self): + self.__conn.main() + + thread = I3Thread(conn=conn) + + thread.start() + + +def get_i3_connection(): + '''Return a valid, cached i3 Connection instance + ''' + global conn + if not conn: + try: + import i3ipc + except ImportError: + import i3 as conn + else: + conn = i3ipc.Connection() + return conn + + +XRANDR_OUTPUT_RE = re.compile(r'^(?P[0-9A-Za-z-]+) connected(?P primary)? (?P\d+)x(?P\d+)\+(?P\d+)\+(?P\d+)', re.MULTILINE) + + +def get_connected_xrandr_outputs(pl): + '''Iterate over xrandr outputs + + Outputs are represented by a dictionary with ``name``, ``width``, + ``height``, ``primary``, ``x`` and ``y`` keys. + ''' + return (match.groupdict() for match in XRANDR_OUTPUT_RE.finditer( + run_cmd(pl, ['xrandr', '-q']) + )) + + +wm_threads = { + 'awesome': AwesomeThread, +} diff --git a/powerline-bin/powerline/bindings/wm/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/bindings/wm/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5de62c9867c4d7adaeacb9cc5405eececbac9ec9 GIT binary patch literal 3382 zcmai0|8Eq>6`z^iyWPDzV~D>%uz>}l;uH9e)-(h|Osv>xtP+PBQtGnO8o=+OMdPT1wjQ}h=deHZGSs#k`n*aH@kP|b5f-v z?aZ5*H}l@UFP}Gm?dnP(XkCAMJpbo7LZ9(TtBFlwykXYH# z3bp}c*La0`u1#l)jOxZhq}0>11tFrsJ_bFXZ#;tTrnH6>Fd~=>Eei^&q036hwXLh+ z8fpC^7z~3^V|IKwh7mzOKr7NbHpCmU5v#@SG$s8~BIuS>Lw}6l!O>OA@ml?3sj}ozGFsA^ZmR{?aYhr0@+OQlw71HrUuF(9)VZoUTB?q6 zM~vndC>VW2gZjjfTOr7GJ6_bnayc1vVh2aW=>w;Q?_b@W7#SN5!)xF;NZ zARKH+vBqccG8%f#tNsJ>=*% z1rH@O&328l#p#r$T`lWYb0==-)OMZFer$j%(A9KOfm)WPfx7*$%KD)5xE0>0hkAw! ztP2)~_zqX(s~hN1vb+ABFGM2re<@?3KU5^-gdgn%mb4ti%n`Fx2$EAFYECldvVfQ) zL8_ViB@Uheflu*6NCa=QB%Fn~g9!1{a(Gh^3lSlZTiM4B0uMXPyO28`osJZjVOfpZ z8hWbkl0u6e~P7>gVzT?*#F{r7Ad{!NFd5%l6*ws4@u8G(zE*ZZTf(`@(&_6 zB-q;YxX53K;}ZHrIxwCVJ{iK$7htj7c$)C2+NeXvGa<^Vx_V8wOyd}UU!e$?3s~I&#ij$UatgE! zda=-Fp^JjV79%?Z!b6`yd~pADCc>_7KsU<(%Sq1mCUkZ5g^ZN028jv#9t+(K86|f< zOzgdv*n2-QSU>SZPSpoK6zc;oo+~KPw~nyT_eAJ@9)~mafrbLpO)mxatcXMC4_&Vd zf5EQ{OYYBx&YnNRb7SnM$A?di59jpZrQ!FFro)N@6@(g`0ZP5Cv+9`IB+_S9zFaX4 zzc}`uaWuWir$uTm6#a1i-ci1=*g;oAdK<{_C=H!G0|dO3@Qn^P{4a3v+itJH>&Xxn z+9khL!YA5j&P&D8Z>RV>#;2-#jWTtS>5jovx9pe7z6Zti-H1|kMxmUR;Nb!_F{-G# zYM5c2h2K^yreB1j$jy|`9|J1-k%6?PfwoF(`@l4);BnOa7e|eC zL=^FMd8O~y2W}mBsO){l=U;`T?&o_4q3}odEs^1?P)2wDWM+JNVn%!S;_Ug0v)asL zAkXvS1|DKO65ypkN>*n^41Sw->=c}No9n}~q>i4YK=^~9*B%ay-y0f#5=*VjtPb6t zxV!7%{n()mfux1!T)hS&L=15{ko4#!n(pKEV!jN|DX15W`-E{EVm#UyM~r|l8g#dd za>g%Gn=<~|3wpLzp?+t)B2v0*2jXj7YSKes| LWCyvP2$lLTFvmQl literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/wm/__pycache__/awesome.cpython-312.pyc b/powerline-bin/powerline/bindings/wm/__pycache__/awesome.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f8bc58f7c397131eddcf97f0c87c3c5b774ba90 GIT binary patch literal 3286 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 E7qdFZFaQ7m literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/bindings/zsh/powerline.zsh b/powerline-bin/powerline/bindings/zsh/powerline.zsh new file mode 100644 index 0000000..5d7cb28 --- /dev/null +++ b/powerline-bin/powerline/bindings/zsh/powerline.zsh @@ -0,0 +1,216 @@ +local _POWERLINE_SOURCED="$0:A" + +_powerline_columns_fallback() { + if which stty &>/dev/null ; then + local cols="$(stty size 2>/dev/null)" + if ! test -z "$cols" ; then + echo "${cols#* }" + return 0 + fi + fi + echo 0 + return 0 +} + +_powerline_append_precmd_function() { + if test -z "${precmd_functions[(re)$1]}" ; then + precmd_functions+=( $1 ) + fi +} + +integer -g _POWERLINE_JOBNUM=0 + +_powerline_tmux_pane() { + local -x TMUX="$_POWERLINE_TMUX" + echo "${TMUX_PANE:-`tmux display -p "#D"`}" | tr -d ' %' +} + +_powerline_tmux_pane() { + local -x TMUX="$_POWERLINE_TMUX" + echo "${TMUX_PANE:-`tmux display -p "#D"`}" | tr -d ' %' +} + +_powerline_init_tmux_support() { + emulate -L zsh + if test -n "$TMUX" && tmux refresh -S &>/dev/null ; then + # TMUX variable may be unset to create new tmux session inside this one + typeset -g _POWERLINE_TMUX="$TMUX" + + function -g _powerline_tmux_setenv() { + emulate -L zsh + local -x TMUX="$_POWERLINE_TMUX" + tmux setenv -g TMUX_"$1"_$(_powerline_tmux_pane) "$2" + tmux refresh -S + } + + function -g _powerline_tmux_set_pwd() { + _powerline_tmux_setenv PWD "$PWD" + } + + function -g _powerline_tmux_set_columns() { + _powerline_tmux_setenv COLUMNS "${COLUMNS:-$(_powerline_columns_fallback)}" + } + + chpwd_functions+=( _powerline_tmux_set_pwd ) + trap '_powerline_tmux_set_columns' SIGWINCH + _powerline_tmux_set_columns + _powerline_tmux_set_pwd + fi +} + +_powerline_init_modes_support() { + emulate -L zsh + + test -z "$ZSH_VERSION" && return 0 + + local -a vs + vs=( ${(s:.:)ZSH_VERSION} ) + + # Mode support requires >=zsh-4.3.11 + if (( vs[1] < 4 || (vs[1] == 4 && (vs[2] < 3 || (vs[2] == 3 && vs[3] < 11))) )) ; then + return 0 + fi + + function -g _powerline_get_main_keymap_name() { + REPLY="${${(Q)${${(z)${"$(bindkey -lL main)"}}[3]}}:-.safe}" + } + + function -g _powerline_set_true_keymap_name() { + typeset -g _POWERLINE_MODE="${1}" + local plm_bk="$(bindkey -lL ${_POWERLINE_MODE})" + if [[ $plm_bk = 'bindkey -A'* ]] ; then + _powerline_set_true_keymap_name ${(Q)${${(z)plm_bk}[3]}} + fi + } + + function -g _powerline_zle_keymap_select() { + _powerline_set_true_keymap_name $KEYMAP + zle reset-prompt + test -z "$_POWERLINE_SAVE_WIDGET" || zle $_POWERLINE_SAVE_WIDGET + } + + function -g _powerline_set_main_keymap_name() { + local REPLY + _powerline_get_main_keymap_name + _powerline_set_true_keymap_name "$REPLY" + } + + _powerline_add_widget zle-keymap-select _powerline_zle_keymap_select + _powerline_set_main_keymap_name + + if [[ "$_POWERLINE_MODE" != vi* ]] ; then + typeset -g _POWERLINE_DEFAULT_MODE="$_POWERLINE_MODE" + fi + + _powerline_append_precmd_function _powerline_set_main_keymap_name +} + +_powerline_set_jobnum() { + # If you are wondering why I am not using the same code as I use for bash + # ($(jobs|wc -l)): consider the following test: + # echo abc | less + # + # . This way jobs will print + # [1] + done echo abc | + # suspended less -M + # ([ is in first column). You see: any line counting thingie will return + # wrong number of jobs. You need to filter the lines first. Or not use + # jobs built-in at all. + integer -g _POWERLINE_JOBNUM=${(%):-%j} +} + +_powerline_update_counter() { + zpython '_powerline.precmd()' +} + +_powerline_setup_prompt() { + emulate -L zsh + + _powerline_append_precmd_function _powerline_set_jobnum + + typeset -g VIRTUAL_ENV_DISABLE_PROMPT=1 + + if test -z "${POWERLINE_NO_ZSH_ZPYTHON}" && { zmodload libzpython || zmodload zsh/zpython } &>/dev/null ; then + _powerline_append_precmd_function _powerline_update_counter + zpython 'from powerline.bindings.zsh import setup as _powerline_setup' + zpython '_powerline_setup(globals())' + zpython 'del _powerline_setup' + powerline-reload() { + zpython 'from powerline.bindings.zsh import reload as _powerline_reload' + zpython '_powerline_reload()' + zpython 'del _powerline_reload' + } + powerline-reload-config() { + zpython 'from powerline.bindings.zsh import reload_config as _powerline_reload_config' + zpython '_powerline_reload_config()' + zpython 'del _powerline_reload_config' + } + else + if test -z "${POWERLINE_COMMAND}" ; then + typeset -g POWERLINE_COMMAND="$($POWERLINE_CONFIG_COMMAND shell command)" + fi + + local add_args='-r .zsh' + add_args+=' --last-exit-code=$?' + add_args+=' --last-pipe-status="$pipestatus"' + add_args+=' --renderer-arg="client_id=$$"' + add_args+=' --renderer-arg="shortened_path=${(%):-%~}"' + add_args+=' --jobnum=$_POWERLINE_JOBNUM' + add_args+=' --renderer-arg="mode=$_POWERLINE_MODE"' + add_args+=' --renderer-arg="default_mode=$_POWERLINE_DEFAULT_MODE"' + local new_args_2=' --renderer-arg="parser_state=${(%%):-%_}"' + new_args_2+=' --renderer-arg="local_theme=continuation"' + local add_args_3=$add_args' --renderer-arg="local_theme=select"' + local add_args_2=$add_args$new_args_2 + add_args+=' --width=$(( ${COLUMNS:-$(_powerline_columns_fallback)} - ${ZLE_RPROMPT_INDENT:-1} ))' + local add_args_r2=$add_args$new_args_2 + typeset -g PS1='$("$POWERLINE_COMMAND" $=POWERLINE_COMMAND_ARGS shell aboveleft '$add_args')' + typeset -g RPS1='$("$POWERLINE_COMMAND" $=POWERLINE_COMMAND_ARGS shell right '$add_args')' + typeset -g PS2='$("$POWERLINE_COMMAND" $=POWERLINE_COMMAND_ARGS shell left '$add_args_2')' + typeset -g RPS2='$("$POWERLINE_COMMAND" $=POWERLINE_COMMAND_ARGS shell right '$add_args_r2')' + typeset -g PS3='$("$POWERLINE_COMMAND" $=POWERLINE_COMMAND_ARGS shell left '$add_args_3')' + fi +} + +_powerline_add_widget() { + local widget="$1" + local function="$2" + local old_widget_command="$(zle -l -L $widget)" + if [[ "$old_widget_command" = "zle -N $widget $function" ]] ; then + return 0 + elif [[ -z "$old_widget_command" ]] ; then + zle -N $widget $function + else + local save_widget="_powerline_save_$widget" + local -i i=0 + while ! test -z "$(zle -l -L $save_widget)" ; do + save_widget="${save_widget}_$i" + (( i++ )) + done + # If widget was defined with `zle -N widget` (without `function` + # argument) then this function will be handy. + eval "function $save_widget() { emulate -L zsh; $widget \$@ }" + eval "${old_widget_command/$widget/$save_widget}" + zle -N $widget $function + typeset -g _POWERLINE_SAVE_WIDGET="$save_widget" + fi +} + +if test -z "${POWERLINE_CONFIG_COMMAND}" ; then + if which powerline-config >/dev/null ; then + typeset -g POWERLINE_CONFIG_COMMAND=powerline-config + else + typeset -g POWERLINE_CONFIG_COMMAND="${_POWERLINE_SOURCED:h:h:h:h}/scripts/powerline-config" + fi +fi + +setopt promptpercent +setopt promptsubst + +if "${POWERLINE_CONFIG_COMMAND}" shell --shell=zsh uses prompt ; then + _powerline_setup_prompt + _powerline_init_modes_support +fi +if "${POWERLINE_CONFIG_COMMAND}" shell --shell=zsh uses tmux ; then + _powerline_init_tmux_support +fi diff --git a/powerline-bin/powerline/colorscheme.py b/powerline-bin/powerline/colorscheme.py new file mode 100644 index 0000000..66416b5 --- /dev/null +++ b/powerline-bin/powerline/colorscheme.py @@ -0,0 +1,147 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from copy import copy + +from powerline.lib.unicode import unicode + + +DEFAULT_MODE_KEY = None +ATTR_BOLD = 1 +ATTR_ITALIC = 2 +ATTR_UNDERLINE = 4 + + +def get_attrs_flag(attrs): + '''Convert an attribute array to a renderer flag.''' + attrs_flag = 0 + if 'bold' in attrs: + attrs_flag |= ATTR_BOLD + if 'italic' in attrs: + attrs_flag |= ATTR_ITALIC + if 'underline' in attrs: + attrs_flag |= ATTR_UNDERLINE + return attrs_flag + + +def pick_gradient_value(grad_list, gradient_level): + '''Given a list of colors and gradient percent, return a color that should be used. + + Note: gradient level is not checked for being inside [0, 100] interval. + ''' + return grad_list[int(round(gradient_level * (len(grad_list) - 1) / 100))] + + +class Colorscheme(object): + def __init__(self, colorscheme_config, colors_config): + '''Initialize a colorscheme.''' + self.colors = {} + self.gradients = {} + + self.groups = colorscheme_config['groups'] + self.translations = colorscheme_config.get('mode_translations', {}) + + # Create a dict of color tuples with both a cterm and hex value + for color_name, color in colors_config['colors'].items(): + try: + self.colors[color_name] = (color[0], int(color[1], 16)) + except TypeError: + self.colors[color_name] = (color, cterm_to_hex[color]) + + # Create a dict of gradient names with two lists: for cterm and hex + # values. Two lists in place of one list of pairs were chosen because + # true colors allow more precise gradients. + for gradient_name, gradient in colors_config['gradients'].items(): + if len(gradient) == 2: + self.gradients[gradient_name] = ( + (gradient[0], [int(color, 16) for color in gradient[1]])) + else: + self.gradients[gradient_name] = ( + (gradient[0], [cterm_to_hex[color] for color in gradient[0]])) + + def get_gradient(self, gradient, gradient_level): + if gradient in self.gradients: + return tuple((pick_gradient_value(grad_list, gradient_level) for grad_list in self.gradients[gradient])) + else: + return self.colors[gradient] + + def get_group_props(self, mode, trans, group, translate_colors=True): + if isinstance(group, (str, unicode)): + try: + group_props = trans['groups'][group] + except KeyError: + try: + group_props = self.groups[group] + except KeyError: + return None + else: + return self.get_group_props(mode, trans, group_props, True) + else: + return self.get_group_props(mode, trans, group_props, False) + else: + if translate_colors: + group_props = copy(group) + try: + ctrans = trans['colors'] + except KeyError: + pass + else: + for key in ('fg', 'bg'): + try: + group_props[key] = ctrans[group_props[key]] + except KeyError: + pass + return group_props + else: + return group + + def get_highlighting(self, groups, mode, gradient_level=None): + trans = self.translations.get(mode, {}) + for group in groups: + group_props = self.get_group_props(mode, trans, group) + if group_props: + break + else: + raise KeyError('Highlighting groups not found in colorscheme: ' + ', '.join(groups)) + + if gradient_level is None: + pick_color = self.colors.__getitem__ + else: + pick_color = lambda gradient: self.get_gradient(gradient, gradient_level) + + return { + 'fg': pick_color(group_props['fg']), + 'bg': pick_color(group_props['bg']), + 'attrs': get_attrs_flag(group_props.get('attrs', [])), + } + + +# 0 1 2 3 4 5 6 7 8 9 +cterm_to_hex = ( + 0x000000, 0xc00000, 0x008000, 0x804000, 0x0000c0, 0xc000c0, 0x008080, 0xc0c0c0, 0x808080, 0xff6060, # 0 + 0x00ff00, 0xffff00, 0x8080ff, 0xff40ff, 0x00ffff, 0xffffff, 0x000000, 0x00005f, 0x000087, 0x0000af, # 1 + 0x0000d7, 0x0000ff, 0x005f00, 0x005f5f, 0x005f87, 0x005faf, 0x005fd7, 0x005fff, 0x008700, 0x00875f, # 2 + 0x008787, 0x0087af, 0x0087d7, 0x0087ff, 0x00af00, 0x00af5f, 0x00af87, 0x00afaf, 0x00afd7, 0x00afff, # 3 + 0x00d700, 0x00d75f, 0x00d787, 0x00d7af, 0x00d7d7, 0x00d7ff, 0x00ff00, 0x00ff5f, 0x00ff87, 0x00ffaf, # 4 + 0x00ffd7, 0x00ffff, 0x5f0000, 0x5f005f, 0x5f0087, 0x5f00af, 0x5f00d7, 0x5f00ff, 0x5f5f00, 0x5f5f5f, # 5 + 0x5f5f87, 0x5f5faf, 0x5f5fd7, 0x5f5fff, 0x5f8700, 0x5f875f, 0x5f8787, 0x5f87af, 0x5f87d7, 0x5f87ff, # 6 + 0x5faf00, 0x5faf5f, 0x5faf87, 0x5fafaf, 0x5fafd7, 0x5fafff, 0x5fd700, 0x5fd75f, 0x5fd787, 0x5fd7af, # 7 + 0x5fd7d7, 0x5fd7ff, 0x5fff00, 0x5fff5f, 0x5fff87, 0x5fffaf, 0x5fffd7, 0x5fffff, 0x870000, 0x87005f, # 8 + 0x870087, 0x8700af, 0x8700d7, 0x8700ff, 0x875f00, 0x875f5f, 0x875f87, 0x875faf, 0x875fd7, 0x875fff, # 9 + 0x878700, 0x87875f, 0x878787, 0x8787af, 0x8787d7, 0x8787ff, 0x87af00, 0x87af5f, 0x87af87, 0x87afaf, # 10 + 0x87afd7, 0x87afff, 0x87d700, 0x87d75f, 0x87d787, 0x87d7af, 0x87d7d7, 0x87d7ff, 0x87ff00, 0x87ff5f, # 11 + 0x87ff87, 0x87ffaf, 0x87ffd7, 0x87ffff, 0xaf0000, 0xaf005f, 0xaf0087, 0xaf00af, 0xaf00d7, 0xaf00ff, # 12 + 0xaf5f00, 0xaf5f5f, 0xaf5f87, 0xaf5faf, 0xaf5fd7, 0xaf5fff, 0xaf8700, 0xaf875f, 0xaf8787, 0xaf87af, # 13 + 0xaf87d7, 0xaf87ff, 0xafaf00, 0xafaf5f, 0xafaf87, 0xafafaf, 0xafafd7, 0xafafff, 0xafd700, 0xafd75f, # 14 + 0xafd787, 0xafd7af, 0xafd7d7, 0xafd7ff, 0xafff00, 0xafff5f, 0xafff87, 0xafffaf, 0xafffd7, 0xafffff, # 15 + 0xd70000, 0xd7005f, 0xd70087, 0xd700af, 0xd700d7, 0xd700ff, 0xd75f00, 0xd75f5f, 0xd75f87, 0xd75faf, # 16 + 0xd75fd7, 0xd75fff, 0xd78700, 0xd7875f, 0xd78787, 0xd787af, 0xd787d7, 0xd787ff, 0xd7af00, 0xd7af5f, # 17 + 0xd7af87, 0xd7afaf, 0xd7afd7, 0xd7afff, 0xd7d700, 0xd7d75f, 0xd7d787, 0xd7d7af, 0xd7d7d7, 0xd7d7ff, # 18 + 0xd7ff00, 0xd7ff5f, 0xd7ff87, 0xd7ffaf, 0xd7ffd7, 0xd7ffff, 0xff0000, 0xff005f, 0xff0087, 0xff00af, # 19 + 0xff00d7, 0xff00ff, 0xff5f00, 0xff5f5f, 0xff5f87, 0xff5faf, 0xff5fd7, 0xff5fff, 0xff8700, 0xff875f, # 20 + 0xff8787, 0xff87af, 0xff87d7, 0xff87ff, 0xffaf00, 0xffaf5f, 0xffaf87, 0xffafaf, 0xffafd7, 0xffafff, # 21 + 0xffd700, 0xffd75f, 0xffd787, 0xffd7af, 0xffd7d7, 0xffd7ff, 0xffff00, 0xffff5f, 0xffff87, 0xffffaf, # 22 + 0xffffd7, 0xffffff, 0x080808, 0x121212, 0x1c1c1c, 0x262626, 0x303030, 0x3a3a3a, 0x444444, 0x4e4e4e, # 23 + 0x585858, 0x626262, 0x6c6c6c, 0x767676, 0x808080, 0x8a8a8a, 0x949494, 0x9e9e9e, 0xa8a8a8, 0xb2b2b2, # 24 + 0xbcbcbc, 0xc6c6c6, 0xd0d0d0, 0xdadada, 0xe4e4e4, 0xeeeeee # 25 +) diff --git a/powerline-bin/powerline/commands/__init__.py b/powerline-bin/powerline/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/powerline-bin/powerline/commands/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/commands/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e49d9621b08b4fe4bc1b1b396ed707a814454345 GIT binary patch literal 163 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/commands/__pycache__/daemon.cpython-312.pyc b/powerline-bin/powerline/commands/__pycache__/daemon.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cef3f16964a49f8539fe7b10ecd55f6e4c5fb62 GIT binary patch literal 1597 zcmaJ>&2Jk;6yI4pj_bru9lNL~HB1nwb?L@H)et^ZL6rljC_)KRB@4-HJmYwh-JR{s zY!a_h$p;P`xi#E41|>+9xbQ!4z*ZyKU2gP%I1wp5^~4*m^Qpi{J0EX<@BQBU&Bt%q zY{r0={r!)|FG<6At`|qm98M1J!sM|*41yfPMOEaQRntvW6G+=kCs|F>Kk!w6Q z5J`NCs;QP)PX4V;wu6bCD8Ti3=l5kjoG$eCuDjeof>{HR;!nM6RohhSej8It@%-1^*j#}2kfKe5i z*25?x6&JLoL_ouT9x&D9fx=uhsla>ymmgxnvBwpzbJurl=3#qTgKS4oo3yY9Jdb%R zC*&51b7P)Vg9Pvc<~Ud?-P28`@CNYUcW1y3<2RPI27j(&+ar1*D6rJ&^B5UOrV5XOvB_TW@T z$tHFDFl||q*VhKp$nc{jpVnEUg<~7uXtH_}a)&CGDGnqh82CXJ&!Z3pBv2g3wS(qD zU!5=&7Y9r_}csLwos2MY(>(XTGH%5vr`&JI#0e_cuSN zIBdD%x8P)YmE!|mfx`%=o5;#gaK9C0!AlnrGm8R59)(Z-3|-rJmbuz_YjHob)PALp zMti8(Ma8~3_T5+8w+_sa^m_**hI!?Mkv0 N>A4q19!(7V{{_T~!JGg9 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/commands/__pycache__/lemonbar.cpython-312.pyc b/powerline-bin/powerline/commands/__pycache__/lemonbar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5f8989db17f0e153be496130a1914579d65c206 GIT binary patch literal 1402 zcmah}NpIUm6rLd|iKZ>dP8{1=42*pVRDe=}By9>53B2fFpivF$66hjRnxRR98-_zK zgbVo4AD}~l^e+_FkI21;#wV-O9tz~tn*bXqkW*(Q%FxB|93CIvd*An#S$;1T4IozW zkH74XDgdA5&txf?a{Wdq9{>gzdccP*=qoM7S6eESHpSCg8qp3%JQL{nYeTI53|skA zrK0^SO%;{v*gbM%Hw<{$>cpX!Fw%DYD5Q*+BI*XLZ6`sOiGW5IPSNQ?7X^ard13tk z6mTZW=_?mm%unzP9!|$+P^@AN=lb~zi4_ZiJK_ph$1~XI&t7QvM9$$Nn~VnF5-#KU z{=!B69@GQ;5HI3Kcu8c)-4naavKjz5%y`F$vBWF=$J6~ZLFGv!UEU3k3H987pv{dv z)Nups1_yDq0{JW^ahJN0oNB6>ru%{$F$*baGn$ZerI~c3zeA86Qsllsw{o2EnD1BY?I^Se9m>pwKp*-eY0v9&7pw}6RlB_87ipD^plqEsG?)DT$% zM(B~{rHbhuj63<~EiW|dTR%3oo9V(Hu_=iiG>NNLG_JAJh|r>lrX?vxTt(CDSk&x> zzHbFs&~0(uBYqeND_6JPZKuy0mQPS2iNaAxF`+03nam&n-7v64 zq6{$J1QZ?zx1iCGbAc>l)ST#f&ce7osfFikFSHofg(0$NO!&-R{oTe+W4pd5wx_g_ z)x0Zxl;=k=G?wQRp)Z>?=0~;2jZ7x+gqh#Ga=wnfJ^8NYxt&^c%A7E$MU!(=%O)Dv zZhMbTc~RhGIb&w}Ofbv47=IMv9Qh`f91Fdd17mSuls_%K zy(2{bMZcO~znotmDp22nS++6JO!<8ETJ!)a1#Yy(tHTm;A=*?v6ja_nDz7PBmg2D# zvh&{nU6uM%A-?F}`yoy|@`fVuD<7YDO^BfiA^a~7;1;|Do1Z~hjAi|+tF_mcYp-v> JQ&=8R{13c`WWE3Z literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/commands/__pycache__/lint.cpython-312.pyc b/powerline-bin/powerline/commands/__pycache__/lint.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08211fd97998be327a314b89cec21a7fa41c97b4 GIT binary patch literal 1108 zcmZ`&&ubGw6rS1LCTZFvqE!l_jDkNR-NcJpK?*Gedy<0n&|Km+Gf75wcZQkS)`SW@ zc?|tvRnGdB>5y4aX__bYj z5&C97jvi;^9L|BWjVPixL=kS_$Z0r{+i(IZ7SA+nBm9a3j}qs@@M9 zs=8@`@^!Ach|@~2rbU<-*5r{C%A{qfcx;;OByJf1JZRw)bb0VWAUc#_wvmH2LC&tT zGr~N_oA}8|{3w;W)T3iGNAtUdov~pMqyJ#XX^~FQNm|-1pTs^y)yjiDSr!{ig*;}Y zCE_;kBr32nNvq3RPnoJ!aXLYnZYeHpyzlt3U-JDS*q4Fnrnx{$7Sq&Qo?lt&zh8!! zCL3L*{^itNk%W}2K|EupGla)PC<=ARsz^wbXhU=&W!NJ@7!pgbNz7VI>p=BLTPPxr z1sg#&gnBwNWaDuM@XGKYB-dH3QzIelx_y9lSC{w zRVOXakNo98!35GAj0WD?o_<1p&DBjL>yk^~KoT?l?OWZO^3Jon^^mXCWzTd)Tt8M= zZ;2=hVyfY9Y-+NXmLSKL8?vf1z-o`OUInv-z7(fFUAh0cxU_Zd0O$Ad)E=HXaB?pz zuM6+44ji{|elUidvp-SJaR+7O6#hWQU-@s$z`=z@Ji>T@DWdVp)`deLN7Z~7Gj`XZQti!uI=7WUA> YH&hwq(B&KZmuB}a&HhAXT*>l(1G}(35dZ)H literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/commands/__pycache__/main.cpython-312.pyc b/powerline-bin/powerline/commands/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4132f36aab1ab04d6ecb456d80b7e9b6c081bb2 GIT binary patch literal 10180 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/commands/config.py b/powerline-bin/powerline/commands/config.py new file mode 100644 index 0000000..06c6436 --- /dev/null +++ b/powerline-bin/powerline/commands/config.py @@ -0,0 +1,109 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (division, absolute_import, print_function) + +import argparse + +import powerline.bindings.config as config + + +class StrFunction(object): + def __init__(self, function, name=None): + self.name = name or function.__name__ + self.function = function + + def __call__(self, *args, **kwargs): + self.function(*args, **kwargs) + + def __str__(self): + return self.name + + +TMUX_ACTIONS = { + 'source': StrFunction(config.source_tmux_files, 'source'), + 'setenv': StrFunction(config.init_tmux_environment, 'setenv'), + 'setup': StrFunction(config.tmux_setup, 'setup'), +} + + +SHELL_ACTIONS = { + 'command': StrFunction(config.shell_command, 'command'), + 'uses': StrFunction(config.uses), +} + + +class ConfigArgParser(argparse.ArgumentParser): + def parse_args(self, *args, **kwargs): + ret = super(ConfigArgParser, self).parse_args(*args, **kwargs) + if not hasattr(ret, 'function'): + # In Python-3* `powerline-config` (without arguments) raises + # AttributeError. I have not found any standard way to display same + # error message as in Python-2*. + self.error('too few arguments') + return ret + + +def get_argparser(ArgumentParser=ConfigArgParser): + parser = ArgumentParser(description='Script used to obtain powerline configuration.') + parser.add_argument( + '-p', '--config-path', action='append', metavar='PATH', + help='Path to configuration directory. If it is present ' + 'then configuration files will only be seeked in the provided path. ' + 'May be provided multiple times to search in a list of directories.' + ) + subparsers = parser.add_subparsers() + tmux_parser = subparsers.add_parser('tmux', help='Tmux-specific commands') + tmux_parser.add_argument( + 'function', + choices=tuple(TMUX_ACTIONS.values()), + metavar='ACTION', + type=(lambda v: TMUX_ACTIONS.get(v)), + help='If action is `source\' then version-specific tmux configuration ' + 'files are sourced, if it is `setenv\' then special ' + '(prefixed with `_POWERLINE\') tmux global environment variables ' + 'are filled with data from powerline configuration. ' + 'Action `setup\' is just doing `setenv\' then `source\'.' + ) + tpg = tmux_parser.add_mutually_exclusive_group() + tpg.add_argument( + '-s', '--source', action='store_true', default=None, + help='When using `setup\': always use configuration file sourcing. ' + 'By default this is determined automatically based on tmux ' + 'version: this is the default for tmux 1.8 and below.', + ) + tpg.add_argument( + '-n', '--no-source', action='store_false', dest='source', default=None, + help='When using `setup\': in place of sourcing directly execute ' + 'configuration files. That is, read each needed ' + 'powerline-specific configuration file, substitute ' + '`$_POWERLINE_…\' variables with appropriate values and run ' + '`tmux config line\'. This is the default behaviour for ' + 'tmux 1.9 and above.' + ) + + shell_parser = subparsers.add_parser('shell', help='Shell-specific commands') + shell_parser.add_argument( + 'function', + choices=tuple(SHELL_ACTIONS.values()), + type=(lambda v: SHELL_ACTIONS.get(v)), + metavar='ACTION', + help='If action is `command\' then preferred powerline command is ' + 'output, if it is `uses\' then powerline-config script will exit ' + 'with 1 if specified component is disabled and 0 otherwise.', + ) + shell_parser.add_argument( + 'component', + nargs='?', + choices=('tmux', 'prompt'), + metavar='COMPONENT', + help='Only applicable for `uses\' subcommand: makes `powerline-config\' ' + 'exit with 0 if specific component is enabled and with 1 otherwise. ' + '`tmux\' component stands for tmux bindings ' + '(e.g. those that notify tmux about current directory changes), ' + '`prompt\' component stands for shell prompt.' + ) + shell_parser.add_argument( + '-s', '--shell', + metavar='SHELL', + help='Shell for which query is run', + ) + return parser diff --git a/powerline-bin/powerline/commands/daemon.py b/powerline-bin/powerline/commands/daemon.py new file mode 100644 index 0000000..7e8c8ab --- /dev/null +++ b/powerline-bin/powerline/commands/daemon.py @@ -0,0 +1,24 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (division, absolute_import, print_function) + +import argparse + + +def get_argparser(ArgumentParser=argparse.ArgumentParser): + parser = ArgumentParser(description='Daemon that improves powerline performance.') + parser.add_argument( + '--quiet', '-q', action='store_true', + help='Without other options: do not complain about already running ' + 'powerline-daemon instance. ' + 'Will still exit with 1. ' + 'With `--kill\' and `--replace\': do not show any messages. ' + 'With `--foreground\': ignored. ' + 'Does not silence exceptions in any case.' + ) + parser.add_argument('--socket', '-s', help='Specify socket which will be used for connecting to daemon.') + exclusive_group = parser.add_mutually_exclusive_group() + exclusive_group.add_argument('--kill', '-k', action='store_true', help='Kill an already running instance.') + replace_group = exclusive_group.add_argument_group() + replace_group.add_argument('--foreground', '-f', action='store_true', help='Run in the foreground (don’t daemonize).') + replace_group.add_argument('--replace', '-r', action='store_true', help='Replace an already running instance.') + return parser diff --git a/powerline-bin/powerline/commands/lemonbar.py b/powerline-bin/powerline/commands/lemonbar.py new file mode 100644 index 0000000..547c52c --- /dev/null +++ b/powerline-bin/powerline/commands/lemonbar.py @@ -0,0 +1,35 @@ +# vim:fileencoding=utf-8:noet +# WARNING: using unicode_literals causes errors in argparse +from __future__ import (division, absolute_import, print_function) + +import argparse + + +def get_argparser(ArgumentParser=argparse.ArgumentParser): + parser = ArgumentParser( + description='Powerline BAR bindings.' + ) + parser.add_argument( + '--i3', action='store_true', + help='Subscribe for i3 events.' + ) + parser.add_argument( + '--height', default='', + metavar='PIXELS', help='Bar height.' + ) + parser.add_argument( + '--interval', '-i', + type=float, default=0.5, + metavar='SECONDS', help='Refresh interval.' + ) + parser.add_argument( + '--bar-command', '-C', + default='lemonbar', + metavar='CMD', help='Name of the lemonbar executable to use.' + ) + parser.add_argument( + 'args', nargs=argparse.REMAINDER, + help='Extra arguments for lemonbar. Should be preceded with ``--`` ' + 'argument in order not to be confused with script own arguments.' + ) + return parser diff --git a/powerline-bin/powerline/commands/lint.py b/powerline-bin/powerline/commands/lint.py new file mode 100644 index 0000000..8961a65 --- /dev/null +++ b/powerline-bin/powerline/commands/lint.py @@ -0,0 +1,21 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (division, absolute_import, print_function) + +import argparse + + +def get_argparser(ArgumentParser=argparse.ArgumentParser): + parser = ArgumentParser(description='Powerline configuration checker.') + parser.add_argument( + '-p', '--config-path', action='append', metavar='PATH', + help='Paths where configuration should be checked, in order. You must ' + 'supply all paths necessary for powerline to work, ' + 'checking partial (e.g. only user overrides) configuration ' + 'is not supported.' + ) + parser.add_argument( + '-d', '--debug', action='store_const', const=True, + help='Display additional information. Used for debugging ' + '`powerline-lint\' itself, not for debugging configuration.' + ) + return parser diff --git a/powerline-bin/powerline/commands/main.py b/powerline-bin/powerline/commands/main.py new file mode 100644 index 0000000..366eba2 --- /dev/null +++ b/powerline-bin/powerline/commands/main.py @@ -0,0 +1,190 @@ +# vim:fileencoding=utf-8:noet +# WARNING: using unicode_literals causes errors in argparse +from __future__ import (division, absolute_import, print_function) + +import argparse +import sys + +from itertools import chain + +from powerline.lib.overrides import parsedotval, parse_override_var +from powerline.lib.dict import mergeargs +from powerline.lib.encoding import get_preferred_arguments_encoding +from powerline.lib.unicode import u, unicode +from powerline.bindings.wm import wm_threads + + +if sys.version_info < (3,): + encoding = get_preferred_arguments_encoding() + + def arg_to_unicode(s): + return unicode(s, encoding, 'replace') if not isinstance(s, unicode) else s # NOQA +else: + def arg_to_unicode(s): + return s + + +def finish_args(parser, environ, args, is_daemon=False): + '''Do some final transformations + + Transforms ``*_override`` arguments into dictionaries, adding overrides from + environment variables. Transforms ``renderer_arg`` argument into dictionary + as well, but only if it is true. + + :param dict environ: + Environment from which additional overrides should be taken from. + :param args: + Arguments object returned by + :py:meth:`argparse.ArgumentParser.parse_args`. Will be modified + in-place. + + :return: Object received as second (``args``) argument. + ''' + args.config_override = mergeargs(chain( + parse_override_var(environ.get('POWERLINE_CONFIG_OVERRIDES', '')), + (parsedotval(v) for v in args.config_override or ()), + )) + args.theme_override = mergeargs(chain( + parse_override_var(environ.get('POWERLINE_THEME_OVERRIDES', '')), + (parsedotval(v) for v in args.theme_override or ()), + )) + if args.renderer_arg: + args.renderer_arg = mergeargs((parsedotval(v) for v in args.renderer_arg), remove=True) + if 'pane_id' in args.renderer_arg: + if isinstance(args.renderer_arg['pane_id'], (bytes, unicode)): + try: + args.renderer_arg['pane_id'] = int(args.renderer_arg['pane_id'].lstrip(' %')) + except ValueError: + pass + if 'client_id' not in args.renderer_arg: + args.renderer_arg['client_id'] = args.renderer_arg['pane_id'] + args.config_path = ( + [path for path in environ.get('POWERLINE_CONFIG_PATHS', '').split(':') if path] + + (args.config_path or []) + ) + if args.ext[0].startswith('wm.'): + if not is_daemon: + parser.error('WM bindings must be used with daemon only') + elif args.ext[0][3:] not in wm_threads: + parser.error('WM binding not found') + elif not args.side: + parser.error('expected one argument') + return args + + +def int_or_sig(s): + if s.startswith('sig'): + return u(s) + else: + return int(s) + + +def get_argparser(ArgumentParser=argparse.ArgumentParser): + parser = ArgumentParser(description='Powerline prompt and statusline script.') + parser.add_argument( + 'ext', nargs=1, + help='Extension: application for which powerline command is launched ' + '(usually `shell\' or `tmux\'). Also supports `wm.\' extensions: ' + + ', '.join(('`wm.' + key + '\'' for key in wm_threads.keys())) + '.' + ) + parser.add_argument( + 'side', nargs='?', choices=('left', 'right', 'above', 'aboveleft'), + help='Side: `left\' and `right\' represent left and right side ' + 'respectively, `above\' emits lines that are supposed to be printed ' + 'just above the prompt and `aboveleft\' is like concatenating ' + '`above\' with `left\' with the exception that only one Python ' + 'instance is used in this case. May be omitted for `wm.*\' extensions.' + ) + parser.add_argument( + '-r', '--renderer-module', metavar='MODULE', type=str, + help='Renderer module. Usually something like `.bash\' or `.zsh\' ' + '(with leading dot) which is `powerline.renderers.{ext}{MODULE}\', ' + 'may also be full module name (must contain at least one dot or ' + 'end with a dot in case it is top-level module) or ' + '`powerline.renderers\' submodule (in case there are no dots).' + ) + parser.add_argument( + '-w', '--width', type=int, + help='Maximum prompt with. Triggers truncation of some segments.' + ) + parser.add_argument( + '--last-exit-code', metavar='INT', type=int_or_sig, + help='Last exit code.' + ) + parser.add_argument( + '--last-pipe-status', metavar='LIST', default='', + type=lambda s: [int_or_sig(status) for status in s.split()], + help='Like above, but is supposed to contain space-separated array ' + 'of statuses, representing exit statuses of commands in one pipe.' + ) + parser.add_argument( + '--jobnum', metavar='INT', type=int, + help='Number of jobs.' + ) + parser.add_argument( + '-c', '--config-override', metavar='KEY.KEY=VALUE', type=arg_to_unicode, + action='append', + help='Configuration overrides for `config.json\'. Is translated to a ' + 'dictionary and merged with the dictionary obtained from actual ' + 'JSON configuration: KEY.KEY=VALUE is translated to ' + '`{"KEY": {"KEY": VALUE}}\' and then merged recursively. ' + 'VALUE may be any JSON value, values that are not ' + '`null\', `true\', `false\', start with digit, `{\', `[\' ' + 'are treated like strings. If VALUE is omitted ' + 'then corresponding key is removed.' + ) + parser.add_argument( + '-t', '--theme-override', metavar='THEME.KEY.KEY=VALUE', type=arg_to_unicode, + action='append', + help='Like above, but theme-specific. THEME should point to ' + 'an existing and used theme to have any effect, but it is fine ' + 'to use any theme here.' + ) + parser.add_argument( + '-R', '--renderer-arg', + metavar='KEY=VAL', type=arg_to_unicode, action='append', + help='Like above, but provides argument for renderer. Is supposed ' + 'to be used only by shell bindings to provide various data like ' + 'last-exit-code or last-pipe-status (they are not using ' + '`--renderer-arg\' for historical resons: `--renderer-arg\' ' + 'was added later).' + ) + parser.add_argument( + '-p', '--config-path', action='append', metavar='PATH', + help='Path to configuration directory. If it is present then ' + 'configuration files will only be seeked in the provided path. ' + 'May be provided multiple times to search in a list of directories.' + ) + parser.add_argument( + '--socket', metavar='ADDRESS', type=str, + help='Socket address to use in daemon clients. Is always UNIX domain ' + 'socket on linux and file socket on Mac OS X. Not used here, ' + 'present only for compatibility with other powerline clients. ' + 'This argument must always be the first one and be in a form ' + '`--socket ADDRESS\': no `=\' or short form allowed ' + '(in other powerline clients, not here).' + ) + return parser + + +def write_output(args, powerline, segment_info, write): + if args.renderer_arg: + segment_info.update(args.renderer_arg) + if args.side.startswith('above'): + for line in powerline.render_above_lines( + width=args.width, + segment_info=segment_info, + mode=segment_info.get('mode', None), + ): + if line: + write(line + '\n') + args.side = args.side[len('above'):] + + if args.side: + rendered = powerline.render( + width=args.width, + side=args.side, + segment_info=segment_info, + mode=segment_info.get('mode', None), + ) + write(rendered) diff --git a/powerline-bin/powerline/config.py b/powerline-bin/powerline/config.py new file mode 100644 index 0000000..edcf921 --- /dev/null +++ b/powerline-bin/powerline/config.py @@ -0,0 +1,10 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + + +POWERLINE_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +BINDINGS_DIRECTORY = os.path.join(POWERLINE_ROOT, 'powerline', 'bindings') +TMUX_CONFIG_DIRECTORY = os.path.join(BINDINGS_DIRECTORY, 'tmux') +DEFAULT_SYSTEM_CONFIG_DIR = None diff --git a/powerline-bin/powerline/config_files/colors.json b/powerline-bin/powerline/config_files/colors.json new file mode 100644 index 0000000..1564f18 --- /dev/null +++ b/powerline-bin/powerline/config_files/colors.json @@ -0,0 +1,124 @@ +{ + "colors": { + "black": 16, + "white": 231, + + "green": 2, + "darkestgreen": 22, + "darkgreen": 28, + "mediumgreen": 70, + "brightgreen": 148, + + "darkestcyan": 23, + "darkcyan": 74, + "mediumcyan": 117, + "brightcyan": 159, + + "darkestblue": 24, + "darkblue": 31, + + "red": 1, + "darkestred": 52, + "darkred": 88, + "mediumred": 124, + "brightred": 160, + "brightestred": 196, + + "darkestpurple": 55, + "mediumpurple": 98, + "brightpurple": 189, + + "darkorange": 94, + "mediumorange": 166, + "brightorange": 208, + "brightestorange": 214, + + "yellow": 11, + "brightyellow": 220, + + "gray0": 233, + "gray1": 235, + "gray2": 236, + "gray3": 239, + "gray4": 240, + "gray5": 241, + "gray6": 244, + "gray7": 245, + "gray8": 247, + "gray9": 250, + "gray10": 252, + + "gray11": 234, + "gray90": 254, + + "gray70": [249, "b3b3b3"], + + "lightyellowgreen": 106, + "gold3": 178, + "orangered": 202, + + "steelblue": 67, + "darkorange3": 166, + "skyblue1": 117, + "khaki1": 228, + + "solarized:base03": [8, "002b36"], + "solarized:base02": [0, "073642"], + "solarized:base01": [10, "586e75"], + "solarized:base00": [11, "657b83"], + "solarized:base0": [12, "839496"], + "solarized:base1": [14, "93a1a1"], + "solarized:base2": [7, "eee8d5"], + "solarized:base3": [15, "fdf6e3"], + "solarized:yellow": [3, "b58900"], + "solarized:orange": [9, "cb4b16"], + "solarized:red": [1, "dc322f"], + "solarized:magenta": [5, "d33682"], + "solarized:violet": [13, "6c71c4"], + "solarized:blue": [4, "268bd2"], + "solarized:cyan": [6, "2aa198"], + "solarized:green": [2, "859900"] + }, + "gradients": { + "dark_GREEN_Orange_red": [ + [22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 94, 94, 94, 94, 94, 94, 94, 88, 52], + ["006000", "006000", "006000", "006000", "006000", "006000", "006000", "006000", "006000", "036000", "076000", "0a6000", "0d6000", "106000", "126000", "146000", "166000", "186000", "1a6000", "1b6000", "1d6000", "1e6000", "206000", "216000", "236000", "246000", "256000", "266000", "286000", "296000", "2a6000", "2b6000", "2c6100", "2d6100", "2f6100", "306100", "316100", "326100", "336100", "346100", "356100", "366100", "376100", "386100", "386100", "396100", "3a6100", "3b6100", "3c6100", "3d6100", "3e6100", "3f6100", "406100", "406100", "416100", "426000", "436000", "446000", "456000", "456000", "466000", "476000", "486000", "496000", "496000", "4a6000", "4b6000", "4c6000", "4d6000", "4d6000", "4e6000", "4f6000", "506000", "506000", "516000", "526000", "536000", "536000", "546000", "556000", "566000", "566000", "576000", "586000", "596000", "596000", "5a6000", "5d6000", "616000", "646000", "686000", "6b6000", "6f6000", "726000", "766000", "796000", "7d6000", "806000", "7e5500", "6f3105", "5d0001"] + ], + "GREEN_Orange_red": [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1], + ["005f00", "015f00", "025f00", "035f00", "045f00", "055f00", "065f00", "075f00", "085f00", "095f00", "0b5f00", "0c5f00", "0d5f00", "0e5f00", "0f5f00", "105f00", "115f00", "125f00", "135f00", "145f00", "165f00", "175f00", "185f00", "195f00", "1a5f00", "1b5f00", "1c5f00", "1d5f00", "1e5f00", "1f5f00", "215f00", "225f00", "235f00", "245f00", "255f00", "265f00", "275f00", "285f00", "295f00", "2a5f00", "2c5f00", "2d5f00", "2e5f00", "2f5f00", "305f00", "315f00", "325f00", "335f00", "345f00", "355f00", "375f00", "385f00", "395f00", "3a5f00", "3b5f00", "3c5f00", "3d5f00", "3e5f00", "3f5f00", "415f00", "425f00", "435f00", "445f00", "455f00", "465f00", "475f00", "485f00", "495f00", "4a5f00", "4c5f00", "4d5f00", "4e5f00", "4f5f00", "505f00", "515f00", "525f00", "535f00", "545f00", "555f00", "575f00", "585f00", "595f00", "5a5f00", "5b5f00", "5c5f00", "5d5f00", "5e5f00", "615f00", "655f00", "685f00", "6c5f00", "6f5f00", "735f00", "765f00", "7a5f00", "7d5f00", "815f00", "845f00", "815200", "702900"] + ], + "green_yellow_red": [ + [190, 184, 178, 172, 166, 160], + ["8ae71c", "8ce71c", "8fe71c", "92e71c", "95e71d", "98e71d", "9ae71d", "9de71d", "a0e71e", "a3e71e", "a6e71e", "a8e71e", "abe71f", "aee71f", "b1e71f", "b4e71f", "b6e720", "b9e720", "bce720", "bfe720", "c2e821", "c3e721", "c5e621", "c7e521", "c9e522", "cbe422", "cde322", "cfe222", "d1e223", "d3e123", "d5e023", "d7df23", "d9df24", "dbde24", "dddd24", "dfdc24", "e1dc25", "e3db25", "e5da25", "e7d925", "e9d926", "e9d626", "e9d426", "e9d126", "e9cf27", "e9cc27", "e9ca27", "e9c727", "e9c528", "e9c228", "e9c028", "e9bd28", "e9bb29", "e9b829", "e9b629", "e9b329", "e9b12a", "e9ae2a", "e9ac2a", "e9a92a", "eaa72b", "eaa42b", "eaa22b", "ea9f2b", "ea9d2c", "ea9b2c", "ea982c", "ea962c", "ea942d", "ea912d", "ea8f2d", "ea8d2d", "ea8a2e", "ea882e", "ea862e", "ea832e", "ea812f", "ea7f2f", "ea7c2f", "ea7a2f", "eb7830", "eb7530", "eb7330", "eb7130", "eb6f31", "eb6c31", "eb6a31", "eb6831", "eb6632", "eb6332", "eb6132", "eb5f32", "eb5d33", "eb5a33", "eb5833", "eb5633", "eb5434", "eb5134", "eb4f34", "eb4d34", "ec4b35"] + ], + "green_yellow_orange_red": [ + [2, 3, 9, 1], + ["719e07", "739d06", "759c06", "779c06", "799b06", "7b9a05", "7d9a05", "7f9905", "819805", "839805", "859704", "879704", "899604", "8b9504", "8d9504", "8f9403", "919303", "949303", "969203", "989102", "9a9102", "9c9002", "9e9002", "a08f02", "a28e01", "a48e01", "a68d01", "a88c01", "aa8c01", "ac8b00", "ae8a00", "b08a00", "b28900", "b58900", "b58700", "b68501", "b78302", "b78102", "b87f03", "b97d04", "b97b04", "ba7905", "bb7806", "bb7606", "bc7407", "bd7208", "bd7008", "be6e09", "bf6c0a", "bf6a0a", "c0690b", "c1670c", "c1650c", "c2630d", "c3610e", "c35f0e", "c45d0f", "c55b10", "c55a10", "c65811", "c75612", "c75412", "c85213", "c95014", "c94e14", "ca4c15", "cb4b16", "cb4a16", "cc4917", "cc4818", "cd4719", "cd4719", "ce461a", "ce451b", "cf441c", "cf441c", "d0431d", "d0421e", "d1411f", "d1411f", "d24020", "d23f21", "d33e22", "d33e22", "d43d23", "d43c24", "d53b25", "d53b25", "d63a26", "d63927", "d73828", "d73828", "d83729", "d8362a", "d9352b", "d9352b", "da342c", "da332d", "db322e", "dc322f"] + ], + "yellow_red": [ + [220, 178, 172, 166, 160], + ["ffd700", "fdd500", "fbd300", "fad200", "f8d000", "f7cf00", "f5cd00", "f3cb00", "f2ca00", "f0c800", "efc700", "edc500", "ebc300", "eac200", "e8c000", "e7bf00", "e5bd00", "e3bb00", "e2ba00", "e0b800", "dfb700", "ddb500", "dbb300", "dab200", "d8b000", "d7af00", "d7ad00", "d7ab00", "d7aa00", "d7a800", "d7a700", "d7a500", "d7a300", "d7a200", "d7a000", "d79f00", "d79d00", "d79b00", "d79a00", "d79800", "d79700", "d79500", "d79300", "d79200", "d79000", "d78f00", "d78d00", "d78b00", "d78a00", "d78800", "d78700", "d78500", "d78300", "d78200", "d78000", "d77f00", "d77d00", "d77b00", "d77a00", "d77800", "d77700", "d77500", "d77300", "d77200", "d77000", "d76f00", "d76d00", "d76b00", "d76a00", "d76800", "d76700", "d76500", "d76300", "d76200", "d76000", "d75f00", "d75b00", "d75700", "d75300", "d74f00", "d74c00", "d74800", "d74400", "d74000", "d73c00", "d73900", "d73500", "d73100", "d72d00", "d72900", "d72600", "d72200", "d71e00", "d71a00", "d71600", "d71300", "d70f00", "d70b00", "d70700"] + ], + "yellow_orange_red": [ + [3, 9, 1], + ["b58900", "b58700", "b58600", "b68501", "b68401", "b78202", "b78102", "b88003", "b87f03", "b87d03", "b97c04", "b97b04", "ba7a05", "ba7805", "bb7706", "bb7606", "bc7507", "bc7307", "bc7207", "bd7108", "bd7008", "be6e09", "be6d09", "bf6c0a", "bf6b0a", "c06a0b", "c0680b", "c0670b", "c1660c", "c1650c", "c2630d", "c2620d", "c3610e", "c3600e", "c35e0e", "c45d0f", "c45c0f", "c55b10", "c55910", "c65811", "c65711", "c75612", "c75412", "c75312", "c85213", "c85113", "c94f14", "c94e14", "ca4d15", "ca4c15", "cb4b16", "cb4a16", "cb4a17", "cc4917", "cc4918", "cc4818", "cd4819", "cd4719", "cd471a", "ce461a", "ce461b", "ce451b", "cf451c", "cf441c", "cf441d", "d0431d", "d0431e", "d0421e", "d1421f", "d1411f", "d14120", "d24020", "d24021", "d23f21", "d33f22", "d33e22", "d33e23", "d43d23", "d43d24", "d43c24", "d53c25", "d53b25", "d53b26", "d63a26", "d63a27", "d63927", "d73928", "d73828", "d73829", "d83729", "d8372a", "d8362a", "d9362b", "d9352b", "d9352c", "da342c", "da342d", "da332d", "db332e"] + ], + "blue_red": [ + [39, 74, 68, 67, 103, 97, 96, 132, 131, 167, 203, 197], + ["19b4fe", "1bb2fc", "1db1fa", "1faff8", "22aef6", "24adf4", "26abf2", "29aaf0", "2ba9ee", "2da7ec", "30a6ea", "32a5e8", "34a3e6", "36a2e4", "39a0e2", "3b9fe1", "3d9edf", "409cdd", "429bdb", "449ad9", "4798d7", "4997d5", "4b96d3", "4d94d1", "5093cf", "5292cd", "5490cb", "578fc9", "598dc7", "5b8cc6", "5e8bc4", "6089c2", "6288c0", "6487be", "6785bc", "6984ba", "6b83b8", "6e81b6", "7080b4", "727eb2", "757db0", "777cae", "797aac", "7b79ab", "7e78a9", "8076a7", "8275a5", "8574a3", "8772a1", "89719f", "8c709d", "8e6e9b", "906d99", "926b97", "956a95", "976993", "996791", "9c668f", "9e658e", "a0638c", "a3628a", "a56188", "a75f86", "a95e84", "ac5c82", "ae5b80", "b05a7e", "b3587c", "b5577a", "b75678", "ba5476", "bc5374", "be5273", "c05071", "c34f6f", "c54e6d", "c74c6b", "ca4b69", "cc4967", "ce4865", "d14763", "d34561", "d5445f", "d7435d", "da415b", "dc4059", "de3f58", "e13d56", "e33c54", "e53a52", "e83950", "ea384e", "ec364c", "ee354a", "f13448", "f33246", "f53144", "f83042", "fa2e40"] + ], + "white_red": [ + [231, 255, 223, 216, 209, 202, 196], + ["ffffff", "fefefe", "fdfdfd", "fdfdfd", "fcfcfc", "fbfbfb", "fafafa", "fafafa", "f9f9f9", "f8f8f8", "f7f7f7", "f7f7f7", "f6f6f6", "f5f5f5", "f4f4f4", "f4f3f4", "f3f3f3", "f2f2f2", "f1f1f1", "f0f0f0", "f0f0f0", "efefef", "eeeeee", "efecea", "f1eae4", "f2e8de", "f3e6d8", "f5e4d3", "f6e2cd", "f7e0c7", "f8dec2", "f9dcbc", "fadab6", "fad8b1", "fbd5ac", "fbd2a9", "fbcea5", "fbcaa1", "fbc79e", "fbc39a", "fbc097", "fbbc93", "fbb88f", "fbb58c", "fab188", "faad85", "faaa81", "fba67e", "fba37a", "fb9f76", "fb9c73", "fb986f", "fb946c", "fb9168", "fa8d65", "fa8961", "fa865c", "fa8256", "fb7f4f", "fb7b48", "fb7841", "fb743a", "fb7133", "fb6d2c", "fa6a23", "fa661a", "fa620e", "fa5f03", "fa5d03", "fa5b03", "fa5a03", "fa5803", "fa5703", "fa5503", "fa5303", "fa5103", "fa4f03", "fa4e03", "fa4c03", "fa4a04", "fa4804", "fa4604", "fa4404", "fa4204", "fa3f04", "fa3d04", "fa3b04", "fa3805", "fa3605", "fa3305", "fb3105", "fb2e05", "fb2a05", "fb2705", "fb2306", "fb1f06", "fb1b06", "fb1506", "fb0e06", "fa0506", "fa0007"] + ], + "dark_green_gray": [ + [70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247], + ["51b000", "52b000", "54b000", "55b002", "56b007", "57b00d", "58b011", "59af15", "5aaf18", "5caf1b", "5daf1e", "5eaf21", "5faf23", "60ae25", "61ae27", "62ae2a", "63ae2c", "64ae2e", "65ae30", "66ae31", "67ad33", "68ad35", "69ad37", "69ad38", "6aad3a", "6bad3c", "6cac3d", "6dac3f", "6eac40", "6fac42", "70ac44", "70ac45", "71ab47", "72ab48", "73ab49", "74ab4b", "75ab4c", "75ab4e", "76aa4f", "77aa51", "78aa52", "79aa53", "79aa55", "7aaa56", "7ba957", "7ca959", "7ca95a", "7da95b", "7ea95d", "7fa95e", "7fa85f", "80a861", "81a862", "81a863", "82a865", "83a766", "83a767", "84a768", "85a76a", "85a76b", "86a66c", "87a66d", "87a66f", "88a670", "89a671", "89a672", "8aa574", "8ba575", "8ba576", "8ca577", "8da579", "8da47a", "8ea47b", "8ea47c", "8fa47d", "90a47f", "90a380", "91a381", "91a382", "92a384", "93a385", "93a286", "94a287", "94a288", "95a28a", "95a18b", "96a18c", "97a18d", "97a18e", "98a190", "98a091", "99a092", "99a093", "9aa094", "9aa096", "9b9f97", "9b9f98", "9c9f99", "9c9f9a", "9d9e9c", "9d9e9d"] + ], + "light_green_gray": [ + [148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250], + ["a3d900", "a4d800", "a4d800", "a5d805", "a5d80d", "a6d714", "a6d719", "a6d71d", "a7d621", "a7d625", "a8d628", "a8d62b", "a8d52e", "a9d531", "a9d533", "aad536", "aad438", "aad43a", "abd43d", "abd33f", "abd341", "acd343", "acd345", "acd247", "add249", "add24b", "add14d", "aed14f", "aed151", "aed152", "afd054", "afd056", "afd058", "b0d059", "b0cf5b", "b0cf5d", "b1cf5e", "b1ce60", "b1ce62", "b1ce63", "b2ce65", "b2cd67", "b2cd68", "b3cd6a", "b3cc6b", "b3cc6d", "b3cc6e", "b4cc70", "b4cb71", "b4cb73", "b4cb75", "b5ca76", "b5ca78", "b5ca79", "b5ca7a", "b6c97c", "b6c97d", "b6c97f", "b6c880", "b6c882", "b7c883", "b7c885", "b7c786", "b7c788", "b7c789", "b8c68a", "b8c68c", "b8c68d", "b8c68f", "b8c590", "b9c591", "b9c593", "b9c494", "b9c496", "b9c497", "b9c498", "bac39a", "bac39b", "bac39d", "bac29e", "bac29f", "bac2a1", "bac2a2", "bac1a4", "bbc1a5", "bbc1a6", "bbc0a8", "bbc0a9", "bbc0aa", "bbc0ac", "bbbfad", "bbbfae", "bbbfb0", "bbbeb1", "bcbeb3", "bcbeb4", "bcbdb5", "bcbdb7", "bcbdb8", "bcbdb9", "bcbcbb"] + ] + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/default.json b/powerline-bin/powerline/config_files/colorschemes/default.json new file mode 100644 index 0000000..7e271ef --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/default.json @@ -0,0 +1,56 @@ +{ + "name": "Default", + "groups": { + "information:additional": { "fg": "gray9", "bg": "gray4", "attrs": [] }, + "information:regular": { "fg": "gray10", "bg": "gray4", "attrs": ["bold"] }, + "information:highlighted": { "fg": "white", "bg": "gray4", "attrs": [] }, + "information:priority": { "fg": "brightyellow", "bg": "mediumorange", "attrs": [] }, + "warning:regular": { "fg": "white", "bg": "brightred", "attrs": ["bold"] }, + "critical:failure": { "fg": "white", "bg": "darkestred", "attrs": [] }, + "critical:success": { "fg": "white", "bg": "darkestgreen", "attrs": [] }, + "background": { "fg": "white", "bg": "gray0", "attrs": [] }, + "background:divider": { "fg": "gray5", "bg": "gray0", "attrs": [] }, + "session": { "fg": "black", "bg": "gray10", "attrs": ["bold"] }, + "date": { "fg": "gray8", "bg": "gray2", "attrs": [] }, + "time": { "fg": "gray10", "bg": "gray2", "attrs": ["bold"] }, + "time:divider": { "fg": "gray5", "bg": "gray2", "attrs": [] }, + "email_alert": "warning:regular", + "email_alert_gradient": { "fg": "white", "bg": "yellow_orange_red", "attrs": ["bold"] }, + "hostname": { "fg": "black", "bg": "gray10", "attrs": ["bold"] }, + "weather": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "weather_temp_gradient": { "fg": "blue_red", "bg": "gray0", "attrs": [] }, + "weather_condition_hot": { "fg": "khaki1", "bg": "gray0", "attrs": [] }, + "weather_condition_snowy": { "fg": "skyblue1", "bg": "gray0", "attrs": [] }, + "weather_condition_rainy": { "fg": "skyblue1", "bg": "gray0", "attrs": [] }, + "uptime": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "external_ip": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "internal_ip": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "network_load": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "network_load_gradient": { "fg": "green_yellow_orange_red", "bg": "gray0", "attrs": [] }, + "network_load_sent_gradient": "network_load_gradient", + "network_load_recv_gradient": "network_load_gradient", + "network_load:divider": "background:divider", + "system_load": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "system_load_gradient": { "fg": "green_yellow_orange_red", "bg": "gray0", "attrs": [] }, + "environment": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "cpu_load_percent": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "cpu_load_percent_gradient": { "fg": "green_yellow_orange_red", "bg": "gray0", "attrs": [] }, + "battery": { "fg": "gray8", "bg": "gray0", "attrs": [] }, + "battery_gradient": { "fg": "white_red", "bg": "gray0", "attrs": [] }, + "battery_full": { "fg": "red", "bg": "gray0", "attrs": [] }, + "battery_empty": { "fg": "white", "bg": "gray0", "attrs": [] }, + "player": { "fg": "gray10", "bg": "black", "attrs": [] }, + "user": { "fg": "white", "bg": "darkblue", "attrs": ["bold"] }, + "branch": { "fg": "gray9", "bg": "gray2", "attrs": [] }, + "branch_dirty": { "fg": "brightyellow", "bg": "gray2", "attrs": [] }, + "branch_clean": { "fg": "gray9", "bg": "gray2", "attrs": [] }, + "branch:divider": { "fg": "gray7", "bg": "gray2", "attrs": [] }, + "stash": "branch_dirty", + "stash:divider": "branch:divider", + "cwd": "information:additional", + "cwd:current_folder": "information:regular", + "cwd:divider": { "fg": "gray7", "bg": "gray4", "attrs": [] }, + "virtualenv": { "fg": "white", "bg": "darkcyan", "attrs": [] }, + "attached_clients": { "fg": "gray8", "bg": "gray0", "attrs": [] } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/ipython/__main__.json b/powerline-bin/powerline/config_files/colorschemes/ipython/__main__.json new file mode 100644 index 0000000..982ea35 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/ipython/__main__.json @@ -0,0 +1,6 @@ +{ + "groups": { + "prompt": "information:additional", + "prompt_count": "information:highlighted" + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/pdb/__main__.json b/powerline-bin/powerline/config_files/colorschemes/pdb/__main__.json new file mode 100644 index 0000000..01a51fe --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/pdb/__main__.json @@ -0,0 +1,8 @@ +{ + "groups": { + "current_code_name": "information:additional", + "current_context": "current_code_name", + "current_line": "information:regular", + "current_file": "information:regular" + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/pdb/default.json b/powerline-bin/powerline/config_files/colorschemes/pdb/default.json new file mode 100644 index 0000000..b97acf7 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/pdb/default.json @@ -0,0 +1,5 @@ +{ + "groups": { + "stack_depth": { "fg": "gray1", "bg": "gray10", "attrs": ["bold"] } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/pdb/solarized.json b/powerline-bin/powerline/config_files/colorschemes/pdb/solarized.json new file mode 100644 index 0000000..2e1c787 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/pdb/solarized.json @@ -0,0 +1,5 @@ +{ + "groups": { + "stack_depth": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/shell/__main__.json b/powerline-bin/powerline/config_files/colorschemes/shell/__main__.json new file mode 100644 index 0000000..6e3856f --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/shell/__main__.json @@ -0,0 +1,10 @@ +{ + "groups": { + "continuation": "cwd", + "continuation:current": "cwd:current_folder", + "exit_fail": "critical:failure", + "exit_success": "critical:success", + "jobnum": "information:priority", + "superuser": "warning:regular" + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/shell/default.json b/powerline-bin/powerline/config_files/colorschemes/shell/default.json new file mode 100644 index 0000000..1126feb --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/shell/default.json @@ -0,0 +1,16 @@ +{ + "name": "Default color scheme for shell prompts", + "groups": { + "hostname": { "fg": "brightyellow", "bg": "mediumorange", "attrs": [] }, + "environment": { "fg": "white", "bg": "darkestgreen", "attrs": [] }, + "mode": { "fg": "darkestgreen", "bg": "brightgreen", "attrs": ["bold"] }, + "attached_clients": { "fg": "white", "bg": "darkestgreen", "attrs": [] } + }, + "mode_translations": { + "vicmd": { + "groups": { + "mode": {"fg": "darkestcyan", "bg": "white", "attrs": ["bold"]} + } + } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/shell/solarized.json b/powerline-bin/powerline/config_files/colorschemes/shell/solarized.json new file mode 100644 index 0000000..69dcab1 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/shell/solarized.json @@ -0,0 +1,13 @@ +{ + "name": "Solarized dark for shell", + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": ["bold"] } + }, + "mode_translations": { + "vicmd": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/solarized.json b/powerline-bin/powerline/config_files/colorschemes/solarized.json new file mode 100644 index 0000000..c0eba5a --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/solarized.json @@ -0,0 +1,40 @@ +{ + "name": "Solarized dark", + "groups": { + "information:additional": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] }, + "information:regular": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] }, + "information:highlighted": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"]}, + "information:priority": { "fg": "solarized:base3", "bg": "solarized:yellow", "attrs": [] }, + "warning:regular": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": [] }, + "critical:failure": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": [] }, + "critical:success": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] }, + "background": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": [] }, + "background:divider": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "user": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }, + "virtualenv": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] }, + "branch": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "branch_dirty": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": [] }, + "branch_clean": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "stash": "branch_dirty", + "email_alert_gradient": { "fg": "solarized:base3", "bg": "yellow_orange_red", "attrs": [] }, + "email_alert": "warning:regular", + "cwd": "information:additional", + "cwd:current_folder": "information:regular", + "cwd:divider": { "fg": "solarized:base1", "bg": "solarized:base01", "attrs": [] }, + "network_load": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] }, + "network_load:divider": "network_load", + "network_load_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base03", "attrs": [] }, + "network_load_sent_gradient": "network_load_gradient", + "network_load_recv_gradient": "network_load_gradient", + "hostname": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "environment": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] }, + "attached_clients": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] }, + "date": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "time": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": ["bold"] }, + "time:divider": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "system_load": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] }, + "weather_temp_gradient": { "fg": "blue_red", "bg": "solarized:base03", "attrs": [] }, + "weather": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] }, + "uptime": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/tmux/default.json b/powerline-bin/powerline/config_files/colorschemes/tmux/default.json new file mode 100644 index 0000000..8525fb0 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/tmux/default.json @@ -0,0 +1,14 @@ +{ + "groups": { + "active_window_status": {"fg": "darkblue", "bg": "gray0", "attrs": []}, + "window_status": {"fg": "gray70", "bg": "gray0", "attrs": []}, + "activity_status": {"fg": "yellow", "bg": "gray0", "attrs": []}, + "bell_status": {"fg": "red", "bg": "gray0", "attrs": []}, + "window": {"fg": "gray6", "bg": "gray0", "attrs": []}, + "window:divider": {"fg": "gray4", "bg": "gray0", "attrs": []}, + "window:current": {"fg": "mediumcyan", "bg": "darkblue", "attrs": []}, + "window_name": {"fg": "white", "bg": "darkblue", "attrs": ["bold"]}, + "session": {"fg": "black", "bg": "gray90", "attrs": ["bold"]}, + "session:prefix": {"fg": "gray90", "bg": "darkblue", "attrs": ["bold"]} + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/tmux/solarized.json b/powerline-bin/powerline/config_files/colorschemes/tmux/solarized.json new file mode 100644 index 0000000..20c42d3 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/tmux/solarized.json @@ -0,0 +1,14 @@ +{ + "groups": { + "active_window_status": { "fg": "solarized:blue", "bg": "solarized:base02", "attrs": [] }, + "window_status": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "activity_status": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": [] }, + "bell_status": { "fg": "solarized:red", "bg": "solarized:base02", "attrs": [] }, + "window": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "window:divider": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": [] }, + "window:current": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "window_name": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] }, + "session": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "session:prefix": { "fg": "solarized:base01", "bg": "solarized:base3", "attrs": [] } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/vim/__main__.json b/powerline-bin/powerline/config_files/colorschemes/vim/__main__.json new file mode 100644 index 0000000..1ce2e7b --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/vim/__main__.json @@ -0,0 +1,50 @@ +{ + "groups": { + "branch_clean": "branch", + "environment": "information:unimportant", + "file_size": "information:unimportant", + "file_format": "information:unimportant", + "file_encoding": "file_format", + "file_type": "file_format", + "branch": "information:additional", + "file_scheme": "file_name", + "file_directory": "information:additional", + "file_name_empty": "file_directory", + "line_percent": "information:additional", + "line_count": "line_current", + "position": "information:additional", + "single_tab": "line_current", + "many_tabs": "line_current", + "bufnr": "file_directory", + "winnr": "information:unimportant", + "tabnr": "file_directory", + "capslock_indicator": "paste_indicator", + + "csv:column_number": "line_current", + "csv:column_name": "line_current_symbol", + + "tab:background": "background", + "tab:divider": "background:divider", + + "tab_nc:modified_indicator": "modified_indicator", + "tab_nc:file_directory": "information:unimportant", + "tab_nc:file_name": "tab_nc:file_directory", + "tab_nc:tabnr": "tab_nc:file_directory", + + "buf_nc:file_directory": "tab_nc:file_directory", + "buf_nc:file_name": "buf_nc:file_directory", + "buf_nc:bufnr": "buf_nc:file_directory", + "buf_nc:modified_indicator": "tab_nc:modified_indicator", + + "buf_nc_mod:file_directory": "tab_nc:file_directory", + "buf_nc_mod:file_name": "buf_nc_mod:file_directory", + "buf_nc_mod:bufnr": "buf_nc_mod:file_directory", + "buf_nc_mod:modified_indicator": "tab_nc:modified_indicator", + + + "commandt:label": "file_name", + "commandt:background": "background", + "commandt:finder": "file_name", + "commandt:path": "file_directory" + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/vim/default.json b/powerline-bin/powerline/config_files/colorschemes/vim/default.json new file mode 100644 index 0000000..e02a160 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/vim/default.json @@ -0,0 +1,154 @@ +{ + "name": "Default color scheme", + "groups": { + "information:unimportant": { "fg": "gray8", "bg": "gray2", "attrs": [] }, + "information:additional": { "fg": "gray9", "bg": "gray4", "attrs": [] }, + "background": { "fg": "white", "bg": "gray2", "attrs": [] }, + "background:divider": { "fg": "gray6", "bg": "gray2", "attrs": [] }, + "mode": { "fg": "darkestgreen", "bg": "brightgreen", "attrs": ["bold"] }, + "visual_range": { "fg": "brightestorange", "bg": "darkorange", "attrs": ["bold"] }, + "modified_indicator": { "fg": "brightyellow", "bg": "gray4", "attrs": ["bold"] }, + "paste_indicator": { "fg": "white", "bg": "mediumorange", "attrs": ["bold"] }, + "readonly_indicator": { "fg": "brightestred", "bg": "gray4", "attrs": [] }, + "branch_dirty": { "fg": "brightyellow", "bg": "gray4", "attrs": [] }, + "branch:divider": { "fg": "gray7", "bg": "gray4", "attrs": [] }, + "file_name": { "fg": "white", "bg": "gray4", "attrs": ["bold"] }, + "window_title": { "fg": "white", "bg": "gray4", "attrs": [] }, + "file_name_no_file": { "fg": "gray9", "bg": "gray4", "attrs": ["bold"] }, + "file_vcs_status": { "fg": "brightestred", "bg": "gray4", "attrs": [] }, + "file_vcs_status_M": { "fg": "brightyellow", "bg": "gray4", "attrs": [] }, + "file_vcs_status_A": { "fg": "brightgreen", "bg": "gray4", "attrs": [] }, + "line_percent": { "fg": "gray9", "bg": "gray4", "attrs": [] }, + "line_percent_gradient": { "fg": "dark_green_gray", "bg": "gray4", "attrs": [] }, + "position": { "fg": "gray9", "bg": "gray4", "attrs": [] }, + "position_gradient": { "fg": "green_yellow_red", "bg": "gray4", "attrs": [] }, + "line_current": { "fg": "gray1", "bg": "gray10", "attrs": ["bold"] }, + "line_current_symbol": { "fg": "gray1", "bg": "gray10", "attrs": [] }, + "virtcol_current_gradient": { "fg": "dark_GREEN_Orange_red", "bg": "gray10", "attrs": [] }, + "col_current": { "fg": "gray6", "bg": "gray10", "attrs": [] }, + "modified_buffers": { "fg": "brightyellow", "bg": "gray2", "attrs": [] }, + "attached_clients": { "fg": "gray8", "bg": "gray2", "attrs": [] }, + "error": { "fg": "brightestred", "bg": "darkred", "attrs": ["bold"] }, + "warning": { "fg": "brightyellow", "bg": "darkorange", "attrs": ["bold"] }, + "current_tag": { "fg": "gray9", "bg": "gray2", "attrs": [] }, + + "tab_nc:modified_indicator": { "fg": "brightyellow", "bg": "gray2", "attrs": ["bold"] } + }, + "mode_translations": { + "nc": { + "colors": { + "brightyellow": "darkorange", + "brightestred": "darkred", + "gray0": "gray0", + "gray1": "gray0", + "gray2": "gray0", + "gray3": "gray1", + "gray4": "gray1", + "gray5": "gray1", + "gray6": "gray1", + "gray7": "gray4", + "gray8": "gray4", + "gray9": "gray4", + "gray10": "gray5", + "white": "gray6", + "dark_green_gray": "gray5" + } + }, + "i": { + "colors": { + "gray0": "darkestblue", + "gray1": "darkestblue", + "gray2": "darkestblue", + "gray3": "darkblue", + "gray4": "darkblue", + "gray5": "darkestcyan", + "gray6": "darkestcyan", + "gray7": "darkestcyan", + "gray8": "mediumcyan", + "gray9": "mediumcyan", + "gray10": "mediumcyan", + "green_yellow_red": "gray5", + "dark_green_gray": "light_green_gray" + }, + "groups": { + "mode": { "fg": "darkestcyan", "bg": "white", "attrs": ["bold"] }, + "background:divider": { "fg": "darkcyan", "bg": "darkestblue", "attrs": [] }, + "branch:divider": { "fg": "darkcyan", "bg": "darkblue", "attrs": [] } + } + }, + "ic": { + "colors": { + "gray0": "darkestblue", + "gray1": "darkestblue", + "gray2": "darkestblue", + "gray3": "darkblue", + "gray4": "darkblue", + "gray5": "darkestcyan", + "gray6": "darkestcyan", + "gray7": "darkestcyan", + "gray8": "mediumcyan", + "gray9": "mediumcyan", + "gray10": "mediumcyan", + "green_yellow_red": "gray5", + "dark_green_gray": "light_green_gray" + }, + "groups": { + "mode": { "fg": "darkestcyan", "bg": "white", "attrs": ["bold"] }, + "background:divider": { "fg": "darkcyan", "bg": "darkestblue", "attrs": [] }, + "branch:divider": { "fg": "darkcyan", "bg": "darkblue", "attrs": [] } + } + }, + "ix": { + "colors": { + "gray0": "darkestblue", + "gray1": "darkestblue", + "gray2": "darkestblue", + "gray3": "darkblue", + "gray4": "darkblue", + "gray5": "darkestcyan", + "gray6": "darkestcyan", + "gray7": "darkestcyan", + "gray8": "mediumcyan", + "gray9": "mediumcyan", + "gray10": "mediumcyan", + "green_yellow_red": "gray5", + "dark_green_gray": "light_green_gray" + }, + "groups": { + "mode": { "fg": "darkestcyan", "bg": "white", "attrs": ["bold"] }, + "background:divider": { "fg": "darkcyan", "bg": "darkestblue", "attrs": [] }, + "branch:divider": { "fg": "darkcyan", "bg": "darkblue", "attrs": [] } + } + }, + "v": { + "groups": { + "mode": { "fg": "darkorange", "bg": "brightestorange", "attrs": ["bold"] } + } + }, + "V": { + "groups": { + "mode": { "fg": "darkorange", "bg": "brightestorange", "attrs": ["bold"] } + } + }, + "^V": { + "groups": { + "mode": { "fg": "darkorange", "bg": "brightestorange", "attrs": ["bold"] } + } + }, + "R": { + "groups": { + "mode": { "fg": "white", "bg": "brightred", "attrs": ["bold"] } + } + }, + "Rc": { + "groups": { + "mode": { "fg": "white", "bg": "brightred", "attrs": ["bold"] } + } + }, + "Rx": { + "groups": { + "mode": { "fg": "white", "bg": "brightred", "attrs": ["bold"] } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/vim/solarized.json b/powerline-bin/powerline/config_files/colorschemes/vim/solarized.json new file mode 100644 index 0000000..55cfaa7 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/vim/solarized.json @@ -0,0 +1,121 @@ +{ + "name": "Solarized dark for vim", + "groups": { + "information:additional": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] }, + "information:unimportant": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "background": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": [] }, + "background:divider": { "fg": "solarized:base00", "bg": "solarized:base02", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": ["bold"] }, + "visual_range": { "fg": "solarized:green", "bg": "solarized:base3", "attrs": ["bold"] }, + "modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base01", "attrs": ["bold"] }, + "paste_indicator": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }, + "readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base01", "attrs": [] }, + "branch_dirty": { "fg": "solarized:yellow", "bg": "solarized:base01", "attrs": [] }, + "branch:divider": { "fg": "solarized:base1", "bg": "solarized:base01", "attrs": [] }, + "stash:divider": "branch:divider", + "file_name": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] }, + "window_title": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "file_name_no_file": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] }, + "file_format": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base01", "attrs": [] }, + "file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base01", "attrs": [] }, + "file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base01", "attrs": [] }, + "line_percent": { "fg": "solarized:base3", "bg": "solarized:base00", "attrs": [] }, + "line_percent_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base00", "attrs": [] }, + "position": { "fg": "solarized:base3", "bg": "solarized:base00", "attrs": [] }, + "position_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base00", "attrs": [] }, + "line_current": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] }, + "line_current_symbol": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "virtcol_current_gradient": { "fg": "GREEN_Orange_red", "bg": "solarized:base2", "attrs": [] }, + "col_current": { "fg": "solarized:base0", "bg": "solarized:base2", "attrs": [] }, + "environment": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "attached_clients": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] }, + "error": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] }, + "warning": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }, + "current_tag": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": ["bold"] } + }, + "mode_translations": { + "nc": { + "colors": { + "solarized:base01": "solarized:base02", + "solarized:base00": "solarized:base02", + "solarized:base0": "solarized:base01", + "solarized:base1": "solarized:base00", + "solarized:base2": "solarized:base0", + "solarized:base3": "solarized:base1" + } + }, + "i": { + "groups": { + "background": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "background:divider": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }, + "modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": ["bold"] }, + "paste_indicator": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }, + "readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] }, + "branch": { "fg": "solarized:base01", "bg": "solarized:base2", "attrs": [] }, + "branch:divider": { "fg": "solarized:base00", "bg": "solarized:base2", "attrs": [] }, + "file_directory": { "fg": "solarized:base01", "bg": "solarized:base2", "attrs": [] }, + "file_name": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": ["bold"] }, + "file_size": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] }, + "file_name_no_file": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": ["bold"] }, + "file_name_empty": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] }, + "file_format": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] }, + "file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] }, + "file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": [] }, + "file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base2", "attrs": [] }, + "line_percent": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] }, + "line_percent_gradient": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] }, + "position": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] }, + "position_gradient": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] }, + "line_current": { "fg": "solarized:base03", "bg": "solarized:base3", "attrs": ["bold"] }, + "line_current_symbol": { "fg": "solarized:base03", "bg": "solarized:base3", "attrs": [] }, + "col_current": { "fg": "solarized:base0", "bg": "solarized:base3", "attrs": [] } + } + }, + "ic": { + "groups": { + "background": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "background:divider": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] } + } + }, + "ix": { + "groups": { + "background": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] }, + "background:divider": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] } + } + }, + "v": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] } + } + }, + "V": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] } + } + }, + "^V": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] } + } + }, + "R": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] } + } + }, + "Rc": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] } + } + }, + "Rx": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/colorschemes/vim/solarizedlight.json b/powerline-bin/powerline/config_files/colorschemes/vim/solarizedlight.json new file mode 100644 index 0000000..f862d39 --- /dev/null +++ b/powerline-bin/powerline/config_files/colorschemes/vim/solarizedlight.json @@ -0,0 +1,122 @@ +{ + "name": "Solarized light for vim", + "groups": { + "information:additional": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] }, + "information:unimportant": { "fg": "solarized:base1", "bg": "solarized:base01", "attrs": [] }, + "background": { "fg": "solarized:base03", "bg": "solarized:base01", "attrs": [] }, + "background:divider": { "fg": "solarized:base0", "bg": "solarized:base01", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": ["bold"] }, + "visual_range": { "fg": "solarized:green", "bg": "solarized:base3", "attrs": ["bold"] }, + "modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": ["bold"] }, + "paste_indicator": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": ["bold"] }, + "readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] }, + "branch_dirty": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": [] }, + "branch:divider": { "fg": "solarized:base1", "bg": "solarized:base2", "attrs": [] }, + "stash": "branch_dirty", + "stash:divider": "branch:divider", + "file_name": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] }, + "window_title": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "file_size": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "file_name_no_file": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] }, + "file_name_empty": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] }, + "file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": [] }, + "file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base2", "attrs": [] }, + "line_percent": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "line_percent_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base2", "attrs": [] }, + "position": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "position_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base2", "attrs": [] }, + "line_current": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": ["bold"] }, + "line_current_symbol": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": [] }, + "virtcol_current_gradient": { "fg": "yellow_orange_red", "bg": "solarized:base02", "attrs": [] }, + "col_current": { "fg": "solarized:base00", "bg": "solarized:base02", "attrs": [] }, + "error": { "fg": "solarized:base03", "bg": "solarized:red", "attrs": ["bold"] }, + "warning": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] }, + "current_tag": { "fg": "solarized:base03", "bg": "solarized:base01", "attrs": ["bold"] } + }, + "mode_translations": { + "nc": { + "colors": { + "solarized:base2": "solarized:base01", + "solarized:base0": "solarized:base01", + "solarized:base00": "solarized:base2", + "solarized:base1": "solarized:base0", + "solarized:base02": "solarized:base00", + "solarized:base03": "solarized:base1" + } + }, + "i": { + "groups": { + "background": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "background:divider": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }, + "modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": ["bold"] }, + "paste_indicator": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }, + "readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base02", "attrs": [] }, + "branch": { "fg": "solarized:base2", "bg": "solarized:base02", "attrs": [] }, + "branch:divider": { "fg": "solarized:base0", "bg": "solarized:base02", "attrs": [] }, + "file_directory": { "fg": "solarized:base2", "bg": "solarized:base02", "attrs": [] }, + "file_name": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": ["bold"] }, + "file_size": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": [] }, + "file_name_no_file": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": ["bold"] }, + "file_name_empty": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": [] }, + "file_format": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] }, + "file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base02", "attrs": [] }, + "file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": [] }, + "file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base02", "attrs": [] }, + "line_percent": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] }, + "line_percent_gradient": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] }, + "position": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] }, + "position_gradient": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] }, + "line_current": { "fg": "solarized:base3", "bg": "solarized:base03", "attrs": ["bold"] }, + "line_current_symbol": { "fg": "solarized:base3", "bg": "solarized:base03", "attrs": [] }, + "virtcol_current_gradient": { "fg": "yellow_orange_red", "bg": "solarized:base03", "attrs": [] }, + "col_current": { "fg": "solarized:base00", "bg": "solarized:base03", "attrs": [] } + } + }, + "ic": { + "groups": { + "background": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "background:divider": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] } + } + }, + "ix": { + "groups": { + "background": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] }, + "background:divider": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] }, + "mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] } + } + }, + "v": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] } + } + }, + "V": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] } + } + }, + "^V": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] } + } + }, + "R": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] } + } + }, + "Rc": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] } + } + }, + "Rx": { + "groups": { + "mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/config.json b/powerline-bin/powerline/config_files/config.json new file mode 100644 index 0000000..4491885 --- /dev/null +++ b/powerline-bin/powerline/config_files/config.json @@ -0,0 +1,53 @@ +{ + "common": { + "term_truecolor": false + }, + "ext": { + "ipython": { + "colorscheme": "default", + "theme": "in", + "local_themes": { + "rewrite": "rewrite", + "out": "out", + "in2": "in2" + } + }, + "pdb": { + "colorscheme": "default", + "theme": "default" + }, + "shell": { + "colorscheme": "default", + "theme": "default", + "local_themes": { + "continuation": "continuation", + "select": "select" + } + }, + "tmux": { + "colorscheme": "default", + "theme": "default" + }, + "vim": { + "colorscheme": "default", + "theme": "default", + "local_themes": { + "__tabline__": "tabline", + + "cmdwin": "cmdwin", + "help": "help", + "quickfix": "quickfix", + + "powerline.matchers.vim.plugin.nerdtree.nerdtree": "plugin_nerdtree", + "powerline.matchers.vim.plugin.commandt.commandt": "plugin_commandt", + "powerline.matchers.vim.plugin.gundo.gundo": "plugin_gundo", + "powerline.matchers.vim.plugin.gundo.gundo_preview": "plugin_gundo-preview" + } + }, + "wm": { + "colorscheme": "default", + "theme": "default", + "update_interval": 2 + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/ascii.json b/powerline-bin/powerline/config_files/themes/ascii.json new file mode 100644 index 0000000..0ea05e7 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/ascii.json @@ -0,0 +1,153 @@ +{ + "use_non_breaking_spaces": false, + "dividers": { + "left": { + "hard": " ", + "soft": "| " + }, + "right": { + "hard": " ", + "soft": " |" + } + }, + "spaces": 1, + "segment_data": { + "branch": { + "before": "BR " + }, + "stash": { + "before": "ST " + }, + "cwd": { + "args": { + "ellipsis": "..." + } + }, + "player": { + "args": { + "state_symbols": { + "fallback": "", + "play": ">", + "pause": "~", + "stop": "X" + } + } + }, + + "line_current_symbol": { + "contents": "LN " + }, + + "time": { + "before": "" + }, + + "powerline.segments.common.net.network_load": { + "args": { + "recv_format": "DL {value:>8}", + "sent_format": "UL {value:>8}" + } + }, + "powerline.segments.common.net.hostname": { + "before": "H " + }, + "powerline.segments.common.bat.battery": { + "args": { + "full_heart": "O", + "empty_heart": "O", + "online": "C", + "offline": " " + } + }, + "powerline.segments.common.sys.uptime": { + "before": "UP " + }, + "powerline.segments.common.mail.email_imap_alert": { + "before": "MAIL " + }, + "powerline.segments.common.env.virtualenv": { + "before": "(e) " + }, + "powerline.segments.common.wthr.weather": { + "args": { + "icons": { + "day": "DAY", + "blustery": "WIND", + "rainy": "RAIN", + "cloudy": "CLOUDS", + "snowy": "SNOW", + "stormy": "STORM", + "foggy": "FOG", + "sunny": "SUN", + "night": "NIGHT", + "windy": "WINDY", + "not_available": "NA", + "unknown": "UKN" + }, + "temp_format": "{temp:.0f} C" + } + }, + "powerline.segments.common.time.fuzzy_time": { + "args": { + "unicode_text": false + } + }, + + "powerline.segments.vim.mode": { + "args": { + "override": { + "n": "NORMAL", + "no": "N-OPER", + "v": "VISUAL", + "V": "V-LINE", + "^V": "V-BLCK", + "s": "SELECT", + "S": "S-LINE", + "^S": "S-BLCK", + "i": "INSERT", + "ic": "I-COMP", + "ix": "I-C_X ", + "R": "RPLACE", + "Rv": "V-RPLC", + "Rc": "R-COMP", + "Rx": "R-C_X ", + "c": "COMMND", + "cv": "VIM-EX", + "ce": "NRM-EX", + "r": "PROMPT", + "rm": "-MORE-", + "r?": "CNFIRM", + "!": "!SHELL", + "t": "TERM " + } + } + }, + "powerline.segments.vim.visual_range": { + "args": { + "CTRL_V_text": "{rows} x {vcols}", + "v_text_oneline": "C:{vcols}", + "v_text_multiline": "L:{rows}", + "V_text": "L:{rows}" + } + }, + "powerline.segments.vim.readonly_indicator": { + "args": { + "text": "RO" + } + }, + "powerline.segments.vim.modified_indicator": { + "args": { + "text": "+" + } + }, + + "powerline.segments.i3wm.scratchpad": { + "args": { + "icons": { + "fresh": "O", + "changed": "X" + } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/ipython/in.json b/powerline-bin/powerline/config_files/themes/ipython/in.json new file mode 100644 index 0000000..edd4d29 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/ipython/in.json @@ -0,0 +1,25 @@ +{ + "segments": { + "left": [ + { + "function": "powerline.segments.common.env.virtualenv", + "priority": 10 + }, + { + "type": "string", + "contents": "In [", + "draw_soft_divider": false, + "highlight_groups": ["prompt"] + }, + { + "function": "powerline.segments.ipython.prompt_count", + "draw_soft_divider": false + }, + { + "type": "string", + "contents": "]", + "highlight_groups": ["prompt"] + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/ipython/in2.json b/powerline-bin/powerline/config_files/themes/ipython/in2.json new file mode 100644 index 0000000..422c44b --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/ipython/in2.json @@ -0,0 +1,12 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "contents": "", + "width": "auto", + "highlight_groups": ["prompt"] + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/ipython/out.json b/powerline-bin/powerline/config_files/themes/ipython/out.json new file mode 100644 index 0000000..2425d0b --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/ipython/out.json @@ -0,0 +1,24 @@ +{ + "default_module": "powerline.segments.ipython", + "segments": { + "left": [ + { + "type": "string", + "contents": "Out[", + "draw_soft_divider": false, + "width": "auto", + "align": "r", + "highlight_groups": ["prompt"] + }, + { + "function": "prompt_count", + "draw_soft_divider": false + }, + { + "type": "string", + "contents": "]", + "highlight_groups": ["prompt"] + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/ipython/rewrite.json b/powerline-bin/powerline/config_files/themes/ipython/rewrite.json new file mode 100644 index 0000000..8192fe4 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/ipython/rewrite.json @@ -0,0 +1,23 @@ +{ + "default_module": "powerline.segments.ipython", + "segments": { + "left": [ + { + "type": "string", + "contents": "", + "draw_soft_divider": false, + "width": "auto", + "highlight_groups": ["prompt"] + }, + { + "function": "prompt_count", + "draw_soft_divider": false + }, + { + "type": "string", + "contents": ">", + "highlight_groups": ["prompt"] + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/pdb/default.json b/powerline-bin/powerline/config_files/themes/pdb/default.json new file mode 100644 index 0000000..dcae108 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/pdb/default.json @@ -0,0 +1,27 @@ +{ + "default_module": "powerline.segments.pdb", + "segments": { + "left": [ + { + "function": "stack_depth" + }, + { + "type": "segment_list", + "function": "powerline.listers.pdb.frame_lister", + "segments": [ + { + "function": "current_file", + "after": ":" + }, + { + "function": "current_line", + "after": " " + }, + { + "function": "current_code_name" + } + ] + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/powerline.json b/powerline-bin/powerline/config_files/themes/powerline.json new file mode 100644 index 0000000..366a7ea --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/powerline.json @@ -0,0 +1,151 @@ +{ + "dividers": { + "left": { + "hard": " ", + "soft": " " + }, + "right": { + "hard": " ", + "soft": " " + } + }, + "spaces": 1, + "segment_data": { + "branch": { + "before": " " + }, + "stash": { + "before": "⌆ " + }, + "cwd": { + "args": { + "ellipsis": "⋯" + } + }, + + "line_current_symbol": { + "contents": " " + }, + "player": { + "args": { + "state_symbols": { + "fallback": "♫", + "play": "▶", + "pause": "▮▮", + "stop": "■" + } + } + }, + + "time": { + "before": "⌚ " + }, + + "powerline.segments.common.net.network_load": { + "args": { + "recv_format": "⬇ {value:>8}", + "sent_format": "⬆ {value:>8}" + } + }, + "powerline.segments.common.net.hostname": { + "before": " " + }, + "powerline.segments.common.bat.battery": { + "args": { + "full_heart": "♥", + "empty_heart": "♥", + "online": "⚡︎", + "offline": " " + } + }, + "powerline.segments.common.sys.uptime": { + "before": "⇑ " + }, + "powerline.segments.common.mail.email_imap_alert": { + "before": "✉ " + }, + "powerline.segments.common.env.virtualenv": { + "before": "ⓔ " + }, + "powerline.segments.common.wthr.weather": { + "args": { + "icons": { + "day": "〇", + "blustery": "⚑", + "rainy": "☔", + "cloudy": "☁", + "snowy": "❅", + "stormy": "☈", + "foggy": "≡", + "sunny": "☼", + "night": "☾", + "windy": "☴", + "not_available": "�", + "unknown": "⚠" + } + } + }, + "powerline.segments.common.time.fuzzy_time": { + "args": { + "unicode_text": true + } + }, + + "powerline.segments.vim.mode": { + "args": { + "override": { + "n": "NORMAL", + "no": "N·OPER", + "v": "VISUAL", + "V": "V·LINE", + "^V": "V·BLCK", + "s": "SELECT", + "S": "S·LINE", + "^S": "S·BLCK", + "i": "INSERT", + "ic": "I·COMP", + "ix": "I·C-X ", + "R": "RPLACE", + "Rv": "V·RPLC", + "Rc": "R·COMP", + "Rx": "R·C-X ", + "c": "COMMND", + "cv": "VIM·EX", + "ce": "NRM·EX", + "r": "PROMPT", + "rm": "-MORE-", + "r?": "CNFIRM", + "!": "!SHELL", + "t": "TERM " + } + } + }, + "powerline.segments.vim.visual_range": { + "args": { + "CTRL_V_text": "↕{rows} ↔{vcols}", + "v_text_oneline": "↔{vcols}", + "v_text_multiline": "↕{rows}", + "V_text": "⇕{rows}" + } + }, + "powerline.segments.vim.readonly_indicator": { + "args": { + "text": "" + } + }, + "powerline.segments.vim.modified_indicator": { + "args": { + "text": "+" + } + }, + + "powerline.segments.i3wm.scratchpad": { + "args": { + "icons": { + "fresh": "●", + "changed": "○" + } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/powerline_terminus.json b/powerline-bin/powerline/config_files/themes/powerline_terminus.json new file mode 100644 index 0000000..e5fb1c8 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/powerline_terminus.json @@ -0,0 +1,151 @@ +{ + "dividers": { + "left": { + "hard": " ", + "soft": " " + }, + "right": { + "hard": " ", + "soft": " " + } + }, + "spaces": 1, + "segment_data": { + "branch": { + "before": " " + }, + "stash": { + "before": "ST " + }, + "cwd": { + "args": { + "ellipsis": "…" + } + }, + + "line_current_symbol": { + "contents": " " + }, + "player": { + "args": { + "state_symbols": { + "fallback": "♫", + "play": "▶", + "pause": "▮▮", + "stop": "■" + } + } + }, + + "time": { + "before": "" + }, + + "powerline.segments.common.net.network_load": { + "args": { + "recv_format": "⇓ {value:>8}", + "sent_format": "⇑ {value:>8}" + } + }, + "powerline.segments.common.net.hostname": { + "before": " " + }, + "powerline.segments.common.bat.battery": { + "args": { + "full_heart": "♥", + "empty_heart": "♥", + "online": "⚡︎", + "offline": " " + } + }, + "powerline.segments.common.sys.uptime": { + "before": "↑ " + }, + "powerline.segments.common.mail.email_imap_alert": { + "before": "MAIL " + }, + "powerline.segments.common.env.virtualenv": { + "before": "(e) " + }, + "powerline.segments.common.wthr.weather": { + "args": { + "icons": { + "day": "DAY", + "blustery": "WIND", + "rainy": "RAIN", + "cloudy": "CLOUDS", + "snowy": "SNOW", + "stormy": "STORM", + "foggy": "FOG", + "sunny": "SUN", + "night": "NIGHT", + "windy": "WINDY", + "not_available": "NA", + "unknown": "UKN" + } + } + }, + "powerline.segments.common.time.fuzzy_time": { + "args": { + "unicode_text": true + } + }, + + "powerline.segments.vim.mode": { + "args": { + "override": { + "n": "NORMAL", + "no": "N·OPER", + "v": "VISUAL", + "V": "V·LINE", + "^V": "V·BLCK", + "s": "SELECT", + "S": "S·LINE", + "^S": "S·BLCK", + "i": "INSERT", + "ic": "I·COMP", + "ix": "I·C-X ", + "R": "RPLACE", + "Rv": "V·RPLC", + "Rc": "R·COMP", + "Rx": "R·C-X ", + "c": "COMMND", + "cv": "VIM·EX", + "ce": "NRM·EX", + "r": "PROMPT", + "rm": "-MORE-", + "r?": "CNFIRM", + "!": "!SHELL", + "t": "TERM " + } + } + }, + "powerline.segments.vim.visual_range": { + "args": { + "CTRL_V_text": "↕{rows} ↔{vcols}", + "v_text_oneline": "↔{vcols}", + "v_text_multiline": "↕{rows}", + "V_text": "⇕{rows}" + } + }, + "powerline.segments.vim.readonly_indicator": { + "args": { + "text": "" + } + }, + "powerline.segments.vim.modified_indicator": { + "args": { + "text": "+" + } + }, + + "powerline.segments.i3wm.scratchpad": { + "args": { + "icons": { + "fresh": "●", + "changed": "○" + } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/powerline_unicode7.json b/powerline-bin/powerline/config_files/themes/powerline_unicode7.json new file mode 100644 index 0000000..bd62826 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/powerline_unicode7.json @@ -0,0 +1,165 @@ +{ + "dividers": { + "left": { + "hard": " ", + "soft": " " + }, + "right": { + "hard": " ", + "soft": " " + } + }, + "spaces": 1, + "segment_data": { + "branch": { + "before": "🔀 " + }, + "stash": { + "before": "📝" + }, + "cwd": { + "args": { + "ellipsis": "⋯" + } + }, + + "line_current_symbol": { + "contents": " " + }, + "player": { + "args": { + "state_symbols": { + "fallback": "♫", + "play": "⏵", + "pause": "⏸", + "stop": "⏹" + } + } + }, + + "time": { + "before": "🕐 " + }, + + "powerline.segments.common.net.network_load": { + "args": { + "recv_format": "⬇ {value:>8}", + "sent_format": "⬆ {value:>8}" + } + }, + "powerline.segments.common.net.hostname": { + "before": "🏠 " + }, + "powerline.segments.common.bat.battery": { + "args": { + "full_heart": "💙", + "empty_heart": "💛", + "online": "⚡️", + "offline": " " + } + }, + "powerline.segments.common.sys.uptime": { + "before": "⇑ " + }, + "powerline.segments.common.mail.email_imap_alert": { + "before": "✉ " + }, + "powerline.segments.common.env.virtualenv": { + "before": "🐍 " + }, + "powerline.segments.common.wthr.weather": { + "args": { + "icons": { + "tornado": "🌪", + "hurricane": "🌀", + "showers": "☔", + "scattered_showers": "☔", + "thunderstorms": "🌩", + "isolated_thunderstorms": "🌩", + "scattered_thunderstorms": "🌩", + "dust": "🌫", + "fog": "🌫", + "cold": "❄", + "partly_cloudy_day": "🌤", + "mostly_cloudy_day": "🌥", + "sun": "🌣", + "hot": "♨", + "day": "☀", + "blustery": "⚑", + "rainy": "☂", + "cloudy": "☁", + "snowy": "☃", + "stormy": "☈", + "foggy": "🌁", + "sunny": "🌣", + "night": "☾", + "windy": "☴", + "not_available": "�", + "unknown": "⚠" + } + } + }, + "powerline.segments.common.time.fuzzy_time": { + "args": { + "unicode_text": true + } + }, + + "powerline.segments.vim.mode": { + "args": { + "override": { + "n": "NORMAL", + "no": "N·OPER", + "v": "VISUAL", + "V": "V·LINE", + "^V": "V·BLCK", + "s": "SELECT", + "S": "S·LINE", + "^S": "S·BLCK", + "i": "INSERT", + "ic": "I·COMP", + "ix": "I·C-X ", + "R": "RPLACE", + "Rv": "V·RPLC", + "Rc": "R·COMP", + "Rx": "R·C-X ", + "c": "COMMND", + "cv": "VIM·EX", + "ce": "NRM·EX", + "r": "PROMPT", + "rm": "-MORE-", + "r?": "CNFIRM", + "!": "!SHELL", + "t": "TERM " + } + } + }, + "powerline.segments.vim.visual_range": { + "args": { + "CTRL_V_text": "↕{rows} ↔{vcols}", + "v_text_oneline": "↔{vcols}", + "v_text_multiline": "↕{rows}", + "V_text": "⇕{rows}" + } + }, + "powerline.segments.vim.readonly_indicator": { + "args": { + "text": "🔏" + } + }, + "powerline.segments.vim.modified_indicator": { + "args": { + "text": "🖫⃥" + } + }, + + "powerline.segments.i3wm.scratchpad": { + "args": { + "icons": { + "fresh": "●", + "changed": "○" + } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/shell/__main__.json b/powerline-bin/powerline/config_files/themes/shell/__main__.json new file mode 100644 index 0000000..13ae942 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/shell/__main__.json @@ -0,0 +1,14 @@ +{ + "segment_data": { + "hostname": { + "args": { + "only_if_ssh": true + } + }, + "cwd": { + "args": { + "dir_limit_depth": 3 + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/shell/continuation.json b/powerline-bin/powerline/config_files/themes/shell/continuation.json new file mode 100644 index 0000000..9307fc0 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/shell/continuation.json @@ -0,0 +1,12 @@ +{ + "default_module": "powerline.segments.shell", + "segments": { + "left": [ + { + "function": "continuation" + } + ], + "right": [ + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/shell/default.json b/powerline-bin/powerline/config_files/themes/shell/default.json new file mode 100644 index 0000000..38039d8 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/shell/default.json @@ -0,0 +1,43 @@ +{ + "segments": { + "left": [ + { + "function": "powerline.segments.shell.mode" + }, + { + "function": "powerline.segments.common.net.hostname", + "priority": 10 + }, + { + "function": "powerline.segments.common.env.user", + "priority": 30 + }, + { + "function": "powerline.segments.common.env.virtualenv", + "priority": 50 + }, + { + "function": "powerline.segments.shell.cwd", + "priority": 10 + }, + { + "function": "powerline.segments.shell.jobnum", + "priority": 20 + } + ], + "right": [ + { + "function": "powerline.segments.shell.last_pipe_status", + "priority": 10 + }, + { + "function": "powerline.segments.common.vcs.stash", + "priority": 50 + }, + { + "function": "powerline.segments.common.vcs.branch", + "priority": 40 + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/shell/default_leftonly.json b/powerline-bin/powerline/config_files/themes/shell/default_leftonly.json new file mode 100644 index 0000000..b576273 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/shell/default_leftonly.json @@ -0,0 +1,34 @@ +{ + "segments": { + "left": [ + { + "function": "powerline.segments.common.net.hostname", + "priority": 10 + }, + { + "function": "powerline.segments.common.env.user", + "priority": 30 + }, + { + "function": "powerline.segments.common.env.virtualenv", + "priority": 50 + }, + { + "function": "powerline.segments.common.vcs.branch", + "priority": 40 + }, + { + "function": "powerline.segments.shell.cwd", + "priority": 10 + }, + { + "function": "powerline.segments.shell.jobnum", + "priority": 20 + }, + { + "function": "powerline.segments.shell.last_pipe_status", + "priority": 10 + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/shell/select.json b/powerline-bin/powerline/config_files/themes/shell/select.json new file mode 100644 index 0000000..3d81408 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/shell/select.json @@ -0,0 +1,13 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "contents": "Select variant", + "width": "auto", + "align": "r", + "highlight_groups": ["continuation:current"] + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/tmux/default.json b/powerline-bin/powerline/config_files/themes/tmux/default.json new file mode 100644 index 0000000..4532ced --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/tmux/default.json @@ -0,0 +1,28 @@ +{ + "segments": { + "right": [ + { + "function": "powerline.segments.common.sys.uptime", + "priority": 50 + }, + { + "function": "powerline.segments.common.sys.system_load", + "priority": 50 + }, + { + "function": "powerline.segments.common.time.date" + }, + { + "function": "powerline.segments.common.time.date", + "name": "time", + "args": { + "format": "%H:%M", + "istime": true + } + }, + { + "function": "powerline.segments.common.net.hostname" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/unicode.json b/powerline-bin/powerline/config_files/themes/unicode.json new file mode 100644 index 0000000..0802852 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/unicode.json @@ -0,0 +1,151 @@ +{ + "dividers": { + "left": { + "hard": "▌ ", + "soft": "│ " + }, + "right": { + "hard": " ▐", + "soft": " │" + } + }, + "spaces": 1, + "segment_data": { + "branch": { + "before": "⎇ " + }, + "stash": { + "before": "⌆" + }, + "cwd": { + "args": { + "ellipsis": "⋯" + } + }, + "player": { + "args": { + "state_symbols": { + "fallback": "♫", + "play": "▶", + "pause": "▮▮", + "stop": "■" + } + } + }, + + "line_current_symbol": { + "contents": "␤ " + }, + + "time": { + "before": "⌚ " + }, + + "powerline.segments.common.net.network_load": { + "args": { + "recv_format": "⬇ {value:>8}", + "sent_format": "⬆ {value:>8}" + } + }, + "powerline.segments.common.net.hostname": { + "before": "⌂ " + }, + "powerline.segments.common.bat.battery": { + "args": { + "full_heart": "♥", + "empty_heart": "♥", + "online": "⚡︎", + "offline": " " + } + }, + "powerline.segments.common.sys.uptime": { + "before": "⇑ " + }, + "powerline.segments.common.mail.email_imap_alert": { + "before": "✉ " + }, + "powerline.segments.common.env.virtualenv": { + "before": "ⓔ " + }, + "powerline.segments.common.wthr.weather": { + "args": { + "icons": { + "day": "〇", + "blustery": "⚑", + "rainy": "☔", + "cloudy": "☁", + "snowy": "❅", + "stormy": "☈", + "foggy": "≡", + "sunny": "☼", + "night": "☾", + "windy": "☴", + "not_available": "�", + "unknown": "⚠" + } + } + }, + "powerline.segments.common.time.fuzzy_time": { + "args": { + "unicode_text": true + } + }, + + "powerline.segments.vim.mode": { + "args": { + "override": { + "n": "NORMAL", + "no": "N·OPER", + "v": "VISUAL", + "V": "V·LINE", + "^V": "V·BLCK", + "s": "SELECT", + "S": "S·LINE", + "^S": "S·BLCK", + "i": "INSERT", + "ic": "I·COMP", + "ix": "I·C-X ", + "R": "RPLACE", + "Rv": "V·RPLC", + "Rc": "R·COMP", + "Rx": "R·C-X ", + "c": "COMMND", + "cv": "VIM·EX", + "ce": "NRM·EX", + "r": "PROMPT", + "rm": "-MORE-", + "r?": "CNFIRM", + "!": "!SHELL", + "t": "TERM " + } + } + }, + "powerline.segments.vim.visual_range": { + "args": { + "CTRL_V_text": "↕{rows} ↔{vcols}", + "v_text_oneline": "↔{vcols}", + "v_text_multiline": "↕{rows}", + "V_text": "⇕{rows}" + } + }, + "powerline.segments.vim.readonly_indicator": { + "args": { + "text": "⊗" + } + }, + "powerline.segments.vim.modified_indicator": { + "args": { + "text": "+" + } + }, + + "powerline.segments.i3wm.scratchpad": { + "args": { + "icons": { + "fresh": "●", + "changed": "○" + } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/unicode_terminus.json b/powerline-bin/powerline/config_files/themes/unicode_terminus.json new file mode 100644 index 0000000..9c76985 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/unicode_terminus.json @@ -0,0 +1,151 @@ +{ + "dividers": { + "left": { + "hard": "▌ ", + "soft": "│ " + }, + "right": { + "hard": " ▐", + "soft": " │" + } + }, + "spaces": 1, + "segment_data": { + "branch": { + "before": "BR " + }, + "stash": { + "before": "ST " + }, + "cwd": { + "args": { + "ellipsis": "…" + } + }, + + "line_current_symbol": { + "contents": "␤ " + }, + "player": { + "args": { + "state_symbols": { + "fallback": "♫", + "play": "▶", + "pause": "▮▮", + "stop": "■" + } + } + }, + + "time": { + "before": "" + }, + + "powerline.segments.common.net.network_load": { + "args": { + "recv_format": "⇓ {value:>8}", + "sent_format": "⇑ {value:>8}" + } + }, + "powerline.segments.common.net.hostname": { + "before": "⌂ " + }, + "powerline.segments.common.bat.battery": { + "args": { + "full_heart": "♥", + "empty_heart": "♥", + "online": "⚡︎", + "offline": " " + } + }, + "powerline.segments.common.sys.uptime": { + "before": "↑ " + }, + "powerline.segments.common.mail.email_imap_alert": { + "before": "MAIL " + }, + "powerline.segments.common.env.virtualenv": { + "before": "(e) " + }, + "powerline.segments.common.wthr.weather": { + "args": { + "icons": { + "day": "DAY", + "blustery": "WIND", + "rainy": "RAIN", + "cloudy": "CLOUDS", + "snowy": "SNOW", + "stormy": "STORM", + "foggy": "FOG", + "sunny": "SUN", + "night": "NIGHT", + "windy": "WINDY", + "not_available": "NA", + "unknown": "UKN" + } + } + }, + "powerline.segments.common.time.fuzzy_time": { + "args": { + "unicode_text": true + } + }, + + "powerline.segments.vim.mode": { + "args": { + "override": { + "n": "NORMAL", + "no": "N·OPER", + "v": "VISUAL", + "V": "V·LINE", + "^V": "V·BLCK", + "s": "SELECT", + "S": "S·LINE", + "^S": "S·BLCK", + "i": "INSERT", + "ic": "I·COMP", + "ix": "I·C-X ", + "R": "RPLACE", + "Rv": "V·RPLC", + "Rc": "R·COMP", + "Rx": "R·C-X ", + "c": "COMMND", + "cv": "VIM·EX", + "ce": "NRM·EX", + "r": "PROMPT", + "rm": "-MORE-", + "r?": "CNFIRM", + "!": "!SHELL", + "t": "TERM " + } + } + }, + "powerline.segments.vim.visual_range": { + "args": { + "CTRL_V_text": "{rows} × {vcols}", + "v_text_oneline": "C:{vcols}", + "v_text_multiline": "L:{rows}", + "V_text": "L:{rows}" + } + }, + "powerline.segments.vim.readonly_indicator": { + "args": { + "text": "RO" + } + }, + "powerline.segments.vim.modified_indicator": { + "args": { + "text": "+" + } + }, + + "powerline.segments.i3wm.scratchpad": { + "args": { + "icons": { + "fresh": "●", + "changed": "○" + } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/unicode_terminus_condensed.json b/powerline-bin/powerline/config_files/themes/unicode_terminus_condensed.json new file mode 100644 index 0000000..421f5c8 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/unicode_terminus_condensed.json @@ -0,0 +1,151 @@ +{ + "dividers": { + "left": { + "hard": "▌", + "soft": "│" + }, + "right": { + "hard": "▐", + "soft": "│" + } + }, + "spaces": 0, + "segment_data": { + "branch": { + "before": "B " + }, + "stash": { + "before": "S " + }, + "cwd": { + "args": { + "use_path_separator": true, + "ellipsis": "…" + } + }, + + "line_current_symbol": { + "contents": "␤" + }, + "player": { + "args": { + "state_symbols": { + "fallback": "♫", + "play": "▶", + "pause": "▮▮", + "stop": "■" + } + } + }, + + "time": { + "before": "" + }, + + "powerline.segments.common.net.network_load": { + "args": { + "recv_format": "⇓{value:>8}", + "sent_format": "⇑{value:>8}" + } + }, + "powerline.segments.common.net.hostname": { + "before": "⌂" + }, + "powerline.segments.common.bat.battery": { + "args": { + "full_heart": "♥", + "empty_heart": "♥", + "online": "⚡︎", + "offline": " " + } + }, + "powerline.segments.common.sys.uptime": { + "before": "↑" + }, + "powerline.segments.common.mail.email_imap_alert": { + "before": "M " + }, + "powerline.segments.common.env.virtualenv": { + "before": "E " + }, + "powerline.segments.common.wthr.weather": { + "args": { + "icons": { + "day": "D", + "blustery": "W", + "rainy": "R", + "cloudy": "c", + "snowy": "*", + "stormy": "S", + "foggy": "f", + "sunny": "s", + "night": "N", + "windy": "w", + "not_available": "-", + "unknown": "!" + } + } + }, + "powerline.segments.common.time.fuzzy_time": { + "args": { + "unicode_text": true + } + }, + + "powerline.segments.vim.mode": { + "args": { + "override": { + "n": "NML", + "no": "NOP", + "v": "VIS", + "V": "VLN", + "^V": "VBL", + "s": "SEL", + "S": "SLN", + "^S": "SBL", + "i": "INS", + "ic": "I-C", + "ix": "I^X", + "R": "REP", + "Rv": "VRP", + "Rc": "R-C", + "Rx": "R^X", + "c": "CMD", + "cv": "VEX", + "ce": " EX", + "r": "PRT", + "rm": "MOR", + "r?": "CON", + "!": " SH" + } + } + }, + "powerline.segments.vim.visual_range": { + "args": { + "CTRL_V_text": "{rows}×{vcols}", + "v_text_oneline": "↔{vcols}", + "v_text_multiline": "↕{rows}", + "V_text": "⇕{rows}" + } + }, + "powerline.segments.vim.readonly_indicator": { + "args": { + "text": "RO" + } + }, + "powerline.segments.vim.modified_indicator": { + "args": { + "text": "+" + } + }, + + "powerline.segments.i3wm.scratchpad": { + "args": { + "icons": { + "fresh": "●", + "changed": "○" + } + } + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/__main__.json b/powerline-bin/powerline/config_files/themes/vim/__main__.json new file mode 100644 index 0000000..7cd3305 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/__main__.json @@ -0,0 +1,10 @@ +{ + "segment_data": { + "line_percent": { + "args": { + "gradient": true + }, + "after": "%" + } + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/cmdwin.json b/powerline-bin/powerline/config_files/themes/vim/cmdwin.json new file mode 100644 index 0000000..e6a05b0 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/cmdwin.json @@ -0,0 +1,18 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "contents": "Command Line", + "highlight_groups": ["file_name"] + }, + { + "type": "string", + "highlight_groups": ["background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/default.json b/powerline-bin/powerline/config_files/themes/vim/default.json new file mode 100644 index 0000000..9b0c744 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/default.json @@ -0,0 +1,128 @@ +{ + "segments": { + "left": [ + { + "function": "mode", + "exclude_modes": ["nc"] + }, + { + "function": "visual_range", + "include_modes": ["v", "V", "^V", "s", "S", "^S"], + "priority": 10 + }, + { + "function": "paste_indicator", + "exclude_modes": ["nc"], + "priority": 10 + }, + { + "function": "powerline.segments.vim.plugin.capslock.capslock_indicator", + "include_modes": ["i", "R", "Rv"], + "priority": 10 + }, + { + "function": "branch", + "exclude_modes": ["nc"], + "priority": 30 + }, + { + "function": "readonly_indicator", + "draw_soft_divider": false, + "after": " " + }, + { + "function": "file_scheme", + "priority": 20 + }, + { + "function": "file_directory", + "priority": 40, + "draw_soft_divider": false + }, + { + "function": "file_name", + "draw_soft_divider": false + }, + { + "function": "file_vcs_status", + "before": " ", + "draw_soft_divider": false + }, + { + "function": "modified_indicator", + "before": " " + }, + { + "exclude_modes": ["i", "R", "Rv"], + "function": "trailing_whitespace", + "display": false, + "priority": 60 + }, + { + "exclude_modes": ["nc"], + "function": "powerline.segments.vim.plugin.syntastic.syntastic", + "priority": 50 + }, + { + "exclude_modes": ["nc"], + "function": "powerline.segments.vim.plugin.tagbar.current_tag", + "draw_soft_divider": false, + "priority": 50 + }, + { + "type": "string", + "highlight_groups": ["background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ], + "right": [ + { + "function": "file_format", + "draw_soft_divider": false, + "exclude_modes": ["nc"], + "priority": 60 + }, + { + "function": "file_encoding", + "exclude_modes": ["nc"], + "priority": 60 + }, + { + "function": "file_type", + "exclude_modes": ["nc"], + "priority": 60 + }, + { + "function": "line_percent", + "priority": 50, + "width": 4, + "align": "r" + }, + { + "function": "csv_col_current", + "priority": 30 + }, + { + "type": "string", + "name": "line_current_symbol", + "highlight_groups": ["line_current_symbol", "line_current"] + }, + { + "function": "line_current", + "draw_soft_divider": false, + "width": 3, + "align": "r" + }, + { + "function": "virtcol_current", + "draw_soft_divider": false, + "priority": 20, + "before": ":", + "width": 3, + "align": "l" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/help.json b/powerline-bin/powerline/config_files/themes/vim/help.json new file mode 100644 index 0000000..45c9458 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/help.json @@ -0,0 +1,36 @@ +{ + "segments": { + "left": [ + { + "function": "file_name", + "draw_soft_divider": false + }, + { + "type": "string", + "highlight_groups": ["background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ], + "right": [ + { + "function": "line_percent", + "priority": 30, + "width": 4, + "align": "r" + }, + { + "type": "string", + "name": "line_current_symbol", + "highlight_groups": ["line_current_symbol", "line_current"] + }, + { + "function": "line_current", + "draw_soft_divider": false, + "width": 3, + "align": "r" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/plugin_commandt.json b/powerline-bin/powerline/config_files/themes/vim/plugin_commandt.json new file mode 100644 index 0000000..dd6748f --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/plugin_commandt.json @@ -0,0 +1,26 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "contents": "Command-T", + "highlight_groups": ["commandt:label"] + }, + { + "function": "powerline.segments.vim.plugin.commandt.finder" + }, + { + "function": "powerline.segments.vim.plugin.commandt.path" + }, + { + "type": "string", + "highlight_groups": ["commandt:background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ], + "right": [ + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/plugin_gundo-preview.json b/powerline-bin/powerline/config_files/themes/vim/plugin_gundo-preview.json new file mode 100644 index 0000000..ad8432c --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/plugin_gundo-preview.json @@ -0,0 +1,18 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "highlight_groups": ["gundo:name", "file_name"], + "contents": "Undo diff" + }, + { + "type": "string", + "highlight_groups": ["gundo:background", "background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/plugin_gundo.json b/powerline-bin/powerline/config_files/themes/vim/plugin_gundo.json new file mode 100644 index 0000000..a03b256 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/plugin_gundo.json @@ -0,0 +1,18 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "highlight_groups": ["gundo:name", "file_name"], + "contents": "Undo tree" + }, + { + "type": "string", + "highlight_groups": ["gundo:background", "background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/plugin_nerdtree.json b/powerline-bin/powerline/config_files/themes/vim/plugin_nerdtree.json new file mode 100644 index 0000000..896d393 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/plugin_nerdtree.json @@ -0,0 +1,17 @@ +{ + "default_module": "powerline.segments.vim.plugin.nerdtree", + "segments": { + "left": [ + { + "function": "nerdtree" + }, + { + "type": "string", + "highlight_groups": ["background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/quickfix.json b/powerline-bin/powerline/config_files/themes/vim/quickfix.json new file mode 100644 index 0000000..ae4d5a5 --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/quickfix.json @@ -0,0 +1,40 @@ +{ + "segment_data": { + "buffer_name": { + "contents": "Location List" + } + }, + "segments": { + "left": [ + { + "type": "string", + "name": "buffer_name", + "highlight_groups": ["file_name"] + }, + { + "function": "window_title", + "draw_soft_divider": false + }, + { + "type": "string", + "highlight_groups": ["background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ], + "right": [ + { + "type": "string", + "name": "line_current_symbol", + "highlight_groups": ["line_current_symbol", "line_current"] + }, + { + "function": "line_current", + "draw_soft_divider": false, + "width": 3, + "align": "r" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/vim/tabline.json b/powerline-bin/powerline/config_files/themes/vim/tabline.json new file mode 100644 index 0000000..1e3130e --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/vim/tabline.json @@ -0,0 +1,93 @@ +{ + "default_module": "powerline.segments.vim", + "segments": { + "left": [ + { + "type": "segment_list", + "function": "powerline.listers.vim.tablister", + "exclude_function": "single_tab", + "segments": [ + { + "function": "tab" + }, + { + "function": "tabnr", + "after": " ", + "priority": 5 + }, + { + "function": "file_directory", + "priority": 40 + }, + { + "function": "file_name", + "args": { + "display_no_file": true + }, + "priority": 10 + }, + { + "function": "tab_modified_indicator", + "priority": 5 + } + ] + }, + { + "function": "tab", + "args": { + "end": true + } + }, + { + "type": "segment_list", + "function": "powerline.listers.vim.bufferlister", + "include_function": "single_tab", + "segments": [ + { + "function": "bufnr", + "after": " ", + "priority": 5 + }, + { + "function": "file_directory", + "priority": 40 + }, + { + "function": "file_name", + "args": { + "display_no_file": true + }, + "priority": 10 + }, + { + "function": "modified_indicator", + "priority": 5 + } + ] + }, + { + "type": "string", + "highlight_groups": ["tab:background"], + "draw_soft_divider": false, + "draw_hard_divider": false, + "width": "auto" + } + ], + "right": [ + { + "type": "string", + "contents": "Bufs", + "name": "single_tab", + "highlight_groups": ["single_tab"], + "include_function": "single_tab" + }, + { + "type": "string", + "contents": "Tabs", + "name": "many_tabs", + "highlight_groups": ["many_tabs"], + "exclude_function": "single_tab" + } + ] + } +} diff --git a/powerline-bin/powerline/config_files/themes/wm/default.json b/powerline-bin/powerline/config_files/themes/wm/default.json new file mode 100644 index 0000000..579080d --- /dev/null +++ b/powerline-bin/powerline/config_files/themes/wm/default.json @@ -0,0 +1,29 @@ +{ + "segments": { + "right": [ + { + "function": "powerline.segments.common.wthr.weather", + "priority": 50 + }, + { + "function": "powerline.segments.common.time.date" + }, + { + "function": "powerline.segments.common.time.date", + "name": "time", + "args": { + "format": "%H:%M", + "istime": true + } + }, + { + "function": "powerline.segments.common.mail.email_imap_alert", + "priority": 10, + "args": { + "username": "", + "password": "" + } + } + ] + } +} diff --git a/powerline-bin/powerline/dist/systemd/powerline-daemon.service b/powerline-bin/powerline/dist/systemd/powerline-daemon.service new file mode 100644 index 0000000..96b685d --- /dev/null +++ b/powerline-bin/powerline/dist/systemd/powerline-daemon.service @@ -0,0 +1,10 @@ +[Unit] +Description=powerline-daemon - Daemon that improves powerline performance +Documentation=man:powerline-daemon(1) +Documentation=https://powerline.readthedocs.org/en/latest/ + +[Service] +ExecStart=/usr/bin/powerline-daemon --foreground + +[Install] +WantedBy=default.target diff --git a/powerline-bin/powerline/ipython.py b/powerline-bin/powerline/ipython.py new file mode 100644 index 0000000..cb84fc7 --- /dev/null +++ b/powerline-bin/powerline/ipython.py @@ -0,0 +1,68 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline import Powerline +from powerline.lib.dict import mergedicts +from powerline.lib.unicode import string + + +class IPythonInfo(object): + def __init__(self, shell): + self._shell = shell + + @property + def prompt_count(self): + return self._shell.execution_count + + +# HACK: ipython tries to only leave us with plain ASCII +class RewriteResult(object): + def __init__(self, prompt): + self.prompt = string(prompt) + + def __str__(self): + return self.prompt + + def __add__(self, s): + if type(s) is not str: + try: + s = s.encode('utf-8') + except AttributeError: + raise NotImplementedError + return RewriteResult(self.prompt + s) + + +class IPythonPowerline(Powerline): + def init(self, **kwargs): + super(IPythonPowerline, self).init( + 'ipython', + use_daemon_threads=True, + **kwargs + ) + + def get_config_paths(self): + if self.config_paths: + return self.config_paths + else: + return super(IPythonPowerline, self).get_config_paths() + + def get_local_themes(self, local_themes): + return dict(((type, {'config': self.load_theme_config(name)}) for type, name in local_themes.items())) + + def load_main_config(self): + r = super(IPythonPowerline, self).load_main_config() + if self.config_overrides: + mergedicts(r, self.config_overrides) + return r + + def load_theme_config(self, name): + r = super(IPythonPowerline, self).load_theme_config(name) + if name in self.theme_overrides: + mergedicts(r, self.theme_overrides[name]) + return r + + def do_setup(self, wrefs): + for wref in wrefs: + obj = wref() + if obj is not None: + setattr(obj, 'powerline', self) diff --git a/powerline-bin/powerline/lemonbar.py b/powerline-bin/powerline/lemonbar.py new file mode 100644 index 0000000..b49f86b --- /dev/null +++ b/powerline-bin/powerline/lemonbar.py @@ -0,0 +1,21 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline import Powerline +from powerline.lib.dict import mergedicts + + +class LemonbarPowerline(Powerline): + def init(self): + super(LemonbarPowerline, self).init(ext='wm', renderer_module='lemonbar') + + get_encoding = staticmethod(lambda: 'utf-8') + + def get_local_themes(self, local_themes): + if not local_themes: + return {} + + return dict(( + (key, {'config': self.load_theme_config(val)}) + for key, val in local_themes.items() + )) diff --git a/powerline-bin/powerline/lib/__init__.py b/powerline-bin/powerline/lib/__init__.py new file mode 100644 index 0000000..2a5fbd0 --- /dev/null +++ b/powerline-bin/powerline/lib/__init__.py @@ -0,0 +1,28 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from functools import wraps + + +def wraps_saveargs(wrapped): + def dec(wrapper): + r = wraps(wrapped)(wrapper) + r.powerline_origin = getattr(wrapped, 'powerline_origin', wrapped) + return r + return dec + + +def add_divider_highlight_group(highlight_group): + def dec(func): + @wraps_saveargs(func) + def f(**kwargs): + r = func(**kwargs) + if r: + return [{ + 'contents': r, + 'divider_highlight_group': highlight_group, + }] + else: + return None + return f + return dec diff --git a/powerline-bin/powerline/lib/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e01f8720a2554c82ddccfac07c4d8ec5bbfcb88 GIT binary patch literal 1383 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/debug.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea2ddeee07dbb24dcd57593cf45e964fd2757e43 GIT binary patch literal 4344 zcmaJ^Z){W76~FJV-+OWFkiYy1@E}PS7vivv0?8;TgaJhpsKVVwI%XWd=j3JnxBIT4 zv0l_f>lCNugDa@82GiJzG%6+ysr^t*`_j^>(>7^wF(tfa5>hv9{pLWVp{O5ruI*&KQ$9dQa@kj&WGSZO7L{W?xVPfnE z8{rvD%P9)?*o%gnN~{H$;pWta$~F>gq3 z@)@8rd`8Hy5kX^NMwml~(V5){O>r_Jj3dqBZdT|C$79YCyeEXZKNV7|?l74PJ{hrS zPOvzOGmysL1#i8-jq^1;eX#F{;?1q4UOs5{bbzHu9EQ(QA1c)lUP5e$B7XiQ_Vz7 zuj-88M2w0V)#;KWDV&H#!A@QCSIv(YQP`CtCc%0rMh_4GHRXS5B!TH#GDT_|MiYss zYK|w)2a`B4hIO-a>X#yF0H^ewU=XAW*r%)URBTj-{WV8`hVZzqsUedxOqLE1Nu=V` zoNzVd5D*!DE%1BvZ%Cten9KDEft-XmjIzv`-y-xwNQ^0FinWjh$(4p}q?(LYl{*cA z-T-S;+?>2>+OUMCZRsIYf9bJUN1OAeavU12AUDMmxY`akaXa+QO1k2(#ZGvg+1mSN zg@mL(Svi9+C0e4zr4Zh>hK)Q~=SZ*w$BL&c5~ct);twrI`V@jIuxkxjVx27U|H}F+ zkK%uR;*`yf6{OXnB5d`<{dL#3>OVNAT8)*R`-I%USYKcOS;1Rq6%t|bL9v#JhFImVq1-X6Jur#ZCYcEBgQ;($iS9{De zfwc1KkM+qj>I-U*NvE_kc2h7orjrmM*che7Drif=pk{L-@1O6HZy*uV- z5Rk{yXmQ=f-0q88A0d_NoEe)AWm+F7o-C6+__lDhB^S7|A@ALuSGuNmKj7T6Lo-9! zfve{A-8cAm2d})IZ}Atn{)NWo>Aj0$Q?~UIDTtj5t?MrzfBX2w?>x z>+bjX`HsGV%U=}Hy0+3Gi(c5b)Px$E7x>26lQSnT9nQ60JYL|pE>zsR_j7Jj@gM`y zC>~-EO!m+8XS?sR9gmm2$kXuqEOM~2Vp9D6<8$ptz5J)% ztw+D<`g9iqW4O{C!D3wrR-ll*1HIdvf;Z2(ChE&{i4j5PT32wZaP#Cv*O0}MYPVJ^ z%lkn_t?*7%A-N(NUNzn+-r@mLzXy;iKzU=JP;LR}T-_$t5}vdG`ar4HO+p9QV+nI2 zl*lGhEzg!fnjFmzh-2o$V4daFvTL#D7$~pDK(0)!0eIsq6e%?zH*0<751`MaAX)kn zpt1oZPczWrtYJ5|nl94lSXC?gPeW;Z=Tll#fa2AC!>^{}NpGD-aoz!D0O?;kv`;vZ z=6bZoblWiW!A7{&7!RsFSV?bOW!g}CdjJSm-C`&{8Piq|)10(fL$leju-ypA7OeE# z#Kg4r;x;hLx0 z%CUS)cY*7909U>1jnPcYPse6<{=?IB&$A`(*^)Ewc)F&23(cDzqBd?|dK@sp<<0iw z#f~B?3PTHmXErz!oNw#9CFR@p6@-B$Hxj%V>n`6}RFJ$bdo(X?x|+Vx`@u_vtp^r( z_p*rOhRnXV+_~Y;q^Rn@9iJW?+N7F19!z&9xqa6rjF15LG!I+?|0_gU-(=+04O64 zeO+{cv=ws?xZ@*F>mil>Sd|a6!pG0{4!7{Pn;D>Qw>&ev-*tO{rS!KMO7G`@{)C~c zwp^`a*aK2d`1n#1*h(-MOK7Pmt@}zT{^ofDYOLp=(-4$vuZXGga;W!FY8M@7&`WVN z>9^n6vuD*8Un~XJcGt%hzW}SWuA4C!zMe+Q>$kJ(|8tD#WCx0f4*OAKD_}g^Ien_g z^PGE8@np=meD{hpAU`5(r_Ur+C80IM0 wo4qiAT@3Rt6u5%|Un2Pnr2G?Y`a9ZGlu%FaZ;t=!_=oy3dWB&+@h~v|7hX#7GXMYp literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/dict.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/dict.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f25e07632cc086f7fb19792cbd0f87249c012a2 GIT binary patch literal 3592 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 b_jHG{cjEVp?=3#~?uYr$m7VGtHJ0kX53A{> literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/humanize_bytes.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/humanize_bytes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9251f9cede27de1cd15bb1639e559b9e25d58dc6 GIT binary patch literal 1357 zcmZux&2Jk;6rb5I@49wU@=^5*FinwSMC}CH)U6N)3N%y-LL}l~Az6-hoJ_M{nVn4& zdslK02dW-OMWq^XDLoaXxAqU<&Vi=k&<>S2AOyJug;P(walEalc+$Rk^XB*7oA)vM zQ$C+XK>444ZH}u5{Vq2tW%|P2XCT}}HnOpUTwKMjQdL~Fs=8WL!&0v}x@%Moj1)vN z@R=?{ zBjfM%wu4e9Sp#x@MkYvdzgGd|O%y}EOXC34Z6(GnIG9DT!W3Keu&pI3@8^R6$wv7z zPh3wu#wb=_%pPnpPb-VKjM<~KI=0?|j-*zJ#t)>37^Rq4jkOk7w%{z$pZkclBLMy! zQcR2_6B}$aR>I-fxSUUYJYP5aqHV~`62s11mIZl%;>=w$jrzamdThk_uC>|Eeijw8 zt>sS%kC<1e7ZxM8?iHGh63=$l3iE566c`B@35mz+vUR0w)|&Bc+N8uTtPm#q4FB+3s>u*b$DA2#)A{1%RwE;*) zVA^`K-CmA-4p-pkOKqDps0-7TG?S#zZo|;=Bx$$9sM(~eNdl8(rjVj4%+yk75-E&* zT+tM&OFf~&5Hi_I7(e0(OJZPtLoRfcM|#R$4`_?jWc9;RuqFont70c0g8U1F-vR5O-7M10uO`2keq`l0jH@p{ zP!2sFJiN}kc4zoWZt(lY4fV!_uG*dbX6BcJC+;lYAG=TQm42Mudh7k|+y|Y*PjWA9 zj9t6b9lm9L`|4J195h46y3<=judlz-8R@J(*39ci!1vcjuO7X2ysK_m$2un;S!aJ! zt@WvmN@r?YJ>HjZoxHOm_fxyNqEz z1~8#P$rtzAqw^?mh)`QJVDgFdQvLz4F)6)Vk--eqsVR=(^Io<7=DF~)zQ nxotG}2O9a?K>4BTV-F9#{qW4i?V;)I+(#YjA7c<#dY=9TVm??i literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/inotify.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/inotify.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d469997c28a77c7f9f682b84b963641f531fa712 GIT binary patch literal 7744 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/memoize.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/memoize.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3168ea40da14bf928a3eaf92896c2249855c507 GIT binary patch literal 2137 zcmZuy-ER{|5Z~Q9pU+NAFeK!YGzqDxQE*T{XsbqfC~f-Gs1i}7ToH%4Ta!!feD2=4 zi6ettH4?EZL8_`skSdi2UQqf6v~T^8Dylv}2o>ha1675pzPXr6l&8*~eRe3UbhERw zb2GCuzn%Rh7Kg;EP~{8cgjyVAhe2bZjCEE7&3mu>?i1L`B40PRx)c zDU#0%X4sMy8F+C8DG`F+L3(Hf=@N}@3U!N0TOpj3|Kf|J=X( z&CWOuR~>phG45Kq@tl!6?1GfKhmXE8cO>`f((B`E@D67nk}6-YAVg&QF(A9&Y~CC#%sq*KjiY1d{$ zi-tQlU=I}uteUAdAlYgV94ZR1YNoz`7%vY1 zA>8oeMVdMALO$#5s!JF>z`FjxmLo~)`y)^JsId3TWL zK*IN(=YW(@CEimST^XzF9e^oS>4?L0sM3=tjs8lySR8b;X5_Hoar>u!5t#GnJl+YZ zG7ey~idPY&8?VR#pw5yaIgXNKT7w^(LjtZJzS;#y))!QO5kkU(4B8YvJSp1?=RxX|_pWHZhxpO;~C{0z{ zQ8-r0ZoGea>e9)tjm?Ey`)9wI`tInr)7NIMpZNL2*2FAGe(%^@KDU-BpSv5|_vr_J zhlC-iiiD6j(+>v@y&?W+1= zK5aI3!m6sVI{)!ceGPlotdo~R#jl8u8Z?>){45GV=8f1;UfG;<&I-$#cZNEnYil=tI-)yzK# ICO_)`06bjZI{*Lx literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/monotonic.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/monotonic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..906fa02e7c235c87331d0cec273232e1f73b3d7c GIT binary patch literal 4191 zcmb_eU2GHC6~6Q1vE#90k~kp=`EhwSOU2s}Rce^91spA=gga3Lx z4g{sFK}bu~N(s`oArex8ghUYAZd>(XAF7spL#np5anyJRq|K^AyZdGc4=eVi=Z-UW zoQ77aI+pJ}_uO;OoS*NUJAbuW%?KXr-yi#L1NBd`&>!OlvA&N*XdX#OqJk(y2~>y{ z=nx|?Ay!~1R02QPql1PJCvap9D+X3Z!9*d+a19Ckl(7ZLC9MdT00&7d?3&5$d+3*C z7tlrKJ#>L8lHfps7kDBuWh|DMqwwD}Eykcluz)sW&?;CL?WnzWCl1hlDb5uC;3QNqIC4T^m`Jg>iDO6I3 zMslTOxliSE2vu@bjFxv^rGRgl=+-qCX1PkTepGs&-jJ`6YbN>%yE-M*N;bJx+@-HU z*K0amm_Z_MJB^MZX~#7r5kC(VWOV92lcR(N&9Wh#Uzp{FycZ6z>W#vVP6^Gj!%xZ0 zMRvWV?-pi|$lE2ALrk0ColW;Q1cX+(RYEneg1Lgsmw1FE`y~TH!fvUOcS= z%oXAU@|+AlfVMGRcVU)0^iw)6B%~pYk&QxUm_(10&Huw`Go04YDAkgvl1kM7El8`t zT~MWlT$PfYTpjDx>a6>Q80loy9r19$7m;K!7*J&F4aQWH6qpRe0+Fz4^Nzq17St<$HP7a1e}y=^#voo^Ws@qQ34?u7!|`OMu*=PPmX#<$3{KJhs9Gz z-UYU83)@$S5kdsO?*MhB@Q(q2Q38D!x-*il>PjF?nBY%I{+vfOTnL1F_Z4|W?AAOYU2n5T zI(#LHl*Vb~q&+*`YOljKLY3(QQ5hrlCD0STCe81< zDW&-4B-^YBtDNM;U=S#@_yb`H@;Z*acuJ*wW5n)wOcrH~!x2q?k5MG38a^{kmbOXf|i@17<{3b{xzOTbKV^LBH$@tH>R`Lx( z$94X~qs|`ylY2Lv-v-xuUxZ2`4r|XeQb_01o(a%X;cabRI!X)?XbmFC?^gZl};V|H+6 z@Ye3du7$4UmQ-z5itkFYT^jbm1XjDU_mXbwk1KHu-4+uNU{V&Cv@uL@fe(>^T)3Dd z8IzAGl|Qb15oliKVxrZYgX}S}DeyWP^eX-c4yhd6Mp7`Sn$F8OEC+k{VG?_lhYn6q zPX4M9%Q4c}fvfd*S6m4MaTSp(0m%BaivjnOH9LIt#0ixpT)c-cOmNi~T?+kuYRPE@ z$9=@7T$eQdVDz|W?9EfJzK^1q^gK+Ol4|h5MWx_2!ssLe06154n0(Qz2Ca&4FQHAj z51@dwrBLBpB6o!i;Zcwy{V;X_5S3*piuwwTrO{ZH{V7H5&e9gT{weLq(k#>cl<9qD zLN?bG=eJoSGFLuF6x00$*(=H7i|s9Uqw&Y!$-a@D>kW#6-EKbW!~Oblh}npf*wsXA9;XoabH z!BT7sQN@2SePw#?;v-|@Q>Oh(+pe3#X`3T)@N;uT#$1*-xn{1s-ZtAg(>WJd?prZ; zC;HZ^>sG7XscLtUsmwIBz_`LRWE^dGZMSXOqW%TTvfNVtYD;gbrS}DbMb?ZQuA7sK zmlrN4UB}XmBT1%it)_mpraM*Bon)#qErZGCAs|+m#!OTD-MZU#+M?k(%dmT&nUSq2 zUD}*@4KAO#AI`jevty}ep)+OKz09U8dlUW8!&v9K39(l2sA^~8aHggf&TDqewXK#n zr^=f(J3y1g{)WnyvZD$mgcY zxyaJxrOCUOZ(shMoNgaXn_hoV_Q>=`#@29UWR1j>*yVaQ05(56PC**J&3b6a;1_gj zl5TyOm1&aOm$8!opjoa5{hD*2TTBmH;$6&rx(EG+axuS!_3!z^%%7+uH2O1jnE49> g#HV!WNEP#G*<0NsM*5-AG*WJOXrqAju$+bQU&J0|Z~y=R literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/overrides.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/overrides.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f79b11e3f49b4a95c4de29599b3d404d48ecf8ed GIT binary patch literal 2933 zcmaJ@-EUmQ6`#2u`x)E#gT$Bu6BC*&CF>88(5#(^kXS$+5`?4Bx<$J;d&l;*?-w(7 z{l!|kn;>;fB4zv1@X&`!JR!ti(uX>-D$Kgmw&YU^t z+%t22=QsB+9UU12t>drX%^XQ0^u3t0n$jHXz5|1M$V4W#k%OnPqf9G~I;}d|w1$OT zvGr*k-m0B&lG90$X`iC$l&M3XHWSci%p~;L6(yH?DBR|>=$VRZl|7RdZ7ZP6uz8d+ ztwoDlo*Q);H@Ih40$Q{j-(x}4=`+g>iZd0r9Du@=9FDp^n0W8%^@-xOcix>UPEP!$ zjGOU_m)d-GufyOTsv@2Ugj}{Mn49=H7@Nu>;u_4mHSZ;;C2KuvBKs*+Ux#v()o->$HhNF)|kXBqe|JBshD-e=xL;P^q!mPQw zcu&M&l=ueY5S77+P?u3iJMPo6W!PlVuq%|4Qpv5@cB%9li~?4n@n{Cp4MTFGY;Z~( zBY-e?PWlzQYx;h|`32i19&DerJc}U8p35zhG6)0?UL2OO)Qpwq;lvBz$#8^(@B(>1 z4msY7TxK+=Fc(%1rVRGN1ol@u2S54k@W|-vr%s=FN+D#MG1wK)`zujao<&ifChG>5X?XZ)=tA`4AWCPp)BPJt|5hSd$2D`K^Tqp# z7yo>8 z2HLf@rdE}zI-@|nrB;72Gq#x;-%!T4G(9wGm+BX9PHv}qHhK%2sj&@ZY%7`i{ZehI z&Tm!2-Yq>526Z+3Fznt=_B2KsQ=gCg;lswS8)KWvmtZ-asb8$8!k1VNeCG*3i0~vJ z{sV)1Xdejs1Q@ig22??;yNZ4X^EC{~Y^S~22F;q{b{3~PYk-(^2I|}d&|eOTa#RIL{74K$3+X{uf#<0i*+9i}ax4 z+f-spLM76jT8eoe@m_-^ZS6HNqsi-%BK4>ujV}>!k08q$s zusQ?}{{p%YJTO)yO!e1Z{vq4{dG}`a`B?rS zmA;!?Pd3!shr+&XEm_xYz1zSy-`h%N>lbQE4JCBKqXK#(>wV#|t&Z--(Z*Z#=^dn~ zePMa4t2;bZS8HdtGM#n4o~xaDq{9M~K;Mz@7@+yB+Hx%q=HZD4nQVQk-X9MAANY>K z4g{Zl3b*xqo6SJjZ2P=+34PU+0n4bXpT$Wx2&WGGq1c{#l2b^L5kTH-3#i1KX7RVZIK5 z?w)~e5@GpY^AX$$z^9mX94OQ_)BX|P!x-J^)zAw1T3y0941Z2C$vGub^23oPgA(Q3 zgu`BXe3rU&*=OfhUx{(qx{rV>S$^F1%D`dg^KG@uV9W`0|3v=^(GJqm>Vrh)TRr_) zM`~x?{6^{hQ3c_@CGp)n@*Lj7V-Us5V8S|uu}Dr6j6Fa7BpZh1w}qa-G~9X_@rBN= zyR+-Fjq+{#u@3V`NK;e^hTNejQ-mKyxY%j2$OMxyL1|2I6HAB=7y(5+?MpWgH*sG4 zP|2HozqaH#$*+Hjq-$9(d#Q29GohBxvs2(l#Li!V?vaWy{s+3YiLQN*vVTYUoy1|B U-5Jf`?wx^WanJ5>8pjd-4=6(RD*ylh literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/path.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/path.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5210445d0550c4d26ad9eaf20570fac8897b4d70 GIT binary patch literal 1298 zcmbVM-Afcv6hC)9oY_^=KFB2$%!=H=T~jIw5rW&dDVur!cZhj+#?V`99>DOa)P^NNM#e zg{PIUz3keCXIgp378Wl!L8zPdO*^nXH*70R1fEkCR^Bf89v9&upWCj;-zd9=K!;HS zNi{@8O~zk+24Mk2W1|>TZCC(`(p0q0K9@XW=THGN=B8Qe%T*E(i9YMry4n=QwG zsB%i#)b#H%B#zFXe`Kxcop;YKo_yK+y!X|m)td2mZcpKl;1RRmf6o`hseoML`v zInlE$_59juMyG(D?%Q)$ujpw#Oy=?5K$N+a&vP0{PBnA#;536fwMOrR_`U{yh^$eE p^`VkymK|%DccG0gGa#RDGGpvBTwjIjpCGZ-#8`h_*Vw5j@(+W={s#a6 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/shell.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/shell.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fdffdb0724c879fec3b2166f03ac1c07c9b2a8e GIT binary patch literal 5561 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 bK$@SKgc{yk%O7e(_uASH3(O}x1^Isf`e*Kn literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/threaded.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/threaded.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1b01456b483e96db18a08694cf53f936df32c1f GIT binary patch literal 13624 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/__pycache__/url.cpython-312.pyc b/powerline-bin/powerline/lib/__pycache__/url.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4773173a6fd1f1c8fd4243f92c2e5f1cf7a88691 GIT binary patch literal 916 zcmZ8fzfTlF6n?X_x3|OH!6B9w8VI_H$0CVx8nH9chM0H_+iVVYkR|)e*;(L>1u@pf z4*vif1BIQ9|AB=POo%ILVPWVlTtldQvv*v<%kIp3GvAvx-}mNAtu_K^wXZ){H4Wge z3eHU*IK6FjcEAIV1P~I3gqov;)S;p7=mePB(SlNFI0jKZ4a%YEn1!zgEF5tv=o_!W z8S9iMfmf$MTrPG?K}{itnR+nVM=uTWo3KTfV3SzpvAT|>=k+Y|S7ML5fiJme2Wf74 z{)V6Wag>j>m(w`NBzOHViG|EZ6X8eFUCp8ui2#e_>`|-rNuR4_ruuB z0{%c;!B9zBD1dAT`3J27Xmxdi%>5#h#W&xp>V%zkD_~BXfJWy2kn6w6t)79a-3rEi R1>Rhmg7*^(^fOtY{{hH^;XVKW literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/config.py b/powerline-bin/powerline/lib/config.py new file mode 100644 index 0000000..0c95e47 --- /dev/null +++ b/powerline-bin/powerline/lib/config.py @@ -0,0 +1,218 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import json +import codecs + +from copy import deepcopy +from threading import Event, Lock +from collections import defaultdict + +from powerline.lib.threaded import MultiRunnedThread +from powerline.lib.watcher import create_file_watcher + + +def open_file(path): + return codecs.open(path, encoding='utf-8') + + +def load_json_config(config_file_path, load=json.load, open_file=open_file): + with open_file(config_file_path) as config_file_fp: + return load(config_file_fp) + + +class DummyWatcher(object): + def __call__(self, *args, **kwargs): + return False + + def watch(self, *args, **kwargs): + pass + + +class DeferredWatcher(object): + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + self.calls = [] + + def __call__(self, *args, **kwargs): + self.calls.append(('__call__', args, kwargs)) + + def watch(self, *args, **kwargs): + self.calls.append(('watch', args, kwargs)) + + def unwatch(self, *args, **kwargs): + self.calls.append(('unwatch', args, kwargs)) + + def transfer_calls(self, watcher): + for attr, args, kwargs in self.calls: + getattr(watcher, attr)(*args, **kwargs) + + +class ConfigLoader(MultiRunnedThread): + def __init__(self, shutdown_event=None, watcher=None, watcher_type=None, load=load_json_config, run_once=False): + super(ConfigLoader, self).__init__() + self.shutdown_event = shutdown_event or Event() + if run_once: + self.watcher = DummyWatcher() + self.watcher_type = 'dummy' + else: + self.watcher = watcher or DeferredWatcher() + if watcher: + if not watcher_type: + raise ValueError('When specifying watcher you must also specify watcher type') + self.watcher_type = watcher_type + else: + self.watcher_type = 'deferred' + self._load = load + + self.pl = None + self.interval = None + + self.lock = Lock() + + self.watched = defaultdict(set) + self.missing = defaultdict(set) + self.loaded = {} + + def set_watcher(self, watcher_type, force=False): + if watcher_type == self.watcher_type: + return + watcher = create_file_watcher(self.pl, watcher_type) + with self.lock: + if self.watcher_type == 'deferred': + self.watcher.transfer_calls(watcher) + self.watcher = watcher + self.watcher_type = watcher_type + + def set_pl(self, pl): + self.pl = pl + + def set_interval(self, interval): + self.interval = interval + + def register(self, function, path): + '''Register function that will be run when file changes. + + :param function function: + Function that will be called when file at the given path changes. + :param str path: + Path that will be watched for. + ''' + with self.lock: + self.watched[path].add(function) + self.watcher.watch(path) + + def register_missing(self, condition_function, function, key): + '''Register any function that will be called with given key each + interval seconds (interval is defined at __init__). Its result is then + passed to ``function``, but only if the result is true. + + :param function condition_function: + Function which will be called each ``interval`` seconds. All + exceptions from it will be logged and ignored. IOError exception + will be ignored without logging. + :param function function: + Function which will be called if condition_function returns + something that is true. Accepts result of condition_function as an + argument. + :param str key: + Any value, it will be passed to condition_function on each call. + + Note: registered functions will be automatically removed if + condition_function results in something true. + ''' + with self.lock: + self.missing[key].add((condition_function, function)) + + def unregister_functions(self, removed_functions): + '''Unregister files handled by these functions. + + :param set removed_functions: + Set of functions previously passed to ``.register()`` method. + ''' + with self.lock: + for path, functions in list(self.watched.items()): + functions -= removed_functions + if not functions: + self.watched.pop(path) + self.loaded.pop(path, None) + + def unregister_missing(self, removed_functions): + '''Unregister files handled by these functions. + + :param set removed_functions: + Set of pairs (2-tuples) representing ``(condition_function, + function)`` function pairs previously passed as an arguments to + ``.register_missing()`` method. + ''' + with self.lock: + for key, functions in list(self.missing.items()): + functions -= removed_functions + if not functions: + self.missing.pop(key) + + def load(self, path): + try: + # No locks: GIL does what we need + return deepcopy(self.loaded[path]) + except KeyError: + r = self._load(path) + self.loaded[path] = deepcopy(r) + return r + + def update(self): + toload = [] + with self.lock: + for path, functions in self.watched.items(): + for function in functions: + try: + modified = self.watcher(path) + except OSError as e: + modified = True + self.exception('Error while running watcher for path {0}: {1}', path, str(e)) + else: + if modified: + toload.append(path) + if modified: + function(path) + with self.lock: + for key, functions in list(self.missing.items()): + for condition_function, function in list(functions): + try: + path = condition_function(key) + except IOError: + pass + except Exception as e: + self.exception('Error while running condition function for key {0}: {1}', key, str(e)) + else: + if path: + toload.append(path) + function(path) + functions.remove((condition_function, function)) + if not functions: + self.missing.pop(key) + for path in toload: + try: + self.loaded[path] = deepcopy(self._load(path)) + except Exception as e: + self.exception('Error while loading {0}: {1}', path, str(e)) + try: + self.loaded.pop(path) + except KeyError: + pass + try: + self.loaded.pop(path) + except KeyError: + pass + + def run(self): + while self.interval is not None and not self.shutdown_event.is_set(): + self.update() + self.shutdown_event.wait(self.interval) + + def exception(self, msg, *args, **kwargs): + if self.pl: + self.pl.exception(msg, prefix='config_loader', *args, **kwargs) + else: + raise diff --git a/powerline-bin/powerline/lib/debug.py b/powerline-bin/powerline/lib/debug.py new file mode 100644 index 0000000..515e8c4 --- /dev/null +++ b/powerline-bin/powerline/lib/debug.py @@ -0,0 +1,97 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import gc +import sys + +from types import FrameType +from itertools import chain + + +# From http://code.activestate.com/recipes/523004-find-cyclical-references/ +def print_cycles(objects, outstream=sys.stdout, show_progress=False): + '''Find reference cycles + + :param list objects: + A list of objects to find cycles in. It is often useful to pass in + gc.garbage to find the cycles that are preventing some objects from + being garbage collected. + :param file outstream: + The stream for output. + :param bool show_progress: + If True, print the number of objects reached as they are found. + ''' + def print_path(path): + for i, step in enumerate(path): + # next “wraps around” + next = path[(i + 1) % len(path)] + + outstream.write(' %s -- ' % str(type(step))) + written = False + if isinstance(step, dict): + for key, val in step.items(): + if val is next: + outstream.write('[%s]' % repr(key)) + written = True + break + if key is next: + outstream.write('[key] = %s' % repr(val)) + written = True + break + elif isinstance(step, (list, tuple)): + for i, item in enumerate(step): + if item is next: + outstream.write('[%d]' % i) + written = True + elif getattr(type(step), '__getattribute__', None) in (object.__getattribute__, type.__getattribute__): + for attr in chain(dir(step), getattr(step, '__dict__', ())): + if getattr(step, attr, None) is next: + try: + outstream.write('%r.%s' % (step, attr)) + except TypeError: + outstream.write('.%s' % (step, attr)) + written = True + break + if not written: + outstream.write(repr(step)) + outstream.write(' ->\n') + outstream.write('\n') + + def recurse(obj, start, all, current_path): + if show_progress: + outstream.write('%d\r' % len(all)) + + all[id(obj)] = None + + referents = gc.get_referents(obj) + for referent in referents: + # If we’ve found our way back to the start, this is + # a cycle, so print it out + if referent is start: + try: + outstream.write('Cyclic reference: %r\n' % referent) + except TypeError: + try: + outstream.write('Cyclic reference: %i (%r)\n' % (id(referent), type(referent))) + except TypeError: + outstream.write('Cyclic reference: %i\n' % id(referent)) + print_path(current_path) + + # Don’t go back through the original list of objects, or + # through temporary references to the object, since those + # are just an artifact of the cycle detector itself. + elif referent is objects or isinstance(referent, FrameType): + continue + + # We haven’t seen this object before, so recurse + elif id(referent) not in all: + recurse(referent, start, all, current_path + (obj,)) + + for obj in objects: + # We are not interested in non-powerline cyclic references + try: + if not type(obj).__module__.startswith('powerline'): + continue + except AttributeError: + continue + recurse(obj, obj, {}, ()) diff --git a/powerline-bin/powerline/lib/dict.py b/powerline-bin/powerline/lib/dict.py new file mode 100644 index 0000000..c06ab30 --- /dev/null +++ b/powerline-bin/powerline/lib/dict.py @@ -0,0 +1,88 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + + +REMOVE_THIS_KEY = object() + + +def mergeargs(argvalue, remove=False): + if not argvalue: + return None + r = {} + for subval in argvalue: + mergedicts(r, dict([subval]), remove=remove) + return r + + +def _clear_special_values(d): + '''Remove REMOVE_THIS_KEY values from dictionary + ''' + l = [d] + while l: + i = l.pop() + pops = [] + for k, v in i.items(): + if v is REMOVE_THIS_KEY: + pops.append(k) + elif isinstance(v, dict): + l.append(v) + for k in pops: + i.pop(k) + + +def mergedicts(d1, d2, remove=True): + '''Recursively merge two dictionaries + + First dictionary is modified in-place. + ''' + _setmerged(d1, d2) + for k in d2: + if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict): + mergedicts(d1[k], d2[k], remove) + elif remove and d2[k] is REMOVE_THIS_KEY: + d1.pop(k, None) + else: + if remove and isinstance(d2[k], dict): + _clear_special_values(d2[k]) + d1[k] = d2[k] + + +def mergedefaults(d1, d2): + '''Recursively merge two dictionaries, keeping existing values + + First dictionary is modified in-place. + ''' + for k in d2: + if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict): + mergedefaults(d1[k], d2[k]) + else: + d1.setdefault(k, d2[k]) + + +def _setmerged(d1, d2): + if hasattr(d1, 'setmerged'): + d1.setmerged(d2) + + +def mergedicts_copy(d1, d2): + '''Recursively merge two dictionaries. + + Dictionaries are not modified. Copying happens only if necessary. Assumes + that first dictionary supports .copy() method. + ''' + ret = d1.copy() + _setmerged(ret, d2) + for k in d2: + if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict): + ret[k] = mergedicts_copy(d1[k], d2[k]) + else: + ret[k] = d2[k] + return ret + + +def updated(d, *args, **kwargs): + '''Copy dictionary and update it with provided arguments + ''' + d = d.copy() + d.update(*args, **kwargs) + return d diff --git a/powerline-bin/powerline/lib/encoding.py b/powerline-bin/powerline/lib/encoding.py new file mode 100644 index 0000000..76a51d8 --- /dev/null +++ b/powerline-bin/powerline/lib/encoding.py @@ -0,0 +1,125 @@ +# vim:fileencoding=utf-8:noet + +'''Encodings support + +This is the only module from which functions obtaining encoding should be +exported. Note: you should always care about errors= argument since it is not +guaranteed that encoding returned by some function can encode/decode given +string. + +All functions in this module must always return a valid encoding. Most of them +are not thread-safe. +''' + +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import locale + + +def get_preferred_file_name_encoding(): + '''Get preferred file name encoding + ''' + return ( + sys.getfilesystemencoding() + or locale.getpreferredencoding() + or 'utf-8' + ) + + +def get_preferred_file_contents_encoding(): + '''Get encoding preferred for file contents + ''' + return ( + locale.getpreferredencoding() + or 'utf-8' + ) + + +def get_preferred_output_encoding(): + '''Get encoding that should be used for printing strings + + .. warning:: + Falls back to ASCII, so that output is most likely to be displayed + correctly. + ''' + if hasattr(locale, 'LC_MESSAGES'): + return ( + locale.getlocale(locale.LC_MESSAGES)[1] + or locale.getdefaultlocale()[1] + or 'ascii' + ) + + return ( + locale.getdefaultlocale()[1] + or 'ascii' + ) + + +def get_preferred_input_encoding(): + '''Get encoding that should be used for reading shell command output + + .. warning:: + Falls back to latin1 so that function is less likely to throw as decoded + output is primary searched for ASCII values. + ''' + if hasattr(locale, 'LC_MESSAGES'): + return ( + locale.getlocale(locale.LC_MESSAGES)[1] + or locale.getdefaultlocale()[1] + or 'latin1' + ) + + return ( + locale.getdefaultlocale()[1] + or 'latin1' + ) + + +def get_preferred_arguments_encoding(): + '''Get encoding that should be used for command-line arguments + + .. warning:: + Falls back to latin1 so that function is less likely to throw as + non-ASCII command-line arguments most likely contain non-ASCII + filenames and screwing them up due to unidentified locale is not much of + a problem. + ''' + return ( + locale.getdefaultlocale()[1] + or 'latin1' + ) + + +def get_preferred_environment_encoding(): + '''Get encoding that should be used for decoding environment variables + ''' + return ( + locale.getpreferredencoding() + or 'utf-8' + ) + + +def get_unicode_writer(stream=sys.stdout, encoding=None, errors='replace'): + '''Get function which will write unicode string to the given stream + + Writing is done using encoding returned by + :py:func:`get_preferred_output_encoding`. + + :param file stream: + Stream to write to. Default value is :py:attr:`sys.stdout`. + :param str encoding: + Determines which encoding to use. If this argument is specified then + :py:func:`get_preferred_output_encoding` is not used. + :param str errors: + Determines what to do with characters which cannot be encoded. See + ``errors`` argument of :py:func:`codecs.encode`. + + :return: Callable which writes unicode string to the given stream using + the preferred output encoding. + ''' + encoding = encoding or get_preferred_output_encoding() + if sys.version_info < (3,) or not hasattr(stream, 'buffer'): + return lambda s: stream.write(s.encode(encoding, errors)) + else: + return lambda s: stream.buffer.write(s.encode(encoding, errors)) diff --git a/powerline-bin/powerline/lib/humanize_bytes.py b/powerline-bin/powerline/lib/humanize_bytes.py new file mode 100644 index 0000000..c98a117 --- /dev/null +++ b/powerline-bin/powerline/lib/humanize_bytes.py @@ -0,0 +1,25 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from math import log + + +unit_list = tuple(zip(['', 'k', 'M', 'G', 'T', 'P'], [0, 0, 1, 2, 2, 2])) + + +def humanize_bytes(num, suffix='B', si_prefix=False): + '''Return a human friendly byte representation. + + Modified version from http://stackoverflow.com/questions/1094841 + ''' + if num == 0: + return '0 ' + suffix + div = 1000 if si_prefix else 1024 + exponent = min(int(log(num, div)) if num else 0, len(unit_list) - 1) + quotient = float(num) / div ** exponent + unit, decimals = unit_list[exponent] + if unit and not si_prefix: + unit = unit.upper() + 'i' + return ('{{quotient:.{decimals}f}} {{unit}}{{suffix}}' + .format(decimals=decimals) + .format(quotient=quotient, unit=unit, suffix=suffix)) diff --git a/powerline-bin/powerline/lib/inotify.py b/powerline-bin/powerline/lib/inotify.py new file mode 100644 index 0000000..8b74a7f --- /dev/null +++ b/powerline-bin/powerline/lib/inotify.py @@ -0,0 +1,184 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import os +import errno +import ctypes +import struct + +from ctypes.util import find_library + +from powerline.lib.encoding import get_preferred_file_name_encoding + + +__copyright__ = '2013, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + +class INotifyError(Exception): + pass + + +_inotify = None + + +def load_inotify(): + ''' Initialize the inotify library ''' + global _inotify + if _inotify is None: + if hasattr(sys, 'getwindowsversion'): + # On windows abort before loading the C library. Windows has + # multiple, incompatible C runtimes, and we have no way of knowing + # if the one chosen by ctypes is compatible with the currently + # loaded one. + raise INotifyError('INotify not available on windows') + if sys.platform == 'darwin': + raise INotifyError('INotify not available on OS X') + if not hasattr(ctypes, 'c_ssize_t'): + raise INotifyError('You need python >= 2.7 to use inotify') + name = find_library('c') + if not name: + raise INotifyError('Cannot find C library') + libc = ctypes.CDLL(name, use_errno=True) + for function in ('inotify_add_watch', 'inotify_init1', 'inotify_rm_watch'): + if not hasattr(libc, function): + raise INotifyError('libc is too old') + # inotify_init1() + prototype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, use_errno=True) + init1 = prototype(('inotify_init1', libc), ((1, 'flags', 0),)) + + # inotify_add_watch() + prototype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_char_p, ctypes.c_uint32, use_errno=True) + add_watch = prototype(('inotify_add_watch', libc), ( + (1, 'fd'), (1, 'pathname'), (1, 'mask'))) + + # inotify_rm_watch() + prototype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int, use_errno=True) + rm_watch = prototype(('inotify_rm_watch', libc), ( + (1, 'fd'), (1, 'wd'))) + + # read() + prototype = ctypes.CFUNCTYPE(ctypes.c_ssize_t, ctypes.c_int, ctypes.c_void_p, ctypes.c_size_t, use_errno=True) + read = prototype(('read', libc), ( + (1, 'fd'), (1, 'buf'), (1, 'count'))) + _inotify = (init1, add_watch, rm_watch, read) + return _inotify + + +class INotify(object): + + # See for the flags defined below + + # Supported events suitable for MASK parameter of INOTIFY_ADD_WATCH. + ACCESS = 0x00000001 # File was accessed. + MODIFY = 0x00000002 # File was modified. + ATTRIB = 0x00000004 # Metadata changed. + CLOSE_WRITE = 0x00000008 # Writtable file was closed. + CLOSE_NOWRITE = 0x00000010 # Unwrittable file closed. + OPEN = 0x00000020 # File was opened. + MOVED_FROM = 0x00000040 # File was moved from X. + MOVED_TO = 0x00000080 # File was moved to Y. + CREATE = 0x00000100 # Subfile was created. + DELETE = 0x00000200 # Subfile was deleted. + DELETE_SELF = 0x00000400 # Self was deleted. + MOVE_SELF = 0x00000800 # Self was moved. + + # Events sent by the kernel. + UNMOUNT = 0x00002000 # Backing fs was unmounted. + Q_OVERFLOW = 0x00004000 # Event queued overflowed. + IGNORED = 0x00008000 # File was ignored. + + # Helper events. + CLOSE = (CLOSE_WRITE | CLOSE_NOWRITE) # Close. + MOVE = (MOVED_FROM | MOVED_TO) # Moves. + + # Special flags. + ONLYDIR = 0x01000000 # Only watch the path if it is a directory. + DONT_FOLLOW = 0x02000000 # Do not follow a sym link. + EXCL_UNLINK = 0x04000000 # Exclude events on unlinked objects. + MASK_ADD = 0x20000000 # Add to the mask of an already existing watch. + ISDIR = 0x40000000 # Event occurred against dir. + ONESHOT = 0x80000000 # Only send event once. + + # All events which a program can wait on. + ALL_EVENTS = ( + ACCESS | MODIFY | ATTRIB | CLOSE_WRITE | CLOSE_NOWRITE | OPEN | + MOVED_FROM | MOVED_TO | CREATE | DELETE | DELETE_SELF | MOVE_SELF + ) + + # See + CLOEXEC = 0x80000 + NONBLOCK = 0x800 + + def __init__(self, cloexec=True, nonblock=True): + self._init1, self._add_watch, self._rm_watch, self._read = load_inotify() + flags = 0 + if cloexec: + flags |= self.CLOEXEC + if nonblock: + flags |= self.NONBLOCK + self._inotify_fd = self._init1(flags) + if self._inotify_fd == -1: + raise INotifyError(os.strerror(ctypes.get_errno())) + + self._buf = ctypes.create_string_buffer(5000) + self.fenc = get_preferred_file_name_encoding() + self.hdr = struct.Struct(b'iIII') + # We keep a reference to os to prevent it from being deleted + # during interpreter shutdown, which would lead to errors in the + # __del__ method + self.os = os + + def handle_error(self): + eno = ctypes.get_errno() + extra = '' + if eno == errno.ENOSPC: + extra = 'You may need to increase the inotify limits on your system, via /proc/sys/fs/inotify/max_user_*' + raise OSError(eno, self.os.strerror(eno) + str(extra)) + + def __del__(self): + # This method can be called during interpreter shutdown, which means we + # must do the absolute minimum here. Note that there could be running + # daemon threads that are trying to call other methods on this object. + try: + self.os.close(self._inotify_fd) + except (AttributeError, TypeError): + pass + + def close(self): + if hasattr(self, '_inotify_fd'): + self.os.close(self._inotify_fd) + del self.os + del self._add_watch + del self._rm_watch + del self._inotify_fd + + def read(self, get_name=True): + buf = [] + while True: + num = self._read(self._inotify_fd, self._buf, len(self._buf)) + if num == 0: + break + if num < 0: + en = ctypes.get_errno() + if en == errno.EAGAIN: + break # No more data + if en == errno.EINTR: + continue # Interrupted, try again + raise OSError(en, self.os.strerror(en)) + buf.append(self._buf.raw[:num]) + raw = b''.join(buf) + pos = 0 + lraw = len(raw) + while lraw - pos >= self.hdr.size: + wd, mask, cookie, name_len = self.hdr.unpack_from(raw, pos) + pos += self.hdr.size + name = None + if get_name: + name = raw[pos:pos + name_len].rstrip(b'\0') + pos += name_len + self.process_event(wd, mask, cookie, name) + + def process_event(self, *args): + raise NotImplementedError() diff --git a/powerline-bin/powerline/lib/memoize.py b/powerline-bin/powerline/lib/memoize.py new file mode 100644 index 0000000..cedbe45 --- /dev/null +++ b/powerline-bin/powerline/lib/memoize.py @@ -0,0 +1,42 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from functools import wraps + +from powerline.lib.monotonic import monotonic + + +def default_cache_key(**kwargs): + return frozenset(kwargs.items()) + + +class memoize(object): + '''Memoization decorator with timeout.''' + def __init__(self, timeout, cache_key=default_cache_key, cache_reg_func=None): + self.timeout = timeout + self.cache_key = cache_key + self.cache = {} + self.cache_reg_func = cache_reg_func + + def __call__(self, func): + @wraps(func) + def decorated_function(**kwargs): + if self.cache_reg_func: + self.cache_reg_func(self.cache) + self.cache_reg_func = None + + key = self.cache_key(**kwargs) + try: + cached = self.cache.get(key, None) + except TypeError: + return func(**kwargs) + # Handle case when time() appears to be less then cached['time'] due + # to clock updates. Not applicable for monotonic clock, but this + # case is currently rare. + if cached is None or not (cached['time'] < monotonic() < cached['time'] + self.timeout): + cached = self.cache[key] = { + 'result': func(**kwargs), + 'time': monotonic(), + } + return cached['result'] + return decorated_function diff --git a/powerline-bin/powerline/lib/monotonic.py b/powerline-bin/powerline/lib/monotonic.py new file mode 100644 index 0000000..cd7c414 --- /dev/null +++ b/powerline-bin/powerline/lib/monotonic.py @@ -0,0 +1,100 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +try: + try: + # >=python-3.3, Unix + from time import clock_gettime + try: + # >={kernel}-sources-2.6.28 + from time import CLOCK_MONOTONIC_RAW as CLOCK_ID + except ImportError: + from time import CLOCK_MONOTONIC as CLOCK_ID + + monotonic = lambda: clock_gettime(CLOCK_ID) + except ImportError: + # >=python-3.3 + from time import monotonic +except ImportError: + import ctypes + import sys + + try: + if sys.platform == 'win32': + # Windows only + GetTickCount64 = ctypes.windll.kernel32.GetTickCount64 + GetTickCount64.restype = ctypes.c_ulonglong + + def monotonic(): + return GetTickCount64() / 1000 + + elif sys.platform == 'darwin': + # Mac OS X + from ctypes.util import find_library + + libc_name = find_library('c') + if not libc_name: + raise OSError + + libc = ctypes.CDLL(libc_name, use_errno=True) + + mach_absolute_time = libc.mach_absolute_time + mach_absolute_time.argtypes = () + mach_absolute_time.restype = ctypes.c_uint64 + + class mach_timebase_info_data_t(ctypes.Structure): + _fields_ = ( + ('numer', ctypes.c_uint32), + ('denom', ctypes.c_uint32), + ) + mach_timebase_info_data_p = ctypes.POINTER(mach_timebase_info_data_t) + + _mach_timebase_info = libc.mach_timebase_info + _mach_timebase_info.argtypes = (mach_timebase_info_data_p,) + _mach_timebase_info.restype = ctypes.c_int + + def mach_timebase_info(): + timebase = mach_timebase_info_data_t() + _mach_timebase_info(ctypes.byref(timebase)) + return (timebase.numer, timebase.denom) + + timebase = mach_timebase_info() + factor = timebase[0] / timebase[1] * 1e-9 + + def monotonic(): + return mach_absolute_time() * factor + else: + # linux only (no librt on OS X) + import os + + # See + CLOCK_MONOTONIC = 1 + CLOCK_MONOTONIC_RAW = 4 + + class timespec(ctypes.Structure): + _fields_ = ( + ('tv_sec', ctypes.c_long), + ('tv_nsec', ctypes.c_long) + ) + tspec = timespec() + + librt = ctypes.CDLL('librt.so.1', use_errno=True) + clock_gettime = librt.clock_gettime + clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)] + + if clock_gettime(CLOCK_MONOTONIC_RAW, ctypes.pointer(tspec)) == 0: + # >={kernel}-sources-2.6.28 + clock_id = CLOCK_MONOTONIC_RAW + elif clock_gettime(CLOCK_MONOTONIC, ctypes.pointer(tspec)) == 0: + clock_id = CLOCK_MONOTONIC + else: + raise OSError + + def monotonic(): + if clock_gettime(CLOCK_MONOTONIC, ctypes.pointer(tspec)) != 0: + errno_ = ctypes.get_errno() + raise OSError(errno_, os.strerror(errno_)) + return tspec.tv_sec + tspec.tv_nsec / 1e9 + + except: + from time import time as monotonic # NOQA diff --git a/powerline-bin/powerline/lib/overrides.py b/powerline-bin/powerline/lib/overrides.py new file mode 100644 index 0000000..3257d98 --- /dev/null +++ b/powerline-bin/powerline/lib/overrides.py @@ -0,0 +1,80 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import json + +from powerline.lib.dict import REMOVE_THIS_KEY + + +def parse_value(s): + '''Convert string to Python object + + Rules: + + * Empty string means that corresponding key should be removed from the + dictionary. + * Strings that start with a minus, digit or with some character that starts + JSON collection or string object are parsed as JSON. + * JSON special values ``null``, ``true``, ``false`` (case matters) are + parsed as JSON. + * All other values are considered to be raw strings. + + :param str s: Parsed string. + + :return: Python object. + ''' + if not s: + return REMOVE_THIS_KEY + elif s[0] in '"{[0123456789-' or s in ('null', 'true', 'false'): + return json.loads(s) + else: + return s + + +def keyvaluesplit(s): + '''Split K1.K2=VAL into K1.K2 and parsed VAL + ''' + if '=' not in s: + raise TypeError('Option must look like option=json_value') + if s[0] == '_': + raise ValueError('Option names must not start with `_\'') + idx = s.index('=') + o = s[:idx] + val = parse_value(s[idx + 1:]) + return (o, val) + + +def parsedotval(s): + '''Parse K1.K2=VAL into {"K1":{"K2":VAL}} + + ``VAL`` is processed according to rules defined in :py:func:`parse_value`. + ''' + if type(s) is tuple: + o, val = s + val = parse_value(val) + else: + o, val = keyvaluesplit(s) + + keys = o.split('.') + if len(keys) > 1: + r = (keys[0], {}) + rcur = r[1] + for key in keys[1:-1]: + rcur[key] = {} + rcur = rcur[key] + rcur[keys[-1]] = val + return r + else: + return (o, val) + + +def parse_override_var(s): + '''Parse a semicolon-separated list of strings into a sequence of values + + Emits the same items in sequence as :py:func:`parsedotval` does. + ''' + return ( + parsedotval(item) + for item in s.split(';') + if item + ) diff --git a/powerline-bin/powerline/lib/path.py b/powerline-bin/powerline/lib/path.py new file mode 100644 index 0000000..49ff433 --- /dev/null +++ b/powerline-bin/powerline/lib/path.py @@ -0,0 +1,18 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + + +def realpath(path): + return os.path.abspath(os.path.realpath(path)) + + +def join(*components): + if any((isinstance(p, bytes) for p in components)): + return os.path.join(*[ + p if isinstance(p, bytes) else p.encode('ascii') + for p in components + ]) + else: + return os.path.join(*components) diff --git a/powerline-bin/powerline/lib/shell.py b/powerline-bin/powerline/lib/shell.py new file mode 100644 index 0000000..2082e82 --- /dev/null +++ b/powerline-bin/powerline/lib/shell.py @@ -0,0 +1,133 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import os + +from subprocess import Popen, PIPE +from functools import partial + +from powerline.lib.encoding import get_preferred_input_encoding, get_preferred_output_encoding + + +if sys.platform.startswith('win32'): + # Prevent windows from launching consoles when calling commands + # http://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx + Popen = partial(Popen, creationflags=0x08000000) + + +def run_cmd(pl, cmd, stdin=None, strip=True): + '''Run command and return its stdout, stripped + + If running command fails returns None and logs failure to ``pl`` argument. + + :param PowerlineLogger pl: + Logger used to log failures. + :param list cmd: + Command which will be run. + :param str stdin: + String passed to command. May be None. + :param bool strip: + True if the result should be stripped. + ''' + try: + p = Popen(cmd, shell=False, stdout=PIPE, stdin=PIPE) + except OSError as e: + pl.exception('Could not execute command ({0}): {1}', e, cmd) + return None + else: + stdout, err = p.communicate( + stdin if stdin is None else stdin.encode(get_preferred_output_encoding())) + stdout = stdout.decode(get_preferred_input_encoding()) + return stdout.strip() if strip else stdout + + +def asrun(pl, ascript): + '''Run the given AppleScript and return the standard output and error.''' + return run_cmd(pl, ['osascript', '-'], ascript) + + +def readlines(cmd, cwd): + '''Run command and read its output, line by line + + :param list cmd: + Command which will be run. + :param str cwd: + Working directory of the command which will be run. + ''' + p = Popen(cmd, shell=False, stdout=PIPE, stderr=PIPE, cwd=cwd) + encoding = get_preferred_input_encoding() + p.stderr.close() + with p.stdout: + for line in p.stdout: + yield line[:-1].decode(encoding) + + +try: + from shutil import which +except ImportError: + # shutil.which was added in python-3.3. Here is what was added: + # Lib/shutil.py, commit 5abe28a9c8fe701ba19b1db5190863384e96c798 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + '''Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + ``mode`` defaults to os.F_OK | os.X_OK. ``path`` defaults to the result + of ``os.environ.get('PATH')``, or can be overridden with a custom search + path. + ''' + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return ( + os.path.exists(fn) + and os.access(fn, mode) + and not os.path.isdir(fn) + ) + + # If we’re given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get('PATH', os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == 'win32': + # The current directory takes precedence on Windows. + if os.curdir not in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get('PATHEXT', '').split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given 'python.exe'. + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don’t have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if normdir not in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None diff --git a/powerline-bin/powerline/lib/threaded.py b/powerline-bin/powerline/lib/threaded.py new file mode 100644 index 0000000..e5a6b3e --- /dev/null +++ b/powerline-bin/powerline/lib/threaded.py @@ -0,0 +1,262 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from threading import Thread, Lock, Event +from types import MethodType + +from powerline.lib.monotonic import monotonic +from powerline.segments import Segment + + +class MultiRunnedThread(object): + daemon = True + + def __init__(self): + self.thread = None + + def is_alive(self): + return self.thread and self.thread.is_alive() + + def start(self): + self.shutdown_event.clear() + self.thread = Thread(target=self.run) + self.thread.daemon = self.daemon + self.thread.start() + + def join(self, *args, **kwargs): + if self.thread: + return self.thread.join(*args, **kwargs) + return None + + +class ThreadedSegment(Segment, MultiRunnedThread): + min_sleep_time = 0.1 + update_first = True + interval = 1 + daemon = False + + argmethods = ('render', 'set_state') + + def __init__(self): + super(ThreadedSegment, self).__init__() + self.run_once = True + self.crashed = False + self.crashed_value = None + self.update_value = None + self.updated = False + + def __call__(self, pl, update_first=True, **kwargs): + if self.run_once: + self.pl = pl + self.set_state(**kwargs) + update_value = self.get_update_value(True) + elif not self.is_alive(): + # Without this we will not have to wait long until receiving bug “I + # opened vim, but branch information is only shown after I move + # cursor”. + # + # If running once .update() is called in __call__. + self.start() + update_value = self.get_update_value(self.do_update_first) + else: + update_value = self.get_update_value(not self.updated) + + if self.crashed: + return self.crashed_value + + return self.render(update_value, update_first=update_first, pl=pl, **kwargs) + + def set_update_value(self): + try: + self.update_value = self.update(self.update_value) + except Exception as e: + self.exception('Exception while updating: {0}', str(e)) + self.crashed = True + except KeyboardInterrupt: + self.warn('Caught keyboard interrupt while updating') + self.crashed = True + else: + self.crashed = False + self.updated = True + + def get_update_value(self, update=False): + if update: + self.set_update_value() + return self.update_value + + def run(self): + if self.do_update_first: + start_time = monotonic() + while True: + self.shutdown_event.wait(max(self.interval - (monotonic() - start_time), self.min_sleep_time)) + if self.shutdown_event.is_set(): + break + start_time = monotonic() + self.set_update_value() + else: + while not self.shutdown_event.is_set(): + start_time = monotonic() + self.set_update_value() + self.shutdown_event.wait(max(self.interval - (monotonic() - start_time), self.min_sleep_time)) + + def shutdown(self): + self.shutdown_event.set() + if self.daemon and self.is_alive(): + # Give the worker thread a chance to shutdown, but don’t block for + # too long + self.join(0.01) + + def set_interval(self, interval=None): + # Allowing “interval” keyword in configuration. + # Note: Here **kwargs is needed to support foreign data, in subclasses + # it can be seen in a number of places in order to support + # .set_interval(). + interval = interval or getattr(self, 'interval') + self.interval = interval + + def set_state(self, interval=None, update_first=True, shutdown_event=None, **kwargs): + self.set_interval(interval) + self.shutdown_event = shutdown_event or Event() + self.do_update_first = update_first and self.update_first + self.updated = self.updated or (not self.do_update_first) + + def startup(self, pl, **kwargs): + self.run_once = False + self.pl = pl + self.daemon = pl.use_daemon_threads + + self.set_state(**kwargs) + + if not self.is_alive(): + self.start() + + def critical(self, *args, **kwargs): + self.pl.critical(prefix=self.__class__.__name__, *args, **kwargs) + + def exception(self, *args, **kwargs): + self.pl.exception(prefix=self.__class__.__name__, *args, **kwargs) + + def info(self, *args, **kwargs): + self.pl.info(prefix=self.__class__.__name__, *args, **kwargs) + + def error(self, *args, **kwargs): + self.pl.error(prefix=self.__class__.__name__, *args, **kwargs) + + def warn(self, *args, **kwargs): + self.pl.warn(prefix=self.__class__.__name__, *args, **kwargs) + + def debug(self, *args, **kwargs): + self.pl.debug(prefix=self.__class__.__name__, *args, **kwargs) + + def argspecobjs(self): + for name in self.argmethods: + try: + yield name, getattr(self, name) + except AttributeError: + pass + + def additional_args(self): + return (('interval', self.interval),) + + _omitted_args = { + 'render': (0,), + 'set_state': ('shutdown_event',), + } + + def omitted_args(self, name, method): + ret = self._omitted_args.get(name, ()) + if isinstance(getattr(self, name, None), MethodType): + ret = tuple((i + 1 if isinstance(i, int) else i for i in ret)) + return ret + + +class KwThreadedSegment(ThreadedSegment): + update_first = True + + argmethods = ('render', 'set_state', 'key', 'render_one') + + def __init__(self): + super(KwThreadedSegment, self).__init__() + self.updated = True + self.update_value = ({}, set()) + self.write_lock = Lock() + self.new_queries = [] + + @staticmethod + def key(**kwargs): + return frozenset(kwargs.items()) + + def render(self, update_value, update_first, key=None, after_update=False, **kwargs): + queries, crashed = update_value + if key is None: + key = self.key(**kwargs) + if key in crashed: + return self.crashed_value + + try: + update_state = queries[key][1] + except KeyError: + with self.write_lock: + self.new_queries.append(key) + if self.do_update_first or self.run_once: + if after_update: + self.error('internal error: value was not computed even though update_first was set') + update_state = None + else: + return self.render( + update_value=self.get_update_value(True), + update_first=False, + key=key, + after_update=True, + **kwargs + ) + else: + update_state = None + + return self.render_one(update_state, **kwargs) + + def update_one(self, crashed, updates, key): + try: + updates[key] = (monotonic(), self.compute_state(key)) + except Exception as e: + self.exception('Exception while computing state for {0!r}: {1}', key, str(e)) + crashed.add(key) + except KeyboardInterrupt: + self.warn('Interrupt while computing state for {0!r}', key) + crashed.add(key) + + def update(self, old_update_value): + updates = {} + crashed = set() + update_value = (updates, crashed) + queries = old_update_value[0] + + new_queries = self.new_queries + with self.write_lock: + self.new_queries = [] + + for key, (last_query_time, state) in queries.items(): + if last_query_time < monotonic() < last_query_time + self.interval: + updates[key] = (last_query_time, state) + else: + self.update_one(crashed, updates, key) + + for key in new_queries: + self.update_one(crashed, updates, key) + + return update_value + + def set_state(self, interval=None, update_first=True, shutdown_event=None, **kwargs): + self.set_interval(interval) + self.do_update_first = update_first and self.update_first + self.shutdown_event = shutdown_event or Event() + + @staticmethod + def render_one(update_state, **kwargs): + return update_state + + _omitted_args = { + 'render': ('update_value', 'key', 'after_update'), + 'set_state': ('shutdown_event',), + 'render_one': (0,), + } diff --git a/powerline-bin/powerline/lib/unicode.py b/powerline-bin/powerline/lib/unicode.py new file mode 100644 index 0000000..152bacd --- /dev/null +++ b/powerline-bin/powerline/lib/unicode.py @@ -0,0 +1,283 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import codecs + +from unicodedata import east_asian_width, combining + +from powerline.lib.encoding import get_preferred_output_encoding + + +try: + from __builtin__ import unicode +except ImportError: + unicode = str + + +try: + from __builtin__ import unichr +except ImportError: + unichr = chr + + +if sys.maxunicode < 0x10FFFF: + _unichr = unichr + + def unichr(ch): + if ch <= sys.maxunicode: + return _unichr(ch) + else: + ch -= 0x10000 + return _unichr((ch >> 10) + 0xD800) + _unichr((ch & ((1 << 10) - 1)) + 0xDC00) + + +def u(s): + '''Return unicode instance assuming UTF-8 encoded string. + ''' + if type(s) is unicode: + return s + else: + return unicode(s, 'utf-8') + + +if sys.version_info < (3,): + def tointiter(s): + '''Convert a byte string to the sequence of integers + ''' + return (ord(c) for c in s) +else: + def tointiter(s): + '''Convert a byte string to the sequence of integers + ''' + return iter(s) + + +def powerline_decode_error(e): + if not isinstance(e, UnicodeDecodeError): + raise NotImplementedError + return (''.join(( + '<{0:02X}>'.format(c) + for c in tointiter(e.object[e.start:e.end]) + )), e.end) + + +codecs.register_error('powerline_decode_error', powerline_decode_error) + + +last_swe_idx = 0 + + +def register_strwidth_error(strwidth): + '''Create new encode errors handling method similar to ``replace`` + + Like ``replace`` this method uses question marks in place of the characters + that cannot be represented in the requested encoding. Unlike ``replace`` the + amount of question marks is identical to the amount of display cells + offending character occupies. Thus encoding ``…`` (U+2026, HORIZONTAL + ELLIPSIS) to ``latin1`` will emit one question mark, but encoding ``A`` + (U+FF21, FULLWIDTH LATIN CAPITAL LETTER A) will emit two question marks. + + Since width of some characters depends on the terminal settings and + powerline knows how to respect them a single error handling method cannot be + used. Instead of it the generator function is used which takes ``strwidth`` + function (function that knows how to compute string width respecting all + needed settings) and emits new error handling method name. + + :param function strwidth: + Function that computs string width measured in display cells the string + occupies when displayed. + + :return: New error handling method name. + ''' + global last_swe_idx + last_swe_idx += 1 + + def powerline_encode_strwidth_error(e): + if not isinstance(e, UnicodeEncodeError): + raise NotImplementedError + return ('?' * strwidth(e.object[e.start:e.end]), e.end) + + ename = 'powerline_encode_strwidth_error_{0}'.format(last_swe_idx) + codecs.register_error(ename, powerline_encode_strwidth_error) + return ename + + +def out_u(s): + '''Return unicode string suitable for displaying + + Unlike other functions assumes get_preferred_output_encoding() first. Unlike + u() does not throw exceptions for invalid unicode strings. Unlike + safe_unicode() does throw an exception if object is not a string. + ''' + if isinstance(s, unicode): + return s + elif isinstance(s, bytes): + return unicode(s, get_preferred_output_encoding(), 'powerline_decode_error') + else: + raise TypeError('Expected unicode or bytes instance, got {0}'.format(repr(type(s)))) + + +def safe_unicode(s): + '''Return unicode instance without raising an exception. + + Order of assumptions: + * ASCII string or unicode object + * UTF-8 string + * Object with __str__() or __repr__() method that returns UTF-8 string or + unicode object (depending on python version) + * String in powerline.lib.encoding.get_preferred_output_encoding() encoding + * If everything failed use safe_unicode on last exception with which + everything failed + ''' + try: + try: + if type(s) is bytes: + return unicode(s, 'ascii') + else: + return unicode(s) + except UnicodeDecodeError: + try: + return unicode(s, 'utf-8') + except TypeError: + return unicode(str(s), 'utf-8') + except UnicodeDecodeError: + return unicode(s, get_preferred_output_encoding()) + except Exception as e: + return safe_unicode(e) + + +class FailedUnicode(unicode): + '''Builtin ``unicode`` subclass indicating fatal error + + If your code for some reason wants to determine whether `.render()` method + failed it should check returned string for being a FailedUnicode instance. + Alternatively you could subclass Powerline and override `.render()` method + to do what you like in place of catching the exception and returning + FailedUnicode. + ''' + pass + + +if sys.version_info < (3,): + def string(s): + if type(s) is not str: + return s.encode('utf-8') + else: + return s +else: + def string(s): + if type(s) is not str: + return s.decode('utf-8') + else: + return s + + +string.__doc__ = ( + '''Transform ``unicode`` or ``bytes`` object into ``str`` object + + On Python-2 this encodes ``unicode`` to ``bytes`` (which is ``str``) using + UTF-8 encoding; on Python-3 this decodes ``bytes`` to ``unicode`` (which is + ``str``) using UTF-8 encoding. + + Useful for functions that expect an ``str`` object in both unicode versions, + not caring about the semantic differences between them in Python-2 and + Python-3. + ''' +) + + +def surrogate_pair_to_character(high, low): + '''Transform a pair of surrogate codepoints to one codepoint + ''' + return 0x10000 + ((high - 0xD800) << 10) + (low - 0xDC00) + + +_strwidth_documentation = ( + '''Compute string width in display cells + + {0} + + :param dict width_data: + Dictionary which maps east_asian_width property values to strings + lengths. It is expected to contain the following keys and values (from + `East Asian Width annex `_): + + === ====== =========================================================== + Key Value Description + === ====== =========================================================== + F 2 Fullwidth: all characters that are defined as Fullwidth in + the Unicode Standard [Unicode] by having a compatibility + decomposition of type to characters elsewhere in the + Unicode Standard that are implicitly narrow but unmarked. + H 1 Halfwidth: all characters that are explicitly defined as + Halfwidth in the Unicode Standard by having a compatibility + decomposition of type to characters elsewhere in + the Unicode Standard that are implicitly wide but unmarked, + plus U+20A9 ₩ WON SIGN. + W 2 Wide: all other characters that are always wide. These + characters occur only in the context of East Asian + typography where they are wide characters (such as the + Unified Han Ideographs or Squared Katakana Symbols). This + category includes characters that have explicit halfwidth + counterparts. + Na 1 Narrow: characters that are always narrow and have explicit + fullwidth or wide counterparts. These characters are + implicitly narrow in East Asian typography and legacy + character sets because they have explicit fullwidth or wide + counterparts. All of ASCII is an example of East Asian + Narrow characters. + A 1 or 2 Ambigious: characters that may sometimes be wide and + sometimes narrow. Ambiguous characters require additional + information not contained in the character code to further + resolve their width. This information is usually defined in + terminal setting that should in turn respect glyphs widths + in used fonts. Also see :ref:`ambiwidth configuration + option `. + N 1 Neutral characters: character that does not occur in legacy + East Asian character sets. + === ====== =========================================================== + + :param unicode string: + String whose width will be calculated. + + :return: unsigned integer.''') + + +def strwidth_ucs_4(width_data, string): + return sum((( + ( + 0 + ) if combining(symbol) else ( + width_data[east_asian_width(symbol)] + ) + ) for symbol in string)) + + +strwidth_ucs_4.__doc__ = _strwidth_documentation.format( + '''This version of function expects that characters above 0xFFFF are + represented using one symbol. This is only the case in UCS-4 Python builds. + + .. note: + Even in UCS-4 Python builds it is possible to represent characters above + 0xFFFF using surrogate pairs. Characters represented this way are not + supported.''') + + +def strwidth_ucs_2(width_data, string): + return sum((( + ( + width_data[east_asian_width(string[i - 1] + symbol)] + ) if 0xDC00 <= ord(symbol) <= 0xDFFF else ( + 0 + ) if combining(symbol) or 0xD800 <= ord(symbol) <= 0xDBFF else ( + width_data[east_asian_width(symbol)] + ) + ) for i, symbol in enumerate(string))) + + +strwidth_ucs_2.__doc__ = _strwidth_documentation.format( + '''This version of function expects that characters above 0xFFFF are + represented using two symbols forming a surrogate pair, which is the only + option in UCS-2 Python builds. It still works correctly in UCS-4 Python + builds, but is slower then its UCS-4 counterpart.''') diff --git a/powerline-bin/powerline/lib/url.py b/powerline-bin/powerline/lib/url.py new file mode 100644 index 0000000..f25919c --- /dev/null +++ b/powerline-bin/powerline/lib/url.py @@ -0,0 +1,17 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +try: + from urllib.error import HTTPError # NOQA + from urllib.request import urlopen # NOQA + from urllib.parse import urlencode as urllib_urlencode # NOQA +except ImportError: + from urllib2 import urlopen, HTTPError # NOQA + from urllib import urlencode as urllib_urlencode # NOQA + + +def urllib_read(url): + try: + return urlopen(url, timeout=10).read().decode('utf-8') + except HTTPError: + return diff --git a/powerline-bin/powerline/lib/vcs/__init__.py b/powerline-bin/powerline/lib/vcs/__init__.py new file mode 100644 index 0000000..1b7f5e2 --- /dev/null +++ b/powerline-bin/powerline/lib/vcs/__init__.py @@ -0,0 +1,276 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import errno + +from threading import Lock +from collections import defaultdict + +from powerline.lib.watcher import create_tree_watcher +from powerline.lib.unicode import out_u +from powerline.lib.path import join + + +def generate_directories(path): + if os.path.isdir(path): + yield path + while True: + if os.path.ismount(path): + break + old_path = path + path = os.path.dirname(path) + if path == old_path or not path: + break + yield path + + +_file_watcher = None + + +def file_watcher(create_watcher): + global _file_watcher + if _file_watcher is None: + _file_watcher = create_watcher() + return _file_watcher + + +_branch_watcher = None + + +def branch_watcher(create_watcher): + global _branch_watcher + if _branch_watcher is None: + _branch_watcher = create_watcher() + return _branch_watcher + + +branch_name_cache = {} +branch_lock = Lock() +file_status_lock = Lock() + + +def get_branch_name(directory, config_file, get_func, create_watcher): + global branch_name_cache + with branch_lock: + # Check if the repo directory was moved/deleted + fw = branch_watcher(create_watcher) + is_watched = fw.is_watching(directory) + try: + changed = fw(directory) + except OSError as e: + if getattr(e, 'errno', None) != errno.ENOENT: + raise + changed = True + if changed: + branch_name_cache.pop(config_file, None) + # Remove the watches for this repo + if is_watched: + fw.unwatch(directory) + fw.unwatch(config_file) + else: + # Check if the config file has changed + try: + changed = fw(config_file) + except OSError as e: + if getattr(e, 'errno', None) != errno.ENOENT: + raise + # Config file does not exist (happens for mercurial) + if config_file not in branch_name_cache: + branch_name_cache[config_file] = out_u(get_func(directory, config_file)) + if changed: + # Config file has changed or was not tracked + branch_name_cache[config_file] = out_u(get_func(directory, config_file)) + return branch_name_cache[config_file] + + +class FileStatusCache(dict): + def __init__(self): + self.dirstate_map = defaultdict(set) + self.ignore_map = defaultdict(set) + self.keypath_ignore_map = {} + + def update_maps(self, keypath, directory, dirstate_file, ignore_file_name, extra_ignore_files): + parent = keypath + ignore_files = set() + while parent != directory: + nparent = os.path.dirname(keypath) + if nparent == parent: + break + parent = nparent + ignore_files.add(join(parent, ignore_file_name)) + for f in extra_ignore_files: + ignore_files.add(f) + self.keypath_ignore_map[keypath] = ignore_files + for ignf in ignore_files: + self.ignore_map[ignf].add(keypath) + self.dirstate_map[dirstate_file].add(keypath) + + def invalidate(self, dirstate_file=None, ignore_file=None): + for keypath in self.dirstate_map[dirstate_file]: + self.pop(keypath, None) + for keypath in self.ignore_map[ignore_file]: + self.pop(keypath, None) + + def ignore_files(self, keypath): + for ignf in self.keypath_ignore_map[keypath]: + yield ignf + + +file_status_cache = FileStatusCache() + + +def get_file_status(directory, dirstate_file, file_path, ignore_file_name, get_func, create_watcher, extra_ignore_files=()): + global file_status_cache + keypath = file_path if os.path.isabs(file_path) else join(directory, file_path) + file_status_cache.update_maps(keypath, directory, dirstate_file, ignore_file_name, extra_ignore_files) + + with file_status_lock: + # Optimize case of keypath not being cached + if keypath not in file_status_cache: + file_status_cache[keypath] = ans = get_func(directory, file_path) + return ans + + # Check if any relevant files have changed + file_changed = file_watcher(create_watcher) + changed = False + # Check if dirstate has changed + try: + changed = file_changed(dirstate_file) + except OSError as e: + if getattr(e, 'errno', None) != errno.ENOENT: + raise + # The .git index file does not exist for a new git repo + return get_func(directory, file_path) + + if changed: + # Remove all cached values for files that depend on this + # dirstate_file + file_status_cache.invalidate(dirstate_file=dirstate_file) + else: + # Check if the file itself has changed + try: + changed ^= file_changed(keypath) + except OSError as e: + if getattr(e, 'errno', None) != errno.ENOENT: + raise + # Do not call get_func again for a non-existant file + if keypath not in file_status_cache: + file_status_cache[keypath] = get_func(directory, file_path) + return file_status_cache[keypath] + + if changed: + file_status_cache.pop(keypath, None) + else: + # Check if one of the ignore files has changed + for ignf in file_status_cache.ignore_files(keypath): + try: + changed ^= file_changed(ignf) + except OSError as e: + if getattr(e, 'errno', None) != errno.ENOENT: + raise + if changed: + # Invalidate cache for all files that might be affected + # by this ignore file + file_status_cache.invalidate(ignore_file=ignf) + break + + try: + return file_status_cache[keypath] + except KeyError: + file_status_cache[keypath] = ans = get_func(directory, file_path) + return ans + + +class TreeStatusCache(dict): + def __init__(self, pl): + self.tw = create_tree_watcher(pl) + self.pl = pl + + def cache_and_get(self, key, status): + ans = self.get(key, self) + if ans is self: + ans = self[key] = status() + return ans + + def __call__(self, repo): + key = repo.directory + try: + if self.tw(key, ignore_event=getattr(repo, 'ignore_event', None)): + self.pop(key, None) + except OSError as e: + self.pl.warn('Failed to check {0} for changes, with error: {1}', key, str(e)) + return self.cache_and_get(key, repo.status) + + +_tree_status_cache = None + + +def tree_status(repo, pl): + global _tree_status_cache + if _tree_status_cache is None: + _tree_status_cache = TreeStatusCache(pl) + return _tree_status_cache(repo) + + +vcs_props = ( + ('git', '.git', os.path.exists), + ('mercurial', '.hg', os.path.isdir), + ('bzr', '.bzr', os.path.isdir), +) + + +vcs_props_bytes = [ + (vcs, vcs_dir.encode('ascii'), check) + for vcs, vcs_dir, check in vcs_props +] + + +def guess(path, create_watcher): + for directory in generate_directories(path): + for vcs, vcs_dir, check in (vcs_props_bytes if isinstance(path, bytes) else vcs_props): + repo_dir = os.path.join(directory, vcs_dir) + if check(repo_dir): + if os.path.isdir(repo_dir) and not os.access(repo_dir, os.X_OK): + continue + try: + if vcs not in globals(): + globals()[vcs] = getattr(__import__(str('powerline.lib.vcs'), fromlist=[str(vcs)]), str(vcs)) + return globals()[vcs].Repository(directory, create_watcher) + except: + pass + return None + + +def get_fallback_create_watcher(): + from powerline.lib.watcher import create_file_watcher + from powerline import get_fallback_logger + from functools import partial + return partial(create_file_watcher, get_fallback_logger(), 'auto') + + +def debug(): + '''Test run guess(), repo.branch() and repo.status() + + To use:: + python -c 'from powerline.lib.vcs import debug; debug()' some_file_to_watch. + ''' + import sys + dest = sys.argv[-1] + repo = guess(os.path.abspath(dest), get_fallback_create_watcher) + if repo is None: + print ('%s is not a recognized vcs repo' % dest) + raise SystemExit(1) + print ('Watching %s' % dest) + print ('Press Ctrl-C to exit.') + try: + while True: + if os.path.isdir(dest): + print ('Branch name: %s Status: %s' % (repo.branch(), repo.status())) + else: + print ('File status: %s' % repo.status(dest)) + raw_input('Press Enter to check again: ') + except KeyboardInterrupt: + pass + except EOFError: + pass diff --git a/powerline-bin/powerline/lib/vcs/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/lib/vcs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c2c7b0eb3e29a825726e04fee0578de2a3b60b4 GIT binary patch literal 11832 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 VsKJu--1j=iiHj}&AXu{9{{@;jv?Blj literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/vcs/__pycache__/git.cpython-312.pyc b/powerline-bin/powerline/lib/vcs/__pycache__/git.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fc437dd8a3dd212f45579e4c64159b473a021d0 GIT binary patch literal 9880 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/vcs/bzr.py b/powerline-bin/powerline/lib/vcs/bzr.py new file mode 100644 index 0000000..e47d8b2 --- /dev/null +++ b/powerline-bin/powerline/lib/vcs/bzr.py @@ -0,0 +1,108 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import re + +from io import StringIO + +from bzrlib import (workingtree, status, library_state, trace, ui) + +from powerline.lib.vcs import get_branch_name, get_file_status +from powerline.lib.path import join +from powerline.lib.encoding import get_preferred_file_contents_encoding + + +class CoerceIO(StringIO): + def write(self, arg): + if isinstance(arg, bytes): + arg = arg.decode(get_preferred_file_contents_encoding(), 'replace') + return super(CoerceIO, self).write(arg) + + +nick_pat = re.compile(br'nickname\s*=\s*(.+)') + + +def branch_name_from_config_file(directory, config_file): + ans = None + try: + with open(config_file, 'rb') as f: + for line in f: + m = nick_pat.match(line) + if m is not None: + ans = m.group(1).strip().decode(get_preferred_file_contents_encoding(), 'replace') + break + except Exception: + pass + return ans or os.path.basename(directory) + + +state = None + + +class Repository(object): + def __init__(self, directory, create_watcher): + self.directory = os.path.abspath(directory) + self.create_watcher = create_watcher + + def status(self, path=None): + '''Return status of repository or file. + + Without file argument: returns status of the repository: + + :'D?': dirty (tracked modified files: added, removed, deleted, modified), + :'?U': untracked-dirty (added, but not tracked files) + :None: clean (status is empty) + + With file argument: returns status of this file: The status codes are + those returned by bzr status -S + ''' + if path is not None: + return get_file_status( + directory=self.directory, + dirstate_file=join(self.directory, '.bzr', 'checkout', 'dirstate'), + file_path=path, + ignore_file_name='.bzrignore', + get_func=self.do_status, + create_watcher=self.create_watcher, + ) + return self.do_status(self.directory, path) + + def do_status(self, directory, path): + try: + return self._status(self.directory, path) + except Exception: + pass + + def _status(self, directory, path): + global state + if state is None: + state = library_state.BzrLibraryState(ui=ui.SilentUIFactory, trace=trace.DefaultConfig()) + buf = CoerceIO() + w = workingtree.WorkingTree.open(directory) + status.show_tree_status(w, specific_files=[path] if path else None, to_file=buf, short=True) + raw = buf.getvalue() + if not raw.strip(): + return + if path: + ans = raw[:2] + if ans == 'I ': # Ignored + ans = None + return ans + dirtied = untracked = ' ' + for line in raw.splitlines(): + if len(line) > 1 and line[1] in 'ACDMRIN': + dirtied = 'D' + elif line and line[0] == '?': + untracked = 'U' + ans = dirtied + untracked + return ans if ans.strip() else None + + def branch(self): + config_file = join(self.directory, '.bzr', 'branch', 'branch.conf') + return get_branch_name( + directory=self.directory, + config_file=config_file, + get_func=branch_name_from_config_file, + create_watcher=self.create_watcher, + ) diff --git a/powerline-bin/powerline/lib/vcs/git.py b/powerline-bin/powerline/lib/vcs/git.py new file mode 100644 index 0000000..9bdf56e --- /dev/null +++ b/powerline-bin/powerline/lib/vcs/git.py @@ -0,0 +1,208 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import re + +from powerline.lib.vcs import get_branch_name, get_file_status +from powerline.lib.shell import readlines +from powerline.lib.path import join +from powerline.lib.encoding import (get_preferred_file_name_encoding, + get_preferred_file_contents_encoding) +from powerline.lib.shell import which + + +_ref_pat = re.compile(br'ref:\s*refs/heads/(.+)') + + +def branch_name_from_config_file(directory, config_file): + try: + with open(config_file, 'rb') as f: + raw = f.read() + except EnvironmentError: + return os.path.basename(directory) + m = _ref_pat.match(raw) + if m is not None: + return m.group(1).decode(get_preferred_file_contents_encoding(), 'replace') + return raw[:7] + + +def git_directory(directory): + path = join(directory, '.git') + if os.path.isfile(path): + with open(path, 'rb') as f: + raw = f.read() + if not raw.startswith(b'gitdir: '): + raise IOError('invalid gitfile format') + raw = raw[8:] + if raw[-1:] == b'\n': + raw = raw[:-1] + if not isinstance(path, bytes): + raw = raw.decode(get_preferred_file_name_encoding()) + if not raw: + raise IOError('no path in gitfile') + return os.path.abspath(os.path.join(directory, raw)) + else: + return path + + +class GitRepository(object): + __slots__ = ('directory', 'create_watcher') + + def __init__(self, directory, create_watcher): + self.directory = os.path.abspath(directory) + self.create_watcher = create_watcher + + def status(self, path=None): + '''Return status of repository or file. + + Without file argument: returns status of the repository: + + :First column: working directory status (D: dirty / space) + :Second column: index status (I: index dirty / space) + :Third column: presence of untracked files (U: untracked files / space) + :None: repository clean + + With file argument: returns status of this file. Output is + equivalent to the first two columns of ``git status --porcelain`` + (except for merge statuses as they are not supported by libgit2). + ''' + if path: + gitd = git_directory(self.directory) + # We need HEAD as without it using fugitive to commit causes the + # current file’s status (and only the current file) to not be updated + # for some reason I cannot be bothered to figure out. + return get_file_status( + directory=self.directory, + dirstate_file=join(gitd, 'index'), + file_path=path, + ignore_file_name='.gitignore', + get_func=self.do_status, + create_watcher=self.create_watcher, + extra_ignore_files=tuple(join(gitd, x) for x in ('logs/HEAD', 'info/exclude')), + ) + return self.do_status(self.directory, path) + + def branch(self): + directory = git_directory(self.directory) + head = join(directory, 'HEAD') + return get_branch_name( + directory=directory, + config_file=head, + get_func=branch_name_from_config_file, + create_watcher=self.create_watcher, + ) + + +try: + import pygit2 as git + + class Repository(GitRepository): + @staticmethod + def ignore_event(path, name): + return False + + def stash(self): + try: + stashref = git.Repository(git_directory(self.directory)).lookup_reference('refs/stash') + except KeyError: + return 0 + return sum(1 for _ in stashref.log()) + + def do_status(self, directory, path): + if path: + try: + status = git.Repository(directory).status_file(path) + except (KeyError, ValueError): + return None + + if status == git.GIT_STATUS_CURRENT: + return None + else: + if status & git.GIT_STATUS_WT_NEW: + return '??' + if status & git.GIT_STATUS_IGNORED: + return '!!' + + if status & git.GIT_STATUS_INDEX_NEW: + index_status = 'A' + elif status & git.GIT_STATUS_INDEX_DELETED: + index_status = 'D' + elif status & git.GIT_STATUS_INDEX_MODIFIED: + index_status = 'M' + else: + index_status = ' ' + + if status & git.GIT_STATUS_WT_DELETED: + wt_status = 'D' + elif status & git.GIT_STATUS_WT_MODIFIED: + wt_status = 'M' + else: + wt_status = ' ' + + return index_status + wt_status + else: + wt_column = ' ' + index_column = ' ' + untracked_column = ' ' + for status in git.Repository(directory).status().values(): + if status & git.GIT_STATUS_WT_NEW: + untracked_column = 'U' + continue + + if status & (git.GIT_STATUS_WT_DELETED | git.GIT_STATUS_WT_MODIFIED): + wt_column = 'D' + + if status & ( + git.GIT_STATUS_INDEX_NEW + | git.GIT_STATUS_INDEX_MODIFIED + | git.GIT_STATUS_INDEX_DELETED + ): + index_column = 'I' + r = wt_column + index_column + untracked_column + return r if r != ' ' else None +except ImportError: + class Repository(GitRepository): + def __init__(self, *args, **kwargs): + if not which('git'): + raise OSError('git executable is not available') + super(Repository, self).__init__(*args, **kwargs) + + @staticmethod + def ignore_event(path, name): + # Ignore changes to the index.lock file, since they happen + # frequently and dont indicate an actual change in the working tree + # status + return path.endswith('.git') and name == 'index.lock' + + def _gitcmd(self, directory, *args): + return readlines(('git',) + args, directory) + + def stash(self): + return sum(1 for _ in self._gitcmd(self.directory, 'stash', 'list')) + + def do_status(self, directory, path): + if path: + try: + return next(self._gitcmd(directory, 'status', '--porcelain', '--ignored', '--', path))[:2] + except StopIteration: + return None + else: + wt_column = ' ' + index_column = ' ' + untracked_column = ' ' + for line in self._gitcmd(directory, 'status', '--porcelain'): + if line[0] == '?': + untracked_column = 'U' + continue + elif line[0] == '!': + continue + + if line[0] != ' ': + index_column = 'I' + + if line[1] != ' ': + wt_column = 'D' + + r = wt_column + index_column + untracked_column + return r if r != ' ' else None diff --git a/powerline-bin/powerline/lib/vcs/mercurial.py b/powerline-bin/powerline/lib/vcs/mercurial.py new file mode 100644 index 0000000..09b6e0b --- /dev/null +++ b/powerline-bin/powerline/lib/vcs/mercurial.py @@ -0,0 +1,88 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +import hglib + +from powerline.lib.vcs import get_branch_name, get_file_status +from powerline.lib.path import join +from powerline.lib.encoding import get_preferred_file_contents_encoding + + +def branch_name_from_config_file(directory, config_file): + try: + with open(config_file, 'rb') as f: + raw = f.read() + return raw.decode(get_preferred_file_contents_encoding(), 'replace').strip() + except Exception: + return 'default' + + +class Repository(object): + __slots__ = ('directory', 'create_watcher') + + # hg status -> (powerline file status, repo status flag) + statuses = { + b'M': ('M', 1), b'A': ('A', 1), b'R': ('R', 1), b'!': ('D', 1), + b'?': ('U', 2), b'I': ('I', 0), b'C': ('', 0), + } + repo_statuses_str = (None, 'D ', ' U', 'DU') + + def __init__(self, directory, create_watcher): + self.directory = os.path.abspath(directory) + self.create_watcher = create_watcher + + def _repo(self, directory): + # Cannot create this object once and use always: when repository updates + # functions emit invalid results + return hglib.open(directory) + + def status(self, path=None): + '''Return status of repository or file. + + Without file argument: returns status of the repository: + + :'D?': dirty (tracked modified files: added, removed, deleted, modified), + :'?U': untracked-dirty (added, but not tracked files) + :None: clean (status is empty) + + With file argument: returns status of this file: `M`odified, `A`dded, + `R`emoved, `D`eleted (removed from filesystem, but still tracked), + `U`nknown, `I`gnored, (None)Clean. + ''' + if path: + return get_file_status( + directory=self.directory, + dirstate_file=join(self.directory, '.hg', 'dirstate'), + file_path=path, + ignore_file_name='.hgignore', + get_func=self.do_status, + create_watcher=self.create_watcher, + ) + return self.do_status(self.directory, path) + + def do_status(self, directory, path): + with self._repo(directory) as repo: + if path: + path = os.path.join(directory, path) + statuses = repo.status(include=path, all=True) + for status, paths in statuses: + if paths: + return self.statuses[status][0] + return None + else: + resulting_status = 0 + for status, paths in repo.status(all=True): + if paths: + resulting_status |= self.statuses[status][1] + return self.repo_statuses_str[resulting_status] + + def branch(self): + config_file = join(self.directory, '.hg', 'branch') + return get_branch_name( + directory=self.directory, + config_file=config_file, + get_func=branch_name_from_config_file, + create_watcher=self.create_watcher, + ) diff --git a/powerline-bin/powerline/lib/watcher/__init__.py b/powerline-bin/powerline/lib/watcher/__init__.py new file mode 100644 index 0000000..4fe9896 --- /dev/null +++ b/powerline-bin/powerline/lib/watcher/__init__.py @@ -0,0 +1,76 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys + +from powerline.lib.watcher.stat import StatFileWatcher +from powerline.lib.watcher.inotify import INotifyFileWatcher +from powerline.lib.watcher.tree import TreeWatcher +from powerline.lib.watcher.uv import UvFileWatcher, UvNotFound +from powerline.lib.inotify import INotifyError + + +def create_file_watcher(pl, watcher_type='auto', expire_time=10): + '''Create an object that can watch for changes to specified files + + Use ``.__call__()`` method of the returned object to start watching the file + or check whether file has changed since last call. + + Use ``.unwatch()`` method of the returned object to stop watching the file. + + Uses inotify if available, then pyuv, otherwise tracks mtimes. expire_time + is the number of minutes after the last query for a given path for the + inotify watch for that path to be automatically removed. This conserves + kernel resources. + + :param PowerlineLogger pl: + Logger. + :param str watcher_type + One of ``inotify`` (linux only), ``uv``, ``stat``, ``auto``. Determines + what watcher will be used. ``auto`` will use ``inotify`` if available, + then ``libuv`` and then fall back to ``stat``. + :param int expire_time: + Number of minutes since last ``.__call__()`` before inotify watcher will + stop watching given file. + ''' + if watcher_type == 'stat': + pl.debug('Using requested stat-based watcher', prefix='watcher') + return StatFileWatcher() + if watcher_type == 'inotify': + # Explicitly selected inotify watcher: do not catch INotifyError then. + pl.debug('Using requested inotify watcher', prefix='watcher') + return INotifyFileWatcher(expire_time=expire_time) + elif watcher_type == 'uv': + pl.debug('Using requested uv watcher', prefix='watcher') + return UvFileWatcher() + + if sys.platform.startswith('linux'): + try: + pl.debug('Trying to use inotify watcher', prefix='watcher') + return INotifyFileWatcher(expire_time=expire_time) + except INotifyError: + pl.info('Failed to create inotify watcher', prefix='watcher') + + try: + pl.debug('Using libuv-based watcher') + return UvFileWatcher() + except UvNotFound: + pl.debug('Failed to import pyuv') + + pl.debug('Using stat-based watcher') + return StatFileWatcher() + + +def create_tree_watcher(pl, watcher_type='auto', expire_time=10): + '''Create an object that can watch for changes in specified directories + + :param PowerlineLogger pl: + Logger. + :param str watcher_type: + Watcher type. Currently the only supported types are ``inotify`` (linux + only), ``uv``, ``dummy`` and ``auto``. + :param int expire_time: + Number of minutes since last ``.__call__()`` before inotify watcher will + stop watching given file. + ''' + return TreeWatcher(pl, watcher_type, expire_time) diff --git a/powerline-bin/powerline/lib/watcher/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/lib/watcher/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f4996c08eb8967810963fde38f04718ec260eb9 GIT binary patch literal 3501 zcmd57&-6`ox#DejVzWjS$V$&RPC>WGL;1#TQWM&PDa;=+L86tIlIyeya8p*Yt5 zb#|5%1sx=yfDdT_-<)HQF`R>sJtw{O5XKf#V=E&8lA;LEgHZcWxR<^e?vkP`6$x@F z0qyS0y!qbuerNQT(NP1zZ}f}5HU0@---lkjKQjp&{r|6DWM%}T>m>iEd2i)<>ID8v+ z{&z~{AiQ;WPju8$;d?=$q{ZWrN9(>#Oowv9EGLZfHf_<6`d)m%s)fE2abi+8@EMQC z0!BStCj(?(~<>^&teEHcs;QsdDZtsU#J zaiayBF8h&Z141!Dc%Lz!)ia5=#48JbV*Ki`o+(e$1?%&7q0|V*3VqY4!{s1Ylz=*{Owmj_D zZjn02ylHVD$C+=3Yv~n9&m^}$@zy;@Pii_BxoU~o-AZc8`x@D)Uj#~nG-}k9CV`A9QFmfHU;ZB zv+Bzsb~$xPSjJ=}pp2Me1olvH8~DJB+!`1I9&xD$Z6(B31DcLplcxMOBCI35ZQ&)_ z5^5~obHCURKnbBiSY)K66a=OQF^stHTAT{6binJb-y(JyFE)Wg-Sq>8utL5w@p`cq$qxi#O*m)u#0@}Sf&f8Mgd7S-%$}}U;DgjL@kjy- zM@BASq(N8Wk;M0_$9L}^${l%76?SB4tVXTXsoi^`R$o_EMsoGoBJ0R%^+h;#+qa4@ zLzw_W@M*o*RCcLdJ<`)5<1uW`>dS-8y#rTP+3I9($BXutj5uqPTC~JOQ)c4qUyNXmZ|skd};`Ou*(%lX{e!W;y7@hkEWXMUc%z zfE@=Nf>1aCoqio{mr?fMoy!lksmH2zdv;^CTbTcozCOFDUfR+pAL&zFb?UJ;e&@c-W- zYSUk8(;xqOQ=8dVwal-S$C>Qy^Bd>8#n&HPSwFv-xwvH<{bYL6INQyf-Og+3OrO`O zP4%@D?cdJ|$T<8jq$CLEHqLbmrytPub6;iN-Oh;V|2!)q{Sb)kfH?7$dJZ#P37lX`Bxt0k93tI;SBiZGyT;C4SiOcS~!J1*N!fn%zS=A5zkXo?`1N7 zRuy>G`_~%S(7z%bg~46K`-kWnTy@se`-$vzR8p)pSo|@EAN6(|el~RYI`gj-E{-{iQpXJ}&-o`BDB%S2^<( zrcp_aHE}+CFYb?}L$P7PbserA#59?RJk!KOTZRMEWnI C@7>=3 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/watcher/__pycache__/inotify.cpython-312.pyc b/powerline-bin/powerline/lib/watcher/__pycache__/inotify.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..248988fa99ff9e04cb6ab8cccf756f9aca6fc854 GIT binary patch literal 14132 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/watcher/__pycache__/uv.cpython-312.pyc b/powerline-bin/powerline/lib/watcher/__pycache__/uv.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d2c1df60641d8ec5a56987cd558872fc229c80b GIT binary patch literal 12021 zcmb_idvFuidfz>}D`_S9AzS!uVr=nHVr-I_X9$TMICo_=dwh2SqNvECZW7?U*zny6jG9!2E%;e6!ciP*(9NUSh??3&% zv)a`I0qN~M;G?tWwY%T*_kCyorKH5kK`HsS{}}kLg5!RU7iN(%jTMpSxLHo&6h6ug z@%{V|=_f-%zc3{B!w~e7sMIgPuMo8j+57FRPmDT-g6M`NGPs^1JQ^UropJHJCw-jh#HB<^s?Y_H69(&!hy)paGYv-=`fANw7|ef zETqANUO%t9l<+`sB&sQqkOr618%N@yQ_!#v2dNebMxklzJ4wSq1zQJuj~?vpgO&q& zqQgP$B($4Ogtfph4G)AV4J(0xNHiRX1&6|ca15R-5<3yfu#f!!2U%Hh!_O=i=K6Vs z>nEeUpXkmvPxr>Pp7=;i>Gcb`BVg-jRU$n5cttZFv{)_xXG>HZtE|# zYeU2B!;#_bT9Cr?Y~Qu>$*rBQB_YvDAcDJwpXg79ml=Jf^s40l#| zhdaaj#a>+;9vwLyGC6^BMEH9i{#KrY>M+N{OO12y15wWLnl*3SdYwPwXL+8x;t}Dt ze<7UVZ}KQh0tgpyk+kj5`H)Irr=}*l0e;ry{U^e)@Y!K{U~HoyivfIuw*Ap~2xRs^ zn>D@(rmINw|Kc7bxO1ODu zfj{+as1n?_Hcl>CB9d@~UvzqB-by(e5*@1!uBH(l^v{)a+ks@;fplAUvaS1{kEPlU z%{RWDsy>_)yh|mp@WHB$b8cAXc)`0USKbvWmjr08t1j4k($y()x5e^KuaGBmNKY&) zd!V|MqdE%TFHCX+Jjj)!UsMDzGLj-fZDYL>^x7x6vwXkf80WX?jyF#m3f&hnx5RCc zv`nNgK;sX2;6Fdk1#pBF&6+!C39>oHvAM+r`Br8X?1cNXqA@#<&8)bNb00m$Sz^tD zRMA?P;CJYD;94{uA2ygRb*iJWkS+&;_!|fv*WE_zWH6=x=OuMy7_87%Sc}#p5{qbo z09X=H4Mzub5jTRxflxH4s)2xt@7vUrU@}VE;9|^U5~s~vjeDs$2I9Ej*^uyEY+bCX zn;pD5c*A=``~3W;=TlX?625s-xk&6+95cQoX}V9EnHc2}7)ikh9EAp|*C6~BmO-3R zP)u#-ag9aB?4&_^wr#euYfMs#)DMF|2@QzZicKjLjjLflq3w8OGf0@Lw)7bo7^}#V z#H2bdSA9?cNr>%I>qKjsR3=H~JlO!(MmtSvlce@OsW&KL84*}zQ356TH=~64R>XKK zfsVv(^6W)aypv&e=x%6^xvl4iNjsoN1$dGBl*epA0lB8yy)Gf-TSI*9PlX6Q+-h7vAX0Pp+Df&I?!3xQv+mv8~>4!Q_Au zlj804l8gq0!qI3T0CZ-+}P$kqE_V6epDw^~M;7y&SiKDGJlU{j zBV@}G2Nin^wk8DAtzxm@8g%74+QjpZw@4;&&vBZi9^;(lFmoMn5oc?z1{Z2Q%AjSp ztS-)EoekU&7%GhcCBsySN6=~^CBP~HDAAat`gzJkFe{{b85_-6-VJMz&T0o#3GNqS z>0PmEQ7)OTovOWDpYSb~RnLi+&nKQ76IuMMp*2QI~Yo-R0{HNwy3&?1D1L zB>DHC0c6D6vyvqV5DI5xdb3h%nsDj?>tm79oQbC2BHAVG5mj9RqUEOE>kwOp=N zV!l+)sKpfxm6#QUKLtjMRshdXoeK)w&l2WQ^eR;a6W}s`j-T}U$*=GgD88@X&G3+J zH$b#X9ngvXHFSz1!9_iN8l_)|B!3XnTrO0 zlwpJAqkn+&jzR@8LP{=fU+`2iKV4dR`2;lli=~aJ(x;48TdH&iYe`jeTkc6s3)S`M z>egg+Yog=6;Qc!9>S0B~_hgE62O7EdXfRjZU<^x9q{J1)Ng3fdN5)Ap@ITHgyyh}? zMb-?Wb`=y*#LP38@go2R0&}e(AiH3k-wzj~9I(~kX9i4@0ads696NYA9McRQz5??o ziX>Ql3YtrmK$wmG4)pm2=5pyFoU{|F45G@o-#4IVtS*OLIowA6|1Pe;8vxr}Wz)N- zc2B=F_0n9&^}QeOO}REFwk!|_f{RIQ=7*oyZ;0up=aNm&ec7F=**j16EmSuqe8%uS z(|hMK!D5w>G{`aJxwGKzSiV22#`&y<0&y)pGWNkb%ZMl3vj`KPu%ZYn$3XjUiN@XG zc`OT%`#c7-4M;6B_e9@Y;W$l14u?H}|OJSJS8+6LUO)G(fAMXNDe3K{3e;KF?J3;YFmk8|WaIb&rMTDWJy zN}nM-_YP1B-z}4A5DeooR^J~e z6s08-@{SPG#D z3PY;8#GKJsS=LAy9u1bOpFsr@D|=>qbK-URV>u-^CwvQb*QL>k(Qi0ea4*=LGrrl@ ztF1}f#wB8x+zXPNma39c)r>YTHLTfT&Js?10GR=I`SiZ2eQ8&7($&1oNif-6GTk%P zGxO}!p+w(;!+lMhbzXI*%YDgm-#v$K(Or41=WfH^zw1smyqt1(-nDgpZFBv4$puT- z*JN|+bq0<;E9-hr_-jvR3AtU;*wrrGe!7$EdRn^kv;-G-+65TB^PJT6f;}%JwbEF= z-=eB8b+AGmpkbywUPaCk8S}S!O7a02wBU}p3uFy2RmTdbT@gjdnqL!`7OESlkqd>j z@P4D5nItO|=_@^kNSh|~FxFNECq6t3sZl0dkPyxD zn*%T>&u>D`BW8#tWFy`-5NBJai{j)2RF4r%QE)90L3AyE#2uMBl6E&F-3@bnDR=Y4 z!8Hj-ot)sf^vuLFS5C|*>8jRbRqGc@s`UB$q~pP=#JMUVF$K#-=bDVOIjn5Zv%Y3G zuh&&D8Qf=lmreN7`p$N8yIt-Qq}zM2;|}4WeMb<#3PTe z%%)X(gl*#nO!0r~eRt9TD%4|@Uzv%cVK2bn?DV&>R}ESGY+{{Yt@CW0W` zG#R|mvFNOr>6r6gul=|-n)&SXBFAts@>o!@)8a<;=^!MGDIx}rGwaC+No(YavV-enEsm1 zgNXwo9?J9-;X&4W*aHD23@H#y8=8um>G}XBs^d^4xFzBc_CWSy+CSw_bSya_|N9Lm zh^(vi!`6k$>e>BQ_opkjCM&n5D*Y4hCi*6KE=bNx?@qjXt$NOzu5C}&wtwkOd3Mc9 zyO%&g%cff|x2_4W#~N-quwy>iv931416*)-@!U*jedkW$_D-qu zfc*|Hca;ct+&t91erG}E$H@2~bZ5AZy*53CmqS?n2rEcl<>bjJhF`2Y0u7dVy2vdP znQULK63E77r;UiqvpltUiJvH6QFC*QCJ>rA;uY=EE*Sy=IaA47PDE+ zL5n=uyA+F$Fk+#vWt0EKknW%-yNB7z;%U_nZ&M80;;~IZ$*vl-@NIUAY1@h;^x_uB zuqkfCrksYobXySIJ0xxK21aD{E_Rc+%0gpc`&r<=YCzkQI0=o9-xGFICN&7J(n5Vw zsGsYZ7g`o+_$qN{{OBd7(0nHvlMIYM*GwDBwP6d^jg$ zDcTY&`K<+*VD%DIENz)N4q>hUtIIfm zMgopQRtX`^%MOY7mP>iE@jIJL$_$T)GxIzmT5&8ZT~OtEL_GOb9GSCU`AJD^<|Ccp zBW3iFeKc(P$exgS2fPdFCi5Hr2#xRSB*)2FUIpxhDfQyn>_>^9i3(vADiSM@b>IS) z+XVqF<_(G_L9?C-lAA(rUbKr_SHj;4zTqrLHDo_~7?y!EP=t88hz2(|wYBcp9}Ny2 zSAqw|w&jt`a?UxQFl1(;OJRFV7#OJ!4%fCrAH9GTI(pq5IRR%J@PQ1=q#nlp*RkJz zJg9~tIifq@YnRACB&_IVED{V@850wiPU50VSUn4snbk<-9A$$VMZ{!oH}^g$(R(1I7>=A1K|o}9E$N08mjrn9RVBeQ8 zMcoG#7_s`s>$^YR{nI^PbbsmlTmN7AQ!V>b^)DiVZ%*2(6Ut=w%w{lA84ulkU)b~w z*s&sC7FZhF0~^nBEFuKVS6K2)I_4iuq|HG>q-fkk4D=s@oy^Y!?C}1DT0%d931gdz zy?7ou{|2V9@Bm{XL2#J%_r!gn>cOI1UJ$$>g1F%Ea@XW0;X2WydrC2h#7=V7l3a7bW_7~wbOX%`&wD+VtK4Lxn@&5~+Bc?!0TTt=^@CkP)3gxr3 zJ!gBu`eH7_W?BS>de9LUlyPeYf=lBcc!@qZ?_{=i3g+ja{C>PdsLxD_;X|Z|3Myhm z%y^1V(JBBy!jEj&42qc{I*yeE?R9xz1h5ZNERTu5|Wd=a2MWS8w%?dkGO$?{DR)&&aV}!1IpxM{=q27+ zbU3H&Q}*eSsgjwdcZts2D<|R8PZ(4G3atnM0=gb7HxmslD7~07H zOJJbD=WnLo0mOl$2jo=`d}aW^5K3T*6B@TCQS+@Rkh zRxX@gVSQKI1|QqDu`f5!cI#F71Lo(z?7INH62A0>4=|(QAvkLeD@M{BQ~QQ~wP0&A zR$H;^#Ht%BL`%9YetZxf*~mO0UN*oL+8l!bXgvVD86OQFpnn3F$aD24P(f~t=l_%I zOL2Wa=j2~ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lib/watcher/inotify.py b/powerline-bin/powerline/lib/watcher/inotify.py new file mode 100644 index 0000000..4a134e8 --- /dev/null +++ b/powerline-bin/powerline/lib/watcher/inotify.py @@ -0,0 +1,268 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import errno +import os +import ctypes + +from threading import RLock + +from powerline.lib.inotify import INotify +from powerline.lib.monotonic import monotonic +from powerline.lib.path import realpath + + +class INotifyFileWatcher(INotify): + def __init__(self, expire_time=10): + super(INotifyFileWatcher, self).__init__() + self.watches = {} + self.modified = {} + self.last_query = {} + self.lock = RLock() + self.expire_time = expire_time * 60 + + def expire_watches(self): + now = monotonic() + for path, last_query in tuple(self.last_query.items()): + if last_query - now > self.expire_time: + self.unwatch(path) + + def process_event(self, wd, mask, cookie, name): + if wd == -1 and (mask & self.Q_OVERFLOW): + # We missed some INOTIFY events, so we dont + # know the state of any tracked files. + for path in tuple(self.modified): + if os.path.exists(path): + self.modified[path] = True + else: + self.watches.pop(path, None) + self.modified.pop(path, None) + self.last_query.pop(path, None) + return + + for path, num in tuple(self.watches.items()): + if num == wd: + if mask & self.IGNORED: + self.watches.pop(path, None) + self.modified.pop(path, None) + self.last_query.pop(path, None) + else: + if mask & self.ATTRIB: + # The watched file could have had its inode changed, in + # which case we will not get any more events for this + # file, so re-register the watch. For example by some + # other file being renamed as this file. + try: + self.unwatch(path) + except OSError: + pass + try: + self.watch(path) + except OSError as e: + if getattr(e, 'errno', None) != errno.ENOENT: + raise + else: + self.modified[path] = True + else: + self.modified[path] = True + + def unwatch(self, path): + ''' Remove the watch for path. Raises an OSError if removing the watch + fails for some reason. ''' + path = realpath(path) + with self.lock: + self.modified.pop(path, None) + self.last_query.pop(path, None) + wd = self.watches.pop(path, None) + if wd is not None: + if self._rm_watch(self._inotify_fd, wd) != 0: + self.handle_error() + + def watch(self, path): + ''' Register a watch for the file/directory named path. Raises an OSError if path + does not exist. ''' + path = realpath(path) + with self.lock: + if path not in self.watches: + bpath = path if isinstance(path, bytes) else path.encode(self.fenc) + flags = self.MOVE_SELF | self.DELETE_SELF + buf = ctypes.c_char_p(bpath) + # Try watching path as a directory + wd = self._add_watch(self._inotify_fd, buf, flags | self.ONLYDIR) + if wd == -1: + eno = ctypes.get_errno() + if eno != errno.ENOTDIR: + self.handle_error() + # Try watching path as a file + flags |= (self.MODIFY | self.ATTRIB) + wd = self._add_watch(self._inotify_fd, buf, flags) + if wd == -1: + self.handle_error() + self.watches[path] = wd + self.modified[path] = False + + def is_watching(self, path): + with self.lock: + return realpath(path) in self.watches + + def __call__(self, path): + ''' Return True if path has been modified since the last call. Can + raise OSError if the path does not exist. ''' + path = realpath(path) + with self.lock: + self.last_query[path] = monotonic() + self.expire_watches() + if path not in self.watches: + # Try to re-add the watch, it will fail if the file does not + # exist/you dont have permission + self.watch(path) + return True + self.read(get_name=False) + if path not in self.modified: + # An ignored event was received which means the path has been + # automatically unwatched + return True + ans = self.modified[path] + if ans: + self.modified[path] = False + return ans + + def close(self): + with self.lock: + for path in tuple(self.watches): + try: + self.unwatch(path) + except OSError: + pass + super(INotifyFileWatcher, self).close() + + +class NoSuchDir(ValueError): + pass + + +class BaseDirChanged(ValueError): + pass + + +class DirTooLarge(ValueError): + def __init__(self, bdir): + ValueError.__init__(self, 'The directory {0} is too large to monitor. Try increasing the value in /proc/sys/fs/inotify/max_user_watches'.format(bdir)) + + +class INotifyTreeWatcher(INotify): + is_dummy = False + + def __init__(self, basedir, ignore_event=None): + super(INotifyTreeWatcher, self).__init__() + self.basedir = realpath(basedir) + self.watch_tree() + self.modified = True + self.ignore_event = (lambda path, name: False) if ignore_event is None else ignore_event + + def watch_tree(self): + self.watched_dirs = {} + self.watched_rmap = {} + try: + self.add_watches(self.basedir) + except OSError as e: + if e.errno == errno.ENOSPC: + raise DirTooLarge(self.basedir) + + def add_watches(self, base, top_level=True): + ''' Add watches for this directory and all its descendant directories, + recursively. ''' + base = realpath(base) + # There may exist a link which leads to an endless + # add_watches loop or to maximum recursion depth exceeded + if not top_level and base in self.watched_dirs: + return + try: + is_dir = self.add_watch(base) + except OSError as e: + if e.errno == errno.ENOENT: + # The entry could have been deleted between listdir() and + # add_watch(). + if top_level: + raise NoSuchDir('The dir {0} does not exist'.format(base)) + return + if e.errno == errno.EACCES: + # We silently ignore entries for which we dont have permission, + # unless they are the top level dir + if top_level: + raise NoSuchDir('You do not have permission to monitor {0}'.format(base)) + return + raise + else: + if is_dir: + try: + files = os.listdir(base) + except OSError as e: + if e.errno in (errno.ENOTDIR, errno.ENOENT): + # The dir was deleted/replaced between the add_watch() + # and listdir() + if top_level: + raise NoSuchDir('The dir {0} does not exist'.format(base)) + return + raise + for x in files: + self.add_watches(os.path.join(base, x), top_level=False) + elif top_level: + # The top level dir is a file, not good. + raise NoSuchDir('The dir {0} does not exist'.format(base)) + + def add_watch(self, path): + bpath = path if isinstance(path, bytes) else path.encode(self.fenc) + wd = self._add_watch( + self._inotify_fd, + ctypes.c_char_p(bpath), + + # Ignore symlinks and watch only directories + self.DONT_FOLLOW | self.ONLYDIR | + + self.MODIFY | self.CREATE | self.DELETE | + self.MOVE_SELF | self.MOVED_FROM | self.MOVED_TO | + self.ATTRIB | self.DELETE_SELF + ) + if wd == -1: + eno = ctypes.get_errno() + if eno == errno.ENOTDIR: + return False + raise OSError(eno, 'Failed to add watch for: {0}: {1}'.format(path, self.os.strerror(eno))) + self.watched_dirs[path] = wd + self.watched_rmap[wd] = path + return True + + def process_event(self, wd, mask, cookie, name): + if wd == -1 and (mask & self.Q_OVERFLOW): + # We missed some INOTIFY events, so we dont + # know the state of any tracked dirs. + self.watch_tree() + self.modified = True + return + path = self.watched_rmap.get(wd, None) + if path is not None: + if not self.ignore_event(path, name): + self.modified = True + if mask & self.CREATE: + # A new sub-directory might have been created, monitor it. + try: + if not isinstance(path, bytes): + name = name.decode(self.fenc) + self.add_watch(os.path.join(path, name)) + except OSError as e: + if e.errno == errno.ENOENT: + # Deleted before add_watch() + pass + elif e.errno == errno.ENOSPC: + raise DirTooLarge(self.basedir) + else: + raise + if (mask & self.DELETE_SELF or mask & self.MOVE_SELF) and path == self.basedir: + raise BaseDirChanged('The directory %s was moved/deleted' % path) + + def __call__(self): + self.read() + ret = self.modified + self.modified = False + return ret diff --git a/powerline-bin/powerline/lib/watcher/stat.py b/powerline-bin/powerline/lib/watcher/stat.py new file mode 100644 index 0000000..0c08971 --- /dev/null +++ b/powerline-bin/powerline/lib/watcher/stat.py @@ -0,0 +1,44 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from threading import RLock + +from powerline.lib.path import realpath + + +class StatFileWatcher(object): + def __init__(self): + self.watches = {} + self.lock = RLock() + + def watch(self, path): + path = realpath(path) + with self.lock: + self.watches[path] = os.path.getmtime(path) + + def unwatch(self, path): + path = realpath(path) + with self.lock: + self.watches.pop(path, None) + + def is_watching(self, path): + with self.lock: + return realpath(path) in self.watches + + def __call__(self, path): + path = realpath(path) + with self.lock: + if path not in self.watches: + self.watches[path] = os.path.getmtime(path) + return True + mtime = os.path.getmtime(path) + if mtime != self.watches[path]: + self.watches[path] = mtime + return True + return False + + def close(self): + with self.lock: + self.watches.clear() diff --git a/powerline-bin/powerline/lib/watcher/tree.py b/powerline-bin/powerline/lib/watcher/tree.py new file mode 100644 index 0000000..7d2b83f --- /dev/null +++ b/powerline-bin/powerline/lib/watcher/tree.py @@ -0,0 +1,90 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys + +from powerline.lib.monotonic import monotonic +from powerline.lib.inotify import INotifyError +from powerline.lib.path import realpath +from powerline.lib.watcher.inotify import INotifyTreeWatcher, DirTooLarge, NoSuchDir, BaseDirChanged +from powerline.lib.watcher.uv import UvTreeWatcher, UvNotFound + + +class DummyTreeWatcher(object): + is_dummy = True + + def __init__(self, basedir): + self.basedir = realpath(basedir) + + def __call__(self): + return False + + +class TreeWatcher(object): + def __init__(self, pl, watcher_type, expire_time): + self.watches = {} + self.last_query_times = {} + self.expire_time = expire_time * 60 + self.pl = pl + self.watcher_type = watcher_type + + def get_watcher(self, path, ignore_event): + if self.watcher_type == 'inotify': + return INotifyTreeWatcher(path, ignore_event=ignore_event) + if self.watcher_type == 'uv': + return UvTreeWatcher(path, ignore_event=ignore_event) + if self.watcher_type == 'dummy': + return DummyTreeWatcher(path) + # FIXME + if self.watcher_type == 'stat': + return DummyTreeWatcher(path) + if self.watcher_type == 'auto': + if sys.platform.startswith('linux'): + try: + return INotifyTreeWatcher(path, ignore_event=ignore_event) + except (INotifyError, DirTooLarge) as e: + if not isinstance(e, INotifyError): + self.pl.warn('Failed to watch path: {0} with error: {1}'.format(path, e)) + try: + return UvTreeWatcher(path, ignore_event=ignore_event) + except UvNotFound: + pass + return DummyTreeWatcher(path) + else: + raise ValueError('Unknown watcher type: {0}'.format(self.watcher_type)) + + def watch(self, path, ignore_event=None): + path = realpath(path) + w = self.get_watcher(path, ignore_event) + self.watches[path] = w + return w + + def expire_old_queries(self): + pop = [] + now = monotonic() + for path, lt in self.last_query_times.items(): + if now - lt > self.expire_time: + pop.append(path) + for path in pop: + del self.last_query_times[path] + + def __call__(self, path, ignore_event=None): + path = realpath(path) + self.expire_old_queries() + self.last_query_times[path] = monotonic() + w = self.watches.get(path, None) + if w is None: + try: + self.watch(path, ignore_event=ignore_event) + except NoSuchDir: + pass + return True + try: + return w() + except BaseDirChanged: + self.watches.pop(path, None) + return True + except DirTooLarge as e: + self.pl.warn(str(e)) + self.watches[path] = DummyTreeWatcher(path) + return False diff --git a/powerline-bin/powerline/lib/watcher/uv.py b/powerline-bin/powerline/lib/watcher/uv.py new file mode 100644 index 0000000..272db0f --- /dev/null +++ b/powerline-bin/powerline/lib/watcher/uv.py @@ -0,0 +1,207 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from collections import defaultdict +from threading import RLock +from functools import partial +from threading import Thread +from errno import ENOENT + +from powerline.lib.path import realpath +from powerline.lib.encoding import get_preferred_file_name_encoding + + +class UvNotFound(NotImplementedError): + pass + + +pyuv = None +pyuv_version_info = None + + +def import_pyuv(): + global pyuv + global pyuv_version_info + if not pyuv: + try: + pyuv = __import__('pyuv') + except ImportError: + raise UvNotFound + else: + pyuv_version_info = tuple((int(c) for c in pyuv.__version__.split('.'))) + + +class UvThread(Thread): + daemon = True + + def __init__(self, loop): + self.uv_loop = loop + self.async_handle = pyuv.Async(loop, self._async_cb) + super(UvThread, self).__init__() + + def _async_cb(self, handle): + self.uv_loop.stop() + self.async_handle.close() + + def run(self): + self.uv_loop.run() + + def join(self): + self.async_handle.send() + return super(UvThread, self).join() + + +_uv_thread = None + + +def start_uv_thread(): + global _uv_thread + if _uv_thread is None: + loop = pyuv.Loop() + _uv_thread = UvThread(loop) + _uv_thread.start() + return _uv_thread.uv_loop + + +def normpath(path, fenc): + path = realpath(path) + if isinstance(path, bytes): + return path.decode(fenc) + else: + return path + + +class UvWatcher(object): + def __init__(self): + import_pyuv() + self.watches = {} + self.lock = RLock() + self.loop = start_uv_thread() + self.fenc = get_preferred_file_name_encoding() + if pyuv_version_info >= (1, 0): + self._start_watch = self._start_watch_1_x + else: + self._start_watch = self._start_watch_0_x + + def _start_watch_1_x(self, path): + handle = pyuv.fs.FSEvent(self.loop) + handle.start(path, 0, partial(self._record_event, path)) + self.watches[path] = handle + + def _start_watch_0_x(self, path): + self.watches[path] = pyuv.fs.FSEvent( + self.loop, + path, + partial(self._record_event, path), + pyuv.fs.UV_CHANGE | pyuv.fs.UV_RENAME + ) + + def watch(self, path): + path = normpath(path, self.fenc) + with self.lock: + if path not in self.watches: + try: + self._start_watch(path) + except pyuv.error.FSEventError as e: + code = e.args[0] + if code == pyuv.errno.UV_ENOENT: + raise OSError(ENOENT, 'No such file or directory: ' + path) + else: + raise + + def unwatch(self, path): + path = normpath(path, self.fenc) + with self.lock: + try: + watch = self.watches.pop(path) + except KeyError: + return + watch.close(partial(self._stopped_watching, path)) + + def is_watching(self, path): + with self.lock: + return normpath(path, self.fenc) in self.watches + + def __del__(self): + try: + lock = self.lock + except AttributeError: + pass + else: + with lock: + while self.watches: + path, watch = self.watches.popitem() + watch.close(partial(self._stopped_watching, path)) + + +class UvFileWatcher(UvWatcher): + def __init__(self): + super(UvFileWatcher, self).__init__() + self.events = defaultdict(list) + + def _record_event(self, path, fsevent_handle, filename, events, error): + with self.lock: + self.events[path].append(events) + if events | pyuv.fs.UV_RENAME: + if not os.path.exists(path): + self.watches.pop(path).close() + + def _stopped_watching(self, path, *args): + self.events.pop(path, None) + + def __call__(self, path): + path = normpath(path, self.fenc) + with self.lock: + events = self.events.pop(path, None) + if events: + return True + if path not in self.watches: + self.watch(path) + return True + return False + + +class UvTreeWatcher(UvWatcher): + is_dummy = False + + def __init__(self, basedir, ignore_event=None): + super(UvTreeWatcher, self).__init__() + self.ignore_event = ignore_event or (lambda path, name: False) + self.basedir = normpath(basedir, self.fenc) + self.modified = True + self.watch_directory(self.basedir) + + def watch_directory(self, path): + for root, dirs, files in os.walk(normpath(path, self.fenc)): + self.watch_one_directory(root) + + def watch_one_directory(self, dirname): + try: + self.watch(dirname) + except OSError: + pass + + def _stopped_watching(self, path, *args): + pass + + def _record_event(self, path, fsevent_handle, filename, events, error): + if not self.ignore_event(path, filename): + self.modified = True + if events == pyuv.fs.UV_CHANGE | pyuv.fs.UV_RENAME: + # Stat changes to watched directory are UV_CHANGE|UV_RENAME. It + # is weird. + pass + elif events | pyuv.fs.UV_RENAME: + if not os.path.isdir(path): + self.unwatch(path) + else: + full_name = os.path.join(path, filename) + if os.path.isdir(full_name): + # For some reason mkdir and rmdir both fall into this + # category + self.watch_directory(full_name) + + def __call__(self): + return self.__dict__.pop('modified', False) diff --git a/powerline-bin/powerline/lint/__init__.py b/powerline-bin/powerline/lint/__init__.py new file mode 100644 index 0000000..8c68271 --- /dev/null +++ b/powerline-bin/powerline/lint/__init__.py @@ -0,0 +1,625 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import logging + +from collections import defaultdict +from itertools import chain +from functools import partial + +from powerline import generate_config_finder, get_config_paths, load_config +from powerline.segments.vim import vim_modes +from powerline.lib.dict import mergedicts_copy +from powerline.lib.config import ConfigLoader +from powerline.lib.unicode import unicode +from powerline.lib.path import join +from powerline.lint.markedjson import load +from powerline.lint.markedjson.error import echoerr, EchoErr, MarkedError +from powerline.lint.checks import (check_matcher_func, check_ext, check_config, check_top_theme, + check_color, check_translated_group_name, check_group, + check_segment_module, check_exinclude_function, type_keys, + check_segment_function, check_args, get_one_segment_function, + check_highlight_groups, check_highlight_group, check_full_segment_data, + get_all_possible_functions, check_segment_data_key, register_common_name, + highlight_group_spec, check_log_file_level, check_logging_handler) +from powerline.lint.spec import Spec +from powerline.lint.context import Context + + +def open_file(path): + return open(path, 'rb') + + +def generate_json_config_loader(lhadproblem): + def load_json_config(config_file_path, load=load, open_file=open_file): + with open_file(config_file_path) as config_file_fp: + r, hadproblem = load(config_file_fp) + if hadproblem: + lhadproblem[0] = True + return r + return load_json_config + + +function_name_re = '^(\w+\.)*[a-zA-Z_]\w*$' + + +divider_spec = Spec().printable().len( + 'le', 3, (lambda value: 'Divider {0!r} is too large!'.format(value))).copy +ext_theme_spec = Spec().type(unicode).func(lambda *args: check_config('themes', *args)).copy +top_theme_spec = Spec().type(unicode).func(check_top_theme).copy +ext_spec = Spec( + colorscheme=Spec().type(unicode).func( + (lambda *args: check_config('colorschemes', *args)) + ), + theme=ext_theme_spec(), + top_theme=top_theme_spec().optional(), +).copy +gen_components_spec = (lambda *components: Spec().list(Spec().type(unicode).oneof(set(components)))) +log_level_spec = Spec().re('^[A-Z]+$').func( + (lambda value, *args: (True, True, not hasattr(logging, value))), + (lambda value: 'unknown debugging level {0}'.format(value)) +).copy +log_format_spec = Spec().type(unicode).copy +main_spec = (Spec( + common=Spec( + default_top_theme=top_theme_spec().optional(), + term_truecolor=Spec().type(bool).optional(), + term_escape_style=Spec().type(unicode).oneof(set(('auto', 'xterm', 'fbterm'))).optional(), + # Python is capable of loading from zip archives. Thus checking path + # only for existence of the path, not for it being a directory + paths=Spec().list( + (lambda value, *args: (True, True, not os.path.exists(os.path.expanduser(value.value)))), + (lambda value: 'path does not exist: {0}'.format(value)) + ).optional(), + log_file=Spec().either( + Spec().type(unicode).func( + ( + lambda value, *args: ( + True, + True, + not os.path.isdir(os.path.dirname(os.path.expanduser(value))) + ) + ), + (lambda value: 'directory does not exist: {0}'.format(os.path.dirname(value))) + ), + Spec().list(Spec().either( + Spec().type(unicode, type(None)), + Spec().tuple( + Spec().re(function_name_re).func(check_logging_handler), + Spec().tuple( + Spec().type(list).optional(), + Spec().type(dict).optional(), + ), + log_level_spec().func(check_log_file_level).optional(), + log_format_spec().optional(), + ), + )) + ).optional(), + log_level=log_level_spec().optional(), + log_format=log_format_spec().optional(), + interval=Spec().either(Spec().cmp('gt', 0.0), Spec().type(type(None))).optional(), + reload_config=Spec().type(bool).optional(), + watcher=Spec().type(unicode).oneof(set(('auto', 'inotify', 'stat'))).optional(), + ).context_message('Error while loading common configuration (key {key})'), + ext=Spec( + vim=ext_spec().update( + components=gen_components_spec('statusline', 'tabline').optional(), + local_themes=Spec( + __tabline__=ext_theme_spec(), + ).unknown_spec( + Spec().re(function_name_re).func(partial(check_matcher_func, 'vim')), + ext_theme_spec() + ), + ).optional(), + ipython=ext_spec().update( + local_themes=Spec( + in2=ext_theme_spec(), + out=ext_theme_spec(), + rewrite=ext_theme_spec(), + ), + ).optional(), + shell=ext_spec().update( + components=gen_components_spec('tmux', 'prompt').optional(), + local_themes=Spec( + continuation=ext_theme_spec(), + select=ext_theme_spec(), + ), + ).optional(), + wm=ext_spec().update( + local_themes=Spec().unknown_spec( + Spec().re('^[0-9A-Za-z-]+$'), + ext_theme_spec() + ).optional(), + update_interval=Spec().cmp('gt', 0.0).optional(), + ).optional(), + ).unknown_spec( + check_ext, + ext_spec(), + ).context_message('Error while loading extensions configuration (key {key})'), +).context_message('Error while loading main configuration')) + +term_color_spec = Spec().unsigned().cmp('le', 255).copy +true_color_spec = Spec().re( + '^[0-9a-fA-F]{6}$', + (lambda value: '"{0}" is not a six-digit hexadecimal unsigned integer written as a string'.format(value)) +).copy +colors_spec = (Spec( + colors=Spec().unknown_spec( + Spec().ident(), + Spec().either( + Spec().tuple(term_color_spec(), true_color_spec()), + term_color_spec() + ) + ).context_message('Error while checking colors (key {key})'), + gradients=Spec().unknown_spec( + Spec().ident(), + Spec().tuple( + Spec().len('gt', 1).list(term_color_spec()), + Spec().len('gt', 1).list(true_color_spec()).optional(), + ) + ).context_message('Error while checking gradients (key {key})'), +).context_message('Error while loading colors configuration')) + + +color_spec = Spec().type(unicode).func(check_color).copy +name_spec = Spec().type(unicode).len('gt', 0).optional().copy +group_name_spec = Spec().ident().copy +group_spec = Spec().either(Spec( + fg=color_spec(), + bg=color_spec(), + attrs=Spec().list(Spec().type(unicode).oneof(set(('bold', 'italic', 'underline')))), +), group_name_spec().func(check_group)).copy +groups_spec = Spec().unknown_spec( + group_name_spec(), + group_spec(), +).context_message('Error while loading groups (key {key})').copy +colorscheme_spec = (Spec( + name=name_spec(), + groups=groups_spec(), +).context_message('Error while loading coloscheme')) +mode_translations_value_spec = Spec( + colors=Spec().unknown_spec( + color_spec(), + color_spec(), + ).optional(), + groups=Spec().unknown_spec( + group_name_spec().func(check_translated_group_name), + group_spec(), + ).optional(), +).copy +top_colorscheme_spec = (Spec( + name=name_spec(), + groups=groups_spec(), + mode_translations=Spec().unknown_spec( + Spec().type(unicode), + mode_translations_value_spec(), + ).optional().context_message('Error while loading mode translations (key {key})').optional(), +).context_message('Error while loading top-level coloscheme')) +vim_mode_spec = Spec().oneof(set(list(vim_modes) + ['nc', 'tab_nc', 'buf_nc'])).copy +vim_colorscheme_spec = (Spec( + name=name_spec(), + groups=groups_spec(), + mode_translations=Spec().unknown_spec( + vim_mode_spec(), + mode_translations_value_spec(), + ).optional().context_message('Error while loading mode translations (key {key})'), +).context_message('Error while loading vim colorscheme')) +shell_mode_spec = Spec().re('^(?:[\w\-]+|\.safe)$').copy +shell_colorscheme_spec = (Spec( + name=name_spec(), + groups=groups_spec(), + mode_translations=Spec().unknown_spec( + shell_mode_spec(), + mode_translations_value_spec(), + ).optional().context_message('Error while loading mode translations (key {key})'), +).context_message('Error while loading shell colorscheme')) + + +args_spec = Spec( + pl=Spec().error('pl object must be set by powerline').optional(), + segment_info=Spec().error('Segment info dictionary must be set by powerline').optional(), +).unknown_spec(Spec(), Spec()).optional().copy +segment_module_spec = Spec().type(unicode).func(check_segment_module).optional().copy +exinclude_spec = Spec().re(function_name_re).func(check_exinclude_function).copy +segment_spec_base = Spec( + name=Spec().re('^[a-zA-Z_]\w*$').optional(), + function=Spec().re(function_name_re).func(check_segment_function).optional(), + exclude_modes=Spec().list(vim_mode_spec()).optional(), + include_modes=Spec().list(vim_mode_spec()).optional(), + exclude_function=exinclude_spec().optional(), + include_function=exinclude_spec().optional(), + draw_hard_divider=Spec().type(bool).optional(), + draw_soft_divider=Spec().type(bool).optional(), + draw_inner_divider=Spec().type(bool).optional(), + display=Spec().type(bool).optional(), + module=segment_module_spec(), + priority=Spec().type(int, float, type(None)).optional(), + after=Spec().printable().optional(), + before=Spec().printable().optional(), + width=Spec().either(Spec().unsigned(), Spec().cmp('eq', 'auto')).optional(), + align=Spec().oneof(set('lr')).optional(), + args=args_spec().func(lambda *args, **kwargs: check_args(get_one_segment_function, *args, **kwargs)), + contents=Spec().printable().optional(), + highlight_groups=Spec().list( + highlight_group_spec().re( + '^(?:(?!:divider$).)+$', + (lambda value: 'it is recommended that only divider highlight group names end with ":divider"') + ) + ).func(check_highlight_groups).optional(), + divider_highlight_group=highlight_group_spec().func(check_highlight_group).re( + ':divider$', + (lambda value: 'it is recommended that divider highlight group names end with ":divider"') + ).optional(), +).func(check_full_segment_data).copy +subsegment_spec = segment_spec_base().update( + type=Spec().oneof(set((key for key in type_keys if key != 'segment_list'))).optional(), +) +segment_spec = segment_spec_base().update( + type=Spec().oneof(type_keys).optional(), + segments=Spec().optional().list(subsegment_spec), +) +segments_spec = Spec().optional().list(segment_spec).copy +segdict_spec = Spec( + left=segments_spec().context_message('Error while loading segments from left side (key {key})'), + right=segments_spec().context_message('Error while loading segments from right side (key {key})'), +).func( + (lambda value, *args: (True, True, not (('left' in value) or ('right' in value)))), + (lambda value: 'segments dictionary must contain either left, right or both keys') +).context_message('Error while loading segments (key {key})').copy +divside_spec = Spec( + hard=divider_spec(), + soft=divider_spec(), +).copy +segment_data_value_spec = Spec( + after=Spec().printable().optional(), + before=Spec().printable().optional(), + display=Spec().type(bool).optional(), + args=args_spec().func(lambda *args, **kwargs: check_args(get_all_possible_functions, *args, **kwargs)), + contents=Spec().printable().optional(), +).copy +dividers_spec = Spec( + left=divside_spec(), + right=divside_spec(), +).copy +spaces_spec = Spec().unsigned().cmp( + 'le', 2, (lambda value: 'Are you sure you need such a big ({0}) number of spaces?'.format(value)) +).copy +common_theme_spec = Spec( + default_module=segment_module_spec().optional(), + cursor_space=Spec().type(int, float).cmp('le', 100).cmp('gt', 0).optional(), + cursor_columns=Spec().type(int).cmp('gt', 0).optional(), +).context_message('Error while loading theme').copy +top_theme_spec = common_theme_spec().update( + dividers=dividers_spec(), + spaces=spaces_spec(), + use_non_breaking_spaces=Spec().type(bool).optional(), + segment_data=Spec().unknown_spec( + Spec().func(check_segment_data_key), + segment_data_value_spec(), + ).optional().context_message('Error while loading segment data (key {key})'), +) +main_theme_spec = common_theme_spec().update( + dividers=dividers_spec().optional(), + spaces=spaces_spec().optional(), + segment_data=Spec().unknown_spec( + Spec().func(check_segment_data_key), + segment_data_value_spec(), + ).optional().context_message('Error while loading segment data (key {key})'), +) +theme_spec = common_theme_spec().update( + dividers=dividers_spec().optional(), + spaces=spaces_spec().optional(), + segment_data=Spec().unknown_spec( + Spec().func(check_segment_data_key), + segment_data_value_spec(), + ).optional().context_message('Error while loading segment data (key {key})'), + segments=segdict_spec().update(above=Spec().list(segdict_spec()).optional()), +) + + +def register_common_names(): + register_common_name('player', 'powerline.segments.common.players', '_player') + + +def load_json_file(path): + with open_file(path) as F: + try: + config, hadproblem = load(F) + except MarkedError as e: + return True, None, str(e) + else: + return hadproblem, config, None + + +def updated_with_config(d): + hadproblem, config, error = load_json_file(d['path']) + d.update( + hadproblem=hadproblem, + config=config, + error=error, + ) + return d + + +def find_all_ext_config_files(search_paths, subdir): + for config_root in search_paths: + top_config_subpath = join(config_root, subdir) + if not os.path.isdir(top_config_subpath): + if os.path.exists(top_config_subpath): + yield { + 'error': 'Path {0} is not a directory'.format(top_config_subpath), + 'path': top_config_subpath, + } + continue + for ext_name in os.listdir(top_config_subpath): + ext_path = os.path.join(top_config_subpath, ext_name) + if not os.path.isdir(ext_path): + if ext_name.endswith('.json') and os.path.isfile(ext_path): + yield updated_with_config({ + 'error': False, + 'path': ext_path, + 'name': ext_name[:-5], + 'ext': None, + 'type': 'top_' + subdir, + }) + else: + yield { + 'error': 'Path {0} is not a directory or configuration file'.format(ext_path), + 'path': ext_path, + } + continue + for config_file_name in os.listdir(ext_path): + config_file_path = os.path.join(ext_path, config_file_name) + if config_file_name.endswith('.json') and os.path.isfile(config_file_path): + yield updated_with_config({ + 'error': False, + 'path': config_file_path, + 'name': config_file_name[:-5], + 'ext': ext_name, + 'type': subdir, + }) + else: + yield { + 'error': 'Path {0} is not a configuration file'.format(config_file_path), + 'path': config_file_path, + } + + +def dict2(d): + return defaultdict(dict, ((k, dict(v)) for k, v in d.items())) + + +def check(paths=None, debug=False, echoerr=echoerr, require_ext=None): + '''Check configuration sanity + + :param list paths: + Paths from which configuration should be loaded. + :param bool debug: + Determines whether some information useful for debugging linter should + be output. + :param function echoerr: + Function that will be used to echo the error(s). Should accept four + optional keyword parameters: ``problem`` and ``problem_mark``, and + ``context`` and ``context_mark``. + :param str require_ext: + Require configuration for some extension to be present. + + :return: + ``False`` if user configuration seems to be completely sane and ``True`` + if some problems were found. + ''' + hadproblem = False + + register_common_names() + search_paths = paths or get_config_paths() + find_config_files = generate_config_finder(lambda: search_paths) + + logger = logging.getLogger('powerline-lint') + logger.setLevel(logging.DEBUG if debug else logging.ERROR) + logger.addHandler(logging.StreamHandler()) + + ee = EchoErr(echoerr, logger) + + if require_ext: + used_main_spec = main_spec.copy() + try: + used_main_spec['ext'][require_ext].required() + except KeyError: + used_main_spec['ext'][require_ext] = ext_spec() + else: + used_main_spec = main_spec + + lhadproblem = [False] + load_json_config = generate_json_config_loader(lhadproblem) + + config_loader = ConfigLoader(run_once=True, load=load_json_config) + + lists = { + 'colorschemes': set(), + 'themes': set(), + 'exts': set(), + } + found_dir = { + 'themes': False, + 'colorschemes': False, + } + config_paths = defaultdict(lambda: defaultdict(dict)) + loaded_configs = defaultdict(lambda: defaultdict(dict)) + for d in chain( + find_all_ext_config_files(search_paths, 'colorschemes'), + find_all_ext_config_files(search_paths, 'themes'), + ): + if d['error']: + hadproblem = True + ee(problem=d['error']) + continue + if d['hadproblem']: + hadproblem = True + if d['ext']: + found_dir[d['type']] = True + lists['exts'].add(d['ext']) + if d['name'] == '__main__': + pass + elif d['name'].startswith('__') or d['name'].endswith('__'): + hadproblem = True + ee(problem='File name is not supposed to start or end with “__”: {0}'.format( + d['path'])) + else: + lists[d['type']].add(d['name']) + config_paths[d['type']][d['ext']][d['name']] = d['path'] + loaded_configs[d['type']][d['ext']][d['name']] = d['config'] + else: + config_paths[d['type']][d['name']] = d['path'] + loaded_configs[d['type']][d['name']] = d['config'] + + for typ in ('themes', 'colorschemes'): + if not found_dir[typ]: + hadproblem = True + ee(problem='Subdirectory {0} was not found in paths {1}'.format(typ, ', '.join(search_paths))) + + diff = set(config_paths['colorschemes']) - set(config_paths['themes']) + if diff: + hadproblem = True + for ext in diff: + typ = 'colorschemes' if ext in config_paths['themes'] else 'themes' + if not config_paths['top_' + typ] or typ == 'themes': + ee(problem='{0} extension {1} not present in {2}'.format( + ext, + 'configuration' if ( + ext in loaded_configs['themes'] and ext in loaded_configs['colorschemes'] + ) else 'directory', + typ, + )) + + try: + main_config = load_config('config', find_config_files, config_loader) + except IOError: + main_config = {} + ee(problem='Configuration file not found: config.json') + hadproblem = True + except MarkedError as e: + main_config = {} + ee(problem=str(e)) + hadproblem = True + else: + if used_main_spec.match( + main_config, + data={'configs': config_paths, 'lists': lists}, + context=Context(main_config), + echoerr=ee + )[1]: + hadproblem = True + + import_paths = [os.path.expanduser(path) for path in main_config.get('common', {}).get('paths', [])] + + try: + colors_config = load_config('colors', find_config_files, config_loader) + except IOError: + colors_config = {} + ee(problem='Configuration file not found: colors.json') + hadproblem = True + except MarkedError as e: + colors_config = {} + ee(problem=str(e)) + hadproblem = True + else: + if colors_spec.match(colors_config, context=Context(colors_config), echoerr=ee)[1]: + hadproblem = True + + if lhadproblem[0]: + hadproblem = True + + top_colorscheme_configs = dict(loaded_configs['top_colorschemes']) + data = { + 'ext': None, + 'top_colorscheme_configs': top_colorscheme_configs, + 'ext_colorscheme_configs': {}, + 'colors_config': colors_config + } + for colorscheme, config in loaded_configs['top_colorschemes'].items(): + data['colorscheme'] = colorscheme + if top_colorscheme_spec.match(config, context=Context(config), data=data, echoerr=ee)[1]: + hadproblem = True + + ext_colorscheme_configs = dict2(loaded_configs['colorschemes']) + for ext, econfigs in ext_colorscheme_configs.items(): + data = { + 'ext': ext, + 'top_colorscheme_configs': top_colorscheme_configs, + 'ext_colorscheme_configs': ext_colorscheme_configs, + 'colors_config': colors_config, + } + for colorscheme, config in econfigs.items(): + data['colorscheme'] = colorscheme + if ext == 'vim': + spec = vim_colorscheme_spec + elif ext == 'shell': + spec = shell_colorscheme_spec + else: + spec = colorscheme_spec + if spec.match(config, context=Context(config), data=data, echoerr=ee)[1]: + hadproblem = True + + colorscheme_configs = {} + for ext in lists['exts']: + colorscheme_configs[ext] = {} + for colorscheme in lists['colorschemes']: + econfigs = ext_colorscheme_configs[ext] + ecconfigs = econfigs.get(colorscheme) + mconfigs = ( + top_colorscheme_configs.get(colorscheme), + econfigs.get('__main__'), + ecconfigs, + ) + if not (mconfigs[0] or mconfigs[2]): + continue + config = None + for mconfig in mconfigs: + if not mconfig: + continue + if config: + config = mergedicts_copy(config, mconfig) + else: + config = mconfig + colorscheme_configs[ext][colorscheme] = config + + theme_configs = dict2(loaded_configs['themes']) + top_theme_configs = dict(loaded_configs['top_themes']) + for ext, configs in theme_configs.items(): + data = { + 'ext': ext, + 'colorscheme_configs': colorscheme_configs, + 'import_paths': import_paths, + 'main_config': main_config, + 'top_themes': top_theme_configs, + 'ext_theme_configs': configs, + 'colors_config': colors_config + } + for theme, config in configs.items(): + data['theme'] = theme + if theme == '__main__': + data['theme_type'] = 'main' + spec = main_theme_spec + else: + data['theme_type'] = 'regular' + spec = theme_spec + if spec.match(config, context=Context(config), data=data, echoerr=ee)[1]: + hadproblem = True + + for top_theme, config in top_theme_configs.items(): + data = { + 'ext': None, + 'colorscheme_configs': colorscheme_configs, + 'import_paths': import_paths, + 'main_config': main_config, + 'theme_configs': theme_configs, + 'ext_theme_configs': None, + 'colors_config': colors_config + } + data['theme_type'] = 'top' + data['theme'] = top_theme + if top_theme_spec.match(config, context=Context(config), data=data, echoerr=ee)[1]: + hadproblem = True + + return hadproblem diff --git a/powerline-bin/powerline/lint/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/lint/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b64c52d24ba4dd677c00422ababe1110bd67f4ff GIT binary patch literal 34659 zcmeHwX>c6Zd0@|U&wU@5!QdR+7@Ryo61+t5kVsIJceqRXkWoOsL1?$(yG*;J<0aC$JID@x+6#HrdU@JQ&`+0B06 z>*+bbCO}I{YJY5tc>Vev-}}DreeZkU``&w_Kekwm6g-wc{qz3laf#x6J%7Ft`2L08uHc#weY6Hx`;lgCwWZR5HSXgB(4dY zBIcl(#I<2d#2U0lY(ZPZ9<-A*UDy$E2Aw3X54$4npqs=E;i8Bq=pk`q*c&Mh7L&Ls z?2D8HOGw-tE{&80%ShZ3E{{|MDVK^^pz14Uvt(jgd{k zO_9yP&5@2^M`TNI3xRJ7Z;fmVZX`|Pj(fwv3gG`_0(akpZR+#%GYe~g)B|0@NZ2hIr;nT z9KYlk)P9kzklT^ptMykwdpBh`xi?!0y!Pku`e||hW)6lND`;!=9#QJ`D!`;Vhe-i6 z1+*jcZVIElwb}veZ2(zR)Vq=nHK!R-d!ogKRsy?kQ<_B905|We8s! zKeCeZ8TyyqAaf_5lQNELa4aV|Yv_j6;4Ex>n${LJ$$C>sibFN|a+8H8GbT^$+08P& z3mvPL%g$)Q*8p~o((mR0%S7d7hLyPBX18YBQL@;A1<(~nAiIt2%-Ii$R^uszQ2=Kx zN%;PgsVIQ6)|{X`!v|%K0IXATT;>9#W%K1U`K_oax63_NfY}#Cp)v)z{+@oEQ!wl8 z$YQK)!{sQ<%yR{}e>RvoPG(@PHmYR&~_)x5Ux}f$GMh%pCQ^sLMJST5AAIG}@ z_Ub%;((39NneQv#3wz{w5?VPeW2a~ZH)iXuwu0>`z*c#bX4`?XJ#w3?O5n3{+lt)p z#WvxuTZRSkUOB$7cU8#yWXQq343u17C}XeKhuJn(kvoJhW2H2UL4KAqian5TGd|9@ zRa#!ypT$pU4q`KuEAsCtu+CAns&oP*R;E9T&nj3e>Z}8Df32qd7M_!(S`o(cGK^rT zfVwA)9w_rt$SKzupxA@IqndIu`(Ks*!!k|5p$z^x9{l)m4bA@QD^MjUN90ylmF*X^V@Fv( zWiid~xon-)#+#CEIFk=$c-8T(sIvl3LzAN9gbP|$ki0c~Qn_`n5?v95&VF@>VqaRT z9rozc(D0s$J+>C4H85^@%65(yw4-b>Wc9{V!aVUW0P|&l8Ii~DYBCMHd*xRs`)UEM zN;3IW;}KddT-$vfNGHEAoC;Tjp9d#g7lvj21GTTOiQ`CU6w2iL>1avYtw?wx zxK`0WfMMYZ;IqRiwC0~+kIS4HUS&;Rz%ixu{b{yG)~)h;4PFszHQV+RY!0?h9=Gy) z4X9|toykH~SbMP{@FHYZj=*VRmt@O-c1{=C2gY8oU-i7hDsoT&<1^2J0A+QZI04+w=){5+KO^M}=RVM6 z=1V0GpT#!dZ(Qb1etaP(8%lL23h-NH#(IJm`aC-cw92!&QVZuY*kvt-rykEr{R5Un zR@#*2O*i}Ys`)kSQ~B}=xT1)M+`o!^dCFE6;#tngU6(&5r?PD*@%235cwVmdgx$Rf zIUmZN%Zum6krHiBW#txd=)*j;Gtq*4rMYsWOdXUwE8~{!yH&=pqSpM93~k}d@{Udr zPXIkNht`nFEcezZm*edJOFT))au%HY|2&Zd6!;L6rS1u%C)bw>)VAfuc~=#jKCcd3{u!bl zVAA&Sk)gg(Hq;#+iiNnIa5SxFht3W~hek)zww~VTXm~sp>K=-WjdHQHb&MMtiFNmn zkMzZ$z>$C|ZDK?HJ>%gRJJc70Pfg!o&(H`&bYneSY^Wz3pwpg#&MF0MYO0dN z>4`yvBP6B`Qd;O-ENzye5&>zO^c5Q&>y8bEBB8WN&JK@q>C#Lt*E13g1KDi%05>{5 z);-dbD@jt)ZmDE6G!O{^UxC!|a420YrH0N8jr4`bp=)G*rwy_5W1;Rdq4UwSr?6_a zh*3)K;Rd4VVr1~>NT^$GAX_R^dvIuAFbsb&3Bzc*NUFUeJ?)i}`^UrKEG)Js){`#5 z7J49cY&04j>J8^`eGEe^kEo~JTxeh@3c?267>SIINPKaxXtO&y7V4836dpyP0qEh- z*-%)<5>f|-Mh3bEdq&tW5dh{mR6;=j!H7Y(^<|7FGF0(k6B-x~N+7sS#j<&EI7BQ@ z7{{rA`bb*M^`Z=oj)hQ^86uom-2aPR?Xk#M``FM}YYbQ%inVrZ9$YuJ<=nRR@KA62 z*!kGt=t%q6=tPJM4~>K%aU|B>-90oi6zlG88#|viAWT9Fw-EqVz+cn`L4vxgH(xq2 zyGhU&CsoA{Ac-o#9x*4_H$vnh;*Ukh16FnB=~rK(`cK#xs&h)8SJY$`; zfmGCSs)kxmMO71O6?KwQ!GGtebM#4SLKUEooPgyJMct+Xy0ks31E4#Rv78gK2s6^w z{Jj3Lw2Dg`2Yc8tZWJUd0@@+>5!FF0KY0?|28gHaM0X5FL7*fslbf@8Coi=di-owh z9pTYF(004pR#vM4V9{qF_<4d_(%F-aDnVDhOfj^1eq_nzowEwAhUuM&^@-sntvyxb zOLWburjMkIrbh-S^9T#x$KV%HJplQtyOF-7S+5JIb96!+xybE=0M>F8b=ohHP`V1j z+%70sjWvoO0Nn1juK&Twzo#^6^Rk&T_&{j5O^`F`d9(5LiRRba0!^oSS||6k2D{&Q zeWIy0tqzBNhO(e6Rke@<$LUqW*--%rnI|V8M4~23_rU}KJoLZ4u8N!T4@Ld4(NTXG z$3xX^Ra)CW%7Ge%nC5Ixcsvv(BZpA<3;m98Po$Ua*~J|I;OpQoirt@}lD-bnx0Cnn z{3s;&_9ZAnOCMxq9~{2e>5mOxRyClCQ@^A7UG1-f6yosJ5~Uoyt>TKI0wBVmI?Tg^ zv`&KcP$24nAVK}0?Bl`YwpWrzU;bp*iw!aITSWy zhMl1BwX(U9q+`>q*e8xn84O_VGUWkFYorOskez!9n1l=>O!_T|l^k zY^lsLF~498l?QobiBT`?d`u8`|jEAz5SiH|LYcEOP9Fi zD8J?C;<1;LubdW+^$1&fh338tYbW(@o`Ui5Mssb!m_RxS51Sx@V}e!XIF!@1Kp&1> zc+6Bk4K%5boCv7Xy1|}kPb>z8MrL}tt>*SaA+8GoGTQypXwL}%DubvOf&?|k%&`l) z-_w0mBsA_$*6vPvpUEIwfFgDx{ynIL;Hii0_{f=&(TNd18|ob=GpC}8LBIGpT`_jY|xpt^UOl^hYhzIK5V<)_5e=m*3KyUJmqz`eLKp zc_rBiFx*}Mo?{b-2IQ0V#Rxi- zvQYF-48k(Rk0oH`;g=RL@WN&7I4p5tQS5JoMUMY%2&MvQBVs=u#kD|M7whT82+V4x z?(WP-cXyhGRW6u>uOiuIVwFmZ$|z`6dT3-rnjRgGrFC3rf`cV`K*ha{C7D=c{9IZK zwsB-E2J;SB93!!zk#T}US{n_8p*tsSZ=PD$x(y~dFa=v-qJwrwZQJ-5tjAzopCKDM z7>^7A+odH;S`!@%g~Ms}L}YTS66LVC3XPzXAo^tL0V}PfA^L+4;o&^Hw63H!%^tbvgb>qp)UfR&4E2V(s_QLGaK56Hk8)8#clDvIkY5P$nA z(ca73dy{>Gf_*3>@{IJk*yqjH9cDh%KE~_Yb7iy#r|t8aPqq{v?i#l_)X9 z^`VvWCM%wVjbtx_j9vk%Io$f3T(49XT|)j?#=SyhFmKF(2Kky?J?+4vpduts3>H=9 z1t^tP$rwUalEDKA9_fR{L{D!wzI(^};XPTSgb@s35aO)KKk0t6ad+pb*C$?wK^K3$ zE!xu`3e-;4DODu{t)O!CSlB<>I}GF39~qCv{JkMR7{mVF^Zu-3VRGGZ$!7#o+CSn}rKSeb!5437wN1P{aq9w#fb{>C-OfX3N{< z0@)M?%k@lvgN9?f(W?le1d1G!qNDw>Y?6~C4UK@8Fq;MwaC9u(b3Uzw*3c`a2jAl; z48`*xe*K`Vp+iDI0_gaOAvQLcR)^k_rVb4V?!XAFcR6Bn_kl2EADmUu-SVIjg8cPS zZYGr%lSAML`IhR}!HdEjgTf${Rq*1fA-Jt3kki^T6J%kD#_MBN{e4J`;`$R-CXj4Hkb%f` z>bwfpzmqS3N&_ti6FNB9LNI_?e{8TP<{upi!}Ok6yk}eUlVRz{AsY2VY5&9!Sdi6n zqt)CN0R7~-{t@IpKn_exi}tiP(?WN)1T;<1I0?@`frKv_`+tJQx$k1I z34($J3(hY!@b>`Msa@dEx=zKZH_YG=1K%1;odLE)RaXpg)o-eE%{*BJ90%HJ8Es#xorS+Lsqmx?{HI1Y)qW*p`8er|$AA>0n zG-;mlRG#c*uu?@19mbE<1o9XJnbwf}0#2fAlI21LM5N^c3vS1=)HziYf2@JVxMYwA z7;qNis)GAZ7!c8Wvh{63W+6~%<$SCD&i-5Np9Eg|XyQk8$=xp|YmX+q#}W#C3soMM zxo5I;uGFVEM$t|Q!N>rM0O@S;OMDpR{Jo5{QH%h7hCsmA^-W&aes6?6B!ACT8obN4f=chy+Z^3MlkLI{*m!W zFZ9r8zdt(G(-(^FUc*$YK>9MKn(w&i3-Z2T^3-X;*OQRM=4ULR3TBa2UVmh!BXi$4 z7aiqbn*y2v&$aXgHo$lUj0~UB_#>XX$rh!oOt<@SlO%sU!Ui4Lj)RFa3PwF4DeVP6 zME3~zxqG=#&l%hS$z)`;4uSzY=#Kz(?!RO3KadD;$oBM(o(+MqUzo%F0c1ZWSEP@m z5u5XWfj3Oe((*PiI{9J5!ZHMA>JT?sl{HY>WI=9|Rsd~MiD+8aEyX}};T$Xt8PvU! z3%p2ab12I3P+$*sRc5b5RWv)8^zZ%nDu$)V z6IaRWVY20+o}%M)95y-nY2~es80s|g)KXm46a##rV%RQu;*1Op>z{;;k}2j(ikl`< z&V*_rvsv<_O%%yB#gKgxX(s`<0l-Td<6!U+XO-#zF1K(c%5BFyRVa$)jvpV1xz^lX z2kxeEB4qDJuD%5k*iq2hW|<44%am4KGv`=VYv`K0#bt9xzpmryqD04~&SgDiDw^$| zW0S_}M;0h`4~zc%p_Vch-KSJ^dCF*=Wxm!oSM^?h(pa`gmpwAbrGB}rg#y2Lq=N*~ z!Y`s7(CQV{9xwgt)+Y7)3`G8eVUJt$UCSPu<_{?qME_8QsefqGVBAe(+^gB+*A?iK ztfvIcw8GwIRrq^Ba$md-y*;Ix!oH=3vpo+5G7oHgspIs5Iw#$6+)$v85dOk=Lbh^0 zh9Ip8k!@o&VPRS;t)^kHs@Pm1ZV5_8QBHC_;F3zR-DqQF_NlnLP~=7IhOH2RZYXcQ zwdYp<9ruN4ny(@eYEwl&~8R#b)09DJ@MhVvMCSSGHCGq6FcDZy=8ZJb;P zV|DLmv5|N<;$iiQ9M6`EYw|e$tu;8Ft+kJO1CA(8Y1g1fiQk&IHp_2aT)PIx){-|R zj_I=e_7-pqT9Y^yXTZLHj8|8NS%V_4vhd=%JYG#RFw(B>jpvFm5w>KdmtE`mU|A1;#>k_B#dQ0cJZg~Xnx}@5D z*I>Hpo$+2RpD9mz1B-^HyITFlf$4#ZBhw?vqJ~9nrs7j;$N>izb>&4F)^+#I>{+G72#yQYei&7HD(;NNU?PJJno zvN%#!_w3o3(R(JXU-y90n)MK9^~+AmzE>sM4)V5xKWY?g$Ds<~Xx0IaS{>l1vD_^! z|3>GH&iO&1wEaG1WpqiM_paA>ed5~0_4u{;{PW4SU4nOal5wYWUQy@gb^dukDzMP| z;lS;I4@Yi~BzL~B*mgw5sv>2rn2XMZVs23G7!+lU`P9enoX zt|w$>PU0ypXb8=Vjqvwi2L$po`i7gLh@lAPL_BYMIG+7wtA2T!^2mcTDDVkwuqy0Va#F(1zS8m8_HCD=4{TP+sy6l2>4ksnl1*glBBQ9AC=;VW;SH?1L!arYqk*ARRuMDRe8 z>udV}+MPY$d+s~WefQvE$u2>^JE_`D4DJJcXxYdQ&g-N%`YmueDS&Hym~8=;^vL{H zL4UxSAAWc-HMt=H}2TEzB88HiU|^=T0yv z*$X4KynL&SN$xG<0yJoc73P&Z3~{G?#UoRhgAzjno;+ZG<3iPIPkW6!O47>bBn7K~Up-}sHONp{104I$$jOv7FWs1zZi@xv^08()HWOe?vZYXv zYL-*wH&`RT1Z%_|x3d=H5@%yIQw$t*)5$3dRv8EI<9Q*~M#`zN9DETDbKe7ASm4W! zd8iEHX4XNt-YVmid&{+Qa3RHsrCHY*Som_Pk<)U@aC@$v9An*b&8RzDZoQnFd*{k= z6*5(9(J(5k6%Ro1VEZ!Me40l};%3Mvl&wM$!C$Tq;~)buZq2U?al$Wz194J^aLdkm zNt*3xN?%DsDT41~(AS2TEpg?4GZd?b{@(!o?||MT{l$UTHp{DGMP4~r-|*%Y41~{_ z>~(Qjw(_}nWfMc?Mnl}nn)3NwkYmoznKS}+&bX61Oytc8`0j@kSKI|KNXfGlr)Etf zD%K2CSlN=e19xi?2B(cXSTjl#_@c{DrrA#U#9K_l&; z&)ma%XQ`}Mqb8Vx zkJA@-v8_bw>SDN9BF|Lih!fJ=GU>16rE6oa<-X#TpPMILgeONB>Pm#6hNvmOJaa&Q zz(AgIK`;8_uFRZ5cm+AYgQ-%W+=aake5g>8{CM_9eW$A8zST=8LttHUzr?Hh>8a{? zwIqL0EyUWfZRpkK*lLiMYQPFClc}0`4Wwz~Wt=5;O6F9&EM6mP#i_C@Me!O4ix~>i zfi{E_FGUKG2Up^tDf8u{Kp#%k7D)ZN0;#Wy*RCM};jHY`gY5X@UeHB#@p_P;_3!Io zoYb#TA4W5gpa!700Y=CM(k~5}dE3lxgtSd$)Vwa!4zgroH)qrF1QU6tD!%~fIY^}E zFmP=IxLLOb_IoneH%^s-evqiIg;+7$fz-2GWGv&2GHtQb8FZ=7E$Pn?T=xQ=3|IygEWX7SJo?iPgDwk(+5(b2GUco@O#3*m7)IL{V^LvbOpFB%<< zgvfyuJpT{pQT(t`1$T!0a7-ir&@nl5=FhYPkf13z;WjoN%QYn*An|9eZDE54GPlm8 zvkVhM;V>czO~C1fQBn|cLVn_zZ;S@o{Kq9qdiwf8V=+Ktobv;i(J^vVCX73_6Qdjp zi~$}YG0{%{>C>6ZCZ|vP;lOY18!m=%XHK7PA*lf6^l9K4UNOoR%zS4G=174Z8aRpZ z);OH6?1u74$ua431>=!Rgo98@I$MWy0f}Q=C<-S;+OR{pP;8tVK_I73AAtKSA!vW7 zAGxs7#TO01Vm|``_Ta|CKq4If0NDs-NIL;1C!spP0tlq#4DryTA=qUFj*VdVALx@u z5594+=7PTmdI<0i(F|;o5Z{J$%t6KdHDnO?LW20>$Y%1SbcHO>p^>==G7s>`WuBiW zs5^%f(x&UAHM^16idU$(O8^p2*Xz0Q5xCLT7b1IL;N3v;h{6~y(GQU#6Eu^czSZ@6j8MBdL)GU*hzh_ZWN)g0#LHqlg-D8FF14X7=7Xs zaLN)-XA;>1T_UM1|J&=QCe?7{;xC};WGxoV4HC#BRWic_E4{s8Ds3rHYiUEClRd4I z@}g-Cszy9$%ixwdNykCWp{Q_|v9ZA3g2TP&Le3%BnHj>wQ-6fJh_%KrxB>ylq6#{I zz*-v&o*g7$$W^(tU2=$LPZUOB(;f#w+Pfkn0 z@;F#gQyiM6a0)gQI}8^^;lLmqkBS{87f3bx_CNdbb7{@~W5-@RmNxdV?DNtc(zNAx z3=UO9GM^l{c>x3=i`++L@a8dSAxVL=X?<7dJUP!H?N(qJa#4@NjXn<76p|9rW9;t` z7!8e)W8qwkY?g3;iCKFwK&K*S#zGo$4Vgo~Qd)QLMbZL?{z6W`BpPVS+mK-~EpthX zT$?5CUTzta-7Cd~pm>jD;qB`DP9+q2$a&Pq(_!Z&Ct3su`bgncHYx_GUr7B-capd@ zD@6pYKoc1p;BLkXNJQ?^ro5?<=$^EL?A%B~L@vt0mJyuP#|~77;G_*s_>wvzSfDl{ zH!0--pSj@4;VJU8f#?x9RLYS9@_6~2*g6aoNc6ajIGgBYD3L-%}tKM{E%bljg| z14LyJK_uc!qvVmngQJP)G7b*1fu@8bm$<7Hg|k{H3n;*8L#R(q)kox*E)(OdSj3Uz zl#J2;LC82xI9!}dlWG&hV4vXWo@b<;Fu0Kq79!UP&CI}G^dDeWgSmFOp0c?UB|lYp z7FES5d(kKM=0#sX@HHpO?iMu*Ezbx=dy*>WPmK=ISjrnqlVvS}u{GgIsdN`Brz>yP zea(Bl{NI)@y!zoAx8GP)ZHIJG<>Xb)uWb=sjl8Q-a5XKent!UbTpE}?D`+bc&c9@A zcU@)IcU{{hxM~t@%W9h5n4%rCbv#`>SIX0MBHhN*Z9k^hJ=9a~@gP1K7c%?^8Z? zN8%{#k7;#@iFbl2yF1ajL~Abf%<5)_e@y#Qv?-<0CgSgOlPrvnzw=tEq$08H($Pz2 zXHN38H%03&d8T)Yw40~hvqxvguf4WNSERJMOWNt7+0IY2wiCSV1h#f|`s4#zWw-wWrP4T- zwUowqsp`^!nE=nYMW&c%isu}29XEW7OigOT#ybbT6G-fsRn694Gw^iD-1@nfZ*1l1 z+WDjNXKw~YWBdj08hiQpSkfHukm#K{9Cs?H_v}Uum7|$aI5~d zp%Bh1H?~2?rJ9;=J%78ou=?2>CqJPZmNxkbGl&++=_67D5nqs^6Qf?d%2lmYfw`%H%mK_DUJS9t>My}bIw>IXGR%3DzcJiOMII5XRk^3^6bU9#}BCk4Ix@;l+XrpoDkDZS~^#8<6% zO;ywTerhUB?1OuI7l)^ZXFcEY-tv62@=omIV~Jrw`}~g_g0>5W-}Iq-E&#f0100rX zsp68P%AGPhX6t8OxKFv&8$hVbE0gM?**;!fk}4{h+r<|(-KU)NhQyhawQjzTw>BlV zrflA;@tOEsmtbp5Z2Occ6`4w&shl?nOiPL}Upzd0c(z1f%2Es*?_zA4#8waxvwL>W zSGUhK&aeNiW+;?0+Y=orXUTm^%XktKOD1PZV_DK!?pn*|`sW7(YuofIpIVEiUs<+5 zfn_VzvLQ*sApxF-gAJe1jrZyRsbvk|{IG>`dS|~hKgfIA1;@HX`Q0MlT-&WOzNAAa z+5)OSRa7k&HS$G`0@C6F?!OM)Z$R#sw5D8@DQ9`gQJpHT#BQ+ZNjEsD;>zn&*QVb4 zGU|Mn*2oTOZh4j`!1F7jOVVYWP0DHzUu5}(bIQE5umi( zM3uIPCF}W;^+L(U`;-M`(33bhtNqky&7tY8N)?wCqFD|S8t2vSl(Q6K6Vt7CH7;q? z&ebn8+^PSd{bL4)iccCULT0EemqHWE6_mjR9QyggE;#z=#G{WJ?>4Uczz7OZn#>mI zx@8(tfBEo`nljjNaJW-;XQFvY%_J>bf2`gHgY7~SY_S()T{%AMxcthGp{&jIm8M_f zuyFs={SwO2ulhMmV=^G8JJI?CK$$EhK);CMvhF{3cwS?uKW?(TR!jYfy8dK<`IBbL z$u=s*_+G1`Q+^eOwVsppbZVy_!X=I8WEH(srNMZcC%6uNOGl5P%@b^<)6E))OAG&Z z(#CH1sT%N4gu1&qTyS%EM1aFxeGZRnNG2<>%F$ZI3yOFni&)5M1OEIF{EkF8%Av6g zmK(Zz$TuD?NE@;q0m-;0WE<}%?2TH5fS14j&3cVUKPbrG{Y zT~wHr`B5S1*9lg@Lt~QI?P*_rC2-cDzbM4w2`=KQNLM~Fzm0gTq-7YcH;AEMhy=hR zR$P<=_dCUTF(}3WUE^E{2BjF3VNi|%p4;Zo+sgSdsKTHcgBlEKF~FUCt{wy2jh9Yi z<32lwRwmaBLE5zfX=2m1U``&>(Ln>JyoooAELo&O%IJzs+hs={Imp!wx3vu9C#2ve zY$#2KLnEA51;xzrl_AmqifNj`nrUlp{YbJJu(V!w;c@VP*#sov{tVdh^3Oz&r3U*x*CLcMyq#BY<*}Rm42x8x3X529sNB&-_%Cln9+9U;HCD!KG!m2GkGk<5=1uSHPU^-kxX(S{m=o zPt9GHBDF2@%>fBG-f6&5oB0Ak!8=RRmsbXZ&YL_c)0T`pWw16$_amfA4(UQd-kO!G zLsIK8;87Mt4DMp^cNpMenJk}H_}<{hY^1v&ySTGZ7yePve`lvCQ2Z*@-%uw6>cn4D zhCipQ|C6fu303+Ns{C)LE}rW83Dxows_iFK>rbe_PcWMHTvb!&z6>XKgtx~X6iMBf4R+my~5^wRQeYjM3 zPW2bhb^T#%nWj{hzjPG6=eb^bt#s~H!BHnVnt1rv{EFasRdl@0J6=y%mlR6e+ATP? zi;ib_$1_mCWLvVpY<2b2%&9rAV5t%<^}MBiiQe>pR$FPnNAD4I-X)VyFqMj?THaJE znCc&zv}W}qGezsBYnLsQ%5cw06|<@&<&qloUGvR#3XXcw(abwwwtQwuy&YC$PW2|v$-K~PVJx9n1!BH*2 z6&$Tg?&9|jT<^NpHLnxgjiS4acemY+CN~}t+FumhFNyAxy!)i!J_U3bESI%cO*5t? zCb-0O0yYK)u+dnipTBSjxNy1S>du*+OSJAn$Hnc_+b>NBv{$6dU=4MTVYIq?W=eZZ z^}u0ZH22&TqnAp}#4ew`IyEx|OP31=E_O|K&FXHr=h&}<{Z}icfi<|KFqcg zN$66IU)0p`n!05Dc0sd4%6fhJ^(C$GLjT1x(`ROD1+7=q`gyHi&{jVo8IT8zU{&iD zG)1DOgx8cLOWOs_I#IKY*K89s+m|$u<&lhbK~wd>rq^g6XiRp^1Iol`A9%fH=24qW zytza$mx<;&-drb`8_=DLDgWOA01IqjB9##(sfXv4*{!| zwAKs5qSni6y-U`r`Ib8d!P+TW_wv@gf^|Q%xn!>p?EZ(e+M)RyjRUw!y5->X!KAf9 zU@AqXmS<{jzM5>^{c({{_ng2yzr;8N#*O^cz=BQ(zu2bNF^}vrXN=CvO_JjTp~Fbf z7iU7kvxhpyp@ETTDuYwHCI$vXMx6Ba%SKV}ya#RYA zDrrzX)X)G#Lm6N-sRfzL0?}A51f^9UVW()X;q5hfBvlHGKa0OZ1H!DePQP{`2tRN3 zUdQ#$Yn^lK{9eJ;D7x13uJwXz1+4D-OXKuYCWQV#)qSH2>!gCrw&&6l;JzLeLOE~&K_>MyoT zw_IqGqOH@d(!ks?z2lkRc5E*j@>m35UlSr;;s^Co( zk3j_B62#8w&P(j<9)b3VG&rwHZ@eg!wF-3G>bWAlg{QX&^ftL^bFS�{zUxa#&+N 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 EFT|wYl>h($ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/__pycache__/imp.cpython-312.pyc b/powerline-bin/powerline/lint/__pycache__/imp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1da7a3476ea36dc91ab878985974299b500fc21 GIT binary patch literal 3416 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/__pycache__/selfcheck.cpython-312.pyc b/powerline-bin/powerline/lint/__pycache__/selfcheck.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39147ba3cd20c0afbd86bd1ddd30d61f65d34863 GIT binary patch literal 1261 zcmah|O>7%Q6rS0g-OajjlPD#)P{Ed5*h;nArfo=D@grKqsi7sRird89cqj2D`^W4! zsgt#o0*4?XFd|aRt(7={oI}(Tcd81B1GZeC8hitUxY6d86EnseN-llUyqS6Pz4yME zdGCjGIt93-fBbc3N&?_Fu}OsQJF=DK(@kIl8@j-QdFV-b$&>T4hw=ytyW}dKnpgQ+ z{s`o?3Nn?ygsX{If7y46fsG5ULou=3i1pacf)hD`&-$$CC~(UZ7aT7P2xWUi;`p>M zQ}&CL15C)Yu6wb=q^ktwK0da-f`V8K=lHx^Y-mgM?iH#Mm6P)r)Vt`jU~&_Hs~l66 ztB5K)2xQBNXLNvSiQPtXdb0j+j-^c$F{vMIvfuBO2;VuFdVCv_Y8W3mJ@fl#qv&j5X_LAk6u`#@Sq?%hkS~Xr? zK6a2)O`~K*h94LfrNo)$wP9Qn@N3)f%91phGa(Uwuni~8Jxrd(lQG|&op>u=;gsC$D@hr+xyzcynT7D5TWIIL56ke5H#PpK2fJL5&i0@{|bs}nN z3|VA0V(R>&m^+ynbQoM<@;t6Ed4bonz#IR{_G>xng}KlP4^!@d>EV+nN=L%c>ti|B zna+h3S_=GJ7%XDqIzHw`pXMU$&J;_yIG+tGWQYgrC=oTf&(#WenCk!R(8q^rmv50) z>ZO&Tc6z8rKPfy0nsoZc#L9(L*w*`N1GTpv=+C$HXB(Nff60tDGvkeSE;TN{*SK=E zm6>emQw@2lt@PF4`tb)!=HcMJo1>qPelhkKKy(q_xV{ptzS&0U)naYrw)*wpo!*Vb z&G+j|O=IlavrXgmd!yfve0Qd4jQ@--Jd%aW@7h4^;QGW*+H-BWchzdhr)~}19{%#c zhPDaospkG;o9{OFztWOVJ?i5;xA;xKd9#P53cR~%nczZ!h?XHpDA9UE<%&JC^Ez4n zWZ7=_cRr=_F5dw1q5!|Z)ppMrFR;rlew7UKt?24Vw8Y;sgz!%=(E<~H0CP*#;pvXk EKeFL7hX4Qo literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/__pycache__/spec.cpython-312.pyc b/powerline-bin/powerline/lint/__pycache__/spec.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d346f6bb829c5e0a0d356eaefe474d38fa79d0e9 GIT binary patch literal 33257 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/checks.py b/powerline-bin/powerline/lint/checks.py new file mode 100644 index 0000000..c2fcfc4 --- /dev/null +++ b/powerline-bin/powerline/lint/checks.py @@ -0,0 +1,866 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import re +import logging + +from collections import defaultdict + +from powerline.lib.threaded import ThreadedSegment +from powerline.lib.unicode import unicode +from powerline.lint.markedjson.markedvalue import MarkedUnicode +from powerline.lint.markedjson.error import DelayedEchoErr, Mark +from powerline.lint.selfcheck import havemarks +from powerline.lint.context import JStr, list_themes +from powerline.lint.imp import WithPath, import_function, import_segment +from powerline.lint.spec import Spec +from powerline.lint.inspect import getconfigargspec + + +list_sep = JStr(', ') + + +generic_keys = set(( + 'exclude_modes', 'include_modes', + 'exclude_function', 'include_function', + 'width', 'align', + 'name', + 'draw_soft_divider', 'draw_hard_divider', + 'priority', + 'after', 'before', + 'display' +)) +type_keys = { + 'function': set(('function', 'args', 'draw_inner_divider')), + 'string': set(('contents', 'type', 'highlight_groups', 'divider_highlight_group')), + 'segment_list': set(('function', 'segments', 'args', 'type')), +} +required_keys = { + 'function': set(('function',)), + 'string': set(()), + 'segment_list': set(('function', 'segments',)), +} +highlight_keys = set(('highlight_groups', 'name')) + + +def get_function_strings(function_name, context, ext): + if '.' in function_name: + module, function_name = function_name.rpartition('.')[::2] + else: + module = context[0][1].get( + 'default_module', MarkedUnicode('powerline.segments.' + ext, None)) + return module, function_name + + +def check_matcher_func(ext, match_name, data, context, echoerr): + havemarks(match_name) + import_paths = [os.path.expanduser(path) for path in context[0][1].get('common', {}).get('paths', [])] + + match_module, separator, match_function = match_name.rpartition('.') + if not separator: + match_module = 'powerline.matchers.{0}'.format(ext) + match_function = match_name + with WithPath(import_paths): + try: + func = getattr(__import__(str(match_module), fromlist=[str(match_function)]), str(match_function)) + except ImportError: + echoerr(context='Error while loading matcher functions', + problem='failed to load module {0}'.format(match_module), + problem_mark=match_name.mark) + return True, False, True + except AttributeError: + echoerr(context='Error while loading matcher functions', + problem='failed to load matcher function {0}'.format(match_function), + problem_mark=match_name.mark) + return True, False, True + + if not callable(func): + echoerr(context='Error while loading matcher functions', + problem='loaded “function” {0} is not callable'.format(match_function), + problem_mark=match_name.mark) + return True, False, True + + if hasattr(func, 'func_code') and hasattr(func.func_code, 'co_argcount'): + if func.func_code.co_argcount != 1: + echoerr( + context='Error while loading matcher functions', + problem=( + 'function {0} accepts {1} arguments instead of 1. ' + 'Are you sure it is the proper function?' + ).format(match_function, func.func_code.co_argcount), + problem_mark=match_name.mark + ) + + return True, False, False + + +def check_ext(ext, data, context, echoerr): + havemarks(ext) + hadsomedirs = False + hadproblem = False + if ext not in data['lists']['exts']: + hadproblem = True + echoerr(context='Error while loading {0} extension configuration'.format(ext), + context_mark=ext.mark, + problem='extension configuration does not exist') + else: + for typ in ('themes', 'colorschemes'): + if ext not in data['configs'][typ] and not data['configs']['top_' + typ]: + hadproblem = True + echoerr(context='Error while loading {0} extension configuration'.format(ext), + context_mark=ext.mark, + problem='{0} configuration does not exist'.format(typ)) + else: + hadsomedirs = True + return hadsomedirs, hadproblem + + +def check_config(d, theme, data, context, echoerr): + if len(context) == 4: + ext = context[-2][0] + else: + # local_themes + ext = context[-3][0] + if ext not in data['lists']['exts']: + echoerr(context='Error while loading {0} extension configuration'.format(ext), + context_mark=ext.mark, + problem='extension configuration does not exist') + return True, False, True + if ( + (ext not in data['configs'][d] or theme not in data['configs'][d][ext]) + and theme not in data['configs']['top_' + d] + ): + echoerr(context='Error while loading {0} from {1} extension configuration'.format(d[:-1], ext), + problem='failed to find configuration file {0}/{1}/{2}.json'.format(d, ext, theme), + problem_mark=theme.mark) + return True, False, True + return True, False, False + + +def check_top_theme(theme, data, context, echoerr): + havemarks(theme) + if theme not in data['configs']['top_themes']: + echoerr(context='Error while checking extension configuration (key {key})'.format(key=context.key), + context_mark=context[-2][0].mark, + problem='failed to find top theme {0}'.format(theme), + problem_mark=theme.mark) + return True, False, True + return True, False, False + + +def check_color(color, data, context, echoerr): + havemarks(color) + if (color not in data['colors_config'].get('colors', {}) + and color not in data['colors_config'].get('gradients', {})): + echoerr( + context='Error while checking highlight group in colorscheme (key {key})'.format( + key=context.key), + problem='found unexistent color or gradient {0}'.format(color), + problem_mark=color.mark + ) + return True, False, True + return True, False, False + + +def check_translated_group_name(group, data, context, echoerr): + return check_group(group, data, context, echoerr) + + +def check_group(group, data, context, echoerr): + havemarks(group) + if not isinstance(group, unicode): + return True, False, False + colorscheme = data['colorscheme'] + ext = data['ext'] + configs = None + if ext: + def listed_key(d, k): + try: + return [d[k]] + except KeyError: + return [] + + if colorscheme == '__main__': + colorscheme_names = set(data['ext_colorscheme_configs'][ext]) + colorscheme_names.update(data['top_colorscheme_configs']) + colorscheme_names.discard('__main__') + configs = [ + ( + name, + listed_key(data['ext_colorscheme_configs'][ext], name) + + listed_key(data['ext_colorscheme_configs'][ext], '__main__') + + listed_key(data['top_colorscheme_configs'], name) + ) + for name in colorscheme_names + ] + else: + configs = [ + ( + colorscheme, + listed_key(data['ext_colorscheme_configs'][ext], colorscheme) + + listed_key(data['ext_colorscheme_configs'][ext], '__main__') + + listed_key(data['top_colorscheme_configs'], colorscheme) + ) + ] + else: + try: + configs = [(colorscheme, [data['top_colorscheme_configs'][colorscheme]])] + except KeyError: + pass + hadproblem = False + for new_colorscheme, config_lst in configs: + not_found = [] + new_data = data.copy() + new_data['colorscheme'] = new_colorscheme + for config in config_lst: + havemarks(config) + try: + group_data = config['groups'][group] + except KeyError: + not_found.append(config.mark.name) + else: + proceed, echo, chadproblem = check_group( + group_data, + new_data, + context, + echoerr, + ) + if chadproblem: + hadproblem = True + if not proceed: + break + if not_found and len(not_found) == len(config_lst): + echoerr( + context='Error while checking group definition in colorscheme (key {key})'.format( + key=context.key), + problem='name {0} is not present anywhere in {1} {2} {3} colorschemes: {4}'.format( + group, len(not_found), ext, new_colorscheme, ', '.join(not_found)), + problem_mark=group.mark + ) + hadproblem = True + return True, False, hadproblem + + +def check_key_compatibility(segment, data, context, echoerr): + havemarks(segment) + segment_type = segment.get('type', MarkedUnicode('function', None)) + havemarks(segment_type) + + if segment_type not in type_keys: + echoerr(context='Error while checking segments (key {key})'.format(key=context.key), + problem='found segment with unknown type {0}'.format(segment_type), + problem_mark=segment_type.mark) + return False, False, True + + hadproblem = False + + keys = set(segment) + if not ((keys - generic_keys) < type_keys[segment_type]): + unknown_keys = keys - generic_keys - type_keys[segment_type] + echoerr( + context='Error while checking segments (key {key})'.format(key=context.key), + context_mark=context[-1][1].mark, + problem='found keys not used with the current segment type: {0}'.format( + list_sep.join(unknown_keys)), + problem_mark=list(unknown_keys)[0].mark + ) + hadproblem = True + + if not (keys >= required_keys[segment_type]): + missing_keys = required_keys[segment_type] - keys + echoerr( + context='Error while checking segments (key {key})'.format(key=context.key), + context_mark=context[-1][1].mark, + problem='found missing required keys: {0}'.format( + list_sep.join(missing_keys)) + ) + hadproblem = True + + if not (segment_type == 'function' or (keys & highlight_keys)): + echoerr( + context='Error while checking segments (key {key})'.format(key=context.key), + context_mark=context[-1][1].mark, + problem=( + 'found missing keys required to determine highlight group. ' + 'Either highlight_groups or name key must be present' + ) + ) + hadproblem = True + + return True, False, hadproblem + + +def check_segment_module(module, data, context, echoerr): + havemarks(module) + with WithPath(data['import_paths']): + try: + __import__(str(module)) + except ImportError as e: + if echoerr.logger.level >= logging.DEBUG: + echoerr.logger.exception(e) + echoerr(context='Error while checking segments (key {key})'.format(key=context.key), + problem='failed to import module {0}'.format(module), + problem_mark=module.mark) + return True, False, True + return True, False, False + + +def check_full_segment_data(segment, data, context, echoerr): + if 'name' not in segment and 'function' not in segment: + return True, False, False + + ext = data['ext'] + theme_segment_data = context[0][1].get('segment_data', {}) + main_theme_name = data['main_config'].get('ext', {}).get(ext, {}).get('theme', None) + if not main_theme_name or data['theme'] == main_theme_name: + top_segment_data = {} + else: + top_segment_data = data['ext_theme_configs'].get(main_theme_name, {}).get('segment_data', {}) + + if segment.get('type', 'function') == 'function': + function_name = segment.get('function') + if function_name: + module, function_name = get_function_strings(function_name, context, ext) + names = [module + '.' + function_name, function_name] + else: + names = [] + elif segment.get('name'): + names = [segment['name']] + else: + return True, False, False + + segment_copy = segment.copy() + + for key in ('before', 'after', 'args', 'contents'): + if key not in segment_copy: + for segment_data in [theme_segment_data, top_segment_data]: + for name in names: + try: + val = segment_data[name][key] + k = segment_data[name].keydict[key] + segment_copy[k] = val + except KeyError: + pass + + return check_key_compatibility(segment_copy, data, context, echoerr) + + +highlight_group_spec = Spec().ident().copy +_highlight_group_spec = highlight_group_spec().context_message( + 'Error while checking function documentation while checking theme (key {key})') + + +def check_hl_group_name(hl_group, context_mark, context, echoerr): + '''Check highlight group name: it should match naming conventions + + :param str hl_group: + Checked group. + :param Mark context_mark: + Context mark. May be ``None``. + :param Context context: + Current context. + :param func echoerr: + Function used for error reporting. + + :return: ``False`` if check succeeded and ``True`` if it failed. + ''' + return _highlight_group_spec.match(hl_group, context_mark=context_mark, context=context, echoerr=echoerr)[1] + + +def check_segment_function(function_name, data, context, echoerr): + havemarks(function_name) + ext = data['ext'] + module, function_name = get_function_strings(function_name, context, ext) + if context[-2][1].get('type', 'function') == 'function': + func = import_segment(function_name, data, context, echoerr, module=module) + + if not func: + return True, False, True + + hl_groups = [] + divider_hl_group = None + + hadproblem = False + + if func.__doc__: + NO_H_G_USED_STR = 'No highlight groups are used (literal segment).' + H_G_USED_STR = 'Highlight groups used: ' + LHGUS = len(H_G_USED_STR) + D_H_G_USED_STR = 'Divider highlight group used: ' + LDHGUS = len(D_H_G_USED_STR) + pointer = 0 + mark_name = '<{0} docstring>'.format(function_name) + for i, line in enumerate(func.__doc__.split('\n')): + if H_G_USED_STR in line: + idx = line.index(H_G_USED_STR) + LHGUS + if hl_groups is None: + idx -= LHGUS + mark = Mark(mark_name, i + 1, idx + 1, func.__doc__, pointer + idx) + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + context_mark=function_name.mark, + problem=( + 'found highlight group definition in addition to sentense stating that ' + 'no highlight groups are used' + ), + problem_mark=mark, + ) + hadproblem = True + continue + hl_groups.append(( + line[idx:], + (mark_name, i + 1, idx + 1, func.__doc__), + pointer + idx + )) + elif D_H_G_USED_STR in line: + idx = line.index(D_H_G_USED_STR) + LDHGUS + 2 + mark = Mark(mark_name, i + 1, idx + 1, func.__doc__, pointer + idx) + divider_hl_group = MarkedUnicode(line[idx:-3], mark) + elif NO_H_G_USED_STR in line: + idx = line.index(NO_H_G_USED_STR) + if hl_groups: + mark = Mark(mark_name, i + 1, idx + 1, func.__doc__, pointer + idx) + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + context_mark=function_name.mark, + problem=( + 'found sentense stating that no highlight groups are used ' + 'in addition to highlight group definition' + ), + problem_mark=mark, + ) + hadproblem = True + continue + hl_groups = None + pointer += len(line) + len('\n') + + if divider_hl_group: + r = hl_exists(divider_hl_group, data, context, echoerr, allow_gradients=True) + if r: + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + context_mark=function_name.mark, + problem=( + 'found highlight group {0} not defined in the following colorschemes: {1}\n' + '(Group name was obtained from function documentation.)' + ).format(divider_hl_group, list_sep.join(r)), + problem_mark=divider_hl_group.mark, + ) + hadproblem = True + if check_hl_group_name(divider_hl_group, function_name.mark, context, echoerr): + hadproblem = True + + if hl_groups: + greg = re.compile(r'``([^`]+)``( \(gradient\))?') + parsed_hl_groups = [] + for line, mark_args, pointer in hl_groups: + for s in line.split(', '): + required_pack = [] + sub_pointer = pointer + for subs in s.split(' or '): + match = greg.match(subs) + try: + if not match: + continue + hl_group = MarkedUnicode( + match.group(1), + Mark(*mark_args, pointer=sub_pointer + match.start(1)) + ) + if check_hl_group_name(hl_group, function_name.mark, context, echoerr): + hadproblem = True + gradient = bool(match.group(2)) + required_pack.append((hl_group, gradient)) + finally: + sub_pointer += len(subs) + len(' or ') + parsed_hl_groups.append(required_pack) + pointer += len(s) + len(', ') + del hl_group, gradient + for required_pack in parsed_hl_groups: + rs = [ + hl_exists(hl_group, data, context, echoerr, allow_gradients=('force' if gradient else False)) + for hl_group, gradient in required_pack + ] + if all(rs): + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + problem=( + 'found highlight groups list ({0}) with all groups not defined in some colorschemes\n' + '(Group names were taken from function documentation.)' + ).format(list_sep.join((h[0] for h in required_pack))), + problem_mark=function_name.mark + ) + for r, h in zip(rs, required_pack): + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + problem='found highlight group {0} not defined in the following colorschemes: {1}'.format( + h[0], list_sep.join(r)) + ) + hadproblem = True + elif hl_groups is not None: + r = hl_exists(function_name, data, context, echoerr, allow_gradients=True) + if r: + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + problem=( + 'found highlight group {0} not defined in the following colorschemes: {1}\n' + '(If not specified otherwise in documentation, ' + 'highlight group for function segments\n' + 'is the same as the function name.)' + ).format(function_name, list_sep.join(r)), + problem_mark=function_name.mark + ) + hadproblem = True + + return True, False, hadproblem + elif context[-2][1].get('type') != 'segment_list': + if function_name not in context[0][1].get('segment_data', {}): + main_theme_name = data['main_config'].get('ext', {}).get(ext, {}).get('theme', None) + if data['theme'] == main_theme_name: + main_theme = {} + else: + main_theme = data['ext_theme_configs'].get(main_theme_name, {}) + if ( + function_name not in main_theme.get('segment_data', {}) + and function_name not in data['ext_theme_configs'].get('__main__', {}).get('segment_data', {}) + and not any(((function_name in theme.get('segment_data', {})) for theme in data['top_themes'].values())) + ): + echoerr(context='Error while checking segments (key {key})'.format(key=context.key), + problem='found useless use of name key (such name is not present in theme/segment_data)', + problem_mark=function_name.mark) + + return True, False, False + + +def hl_group_in_colorscheme(hl_group, cconfig, allow_gradients, data, context, echoerr): + havemarks(hl_group, cconfig) + if hl_group not in cconfig.get('groups', {}): + return False + elif not allow_gradients or allow_gradients == 'force': + group_config = cconfig['groups'][hl_group] + while isinstance(group_config, unicode): + try: + group_config = cconfig['groups'][group_config] + except KeyError: + # No such group. Error was already reported when checking + # colorschemes. + return True + havemarks(group_config) + hadgradient = False + for ckey in ('fg', 'bg'): + color = group_config.get(ckey) + if not color: + # No color. Error was already reported when checking + # colorschemes. + return True + havemarks(color) + # Gradients are only allowed for function segments. Note that + # whether *either* color or gradient exists should have been + # already checked + hascolor = color in data['colors_config'].get('colors', {}) + hasgradient = color in data['colors_config'].get('gradients', {}) + if hasgradient: + hadgradient = True + if allow_gradients is False and not hascolor and hasgradient: + echoerr( + context='Error while checking highlight group in theme (key {key})'.format( + key=context.key), + context_mark=hl_group.mark, + problem='group {0} is using gradient {1} instead of a color'.format(hl_group, color), + problem_mark=color.mark + ) + return False + if allow_gradients == 'force' and not hadgradient: + echoerr( + context='Error while checking highlight group in theme (key {key})'.format( + key=context.key), + context_mark=hl_group.mark, + problem='group {0} should have at least one gradient color, but it has no'.format(hl_group), + problem_mark=group_config.mark + ) + return False + return True + + +def hl_exists(hl_group, data, context, echoerr, allow_gradients=False): + havemarks(hl_group) + ext = data['ext'] + if ext not in data['colorscheme_configs']: + # No colorschemes. Error was already reported, no need to report it + # twice + return [] + r = [] + found = False + for colorscheme, cconfig in data['colorscheme_configs'][ext].items(): + if hl_group_in_colorscheme(hl_group, cconfig, allow_gradients, data, context, echoerr): + found = True + else: + r.append(colorscheme) + if not found: + pass + return r + + +def check_highlight_group(hl_group, data, context, echoerr): + havemarks(hl_group) + r = hl_exists(hl_group, data, context, echoerr) + if r: + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + problem='found highlight group {0} not defined in the following colorschemes: {1}'.format( + hl_group, list_sep.join(r)), + problem_mark=hl_group.mark + ) + return True, False, True + return True, False, False + + +def check_highlight_groups(hl_groups, data, context, echoerr): + havemarks(hl_groups) + rs = [hl_exists(hl_group, data, context, echoerr) for hl_group in hl_groups] + if all(rs): + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + problem='found highlight groups list ({0}) with all groups not defined in some colorschemes'.format( + list_sep.join((unicode(h) for h in hl_groups))), + problem_mark=hl_groups.mark + ) + for r, hl_group in zip(rs, hl_groups): + echoerr( + context='Error while checking theme (key {key})'.format(key=context.key), + problem='found highlight group {0} not defined in the following colorschemes: {1}'.format( + hl_group, list_sep.join(r)), + problem_mark=hl_group.mark + ) + return True, False, True + return True, False, False + + +def check_segment_data_key(key, data, context, echoerr): + havemarks(key) + has_module_name = '.' in key + found = False + for ext, theme in list_themes(data, context): + for segments in theme.get('segments', {}).values(): + for segment in segments: + if 'name' in segment: + if key == segment['name']: + found = True + break + else: + function_name = segment.get('function') + if function_name: + module, function_name = get_function_strings(function_name, ((None, theme),), ext) + if has_module_name: + full_name = module + '.' + function_name + if key == full_name: + found = True + break + else: + if key == function_name: + found = True + break + if found: + break + if found: + break + else: + if data['theme_type'] != 'top': + echoerr(context='Error while checking segment data', + problem='found key {0} that cannot be associated with any segment'.format(key), + problem_mark=key.mark) + return True, False, True + + return True, False, False + + +threaded_args_specs = { + 'interval': Spec().cmp('gt', 0.0), + 'update_first': Spec().type(bool), + 'shutdown_event': Spec().error('Shutdown event must be set by powerline'), +} + + +def check_args_variant(func, args, data, context, echoerr): + havemarks(args) + argspec = getconfigargspec(func) + present_args = set(args) + all_args = set(argspec.args) + required_args = set(argspec.args[:-len(argspec.defaults)]) + + hadproblem = False + + if required_args - present_args: + echoerr( + context='Error while checking segment arguments (key {key})'.format(key=context.key), + context_mark=args.mark, + problem='some of the required keys are missing: {0}'.format(list_sep.join(required_args - present_args)) + ) + hadproblem = True + + if not all_args >= present_args: + echoerr(context='Error while checking segment arguments (key {key})'.format(key=context.key), + context_mark=args.mark, + problem='found unknown keys: {0}'.format(list_sep.join(present_args - all_args)), + problem_mark=next(iter(present_args - all_args)).mark) + hadproblem = True + + if isinstance(func, ThreadedSegment): + for key in set(threaded_args_specs) & present_args: + proceed, khadproblem = threaded_args_specs[key].match( + args[key], + args.mark, + data, + context.enter_key(args, key), + echoerr + ) + if khadproblem: + hadproblem = True + if not proceed: + return hadproblem + + return hadproblem + + +def check_args(get_functions, args, data, context, echoerr): + new_echoerr = DelayedEchoErr(echoerr) + count = 0 + hadproblem = False + for func in get_functions(data, context, new_echoerr): + count += 1 + shadproblem = check_args_variant(func, args, data, context, echoerr) + if shadproblem: + hadproblem = True + + if not count: + hadproblem = True + if new_echoerr: + new_echoerr.echo_all() + else: + echoerr(context='Error while checking segment arguments (key {key})'.format(key=context.key), + context_mark=context[-2][1].mark, + problem='no suitable segments found') + + return True, False, hadproblem + + +def get_one_segment_function(data, context, echoerr): + ext = data['ext'] + function_name = context[-2][1].get('function') + if function_name: + module, function_name = get_function_strings(function_name, context, ext) + func = import_segment(function_name, data, context, echoerr, module=module) + if func: + yield func + + +common_names = defaultdict(set) + + +def register_common_name(name, cmodule, cname): + s = cmodule + '.' + cname + cmodule_mark = Mark('', 1, 1, s, 1) + cname_mark = Mark('', 1, len(cmodule) + 1, s, len(cmodule) + 1) + common_names[name].add((MarkedUnicode(cmodule, cmodule_mark), MarkedUnicode(cname, cname_mark))) + + +def get_all_possible_functions(data, context, echoerr): + name = context[-2][0] + module, name = name.rpartition('.')[::2] + if module: + func = import_segment(name, data, context, echoerr, module=module) + if func: + yield func + else: + if name in common_names: + for cmodule, cname in common_names[name]: + cfunc = import_segment(cname, data, context, echoerr, module=MarkedUnicode(cmodule, None)) + if cfunc: + yield cfunc + for ext, theme_config in list_themes(data, context): + for segments in theme_config.get('segments', {}).values(): + for segment in segments: + if segment.get('type', 'function') == 'function': + function_name = segment.get('function') + current_name = segment.get('name') + if function_name: + module, function_name = get_function_strings(function_name, ((None, theme_config),), ext) + if current_name == name or function_name == name: + func = import_segment(function_name, data, context, echoerr, module=module) + if func: + yield func + + +def check_exinclude_function(name, data, context, echoerr): + ext = data['ext'] + module, name = name.rpartition('.')[::2] + if not module: + module = MarkedUnicode('powerline.selectors.' + ext, None) + func = import_function('selector', name, data, context, echoerr, module=module) + if not func: + return True, False, True + return True, False, False + + +def check_log_file_level(this_level, data, context, echoerr): + '''Check handler level specified in :ref:`log_file key ` + + This level must be greater or equal to the level in :ref:`log_level key + `. + ''' + havemarks(this_level) + hadproblem = False + top_level = context[0][1].get('common', {}).get('log_level', 'WARNING') + top_level_str = top_level + top_level_mark = getattr(top_level, 'mark', None) + if ( + not isinstance(top_level, unicode) or not hasattr(logging, top_level) + or not isinstance(this_level, unicode) or not hasattr(logging, this_level) + ): + return True, False, hadproblem + top_level = getattr(logging, top_level) + this_level_str = this_level + this_level_mark = this_level.mark + this_level = getattr(logging, this_level) + if this_level < top_level: + echoerr( + context='Error while checking log level index (key {key})'.format( + key=context.key), + context_mark=this_level_mark, + problem='found level that is less critical then top level ({0} < {0})'.format( + this_level_str, top_level_str), + problem_mark=top_level_mark, + ) + hadproblem = True + return True, False, hadproblem + + +def check_logging_handler(handler_name, data, context, echoerr): + havemarks(handler_name) + import_paths = [os.path.expanduser(path) for path in context[0][1].get('common', {}).get('paths', [])] + + handler_module, separator, handler_class = handler_name.rpartition('.') + if not separator: + handler_module = 'logging.handlers' + handler_class = handler_name + with WithPath(import_paths): + try: + handler = getattr(__import__(str(handler_module), fromlist=[str(handler_class)]), str(handler_class)) + except ImportError: + echoerr(context='Error while loading logger class (key {key})'.format(key=context.key), + problem='failed to load module {0}'.format(handler_module), + problem_mark=handler_name.mark) + return True, False, True + except AttributeError: + echoerr(context='Error while loading logger class (key {key})'.format(key=context.key), + problem='failed to load handler class {0}'.format(handler_class), + problem_mark=handler_name.mark) + return True, False, True + + if not issubclass(handler, logging.Handler): + echoerr(context='Error while loading logger class (key {key})'.format(key=context.key), + problem='loaded class {0} is not a logging.Handler subclass'.format(handler_class), + problem_mark=handler_name.mark) + return True, False, True + + return True, False, False diff --git a/powerline-bin/powerline/lint/context.py b/powerline-bin/powerline/lint/context.py new file mode 100644 index 0000000..a48a283 --- /dev/null +++ b/powerline-bin/powerline/lint/context.py @@ -0,0 +1,68 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import itertools + +from powerline.lib.unicode import unicode +from powerline.lint.markedjson.markedvalue import MarkedUnicode +from powerline.lint.selfcheck import havemarks + + +class JStr(unicode): + def join(self, iterable): + return super(JStr, self).join((unicode(item) for item in iterable)) + + +key_sep = JStr('/') + + +def list_themes(data, context): + theme_type = data['theme_type'] + ext = data['ext'] + main_theme_name = data['main_config'].get('ext', {}).get(ext, {}).get('theme', None) + is_main_theme = (data['theme'] == main_theme_name) + if theme_type == 'top': + return list(itertools.chain(*[ + [(theme_ext, theme) for theme in theme_configs.values()] + for theme_ext, theme_configs in data['theme_configs'].items() + ])) + elif theme_type == 'main' or is_main_theme: + return [(ext, theme) for theme in data['ext_theme_configs'].values()] + else: + return [(ext, context[0][1])] + + +class Context(tuple): + for func in dir(tuple): + if func in ('__getitem__', '__init__', '__getattribute__', '__len__', '__iter__'): + continue + exec(( + 'def {0}(self, *args, **kwargs):\n' + ' raise TypeError("{0} is not allowed for Context")' + ).format(func)) + del func + + __slots__ = () + + def __new__(cls, base, context_key=None, context_value=None): + if context_key is not None: + assert(context_value is not None) + assert(type(base) is Context) + havemarks(context_key, context_value) + return tuple.__new__(cls, tuple.__add__(base, ((context_key, context_value),))) + else: + havemarks(base) + return tuple.__new__(cls, ((MarkedUnicode('', base.mark), base),)) + + @property + def key(self): + return key_sep.join((c[0] for c in self)) + + def enter_key(self, value, key): + return self.enter(value.keydict[key], value[key]) + + def enter_item(self, name, item): + return self.enter(MarkedUnicode(name, item.mark), item) + + def enter(self, context_key, context_value): + return Context.__new__(Context, self, context_key, context_value) diff --git a/powerline-bin/powerline/lint/imp.py b/powerline-bin/powerline/lint/imp.py new file mode 100644 index 0000000..399654e --- /dev/null +++ b/powerline-bin/powerline/lint/imp.py @@ -0,0 +1,56 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys + +from powerline.lint.selfcheck import havemarks + + +class WithPath(object): + def __init__(self, import_paths): + self.import_paths = import_paths + + def __enter__(self): + self.oldpath = sys.path + sys.path = self.import_paths + sys.path + + def __exit__(self, *args): + sys.path = self.oldpath + + +def import_function(function_type, name, data, context, echoerr, module): + havemarks(name, module) + + if module == 'powerline.segments.i3wm' and name == 'workspaces': + echoerr(context='Warning while checking segments (key {key})'.format(key=context.key), + context_mark=name.mark, + problem='segment {0} from {1} is deprecated'.format(name, module), + problem_mark=module.mark) + + with WithPath(data['import_paths']): + try: + func = getattr(__import__(str(module), fromlist=[str(name)]), str(name)) + except ImportError: + echoerr(context='Error while checking segments (key {key})'.format(key=context.key), + context_mark=name.mark, + problem='failed to import module {0}'.format(module), + problem_mark=module.mark) + return None + except AttributeError: + echoerr(context='Error while loading {0} function (key {key})'.format(function_type, key=context.key), + problem='failed to load function {0} from module {1}'.format(name, module), + problem_mark=name.mark) + return None + + if not callable(func): + echoerr(context='Error while checking segments (key {key})'.format(key=context.key), + context_mark=name.mark, + problem='imported “function” {0} from module {1} is not callable'.format(name, module), + problem_mark=module.mark) + return None + + return func + + +def import_segment(*args, **kwargs): + return import_function('segment', *args, **kwargs) diff --git a/powerline-bin/powerline/lint/inspect.py b/powerline-bin/powerline/lint/inspect.py new file mode 100644 index 0000000..15bb610 --- /dev/null +++ b/powerline-bin/powerline/lint/inspect.py @@ -0,0 +1,63 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from inspect import ArgSpec, getargspec + +from powerline.segments import Segment + + +def getconfigargspec(obj): + if hasattr(obj, 'powerline_origin'): + obj = obj.powerline_origin + else: + obj = obj + + args = [] + defaults = [] + + if isinstance(obj, Segment): + additional_args = obj.additional_args() + argspecobjs = obj.argspecobjs() + get_omitted_args = obj.omitted_args + else: + additional_args = () + argspecobjs = ((None, obj),) + get_omitted_args = lambda *args: () + + for arg in additional_args: + args.append(arg[0]) + if len(arg) > 1: + defaults.append(arg[1]) + + requires_segment_info = hasattr(obj, 'powerline_requires_segment_info') + requires_filesystem_watcher = hasattr(obj, 'powerline_requires_filesystem_watcher') + + for name, method in argspecobjs: + argspec = getargspec(method) + omitted_args = get_omitted_args(name, method) + largs = len(argspec.args) + for i, arg in enumerate(reversed(argspec.args)): + if ( + largs - (i + 1) in omitted_args + or arg in omitted_args + or arg == 'pl' + or arg == 'self' + or (arg == 'create_watcher' and requires_filesystem_watcher) + or (arg == 'segment_info' and requires_segment_info) + ): + continue + if argspec.defaults and len(argspec.defaults) > i: + if arg in args: + idx = args.index(arg) + if len(args) - idx > len(defaults): + args.pop(idx) + else: + continue + default = argspec.defaults[-(i + 1)] + defaults.append(default) + args.append(arg) + else: + if arg not in args: + args.insert(0, arg) + + return ArgSpec(args=args, varargs=None, keywords=None, defaults=tuple(defaults)) diff --git a/powerline-bin/powerline/lint/markedjson/__init__.py b/powerline-bin/powerline/lint/markedjson/__init__.py new file mode 100644 index 0000000..dea5faf --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/__init__.py @@ -0,0 +1,19 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lint.markedjson.loader import Loader + + +def load(stream, Loader=Loader): + '''Parse JSON value and produce the corresponding Python object + + :return: + (hadproblem, object) where first argument is true if there were errors + during loading JSON stream and second is the corresponding JSON object. + ''' + loader = Loader(stream) + try: + r = loader.get_single_data() + return r, loader.haserrors + finally: + loader.dispose() diff --git a/powerline-bin/powerline/lint/markedjson/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/lint/markedjson/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21707efd0080e2fdcc949c90bddc615d66492db8 GIT binary patch literal 971 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/markedjson/__pycache__/constructor.cpython-312.pyc b/powerline-bin/powerline/lint/markedjson/__pycache__/constructor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41267f7e01856cfa4677dbea4654b80d07d090cb GIT binary patch literal 13186 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/markedjson/__pycache__/loader.cpython-312.pyc b/powerline-bin/powerline/lint/markedjson/__pycache__/loader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3df245a01f51555d5677d1d4a3ea62d7239faa8 GIT binary patch literal 1670 zcma)6&2Jk;6rUM8>-A?+8xpqy)u4jdLv5tCsVV`NB6>j)DiKu6VYS^I*W1p1FgtE> zw1B=-N#AD(Up9&IEn}*D0VZknhMY~AR&csq^*oM{%q7<68 zsr8~LhZVb`^(9daYj#cRhNy=PyP@@xSPob06|I}%RM@nelrVCQ_~k9)SGd7VUg0&~ z;49l^UYgw+Rjt||xUh=Z$}kGN*yoN26ql|@Gt&?525AsS*|K{xjm1!LCkT^Rs;rU7 zAW}|$73lJ3gYuYgVpE^k%%@w#F8B;&aa4dE81Kheg2xU87eR-CkQsCaV%0$| za{Dl99xx_jx;?j3qLvQw{6BVko(qtr6C=wfMpjRZte+I=(=l-twT_6zHr}&LiI&WC zoFEF6<49zO#5yH1S7IHq1|lmDTo|B?Woogkm~zq2445N#!xWp=={&#IQ(@9eg52ngd&x)*;;5Iz_qY^6#K9P;Ug*j@+`pZIN9g%=laV|H`R*_0 z^Xwi})&OJr35W+|kC|We9`+{Zo)}Yhc8`^JS#yUqCl{xzz3@%h+8(Ryvepi3P2Qcd z(|fGG%T{;T>O@W1OaJvfZM7eq`@B1Y^u$}R1Qy7GWq4OZ4H|ATOAA>cprK=!t$K^*C ze`IGS>p!tGPg`qPtVGv_wS>cq+>kp?R&ks#_J;!Xn&W&rbVcsbE!98yhUmEbuedXb z0)L<4n77EEti(>wnvAt`Ai6iK7ch5!sD=`9ODtXD;gZ-NX@JN&i^+CzvfY0t+Xa%q z$;_Gd%F(bizd1Aok4u;6YekbZd-dpa-u%wdM9yA24!F3GG~bU)D(AOVekRTyom3x{ zoC3PbFJq%{V!HFs&A0MFy(3=-8*(RI2l1>xDgB*n{!BK1BNz6`rG1o__sQE@UiizX Z(e|T{CLcfPe>M2F`rVDc2^e(Ve*m(Hh>rjO literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/markedjson/__pycache__/markedvalue.cpython-312.pyc b/powerline-bin/powerline/lint/markedjson/__pycache__/markedvalue.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97e5542545de77666f342a05f8ef03165cf330aa GIT binary patch literal 8021 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 D(o#AW literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/markedjson/__pycache__/nodes.cpython-312.pyc b/powerline-bin/powerline/lint/markedjson/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20ba55f0d553b4cb2b4b5c491811f7d5c9d8f912 GIT binary patch literal 2320 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 WQ=aEodsHtCw%tsb4FZM0fyqasBI?YIS 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 IVS46&0Nhg>ga7~l literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/markedjson/__pycache__/scanner.cpython-312.pyc b/powerline-bin/powerline/lint/markedjson/__pycache__/scanner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..581067a9f1278e60d258a08a064397470f448e74 GIT binary patch literal 17136 zcmdr!YiwKBdH2CL#fK#7Em_plqGd^bMUEXiZsJI>lUR9J@oFUwOY2@)lqgcUq#TQ- zFe-6tdp2OY$zWy8P^Aq}87WW?`_U8|&=eci4joWkQwG^Pug$g=Mg9zm9H4{#Y~Oe8 zgXGnf91m-Y?ZEzc?|Gl^JKyu1tDm`C4hoX%=l?u*bw5S@JHDvNtUTQRHay&~&*q48s%)fe$~EGe za*w!ailKN9Z~2gxM;Y-l)YBAaxkzzV-u5A@CW2!# z(a{7{2+)#!oWH<@&xI3lcyXQx36nfGAP6x5UM-2(Bp;0jSjnmkB3bZZT#y>#Gf?SV z2)dpQg@s@u791T9387J#!>BxU87eEL?w7&)O^T;RXpS0TX6XPUm7N?7MWehx#v6iR zY{6hOG{pylk|P+Lig7a$d@c(HU!Ms@-IE9j=lDcV|0CnO zruSbs&=(1x?VFxWjK`vV)3G;rArg-AkQq(%O_9}2#GxcEkK8*wE4ZOM0-E6=j{D#u zm8Z=@rJ8TNo(d=~tcRm7QX}jv1B z8HF7%6_rf5`hZ0;#repXPzOB-^#~deG$LpM5XUL|NfLbUh$IO|!--%pS)r|~SIz6d z7M%dnRKB`3-M+$9<~_c2`^6o3cLn?e^4@Cr=_YSq3lNkJ1x$hmnh0J5

b*0^(D~ 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/lint/markedjson/composer.py b/powerline-bin/powerline/lint/markedjson/composer.py new file mode 100644 index 0000000..bd5620d --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/composer.py @@ -0,0 +1,119 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lint.markedjson import nodes +from powerline.lint.markedjson import events +from powerline.lint.markedjson.error import MarkedError + + +__all__ = ['Composer', 'ComposerError'] + + +class ComposerError(MarkedError): + pass + + +class Composer: + def __init__(self): + pass + + def check_node(self): + # Drop the STREAM-START event. + if self.check_event(events.StreamStartEvent): + self.get_event() + + # If there are more documents available? + return not self.check_event(events.StreamEndEvent) + + def get_node(self): + # Get the root node of the next document. + if not self.check_event(events.StreamEndEvent): + return self.compose_document() + + def get_single_node(self): + # Drop the STREAM-START event. + self.get_event() + + # Compose a document if the stream is not empty. + document = None + if not self.check_event(events.StreamEndEvent): + document = self.compose_document() + + # Ensure that the stream contains no more documents. + if not self.check_event(events.StreamEndEvent): + event = self.get_event() + raise ComposerError( + 'expected a single document in the stream', + document.start_mark, + 'but found another document', + event.start_mark + ) + + # Drop the STREAM-END event. + self.get_event() + + return document + + def compose_document(self): + # Drop the DOCUMENT-START event. + self.get_event() + + # Compose the root node. + node = self.compose_node(None, None) + + # Drop the DOCUMENT-END event. + self.get_event() + + return node + + def compose_node(self, parent, index): + self.descend_resolver(parent, index) + if self.check_event(events.ScalarEvent): + node = self.compose_scalar_node() + elif self.check_event(events.SequenceStartEvent): + node = self.compose_sequence_node() + elif self.check_event(events.MappingStartEvent): + node = self.compose_mapping_node() + self.ascend_resolver() + return node + + def compose_scalar_node(self): + event = self.get_event() + tag = event.tag + if tag is None or tag == '!': + tag = self.resolve(nodes.ScalarNode, event.value, event.implicit, event.start_mark) + node = nodes.ScalarNode(tag, event.value, event.start_mark, event.end_mark, style=event.style) + return node + + def compose_sequence_node(self): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(nodes.SequenceNode, None, start_event.implicit) + node = nodes.SequenceNode(tag, [], start_event.start_mark, None, flow_style=start_event.flow_style) + index = 0 + while not self.check_event(events.SequenceEndEvent): + node.value.append(self.compose_node(node, index)) + index += 1 + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + + def compose_mapping_node(self): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(nodes.MappingNode, None, start_event.implicit) + node = nodes.MappingNode(tag, [], start_event.start_mark, None, flow_style=start_event.flow_style) + while not self.check_event(events.MappingEndEvent): + # key_event = self.peek_event() + item_key = self.compose_node(node, None) + # if item_key in node.value: + # raise ComposerError('while composing a mapping', start_event.start_mark, + # 'found duplicate key', key_event.start_mark) + item_value = self.compose_node(node, item_key) + # node.value[item_key] = item_value + node.value.append((item_key, item_value)) + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node diff --git a/powerline-bin/powerline/lint/markedjson/constructor.py b/powerline-bin/powerline/lint/markedjson/constructor.py new file mode 100644 index 0000000..2a95d84 --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/constructor.py @@ -0,0 +1,285 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import collections +import types + +from functools import wraps + +from powerline.lint.markedjson.error import MarkedError + +from powerline.lint.markedjson import nodes +from powerline.lint.markedjson.markedvalue import gen_marked_value +from powerline.lib.unicode import unicode + + +def marked(func): + @wraps(func) + def f(self, node, *args, **kwargs): + return gen_marked_value(func(self, node, *args, **kwargs), node.start_mark) + return f + + +class ConstructorError(MarkedError): + pass + + +class BaseConstructor: + yaml_constructors = {} + + def __init__(self): + self.constructed_objects = {} + self.state_generators = [] + self.deep_construct = False + + def check_data(self): + # If there are more documents available? + return self.check_node() + + def get_data(self): + # Construct and return the next document. + if self.check_node(): + return self.construct_document(self.get_node()) + + def get_single_data(self): + # Ensure that the stream contains a single document and construct it. + node = self.get_single_node() + if node is not None: + return self.construct_document(node) + return None + + def construct_document(self, node): + data = self.construct_object(node) + while self.state_generators: + state_generators = self.state_generators + self.state_generators = [] + for generator in state_generators: + for dummy in generator: + pass + self.constructed_objects = {} + self.deep_construct = False + return data + + def construct_object(self, node, deep=False): + if node in self.constructed_objects: + return self.constructed_objects[node] + if deep: + old_deep = self.deep_construct + self.deep_construct = True + constructor = None + tag_suffix = None + if node.tag in self.yaml_constructors: + constructor = self.yaml_constructors[node.tag] + else: + raise ConstructorError(None, None, 'no constructor for tag %s' % node.tag) + if tag_suffix is None: + data = constructor(self, node) + else: + data = constructor(self, tag_suffix, node) + if isinstance(data, types.GeneratorType): + generator = data + data = next(generator) + if self.deep_construct: + for dummy in generator: + pass + else: + self.state_generators.append(generator) + self.constructed_objects[node] = data + if deep: + self.deep_construct = old_deep + return data + + @marked + def construct_scalar(self, node): + if not isinstance(node, nodes.ScalarNode): + raise ConstructorError( + None, None, + 'expected a scalar node, but found %s' % node.id, + node.start_mark + ) + return node.value + + def construct_sequence(self, node, deep=False): + if not isinstance(node, nodes.SequenceNode): + raise ConstructorError( + None, None, + 'expected a sequence node, but found %s' % node.id, + node.start_mark + ) + return [ + self.construct_object(child, deep=deep) + for child in node.value + ] + + @marked + def construct_mapping(self, node, deep=False): + if not isinstance(node, nodes.MappingNode): + raise ConstructorError( + None, None, + 'expected a mapping node, but found %s' % node.id, + node.start_mark + ) + mapping = {} + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + if not isinstance(key, collections.Hashable): + self.echoerr( + 'While constructing a mapping', node.start_mark, + 'found unhashable key', key_node.start_mark + ) + continue + elif type(key.value) != unicode: + self.echoerr( + 'Error while constructing a mapping', node.start_mark, + 'found key that is not a string', key_node.start_mark + ) + continue + elif key in mapping: + self.echoerr( + 'Error while constructing a mapping', node.start_mark, + 'found duplicate key', key_node.start_mark + ) + continue + value = self.construct_object(value_node, deep=deep) + mapping[key] = value + return mapping + + @classmethod + def add_constructor(cls, tag, constructor): + if 'yaml_constructors' not in cls.__dict__: + cls.yaml_constructors = cls.yaml_constructors.copy() + cls.yaml_constructors[tag] = constructor + + +class Constructor(BaseConstructor): + def construct_scalar(self, node): + if isinstance(node, nodes.MappingNode): + for key_node, value_node in node.value: + if key_node.tag == 'tag:yaml.org,2002:value': + return self.construct_scalar(value_node) + return BaseConstructor.construct_scalar(self, node) + + def flatten_mapping(self, node): + merge = [] + index = 0 + while index < len(node.value): + key_node, value_node = node.value[index] + if key_node.tag == 'tag:yaml.org,2002:merge': + del node.value[index] + if isinstance(value_node, nodes.MappingNode): + self.flatten_mapping(value_node) + merge.extend(value_node.value) + elif isinstance(value_node, nodes.SequenceNode): + submerge = [] + for subnode in value_node.value: + if not isinstance(subnode, nodes.MappingNode): + raise ConstructorError( + 'while constructing a mapping', + node.start_mark, + 'expected a mapping for merging, but found %s' % subnode.id, + subnode.start_mark + ) + self.flatten_mapping(subnode) + submerge.append(subnode.value) + submerge.reverse() + for value in submerge: + merge.extend(value) + else: + raise ConstructorError( + 'while constructing a mapping', + node.start_mark, + ('expected a mapping or list of mappings for merging, but found %s' % value_node.id), + value_node.start_mark + ) + elif key_node.tag == 'tag:yaml.org,2002:value': + key_node.tag = 'tag:yaml.org,2002:str' + index += 1 + else: + index += 1 + if merge: + node.value = merge + node.value + + def construct_mapping(self, node, deep=False): + if isinstance(node, nodes.MappingNode): + self.flatten_mapping(node) + return BaseConstructor.construct_mapping(self, node, deep=deep) + + @marked + def construct_yaml_null(self, node): + self.construct_scalar(node) + return None + + @marked + def construct_yaml_bool(self, node): + value = self.construct_scalar(node).value + return bool(value) + + @marked + def construct_yaml_int(self, node): + value = self.construct_scalar(node).value + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '0': + return 0 + else: + return sign * int(value) + + @marked + def construct_yaml_float(self, node): + value = self.construct_scalar(node).value + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + else: + return sign * float(value) + + def construct_yaml_str(self, node): + return self.construct_scalar(node) + + def construct_yaml_seq(self, node): + data = gen_marked_value([], node.start_mark) + yield data + data.extend(self.construct_sequence(node)) + + def construct_yaml_map(self, node): + data = gen_marked_value({}, node.start_mark) + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_undefined(self, node): + raise ConstructorError( + None, None, + 'could not determine a constructor for the tag %r' % node.tag, + node.start_mark + ) + + +Constructor.add_constructor( + 'tag:yaml.org,2002:null', Constructor.construct_yaml_null) + +Constructor.add_constructor( + 'tag:yaml.org,2002:bool', Constructor.construct_yaml_bool) + +Constructor.add_constructor( + 'tag:yaml.org,2002:int', Constructor.construct_yaml_int) + +Constructor.add_constructor( + 'tag:yaml.org,2002:float', Constructor.construct_yaml_float) + +Constructor.add_constructor( + 'tag:yaml.org,2002:str', Constructor.construct_yaml_str) + +Constructor.add_constructor( + 'tag:yaml.org,2002:seq', Constructor.construct_yaml_seq) + +Constructor.add_constructor( + 'tag:yaml.org,2002:map', Constructor.construct_yaml_map) + +Constructor.add_constructor( + None, Constructor.construct_undefined) diff --git a/powerline-bin/powerline/lint/markedjson/error.py b/powerline-bin/powerline/lint/markedjson/error.py new file mode 100644 index 0000000..732120b --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/error.py @@ -0,0 +1,241 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import re + +from powerline.lib.encoding import get_preferred_output_encoding + + +NON_PRINTABLE_STR = ( + '[^' + # ASCII control characters: 0x00-0x19 + + '\t\n' # Tab, newline: allowed ASCII control characters + + '\x20-\x7E' # ASCII printable characters + # Unicode control characters: 0x7F-0x9F + + '\u0085' # Allowed unicode control character: next line character + + '\u00A0-\uD7FF' + # Surrogate escapes: 0xD800-0xDFFF + + '\uE000-\uFFFD' + + (( + '\uD800-\uDFFF' + ) if sys.maxunicode < 0x10FFFF else ( + '\U00010000-\U0010FFFF' + )) + + ']' + + (( + # Paired surrogate escapes: allowed in UCS-2 builds as the only way to + # represent characters above 0xFFFF. Only paired variant is allowed. + '|(?' % ord(s.group()) + + +def strtrans(s): + return NON_PRINTABLE_RE.sub(repl, s.replace('\t', '>---')) + + +class Mark: + def __init__(self, name, line, column, buffer, pointer, old_mark=None, merged_marks=None): + self.name = name + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + self.old_mark = old_mark + self.merged_marks = merged_marks or [] + + def copy(self): + return Mark(self.name, self.line, self.column, self.buffer, self.pointer, self.old_mark, self.merged_marks[:]) + + def get_snippet(self, indent=4, max_length=75): + if self.buffer is None: + return None + head = '' + start = self.pointer + while start > 0 and self.buffer[start - 1] not in '\0\n': + start -= 1 + if self.pointer - start > max_length / 2 - 1: + head = ' ... ' + start += 5 + break + tail = '' + end = self.pointer + while end < len(self.buffer) and self.buffer[end] not in '\0\n': + end += 1 + if end - self.pointer > max_length / 2 - 1: + tail = ' ... ' + end -= 5 + break + snippet = [self.buffer[start:self.pointer], self.buffer[self.pointer], self.buffer[self.pointer + 1:end]] + snippet = [strtrans(s) for s in snippet] + return ( + ' ' * indent + head + ''.join(snippet) + tail + '\n' + + ' ' * (indent + len(head) + len(snippet[0])) + '^' + ) + + def advance_string(self, diff): + ret = self.copy() + # FIXME Currently does not work properly with escaped strings. + ret.column += diff + ret.pointer += diff + return ret + + def set_old_mark(self, old_mark): + if self is old_mark: + return + checked_marks = set([id(self)]) + older_mark = old_mark + while True: + if id(older_mark) in checked_marks: + raise ValueError('Trying to set recursive marks') + checked_marks.add(id(older_mark)) + older_mark = older_mark.old_mark + if not older_mark: + break + self.old_mark = old_mark + + def set_merged_mark(self, merged_mark): + self.merged_marks.append(merged_mark) + + def to_string(self, indent=0, head_text='in ', add_snippet=True): + mark = self + where = '' + processed_marks = set() + while mark: + indentstr = ' ' * indent + where += ('%s %s"%s", line %d, column %d' % ( + indentstr, head_text, mark.name, mark.line + 1, mark.column + 1)) + if add_snippet: + snippet = mark.get_snippet(indent=(indent + 4)) + if snippet: + where += ':\n' + snippet + if mark.merged_marks: + where += '\n' + indentstr + ' with additionally merged\n' + where += mark.merged_marks[0].to_string(indent + 4, head_text='', add_snippet=False) + for mmark in mark.merged_marks[1:]: + where += '\n' + indentstr + ' and\n' + where += mmark.to_string(indent + 4, head_text='', add_snippet=False) + if add_snippet: + processed_marks.add(id(mark)) + if mark.old_mark: + where += '\n' + indentstr + ' which replaced value\n' + indent += 4 + mark = mark.old_mark + if id(mark) in processed_marks: + raise ValueError('Trying to dump recursive mark') + return where + + if sys.version_info < (3,): + def __str__(self): + return self.to_string().encode('utf-8') + + def __unicode__(self): + return self.to_string() + else: + def __str__(self): + return self.to_string() + + def __eq__(self, other): + return self is other or ( + self.name == other.name + and self.line == other.line + and self.column == other.column + ) + + +if sys.version_info < (3,): + def echoerr(**kwargs): + stream = kwargs.pop('stream', sys.stderr) + stream.write('\n') + stream.write((format_error(**kwargs) + '\n').encode(get_preferred_output_encoding())) +else: + def echoerr(**kwargs): + stream = kwargs.pop('stream', sys.stderr) + stream.write('\n') + stream.write(format_error(**kwargs) + '\n') + + +def format_error(context=None, context_mark=None, problem=None, problem_mark=None, note=None, indent=0): + lines = [] + indentstr = ' ' * indent + if context is not None: + lines.append(indentstr + context) + if ( + context_mark is not None + and ( + problem is None or problem_mark is None + or context_mark != problem_mark + ) + ): + lines.append(context_mark.to_string(indent=indent)) + if problem is not None: + lines.append(indentstr + problem) + if problem_mark is not None: + lines.append(problem_mark.to_string(indent=indent)) + if note is not None: + lines.append(indentstr + note) + return '\n'.join(lines) + + +class MarkedError(Exception): + def __init__(self, context=None, context_mark=None, problem=None, problem_mark=None, note=None): + Exception.__init__(self, format_error(context, context_mark, problem, problem_mark, note)) + + +class EchoErr(object): + __slots__ = ('echoerr', 'logger', 'indent') + + def __init__(self, echoerr, logger, indent=0): + self.echoerr = echoerr + self.logger = logger + self.indent = indent + + def __call__(self, **kwargs): + kwargs = kwargs.copy() + kwargs.setdefault('indent', self.indent) + self.echoerr(**kwargs) + + +class DelayedEchoErr(EchoErr): + __slots__ = ('echoerr', 'logger', 'errs', 'message', 'separator_message', 'indent', 'indent_shift') + + def __init__(self, echoerr, message='', separator_message=''): + super(DelayedEchoErr, self).__init__(echoerr, echoerr.logger) + self.errs = [[]] + self.message = message + self.separator_message = separator_message + self.indent_shift = (4 if message or separator_message else 0) + self.indent = echoerr.indent + self.indent_shift + + def __call__(self, **kwargs): + kwargs = kwargs.copy() + kwargs['indent'] = kwargs.get('indent', 0) + self.indent + self.errs[-1].append(kwargs) + + def next_variant(self): + self.errs.append([]) + + def echo_all(self): + if self.message: + self.echoerr(problem=self.message, indent=(self.indent - self.indent_shift)) + for variant in self.errs: + if not variant: + continue + if self.separator_message and variant is not self.errs[0]: + self.echoerr(problem=self.separator_message, indent=(self.indent - self.indent_shift)) + for kwargs in variant: + self.echoerr(**kwargs) + + def __nonzero__(self): + return not not self.errs + + __bool__ = __nonzero__ diff --git a/powerline-bin/powerline/lint/markedjson/events.py b/powerline-bin/powerline/lint/markedjson/events.py new file mode 100644 index 0000000..ef8a70e --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/events.py @@ -0,0 +1,97 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + + +# Abstract classes. +class Event(object): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + + def __repr__(self): + attributes = [ + key for key in ['implicit', 'value'] + if hasattr(self, key) + ] + arguments = ', '.join([ + '%s=%r' % (key, getattr(self, key)) + for key in attributes + ]) + return '%s(%s)' % (self.__class__.__name__, arguments) + + +class NodeEvent(Event): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + + +class CollectionStartEvent(NodeEvent): + def __init__(self, implicit, start_mark=None, end_mark=None, flow_style=None): + self.tag = None + self.implicit = implicit + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + + +class CollectionEndEvent(Event): + pass + + +# Implementations. +class StreamStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + + +class StreamEndEvent(Event): + pass + + +class DocumentStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, explicit=None, version=None, tags=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + self.version = version + self.tags = tags + + +class DocumentEndEvent(Event): + def __init__(self, start_mark=None, end_mark=None, explicit=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + + +class AliasEvent(NodeEvent): + pass + + +class ScalarEvent(NodeEvent): + def __init__(self, implicit, value, start_mark=None, end_mark=None, style=None): + self.tag = None + self.implicit = implicit + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + + +class SequenceStartEvent(CollectionStartEvent): + pass + + +class SequenceEndEvent(CollectionEndEvent): + pass + + +class MappingStartEvent(CollectionStartEvent): + pass + + +class MappingEndEvent(CollectionEndEvent): + pass diff --git a/powerline-bin/powerline/lint/markedjson/loader.py b/powerline-bin/powerline/lint/markedjson/loader.py new file mode 100644 index 0000000..3ee5686 --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/loader.py @@ -0,0 +1,25 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lint.markedjson.reader import Reader +from powerline.lint.markedjson.scanner import Scanner +from powerline.lint.markedjson.parser import Parser +from powerline.lint.markedjson.composer import Composer +from powerline.lint.markedjson.constructor import Constructor +from powerline.lint.markedjson.resolver import Resolver +from powerline.lint.markedjson.error import echoerr + + +class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) + self.haserrors = False + + def echoerr(self, *args, **kwargs): + echoerr(*args, **kwargs) + self.haserrors = True diff --git a/powerline-bin/powerline/lint/markedjson/markedvalue.py b/powerline-bin/powerline/lint/markedjson/markedvalue.py new file mode 100644 index 0000000..3b8db3e --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/markedvalue.py @@ -0,0 +1,151 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lib.unicode import unicode + + +def gen_new(cls): + def __new__(arg_cls, value, mark): + r = super(arg_cls, arg_cls).__new__(arg_cls, value) + r.mark = mark + r.value = value + return r + return __new__ + + +def gen_init(cls): + def __init__(self, value, mark): + return cls.__init__(self, value) + return __init__ + + +def gen_getnewargs(cls): + def __getnewargs__(self): + return (self.value, self.mark) + return __getnewargs__ + + +class MarkedUnicode(unicode): + __new__ = gen_new(unicode) + __getnewargs__ = gen_getnewargs(unicode) + + def _proc_partition(self, part_result): + pointdiff = 1 + r = [] + for s in part_result: + r.append(MarkedUnicode(s, self.mark.advance_string(pointdiff))) + pointdiff += len(s) + return tuple(r) + + def rpartition(self, sep): + return self._proc_partition(super(MarkedUnicode, self).rpartition(sep)) + + def partition(self, sep): + return self._proc_partition(super(MarkedUnicode, self).partition(sep)) + + +class MarkedInt(int): + __new__ = gen_new(int) + __getnewargs__ = gen_getnewargs(int) + + +class MarkedFloat(float): + __new__ = gen_new(float) + __getnewargs__ = gen_getnewargs(float) + + +class MarkedDict(dict): + __init__ = gen_init(dict) + __getnewargs__ = gen_getnewargs(dict) + + def __new__(arg_cls, value, mark): + r = super(arg_cls, arg_cls).__new__(arg_cls, value) + r.mark = mark + r.value = value + r.keydict = dict(((key, key) for key in r)) + return r + + def setmerged(self, d): + try: + self.mark.set_merged_mark(d.mark) + except AttributeError: + pass + + def __setitem__(self, key, value): + try: + old_value = self[key] + except KeyError: + pass + else: + try: + key.mark.set_old_mark(self.keydict[key].mark) + except AttributeError: + pass + except KeyError: + pass + try: + value.mark.set_old_mark(old_value.mark) + except AttributeError: + pass + dict.__setitem__(self, key, value) + self.keydict[key] = key + + def update(self, *args, **kwargs): + dict.update(self, *args, **kwargs) + self.keydict = dict(((key, key) for key in self)) + + def copy(self): + return MarkedDict(super(MarkedDict, self).copy(), self.mark) + + +class MarkedList(list): + __new__ = gen_new(list) + __init__ = gen_init(list) + __getnewargs__ = gen_getnewargs(list) + + +class MarkedValue: + def __init__(self, value, mark): + self.mark = mark + self.value = value + + __getinitargs__ = gen_getnewargs(None) + + +specialclasses = { + unicode: MarkedUnicode, + int: MarkedInt, + float: MarkedFloat, + dict: MarkedDict, + list: MarkedList, +} + +classcache = {} + + +def gen_marked_value(value, mark, use_special_classes=True): + if use_special_classes and value.__class__ in specialclasses: + Marked = specialclasses[value.__class__] + elif value.__class__ in classcache: + Marked = classcache[value.__class__] + else: + class Marked(MarkedValue): + for func in value.__class__.__dict__: + if func == 'copy': + def copy(self): + return self.__class__(self.value.copy(), self.mark) + elif func not in set(('__init__', '__new__', '__getattribute__')): + if func in set(('__eq__',)): + # HACK to make marked dictionaries always work + exec (( + 'def {0}(self, *args):\n' + ' return self.value.{0}(*[arg.value if isinstance(arg, MarkedValue) else arg for arg in args])' + ).format(func)) + else: + exec (( + 'def {0}(self, *args, **kwargs):\n' + ' return self.value.{0}(*args, **kwargs)\n' + ).format(func)) + classcache[value.__class__] = Marked + + return Marked(value, mark) diff --git a/powerline-bin/powerline/lint/markedjson/nodes.py b/powerline-bin/powerline/lint/markedjson/nodes.py new file mode 100644 index 0000000..66ad843 --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/nodes.py @@ -0,0 +1,55 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + + +class Node(object): + def __init__(self, tag, value, start_mark, end_mark): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + + def __repr__(self): + value = self.value + # if isinstance(value, list): + # if len(value) == 0: + # value = '' + # elif len(value) == 1: + # value = '<1 item>' + # else: + # value = '<%d items>' % len(value) + # else: + # if len(value) > 75: + # value = repr(value[:70]+u' ... ') + # else: + # value = repr(value) + value = repr(value) + return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) + + +class ScalarNode(Node): + id = 'scalar' + + def __init__(self, tag, value, start_mark=None, end_mark=None, style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + + +class CollectionNode(Node): + def __init__(self, tag, value, start_mark=None, end_mark=None, flow_style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + + +class SequenceNode(CollectionNode): + id = 'sequence' + + +class MappingNode(CollectionNode): + id = 'mapping' diff --git a/powerline-bin/powerline/lint/markedjson/parser.py b/powerline-bin/powerline/lint/markedjson/parser.py new file mode 100644 index 0000000..336a2a2 --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/parser.py @@ -0,0 +1,255 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lint.markedjson.error import MarkedError +from powerline.lint.markedjson import tokens +from powerline.lint.markedjson import events + + +class ParserError(MarkedError): + pass + + +class Parser: + def __init__(self): + self.current_event = None + self.yaml_version = None + self.states = [] + self.marks = [] + self.state = self.parse_stream_start + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def check_event(self, *choices): + # Check the type of the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + if self.current_event is not None: + if not choices: + return True + for choice in choices: + if isinstance(self.current_event, choice): + return True + return False + + def peek_event(self): + # Get the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + return self.current_event + + def get_event(self): + # Get the next event and proceed further. + if self.current_event is None: + if self.state: + self.current_event = self.state() + value = self.current_event + self.current_event = None + return value + + # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + # implicit_document ::= block_node DOCUMENT-END* + # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + + def parse_stream_start(self): + # Parse the stream start. + token = self.get_token() + event = events.StreamStartEvent(token.start_mark, token.end_mark, encoding=token.encoding) + + # Prepare the next state. + self.state = self.parse_implicit_document_start + + return event + + def parse_implicit_document_start(self): + # Parse an implicit document. + if not self.check_token(tokens.StreamEndToken): + token = self.peek_token() + start_mark = end_mark = token.start_mark + event = events.DocumentStartEvent(start_mark, end_mark, explicit=False) + + # Prepare the next state. + self.states.append(self.parse_document_end) + self.state = self.parse_node + + return event + + else: + return self.parse_document_start() + + def parse_document_start(self): + # Parse an explicit document. + if not self.check_token(tokens.StreamEndToken): + token = self.peek_token() + self.echoerr( + None, None, + ('expected \'\', but found %r' % token.id), token.start_mark + ) + return events.StreamEndEvent(token.start_mark, token.end_mark) + else: + # Parse the end of the stream. + token = self.get_token() + event = events.StreamEndEvent(token.start_mark, token.end_mark) + assert not self.states + assert not self.marks + self.state = None + return event + + def parse_document_end(self): + # Parse the document end. + token = self.peek_token() + start_mark = end_mark = token.start_mark + explicit = False + event = events.DocumentEndEvent(start_mark, end_mark, explicit=explicit) + + # Prepare the next state. + self.state = self.parse_document_start + + return event + + def parse_document_content(self): + return self.parse_node() + + def parse_node(self, indentless_sequence=False): + start_mark = end_mark = None + if start_mark is None: + start_mark = end_mark = self.peek_token().start_mark + event = None + implicit = True + if self.check_token(tokens.ScalarToken): + token = self.get_token() + end_mark = token.end_mark + if token.plain: + implicit = (True, False) + else: + implicit = (False, True) + event = events.ScalarEvent(implicit, token.value, start_mark, end_mark, style=token.style) + self.state = self.states.pop() + elif self.check_token(tokens.FlowSequenceStartToken): + end_mark = self.peek_token().end_mark + event = events.SequenceStartEvent(implicit, start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_sequence_first_entry + elif self.check_token(tokens.FlowMappingStartToken): + end_mark = self.peek_token().end_mark + event = events.MappingStartEvent(implicit, start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_mapping_first_key + else: + token = self.peek_token() + raise ParserError( + 'while parsing a flow node', start_mark, + 'expected the node content, but found %r' % token.id, + token.start_mark + ) + return event + + def parse_flow_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_sequence_entry(first=True) + + def parse_flow_sequence_entry(self, first=False): + if not self.check_token(tokens.FlowSequenceEndToken): + if not first: + if self.check_token(tokens.FlowEntryToken): + self.get_token() + if self.check_token(tokens.FlowSequenceEndToken): + token = self.peek_token() + self.echoerr( + 'While parsing a flow sequence', self.marks[-1], + ('expected sequence value, but got %r' % token.id), token.start_mark + ) + else: + token = self.peek_token() + raise ParserError( + 'while parsing a flow sequence', self.marks[-1], + ('expected \',\' or \']\', but got %r' % token.id), token.start_mark + ) + + if not self.check_token(tokens.FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry) + return self.parse_node() + token = self.get_token() + event = events.SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_sequence_entry_mapping_end(self): + self.state = self.parse_flow_sequence_entry + token = self.peek_token() + return events.MappingEndEvent(token.start_mark, token.start_mark) + + def parse_flow_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_mapping_key(first=True) + + def parse_flow_mapping_key(self, first=False): + if not self.check_token(tokens.FlowMappingEndToken): + if not first: + if self.check_token(tokens.FlowEntryToken): + self.get_token() + if self.check_token(tokens.FlowMappingEndToken): + token = self.peek_token() + self.echoerr( + 'While parsing a flow mapping', self.marks[-1], + ('expected mapping key, but got %r' % token.id), token.start_mark + ) + else: + token = self.peek_token() + raise ParserError( + 'while parsing a flow mapping', self.marks[-1], + ('expected \',\' or \'}\', but got %r' % token.id), token.start_mark + ) + if self.check_token(tokens.KeyToken): + token = self.get_token() + if not self.check_token(tokens.ValueToken, tokens.FlowEntryToken, tokens.FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_value) + return self.parse_node() + else: + token = self.peek_token() + raise ParserError( + 'while parsing a flow mapping', self.marks[-1], + ('expected value, but got %r' % token.id), token.start_mark + ) + elif not self.check_token(tokens.FlowMappingEndToken): + token = self.peek_token() + expect_key = self.check_token(tokens.ValueToken, tokens.FlowEntryToken) + if not expect_key: + self.get_token() + expect_key = self.check_token(tokens.ValueToken) + + if expect_key: + raise ParserError( + 'while parsing a flow mapping', self.marks[-1], + ('expected string key, but got %r' % token.id), token.start_mark + ) + else: + token = self.peek_token() + raise ParserError( + 'while parsing a flow mapping', self.marks[-1], + ('expected \':\', but got %r' % token.id), token.start_mark + ) + token = self.get_token() + event = events.MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_mapping_value(self): + if self.check_token(tokens.ValueToken): + token = self.get_token() + if not self.check_token(tokens.FlowEntryToken, tokens.FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_key) + return self.parse_node() + + token = self.peek_token() + raise ParserError( + 'while parsing a flow mapping', self.marks[-1], + ('expected mapping value, but got %r' % token.id), token.start_mark + ) diff --git a/powerline-bin/powerline/lint/markedjson/reader.py b/powerline-bin/powerline/lint/markedjson/reader.py new file mode 100644 index 0000000..0ca4516 --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/reader.py @@ -0,0 +1,141 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import codecs + +from powerline.lint.markedjson.error import MarkedError, Mark, NON_PRINTABLE_RE +from powerline.lib.unicode import unicode + + +# This module contains abstractions for the input stream. You don’t have to +# looks further, there are no pretty code. + + +class ReaderError(MarkedError): + pass + + +class Reader(object): + # Reader: + # - determines the data encoding and converts it to a unicode string, + # - checks if characters are in allowed range, + # - adds '\0' to the end. + + # Reader accepts + # - a file-like object with its `read` method returning `str`, + + # Yeah, it’s ugly and slow. + def __init__(self, stream): + self.name = None + self.stream = None + self.stream_pointer = 0 + self.eof = True + self.buffer = '' + self.pointer = 0 + self.full_buffer = unicode('') + self.full_pointer = 0 + self.raw_buffer = None + self.raw_decode = codecs.utf_8_decode + self.encoding = 'utf-8' + self.index = 0 + self.line = 0 + self.column = 0 + + self.stream = stream + self.name = getattr(stream, 'name', '') + self.eof = False + self.raw_buffer = None + + while not self.eof and (self.raw_buffer is None or len(self.raw_buffer) < 2): + self.update_raw() + self.update(1) + + def peek(self, index=0): + try: + return self.buffer[self.pointer + index] + except IndexError: + self.update(index + 1) + return self.buffer[self.pointer + index] + + def prefix(self, length=1): + if self.pointer + length >= len(self.buffer): + self.update(length) + return self.buffer[self.pointer:self.pointer + length] + + def update_pointer(self, length): + while length: + ch = self.buffer[self.pointer] + self.pointer += 1 + self.full_pointer += 1 + self.index += 1 + if ch == '\n': + self.line += 1 + self.column = 0 + else: + self.column += 1 + length -= 1 + + def forward(self, length=1): + if self.pointer + length + 1 >= len(self.buffer): + self.update(length + 1) + self.update_pointer(length) + + def get_mark(self): + return Mark(self.name, self.line, self.column, self.full_buffer, self.full_pointer) + + def check_printable(self, data): + match = NON_PRINTABLE_RE.search(data) + if match: + self.update_pointer(match.start()) + raise ReaderError( + 'while reading from stream', None, + 'found special characters which are not allowed', + Mark(self.name, self.line, self.column, self.full_buffer, self.full_pointer) + ) + + def update(self, length): + if self.raw_buffer is None: + return + self.buffer = self.buffer[self.pointer:] + self.pointer = 0 + while len(self.buffer) < length: + if not self.eof: + self.update_raw() + try: + data, converted = self.raw_decode(self.raw_buffer, 'strict', self.eof) + except UnicodeDecodeError as exc: + character = self.raw_buffer[exc.start] + position = self.stream_pointer - len(self.raw_buffer) + exc.start + data, converted = self.raw_decode(self.raw_buffer[:exc.start], 'strict', self.eof) + self.buffer += data + self.full_buffer += data + '<' + str(ord(character)) + '>' + self.raw_buffer = self.raw_buffer[converted:] + self.update_pointer(exc.start - 1) + raise ReaderError( + 'while reading from stream', None, + 'found character #x%04x that cannot be decoded by UTF-8 codec' % ord(character), + Mark(self.name, self.line, self.column, self.full_buffer, position) + ) + self.buffer += data + self.full_buffer += data + self.raw_buffer = self.raw_buffer[converted:] + self.check_printable(data) + if self.eof: + self.buffer += '\0' + self.raw_buffer = None + break + + def update_raw(self, size=-1): + # Was size=4096 + assert(size < 0) + # WARNING: reading the whole stream at once. To change this behaviour to + # former reading N characters at once one must make sure that reading + # never ends at partial unicode character. + data = self.stream.read(size) + if self.raw_buffer is None: + self.raw_buffer = data + else: + self.raw_buffer += data + self.stream_pointer += len(data) + if not data: + self.eof = True diff --git a/powerline-bin/powerline/lint/markedjson/resolver.py b/powerline-bin/powerline/lint/markedjson/resolver.py new file mode 100644 index 0000000..fa8ceaa --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/resolver.py @@ -0,0 +1,131 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import re + +from powerline.lint.markedjson.error import MarkedError +from powerline.lint.markedjson import nodes + + +class ResolverError(MarkedError): + pass + + +class BaseResolver: + DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map' + + yaml_implicit_resolvers = {} + yaml_path_resolvers = {} + + def __init__(self): + self.resolver_exact_paths = [] + self.resolver_prefix_paths = [] + + @classmethod + def add_implicit_resolver(cls, tag, regexp, first): + if 'yaml_implicit_resolvers' not in cls.__dict__: + cls.yaml_implicit_resolvers = cls.yaml_implicit_resolvers.copy() + if first is None: + first = [None] + for ch in first: + cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) + + def descend_resolver(self, current_node, current_index): + if not self.yaml_path_resolvers: + return + exact_paths = {} + prefix_paths = [] + if current_node: + depth = len(self.resolver_prefix_paths) + for path, kind in self.resolver_prefix_paths[-1]: + if self.check_resolver_prefix(depth, path, kind, current_node, current_index): + if len(path) > depth: + prefix_paths.append((path, kind)) + else: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + for path, kind in self.yaml_path_resolvers: + if not path: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + prefix_paths.append((path, kind)) + self.resolver_exact_paths.append(exact_paths) + self.resolver_prefix_paths.append(prefix_paths) + + def ascend_resolver(self): + if not self.yaml_path_resolvers: + return + self.resolver_exact_paths.pop() + self.resolver_prefix_paths.pop() + + def check_resolver_prefix(self, depth, path, kind, current_node, current_index): + node_check, index_check = path[depth - 1] + if isinstance(node_check, str): + if current_node.tag != node_check: + return + elif node_check is not None: + if not isinstance(current_node, node_check): + return + if index_check is True and current_index is not None: + return + if ((index_check is False or index_check is None) + and current_index is None): + return + if isinstance(index_check, str): + if not (isinstance(current_index, nodes.ScalarNode) and index_check == current_index.value): + return + elif isinstance(index_check, int) and not isinstance(index_check, bool): + if index_check != current_index: + return + return True + + def resolve(self, kind, value, implicit, mark=None): + if kind is nodes.ScalarNode and implicit[0]: + if value == '': + resolvers = self.yaml_implicit_resolvers.get('', []) + else: + resolvers = self.yaml_implicit_resolvers.get(value[0], []) + resolvers += self.yaml_implicit_resolvers.get(None, []) + for tag, regexp in resolvers: + if regexp.match(value): + return tag + else: + self.echoerr( + 'While resolving plain scalar', None, + 'expected floating-point value, integer, null or boolean, but got %r' % value, + mark + ) + return self.DEFAULT_SCALAR_TAG + if kind is nodes.ScalarNode: + return self.DEFAULT_SCALAR_TAG + elif kind is nodes.SequenceNode: + return self.DEFAULT_SEQUENCE_TAG + elif kind is nodes.MappingNode: + return self.DEFAULT_MAPPING_TAG + + +class Resolver(BaseResolver): + pass + + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:bool', + re.compile(r'''^(?:true|false)$''', re.X), + list('yYnNtTfFoO')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:float', + re.compile(r'^-?(?:0|[1-9]\d*)(?=[.eE])(?:\.\d+)?(?:[eE][-+]?\d+)?$', re.X), + list('-0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:int', + re.compile(r'^(?:0|-?[1-9]\d*)$', re.X), + list('-0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:null', + re.compile(r'^null$', re.X), + ['n']) diff --git a/powerline-bin/powerline/lint/markedjson/scanner.py b/powerline-bin/powerline/lint/markedjson/scanner.py new file mode 100644 index 0000000..b0bddf3 --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/scanner.py @@ -0,0 +1,499 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from string import hexdigits + +from powerline.lint.markedjson.error import MarkedError +from powerline.lint.markedjson import tokens +from powerline.lib.unicode import unicode, unichr, surrogate_pair_to_character + + +hexdigits_set = set(hexdigits) + + +# Scanner produces tokens of the following types: +# STREAM-START +# STREAM-END +# DOCUMENT-START +# DOCUMENT-END +# FLOW-SEQUENCE-START +# FLOW-MAPPING-START +# FLOW-SEQUENCE-END +# FLOW-MAPPING-END +# FLOW-ENTRY +# KEY +# VALUE +# SCALAR(value, plain, style) +# +# Read comments in the Scanner code for more details. + + +class ScannerError(MarkedError): + pass + + +class SimpleKey: + # See below simple keys treatment. + def __init__(self, token_number, index, line, column, mark): + self.token_number = token_number + self.index = index + self.line = line + self.column = column + self.mark = mark + + +class Scanner: + def __init__(self): + '''Initialize the scanner.''' + # It is assumed that Scanner and Reader will have a common descendant. + # Reader do the dirty work of checking for BOM and converting the + # input data to Unicode. It also adds NUL to the end. + # + # Reader supports the following methods + # self.peek(i=0) # peek the next i-th character + # self.prefix(l=1) # peek the next l characters + # self.forward(l=1) # read the next l characters and move the pointer. + + # Had we reached the end of the stream? + self.done = False + + # The number of unclosed '{' and '['. `flow_level == 0` means block + # context. + self.flow_level = 0 + + # List of processed tokens that are not yet emitted. + self.tokens = [] + + # Add the STREAM-START token. + self.fetch_stream_start() + + # Number of tokens that were emitted through the `get_token` method. + self.tokens_taken = 0 + + # Variables related to simple keys treatment. + + # A simple key is a key that is not denoted by the '?' indicator. + # We emit the KEY token before all keys, so when we find a potential + # simple key, we try to locate the corresponding ':' indicator. + # Simple keys should be limited to a single line. + + # Can a simple key start at the current position? A simple key may + # start: + # - after '{', '[', ',' (in the flow context), + self.allow_simple_key = False + + # Keep track of possible simple keys. This is a dictionary. The key + # is `flow_level`; there can be no more that one possible simple key + # for each level. The value is a SimpleKey record: + # (token_number, index, line, column, mark) + # A simple key may start with SCALAR(flow), '[', or '{' tokens. + self.possible_simple_keys = {} + + # Public methods. + + def check_token(self, *choices): + # Check if the next token is one of the given types. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + if not choices: + return True + for choice in choices: + if isinstance(self.tokens[0], choice): + return True + return False + + def peek_token(self): + # Return the next token, but do not delete if from the queue. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + return self.tokens[0] + + def get_token(self): + # Return the next token. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + self.tokens_taken += 1 + return self.tokens.pop(0) + + # Private methods. + + def need_more_tokens(self): + if self.done: + return False + if not self.tokens: + return True + # The current token may be a potential simple key, so we + # need to look further. + self.stale_possible_simple_keys() + if self.next_possible_simple_key() == self.tokens_taken: + return True + + def fetch_more_tokens(self): + + # Eat whitespaces and comments until we reach the next token. + self.scan_to_next_token() + + # Remove obsolete possible simple keys. + self.stale_possible_simple_keys() + + # Peek the next character. + ch = self.peek() + + # Is it the end of stream? + if ch == '\0': + return self.fetch_stream_end() + + # Note: the order of the following checks is NOT significant. + + # Is it the flow sequence start indicator? + if ch == '[': + return self.fetch_flow_sequence_start() + + # Is it the flow mapping start indicator? + if ch == '{': + return self.fetch_flow_mapping_start() + + # Is it the flow sequence end indicator? + if ch == ']': + return self.fetch_flow_sequence_end() + + # Is it the flow mapping end indicator? + if ch == '}': + return self.fetch_flow_mapping_end() + + # Is it the flow entry indicator? + if ch == ',': + return self.fetch_flow_entry() + + # Is it the value indicator? + if ch == ':' and self.flow_level: + return self.fetch_value() + + # Is it a double quoted scalar? + if ch == '"': + return self.fetch_double() + + # It must be a plain scalar then. + if self.check_plain(): + return self.fetch_plain() + + # No? It’s an error. Let’s produce a nice error message. + raise ScannerError( + 'while scanning for the next token', None, + 'found character %r that cannot start any token' % ch, + self.get_mark() + ) + + # Simple keys treatment. + + def next_possible_simple_key(self): + # Return the number of the nearest possible simple key. Actually we + # don’t need to loop through the whole dictionary. We may replace it + # with the following code: + # if not self.possible_simple_keys: + # return None + # return self.possible_simple_keys[ + # min(self.possible_simple_keys.keys())].token_number + min_token_number = None + for level in self.possible_simple_keys: + key = self.possible_simple_keys[level] + if min_token_number is None or key.token_number < min_token_number: + min_token_number = key.token_number + return min_token_number + + def stale_possible_simple_keys(self): + # Remove entries that are no longer possible simple keys. According to + # the YAML specification, simple keys + # - should be limited to a single line, + # Disabling this procedure will allow simple keys of any length and + # height (may cause problems if indentation is broken though). + for level in list(self.possible_simple_keys): + key = self.possible_simple_keys[level] + if key.line != self.line: + del self.possible_simple_keys[level] + + def save_possible_simple_key(self): + # The next token may start a simple key. We check if it’s possible + # and save its position. This function is called for + # SCALAR(flow), '[', and '{'. + + # The next token might be a simple key. Let’s save it’s number and + # position. + if self.allow_simple_key: + self.remove_possible_simple_key() + token_number = self.tokens_taken + len(self.tokens) + key = SimpleKey(token_number, self.index, self.line, self.column, self.get_mark()) + self.possible_simple_keys[self.flow_level] = key + + def remove_possible_simple_key(self): + # Remove the saved possible key position at the current flow level. + if self.flow_level in self.possible_simple_keys: + del self.possible_simple_keys[self.flow_level] + + # Fetchers. + + def fetch_stream_start(self): + # We always add STREAM-START as the first token and STREAM-END as the + # last token. + + # Read the token. + mark = self.get_mark() + + # Add STREAM-START. + self.tokens.append(tokens.StreamStartToken(mark, mark, encoding=self.encoding)) + + def fetch_stream_end(self): + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + self.possible_simple_keys = {} + + # Read the token. + mark = self.get_mark() + + # Add STREAM-END. + self.tokens.append(tokens.StreamEndToken(mark, mark)) + + # The steam is finished. + self.done = True + + def fetch_flow_sequence_start(self): + self.fetch_flow_collection_start(tokens.FlowSequenceStartToken) + + def fetch_flow_mapping_start(self): + self.fetch_flow_collection_start(tokens.FlowMappingStartToken) + + def fetch_flow_collection_start(self, TokenClass): + # '[' and '{' may start a simple key. + self.save_possible_simple_key() + + # Increase the flow level. + self.flow_level += 1 + + # Simple keys are allowed after '[' and '{'. + self.allow_simple_key = True + + # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_end(self): + self.fetch_flow_collection_end(tokens.FlowSequenceEndToken) + + def fetch_flow_mapping_end(self): + self.fetch_flow_collection_end(tokens.FlowMappingEndToken) + + def fetch_flow_collection_end(self, TokenClass): + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Decrease the flow level. + self.flow_level -= 1 + + # No simple keys after ']' or '}'. + self.allow_simple_key = False + + # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_value(self): + # Do we determine a simple key? + if self.flow_level in self.possible_simple_keys: + + # Add KEY. + key = self.possible_simple_keys[self.flow_level] + del self.possible_simple_keys[self.flow_level] + self.tokens.insert(key.token_number - self.tokens_taken, tokens.KeyToken(key.mark, key.mark)) + + # There cannot be two simple keys one after another. + self.allow_simple_key = False + + # Add VALUE. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(tokens.ValueToken(start_mark, end_mark)) + + def fetch_flow_entry(self): + # Simple keys are allowed after ','. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add FLOW-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(tokens.FlowEntryToken(start_mark, end_mark)) + + def fetch_double(self): + # A flow scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after flow scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. + self.tokens.append(self.scan_flow_scalar()) + + def fetch_plain(self): + + self.save_possible_simple_key() + + # No simple keys after plain scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. May change `allow_simple_key`. + self.tokens.append(self.scan_plain()) + + # Checkers. + + def check_plain(self): + return self.peek() in '0123456789-ntf' + + # Scanners. + + def scan_to_next_token(self): + while self.peek() in ' \t\n': + self.forward() + + def scan_flow_scalar(self): + # See the specification for details. + # Note that we loose indentation rules for quoted scalars. Quoted + # scalars don’t need to adhere indentation because " and ' clearly + # mark the beginning and the end of them. Therefore we are less + # restrictive then the specification requires. We only need to check + # that document separators are not included in scalars. + chunks = [] + start_mark = self.get_mark() + quote = self.peek() + self.forward() + chunks.extend(self.scan_flow_scalar_non_spaces(start_mark)) + while self.peek() != quote: + chunks.extend(self.scan_flow_scalar_spaces(start_mark)) + chunks.extend(self.scan_flow_scalar_non_spaces(start_mark)) + self.forward() + end_mark = self.get_mark() + return tokens.ScalarToken(unicode().join(chunks), False, start_mark, end_mark, '"') + + ESCAPE_REPLACEMENTS = { + 'b': '\x08', + 't': '\x09', + 'n': '\x0A', + 'f': '\x0C', + 'r': '\x0D', + '"': '\"', + '\\': '\\', + } + + ESCAPE_CODES = { + 'u': 4, + } + + def scan_flow_scalar_non_spaces(self, start_mark): + # See the specification for details. + chunks = [] + while True: + length = 0 + while self.peek(length) not in '\"\\\0 \t\n': + length += 1 + if length: + chunks.append(self.prefix(length)) + self.forward(length) + ch = self.peek() + if ch == '\\': + self.forward() + ch = self.peek() + if ch in self.ESCAPE_REPLACEMENTS: + chunks.append(self.ESCAPE_REPLACEMENTS[ch]) + self.forward() + elif ch in self.ESCAPE_CODES: + length = self.ESCAPE_CODES[ch] + self.forward() + for k in range(length): + if self.peek(k) not in hexdigits: + raise ScannerError( + 'while scanning a double-quoted scalar', start_mark, + 'expected escape sequence of %d hexdecimal numbers, but found %r' % ( + length, self.peek(k)), + self.get_mark() + ) + code = int(self.prefix(length), 16) + self.forward(length) + if 0xD800 <= code <= 0xDC00: + # Start of the surrogate pair + next_char = self.prefix(6) + if ( + next_char[0] != '\\' + or next_char[1] != 'u' + or not (set(next_char[2:]) < hexdigits_set) + or not (0xDC00 <= int(next_char[2:], 16) <= 0xDFFF) + ): + raise ScannerError( + 'while scanning a double-quoted scalar', start_mark, + 'expected escape sequence with the next character in surrogate pair, but found %r' % ( + next_char + ), + self.get_mark() + ) + code = surrogate_pair_to_character(code, int(next_char[2:], 16)) + self.forward(6) + chunks.append(unichr(code)) + else: + raise ScannerError( + 'while scanning a double-quoted scalar', start_mark, + ('found unknown escape character %r' % ch), self.get_mark() + ) + else: + return chunks + + def scan_flow_scalar_spaces(self, start_mark): + # See the specification for details. + chunks = [] + length = 0 + while self.peek(length) in ' \t': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch == '\0': + raise ScannerError( + 'while scanning a quoted scalar', start_mark, + 'found unexpected end of stream', self.get_mark() + ) + elif ch == '\n': + raise ScannerError( + 'while scanning a quoted scalar', start_mark, + 'found unexpected line end', self.get_mark() + ) + else: + chunks.append(whitespaces) + return chunks + + def scan_plain(self): + chunks = [] + start_mark = self.get_mark() + spaces = [] + while True: + length = 0 + while True: + if self.peek(length) not in 'eE.0123456789nul-tr+fas': + break + length += 1 + if length == 0: + break + self.allow_simple_key = False + chunks.extend(spaces) + chunks.append(self.prefix(length)) + self.forward(length) + end_mark = self.get_mark() + return tokens.ScalarToken(''.join(chunks), True, start_mark, end_mark) diff --git a/powerline-bin/powerline/lint/markedjson/tokens.py b/powerline-bin/powerline/lint/markedjson/tokens.py new file mode 100644 index 0000000..6fa8bf1 --- /dev/null +++ b/powerline-bin/powerline/lint/markedjson/tokens.py @@ -0,0 +1,72 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + + +class Token(object): + def __init__(self, start_mark, end_mark): + self.start_mark = start_mark + self.end_mark = end_mark + + def __repr__(self): + attributes = [ + key for key in self.__dict__ + if not key.endswith('_mark') + ] + attributes.sort() + arguments = ', '.join([ + '%s=%r' % (key, getattr(self, key)) + for key in attributes + ]) + return '%s(%s)' % (self.__class__.__name__, arguments) + + +class StreamStartToken(Token): + id = '' + + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + + +class StreamEndToken(Token): + id = '' + + +class FlowSequenceStartToken(Token): + id = '[' + + +class FlowMappingStartToken(Token): + id = '{' + + +class FlowSequenceEndToken(Token): + id = ']' + + +class FlowMappingEndToken(Token): + id = '}' + + +class KeyToken(Token): + id = '?' + + +class ValueToken(Token): + id = ':' + + +class FlowEntryToken(Token): + id = ',' + + +class ScalarToken(Token): + id = '' + + def __init__(self, value, plain, start_mark, end_mark, style=None): + self.value = value + self.plain = plain + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style diff --git a/powerline-bin/powerline/lint/selfcheck.py b/powerline-bin/powerline/lint/selfcheck.py new file mode 100644 index 0000000..06d1fbe --- /dev/null +++ b/powerline-bin/powerline/lint/selfcheck.py @@ -0,0 +1,16 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lib.unicode import unicode + + +def havemarks(*args, **kwargs): + origin = kwargs.get('origin', '') + for i, v in enumerate(args): + if not hasattr(v, 'mark'): + raise AssertionError('Value #{0}/{1} ({2!r}) has no attribute `mark`'.format(origin, i, v)) + if isinstance(v, dict): + for key, val in v.items(): + havemarks(key, val, origin=(origin + '[' + unicode(i) + ']/' + unicode(key))) + elif isinstance(v, list): + havemarks(*v, origin=(origin + '[' + unicode(i) + ']')) diff --git a/powerline-bin/powerline/lint/spec.py b/powerline-bin/powerline/lint/spec.py new file mode 100644 index 0000000..f7b9155 --- /dev/null +++ b/powerline-bin/powerline/lint/spec.py @@ -0,0 +1,759 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import itertools +import re + +from copy import copy + +from powerline.lib.unicode import unicode +from powerline.lint.markedjson.error import echoerr, DelayedEchoErr, NON_PRINTABLE_STR +from powerline.lint.selfcheck import havemarks + + +NON_PRINTABLE_RE = re.compile( + NON_PRINTABLE_STR.translate({ + ord('\t'): None, + ord('\n'): None, + 0x0085: None, + }) +) + + +class Spec(object): + '''Class that describes some JSON value + + In powerline it is only used to describe JSON values stored in powerline + configuration. + + :param dict keys: + Dictionary that maps keys that may be present in the given JSON + dictionary to their descriptions. If this parameter is not empty it + implies that described value has dictionary type. Non-dictionary types + must be described using ``Spec()``: without arguments. + + .. note:: + Methods that create the specifications return ``self``, so calls to them + may be chained: ``Spec().type(unicode).re('^\w+$')``. This does not + apply to functions that *apply* specification like :py:meth`Spec.match`. + + .. note:: + Methods starting with ``check_`` return two values: first determines + whether caller should proceed on running other checks, second + determines whether there were any problems (i.e. whether error was + reported). One should not call these methods directly: there is + :py:meth:`Spec.match` method for checking values. + + .. note:: + In ``check_`` and ``match`` methods specifications are identified by + their indexes for the purpose of simplyfying :py:meth:`Spec.copy` + method. + + Some common parameters: + + ``data``: + Whatever data supplied by the first caller for checker functions. Is not + processed by :py:class:`Spec` methods in any fashion. + ``context``: + :py:class:`powerline.lint.context.Context` instance, describes context + of the value. :py:class:`Spec` methods only use its ``.key`` methods for + error messages. + ``echoerr``: + Callable that should be used to echo errors. Is supposed to take four + optional keyword arguments: ``problem``, ``problem_mark``, ``context``, + ``context_mark``. + ``value``: + Checked value. + ''' + + def __init__(self, **keys): + self.specs = [] + self.keys = {} + self.checks = [] + self.cmsg = '' + self.isoptional = False + self.uspecs = [] + self.ufailmsg = lambda key: 'found unknown key: {0}'.format(key) + self.did_type = False + self.update(**keys) + + def update(self, **keys): + '''Describe additional keys that may be present in given JSON value + + If called with some keyword arguments implies that described value is + a dictionary. If called without keyword parameters it is no-op. + + :return: self. + ''' + for k, v in keys.items(): + self.keys[k] = len(self.specs) + self.specs.append(v) + if self.keys and not self.did_type: + self.type(dict) + self.did_type = True + return self + + def copy(self, copied=None): + '''Deep copy the spec + + :param dict copied: + Internal dictionary used for storing already copied values. This + parameter should not be used. + + :return: New :py:class:`Spec` object that is a deep copy of ``self``. + ''' + copied = copied or {} + try: + return copied[id(self)] + except KeyError: + instance = self.__class__() + copied[id(self)] = instance + return self.__class__()._update(self.__dict__, copied) + + def _update(self, d, copied): + '''Helper for the :py:meth:`Spec.copy` function + + Populates new instance with values taken from the old one. + + :param dict d: + ``__dict__`` of the old instance. + :param dict copied: + Storage for already copied values. + ''' + self.__dict__.update(d) + self.keys = copy(self.keys) + self.checks = copy(self.checks) + self.uspecs = copy(self.uspecs) + self.specs = [spec.copy(copied) for spec in self.specs] + return self + + def unknown_spec(self, keyfunc, spec): + '''Define specification for non-static keys + + This method should be used if key names cannot be determined at runtime + or if a number of keys share identical spec (in order to not repeat it). + :py:meth:`Spec.match` method processes dictionary in the given order: + + * First it tries to use specifications provided at the initialization or + by the :py:meth:`Spec.update` method. + * If no specification for given key was provided it processes + specifications from ``keyfunc`` argument in order they were supplied. + Once some key matches specification supplied second ``spec`` argument + is used to determine correctness of the value. + + :param Spec keyfunc: + :py:class:`Spec` instance or a regular function that returns two + values (the same :py:meth:`Spec.match` returns). This argument is + used to match keys that were not provided at initialization or via + :py:meth:`Spec.update`. + :param Spec spec: + :py:class:`Spec` instance that will be used to check keys matched by + ``keyfunc``. + + :return: self. + ''' + if isinstance(keyfunc, Spec): + self.specs.append(keyfunc) + keyfunc = len(self.specs) - 1 + self.specs.append(spec) + self.uspecs.append((keyfunc, len(self.specs) - 1)) + return self + + def unknown_msg(self, msgfunc): + '''Define message which will be used when unknown key was found + + “Unknown” is a key that was not provided at the initialization and via + :py:meth:`Spec.update` and did not match any ``keyfunc`` proided via + :py:meth:`Spec.unknown_spec`. + + :param msgfunc: + Function that takes that unknown key as an argument and returns the + message text. Text will appear at the top (start of the sentence). + + :return: self. + ''' + self.ufailmsg = msgfunc + return self + + def context_message(self, msg): + '''Define message that describes context + + :param str msg: + Message that describes context. Is written using the + :py:meth:`str.format` syntax and is expected to display keyword + parameter ``key``. + + :return: self. + ''' + self.cmsg = msg + for spec in self.specs: + if not spec.cmsg: + spec.context_message(msg) + return self + + def check_type(self, value, context_mark, data, context, echoerr, types): + '''Check that given value matches given type(s) + + :param tuple types: + List of accepted types. Since :py:class:`Spec` is supposed to + describe JSON values only ``dict``, ``list``, ``unicode``, ``bool``, + ``float`` and ``NoneType`` types make any sense. + + :return: proceed, hadproblem. + ''' + havemarks(value) + if type(value.value) not in types: + echoerr( + context=self.cmsg.format(key=context.key), + context_mark=context_mark, + problem='{0!r} must be a {1} instance, not {2}'.format( + value, + ', '.join((t.__name__ for t in types)), + type(value.value).__name__ + ), + problem_mark=value.mark + ) + return False, True + return True, False + + def check_func(self, value, context_mark, data, context, echoerr, func, msg_func): + '''Check value using given function + + :param function func: + Callable that should accept four positional parameters: + + #. checked value, + #. ``data`` parameter with arbitrary data (supplied by top-level + caller), + #. current context and + #. function used for echoing errors. + + This callable should return three values: + + #. determines whether ``check_func`` caller should proceed + calling other checks, + #. determines whether ``check_func`` should echo error on its own + (it should be set to False if ``func`` echoes error itself) and + #. determines whether function has found some errors in the checked + value. + + :param function msg_func: + Callable that takes checked value as the only positional parameter + and returns a string that describes the problem. Only useful for + small checker functions since it is ignored when second returned + value is false. + + :return: proceed, hadproblem. + ''' + havemarks(value) + proceed, echo, hadproblem = func(value, data, context, echoerr) + if echo and hadproblem: + echoerr(context=self.cmsg.format(key=context.key), + context_mark=context_mark, + problem=msg_func(value), + problem_mark=value.mark) + return proceed, hadproblem + + def check_list(self, value, context_mark, data, context, echoerr, item_func, msg_func): + '''Check that each value in the list matches given specification + + :param function item_func: + Callable like ``func`` from :py:meth:`Spec.check_func`. Unlike + ``func`` this callable is called for each value in the list and may + be a :py:class:`Spec` object index. + :param func msg_func: + Callable like ``msg_func`` from :py:meth:`Spec.check_func`. Should + accept one problematic item and is not used for :py:class:`Spec` + object indicies in ``item_func`` method. + + :return: proceed, hadproblem. + ''' + havemarks(value) + i = 0 + hadproblem = False + for item in value: + havemarks(item) + if isinstance(item_func, int): + spec = self.specs[item_func] + proceed, fhadproblem = spec.match( + item, + value.mark, + data, + context.enter_item('list item ' + unicode(i), item), + echoerr + ) + else: + proceed, echo, fhadproblem = item_func(item, data, context, echoerr) + if echo and fhadproblem: + echoerr(context=self.cmsg.format(key=context.key + '/list item ' + unicode(i)), + context_mark=value.mark, + problem=msg_func(item), + problem_mark=item.mark) + if fhadproblem: + hadproblem = True + if not proceed: + return proceed, hadproblem + i += 1 + return True, hadproblem + + def check_either(self, value, context_mark, data, context, echoerr, start, end): + '''Check that given value matches one of the given specifications + + :param int start: + First specification index. + :param int end: + Specification index that is greater by 1 then last specification + index. + + This method does not give an error if any specification from + ``self.specs[start:end]`` is matched by the given value. + ''' + havemarks(value) + new_echoerr = DelayedEchoErr( + echoerr, + 'One of the either variants failed. Messages from the first variant:', + 'messages from the next variant:' + ) + + hadproblem = False + for spec in self.specs[start:end]: + proceed, hadproblem = spec.match(value, value.mark, data, context, new_echoerr) + new_echoerr.next_variant() + if not proceed: + break + if not hadproblem: + return True, False + + new_echoerr.echo_all() + + return False, hadproblem + + def check_tuple(self, value, context_mark, data, context, echoerr, start, end): + '''Check that given value is a list with items matching specifications + + :param int start: + First specification index. + :param int end: + Specification index that is greater by 1 then last specification + index. + + This method checks that each item in the value list matches + specification with index ``start + item_number``. + ''' + havemarks(value) + hadproblem = False + for (i, item, spec) in zip(itertools.count(), value, self.specs[start:end]): + proceed, ihadproblem = spec.match( + item, + value.mark, + data, + context.enter_item('tuple item ' + unicode(i), item), + echoerr + ) + if ihadproblem: + hadproblem = True + if not proceed: + return False, hadproblem + return True, hadproblem + + def check_printable(self, value, context_mark, data, context, echoerr, _): + '''Check that given unicode string contains only printable characters + ''' + hadproblem = False + for match in NON_PRINTABLE_RE.finditer(value): + hadproblem = True + echoerr( + context=self.cmsg.format(key=context.key), + context_mark=value.mark, + problem='found not printable character U+{0:04x} in a configuration string'.format( + ord(match.group(0))), + problem_mark=value.mark.advance_string(match.start() + 1) + ) + return True, hadproblem + + def printable(self, *args): + self.type(unicode) + self.checks.append(('check_printable', args)) + return self + + def type(self, *args): + '''Describe value that has one of the types given in arguments + + :param args: + List of accepted types. Since :py:class:`Spec` is supposed to + describe JSON values only ``dict``, ``list``, ``unicode``, ``bool``, + ``float`` and ``NoneType`` types make any sense. + + :return: self. + ''' + self.checks.append(('check_type', args)) + return self + + cmp_funcs = { + 'le': lambda x, y: x <= y, + 'lt': lambda x, y: x < y, + 'ge': lambda x, y: x >= y, + 'gt': lambda x, y: x > y, + 'eq': lambda x, y: x == y, + } + + cmp_msgs = { + 'le': 'lesser or equal to', + 'lt': 'lesser then', + 'ge': 'greater or equal to', + 'gt': 'greater then', + 'eq': 'equal to', + } + + def len(self, comparison, cint, msg_func=None): + '''Describe value that has given length + + :param str comparison: + Type of the comparison. Valid values: ``le``, ``lt``, ``ge``, + ``gt``, ``eq``. + :param int cint: + Integer with which length is compared. + :param function msg_func: + Function that should accept checked value and return message that + describes the problem with this value. Default value will emit + something like “length of ['foo', 'bar'] is not greater then 10”. + + :return: self. + ''' + cmp_func = self.cmp_funcs[comparison] + msg_func = ( + msg_func + or (lambda value: 'length of {0!r} is not {1} {2}'.format( + value, self.cmp_msgs[comparison], cint)) + ) + self.checks.append(( + 'check_func', + (lambda value, *args: (True, True, not cmp_func(len(value), cint))), + msg_func + )) + return self + + def cmp(self, comparison, cint, msg_func=None): + '''Describe value that is a number or string that has given property + + :param str comparison: + Type of the comparison. Valid values: ``le``, ``lt``, ``ge``, + ``gt``, ``eq``. This argument will restrict the number or string to + emit True on the given comparison. + :param cint: + Number or string with which value is compared. Type of this + parameter affects required type of the checked value: ``str`` and + ``unicode`` types imply ``unicode`` values, ``float`` type implies + that value can be either ``int`` or ``float``, ``int`` type implies + ``int`` value and for any other type the behavior is undefined. + :param function msg_func: + Function that should accept checked value and return message that + describes the problem with this value. Default value will emit + something like “10 is not greater then 10”. + + :return: self. + ''' + if type(cint) is str: + self.type(unicode) + elif type(cint) is float: + self.type(int, float) + else: + self.type(type(cint)) + cmp_func = self.cmp_funcs[comparison] + msg_func = msg_func or (lambda value: '{0} is not {1} {2}'.format(value, self.cmp_msgs[comparison], cint)) + self.checks.append(( + 'check_func', + (lambda value, *args: (True, True, not cmp_func(value.value, cint))), + msg_func + )) + return self + + def unsigned(self, msg_func=None): + '''Describe unsigned integer value + + :param function msg_func: + Function that should accept checked value and return message that + describes the problem with this value. + + :return: self. + ''' + self.type(int) + self.checks.append(( + 'check_func', + (lambda value, *args: (True, True, value < 0)), + (lambda value: '{0} must be greater then zero'.format(value)) + )) + return self + + def list(self, item_func, msg_func=None): + '''Describe list with any number of elements, each matching given spec + + :param item_func: + :py:class:`Spec` instance or a callable. Check out + :py:meth:`Spec.check_list` documentation for more details. Note that + in :py:meth:`Spec.check_list` description :py:class:`Spec` instance + is replaced with its index in ``self.specs``. + :param function msg_func: + Function that should accept checked value and return message that + describes the problem with this value. Default value will emit just + “failed check”, which is rather indescriptive. + + :return: self. + ''' + self.type(list) + if isinstance(item_func, Spec): + self.specs.append(item_func) + item_func = len(self.specs) - 1 + self.checks.append(('check_list', item_func, msg_func or (lambda item: 'failed check'))) + return self + + def tuple(self, *specs): + '''Describe list with the given number of elements, each matching corresponding spec + + :param (Spec,) specs: + List of specifications. Last element(s) in this list may be + optional. Each element in this list describes element with the same + index in the checked value. Check out :py:meth:`Spec.check_tuple` + for more details, but note that there list of specifications is + replaced with start and end indicies in ``self.specs``. + + :return: self. + ''' + self.type(list) + + max_len = len(specs) + min_len = max_len + for spec in reversed(specs): + if spec.isoptional: + min_len -= 1 + else: + break + if max_len == min_len: + self.len('eq', len(specs)) + else: + if min_len > 0: + self.len('ge', min_len) + self.len('le', max_len) + + start = len(self.specs) + for i, spec in zip(itertools.count(), specs): + self.specs.append(spec) + self.checks.append(('check_tuple', start, len(self.specs))) + return self + + def func(self, func, msg_func=None): + '''Describe value that is checked by the given function + + Check out :py:meth:`Spec.check_func` documentation for more details. + ''' + self.checks.append(('check_func', func, msg_func or (lambda value: 'failed check'))) + return self + + def re(self, regex, msg_func=None): + '''Describe value that is a string that matches given regular expression + + :param str regex: + Regular expression that should be matched by the value. + :param function msg_func: + Function that should accept checked value and return message that + describes the problem with this value. Default value will emit + something like “String "xyz" does not match "[a-f]+"”. + + :return: self. + ''' + self.type(unicode) + compiled = re.compile(regex) + msg_func = msg_func or (lambda value: 'String "{0}" does not match "{1}"'.format(value, regex)) + self.checks.append(( + 'check_func', + (lambda value, *args: (True, True, not compiled.match(value.value))), + msg_func + )) + return self + + def ident(self, msg_func=None): + '''Describe value that is an identifier like ``foo:bar`` or ``foo`` + + :param function msg_func: + Function that should accept checked value and return message that + describes the problem with this value. Default value will emit + something like “String "xyz" is not an … identifier”. + + :return: self. + ''' + msg_func = ( + msg_func + or (lambda value: 'String "{0}" is not an alphanumeric/underscore colon-separated identifier'.format(value)) + ) + return self.re('^\w+(?::\w+)?$', msg_func) + + def oneof(self, collection, msg_func=None): + '''Describe value that is equal to one of the value in the collection + + :param set collection: + A collection of possible values. + :param function msg_func: + Function that should accept checked value and return message that + describes the problem with this value. Default value will emit + something like “"xyz" must be one of {'abc', 'def', 'ghi'}”. + + :return: self. + ''' + msg_func = msg_func or (lambda value: '"{0}" must be one of {1!r}'.format(value, list(collection))) + self.checks.append(( + 'check_func', + (lambda value, *args: (True, True, value not in collection)), + msg_func + )) + return self + + def error(self, msg): + '''Describe value that must not be there + + Useful for giving more descriptive errors for some specific keys then + just “found unknown key: shutdown_event” or for forbidding certain + values when :py:meth:`Spec.unknown_spec` was used. + + :param str msg: + Message given for the offending value. It is formatted using + :py:meth:`str.format` with the only positional parameter which is + the value itself. + + :return: self. + ''' + self.checks.append(( + 'check_func', + (lambda *args: (True, True, True)), + (lambda value: msg.format(value)) + )) + return self + + def either(self, *specs): + '''Describes value that matches one of the given specs + + Check out :py:meth:`Spec.check_either` method documentation for more + details, but note that there a list of specs was replaced by start and + end indicies in ``self.specs``. + + :return: self. + ''' + start = len(self.specs) + self.specs.extend(specs) + self.checks.append(('check_either', start, len(self.specs))) + return self + + def optional(self): + '''Mark value as optional + + Only useful for key specs in :py:meth:`Spec.__init__` and + :py:meth:`Spec.update` and some last supplied to :py:meth:`Spec.tuple`. + + :return: self. + ''' + self.isoptional = True + return self + + def required(self): + '''Mark value as required + + Only useful for key specs in :py:meth:`Spec.__init__` and + :py:meth:`Spec.update` and some last supplied to :py:meth:`Spec.tuple`. + + .. note:: + Value is required by default. This method is only useful for + altering existing specification (or rather its copy). + + :return: self. + ''' + self.isoptional = False + return self + + def match_checks(self, *args): + '''Process checks registered for the given value + + Processes only “top-level” checks: key specifications given using at the + initialization or via :py:meth:`Spec.unknown_spec` are processed by + :py:meth:`Spec.match`. + + :return: proceed, hadproblem. + ''' + hadproblem = False + for check in self.checks: + proceed, chadproblem = getattr(self, check[0])(*(args + check[1:])) + if chadproblem: + hadproblem = True + if not proceed: + return False, hadproblem + return True, hadproblem + + def match(self, value, context_mark=None, data=None, context=(), echoerr=echoerr): + '''Check that given value matches this specification + + :return: proceed, hadproblem. + ''' + havemarks(value) + proceed, hadproblem = self.match_checks(value, context_mark, data, context, echoerr) + if proceed: + if self.keys or self.uspecs: + for key, vali in self.keys.items(): + valspec = self.specs[vali] + if key in value: + proceed, mhadproblem = valspec.match( + value[key], + value.mark, + data, + context.enter_key(value, key), + echoerr + ) + if mhadproblem: + hadproblem = True + if not proceed: + return False, hadproblem + else: + if not valspec.isoptional: + hadproblem = True + echoerr(context=self.cmsg.format(key=context.key), + context_mark=None, + problem='required key is missing: {0}'.format(key), + problem_mark=value.mark) + for key in value.keys(): + havemarks(key) + if key not in self.keys: + for keyfunc, vali in self.uspecs: + valspec = self.specs[vali] + if isinstance(keyfunc, int): + spec = self.specs[keyfunc] + proceed, khadproblem = spec.match(key, context_mark, data, context, echoerr) + else: + proceed, khadproblem = keyfunc(key, data, context, echoerr) + if khadproblem: + hadproblem = True + if proceed: + proceed, vhadproblem = valspec.match( + value[key], + value.mark, + data, + context.enter_key(value, key), + echoerr + ) + if vhadproblem: + hadproblem = True + break + else: + hadproblem = True + if self.ufailmsg: + echoerr(context=self.cmsg.format(key=context.key), + context_mark=None, + problem=self.ufailmsg(key), + problem_mark=key.mark) + return True, hadproblem + + def __getitem__(self, key): + '''Get specification for the given key + ''' + return self.specs[self.keys[key]] + + def __setitem__(self, key, value): + '''Set specification for the given key + ''' + self.update(**{key: value}) diff --git a/powerline-bin/powerline/listers/__init__.py b/powerline-bin/powerline/listers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/powerline-bin/powerline/listers/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/listers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1a293950816568ea7f456d3ff8d15d5b112446b GIT binary patch literal 162 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/listers/__pycache__/pdb.cpython-312.pyc b/powerline-bin/powerline/listers/__pycache__/pdb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b85917c74d65b14341ea842effe6567b733c5a2 GIT binary patch literal 1406 zcmaJ>&2Jk;6rb7I-S{JE98?k|lrTa~qy=iHAgB^d#Gyh$1z+gN60+9b*?8!Fb#}Ii zks}4Q5-s9j4v-%B2T;Xd!T|>kSjz>8BIwPjdnh^aX6<~al^AK>&b)c^K7PM9`_s%! z0l}F0`FD3f5c*SXjtA_sG1`F7K5~$QJ>=s$_O-g^lREMBx{j4z^962LMqf%CLbRWc*#y;w5;spnPWpuHlErRYd zn9q(~Jy?KqqR#){@}A-7OK4Y@$Izgz{s52tb;*sZ2nn;RcS#YA?d}>bc8oi@u6`9A zL-Gl-O#2F4`iRGp+MY*UVf!qmJfLUmqHZXBTNVoWjmQQI+6+UmO+2p=OS^Srqma*k z=u#;X_6C)07Chq%R5UZBwqVqQV9Y7gnsVxS9a^I<7mxsWnZ#FS4v$;5aF|24+YI(K z%42HNAn}__(9k{3H3AlZ0BTDW`qUKu|=|QmX_vPiO5nF z>cP~0Ko&{0@>*(~Dr40ZlE7FfD5sxlOTWm3T>7BRRYtfaR^@_)vm8c`zVNi*} zZ6-V(Fi-+FBCbG5<*0L%uWqq`?L=bp^H(zG@LZHZx#|J7Uc6a8F}MH$+)g1eSQH$X-3v2DFOT} zGu0w5oj%)$Y2mc#()9d&&1@aWk_$CNQ^l%;-vxCK@ zzBWH7F5EW`ip#$hFCG*xezE$;;!1zDda(H3b7%dP_5R96zxeLn>O+0%u6g@f&-z7w zX;7T&t@mE*z1}Y_@2!sXF$AUgCv$3r@){XIP*k(D4<0FktXx`Xz;8t+f;AdKse}SU z7)q!*(%BPk%Fx0-6Ds$t2r;8pOG>CRk8)K%bP|tkie=cU#*1GCF(eq{ztQzy(e=O3 V<)MkRg~!^|NPwue9pj zRU8XvMwHCN$}p2Kg{JK=(>x{W%z2^_jWbD(8|QNT zIG+>7g`7Apa#+usp`0`>vAkf0bCK~#P9B#zB4ev)M#rOC=oA@ObV-v=k<0$T<8dtv zwF#(|wa6(hs8244TZ!JWjnF7Zc%sLGmgsBboq>6BLU@hLbE)VJ94RHb$ztA^vNSzy z8jemgrtL;Fnx}CQ5 z>6{LYMm}q$csDUsq!i0eX0ni()?LLk?4V?iP4WI#@DqbqfOjRrp}rQ$EPPv^#!gO> zMQ*maw=Z~-U*u;Sns4fSQh@QoO%;B2k%Ms}ZR&BHHuX+NLl)X`#VyZlqNM_g8mIA> z{k2~9_p~T13hl=KP`K=`k^>DKg~J(h*B7jLotj2oPtO~9&6-ae+Kqp~lM1`xhGs*M z$x~PIB-{{up(qC(TxqhH&Fa(*!8cD+5m%hD3JVn1OV>f-O2vYfadcP87ju&!D8MPZ z;_(c%U13^xz)WJz$4eFL8FaT%=_)*T_YXU{!f?ST3_2MK9S8UBnb}p?cjC!m)0iAC zEI2b(emK|?RN7#3_V95dH&j?~d;JZiz13)IOp5lxBsi~aLsBO7WbgIlmTGcKExEPa zTaR|09jXkKyXw*8*}=*nWH{wIx1q{yfTnsRaW-Cw*X2Y#5acRS7} z-c4Lp_gta1{)IEvi1mQQXk_ay>uOsrttK5ban3k-uTC`ZSiIrJMPIIS))8gsS zdEx}N+pyR(p-QNo#hwwD#4M+Ary^&BC1EMF#AOAIKNWF8Fd%yxBRm^;KG=nj`8`bW zA}CMIn5GI^Q_;h0)yS*O$E0R0n#(xRsC=}bPZ?Qb3d9%GX*~~)?tpwo#S>7iY@-{D zkhN6JVBVdf2FT1C&Wt)S;ThA!#7;FTvr?X7q0snK=rI~0_Q^=`D#&TjOiH@UPqm#RU0(6j5jBs(u6PkLqgP0*T`p!^}*Y zx|#tQ-86@y@*0DZ;LO*&P{X2zvyjdeO~)wU?k@4J0P&u7fn-WxF7682l;g?} z$uWxOsf`w|s%5$vzHS`Otf_x#3&?mLJ+z;luYF)>t;isBvmb%v4)|}sdf~Yb4_yg= z9RDc(=>yeWhif~JRJR?e_PXp;RxXv zWW3Q$$VrYTOFTFguaQ#`4Dc0UZU@9FUgPpjq4*cvd5$CR^oV3Z_^kkND6TmN48!ak z9>*E@W|yu2m^1=9Pb&N(Y8poVAPDnW9$j?oZU?Ai1ff)8y6p-~FU?FZ?HQ=M$rnkt zw5K>0@lv995|SrQx5J8P4%>?FHq%(B9IT~;@xIkyg4W&8&E5scoxkB4ZxLA*mXjnL zznzdoaXCgL<=p&*N3Lxetms#s_*#*Kr*8@%^9@tX+kIO&Fk(b;X3$iITuO5Jg2`6p zN^|poP`0Pf0Tjctw$ZlK33YUI)U$CpSR#D_n$Q+)w7q|p$!ZTt_SX_>d2?OqzOM9F zmHzSrt0K=UwU z_xX^!>|=?~DfqEe$V2WV3`9FIK?*?8-a%s3xKYSi8f#)u?X{+% z4$wL(-#=cD6f!iEQztD8aD4_SaWT)Lh&B?HAN zO2{6%$5))dZ`*kv2CdmP-dBRU2AgSoHE!-%P|nK%x&uk}(7lM*E&#TR_dRcD7Qvw9 zX}^}n{HI|V7I`q ze`R+g;FNG((6uJI;lViII0FDW4E;+x+M8d1;Q`y20BIWmma&b#UoKw!aZPv}*~UP< zZ{Ro9udIvHS5DOWMm^%OIUpVbV!1&)U@mr%g^*I(40lT?!v%E*>}{vIeW0=8?I~Bp znBo!yx=k>pD*&N)Mg4fj^r*lnRHh_~#_ahSBQ8-SF5Z4ThM=s8EgmyK8sjTq4|Ff} ze}@9nAY@k{X^@y+AOqbbtkk90xoB1D`9khm?Iuy>oug-8t-N~9x+wilxujIP_SBTU zHF@7BTdv7Z-F^%SPn?L+dTiaf*=kIEYtMz5uax9_>(6(;+kLg?$?H9%)t=E$yFP#L zvj=NEKdg1WR8xL*_1G)dlvm!`d-e4{#G3+4{tes5+t0+G>Eu8^-$xxB#DoPL zgnT#b?a5As>0WF>vPtnmLib^U%Azk|!XO?w421f7j49Tv68a)Eqp-anl5c@D^^wH7 zvvZZX>v6RjSIa$hWz%(~ud4L<-02??SS6^Wa|2$_S06xykzSuYrMTx)oo+M@e?U1! zs;AQweTgC^plF{I!-<;+{$Ln_8)8nUxJI|@UhO1Y&y4)EJp_i~QA7*~Oc`#+3+$h+ z=P0${9~JLv$A~!Nf6Q&zrs$*C1^FQJ2jJgebVXA?KwpMBysp?9B+CNFaepPpYUJ2o z$nHOpL(8JTCBNi4ZbcPtoPFN8jw~V=42V`jIhT<)Lx8HCRb9a^x@g%bT k7U8($7h&b?6F*yzqbKj$_(#kK;uGYP*uk*ynZ!Z*Z@8xbwEzGB literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/listers/i3wm.py b/powerline-bin/powerline/listers/i3wm.py new file mode 100644 index 0000000..0bbcfdc --- /dev/null +++ b/powerline-bin/powerline/listers/i3wm.py @@ -0,0 +1,68 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.theme import requires_segment_info +from powerline.lib.dict import updated +from powerline.bindings.wm import get_i3_connection, get_connected_xrandr_outputs + + +@requires_segment_info +def output_lister(pl, segment_info): + '''List all outputs in segment_info format + ''' + + return ( + ( + updated(segment_info, output=output['name']), + { + 'draw_inner_divider': None + } + ) + for output in get_connected_xrandr_outputs(pl) + ) + + +@requires_segment_info +def workspace_lister(pl, segment_info, only_show=None, output=None): + '''List all workspaces in segment_info format + + Sets the segment info values of ``workspace`` and ``output`` to the name of + the i3 workspace and the ``xrandr`` output respectively and the keys + ``"visible"``, ``"urgent"`` and ``"focused"`` to a boolean indicating these + states. + + :param list only_show: + Specifies which workspaces to list. Valid entries are ``"visible"``, + ``"urgent"`` and ``"focused"``. If omitted or ``null`` all workspaces + are listed. + + :param str output: + May be set to the name of an X output. If specified, only workspaces + on that output are listed. Overrides automatic output detection by + the lemonbar renderer and bindings. Set to ``false`` to force + all workspaces to be shown. + ''' + + if output == None: + output = output or segment_info.get('output') + + return ( + ( + updated( + segment_info, + output=w['output'], + workspace={ + 'name': w['name'], + 'visible': w['visible'], + 'urgent': w['urgent'], + 'focused': w['focused'], + }, + ), + { + 'draw_inner_divider': None + } + ) + for w in get_i3_connection().get_workspaces() + if (((not only_show or any(w[typ] for typ in only_show)) + and (not output or w['output'] == output))) + ) diff --git a/powerline-bin/powerline/listers/pdb.py b/powerline-bin/powerline/listers/pdb.py new file mode 100644 index 0000000..24e11ea --- /dev/null +++ b/powerline-bin/powerline/listers/pdb.py @@ -0,0 +1,37 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.theme import requires_segment_info + + +@requires_segment_info +def frame_lister(pl, segment_info, full_stack=False, maxframes=3): + '''List all frames in segment_info format + + :param bool full_stack: + If true, then all frames in the stack are listed. Normally N first + frames are discarded where N is a number of frames present at the first + invocation of the prompt minus one. + :param int maxframes: + Maximum number of frames to display. + ''' + if full_stack: + initial_stack_length = 0 + frames = segment_info['pdb'].stack + else: + initial_stack_length = segment_info['initial_stack_length'] + frames = segment_info['pdb'].stack[initial_stack_length:] + + if len(frames) > maxframes: + frames = frames[-maxframes:] + + return ( + ( + { + 'curframe': frame[0], + 'initial_stack_length': initial_stack_length, + }, + {} + ) + for frame in frames + ) diff --git a/powerline-bin/powerline/listers/vim.py b/powerline-bin/powerline/listers/vim.py new file mode 100644 index 0000000..583e0d3 --- /dev/null +++ b/powerline-bin/powerline/listers/vim.py @@ -0,0 +1,123 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.theme import requires_segment_info +from powerline.bindings.vim import (current_tabpage, list_tabpages) + +try: + import vim +except ImportError: + vim = object() + + +def tabpage_updated_segment_info(segment_info, tabpage): + segment_info = segment_info.copy() + window = tabpage.window + buffer = window.buffer + segment_info.update( + tabpage=tabpage, + tabnr=tabpage.number, + window=window, + winnr=window.number, + window_id=int(window.vars.get('powerline_window_id', -1)), + buffer=buffer, + bufnr=buffer.number, + ) + return segment_info + + +@requires_segment_info +def tablister(pl, segment_info, **kwargs): + '''List all tab pages in segment_info format + + Specifically generates a list of segment info dictionaries with ``window``, + ``winnr``, ``window_id``, ``buffer`` and ``bufnr`` keys set to tab-local + ones and additional ``tabpage`` and ``tabnr`` keys. + + Adds either ``tab:`` or ``tab_nc:`` prefix to all segment highlight groups. + + Works best with vim-7.4 or later: earlier versions miss tabpage object and + thus window objects are not available as well. + ''' + cur_tabpage = current_tabpage() + cur_tabnr = cur_tabpage.number + + def add_multiplier(tabpage, dct): + dct['priority_multiplier'] = 1 + (0.001 * abs(tabpage.number - cur_tabnr)) + return dct + + return ( + (lambda tabpage, prefix: ( + tabpage_updated_segment_info(segment_info, tabpage), + add_multiplier(tabpage, { + 'highlight_group_prefix': prefix, + 'divider_highlight_group': 'tab:divider' + }) + ))(tabpage, 'tab' if tabpage == cur_tabpage else 'tab_nc') + for tabpage in list_tabpages() + ) + + +def buffer_updated_segment_info(segment_info, buffer): + segment_info = segment_info.copy() + segment_info.update( + window=None, + winnr=None, + window_id=None, + buffer=buffer, + bufnr=buffer.number, + ) + return segment_info + + +@requires_segment_info +def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): + '''List all buffers in segment_info format + + Specifically generates a list of segment info dictionaries with ``buffer`` + and ``bufnr`` keys set to buffer-specific ones, ``window``, ``winnr`` and + ``window_id`` keys set to None. + + Adds one of ``buf:``, ``buf_nc:``, ``buf_mod:``, or ``buf_nc_mod`` + prefix to all segment highlight groups. + + :param bool show_unlisted: + True if unlisted buffers should be shown as well. Current buffer is + always shown. + ''' + cur_buffer = vim.current.buffer + cur_bufnr = cur_buffer.number + + def add_multiplier(buffer, dct): + dct['priority_multiplier'] = 1 + (0.001 * abs(buffer.number - cur_bufnr)) + return dct + + return ( + (lambda buffer, current, modified: ( + buffer_updated_segment_info(segment_info, buffer), + add_multiplier(buffer, { + 'highlight_group_prefix': '{0}{1}'.format(current, modified), + 'divider_highlight_group': 'tab:divider' + }) + ))( + buffer, + 'buf' if buffer is cur_buffer else 'buf_nc', + '_mod' if int(vim.eval('getbufvar({0}, \'&modified\')'.format(buffer.number))) > 0 else '' + ) + for buffer in vim.buffers if ( + buffer is cur_buffer + or show_unlisted + # We can't use vim_getbufoption(segment_info, 'buflisted') + # here for performance reasons. Querying the buffer options + # through the vim python module's option attribute caused + # vim to think it needed to update the tabline for every + # keystroke after any event that changed the buffer's + # options. + # + # Using the vim module's eval method to directly use the + # buflisted(nr) vim method instead does not cause vim to + # update the tabline after every keystroke, but rather after + # events that would change that status. Fixes #1281 + or int(vim.eval('buflisted(%s)' % buffer.number)) > 0 + ) + ) diff --git a/powerline-bin/powerline/matchers/__init__.py b/powerline-bin/powerline/matchers/__init__.py new file mode 100644 index 0000000..b2b9f10 --- /dev/null +++ b/powerline-bin/powerline/matchers/__init__.py @@ -0,0 +1,6 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) +from pkgutil import extend_path + + +__path__ = extend_path(__path__, __name__) diff --git a/powerline-bin/powerline/matchers/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/matchers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f38cc0b5bb8143a5b07ec794c26e6fc1bf8d5b0a GIT binary patch literal 386 zcmX|5Jx{|h5Veyu2`!;)Fd#7pse}a(2r=*jm^x*#(!^~nY{zmg(2o2AHda=|pI~QT z=w`&kfY?CYI^h7~q;@FZ~RGK-j@2QAMM5Gqkj4ItAK3WJ0Fa!(yjj}p#CiJC!K$wXCG zRC6Y2A~MKJs_TRhCK(X2t7gmaL{vq?>8bA9mDqZ{W#QAs7{8<891UO5_Lq-VH*ThP NoAchzb*Ljd@C_)|ZQ}p{ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/matchers/vim/__init__.py b/powerline-bin/powerline/matchers/vim/__init__.py new file mode 100644 index 0000000..f6de45e --- /dev/null +++ b/powerline-bin/powerline/matchers/vim/__init__.py @@ -0,0 +1,19 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from powerline.bindings.vim import vim_getbufoption, buffer_name + + +def help(matcher_info): + return vim_getbufoption(matcher_info, 'buftype') == 'help' + + +def cmdwin(matcher_info): + name = buffer_name(matcher_info) + return name and os.path.basename(name) == b'[Command Line]' + + +def quickfix(matcher_info): + return vim_getbufoption(matcher_info, 'buftype') == 'quickfix' diff --git a/powerline-bin/powerline/matchers/vim/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/matchers/vim/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91e3fe9f60f9f0fd3e7ac281dfc21a4f39c7c95d GIT binary patch literal 1011 zcmb7CK~EDw6rR~`+o7~TkpKq{tufJ!!su-=X;${I0 zZVqs?tr_{Biqz2ML=wgXQi+6kA=y>4L)wXUS z^b8r9HJJw{(T+T+w>&>O!aNTj9${Hzj%c*t7c^*wv7)J*ub6^GW<;ZT;c(D1|KNV> zZuD^Xk?GUA8MQ?#49qCp@wiU|&m1tsCdfB!Afm#y7os*F1-2AMAc>~{_R$YA`(f^| z-6QutKJSvn4qog-9bGb~jHTvWNG_W@9vFR%_wX*}*D(^qmZD8{DOX}s*}M{ac*x@7 z!3Ak+@fe(X@ib)23Eavm_}K^qQ;jm*iDK8(U4f%Zsq(sg|_8sZKttiV7xS{o5O>OO`r#DHUTBWx<9) z6$$rjn=2_?Y2sN0IR%PDPG5|~LY)RK4L0Hh7>RV!(wqD{5b9>qKOdo#KGkzhYAkdU r-+RL6;Jp$WR{?%!Fvh27y@%FM(8wuTKFeWTJ0lu?+%I6fj8lp~*<|8` literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/matchers/vim/plugin/__init__.py b/powerline-bin/powerline/matchers/vim/plugin/__init__.py new file mode 100644 index 0000000..b2b9f10 --- /dev/null +++ b/powerline-bin/powerline/matchers/vim/plugin/__init__.py @@ -0,0 +1,6 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) +from pkgutil import extend_path + + +__path__ = extend_path(__path__, __name__) diff --git a/powerline-bin/powerline/matchers/vim/plugin/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/matchers/vim/plugin/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34885cc7c89634db417de5cc3aaad5f35864508b GIT binary patch literal 397 zcmX|5Jx{|h5Veyu2`!;)Fd#7psh9;22=NbK>XgMw8@I8r9m~0tcH|#)V`WAB33djC zZb3{8hz-=O6AmCwx_9qB-rYS#Q5#u{o?k|fHojT^H}8)vPc6Ac8OpFg5+_(Xi6h;_ zm0sfErtXNA^b;Q=2Qi-oEPQZ&wMj5@WACF$Vz1t;6dx8Dqk;o7sVM6(;}c%;Le<@L zP!^&BM!D35fqFw5u7HjzH3T~lU zv&LX}55PW(QH&GBaDbT=Sj-M=<^&Elc`I=P7fw4VuwqbTUf@CAd4qyd*Q&aIOrxr! z=kk;`cuc~CDk7sK(_Tz>XhwOeD^We;Nv=ppnc!0C^Fq>8h0Q!|D0r}0we;K$W#JZ4 z^}NZ2N$MGZO(MfIVx$55r{(~%;TygMw~y5Hu7?iC_!U;>#mIUv+u?ZL*m`jjp$^V& zVAR7MEU#gtOuvzB7bfWJ+%BEr3F_g=e`4G8dkz9@YOhHXqPl{-EHyY|Q5vtP%!8UI zyv85HUDcH)ltpmb;+b|tq*~gmM;S3gf(qwYq#7+4nx;*z9h1!r^`)iLXTD;>7gVgM zNP$h9C#GTGvKcRJBbXAL|zTj;l6Pgl#+$i%wS6?Lg7ES#zEww7T+M5LO0`xaS zW{<$_qF>&{y{7~3>h7iA*8JYa!R3Lq{CTEt-T#ZQz5b(6{#ICfFF&;3wZB&u`<2B5 zXHdER@k+n4cH-KWJ%lExTGr(d)~j+!!cdx3NTafJjWa6C8E|@G%6GL+)0n1P*(&fI zDfC|}L+%rj^QL4D+^M(0c$_EXfn0#ltUEK{#KssOquKz~j!@|sJscKXY>(>x0dm;E AO8@`> literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/matchers/vim/plugin/__pycache__/gundo.cpython-312.pyc b/powerline-bin/powerline/matchers/vim/plugin/__pycache__/gundo.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f915023ba6a4a8fb8a2b323999f229a79c1510b9 GIT binary patch literal 930 zcmc&zF>ljA6uxtu#0gEQOGOzN8iWK_kR>nsB6b2G9fDX0_AvQ#|PTZNqOMd_-`Sa)Jcb~ua?)hV-QU+>OK7H$+LIBS6 z!)h5zvS=zY20rj%07B@(&~S|~=jKAwHKC3hLEg=)doC!1MYpJ8=4;?ueqLc|Xw(Y7 zv{cQM8wn+y$j2xk0&_2jrR9?WiAhA|Wv?AaK_W0BA&a<>>x>gBP&c6+p%V6MP+n>$ z-7e;cdLiy8zuC$urmuysU<^d|ZUjCo`71br$B^HEK&&bQhi0abk;7s}GctlJ6(7F5 z4ZsUfGxp<>dXLbPg!&Oe6O-$W(uiVdGEelS)%IenolXq77J8!7SI!CTM$**LSi9KS zIe+SikU5O7J>l^l7JK*a_3yIA@k1vdZHEm-KcWtcjxY}h#m-VFb_OJLSdjDxb$Z%D zoegC^W!zTE+FZP=-~@cPuDp3Rx2h*wU#+#zR^#2~c>C@47rQ#MtM6~l?OUhKncbMe z#zLio|KC?_f7RFL91jRSLWt{vctydoaePB@SxGBK>|Yw+Qn7WNb4S62%3BvIpYFD1 zc54b-d{b?xm1P;JffEVG>Wg}yxSkN6*HF-)e;0W*JC1srP@m9VTvx}D4nW%c)W-y* yqN&ews~JXq65vPtno`gs8DCfMI|m{B2@dAq;0%<0fcl?;0Us>N27CH--;CJV`O;!ARoeYVc$(o{jp z&;ceGkUAqFA;iM}!9YufqAOd45L=~eowy5iBJ~aL*WG*fz3<((LLmo)6uuvK+7N&f z86=WAcP1_2>;o6L&;vfSps!eppR!WEYN=4>6)$b2r&hBxVN+hl*DW0a1t6_|IcYez zuKGp1CdJCR={;aA3=~8AD-(vwi!s6Nz(ux)8KRCCaoxq+IKlzpi%u&FyqF;y`(Z#C zzZ6nTnB9pH;d&24{S?kC<5CT}G6IWS<|&}c?n;rS`-W}{ZK z8#SKx9oFt~C5X5hI;_X_mJ=a4qM`8o^iYh9NhjdybZ`lFdHL*_$^6g^ak$PL+C^;r z-re4<@czyN)59$@9I#$M%rJO~sD}wM&l^SNHulZXi@TVZ1W{MAR|yAPPXbyJ{Uy24 zZJ|csmwx5l)3JVYboHm6|Djjk-#99*9F|r-KK``zVe6>8aai8?+8mc3j!V@8Se=L> zVB~qu7OP`1MYc`lBB&~rq?bxQsici76!B{_jFlE9E+*ZmA~61^D$@@95POJbWsOAk z8BqD}Xi=y$ebW!z*h7!#brH%PM{7czrXYlWKywV5Cm?$avcEy)R0GAO*Yxe~o85z@ Q)$!umC_m8@xH;|i51$&tcmMzZ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/matchers/vim/plugin/commandt.py b/powerline-bin/powerline/matchers/vim/plugin/commandt.py new file mode 100644 index 0000000..7eefe9b --- /dev/null +++ b/powerline-bin/powerline/matchers/vim/plugin/commandt.py @@ -0,0 +1,14 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from powerline.bindings.vim import vim_getbufoption, buffer_name + + +def commandt(matcher_info): + name = buffer_name(matcher_info) + return ( + vim_getbufoption(matcher_info, 'filetype') == 'command-t' + or (name and os.path.basename(name) == b'GoToFile') + ) diff --git a/powerline-bin/powerline/matchers/vim/plugin/gundo.py b/powerline-bin/powerline/matchers/vim/plugin/gundo.py new file mode 100644 index 0000000..e0fe377 --- /dev/null +++ b/powerline-bin/powerline/matchers/vim/plugin/gundo.py @@ -0,0 +1,16 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from powerline.bindings.vim import buffer_name + + +def gundo(matcher_info): + name = buffer_name(matcher_info) + return name and os.path.basename(name) == b'__Gundo__' + + +def gundo_preview(matcher_info): + name = buffer_name(matcher_info) + return name and os.path.basename(name) == b'__Gundo_Preview__' diff --git a/powerline-bin/powerline/matchers/vim/plugin/nerdtree.py b/powerline-bin/powerline/matchers/vim/plugin/nerdtree.py new file mode 100644 index 0000000..d6e9f69 --- /dev/null +++ b/powerline-bin/powerline/matchers/vim/plugin/nerdtree.py @@ -0,0 +1,15 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import re + +from powerline.bindings.vim import buffer_name + + +NERD_TREE_RE = re.compile(b'NERD_tree_\\d+') + + +def nerdtree(matcher_info): + name = buffer_name(matcher_info) + return name and NERD_TREE_RE.match(os.path.basename(name)) diff --git a/powerline-bin/powerline/pdb.py b/powerline-bin/powerline/pdb.py new file mode 100644 index 0000000..b1e13ce --- /dev/null +++ b/powerline-bin/powerline/pdb.py @@ -0,0 +1,48 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import platform +import os + +from powerline import Powerline +from powerline.lib.overrides import parse_override_var +from powerline.lib.dict import mergeargs, mergedicts + + +class PDBPowerline(Powerline): + '''PDB-specific powerline bindings + ''' + def init(self, **kwargs): + return super(PDBPowerline, self).init( + ext='pdb', + renderer_module='pdb', + **kwargs + ) + + def do_setup(self, pdb): + self.update_renderer() + self.renderer.set_pdb(pdb) + + def load_main_config(self): + r = super(PDBPowerline, self).load_main_config() + config_overrides = os.environ.get('POWERLINE_CONFIG_OVERRIDES') + if config_overrides: + mergedicts(r, mergeargs(parse_override_var(config_overrides))) + return r + + def load_theme_config(self, name): + r = super(PDBPowerline, self).load_theme_config(name) + theme_overrides = os.environ.get('POWERLINE_THEME_OVERRIDES') + if theme_overrides: + theme_overrides_dict = mergeargs(parse_override_var(theme_overrides)) + if name in theme_overrides_dict: + mergedicts(r, theme_overrides_dict[name]) + return r + + def get_config_paths(self): + paths = [path for path in os.environ.get('POWERLINE_CONFIG_PATHS', '').split(':') if path] + return paths or super(PDBPowerline, self).get_config_paths() + + if sys.version_info < (3,) and platform.python_implementation() == 'PyPy': + get_encoding = staticmethod(lambda: 'ascii') diff --git a/powerline-bin/powerline/renderer.py b/powerline-bin/powerline/renderer.py new file mode 100644 index 0000000..040b406 --- /dev/null +++ b/powerline-bin/powerline/renderer.py @@ -0,0 +1,594 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import os +import re +import operator + +from itertools import chain + +from powerline.theme import Theme +from powerline.lib.unicode import unichr, strwidth_ucs_2, strwidth_ucs_4 + + +NBSP = ' ' + + +np_control_character_translations = dict(( + # Control characters: ^@ … ^Y + (i1, '^' + unichr(i1 + 0x40)) for i1 in range(0x20) +)) +'''Control character translations + +Dictionary that maps characters in range 0x00–0x1F (inclusive) to strings +``'^@'``, ``'^A'`` and so on. + +.. note: maps tab to ``^I`` and newline to ``^J``. +''' + +np_invalid_character_translations = dict(( + # Invalid unicode characters obtained using 'surrogateescape' error + # handler. + (i2, '<{0:02x}>'.format(i2 - 0xDC00)) for i2 in range(0xDC80, 0xDD00) +)) +'''Invalid unicode character translations + +When using ``surrogateescape`` encoding error handling method characters in +range 0x80–0xFF (inclusive) are transformed into unpaired surrogate escape +unicode codepoints 0xDC80–0xDD00. This dictionary maps such characters to +``<80>``, ``<81>``, and so on: in Python-3 they cannot be printed or +converted to UTF-8 because UTF-8 standard does not allow surrogate escape +characters, not even paired ones. Python-2 contains a bug that allows such +action, but printing them in any case makes no sense. +''' + +# XXX: not using `r` because it makes no sense. +np_invalid_character_re = re.compile('(? width: + for segment in chain(segments_priority, no_priority_segments): + if segment['truncate'] is not None: + segment['contents'] = segment['truncate'](self.pl, current_width - width, segment) + + segments_priority = iter(segments_priority) + if current_width > width and len(segments) > 100: + # When there are too many segments use faster, but less correct + # algorythm for width computation + diff = current_width - width + for segment in segments_priority: + segments.remove(segment) + diff -= segment['_len'] + if diff <= 0: + break + current_width = self._render_length(theme, segments, divider_widths) + if current_width > width: + # When there are not too much use more precise, but much slower + # width computation. It also finishes computations in case + # previous variant did not free enough space. + for segment in segments_priority: + segments.remove(segment) + current_width = self._render_length(theme, segments, divider_widths) + if current_width <= width: + break + del segments_priority + + # Distribute the remaining space on spacer segments + segments_spacers = [segment for segment in segments if segment['expand'] is not None] + if segments_spacers: + distribute_len, distribute_len_remainder = divmod(width - current_width, len(segments_spacers)) + for segment in segments_spacers: + segment['contents'] = ( + segment['expand']( + self.pl, + distribute_len + (1 if distribute_len_remainder > 0 else 0), + segment)) + distribute_len_remainder -= 1 + # `_len` key is not needed anymore, but current_width should have an + # actual value for various bindings. + current_width = width + elif output_width: + current_width = self._render_length(theme, segments, divider_widths) + + rendered_highlighted = self.hl_join([ + segment['_rendered_hl'] + for segment in self._render_segments(theme, segments) + ]) + if rendered_highlighted: + rendered_highlighted += self.hlstyle() + + return construct_returned_value(rendered_highlighted, segments, current_width, output_raw, output_width) + + def _prepare_segments(self, segments, calculate_contents_len): + '''Translate non-printable characters and calculate segment width + ''' + for segment in segments: + segment['contents'] = translate_np(segment['contents']) + if calculate_contents_len: + for segment in segments: + if segment['literal_contents'][1]: + segment['_contents_len'] = segment['literal_contents'][0] + else: + segment['_contents_len'] = self.strwidth(segment['contents']) + + def _render_length(self, theme, segments, divider_widths): + '''Update segments lengths and return them + ''' + segments_len = len(segments) + ret = 0 + divider_spaces = theme.get_spaces() + prev_segment = theme.EMPTY_SEGMENT + try: + first_segment = next(iter(( + segment + for segment in segments + if not segment['literal_contents'][1] + ))) + except StopIteration: + first_segment = None + try: + last_segment = next(iter(( + segment + for segment in reversed(segments) + if not segment['literal_contents'][1] + ))) + except StopIteration: + last_segment = None + for index, segment in enumerate(segments): + side = segment['side'] + segment_len = segment['_contents_len'] + if not segment['literal_contents'][1]: + if side == 'left': + if segment is not last_segment: + compare_segment = next(iter(( + segment + for segment in segments[index + 1:] + if not segment['literal_contents'][1] + ))) + else: + compare_segment = theme.EMPTY_SEGMENT + else: + compare_segment = prev_segment + + divider_type = 'soft' if compare_segment['highlight']['bg'] == segment['highlight']['bg'] else 'hard' + + outer_padding = int(bool( + segment is first_segment + if side == 'left' else + segment is last_segment + )) * theme.outer_padding + + draw_divider = segment['draw_' + divider_type + '_divider'] + segment_len += outer_padding + if draw_divider: + segment_len += divider_widths[side][divider_type] + divider_spaces + prev_segment = segment + + segment['_len'] = segment_len + ret += segment_len + return ret + + def _render_segments(self, theme, segments, render_highlighted=True): + '''Internal segment rendering method. + + This method loops through the segment array and compares the + foreground/background colors and divider properties and returns the + rendered statusline as a string. + + The method always renders the raw segment contents (i.e. without + highlighting strings added), and only renders the highlighted + statusline if render_highlighted is True. + ''' + segments_len = len(segments) + divider_spaces = theme.get_spaces() + prev_segment = theme.EMPTY_SEGMENT + try: + first_segment = next(iter(( + segment + for segment in segments + if not segment['literal_contents'][1] + ))) + except StopIteration: + first_segment = None + try: + last_segment = next(iter(( + segment + for segment in reversed(segments) + if not segment['literal_contents'][1] + ))) + except StopIteration: + last_segment = None + + for index, segment in enumerate(segments): + side = segment['side'] + if not segment['literal_contents'][1]: + if side == 'left': + if segment is not last_segment: + compare_segment = next(iter(( + segment + for segment in segments[index + 1:] + if not segment['literal_contents'][1] + ))) + else: + compare_segment = theme.EMPTY_SEGMENT + else: + compare_segment = prev_segment + outer_padding = int(bool( + segment is first_segment + if side == 'left' else + segment is last_segment + )) * theme.outer_padding * ' ' + divider_type = 'soft' if compare_segment['highlight']['bg'] == segment['highlight']['bg'] else 'hard' + + divider_highlighted = '' + contents_raw = segment['contents'] + contents_highlighted = '' + draw_divider = segment['draw_' + divider_type + '_divider'] + + # XXX Make sure self.hl() calls are called in the same order + # segments are displayed. This is needed for Vim renderer to work. + if draw_divider: + divider_raw = self.escape(theme.get_divider(side, divider_type)) + if side == 'left': + contents_raw = outer_padding + contents_raw + (divider_spaces * ' ') + else: + contents_raw = (divider_spaces * ' ') + contents_raw + outer_padding + + if divider_type == 'soft': + divider_highlight_group_key = 'highlight' if segment['divider_highlight_group'] is None else 'divider_highlight' + divider_fg = segment[divider_highlight_group_key]['fg'] + divider_bg = segment[divider_highlight_group_key]['bg'] + else: + divider_fg = segment['highlight']['bg'] + divider_bg = compare_segment['highlight']['bg'] + + if side == 'left': + if render_highlighted: + contents_highlighted = self.hl(self.escape(contents_raw), **segment['highlight']) + divider_highlighted = self.hl(divider_raw, divider_fg, divider_bg, False) + segment['_rendered_raw'] = contents_raw + divider_raw + segment['_rendered_hl'] = contents_highlighted + divider_highlighted + else: + if render_highlighted: + divider_highlighted = self.hl(divider_raw, divider_fg, divider_bg, False) + contents_highlighted = self.hl(self.escape(contents_raw), **segment['highlight']) + segment['_rendered_raw'] = divider_raw + contents_raw + segment['_rendered_hl'] = divider_highlighted + contents_highlighted + else: + if side == 'left': + contents_raw = outer_padding + contents_raw + else: + contents_raw = contents_raw + outer_padding + + contents_highlighted = self.hl(self.escape(contents_raw), **segment['highlight']) + segment['_rendered_raw'] = contents_raw + segment['_rendered_hl'] = contents_highlighted + prev_segment = segment + else: + segment['_rendered_raw'] = ' ' * segment['literal_contents'][0] + segment['_rendered_hl'] = segment['literal_contents'][1] + yield segment + + def escape(self, string): + '''Method that escapes segment contents. + ''' + return string.translate(self.character_translations) + + def hlstyle(fg=None, bg=None, attrs=None): + '''Output highlight style string. + + Assuming highlighted string looks like ``{style}{contents}`` this method + should output ``{style}``. If it is called without arguments this method + is supposed to reset style to its default. + ''' + raise NotImplementedError + + def hl(self, contents, fg=None, bg=None, attrs=None): + '''Output highlighted chunk. + + This implementation just outputs :py:meth:`hlstyle` joined with + ``contents``. + ''' + return self.hlstyle(fg, bg, attrs) + (contents or '') diff --git a/powerline-bin/powerline/renderers/__init__.py b/powerline-bin/powerline/renderers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/powerline-bin/powerline/renderers/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/renderers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9b848903105019b82ea9c52e43b702ac9e487e7 GIT binary patch literal 164 zcmX@j%ge<81ia^Or-A6lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxd<*Z+lTcBT%S)f~z zSd^YxqHAWFVNhURVX2>!nWSG(S(1^Tr(cj?o?4WXnU|_xl$w{4T9jH;tREkrnU`4- lAFo$X`HRCQH$SB`C)KWq6=)_S5Ep|OADI~$8H<>KEC3YKDEI&X literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/__pycache__/i3bar.cpython-312.pyc b/powerline-bin/powerline/renderers/__pycache__/i3bar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6046c225a4f9b5b6914396abf16fbd04179769e9 GIT binary patch literal 1443 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 E0Ys4CJOBUy literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/__pycache__/pango_markup.cpython-312.pyc b/powerline-bin/powerline/renderers/__pycache__/pango_markup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c721f9c75bae2107b337a0a82da363cdd5624fc9 GIT binary patch literal 1877 zcmbVM%Wo4$7@vK5{YYYx7z$LvGOd~o#7>2vG!P_SjgeB9hV-(kx>|e3_L6;=*>w|d zjg&|^_CQZbZ#`0Rp|}1IJ=9JPq|-yG5URKZg%hWKv$jJ+ICZr9%{Sj~<~P6j=JDIm zPy#_2`u)%9GZCR@tT8B3-`OjJvw=)xayD`}jdOU7cLYsvL`~#aoVO)M)?$$_*oqU^ z;*l@f2`8x~os^bxhO{9L@n{a2(mFC_9DgMA__bj?tc|o{s`7#bRFS5eu2u0&tlL(A ziDCOxF|BVc-|}2KVw8Q)ZU$JloQ6jNI@}pmVuFb( z(D>EG#RdJ^7xOo0GIDP%UY);noeoEhuSz#=F3jI5-K_LP^=w}u+Pett4TO=#nMmVJ zP7|XCbs3` zYy@YW2+#Vs=3qC-lD_u*0ZEK^1pYnPEs)gWRK7&f&q(E|Xpovu<)vj-`#j*;?CZHg z;4}&it1%To7za}q&ex|KpR9aZu&r{T(F*FGTWAcF6b6&}g$9$X_cY}jEgGxae$cXU zc=8>K$@jq_nADGfSw*`tN~HF{MWxE%B(WCrSzh;MAV(XhhVDyke(iJ{vfAXxDX975 z07tF&+L9^U?dKAL`(@B;kmni~!qmVd0F%&X65e7G-^tYPb%;q^`?xJeOjB(!VA+gH z2x^E7x}^O%#enU_K~(+^Djz~)1JqQ^_}%ybe^a-mfu0b8W`fx^7x_tM?;tf5ju)+3 z-G)EN8iP}l|Lg@zSD2}K1lNeybj{h^>F=gzrZ24A&xM(?QCT`19<6$Cg_benn$49x z+suVyQ7qc>*_;&^wpGc6qrlfYv$Hwha%(ouh4N(|&Pw(*2j7)2cDcZsS5%40pusT$ z!q!LFGeeSKsCd`2T(}gXkL@Z|Dlj!1cc1dr8s*D1Dj7jQe3~+rvF|xpkD4rp*{F~) zM#9(a@aVe_;wa$$-(XhJ(<5W6XLqF7>Nh*G@<3YiHglU_{`lcf&F+b_J7T(%Ir}7Y zuA4dc_}b%pzuer;%yh;tb;V1o^Z##5q9YyMJpWMYo}Ai|liyog^08nj# zevV{dm8wuGmDD&@blo)|T{=zZy5pHmoB1hSzt=SEJ`&S))2pzs9~gmEaWGtelZ*om z$$_CUz4vw!c85ut88%0hbHXlnWY}K%DwuWj2UmE?55MGjKD8$xVPrS*lr&%DUVea* z#~v(iCr+&$?XfU|lA2}$tIeQEKp+nVLsj@%v;0j+WmwSo3Lh?Y#E|Nb9W>?@i?jN+c kjTWDy{B!itU#Qqc#aHqPF1tDL3PH6ygHor~lxUs*0$Swnxc~qF literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/__pycache__/pdb.cpython-312.pyc b/powerline-bin/powerline/renderers/__pycache__/pdb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab445d29fac20f657238a002b77d32df436d225c GIT binary patch literal 2616 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 G>i!Gxz+|-m literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/__pycache__/vim.cpython-312.pyc b/powerline-bin/powerline/renderers/__pycache__/vim.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..657fe18da275f5f39f951ba9519c9163fad9a651 GIT binary patch literal 8832 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/ipython/__pycache__/pre_5.cpython-312.pyc b/powerline-bin/powerline/renderers/ipython/__pycache__/pre_5.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa31d7c4e0fa52c5a5e9670a0a9df9ce870827af GIT binary patch literal 3367 zcmbVOO>7&-6`q-0Qrwj&$quDP^4~fZ+EA@X*_P@iEs~&sllo9a{(%m>EGX_MTy?q2 z&MYlUU;q^`P#@Z&m%=%^Ko2t9LykH27@&uei3_S*2Pn`MMQ^etpg~T3Z+5xX4_lyJ zfNy8sydA#py*J;R-{$BIK_)=|9S}K4~at@>X8Pm&<3lphE~xU zdPS$GXI`d}tz^|$^M)F^N=}V+&uEwxlM+VWBTnW%akAXx*(Z9ub7ffRhd`g>!#tPj zN0i7$2*QZ{~}m|3tH*9*wtrw-z|u_S}$*swbnI{0LAz%UUfXz=ZAD- zHLLDZj-+mqd)ubBd2T3c8!Id z6%ZY^un%jbmSTlT8k1Wv!I-q^dKwk9jvt5qmOV-Il!QrT5)vjAO)zew5I5b?+SH|O zmc%Zz6b&UnprnkN=R)#q*NH}wMB1(o8O+1qKow+LO{WUQ3p){kXd=T2>?GE@7)LeY z6Q@v|1|iV_3*szZLDe*ft@8szlx~D!ly885DDAS*9-HX0iAP3wkMR5+rc@&t**fEumi#SE`HTcOK2t=~DOEa+%F8xp5znXZz6!^=^y%fN;lK}j{ zpX-ANTA@NA_=W(2JcLBN22LDzdg&IOpIin3tTA?K zd-mD6#qPP4-%WSUt$cbHM%yz_+4QriQg`b8Pi8w)?|+(w(e}(A*`%uU6X8M{+J6(o zL%1ch$vTXVKkJ8?I#~pEC4F{%OqYsG6k#PgEz~)-tE<6XyaD)JK8^uLI(8<-m`4zc z5`4F19R+)G7wqNI0s*j%g$IS6aj|P$>=_HdkRLl8DDFj9XQ^oPHNFYsB{>Vdum}&5XxwL1q1@W`Rn3?nVxz6GxPk%h2G^G-OD$6#?7vAb63ypY1Az2j+}mu z?>$1b!hcD42pj&t3CHUsglRxX28Hfrp-{3(4hJgA$$Bevf(<_onL>)^4f<%@fEHkK z{2cVZxe9CYJ0P%oUf7=LvB@r*?6C`7cHvQ>!{&D;KV$Q|>=G_bciD80UFtGusc`?; zS^1nTsOT&ea|7GQH(_H{nQ^~FM~*Y|*HMQ8kGaIobDunCI?KE;HMUG&n3TOsUt}38 z?B}3gs=rhAOT|;zsMlIy3$9eQK*$24DX>xnUi+h|^d^?vso*AAl6W(YFMhB6$91re zuge0vTy$oTVR91^*w?tAe)<1O)B*aL}F;>`_e zkkWsUJD-y~e2)y=6WMt|mITf~l10bCnTmS$7 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/ipython/__pycache__/since_5.cpython-312.pyc b/powerline-bin/powerline/renderers/ipython/__pycache__/since_5.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e96b80cb2f87ab987e840f847870edcbd51e2f20 GIT binary patch literal 6347 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/ipython/pre_5.py b/powerline-bin/powerline/renderers/ipython/pre_5.py new file mode 100644 index 0000000..9fc8c21 --- /dev/null +++ b/powerline-bin/powerline/renderers/ipython/pre_5.py @@ -0,0 +1,56 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.renderers.shell import ShellRenderer +from powerline.renderers.shell.readline import ReadlineRenderer +from powerline.renderers.ipython import IPythonRenderer + + +class IPythonPre50Renderer(IPythonRenderer, ShellRenderer): + '''Powerline ipython segment renderer for pre-5.0 IPython versions.''' + def render(self, **kwargs): + # XXX super(ShellRenderer), *not* super(IPythonPre50Renderer) + return super(ShellRenderer, self).render(**kwargs) + + def do_render(self, segment_info, **kwargs): + segment_info.update(client_id='ipython') + return super(IPythonPre50Renderer, self).do_render( + segment_info=segment_info, + **kwargs + ) + + +class IPythonPromptRenderer(IPythonPre50Renderer, ReadlineRenderer): + '''Powerline ipython prompt (in and in2) renderer''' + pass + + +class IPythonNonPromptRenderer(IPythonPre50Renderer): + '''Powerline ipython non-prompt (out and rewrite) renderer''' + pass + + +class RendererProxy(object): + '''Powerline IPython renderer proxy which chooses appropriate renderer + + Instantiates two renderer objects: one will be used for prompts and the + other for non-prompts. + ''' + def __init__(self, **kwargs): + old_widths = {} + self.non_prompt_renderer = IPythonNonPromptRenderer(old_widths=old_widths, **kwargs) + self.prompt_renderer = IPythonPromptRenderer(old_widths=old_widths, **kwargs) + + def render_above_lines(self, *args, **kwargs): + return self.non_prompt_renderer.render_above_lines(*args, **kwargs) + + def render(self, is_prompt, *args, **kwargs): + return (self.prompt_renderer if is_prompt else self.non_prompt_renderer).render( + *args, **kwargs) + + def shutdown(self, *args, **kwargs): + self.prompt_renderer.shutdown(*args, **kwargs) + self.non_prompt_renderer.shutdown(*args, **kwargs) + + +renderer = RendererProxy diff --git a/powerline-bin/powerline/renderers/ipython/since_5.py b/powerline-bin/powerline/renderers/ipython/since_5.py new file mode 100644 index 0000000..8a26da7 --- /dev/null +++ b/powerline-bin/powerline/renderers/ipython/since_5.py @@ -0,0 +1,130 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import operator + +from collections import defaultdict + +try: + from __builtin__ import reduce +except ImportError: + from functools import reduce + +from pygments.token import Token +from prompt_toolkit.styles import DynamicStyle, Attrs + +from powerline.renderers.ipython import IPythonRenderer +from powerline.ipython import IPythonInfo +from powerline.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE + + +PowerlinePromptToken = Token.Generic.Prompt.Powerline + + +# Note: since 2.7 there is dict.__missing__ with same purpose. But in 2.6 one +# must use defaultdict to get __missing__ working. +class PowerlineStyleDict(defaultdict): + '''Dictionary used for getting pygments style for Powerline groups + ''' + def __new__(cls, missing_func): + return defaultdict.__new__(cls) + + def __init__(self, missing_func): + super(PowerlineStyleDict, self).__init__() + self.missing_func = missing_func + + def __missing__(self, key): + return self.missing_func(key) + + +class PowerlinePromptStyle(DynamicStyle): + def get_attrs_for_token(self, token): + if ( + token not in PowerlinePromptToken + or len(token) != len(PowerlinePromptToken) + 1 + or not token[-1].startswith('Pl') + or token[-1] == 'Pl' + ): + return super(PowerlinePromptStyle, self).get_attrs_for_token(token) + ret = { + 'color': None, + 'bgcolor': None, + 'bold': None, + 'underline': None, + 'italic': None, + 'reverse': False, + 'blink': False, + } + for prop in token[-1][3:].split('_'): + if prop[0] == 'a': + ret[prop[1:]] = True + elif prop[0] == 'f': + ret['color'] = prop[1:] + elif prop[0] == 'b': + ret['bgcolor'] = prop[1:] + return Attrs(**ret) + + def get_token_to_attributes_dict(self): + dct = super(PowerlinePromptStyle, self).get_token_to_attributes_dict() + + def fallback(key): + try: + return dct[key] + except KeyError: + return self.get_attrs_for_token(key) + + return PowerlineStyleDict(fallback) + + def invalidation_hash(self): + return super(PowerlinePromptStyle, self).invalidation_hash() + 1 + + +class IPythonPygmentsRenderer(IPythonRenderer): + reduce_initial = [] + + def get_segment_info(self, segment_info, mode): + return super(IPythonPygmentsRenderer, self).get_segment_info( + IPythonInfo(segment_info), mode) + + @staticmethod + def hl_join(segments): + return reduce(operator.iadd, segments, []) + + def hl(self, contents, fg=None, bg=None, attrs=None): + '''Output highlighted chunk. + + This implementation outputs a list containing a single pair + (:py:class:`pygments.token.Token`, + :py:class:`powerline.lib.unicode.unicode`). + ''' + guifg = None + guibg = None + attrs = [] + if fg is not None and fg is not False: + guifg = fg[1] + if bg is not None and bg is not False: + guibg = bg[1] + if attrs: + attrs = [] + if attrs & ATTR_BOLD: + attrs.append('bold') + if attrs & ATTR_ITALIC: + attrs.append('italic') + if attrs & ATTR_UNDERLINE: + attrs.append('underline') + name = ( + 'Pl' + + ''.join(('_a' + attr for attr in attrs)) + + (('_f%6x' % guifg) if guifg is not None else '') + + (('_b%6x' % guibg) if guibg is not None else '') + ) + return [(getattr(Token.Generic.Prompt.Powerline, name), contents)] + + def hlstyle(self, **kwargs): + return [] + + def get_client_id(self, segment_info): + return id(self) + + +renderer = IPythonPygmentsRenderer diff --git a/powerline-bin/powerline/renderers/lemonbar.py b/powerline-bin/powerline/renderers/lemonbar.py new file mode 100644 index 0000000..f378f23 --- /dev/null +++ b/powerline-bin/powerline/renderers/lemonbar.py @@ -0,0 +1,61 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.renderer import Renderer +from powerline.theme import Theme +from powerline.colorscheme import ATTR_UNDERLINE + + +class LemonbarRenderer(Renderer): + '''lemonbar (formerly bar/bar ain't recursive) renderer + + + See documentation of `lemonbar `_ and :ref:`the usage instructions ` + ''' + + character_translations = Renderer.character_translations.copy() + character_translations[ord('%')] = '%%{}' + + @staticmethod + def hlstyle(*args, **kwargs): + # We don’t need to explicitly reset attributes, so skip those calls + return '' + + def hl(self, contents, fg=None, bg=None, attrs=None): + text = '' + + if fg is not None: + if fg is not False and fg[1] is not False: + text += '%{{F#ff{0:06x}}}'.format(fg[1]) + if bg is not None: + if bg is not False and bg[1] is not False: + text += '%{{B#ff{0:06x}}}'.format(bg[1]) + + if attrs & ATTR_UNDERLINE: + text += '%{+u}' + + return text + contents + '%{F-B--u}' + + def render(self, *args, **kwargs): + return '%{{l}}{0}%{{r}}{1}'.format( + super(LemonbarRenderer, self).render(side='left', segment_info={'output': kwargs.get('matcher_info')}, *args, **kwargs), + super(LemonbarRenderer, self).render(side='right', segment_info={'output': kwargs.get('matcher_info')}, *args, **kwargs), + ) + + def get_theme(self, matcher_info): + if not matcher_info or matcher_info not in self.local_themes: + return self.theme + match = self.local_themes[matcher_info] + + try: + return match['theme'] + except KeyError: + match['theme'] = Theme( + theme_config=match['config'], + main_theme_config=self.theme_config, + **self.theme_kwargs + ) + return match['theme'] + + +renderer = LemonbarRenderer diff --git a/powerline-bin/powerline/renderers/pango_markup.py b/powerline-bin/powerline/renderers/pango_markup.py new file mode 100644 index 0000000..1b7d624 --- /dev/null +++ b/powerline-bin/powerline/renderers/pango_markup.py @@ -0,0 +1,39 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from xml.sax.saxutils import escape as _escape + +from powerline.renderer import Renderer +from powerline.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE + + +class PangoMarkupRenderer(Renderer): + '''Powerline Pango markup segment renderer.''' + + @staticmethod + def hlstyle(*args, **kwargs): + # We don’t need to explicitly reset attributes, so skip those calls + return '' + + def hl(self, contents, fg=None, bg=None, attrs=None): + '''Highlight a segment.''' + awesome_attr = [] + if fg is not None: + if fg is not False and fg[1] is not False: + awesome_attr += ['foreground="#{0:06x}"'.format(fg[1])] + if bg is not None: + if bg is not False and bg[1] is not False: + awesome_attr += ['background="#{0:06x}"'.format(bg[1])] + if attrs is not None and attrs is not False: + if attrs & ATTR_BOLD: + awesome_attr += ['font_weight="bold"'] + if attrs & ATTR_ITALIC: + awesome_attr += ['font_style="italic"'] + if attrs & ATTR_UNDERLINE: + awesome_attr += ['underline="single"'] + return '' + contents + '' + + escape = staticmethod(_escape) + + +renderer = PangoMarkupRenderer diff --git a/powerline-bin/powerline/renderers/pdb.py b/powerline-bin/powerline/renderers/pdb.py new file mode 100644 index 0000000..040f0e1 --- /dev/null +++ b/powerline-bin/powerline/renderers/pdb.py @@ -0,0 +1,50 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import platform + +from powerline.renderers.shell.readline import ReadlineRenderer +from powerline.renderer import Renderer + + +class PDBRenderer(ReadlineRenderer): + '''PDB-specific powerline renderer + ''' + pdb = None + initial_stack_length = None + + def get_segment_info(self, segment_info, mode): + r = self.segment_info.copy() + r['pdb'] = self.pdb + r['initial_stack_length'] = self.initial_stack_length + r['curframe'] = self.pdb.curframe + return r + + def set_pdb(self, pdb): + '''Record currently used :py:class:`pdb.Pdb` instance + + Must be called before first calling :py:meth:`render` method. + + :param pdb.Pdb pdb: + Used :py:class:`pdb.Pdb` instance. This instance will later be used + by :py:meth:`get_segment_info` for patching :ref:`segment_info + ` dictionary. + ''' + self.pdb = pdb + + def render(self, **kwargs): + if self.initial_stack_length is None: + self.initial_stack_length = len(self.pdb.stack) - 1 + return Renderer.render(self, **kwargs) + + if sys.version_info < (3,) and platform.python_implementation() == 'PyPy': + def do_render(self, **kwargs): + # Make sure that only ASCII characters survive + ret = super(PDBRenderer, self).do_render(**kwargs) + ret = ret.encode('ascii', 'replace') + ret = ret.decode('ascii') + return ret + + +renderer = PDBRenderer diff --git a/powerline-bin/powerline/renderers/shell/__init__.py b/powerline-bin/powerline/renderers/shell/__init__.py new file mode 100644 index 0000000..ebb0501 --- /dev/null +++ b/powerline-bin/powerline/renderers/shell/__init__.py @@ -0,0 +1,182 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.renderer import Renderer +from powerline.theme import Theme +from powerline.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE + + +def int_to_rgb(num): + r = (num >> 16) & 0xff + g = (num >> 8) & 0xff + b = num & 0xff + return r, g, b + + +class PromptRenderer(Renderer): + '''Powerline generic prompt segment renderer''' + + def __init__(self, old_widths=None, **kwargs): + super(PromptRenderer, self).__init__(**kwargs) + self.old_widths = old_widths if old_widths is not None else {} + + def get_client_id(self, segment_info): + '''Get client ID given segment info + + This is used by daemon to correctly cache widths for different clients + using a single renderer instance. + + :param dict segment_info: + :ref:`Segment info dictionary `. Out of it only + ``client_id`` key is used. It is OK for this dictionary to not + contain this key. + + :return: Any hashable value or ``None``. + ''' + return segment_info.get('client_id') if isinstance(segment_info, dict) else None + + def do_render(self, output_width, segment_info, side, theme, width=None, **kwargs): + client_id = self.get_client_id(segment_info) + if client_id is not None: + local_key = (client_id, side, None if theme is self.theme else id(theme)) + key = (client_id, side, None) + did_width = False + if local_key[-1] != key[-1] and side == 'left': + try: + width = self.old_widths[key] + except KeyError: + pass + else: + did_width = True + if not did_width and width is not None: + if theme.cursor_space_multiplier is not None: + width = int(width * theme.cursor_space_multiplier) + elif theme.cursor_columns: + width -= theme.cursor_columns + + if side == 'right': + try: + width -= self.old_widths[(client_id, 'left', local_key[-1])] + except KeyError: + pass + res = super(PromptRenderer, self).do_render( + output_width=True, + width=width, + theme=theme, + segment_info=segment_info, + side=side, + **kwargs + ) + if client_id is not None: + self.old_widths[local_key] = res[-1] + ret = res if output_width else res[:-1] + if len(ret) == 1: + return ret[0] + else: + return ret + + +class ShellRenderer(PromptRenderer): + '''Powerline shell segment renderer.''' + escape_hl_start = '' + escape_hl_end = '' + term_truecolor = False + term_escape_style = 'auto' + tmux_escape = False + screen_escape = False + + character_translations = Renderer.character_translations.copy() + + def render(self, segment_info, **kwargs): + local_theme = segment_info.get('local_theme') + return super(ShellRenderer, self).render( + matcher_info=local_theme, + segment_info=segment_info, + **kwargs + ) + + def do_render(self, segment_info, **kwargs): + if self.term_escape_style == 'auto': + if segment_info['environ'].get('TERM') == 'fbterm': + self.used_term_escape_style = 'fbterm' + else: + self.used_term_escape_style = 'xterm' + else: + self.used_term_escape_style = self.term_escape_style + return super(ShellRenderer, self).do_render(segment_info=segment_info, **kwargs) + + def hlstyle(self, fg=None, bg=None, attrs=None): + '''Highlight a segment. + + If an argument is None, the argument is ignored. If an argument is + False, the argument is reset to the terminal defaults. If an argument + is a valid color or attribute, it’s added to the ANSI escape code. + ''' + ansi = [0] + is_fbterm = self.used_term_escape_style == 'fbterm' + term_truecolor = not is_fbterm and self.term_truecolor + if fg is not None: + if fg is False or fg[0] is False: + ansi += [39] + else: + if term_truecolor: + ansi += [38, 2] + list(int_to_rgb(fg[1])) + else: + ansi += [38, 5, fg[0]] + if bg is not None: + if bg is False or bg[0] is False: + ansi += [49] + else: + if term_truecolor: + ansi += [48, 2] + list(int_to_rgb(bg[1])) + else: + ansi += [48, 5, bg[0]] + if attrs is not None: + if attrs is False: + ansi += [22] + else: + if attrs & ATTR_BOLD: + ansi += [1] + elif attrs & ATTR_ITALIC: + # Note: is likely not to work or even be inverse in place of + # italic. Omit using this in colorschemes. + ansi += [3] + elif attrs & ATTR_UNDERLINE: + ansi += [4] + if is_fbterm: + r = [] + while ansi: + cur_ansi = ansi.pop(0) + if cur_ansi == 38: + ansi.pop(0) + r.append('\033[1;{0}}}'.format(ansi.pop(0))) + elif cur_ansi == 48: + ansi.pop(0) + r.append('\033[2;{0}}}'.format(ansi.pop(0))) + else: + r.append('\033[{0}m'.format(cur_ansi)) + r = ''.join(r) + else: + r = '\033[{0}m'.format(';'.join(str(attr) for attr in ansi)) + if self.tmux_escape: + r = '\033Ptmux;' + r.replace('\033', '\033\033') + '\033\\' + elif self.screen_escape: + r = '\033P' + r.replace('\033', '\033\033') + '\033\\' + return self.escape_hl_start + r + self.escape_hl_end + + def get_theme(self, matcher_info): + if not matcher_info: + return self.theme + match = self.local_themes[matcher_info] + try: + return match['theme'] + except KeyError: + match['theme'] = Theme( + theme_config=match['config'], + main_theme_config=self.theme_config, + **self.theme_kwargs + ) + return match['theme'] + + +renderer = ShellRenderer diff --git a/powerline-bin/powerline/renderers/shell/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/renderers/shell/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..277b13f6362b625ef7ba35cc2aab3e14e54ffe95 GIT binary patch literal 7880 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/shell/__pycache__/bash.cpython-312.pyc b/powerline-bin/powerline/renderers/shell/__pycache__/bash.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccab1cfdb2e65afed3928c9b5b878e2b5f5577a6 GIT binary patch literal 922 zcmZWn%}>-o6rX9kZFglsG_tx8T?~da%GSiFF(Dj4;*Fqk8ZkrZ3~WiioKDr{gb8P_ zVE79Re~Jf14q&~Q7-PJVz-dp;w7Y;h$^71Xzc(}QYd%)16(Cmi)3@cC0>BSx^j4{> z98C#j6A(b44+4l_pdcksks4@7gOXSLQlKLp0tGwm($SY;(!IS>a!O0 z{iie}lu_muQ3^as`JJ#g0R;#WfD{6eN))6K6_u#I+JE*+p|1}9&+T+6WQcMM1<*1n z?ZASZ5Q6Ak*7%DxyKMO^+pbvWvI|pA(wbvY5c6L4Yh!cKYs!2tq>UxvZN#~|km9Ok%UM3^%tOngTUAjvd0irbkQG4cT% z$#!&RY#zjR?8W2au@%b4@84_Pi66XqX#3uh9k+Qa3hlU8sNE|nu@gB-TNd7o+pH|! z%0Y%to(R|gUt#m$Vr~8U!QiF!;qUda{rco?eR97(y<4B&tIvFfwS!Sh;CppzdfVKE zBmbH=Zx!B0+vP9t2CMaA%vxpHspXWXOmvFL-^w%z@)I##Kz8LM=jKVy%{=G4LwT;5 z*>kZWc`*-gS!f+|q8P&@yDCiiagq@Mhbn~d7nt7z^FP7eW8H+ew}y{_5Qjsc@7h~4 Gf8q}vzxO); literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/shell/__pycache__/ksh.cpython-312.pyc b/powerline-bin/powerline/renderers/shell/__pycache__/ksh.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9352e9d898c67a7274e20a99b93d2e78556aea9d GIT binary patch literal 981 zcmZWo&ui2`6rM@4*=*amZd=ic#oT0-ZVGCpAY!Ri*+MC8Pq_?fGTRN!FJ}_lEX*hy!XBDO+M-R0D`4|{?<6e z2z?iq{wnm8&V5i`As4yWM*+5QAX!o%TXLXS3Kn+BF9fQkf-YM{2|YlrvV+_LRo}~b z4ojn&RoYUk#b3fuRkE{b=sA%~iSH$p**?!S*L&=7FAB4=y~-m$O(^k#IATe5CT3ok zkVYCh2?SJerY|?C?=R8NrHrx@jGeqtE~Vb3a}|`QfSn=>yU3DUY{{-sDWL1 zN3+yjw27_avVc{Y=gmbH1#!~P-MX?EZBXWWAvIQQ-ZbK_+u(F9pkZRL9)=pzpqK+B zo-P%%GVIPIh?f{B#L1~Y>4QYu=ot)Q8+&M5dV`bN}5q<#{Cw}emmUcf?;!=H*4`0(;;2!!hht{@^H~4H$ePpqk~fA#oX76*WRw| zk4}HMu{T=(IJG}o-!Ikoq_-i3_&xvSE;2`np2!$S;BTvx5$C?O19apo_y)d(p%QFn zLedMdT2Auwy}S3`z4Uq=#Tc4@aLb?&#wC>BalqxgOdAZkZjPo|MP>?BSdUJ|%i#%Sw^|bh5J> w@|#XzX3CLXY?2FE(OR%e==)UcpV{}Y3NglCX!3?8pXh28qwc|D0$soP0kDsAj{pDw literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/shell/__pycache__/readline.cpython-312.pyc b/powerline-bin/powerline/renderers/shell/__pycache__/readline.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f744f8d190d92c4c170a31df90ca1dc3bebde1e7 GIT binary patch literal 697 zcmYLHzi-qq6t?s0a;K(0C=#s%B8(Y&K|+8kAqE!2(xG(nV&!6ov*aYkc7Q`dqEi0= zw*C!>KZSvT1%(9(A;ea6oo>QTF69lMKR>^`Pv3j_97PjgBKq>Zm_Y!3+RG6Bnk=6f zat;U}kb@E;SUSilUF4P?@}SK-+%E$ZK;VFtyvT)ul)U69=Z~1=R-+?$7Uvhi?v3&St4t=y_eG zqJB-KwUf&AR8*?$kj%aJITZ^zHvKvn8KQO!oPoa%bo?K?`|odm+qrRiOYROeN6FZ_ zC>q^J<3ieHO3#A*Eo5Mz-M`YEUg=IdU1=pctu`E<)R j0~aoY@HaU53Qm53dzXO+_ddM41m?Kd1RFO`!>+|YH3-E! literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/shell/__pycache__/tcsh.cpython-312.pyc b/powerline-bin/powerline/renderers/shell/__pycache__/tcsh.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a95fafe3f526d885a5f2394a8faaa31be0a4de58 GIT binary patch literal 1654 zcmaJ>&u<$=6rR~#+q;f8O>4>zix#J`Ax^1X6hQ^45K0OKR8`vkh>)mB` zO&ZIQ92BWR2uKAeMd1($4naYv{|5(bB~sjl8$yVirBtHwi8ua55(Fdp&Ae~kdpqBo z&-0V2MiC74=U?WDgwSu?>5Wi#aX1N!O=KVgTd0UNTog2+C~9I+(j?4r!3q__S{Ne% zT}Otvh75^@cg0S=7NHSMUJhl#e{vur1w$p<)E$Eo%k(MBTV5a==7*+dI(Bd>Kj%4C z$*06Dx(@S$L6@1fPv%Ru?n6KZ2d6c!aEm!b*ME=N24$4#oiBB4|JXl*e-{o;k%kSV z2?o|gDlN7NA5B1LQ9bT+Z?_9+Aw!@c0nvyd?&1!36(*qAK|{yTa2JgnL**{297WgB zJT{_hvL>&iJ6KbuQDz`GGoznmSAOA^vqYI?+BE6IZqjX&PkMBrNNqpKx?RYYg><@w z(`8|HwuNV5y4}LJVH$4XVZD3wHi0nM0r(xh2IyCK6Z!pJUuZ{wsi04xRfb@q3jPj% zhF63NTI880#-efp0N3Z$+rz*;%CPFzUJ;?v|FnEXst7Dz5f)GNs{Auoq+UHwco%(y z|07DQNM%Us#j=r#U?Bf=uTG_Zl}E6CWu7^J5~x$7B61(t3)83~fCneH&ff<*4y==RBaG~pWlhsl^1vXx-woJZ$=@oI@T1C6j@KLPE^MmN~}6| z2**U3Xdn|}=Zln(AWBHlF-jI+#|ZhLl()J&5kd?{Cxk^HhsD7JlI}oD&T^mkB~ZJa z*P&yCWH37qsK@_6Z?NZh6c<6;@ETqo%;Pom5N8{SiwB9xdSdb*alM|nzL$8XhM#Jr zM!|k9-k;i%>v*`4zSwcEZ7Fqpp^?fQ+dc07C8>hiL||C5_syFiMxZxe@=FZpG5!cM zc-ax-?;_(`3C{HuknJlV+g3of>=ioH+e(&u+iZv@C%NGiTk_RT|6XTf;BxNX1u#t! iWBdo2*+VnGqlri1vskS?Gxi9<+`Nop=U3%+jlTiaOp$T` literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/renderers/shell/__pycache__/zsh.cpython-312.pyc b/powerline-bin/powerline/renderers/shell/__pycache__/zsh.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89a24a34defb41d832cbadcfb110057b3342bfde GIT binary patch literal 831 zcmZWnPfyf96rX9kZ6Pd(3dAPFB@wg-wkAZ43E?0bZ-gkPxlBrDmX=KaI5SljV}c3a z0gRu(@EQCB9uzr%^+nUBrpFi@-c>09Rm1mK50 z3|6CWoIX&-E+BwF22zM%Y9J#uk(pY^g4%DeMrtD)0s}k-#M}YIqV~So%SR4%klSte z_HXU*t?E*lB~eZ&W{IRcWTJ9O@;nhqo>gPvy2x26DNfQN=dv0tc#=unDYHnbAADFf zpT?B2Cp06JQy%rY^zef6x;pOy3J@d!83ZDe7|0?fYEXM~^xu@8y*d8BZ@=$CjvB`? z039NYeI=4!i)wdm->Jrth*x=@7IHvnYi>1vK{-n@+S(FvtEi(bK{ryG$rkVPZf_a0 zuhf36_Ut*FUGax27vn5UDaO?>#%WGUrtJ}opOqo&M;wev9x3-26;W7F95XCrsFZ5{ zb*LWPQ537mC=PiTDVee4VJ29pMHH1478LA&uWF?gnBX8-zTRQTV54`0=@6l&Cb$sKN!nfw$@;mnnoZ%CLDl7hwmZDS2k}D~=ep1}h zpl_Pn3aV=tq}msx+BK= 702: + _vim_mode = vim_mode + vim_mode = lambda: _vim_mode(1) + +mode_translations = { + unichr(ord('V') - 0x40): '^V', + unichr(ord('S') - 0x40): '^S', +} + + +class VimRenderer(Renderer): + '''Powerline vim segment renderer.''' + + character_translations = Renderer.character_translations.copy() + character_translations[ord('%')] = '%%' + + segment_info = Renderer.segment_info.copy() + segment_info.update(environ=environ) + + def __init__(self, *args, **kwargs): + if not hasattr(vim, 'strwidth'): + # Hope nobody want to change this at runtime + if vim.eval('&ambiwidth') == 'double': + kwargs = dict(**kwargs) + kwargs['ambigious'] = 2 + super(VimRenderer, self).__init__(*args, **kwargs) + self.hl_groups = {} + self.prev_highlight = None + self.strwidth_error_name = register_strwidth_error(self.strwidth) + self.encoding = get_vim_encoding() + + def shutdown(self): + self.theme.shutdown() + for match in self.local_themes.values(): + if 'theme' in match: + match['theme'].shutdown() + + def add_local_theme(self, matcher, theme): + if matcher in self.local_themes: + raise KeyError('There is already a local theme with given matcher') + self.local_themes[matcher] = theme + + def get_matched_theme(self, match): + try: + return match['theme'] + except KeyError: + match['theme'] = Theme(theme_config=match['config'], main_theme_config=self.theme_config, **self.theme_kwargs) + return match['theme'] + + def get_theme(self, matcher_info): + if matcher_info is None: + return self.get_matched_theme(self.local_themes[None]) + for matcher in self.local_themes.keys(): + if matcher and matcher(matcher_info): + return self.get_matched_theme(self.local_themes[matcher]) + else: + return self.theme + + if hasattr(vim, 'strwidth'): + if sys.version_info < (3,): + def strwidth(self, string): + # Does not work with tabs, but neither is strwidth from default + # renderer + return vim.strwidth(string.encode(self.encoding, 'replace')) + else: + @staticmethod + def strwidth(string): + return vim.strwidth(string) + + def get_segment_info(self, segment_info, mode): + return segment_info or self.segment_info + + def render(self, window=None, window_id=None, winnr=None, is_tabline=False): + '''Render all segments.''' + segment_info = self.segment_info.copy() + + if window is vim.current.window: + mode = vim_mode() + mode = mode_translations.get(mode, mode) + else: + mode = 'nc' + + segment_info.update( + window=window, + mode=mode, + window_id=window_id, + winnr=winnr, + buffer=window.buffer, + tabpage=current_tabpage(), + encoding=self.encoding, + ) + segment_info['tabnr'] = segment_info['tabpage'].number + segment_info['bufnr'] = segment_info['buffer'].number + if is_tabline: + winwidth = int(vim_getoption('columns')) + else: + winwidth = segment_info['window'].width + + statusline = super(VimRenderer, self).render( + mode=mode, + width=winwidth, + segment_info=segment_info, + matcher_info=(None if is_tabline else segment_info), + ) + statusline = statusline.encode(self.encoding, self.strwidth_error_name) + return statusline + + def reset_highlight(self): + self.hl_groups.clear() + + def hlstyle(self, fg=None, bg=None, attrs=None): + '''Highlight a segment. + + If an argument is None, the argument is ignored. If an argument is + False, the argument is reset to the terminal defaults. If an argument + is a valid color or attribute, it’s added to the vim highlight group. + ''' + # In order not to hit E541 two consequent identical highlighting + # specifiers may be squashed into one. + attrs = attrs or 0 # Normalize `attrs` + if (fg, bg, attrs) == self.prev_highlight: + return '' + self.prev_highlight = (fg, bg, attrs) + + # We don’t need to explicitly reset attributes in vim, so skip those + # calls + if not attrs and not bg and not fg: + return '' + + if not (fg, bg, attrs) in self.hl_groups: + hl_group = { + 'ctermfg': 'NONE', + 'guifg': None, + 'ctermbg': 'NONE', + 'guibg': None, + 'attrs': ['NONE'], + 'name': '', + } + if fg is not None and fg is not False: + hl_group['ctermfg'] = fg[0] + hl_group['guifg'] = fg[1] + if bg is not None and bg is not False: + hl_group['ctermbg'] = bg[0] + hl_group['guibg'] = bg[1] + if attrs: + hl_group['attrs'] = [] + if attrs & ATTR_BOLD: + hl_group['attrs'].append('bold') + if attrs & ATTR_ITALIC: + hl_group['attrs'].append('italic') + if attrs & ATTR_UNDERLINE: + hl_group['attrs'].append('underline') + hl_group['name'] = ( + 'Pl_' + + str(hl_group['ctermfg']) + '_' + + str(hl_group['guifg']) + '_' + + str(hl_group['ctermbg']) + '_' + + str(hl_group['guibg']) + '_' + + ''.join(hl_group['attrs']) + ) + self.hl_groups[(fg, bg, attrs)] = hl_group + vim.command('hi {group} ctermfg={ctermfg} guifg={guifg} guibg={guibg} ctermbg={ctermbg} cterm={attrs} gui={attrs}'.format( + group=hl_group['name'], + ctermfg=hl_group['ctermfg'], + guifg='#{0:06x}'.format(hl_group['guifg']) if hl_group['guifg'] is not None else 'NONE', + ctermbg=hl_group['ctermbg'], + guibg='#{0:06x}'.format(hl_group['guibg']) if hl_group['guibg'] is not None else 'NONE', + attrs=','.join(hl_group['attrs']), + )) + return '%#' + self.hl_groups[(fg, bg, attrs)]['name'] + '#' + + +renderer = VimRenderer diff --git a/powerline-bin/powerline/segment.py b/powerline-bin/powerline/segment.py new file mode 100644 index 0000000..c83bf6f --- /dev/null +++ b/powerline-bin/powerline/segment.py @@ -0,0 +1,450 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lib.watcher import create_file_watcher + + +def list_segment_key_values(segment, theme_configs, segment_data, key, function_name=None, name=None, module=None, default=None): + try: + yield segment[key] + except KeyError: + pass + found_module_key = False + for theme_config in theme_configs: + try: + segment_data = theme_config['segment_data'] + except KeyError: + pass + else: + if function_name and not name: + if module: + try: + yield segment_data[module + '.' + function_name][key] + found_module_key = True + except KeyError: + pass + if not found_module_key: + try: + yield segment_data[function_name][key] + except KeyError: + pass + if name: + try: + yield segment_data[name][key] + except KeyError: + pass + if segment_data is not None: + try: + yield segment_data[key] + except KeyError: + pass + yield default + + +def get_segment_key(merge, *args, **kwargs): + if merge: + ret = None + for value in list_segment_key_values(*args, **kwargs): + if ret is None: + ret = value + elif isinstance(ret, dict) and isinstance(value, dict): + old_ret = ret + ret = value.copy() + ret.update(old_ret) + else: + return ret + return ret + else: + return next(list_segment_key_values(*args, **kwargs)) + + +def get_function(data, segment): + function_name = segment['function'] + if '.' in function_name: + module, function_name = function_name.rpartition('.')[::2] + else: + module = data['default_module'] + function = data['get_module_attr'](module, function_name, prefix='segment_generator') + if not function: + raise ImportError('Failed to obtain segment function') + return None, function, module, function_name, segment.get('name') + + +def get_string(data, segment): + name = segment.get('name') + return data['get_key'](False, segment, None, None, name, 'contents'), None, None, None, name + + +segment_getters = { + 'function': get_function, + 'string': get_string, + 'segment_list': get_function, +} + + +def get_attr_func(contents_func, key, args, is_space_func=False): + try: + func = getattr(contents_func, key) + except AttributeError: + return None + else: + if is_space_func: + def expand_func(pl, amount, segment): + try: + return func(pl=pl, amount=amount, segment=segment, **args) + except Exception as e: + pl.exception('Exception while computing {0} function: {1}', key, str(e)) + return segment['contents'] + (' ' * amount) + return expand_func + else: + return lambda pl, shutdown_event: func(pl=pl, shutdown_event=shutdown_event, **args) + + +def process_segment_lister(pl, segment_info, parsed_segments, side, mode, colorscheme, + lister, subsegments, patcher_args): + subsegments = [ + subsegment + for subsegment in subsegments + if subsegment['display_condition'](pl, segment_info, mode) + ] + for subsegment_info, subsegment_update in lister(pl=pl, segment_info=segment_info, **patcher_args): + draw_inner_divider = subsegment_update.pop('draw_inner_divider', False) + old_pslen = len(parsed_segments) + for subsegment in subsegments: + if subsegment_update: + subsegment = subsegment.copy() + subsegment.update(subsegment_update) + if 'priority_multiplier' in subsegment_update and subsegment['priority']: + subsegment['priority'] *= subsegment_update['priority_multiplier'] + + process_segment( + pl, + side, + subsegment_info, + parsed_segments, + subsegment, + mode, + colorscheme, + ) + new_pslen = len(parsed_segments) + while parsed_segments[new_pslen - 1]['literal_contents'][1]: + new_pslen -= 1 + if new_pslen > old_pslen + 1 and draw_inner_divider is not None: + for i in range(old_pslen, new_pslen - 1) if side == 'left' else range(old_pslen + 1, new_pslen): + parsed_segments[i]['draw_soft_divider'] = draw_inner_divider + return None + + +def set_segment_highlighting(pl, colorscheme, segment, mode): + if segment['literal_contents'][1]: + return True + try: + highlight_group_prefix = segment['highlight_group_prefix'] + except KeyError: + hl_groups = lambda hlgs: hlgs + else: + hl_groups = lambda hlgs: [highlight_group_prefix + ':' + hlg for hlg in hlgs] + hlgs + try: + segment['highlight'] = colorscheme.get_highlighting( + hl_groups(segment['highlight_groups']), + mode, + segment.get('gradient_level') + ) + if segment['divider_highlight_group']: + segment['divider_highlight'] = colorscheme.get_highlighting( + hl_groups([segment['divider_highlight_group']]), + mode + ) + else: + segment['divider_highlight'] = None + except Exception as e: + pl.exception('Failed to set highlight group: {0}', str(e)) + return False + else: + return True + + +def process_segment(pl, side, segment_info, parsed_segments, segment, mode, colorscheme): + segment = segment.copy() + pl.prefix = segment['name'] + if segment['type'] in ('function', 'segment_list'): + try: + if segment['type'] == 'function': + contents = segment['contents_func'](pl, segment_info) + else: + contents = segment['contents_func'](pl, segment_info, parsed_segments, side, mode, colorscheme) + except Exception as e: + pl.exception('Exception while computing segment: {0}', str(e)) + return + + if contents is None: + return + + if isinstance(contents, list): + # Needs copying here, but it was performed at the very start of the + # function + segment_base = segment + if contents: + draw_divider_position = -1 if side == 'left' else 0 + for key, i, newval in ( + ('before', 0, ''), + ('after', -1, ''), + ('draw_soft_divider', draw_divider_position, True), + ('draw_hard_divider', draw_divider_position, True), + ): + try: + contents[i][key] = segment_base.pop(key) + segment_base[key] = newval + except KeyError: + pass + + draw_inner_divider = None + if side == 'right': + append = parsed_segments.append + else: + pslen = len(parsed_segments) + append = lambda item: parsed_segments.insert(pslen, item) + + for subsegment in (contents if side == 'right' else reversed(contents)): + segment_copy = segment_base.copy() + segment_copy.update(subsegment) + if draw_inner_divider is not None: + segment_copy['draw_soft_divider'] = draw_inner_divider + draw_inner_divider = segment_copy.pop('draw_inner_divider', None) + if set_segment_highlighting(pl, colorscheme, segment_copy, mode): + append(segment_copy) + else: + segment['contents'] = contents + if set_segment_highlighting(pl, colorscheme, segment, mode): + parsed_segments.append(segment) + elif segment['width'] == 'auto' or (segment['type'] == 'string' and segment['contents'] is not None): + if set_segment_highlighting(pl, colorscheme, segment, mode): + parsed_segments.append(segment) + + +always_true = lambda pl, segment_info, mode: True + +get_fallback_segment = { + 'name': 'fallback', + 'type': 'string', + 'highlight_groups': ['background'], + 'divider_highlight_group': None, + 'before': None, + 'after': None, + 'contents': '', + 'literal_contents': (0, ''), + 'priority': None, + 'draw_soft_divider': True, + 'draw_hard_divider': True, + 'draw_inner_divider': True, + 'display_condition': always_true, + 'width': None, + 'align': None, + 'expand': None, + 'truncate': None, + 'startup': None, + 'shutdown': None, + '_rendered_raw': '', + '_rendered_hl': '', + '_len': None, + '_contents_len': None, +}.copy + + +def gen_segment_getter(pl, ext, common_config, theme_configs, default_module, get_module_attr, top_theme): + data = { + 'default_module': default_module or 'powerline.segments.' + ext, + 'get_module_attr': get_module_attr, + 'segment_data': None, + } + + def get_key(merge, segment, module, function_name, name, key, default=None): + return get_segment_key(merge, segment, theme_configs, data['segment_data'], key, function_name, name, module, default) + data['get_key'] = get_key + + def get_selector(function_name): + if '.' in function_name: + module, function_name = function_name.rpartition('.')[::2] + else: + module = 'powerline.selectors.' + ext + function = get_module_attr(module, function_name, prefix='segment_generator/selector_function') + if not function: + pl.error('Failed to get segment selector, ignoring it') + return function + + def get_segment_selector(segment, selector_type): + try: + function_name = segment[selector_type + '_function'] + except KeyError: + function = None + else: + function = get_selector(function_name) + try: + modes = segment[selector_type + '_modes'] + except KeyError: + modes = None + + if modes: + if function: + return lambda pl, segment_info, mode: ( + mode in modes + or function(pl=pl, segment_info=segment_info, mode=mode) + ) + else: + return lambda pl, segment_info, mode: mode in modes + else: + if function: + return lambda pl, segment_info, mode: ( + function(pl=pl, segment_info=segment_info, mode=mode) + ) + else: + return None + + def gen_display_condition(segment): + include_function = get_segment_selector(segment, 'include') + exclude_function = get_segment_selector(segment, 'exclude') + if include_function: + if exclude_function: + return lambda *args: ( + include_function(*args) + and not exclude_function(*args)) + else: + return include_function + else: + if exclude_function: + return lambda *args: not exclude_function(*args) + else: + return always_true + + def get(segment, side): + segment_type = segment.get('type', 'function') + try: + get_segment_info = segment_getters[segment_type] + except KeyError: + pl.error('Unknown segment type: {0}', segment_type) + return None + + try: + contents, _contents_func, module, function_name, name = get_segment_info(data, segment) + except Exception as e: + pl.exception('Failed to generate segment from {0!r}: {1}', segment, str(e), prefix='segment_generator') + return None + + if not get_key(False, segment, module, function_name, name, 'display', True): + return None + + segment_datas = getattr(_contents_func, 'powerline_segment_datas', None) + if segment_datas: + try: + data['segment_data'] = segment_datas[top_theme] + except KeyError: + pass + + if segment_type == 'function': + highlight_groups = [function_name] + else: + highlight_groups = segment.get('highlight_groups') or [name] + + if segment_type in ('function', 'segment_list'): + args = dict(( + (str(k), v) + for k, v in + get_key(True, segment, module, function_name, name, 'args', {}).items() + )) + + display_condition = gen_display_condition(segment) + + if segment_type == 'segment_list': + # Handle startup and shutdown of _contents_func? + subsegments = [ + subsegment + for subsegment in ( + get(subsegment, side) + for subsegment in segment['segments'] + ) if subsegment + ] + return { + 'name': name or function_name, + 'type': segment_type, + 'highlight_groups': None, + 'divider_highlight_group': None, + 'before': None, + 'after': None, + 'contents_func': lambda pl, segment_info, parsed_segments, side, mode, colorscheme: ( + process_segment_lister( + pl, segment_info, parsed_segments, side, mode, colorscheme, + patcher_args=args, + subsegments=subsegments, + lister=_contents_func, + ) + ), + 'contents': None, + 'literal_contents': None, + 'priority': None, + 'draw_soft_divider': None, + 'draw_hard_divider': None, + 'draw_inner_divider': None, + 'side': side, + 'display_condition': display_condition, + 'width': None, + 'align': None, + 'expand': None, + 'truncate': None, + 'startup': None, + 'shutdown': None, + '_rendered_raw': '', + '_rendered_hl': '', + '_len': None, + '_contents_len': None, + } + + if segment_type == 'function': + startup_func = get_attr_func(_contents_func, 'startup', args) + shutdown_func = getattr(_contents_func, 'shutdown', None) + expand_func = get_attr_func(_contents_func, 'expand', args, True) + truncate_func = get_attr_func(_contents_func, 'truncate', args, True) + + if hasattr(_contents_func, 'powerline_requires_filesystem_watcher'): + create_watcher = lambda: create_file_watcher(pl, common_config['watcher']) + args[str('create_watcher')] = create_watcher + + if hasattr(_contents_func, 'powerline_requires_segment_info'): + contents_func = lambda pl, segment_info: _contents_func(pl=pl, segment_info=segment_info, **args) + else: + contents_func = lambda pl, segment_info: _contents_func(pl=pl, **args) + else: + startup_func = None + shutdown_func = None + contents_func = None + expand_func = None + truncate_func = None + + return { + 'name': name or function_name, + 'type': segment_type, + 'highlight_groups': highlight_groups, + 'divider_highlight_group': None, + 'before': get_key(False, segment, module, function_name, name, 'before', ''), + 'after': get_key(False, segment, module, function_name, name, 'after', ''), + 'contents_func': contents_func, + 'contents': contents, + 'literal_contents': (0, ''), + 'priority': segment.get('priority', None), + 'draw_hard_divider': segment.get('draw_hard_divider', True), + 'draw_soft_divider': segment.get('draw_soft_divider', True), + 'draw_inner_divider': segment.get('draw_inner_divider', False), + 'side': side, + 'display_condition': display_condition, + 'width': segment.get('width'), + 'align': segment.get('align', 'l'), + 'expand': expand_func, + 'truncate': truncate_func, + 'startup': startup_func, + 'shutdown': shutdown_func, + '_rendered_raw': '', + '_rendered_hl': '', + '_len': None, + '_contents_len': None, + } + + return get diff --git a/powerline-bin/powerline/segments/__init__.py b/powerline-bin/powerline/segments/__init__.py new file mode 100644 index 0000000..fa09e58 --- /dev/null +++ b/powerline-bin/powerline/segments/__init__.py @@ -0,0 +1,63 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys + +from pkgutil import extend_path +from types import MethodType + + +__path__ = extend_path(__path__, __name__) + + +class Segment(object): + '''Base class for any segment that is not a function + + Required for powerline.lint.inspect to work properly: it defines methods for + omitting existing or adding new arguments. + + .. note:: + Until python-3.4 ``inspect.getargspec`` does not support querying + callable classes for arguments of their ``__call__`` method, requiring + to use this method directly (i.e. before 3.4 you should write + ``getargspec(obj.__call__)`` in place of ``getargspec(obj)``). + ''' + if sys.version_info < (3, 4): + def argspecobjs(self): + yield '__call__', self.__call__ + else: + def argspecobjs(self): + yield '__call__', self + + argspecobjs.__doc__ = ( + '''Return a list of valid arguments for inspect.getargspec + + Used to determine function arguments. + ''' + ) + + def omitted_args(self, name, method): + '''List arguments which should be omitted + + Returns a tuple with indexes of omitted arguments. + + .. note::``segment_info``, ``create_watcher`` and ``pl`` will be omitted + regardless of the below return (for ``segment_info`` and + ``create_watcher``: only if object was marked to require segment + info or filesystem watcher). + ''' + if isinstance(self.__call__, MethodType): + return (0,) + else: + return () + + @staticmethod + def additional_args(): + '''Returns a list of (additional argument name[, default value]) tuples. + ''' + return () + + +def with_docstring(instance, doc): + instance.__doc__ = doc + return instance diff --git a/powerline-bin/powerline/segments/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/segments/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c68b52c1872373701b42a41addf2560b7aa4f0d7 GIT binary patch literal 2641 zcmZuz&2QX96rZv8%g%0+whR4$(xE+&t&$BArHBYP^im`shc>+|s=SUpn|0!~-I;MV z8}$&O9yq2K_QHW{Rq>aAL?M-^jF6Bj1ihtA56~0u+1}ldcBCE8&b)b_zu&WesMSmY zqxREponeWP$M|P7iuvMT9Tr345|{dVBzLZk5x$ zf?w$wErSw`@G>{~)O{_}*D^J7mAJ(_#4YjaeLdf;x#c^gH9gQ8l_$8>C?vCS;5nho zE#FgI*uG3EuD9t)FAS0ydsT*hthnX%qEM)0Iuc%>tWF#_3IvuLG@0UCiU+P0*{TbF z%`dp>hVIHB;!b8Xn{&U&K^y)L2`4S;l9uMumd*?7X?_li6Nq;M?ude`gU6*ncMJG* zi@apz(SS?|_R741QQgn4w~RrhVI<}2e67a=W&cPCxnfJs9N(6bbwa`HV8CQ{%v9G_ z%#$n#6|>nWFw-=y@msMcxSQUH!af(i7w{%bs_6w1!c$CztRIRE7Kt!|^T87H6mxk8 z1SRXGiO4LPM%eR|@`5$Sw>+6H&=J?gt$_ELE!JZ6S2n?Rvx)xjr6toaZUoBnSu}vG z1`F>sFR^wzH{V?23a+6m?KX2mu!&K~IKo=7TQL^{R1ZoV+xP8NKTiS(rfC?NWMK#L zz&!!FEemBW3p8c{%rlW@BG&{V$B<0bg`8yq%!M>L${(;fugRNim4kB5(A7a0GuaJe z-(`IP@IqJG?TOoS;p%#GWU&Dzy?{l&?Qrzys34p-nx@gvo?!i-6ku|ow&Q^ay8yp~ zd6+&U6xl>?6Xey=(b2x4LrTeje6RQEJ#9IujJ=>@2E^~tq#(K9k!XRvxU#5v(PHF9 z3z%`P7B0WveK-1G>%&FgTV2eGvp5FHVh%33Xjxw1Da&d`gJdeN6~rvJPvr1y9@;zu zrsQid{Z0PaA&-m`yDP(+cW*v0&hP2x|CJcA%%fa#T4#OuFq{<0=*bkj4iqU^{}_&{X@ja=Kgq?(M*Z?Z}5^-}8Oo&{!?#G6Y|26u8%l!c=sKUmk9P9^1Mz;v%7_1?QZSc?T5vSkId;m%<2K05eKKkBLxm3Vn_zG zp>2OUsp<&6bJ&gXt!Deo@0Gk zJSRu-967iQ(y|QG4%x2|vno)>a>K-?g!U~fF)gbXy0MSzs%71ZZ9hLLTb3I-u&qN` zlIkWG_~uTrmhxL*S4pZ+4COgl&IQstb9wBoz&CI@)nFm7!gPl`)l99p|2ipFel660 zF4T87e<_?j(5QalS&8ar_A9zx+SiFzdr0fgrfXVl|1F}=Jk@lqdZ3S1X*8*3=P*lg zoff4Iiy^rUo!Wv`Hg1#aq(R~9Lc9$d4K1mR;FRbPt;EYC%uFL6F$Yq?x5=8AgR_s} zC$Wt~8?B$*IrWepdsLa-IhXp*VxSJBQ=k(9ksS9l_Q=X( rV*W|a{Z8I|S|ZhxyIbF#+MBw#Q+Zxmpw+KC&j~yZ+Ek;*(g^+o7;Mdd literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/__pycache__/i3wm.cpython-312.pyc b/powerline-bin/powerline/segments/__pycache__/i3wm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..737f587b5991f9439b786211c3a662a83cddaa6e GIT binary patch literal 6397 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/__pycache__/pdb.cpython-312.pyc b/powerline-bin/powerline/segments/__pycache__/pdb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59da8377eb840299a7199d68bf36b99a9e57337b GIT binary patch literal 2564 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__init__.py b/powerline-bin/powerline/segments/common/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/powerline-bin/powerline/segments/common/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ff4988705c0eff472708cfae5afe7ee43c3b502 GIT binary patch literal 170 zcmX@j%ge<81ia^Or-A6lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxd<*8qiTcBT%S)f~z zSd^YxqHAWFVNhURVX2>!nWSG(S(1^Tr(cj?o?4WXnU|_xoSL4SnpaY+pPZkY3zUhE q&&)Cwq1PfmuQwWmlW=?i~N49$7o` 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__pycache__/env.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/env.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bef466f3e0bd54126e379e8bea165a42a4597868 GIT binary patch literal 8079 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 AX8-^I literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__pycache__/net.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/net.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9ffbfab4b81fafe9ed00700719978df8b1bea88 GIT binary patch literal 14017 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__pycache__/players.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/players.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4965a0dc9092cdad3284bd3f01207662531e08e1 GIT binary patch literal 23167 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ΜHjMAg6|PC>9oa3ll=Mgtb~a*u40> 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 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__pycache__/sys.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/sys.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcc67635d164cbd936d0c4ab0352e1366d712c5d GIT binary patch literal 8578 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 E2QKt|)c^nh literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__pycache__/time.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/time.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..070f46363f70641c7d0010af89a9ff6d4ad6a71b GIT binary patch literal 3189 zcmbtWOKcm*8J>M|cli({Q4-}xv9KOCi_nT4JC+qCuqw%|6juf;C5QU zn_wv-r*$sRB{<+Eh50#^;Ay1#6!t5s5kcX+F~2|dX>>wR{E7g!;))mx)QMq?b;CtN zOPh+C)HPehDcy1fMZ2Y0nrXOgsRhf_i?*87@&yyyZm57Y!%k+3M%o607zM^DTeY>k znr0d^dz1%C#?PXV&s`)UyO|e4i}WG8Ci_*hUu>=akV%4Z zrAlB4GEQL?{yvOnk;1jOK4g_{Ri3>cVJavuA@)W zOK2JTB`W4C{pXr$7qKDRIaN*;kwg(j8M51P z%U;n{&$g*0hMJMx_ggScUDhmOOdO{&vW<%>naPkXHJc|>6)n}0=jVyd{JfmgvN;_d zTh3y$SRgq}z)4V4{IZHTDkDwL5prC>Xnvk}{N%+T)(fUEiHX6DERmRtC9Y^^;=?XW zQgB%!F9p1mn?Yw{j4Px~!-jM%H@u%>(o4~DdzyC1mozaR`(XcF#xR#$p|xvn$9s*# zK5396KZ&u4U0(GDF0ZIW2v>qG=q}&bbC+*yAtvwDVu8re_9lnyd|{}d72vN?kwC@#it002q@-P0!r|{zrrXX__cX7thC?fEA0P<9u-bRWwy*M zlGpT71L-~%9H=sMFAQc8AO#?CqXAMd6uOQKwslWm9kIf{I;PTba{}IKu*@r+H%|e_ zD3J&(^5o zEBllqWPXbSF5+bpQI0OQwPGIhkj1eqz3(X)QNUTBmyPdxJbY#Tut%A~U1edh{UBzG zvpZVcLHx2Xi(a0e~;B86M=F!fLjtr?5OWJ3ci9fE1sfkI5-Rfxt!< zaP{M&X#+H-uqp#~ViodCtBSm&**Up64`8pABR1fbDwqH2xBv%`@TyKUC6U;At1by3Z*YOb zyHWDPY=*tkP=ycnJnZt{b<3*how8IS@e;ysgFk+U1mUr26?NMpA0(t2c@1|HmE_%jZ5J?#m!G1Vix$561(37l}Gh$G45?{9w^ z^mQ@YRQvM|B!oXHuaB_3*vn2eV%!K2K~Pd3{GbvrV7*?i(RY zDvs|l&67&v+k?_12JQ$OLN(&BzE7rCr#Cy+t~#8!er+w`NdDDxPZ;0&nbnKca}F!4 zpIw`B#NZ~q(Od0zgz#o$BUFw2Qwn~nZjRrb{%ra|=T4-*78>}H+6l#K(hsZM4lAuM ztXyp{UpyN*9}XLw_Hb8c&7J2F`FpIjY$;_uqb?D&sY2V2Vbx8^oyYW}|J;NRFV zEc227=#KyBUyhxt`OjAep9rDqaf@Kv?~aTG(ANQREXsV{Ljj$M(IsKvdVC-sA5bpG zsLL_Qm6Gsz3?FrBGKopy!=xHva(ytVK#e0tE)swPRxs2G+7bqj^&) z>gqfAD#*x*x6T299i*s#qq!QI`xiR?jPIh@r)Lq(Rp)N^u1`Lu*y`-<==%9xjyXne Pqv-R%MXC+Yfa8Aw>w7Uz literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__pycache__/vcs.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/vcs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af387ff46a2b0071f01192fc04c4d1cc5bdb1e18 GIT binary patch literal 3752 zcmbVOO>7&-6`uX)u1HaTmK@tc#)|5gtwI^762pS)q^|Askg90ywg`n_wb~tutLzUm zyEH9z6;ObKBuIfO$iWU0py{oGbI75G7VXK0UV5lq8!){!5Cbg`^hQ@c6z-*OcDWQK z6iLt__;&u@n>TOXd*AzWp`amXg}?l*`X}i9oei?4bUQn3=v+eeYs4hOnW;$I?oJ1VKCy zQbP0~G{Qyzv&u!X;t~%Sns!*zE#C}6;9P;F1C+ecuqg@jAl;+eUe%8e_ol11LxQy+ zB(B~xLbFDw*)>t}>6!xV9EagGL{NpZP=&X+ia+m#T^n!fA8%4IVs*Vp0# zaOxIV$P9hDwtjez-sL@ugG}cUAT9JzefpgvTeaKj(|6RPxA>zwFpEr?(QadYom}z? zXnPH=xY}=m?xu*p(Vg9pBbkOF<49U0N5ZFE=0h7wq-#?w`F$P*R0&f!U}g0t-&*^PmSTP^HkfT1OX#cVbj$gGvw z1>#=Z&|Zb?urcuFz%MSP-zL{YSAkaf*QYKR z5CRqseGHyahw#HJx^Nm@^Z4f{HlA=VQWgktKILKl60Y?|rb7>ZnU}?}ZSCK|EBm zS85LYLw$w%jd~DIuqd|()%UHGG|HlYvge|cjO5rs5)0sZte(GOk~)k1SS7u#0E@9~ zdjX*#ordkDd@KgUsm6TWp<_(Q5hkRNUO_i~$EQJDv{yWzW@&>2vFI5tiA72v*|4KQ z2yBhzlr82+kcU~^*XRMZEvM_I;W)a!KE5|vvU&FQ!7U&y)K&}k)Wf&c!`ENAqn29J z_a*g#R@}PuoAO=lRBNs+Yq#X_c47FJi|;PJ_gd>hJ3sc$eCynOWvs*JUpel_#q%tz%`wXGJnUc9YNwTH$wFSjN2?ZwT-t>Ir+-(UEw zd{_GJ!{LecQ-rlF!%0_?cZ0MBDcm+)0=ddc9pT#`B9TK6vK})y zWr-&tEM$YDK(3;WjE>-2+`)(Z;3J;nr*;G+6g#Z2aPPf+hh7!?u^`1RB68*fr?upoS6PBv8xv2R=yAR8X$kaIhWVfP^928P;InClSUH zz|zv<)K8{fTUwe=SCU($O7-7aQ=2uWMGa0^ZGh;87gEDyXC`opkK1KZ?&n~*jKLG^ zs!gmJY!L_SV_~0yR+PB@Gr=Q!tyf$egQ>45E`+NnDJ{e}e=#(I|GToFLvU6aV587WYl$?>SR!6O z)GvK6{-0%>ECVFLWs1iJfPO^#su$V#0zGex#Sj_OaBrecHu!kWJSeLRSQ<8SEDOR8q zGQyBjRtTo3lcV2c{ckbSLmgUX!&yeY10+@wc~G=6B{C>U?afl%`hh+6&Jg4RECuU8 zz9xb^$d7KFyZ-Dab9eH`Tj%d9`TNDO_nNJr-Om;OF*?50{NQx^$TQbZwWp5Vn>urQ z>I`5(F$XX(r~*;cj)2r5z=B)>NEa2-3_1ro>`%w@Y>p9j!LLlmJ92?nQ(=r}eX%bW zdkuFP(kbM({;Zr>3`35lHVI}}gc{!3mxW-$z@lrRG{PXK+JI~ikVBbEQs$?WITK~| zX*}F3iOWzYm!S+!i;tx47};IS>SfA6hq7WVF7B=Z47h|2uq9R`q!5+VFNt-SW%ilv zN$zwCg=gqFSY>r@@D`Acz;WCc=+Yf@=?iq?bM(UJXaT^DpKNpEkNHVX*?M^g!3O}2 zpI~INBf{{}OB~V;epvVjKyQ!}cZ8xQwdBrp#yG~QTPJrAeEJz-_-F>H6YobKyxHLe N#wV)Mrj)$Te*rxh%h&(_ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/__pycache__/wthr.cpython-312.pyc b/powerline-bin/powerline/segments/common/__pycache__/wthr.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..053f92c1801c8c7a9d8e6af3d01a9b1207b769a1 GIT binary patch literal 7798 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 JF~pqJ{{o_Fz>@#~ literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/common/bat.py b/powerline-bin/powerline/segments/common/bat.py new file mode 100644 index 0000000..c892f62 --- /dev/null +++ b/powerline-bin/powerline/segments/common/bat.py @@ -0,0 +1,302 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import sys +import re + +from powerline.lib.shell import run_cmd + + +def _fetch_battery_info(pl): + try: + import dbus + except ImportError: + pl.debug('Not using DBUS+UPower as dbus is not available') + else: + try: + bus = dbus.SystemBus() + except Exception as e: + pl.exception('Failed to connect to system bus: {0}', str(e)) + else: + interface = 'org.freedesktop.UPower' + try: + up = bus.get_object(interface, '/org/freedesktop/UPower') + except dbus.exceptions.DBusException as e: + if getattr(e, '_dbus_error_name', '').endswith('ServiceUnknown'): + pl.debug('Not using DBUS+UPower as UPower is not available via dbus') + else: + pl.exception('Failed to get UPower service with dbus: {0}', str(e)) + else: + devinterface = 'org.freedesktop.DBus.Properties' + devtype_name = interface + '.Device' + devices = [] + for devpath in up.EnumerateDevices(dbus_interface=interface): + dev = bus.get_object(interface, devpath) + devget = lambda what: dev.Get( + devtype_name, + what, + dbus_interface=devinterface + ) + if int(devget('Type')) != 2: + pl.debug('Not using DBUS+UPower with {0}: invalid type', devpath) + continue + if not bool(devget('IsPresent')): + pl.debug('Not using DBUS+UPower with {0}: not present', devpath) + continue + if not bool(devget('PowerSupply')): + pl.debug('Not using DBUS+UPower with {0}: not a power supply', devpath) + continue + devices.append(devpath) + pl.debug('Using DBUS+UPower with {0}', devpath) + if devices: + def _flatten_battery(pl): + energy = 0.0 + energy_full = 0.0 + state = True + for devpath in devices: + dev = bus.get_object(interface, devpath) + energy_full += float( + dbus.Interface(dev, dbus_interface=devinterface).Get( + devtype_name, + 'EnergyFull' + ), + ) + energy += float( + dbus.Interface(dev, dbus_interface=devinterface).Get( + devtype_name, + 'Energy' + ), + ) + state &= dbus.Interface(dev, dbus_interface=devinterface).Get( + devtype_name, + 'State' + ) != 2 + if energy_full > 0: + return (energy * 100.0 / energy_full), state + else: + return 0.0, state + return _flatten_battery + pl.debug('Not using DBUS+UPower as no batteries were found') + + if os.path.isdir('/sys/class/power_supply'): + # ENERGY_* attributes represents capacity in µWh only. + # CHARGE_* attributes represents capacity in µAh only. + linux_capacity_units = ('energy', 'charge') + linux_energy_full_fmt = '/sys/class/power_supply/{0}/{1}_full' + linux_energy_fmt = '/sys/class/power_supply/{0}/{1}_now' + linux_status_fmt = '/sys/class/power_supply/{0}/status' + devices = [] + for linux_supplier in os.listdir('/sys/class/power_supply'): + for unit in linux_capacity_units: + energy_path = linux_energy_fmt.format(linux_supplier, unit) + if not os.path.exists(energy_path): + continue + pl.debug('Using /sys/class/power_supply with battery {0} and unit {1}', + linux_supplier, unit) + devices.append((linux_supplier, unit)) + break # energy or charge, not both + if devices: + def _get_battery_status(pl): + energy = 0.0 + energy_full = 0.0 + state = True + for device, unit in devices: + with open(linux_energy_full_fmt.format(device, unit), 'r') as f: + energy_full += int(float(f.readline().split()[0])) + with open(linux_energy_fmt.format(device, unit), 'r') as f: + energy += int(float(f.readline().split()[0])) + try: + with open(linux_status_fmt.format(device), 'r') as f: + state &= (f.readline().strip() != 'Discharging') + except IOError: + state = None + return (energy * 100.0 / energy_full), state + return _get_battery_status + pl.debug('Not using /sys/class/power_supply as no batteries were found') + else: + pl.debug("Checking for first capacity battery percentage") + for batt in os.listdir('/sys/class/power_supply'): + if os.path.exists('/sys/class/power_supply/{0}/capacity'.format(batt)): + def _get_battery_perc(pl): + state = True + with open('/sys/class/power_supply/{0}/capacity'.format(batt), 'r') as f: + perc = int(f.readline().split()[0]) + try: + with open(linux_status_fmt.format(batt), 'r') as f: + state &= (f.readline().strip() != 'Discharging') + except IOError: + state = None + return perc, state + return _get_battery_perc + else: + pl.debug('Not using /sys/class/power_supply: no directory') + + try: + from shutil import which # Python-3.3 and later + except ImportError: + pl.info('Using dumb “which” which only checks for file in /usr/bin') + which = lambda f: (lambda fp: os.path.exists(fp) and fp)(os.path.join('/usr/bin', f)) + + if which('pmset'): + pl.debug('Using pmset') + + BATTERY_PERCENT_RE = re.compile(r'(\d+)%') + + def _get_battery_status(pl): + battery_summary = run_cmd(pl, ['pmset', '-g', 'batt']) + battery_percent = BATTERY_PERCENT_RE.search(battery_summary).group(1) + ac_charging = 'AC' in battery_summary + return int(battery_percent), ac_charging + return _get_battery_status + else: + pl.debug('Not using pmset: executable not found') + + if sys.platform.startswith('win') or sys.platform == 'cygwin': + # From http://stackoverflow.com/a/21083571/273566, reworked + try: + from win32com.client import GetObject + except ImportError: + pl.debug('Not using win32com.client as it is not available') + else: + try: + wmi = GetObject('winmgmts:') + except Exception as e: + pl.exception('Failed to run GetObject from win32com.client: {0}', str(e)) + else: + for battery in wmi.InstancesOf('Win32_Battery'): + pl.debug('Using win32com.client with Win32_Battery') + + def _get_battery_status(pl): + # http://msdn.microsoft.com/en-us/library/aa394074(v=vs.85).aspx + return battery.EstimatedChargeRemaining, battery.BatteryStatus == 6 + + return _get_battery_status + pl.debug('Not using win32com.client as no batteries were found') + from ctypes import Structure, c_byte, c_ulong, byref + if sys.platform == 'cygwin': + pl.debug('Using cdll to communicate with kernel32 (Cygwin)') + from ctypes import cdll + library_loader = cdll + else: + pl.debug('Using windll to communicate with kernel32 (Windows)') + from ctypes import windll + library_loader = windll + + class PowerClass(Structure): + _fields_ = [ + ('ACLineStatus', c_byte), + ('BatteryFlag', c_byte), + ('BatteryLifePercent', c_byte), + ('Reserved1', c_byte), + ('BatteryLifeTime', c_ulong), + ('BatteryFullLifeTime', c_ulong) + ] + + def _get_battery_status(pl): + powerclass = PowerClass() + result = library_loader.kernel32.GetSystemPowerStatus(byref(powerclass)) + # http://msdn.microsoft.com/en-us/library/windows/desktop/aa372693(v=vs.85).aspx + if result: + return None + return powerclass.BatteryLifePercent, powerclass.ACLineStatus == 1 + + if _get_battery_status() is None: + pl.debug('Not using GetSystemPowerStatus because it failed') + else: + pl.debug('Using GetSystemPowerStatus') + + return _get_battery_status + + raise NotImplementedError + + +def _get_battery_status(pl): + global _get_battery_status + + def _failing_get_status(pl): + raise NotImplementedError + + try: + _get_battery_status = _fetch_battery_info(pl) + except NotImplementedError: + _get_battery_status = _failing_get_status + except Exception as e: + pl.exception('Exception while obtaining battery status: {0}', str(e)) + _get_battery_status = _failing_get_status + return _get_battery_status(pl) + + +def battery(pl, format='{ac_state} {capacity:3.0%}', steps=5, gamify=False, full_heart='O', empty_heart='O', online='C', offline=' '): + '''Return battery charge status. + + :param str format: + Percent format in case gamify is False. Format arguments: ``ac_state`` + which is equal to either ``online`` or ``offline`` string arguments and + ``capacity`` which is equal to current battery capacity in interval [0, + 100]. + :param int steps: + Number of discrete steps to show between 0% and 100% capacity if gamify + is True. + :param bool gamify: + Measure in hearts (♥) instead of percentages. For full hearts + ``battery_full`` highlighting group is preferred, for empty hearts there + is ``battery_empty``. ``battery_online`` or ``battery_offline`` group + will be used for leading segment containing ``online`` or ``offline`` + argument contents. + :param str full_heart: + Heart displayed for “full” part of battery. + :param str empty_heart: + Heart displayed for “used” part of battery. It is also displayed using + another gradient level and highlighting group, so it is OK for it to be + the same as full_heart as long as necessary highlighting groups are + defined. + :param str online: + Symbol used if computer is connected to a power supply. + :param str offline: + Symbol used if computer is not connected to a power supply. + + ``battery_gradient`` and ``battery`` groups are used in any case, first is + preferred. + + Highlight groups used: ``battery_full`` or ``battery_gradient`` (gradient) or ``battery``, ``battery_empty`` or ``battery_gradient`` (gradient) or ``battery``, ``battery_online`` or ``battery_ac_state`` or ``battery_gradient`` (gradient) or ``battery``, ``battery_offline`` or ``battery_ac_state`` or ``battery_gradient`` (gradient) or ``battery``. + ''' + try: + capacity, ac_powered = _get_battery_status(pl) + except NotImplementedError: + pl.info('Unable to get battery status.') + return None + + ret = [] + if gamify: + denom = int(steps) + numer = int(denom * capacity / 100) + ret.append({ + 'contents': online if ac_powered else offline, + 'draw_inner_divider': False, + 'highlight_groups': ['battery_online' if ac_powered else 'battery_offline', 'battery_ac_state', 'battery_gradient', 'battery'], + 'gradient_level': 0, + }) + ret.append({ + 'contents': full_heart * numer, + 'draw_inner_divider': False, + 'highlight_groups': ['battery_full', 'battery_gradient', 'battery'], + # Using zero as “nothing to worry about”: it is least alert color. + 'gradient_level': 0, + }) + ret.append({ + 'contents': empty_heart * (denom - numer), + 'draw_inner_divider': False, + 'highlight_groups': ['battery_empty', 'battery_gradient', 'battery'], + # Using a hundred as it is most alert color. + 'gradient_level': 100, + }) + else: + ret.append({ + 'contents': format.format(ac_state=(online if ac_powered else offline), capacity=(capacity / 100.0)), + 'highlight_groups': ['battery_gradient', 'battery'], + # Gradients are “least alert – most alert” by default, capacity has + # the opposite semantics. + 'gradient_level': 100 - capacity, + }) + return ret diff --git a/powerline-bin/powerline/segments/common/env.py b/powerline-bin/powerline/segments/common/env.py new file mode 100644 index 0000000..61f516e --- /dev/null +++ b/powerline-bin/powerline/segments/common/env.py @@ -0,0 +1,197 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from powerline.lib.unicode import out_u +from powerline.theme import requires_segment_info +from powerline.segments import Segment, with_docstring + + +@requires_segment_info +def environment(pl, segment_info, variable=None): + '''Return the value of any defined environment variable + + :param string variable: + The environment variable to return if found + ''' + return segment_info['environ'].get(variable, None) + + +@requires_segment_info +def virtualenv(pl, segment_info, ignore_venv=False, ignore_conda=False): + '''Return the name of the current Python or conda virtualenv. + + :param bool ignore_venv: + Whether to ignore virtual environments. Default is False. + :param bool ignore_conda: + Whether to ignore conda environments. Default is False. + ''' + return ( + (not ignore_venv and + os.path.basename(segment_info['environ'].get('VIRTUAL_ENV', ''))) or + (not ignore_conda and + segment_info['environ'].get('CONDA_DEFAULT_ENV', '')) or + None) + + +@requires_segment_info +class CwdSegment(Segment): + def argspecobjs(self): + for obj in super(CwdSegment, self).argspecobjs(): + yield obj + yield 'get_shortened_path', self.get_shortened_path + + def omitted_args(self, name, method): + if method is self.get_shortened_path: + return () + else: + return super(CwdSegment, self).omitted_args(name, method) + + def get_shortened_path(self, pl, segment_info, shorten_home=True, **kwargs): + try: + path = out_u(segment_info['getcwd']()) + except OSError as e: + if e.errno == 2: + # user most probably deleted the directory + # this happens when removing files from Mercurial repos for example + pl.warn('Current directory not found') + return '[not found]' + else: + raise + if shorten_home: + home = segment_info['home'] + if home: + home = out_u(home) + if path.startswith(home): + path = '~' + path[len(home):] + return path + + def __call__(self, pl, segment_info, + dir_shorten_len=None, + dir_limit_depth=None, + use_path_separator=False, + ellipsis='...', + **kwargs): + cwd = self.get_shortened_path(pl, segment_info, **kwargs) + cwd_split = cwd.split(os.sep) + cwd_split_len = len(cwd_split) + cwd = [i[0:dir_shorten_len] if dir_shorten_len and i else i for i in cwd_split[:-1]] + [cwd_split[-1]] + if dir_limit_depth and cwd_split_len > dir_limit_depth + 1: + del(cwd[0:-dir_limit_depth]) + if ellipsis is not None: + cwd.insert(0, ellipsis) + ret = [] + if not cwd[0]: + cwd[0] = '/' + draw_inner_divider = not use_path_separator + for part in cwd: + if not part: + continue + if use_path_separator: + part += os.sep + ret.append({ + 'contents': part, + 'divider_highlight_group': 'cwd:divider', + 'draw_inner_divider': draw_inner_divider, + }) + ret[-1]['highlight_groups'] = ['cwd:current_folder', 'cwd'] + if use_path_separator: + ret[-1]['contents'] = ret[-1]['contents'][:-1] + if len(ret) > 1 and ret[0]['contents'][0] == os.sep: + ret[0]['contents'] = ret[0]['contents'][1:] + return ret + + +cwd = with_docstring(CwdSegment(), +'''Return the current working directory. + +Returns a segment list to create a breadcrumb-like effect. + +:param int dir_shorten_len: + shorten parent directory names to this length (e.g. + :file:`/long/path/to/powerline` → :file:`/l/p/t/powerline`) +:param int dir_limit_depth: + limit directory depth to this number (e.g. + :file:`/long/path/to/powerline` → :file:`⋯/to/powerline`) +:param bool use_path_separator: + Use path separator in place of soft divider. +:param bool shorten_home: + Shorten home directory to ``~``. +:param str ellipsis: + Specifies what to use in place of omitted directories. Use None to not + show this subsegment at all. + +Divider highlight group used: ``cwd:divider``. + +Highlight groups used: ``cwd:current_folder`` or ``cwd``. It is recommended to define all highlight groups. +''') + + +try: + import psutil + + # psutil-2.0.0: psutil.Process.username is unbound method + if callable(psutil.Process.username): + def _get_user(): + return psutil.Process(os.getpid()).username() + # pre psutil-2.0.0: psutil.Process.username has type property + else: + def _get_user(): + return psutil.Process(os.getpid()).username +except ImportError: + try: + import pwd + except ImportError: + from getpass import getuser as _get_user + else: + try: + from os import geteuid as getuid + except ImportError: + from os import getuid + + def _get_user(): + return pwd.getpwuid(getuid()).pw_name + + +username = False +# os.geteuid is not available on windows +_geteuid = getattr(os, 'geteuid', lambda: 1) + + +@requires_segment_info +def user(pl, segment_info, hide_user=None, hide_domain=False): + '''Return the current user. + + :param str hide_user: + Omit showing segment for users with names equal to this string. + :param bool hide_domain: + Drop domain component if it exists in a username (delimited by '@'). + + Highlights the user with the ``superuser`` if the effective user ID is 0. + + Highlight groups used: ``superuser`` or ``user``. It is recommended to define all highlight groups. + ''' + global username + if ( + segment_info['environ'].get('_POWERLINE_RUNNING_SHELL_TESTS') + == 'ee5bcdc6-b749-11e7-9456-50465d597777' + ): + return 'user' + if username is False: + username = _get_user() + if username is None: + pl.warn('Failed to get username') + return None + if username == hide_user: + return None + if hide_domain: + try: + username = username[:username.index('@')] + except ValueError: + pass + euid = _geteuid() + return [{ + 'contents': username, + 'highlight_groups': ['user'] if euid != 0 else ['superuser', 'user'], + }] diff --git a/powerline-bin/powerline/segments/common/mail.py b/powerline-bin/powerline/segments/common/mail.py new file mode 100644 index 0000000..8202492 --- /dev/null +++ b/powerline-bin/powerline/segments/common/mail.py @@ -0,0 +1,78 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import re + +from imaplib import IMAP4_SSL_PORT, IMAP4_SSL, IMAP4 +from collections import namedtuple + +from powerline.lib.threaded import KwThreadedSegment +from powerline.segments import with_docstring + + +_IMAPKey = namedtuple('Key', 'username password server port folder use_ssl') + + +class EmailIMAPSegment(KwThreadedSegment): + interval = 60 + + @staticmethod + def key(username, password, server='imap.gmail.com', port=IMAP4_SSL_PORT, folder='INBOX', use_ssl=None, **kwargs): + if use_ssl is None: + use_ssl = (port == IMAP4_SSL_PORT) + return _IMAPKey(username, password, server, port, folder, use_ssl) + + def compute_state(self, key): + if not key.username or not key.password: + self.warn('Username and password are not configured') + return None + if key.use_ssl: + mail = IMAP4_SSL(key.server, key.port) + else: + mail = IMAP4(key.server, key.port) + mail.login(key.username, key.password) + rc, message = mail.status(key.folder, '(UNSEEN)') + unread_str = message[0].decode('utf-8') + unread_count = int(re.search('UNSEEN (\d+)', unread_str).group(1)) + return unread_count + + @staticmethod + def render_one(unread_count, max_msgs=None, **kwargs): + if not unread_count: + return None + elif type(unread_count) != int or not max_msgs: + return [{ + 'contents': str(unread_count), + 'highlight_groups': ['email_alert'], + }] + else: + return [{ + 'contents': str(unread_count), + 'highlight_groups': ['email_alert_gradient', 'email_alert'], + 'gradient_level': min(unread_count * 100.0 / max_msgs, 100), + }] + + +email_imap_alert = with_docstring(EmailIMAPSegment(), +('''Return unread e-mail count for IMAP servers. + +:param str username: + login username +:param str password: + login password +:param str server: + e-mail server +:param int port: + e-mail server port +:param str folder: + folder to check for e-mails +:param int max_msgs: + Maximum number of messages. If there are more messages then max_msgs then it + will use gradient level equal to 100, otherwise gradient level is equal to + ``100 * msgs_num / max_msgs``. If not present gradient is not computed. +:param bool use_ssl: + If ``True`` then use SSL connection. If ``False`` then do not use it. + Default is ``True`` if port is equal to {ssl_port} and ``False`` otherwise. + +Highlight groups used: ``email_alert_gradient`` (gradient), ``email_alert``. +''').format(ssl_port=IMAP4_SSL_PORT)) diff --git a/powerline-bin/powerline/segments/common/net.py b/powerline-bin/powerline/segments/common/net.py new file mode 100644 index 0000000..b5d9062 --- /dev/null +++ b/powerline-bin/powerline/segments/common/net.py @@ -0,0 +1,315 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import re +import os +import socket + +from powerline.lib.url import urllib_read +from powerline.lib.threaded import ThreadedSegment, KwThreadedSegment +from powerline.lib.monotonic import monotonic +from powerline.lib.humanize_bytes import humanize_bytes +from powerline.segments import with_docstring +from powerline.theme import requires_segment_info + + +@requires_segment_info +def hostname(pl, segment_info, only_if_ssh=False, exclude_domain=False): + '''Return the current hostname. + + :param bool only_if_ssh: + only return the hostname if currently in an SSH session + :param bool exclude_domain: + return the hostname without domain if there is one + ''' + if ( + segment_info['environ'].get('_POWERLINE_RUNNING_SHELL_TESTS') + == 'ee5bcdc6-b749-11e7-9456-50465d597777' + ): + return 'hostname' + if only_if_ssh and not segment_info['environ'].get('SSH_CLIENT'): + return None + if exclude_domain: + return socket.gethostname().split('.')[0] + return socket.gethostname() + + +def _external_ip(query_url='http://ipv4.icanhazip.com/'): + return urllib_read(query_url).strip() + + +class ExternalIpSegment(ThreadedSegment): + interval = 300 + + def set_state(self, query_url='http://ipv4.icanhazip.com/', **kwargs): + self.query_url = query_url + super(ExternalIpSegment, self).set_state(**kwargs) + + def update(self, old_ip): + return _external_ip(query_url=self.query_url) + + def render(self, ip, **kwargs): + if not ip: + return None + return [{'contents': ip, 'divider_highlight_group': 'background:divider'}] + + +external_ip = with_docstring(ExternalIpSegment(), +'''Return external IP address. + +:param str query_url: + URI to query for IP address, should return only the IP address as a text string + + Suggested URIs: + + * http://ipv4.icanhazip.com/ + * http://ipv6.icanhazip.com/ + * http://icanhazip.com/ (returns IPv6 address if available, else IPv4) + +Divider highlight group used: ``background:divider``. +''') + + +try: + import netifaces +except ImportError: + def internal_ip(pl, interface='auto', ipv=4): + return None +else: + _interface_starts = { + 'eth': 10, # Regular ethernet adapters : eth1 + 'enp': 10, # Regular ethernet adapters, Gentoo : enp2s0 + 'en': 10, # OS X : en0 + 'ath': 9, # Atheros WiFi adapters : ath0 + 'wlan': 9, # Other WiFi adapters : wlan1 + 'wlp': 9, # Other WiFi adapters, Gentoo : wlp5s0 + 'teredo': 1, # miredo interface : teredo + 'lo': -10, # Loopback interface : lo + 'docker': -5, # Docker bridge interface : docker0 + 'vmnet': -5, # VMWare bridge interface : vmnet1 + 'vboxnet': -5, # VirtualBox bridge interface : vboxnet0 + } + + _interface_start_re = re.compile(r'^([a-z]+?)(\d|$)') + + def _interface_key(interface): + match = _interface_start_re.match(interface) + if match: + try: + base = _interface_starts[match.group(1)] * 100 + except KeyError: + base = 500 + if match.group(2): + return base - int(match.group(2)) + else: + return base + else: + return 0 + + def internal_ip(pl, interface='auto', ipv=4): + family = netifaces.AF_INET6 if ipv == 6 else netifaces.AF_INET + if interface == 'auto': + try: + interface = next(iter(sorted(netifaces.interfaces(), key=_interface_key, reverse=True))) + except StopIteration: + pl.info('No network interfaces found') + return None + elif interface == 'default_gateway': + try: + interface = netifaces.gateways()['default'][family][1] + except KeyError: + pl.info('No default gateway found for IPv{0}', ipv) + return None + addrs = netifaces.ifaddresses(interface) + try: + return addrs[family][0]['addr'] + except (KeyError, IndexError): + pl.info("No IPv{0} address found for interface {1}", ipv, interface) + return None + + +internal_ip = with_docstring(internal_ip, +'''Return internal IP address + +Requires ``netifaces`` module to work properly. + +:param str interface: + Interface on which IP will be checked. Use ``auto`` to automatically + detect interface. In this case interfaces with lower numbers will be + preferred over interfaces with similar names. Order of preference based on + names: + + #. ``eth`` and ``enp`` followed by number or the end of string. + #. ``ath``, ``wlan`` and ``wlp`` followed by number or the end of string. + #. ``teredo`` followed by number or the end of string. + #. Any other interface that is not ``lo*``. + #. ``lo`` followed by number or the end of string. + + Use ``default_gateway`` to detect the interface based on the machine's + `default gateway `_ (i.e., + the router to which it is connected). + +:param int ipv: + 4 or 6 for ipv4 and ipv6 respectively, depending on which IP address you + need exactly. +''') + + +try: + import psutil + + def _get_bytes(interface): + try: + io_counters = psutil.net_io_counters(pernic=True) + except AttributeError: + io_counters = psutil.network_io_counters(pernic=True) + if_io = io_counters.get(interface) + if not if_io: + return None + return if_io.bytes_recv, if_io.bytes_sent + + def _get_interfaces(): + try: + io_counters = psutil.net_io_counters(pernic=True) + except AttributeError: + io_counters = psutil.network_io_counters(pernic=True) + for interface, data in io_counters.items(): + if data: + yield interface, data.bytes_recv, data.bytes_sent +except ImportError: + def _get_bytes(interface): + with open('/sys/class/net/{interface}/statistics/rx_bytes'.format(interface=interface), 'rb') as file_obj: + rx = int(file_obj.read()) + with open('/sys/class/net/{interface}/statistics/tx_bytes'.format(interface=interface), 'rb') as file_obj: + tx = int(file_obj.read()) + return (rx, tx) + + def _get_interfaces(): + for interface in os.listdir('/sys/class/net'): + x = _get_bytes(interface) + if x is not None: + yield interface, x[0], x[1] + + +class NetworkLoadSegment(KwThreadedSegment): + interfaces = {} + replace_num_pat = re.compile(r'[a-zA-Z]+') + + @staticmethod + def key(interface='auto', **kwargs): + return interface + + def compute_state(self, interface): + if interface == 'auto': + proc_exists = getattr(self, 'proc_exists', None) + if proc_exists is None: + proc_exists = self.proc_exists = os.path.exists('/proc/net/route') + if proc_exists: + # Look for default interface in routing table + with open('/proc/net/route', 'rb') as f: + for line in f.readlines(): + parts = line.split() + if len(parts) > 1: + iface, destination = parts[:2] + if not destination.replace(b'0', b''): + interface = iface.decode('utf-8') + break + if interface == 'auto': + # Choose interface with most total activity, excluding some + # well known interface names + interface, total = 'eth0', -1 + for name, rx, tx in _get_interfaces(): + base = self.replace_num_pat.match(name) + if None in (base, rx, tx) or base.group() in ('lo', 'vmnet', 'sit'): + continue + activity = rx + tx + if activity > total: + total = activity + interface = name + + try: + idata = self.interfaces[interface] + try: + idata['prev'] = idata['last'] + except KeyError: + pass + except KeyError: + idata = {} + if self.run_once: + idata['prev'] = (monotonic(), _get_bytes(interface)) + self.shutdown_event.wait(self.interval) + self.interfaces[interface] = idata + + idata['last'] = (monotonic(), _get_bytes(interface)) + return idata.copy() + + def render_one(self, idata, recv_format='DL {value:>8}', sent_format='UL {value:>8}', suffix='B/s', si_prefix=False, **kwargs): + if not idata or 'prev' not in idata: + return None + + t1, b1 = idata['prev'] + t2, b2 = idata['last'] + measure_interval = t2 - t1 + + if None in (b1, b2): + return None + + r = [] + for i, key in zip((0, 1), ('recv', 'sent')): + format = locals()[key + '_format'] + try: + value = (b2[i] - b1[i]) / measure_interval + except ZeroDivisionError: + self.warn('Measure interval zero.') + value = 0 + max_key = key + '_max' + is_gradient = max_key in kwargs + hl_groups = ['network_load_' + key, 'network_load'] + if is_gradient: + hl_groups[:0] = (group + '_gradient' for group in hl_groups) + r.append({ + 'contents': format.format(value=humanize_bytes(value, suffix, si_prefix)), + 'divider_highlight_group': 'network_load:divider', + 'highlight_groups': hl_groups, + }) + if is_gradient: + max = kwargs[max_key] + if value >= max: + r[-1]['gradient_level'] = 100 + else: + r[-1]['gradient_level'] = value * 100.0 / max + + return r + + +network_load = with_docstring(NetworkLoadSegment(), +'''Return the network load. + +Uses the ``psutil`` module if available for multi-platform compatibility, +falls back to reading +:file:`/sys/class/net/{interface}/statistics/{rx,tx}_bytes`. + +:param str interface: + Network interface to measure (use the special value "auto" to have powerline + try to auto-detect the network interface). +:param str suffix: + String appended to each load string. +:param bool si_prefix: + Use SI prefix, e.g. MB instead of MiB. +:param str recv_format: + Format string that determines how download speed should look like. Receives + ``value`` as argument. +:param str sent_format: + Format string that determines how upload speed should look like. Receives + ``value`` as argument. +:param float recv_max: + Maximum number of received bytes per second. Is only used to compute + gradient level. +:param float sent_max: + Maximum number of sent bytes per second. Is only used to compute gradient + level. + +Divider highlight group used: ``network_load:divider``. + +Highlight groups used: ``network_load_sent_gradient`` (gradient) or ``network_load_recv_gradient`` (gradient) or ``network_load_gradient`` (gradient), ``network_load_sent`` or ``network_load_recv`` or ``network_load``. +''') diff --git a/powerline-bin/powerline/segments/common/players.py b/powerline-bin/powerline/segments/common/players.py new file mode 100644 index 0000000..9298bc9 --- /dev/null +++ b/powerline-bin/powerline/segments/common/players.py @@ -0,0 +1,607 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys + +from powerline.lib.shell import asrun, run_cmd +from powerline.lib.unicode import out_u +from powerline.segments import Segment, with_docstring + + +STATE_SYMBOLS = { + 'fallback': '', + 'play': '>', + 'pause': '~', + 'stop': 'X', +} + + +def _convert_state(state): + '''Guess player state''' + state = state.lower() + if 'play' in state: + return 'play' + if 'pause' in state: + return 'pause' + if 'stop' in state: + return 'stop' + return 'fallback' + + +def _convert_seconds(seconds): + '''Convert seconds to minutes:seconds format''' + return '{0:.0f}:{1:02.0f}'.format(*divmod(float(seconds), 60)) + + +class PlayerSegment(Segment): + def __call__(self, format='{state_symbol} {artist} - {title} ({total})', state_symbols=STATE_SYMBOLS, **kwargs): + stats = { + 'state': 'fallback', + 'album': None, + 'artist': None, + 'title': None, + 'elapsed': None, + 'total': None, + } + func_stats = self.get_player_status(**kwargs) + if not func_stats: + return None + stats.update(func_stats) + stats['state_symbol'] = state_symbols.get(stats['state']) + return [{ + 'contents': format.format(**stats), + 'highlight_groups': ['player_' + (stats['state'] or 'fallback'), 'player'], + }] + + def get_player_status(self, pl): + pass + + def argspecobjs(self): + for ret in super(PlayerSegment, self).argspecobjs(): + yield ret + yield 'get_player_status', self.get_player_status + + def omitted_args(self, name, method): + return () + + +_common_args = ''' +This player segment should be added like this: + +.. code-block:: json + + {{ + "function": "powerline.segments.common.players.{0}", + "name": "player" + }} + +(with additional ``"args": {{…}}`` if needed). + +Highlight groups used: ``player_fallback`` or ``player``, ``player_play`` or ``player``, ``player_pause`` or ``player``, ``player_stop`` or ``player``. + +:param str format: + Format used for displaying data from player. Should be a str.format-like + string with the following keyword parameters: + + +------------+-------------------------------------------------------------+ + |Parameter |Description | + +============+=============================================================+ + |state_symbol|Symbol displayed for play/pause/stop states. There is also | + | |“fallback” state used in case function failed to get player | + | |state. For this state symbol is by default empty. All | + | |symbols are defined in ``state_symbols`` argument. | + +------------+-------------------------------------------------------------+ + |album |Album that is currently played. | + +------------+-------------------------------------------------------------+ + |artist |Artist whose song is currently played | + +------------+-------------------------------------------------------------+ + |title |Currently played composition. | + +------------+-------------------------------------------------------------+ + |elapsed |Composition duration in format M:SS (minutes:seconds). | + +------------+-------------------------------------------------------------+ + |total |Composition length in format M:SS. | + +------------+-------------------------------------------------------------+ +:param dict state_symbols: + Symbols used for displaying state. Must contain all of the following keys: + + ======== ======================================================== + Key Description + ======== ======================================================== + play Displayed when player is playing. + pause Displayed when player is paused. + stop Displayed when player is not playing anything. + fallback Displayed if state is not one of the above or not known. + ======== ======================================================== +''' + + +_player = with_docstring(PlayerSegment(), _common_args.format('_player')) + + +class CmusPlayerSegment(PlayerSegment): + def get_player_status(self, pl): + '''Return cmus player information. + + cmus-remote -Q returns data with multi-level information i.e. + status playing + file + tag artist + tag title + tag .. + tag n + set continue + set repeat + set .. + set n + + For the information we are looking for we don’t really care if we’re on + the tag level or the set level. The dictionary comprehension in this + method takes anything in ignore_levels and brings the key inside that + to the first level of the dictionary. + ''' + now_playing_str = run_cmd(pl, ['cmus-remote', '-Q']) + if not now_playing_str: + return + ignore_levels = ('tag', 'set',) + now_playing = dict(((token[0] if token[0] not in ignore_levels else token[1], + (' '.join(token[1:]) if token[0] not in ignore_levels else + ' '.join(token[2:]))) for token in [line.split(' ') for line in now_playing_str.split('\n')[:-1]])) + state = _convert_state(now_playing.get('status')) + return { + 'state': state, + 'album': now_playing.get('album'), + 'artist': now_playing.get('artist'), + 'title': now_playing.get('title'), + 'elapsed': _convert_seconds(now_playing.get('position', 0)), + 'total': _convert_seconds(now_playing.get('duration', 0)), + } + + +cmus = with_docstring(CmusPlayerSegment(), +('''Return CMUS player information + +Requires cmus-remote command be acessible from $PATH. + +{0} +''').format(_common_args.format('cmus'))) + + +class MpdPlayerSegment(PlayerSegment): + def get_player_status(self, pl, host='localhost', password=None, port=6600): + try: + import mpd + except ImportError: + if password: + host = password + '@' + host + now_playing = run_cmd(pl, [ + 'mpc', 'current', + '-f', '%album%\n%artist%\n%title%\n%time%', + '-h', host, + '-p', str(port) + ], strip=False) + if not now_playing: + return + now_playing = now_playing.split('\n') + return { + 'album': now_playing[0], + 'artist': now_playing[1], + 'title': now_playing[2], + 'total': now_playing[3], + } + else: + try: + client = mpd.MPDClient(use_unicode=True) + except TypeError: + # python-mpd 1.x does not support use_unicode + client = mpd.MPDClient() + client.connect(host, port) + if password: + client.password(password) + now_playing = client.currentsong() + if not now_playing: + return + status = client.status() + client.close() + client.disconnect() + return { + 'state': status.get('state'), + 'album': now_playing.get('album'), + 'artist': now_playing.get('artist'), + 'title': now_playing.get('title'), + 'elapsed': _convert_seconds(status.get('elapsed', 0)), + 'total': _convert_seconds(now_playing.get('time', 0)), + } + + +mpd = with_docstring(MpdPlayerSegment(), +('''Return Music Player Daemon information + +Requires ``mpd`` Python module (e.g. |python-mpd2|_ or |python-mpd|_ Python +package) or alternatively the ``mpc`` command to be acessible from $PATH. + +.. |python-mpd| replace:: ``python-mpd`` +.. _python-mpd: https://pypi.python.org/pypi/python-mpd + +.. |python-mpd2| replace:: ``python-mpd2`` +.. _python-mpd2: https://pypi.python.org/pypi/python-mpd2 + +{0} +:param str host: + Host on which mpd runs. +:param str password: + Password used for connecting to daemon. +:param int port: + Port which should be connected to. +''').format(_common_args.format('mpd'))) + + +try: + import dbus +except ImportError: + def _get_dbus_player_status(pl, player_name, **kwargs): + pl.error('Could not add {0} segment: requires dbus module', player_name) + return +else: + def _get_dbus_player_status(pl, bus_name, player_path, iface_prop, + iface_player, player_name='player'): + bus = dbus.SessionBus() + try: + player = bus.get_object(bus_name, player_path) + iface = dbus.Interface(player, iface_prop) + info = iface.Get(iface_player, 'Metadata') + status = iface.Get(iface_player, 'PlaybackStatus') + except dbus.exceptions.DBusException: + return + if not info: + return + + try: + elapsed = iface.Get(iface_player, 'Position') + except dbus.exceptions.DBusException: + pl.warning('Missing player elapsed time') + elapsed = None + else: + elapsed = _convert_seconds(elapsed / 1e6) + album = info.get('xesam:album') + title = info.get('xesam:title') + artist = info.get('xesam:artist') + state = _convert_state(status) + if album: + album = out_u(album) + if title: + title = out_u(title) + if artist: + artist = out_u(artist[0]) + return { + 'state': state, + 'album': album, + 'artist': artist, + 'title': title, + 'elapsed': elapsed, + 'total': _convert_seconds(info.get('mpris:length') / 1e6), + } + + +class DbusPlayerSegment(PlayerSegment): + get_player_status = staticmethod(_get_dbus_player_status) + + +dbus_player = with_docstring(DbusPlayerSegment(), +('''Return generic dbus player state + +Requires ``dbus`` python module. Only for players that support specific protocol + (e.g. like :py:func:`spotify` and :py:func:`clementine`). + +{0} +:param str player_name: + Player name. Used in error messages only. +:param str bus_name: + Dbus bus name. +:param str player_path: + Path to the player on the given bus. +:param str iface_prop: + Interface properties name for use with dbus.Interface. +:param str iface_player: + Player name. +''').format(_common_args.format('dbus_player'))) + + +class SpotifyDbusPlayerSegment(PlayerSegment): + def get_player_status(self, pl): + player_status = _get_dbus_player_status( + pl=pl, + player_name='Spotify', + bus_name='org.mpris.MediaPlayer2.spotify', + player_path='/org/mpris/MediaPlayer2', + iface_prop='org.freedesktop.DBus.Properties', + iface_player='org.mpris.MediaPlayer2.Player', + ) + if player_status is not None: + return player_status + # Fallback for legacy spotify client with different DBus protocol + return _get_dbus_player_status( + pl=pl, + player_name='Spotify', + bus_name='com.spotify.qt', + player_path='/', + iface_prop='org.freedesktop.DBus.Properties', + iface_player='org.freedesktop.MediaPlayer2', + ) + + +spotify_dbus = with_docstring(SpotifyDbusPlayerSegment(), +('''Return spotify player information + +Requires ``dbus`` python module. + +{0} +''').format(_common_args.format('spotify_dbus'))) + + +class SpotifyAppleScriptPlayerSegment(PlayerSegment): + def get_player_status(self, pl): + status_delimiter = '-~`/=' + ascript = ''' + tell application "System Events" + set process_list to (name of every process) + end tell + + if process_list contains "Spotify" then + tell application "Spotify" + if player state is playing or player state is paused then + set track_name to name of current track + set artist_name to artist of current track + set album_name to album of current track + set track_length to duration of current track + set now_playing to "" & player state & "{0}" & album_name & "{0}" & artist_name & "{0}" & track_name & "{0}" & track_length & "{0}" & player position + return now_playing + else + return player state + end if + + end tell + else + return "stopped" + end if + '''.format(status_delimiter) + + spotify = asrun(pl, ascript) + if not asrun: + return None + + spotify_status = spotify.split(status_delimiter) + state = _convert_state(spotify_status[0]) + if state == 'stop': + return None + return { + 'state': state, + 'album': spotify_status[1], + 'artist': spotify_status[2], + 'title': spotify_status[3], + 'total': _convert_seconds(int(spotify_status[4])/1000), + 'elapsed': _convert_seconds(spotify_status[5]), + } + + +spotify_apple_script = with_docstring(SpotifyAppleScriptPlayerSegment(), +('''Return spotify player information + +Requires ``osascript`` available in $PATH. + +{0} +''').format(_common_args.format('spotify_apple_script'))) + + +if not sys.platform.startswith('darwin'): + spotify = spotify_dbus + _old_name = 'spotify_dbus' +else: + spotify = spotify_apple_script + _old_name = 'spotify_apple_script' + + +spotify = with_docstring(spotify, spotify.__doc__.replace(_old_name, 'spotify')) + + +class ClementinePlayerSegment(PlayerSegment): + def get_player_status(self, pl): + return _get_dbus_player_status( + pl=pl, + player_name='Clementine', + bus_name='org.mpris.MediaPlayer2.clementine', + player_path='/org/mpris/MediaPlayer2', + iface_prop='org.freedesktop.DBus.Properties', + iface_player='org.mpris.MediaPlayer2.Player', + ) + + +clementine = with_docstring(ClementinePlayerSegment(), +('''Return clementine player information + +Requires ``dbus`` python module. + +{0} +''').format(_common_args.format('clementine'))) + + +class RhythmboxPlayerSegment(PlayerSegment): + def get_player_status(self, pl): + now_playing = run_cmd(pl, [ + 'rhythmbox-client', + '--no-start', '--no-present', + '--print-playing-format', '%at\n%aa\n%tt\n%te\n%td' + ], strip=False) + if not now_playing: + return + now_playing = now_playing.split('\n') + return { + 'album': now_playing[0], + 'artist': now_playing[1], + 'title': now_playing[2], + 'elapsed': now_playing[3], + 'total': now_playing[4], + } + + +rhythmbox = with_docstring(RhythmboxPlayerSegment(), +('''Return rhythmbox player information + +Requires ``rhythmbox-client`` available in $PATH. + +{0} +''').format(_common_args.format('rhythmbox'))) + + +class RDIOPlayerSegment(PlayerSegment): + def get_player_status(self, pl): + status_delimiter = '-~`/=' + ascript = ''' + tell application "System Events" + set rdio_active to the count(every process whose name is "Rdio") + if rdio_active is 0 then + return + end if + end tell + tell application "Rdio" + set rdio_name to the name of the current track + set rdio_artist to the artist of the current track + set rdio_album to the album of the current track + set rdio_duration to the duration of the current track + set rdio_state to the player state + set rdio_elapsed to the player position + return rdio_name & "{0}" & rdio_artist & "{0}" & rdio_album & "{0}" & rdio_elapsed & "{0}" & rdio_duration & "{0}" & rdio_state + end tell + '''.format(status_delimiter) + now_playing = asrun(pl, ascript) + if not now_playing: + return + now_playing = now_playing.split(status_delimiter) + if len(now_playing) != 6: + return + state = _convert_state(now_playing[5]) + total = _convert_seconds(now_playing[4]) + elapsed = _convert_seconds(float(now_playing[3]) * float(now_playing[4]) / 100) + return { + 'title': now_playing[0], + 'artist': now_playing[1], + 'album': now_playing[2], + 'elapsed': elapsed, + 'total': total, + 'state': state, + } + + +rdio = with_docstring(RDIOPlayerSegment(), +('''Return rdio player information + +Requires ``osascript`` available in $PATH. + +{0} +''').format(_common_args.format('rdio'))) + + +class ITunesPlayerSegment(PlayerSegment): + def get_player_status(self, pl): + status_delimiter = '-~`/=' + ascript = ''' + tell application "System Events" + set process_list to (name of every process) + end tell + + if process_list contains "iTunes" then + tell application "iTunes" + if player state is playing then + set t_title to name of current track + set t_artist to artist of current track + set t_album to album of current track + set t_duration to duration of current track + set t_elapsed to player position + set t_state to player state + return t_title & "{0}" & t_artist & "{0}" & t_album & "{0}" & t_elapsed & "{0}" & t_duration & "{0}" & t_state + end if + end tell + end if + '''.format(status_delimiter) + now_playing = asrun(pl, ascript) + if not now_playing: + return + now_playing = now_playing.split(status_delimiter) + if len(now_playing) != 6: + return + title, artist, album = now_playing[0], now_playing[1], now_playing[2] + state = _convert_state(now_playing[5]) + total = _convert_seconds(now_playing[4]) + elapsed = _convert_seconds(now_playing[3]) + return { + 'title': title, + 'artist': artist, + 'album': album, + 'total': total, + 'elapsed': elapsed, + 'state': state + } + + +itunes = with_docstring(ITunesPlayerSegment(), +('''Return iTunes now playing information + +Requires ``osascript``. + +{0} +''').format(_common_args.format('itunes'))) + + +class MocPlayerSegment(PlayerSegment): + def get_player_status(self, pl): + '''Return Music On Console (mocp) player information. + + ``mocp -i`` returns current information i.e. + + .. code-block:: + + File: filename.format + Title: full title + Artist: artist name + SongTitle: song title + Album: album name + TotalTime: 00:00 + TimeLeft: 00:00 + TotalSec: 000 + CurrentTime: 00:00 + CurrentSec: 000 + Bitrate: 000kbps + AvgBitrate: 000kbps + Rate: 00kHz + + For the information we are looking for we don’t really care if we have + extra-timing information or bit rate level. The dictionary comprehension + in this method takes anything in ignore_info and brings the key inside + that to the right info of the dictionary. + ''' + now_playing_str = run_cmd(pl, ['mocp', '-i']) + if not now_playing_str: + return + + now_playing = dict(( + line.split(': ', 1) + for line in now_playing_str.split('\n')[:-1] + )) + state = _convert_state(now_playing.get('State', 'stop')) + return { + 'state': state, + 'album': now_playing.get('Album', ''), + 'artist': now_playing.get('Artist', ''), + 'title': now_playing.get('SongTitle', ''), + 'elapsed': _convert_seconds(now_playing.get('CurrentSec', 0)), + 'total': _convert_seconds(now_playing.get('TotalSec', 0)), + } + + +mocp = with_docstring(MocPlayerSegment(), +('''Return MOC (Music On Console) player information + +Requires version >= 2.3.0 and ``mocp`` executable in ``$PATH``. + +{0} +''').format(_common_args.format('mocp'))) + diff --git a/powerline-bin/powerline/segments/common/sys.py b/powerline-bin/powerline/segments/common/sys.py new file mode 100644 index 0000000..a83025b --- /dev/null +++ b/powerline-bin/powerline/segments/common/sys.py @@ -0,0 +1,183 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from multiprocessing import cpu_count as _cpu_count + +from powerline.lib.threaded import ThreadedSegment +from powerline.lib import add_divider_highlight_group +from powerline.segments import with_docstring + + +cpu_count = None + + +def system_load(pl, format='{avg:.1f}', threshold_good=1, threshold_bad=2, + track_cpu_count=False, short=False): + '''Return system load average. + + Highlights using ``system_load_good``, ``system_load_bad`` and + ``system_load_ugly`` highlighting groups, depending on the thresholds + passed to the function. + + :param str format: + format string, receives ``avg`` as an argument + :param float threshold_good: + threshold for gradient level 0: any normalized load average below this + value will have this gradient level. + :param float threshold_bad: + threshold for gradient level 100: any normalized load average above this + value will have this gradient level. Load averages between + ``threshold_good`` and ``threshold_bad`` receive gradient level that + indicates relative position in this interval: + (``100 * (cur-good) / (bad-good)``). + Note: both parameters are checked against normalized load averages. + :param bool track_cpu_count: + if True powerline will continuously poll the system to detect changes + in the number of CPUs. + :param bool short: + if True only the sys load over last 1 minute will be displayed. + + Divider highlight group used: ``background:divider``. + + Highlight groups used: ``system_load_gradient`` (gradient) or ``system_load``. + ''' + global cpu_count + try: + cpu_num = cpu_count = _cpu_count() if cpu_count is None or track_cpu_count else cpu_count + except NotImplementedError: + pl.warn('Unable to get CPU count: method is not implemented') + return None + ret = [] + for avg in os.getloadavg(): + normalized = avg / cpu_num + if normalized < threshold_good: + gradient_level = 0 + elif normalized < threshold_bad: + gradient_level = (normalized - threshold_good) * 100.0 / (threshold_bad - threshold_good) + else: + gradient_level = 100 + ret.append({ + 'contents': format.format(avg=avg), + 'highlight_groups': ['system_load_gradient', 'system_load'], + 'divider_highlight_group': 'background:divider', + 'gradient_level': gradient_level, + }) + + if short: + return ret + + ret[0]['contents'] += ' ' + ret[1]['contents'] += ' ' + return ret + + +try: + import psutil + + class CPULoadPercentSegment(ThreadedSegment): + interval = 1 + + def update(self, old_cpu): + return psutil.cpu_percent(interval=None) + + def run(self): + while not self.shutdown_event.is_set(): + try: + self.update_value = psutil.cpu_percent(interval=self.interval) + except Exception as e: + self.exception('Exception while calculating cpu_percent: {0}', str(e)) + + def render(self, cpu_percent, format='{0:.0f}%', **kwargs): + if not cpu_percent: + return None + return [{ + 'contents': format.format(cpu_percent), + 'gradient_level': cpu_percent, + 'highlight_groups': ['cpu_load_percent_gradient', 'cpu_load_percent'], + }] +except ImportError: + class CPULoadPercentSegment(ThreadedSegment): + interval = 1 + + @staticmethod + def startup(**kwargs): + pass + + @staticmethod + def start(): + pass + + @staticmethod + def shutdown(): + pass + + @staticmethod + def render(cpu_percent, pl, format='{0:.0f}%', **kwargs): + pl.warn('Module “psutil” is not installed, thus CPU load is not available') + return None + + +cpu_load_percent = with_docstring(CPULoadPercentSegment(), +'''Return the average CPU load as a percentage. + +Requires the ``psutil`` module. + +:param str format: + Output format. Accepts measured CPU load as the first argument. + +Highlight groups used: ``cpu_load_percent_gradient`` (gradient) or ``cpu_load_percent``. +''') + + +if os.path.exists('/proc/uptime'): + def _get_uptime(): + with open('/proc/uptime', 'r') as f: + return int(float(f.readline().split()[0])) +elif 'psutil' in globals(): + from time import time + + if hasattr(psutil, 'boot_time'): + def _get_uptime(): + return int(time() - psutil.boot_time()) + else: + def _get_uptime(): + return int(time() - psutil.BOOT_TIME) +else: + def _get_uptime(): + raise NotImplementedError + + +@add_divider_highlight_group('background:divider') +def uptime(pl, days_format='{days:d}d', hours_format=' {hours:d}h', minutes_format=' {minutes:d}m', seconds_format=' {seconds:d}s', shorten_len=3): + '''Return system uptime. + + :param str days_format: + day format string, will be passed ``days`` as the argument + :param str hours_format: + hour format string, will be passed ``hours`` as the argument + :param str minutes_format: + minute format string, will be passed ``minutes`` as the argument + :param str seconds_format: + second format string, will be passed ``seconds`` as the argument + :param int shorten_len: + shorten the amount of units (days, hours, etc.) displayed + + Divider highlight group used: ``background:divider``. + ''' + try: + seconds = _get_uptime() + except NotImplementedError: + pl.warn('Unable to get uptime. You should install psutil module') + return None + minutes, seconds = divmod(seconds, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + time_formatted = list(filter(None, [ + days_format.format(days=days) if days and days_format else None, + hours_format.format(hours=hours) if hours and hours_format else None, + minutes_format.format(minutes=minutes) if minutes and minutes_format else None, + seconds_format.format(seconds=seconds) if seconds and seconds_format else None, + ]))[0:shorten_len] + return ''.join(time_formatted).strip() diff --git a/powerline-bin/powerline/segments/common/time.py b/powerline-bin/powerline/segments/common/time.py new file mode 100644 index 0000000..1e2207b --- /dev/null +++ b/powerline-bin/powerline/segments/common/time.py @@ -0,0 +1,94 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from datetime import datetime + + +def date(pl, format='%Y-%m-%d', istime=False): + '''Return the current date. + + :param str format: + strftime-style date format string + :param bool istime: + If true then segment uses ``time`` highlight group. + + Divider highlight group used: ``time:divider``. + + Highlight groups used: ``time`` or ``date``. + ''' + try: + contents = datetime.now().strftime(format) + except UnicodeEncodeError: + contents = datetime.now().strftime(format.encode('utf-8')).decode('utf-8') + + return [{ + 'contents': contents, + 'highlight_groups': (['time'] if istime else []) + ['date'], + 'divider_highlight_group': 'time:divider' if istime else None, + }] + + +UNICODE_TEXT_TRANSLATION = { + ord('\''): '’', + ord('-'): '‐', +} + + +def fuzzy_time(pl, unicode_text=False): + '''Display the current time as fuzzy time, e.g. "quarter past six". + + :param bool unicode_text: + If true then hyphenminuses (regular ASCII ``-``) and single quotes are + replaced with unicode dashes and apostrophes. + ''' + hour_str = ['twelve', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven'] + minute_str = { + 5: 'five past', + 10: 'ten past', + 15: 'quarter past', + 20: 'twenty past', + 25: 'twenty-five past', + 30: 'half past', + 35: 'twenty-five to', + 40: 'twenty to', + 45: 'quarter to', + 50: 'ten to', + 55: 'five to', + } + special_case_str = { + (23, 58): 'round about midnight', + (23, 59): 'round about midnight', + (0, 0): 'midnight', + (0, 1): 'round about midnight', + (0, 2): 'round about midnight', + (12, 0): 'noon', + } + + now = datetime.now() + + try: + return special_case_str[(now.hour, now.minute)] + except KeyError: + pass + + hour = now.hour + if now.minute > 32: + if hour == 23: + hour = 0 + else: + hour += 1 + if hour > 11: + hour = hour - 12 + hour = hour_str[hour] + + minute = int(round(now.minute / 5.0) * 5) + if minute == 60 or minute == 0: + result = ' '.join([hour, 'o\'clock']) + else: + minute = minute_str[minute] + result = ' '.join([minute, hour]) + + if unicode_text: + result = result.translate(UNICODE_TEXT_TRANSLATION) + + return result diff --git a/powerline-bin/powerline/segments/common/vcs.py b/powerline-bin/powerline/segments/common/vcs.py new file mode 100644 index 0000000..07679ae --- /dev/null +++ b/powerline-bin/powerline/segments/common/vcs.py @@ -0,0 +1,89 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.lib.vcs import guess, tree_status +from powerline.segments import Segment, with_docstring +from powerline.theme import requires_segment_info, requires_filesystem_watcher + + +@requires_filesystem_watcher +@requires_segment_info +class BranchSegment(Segment): + divider_highlight_group = None + + @staticmethod + def get_directory(segment_info): + return segment_info['getcwd']() + + def __call__(self, pl, segment_info, create_watcher, status_colors=False, ignore_statuses=()): + name = self.get_directory(segment_info) + if name: + repo = guess(path=name, create_watcher=create_watcher) + if repo is not None: + branch = repo.branch() + scol = ['branch'] + if status_colors: + try: + status = tree_status(repo, pl) + except Exception as e: + pl.exception('Failed to compute tree status: {0}', str(e)) + status = '?' + else: + status = status and status.strip() + if status in ignore_statuses: + status = None + scol.insert(0, 'branch_dirty' if status else 'branch_clean') + return [{ + 'contents': branch, + 'highlight_groups': scol, + 'divider_highlight_group': self.divider_highlight_group, + }] + + +branch = with_docstring(BranchSegment(), +'''Return the current VCS branch. + +:param bool status_colors: + Determines whether repository status will be used to determine highlighting. + Default: False. +:param list ignore_statuses: + List of statuses which will not result in repo being marked as dirty. Most + useful is setting this option to ``["U"]``: this will ignore repository + which has just untracked files (i.e. repository with modified, deleted or + removed files will be marked as dirty, while just untracked files will make + segment show clean repository). Only applicable if ``status_colors`` option + is True. + +Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``. +''') + + +@requires_filesystem_watcher +@requires_segment_info +class StashSegment(Segment): + divider_highlight_group = None + + @staticmethod + def get_directory(segment_info): + return segment_info['getcwd']() + + def __call__(self, pl, segment_info, create_watcher): + name = self.get_directory(segment_info) + if name: + repo = guess(path=name, create_watcher=create_watcher) + if repo is not None: + stash = getattr(repo, 'stash', None) + if stash: + stashes = stash() + if stashes: + return [{ + 'contents': str(stashes), + 'highlight_groups': ['stash'], + 'divider_highlight_group': self.divider_highlight_group + }] + +stash = with_docstring(StashSegment(), +'''Return the number of current VCS stash entries, if any. + +Highlight groups used: ``stash``. +''') diff --git a/powerline-bin/powerline/segments/common/wthr.py b/powerline-bin/powerline/segments/common/wthr.py new file mode 100644 index 0000000..1c6d080 --- /dev/null +++ b/powerline-bin/powerline/segments/common/wthr.py @@ -0,0 +1,235 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import json + +from powerline.lib.url import urllib_read, urllib_urlencode +from powerline.lib.threaded import KwThreadedSegment +from powerline.segments import with_docstring + + +# XXX Warning: module name must not be equal to the segment name as long as this +# segment is imported into powerline.segments.common module. + + +# Weather condition code descriptions available at +# http://developer.yahoo.com/weather/#codes +weather_conditions_codes = ( + ('tornado', 'stormy'), # 0 + ('tropical_storm', 'stormy'), # 1 + ('hurricane', 'stormy'), # 2 + ('severe_thunderstorms', 'stormy'), # 3 + ('thunderstorms', 'stormy'), # 4 + ('mixed_rain_and_snow', 'rainy' ), # 5 + ('mixed_rain_and_sleet', 'rainy' ), # 6 + ('mixed_snow_and_sleet', 'snowy' ), # 7 + ('freezing_drizzle', 'rainy' ), # 8 + ('drizzle', 'rainy' ), # 9 + ('freezing_rain', 'rainy' ), # 10 + ('showers', 'rainy' ), # 11 + ('showers', 'rainy' ), # 12 + ('snow_flurries', 'snowy' ), # 13 + ('light_snow_showers', 'snowy' ), # 14 + ('blowing_snow', 'snowy' ), # 15 + ('snow', 'snowy' ), # 16 + ('hail', 'snowy' ), # 17 + ('sleet', 'snowy' ), # 18 + ('dust', 'foggy' ), # 19 + ('fog', 'foggy' ), # 20 + ('haze', 'foggy' ), # 21 + ('smoky', 'foggy' ), # 22 + ('blustery', 'windy' ), # 23 + ('windy', ), # 24 + ('cold', 'day' ), # 25 + ('clouds', 'cloudy'), # 26 + ('mostly_cloudy_night', 'cloudy'), # 27 + ('mostly_cloudy_day', 'cloudy'), # 28 + ('partly_cloudy_night', 'cloudy'), # 29 + ('partly_cloudy_day', 'cloudy'), # 30 + ('clear_night', 'night' ), # 31 + ('sun', 'sunny' ), # 32 + ('fair_night', 'night' ), # 33 + ('fair_day', 'day' ), # 34 + ('mixed_rain_and_hail', 'rainy' ), # 35 + ('hot', 'sunny' ), # 36 + ('isolated_thunderstorms', 'stormy'), # 37 + ('scattered_thunderstorms', 'stormy'), # 38 + ('scattered_thunderstorms', 'stormy'), # 39 + ('scattered_showers', 'rainy' ), # 40 + ('heavy_snow', 'snowy' ), # 41 + ('scattered_snow_showers', 'snowy' ), # 42 + ('heavy_snow', 'snowy' ), # 43 + ('partly_cloudy', 'cloudy'), # 44 + ('thundershowers', 'rainy' ), # 45 + ('snow_showers', 'snowy' ), # 46 + ('isolated_thundershowers', 'rainy' ), # 47 +) +# ('day', (25, 34)), +# ('rainy', (5, 6, 8, 9, 10, 11, 12, 35, 40, 45, 47)), +# ('cloudy', (26, 27, 28, 29, 30, 44)), +# ('snowy', (7, 13, 14, 15, 16, 17, 18, 41, 42, 43, 46)), +# ('stormy', (0, 1, 2, 3, 4, 37, 38, 39)), +# ('foggy', (19, 20, 21, 22, 23)), +# ('sunny', (32, 36)), +# ('night', (31, 33))): +weather_conditions_icons = { + 'day': 'DAY', + 'blustery': 'WIND', + 'rainy': 'RAIN', + 'cloudy': 'CLOUDS', + 'snowy': 'SNOW', + 'stormy': 'STORM', + 'foggy': 'FOG', + 'sunny': 'SUN', + 'night': 'NIGHT', + 'windy': 'WINDY', + 'not_available': 'NA', + 'unknown': 'UKN', +} + +temp_conversions = { + 'C': lambda temp: temp, + 'F': lambda temp: (temp * 9 / 5) + 32, + 'K': lambda temp: temp + 273.15, +} + +# Note: there are also unicode characters for units: ℃, ℉ and K +temp_units = { + 'C': '°C', + 'F': '°F', + 'K': 'K', +} + + +class WeatherSegment(KwThreadedSegment): + interval = 600 + default_location = None + location_urls = {} + + @staticmethod + def key(location_query=None, **kwargs): + return location_query + + def get_request_url(self, location_query): + try: + return self.location_urls[location_query] + except KeyError: + if location_query is None: + location_data = json.loads(urllib_read('http://geoip.nekudo.com/api/')) + location = ','.join(( + location_data['city'], + location_data['country']['name'], + location_data['country']['code'] + )) + self.info('Location returned by nekudo is {0}', location) + else: + location = location_query + query_data = { + 'q': + 'use "https://raw.githubusercontent.com/yql/yql-tables/master/weather/weather.bylocation.xml" as we;' + 'select * from weather.forecast where woeid in' + ' (select woeid from geo.places(1) where text="{0}") and u="c"'.format(location).encode('utf-8'), + 'format': 'json', + } + self.location_urls[location_query] = url = ( + 'http://query.yahooapis.com/v1/public/yql?' + urllib_urlencode(query_data)) + return url + + def compute_state(self, location_query): + url = self.get_request_url(location_query) + raw_response = urllib_read(url) + if not raw_response: + self.error('Failed to get response') + return None + + response = json.loads(raw_response) + try: + condition = response['query']['results']['channel']['item']['condition'] + condition_code = int(condition['code']) + temp = float(condition['temp']) + except (KeyError, ValueError): + self.exception('Yahoo returned malformed or unexpected response: {0}', repr(raw_response)) + return None + + try: + icon_names = weather_conditions_codes[condition_code] + except IndexError: + if condition_code == 3200: + icon_names = ('not_available',) + self.warn('Weather is not available for location {0}', self.location) + else: + icon_names = ('unknown',) + self.error('Unknown condition code: {0}', condition_code) + + return (temp, icon_names) + + def render_one(self, weather, icons=None, unit='C', temp_format=None, temp_coldest=-30, temp_hottest=40, **kwargs): + if not weather: + return None + + temp, icon_names = weather + + for icon_name in icon_names: + if icons: + if icon_name in icons: + icon = icons[icon_name] + break + else: + icon = weather_conditions_icons[icon_names[-1]] + + temp_format = temp_format or ('{temp:.0f}' + temp_units[unit]) + converted_temp = temp_conversions[unit](temp) + if temp <= temp_coldest: + gradient_level = 0 + elif temp >= temp_hottest: + gradient_level = 100 + else: + gradient_level = (temp - temp_coldest) * 100.0 / (temp_hottest - temp_coldest) + groups = ['weather_condition_' + icon_name for icon_name in icon_names] + ['weather_conditions', 'weather'] + return [ + { + 'contents': icon + ' ', + 'highlight_groups': groups, + 'divider_highlight_group': 'background:divider', + }, + { + 'contents': temp_format.format(temp=converted_temp), + 'highlight_groups': ['weather_temp_gradient', 'weather_temp', 'weather'], + 'divider_highlight_group': 'background:divider', + 'gradient_level': gradient_level, + }, + ] + + +weather = with_docstring(WeatherSegment(), +'''Return weather from Yahoo! Weather. + +Uses GeoIP lookup from http://geoip.nekudo.com to automatically determine +your current location. This should be changed if you’re in a VPN or if your +IP address is registered at another location. + +Returns a list of colorized icon and temperature segments depending on +weather conditions. + +:param str unit: + temperature unit, can be one of ``F``, ``C`` or ``K`` +:param str location_query: + location query for your current location, e.g. ``oslo, norway`` +:param dict icons: + dict for overriding default icons, e.g. ``{'heavy_snow' : u'❆'}`` +:param str temp_format: + format string, receives ``temp`` as an argument. Should also hold unit. +:param float temp_coldest: + coldest temperature. Any temperature below it will have gradient level equal + to zero. +:param float temp_hottest: + hottest temperature. Any temperature above it will have gradient level equal + to 100. Temperatures between ``temp_coldest`` and ``temp_hottest`` receive + gradient level that indicates relative position in this interval + (``100 * (cur-coldest) / (hottest-coldest)``). + +Divider highlight group used: ``background:divider``. + +Highlight groups used: ``weather_conditions`` or ``weather``, ``weather_temp_gradient`` (gradient) or ``weather``. +Also uses ``weather_conditions_{condition}`` for all weather conditions supported by Yahoo. +''') diff --git a/powerline-bin/powerline/segments/i3wm.py b/powerline-bin/powerline/segments/i3wm.py new file mode 100644 index 0000000..3f508ee --- /dev/null +++ b/powerline-bin/powerline/segments/i3wm.py @@ -0,0 +1,155 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import re + +from powerline.theme import requires_segment_info +from powerline.bindings.wm import get_i3_connection + + +WORKSPACE_REGEX = re.compile(r'^[0-9]+: ?') + + +def workspace_groups(w): + group = [] + if w['focused']: + group.append('w_focused') + if w['urgent']: + group.append('w_urgent') + if w['visible']: + group.append('w_visible') + group.append('workspace') + return group + + +def format_name(name, strip=False): + if strip: + return WORKSPACE_REGEX.sub('', name, count=1) + return name + + +@requires_segment_info +def workspaces(pl, segment_info, only_show=None, output=None, strip=0): + '''Return list of used workspaces + + :param list only_show: + Specifies which workspaces to show. Valid entries are ``"visible"``, + ``"urgent"`` and ``"focused"``. If omitted or ``null`` all workspaces + are shown. + + :param str output: + May be set to the name of an X output. If specified, only workspaces + on that output are shown. Overrides automatic output detection by + the lemonbar renderer and bindings. + + :param int strip: + Specifies how many characters from the front of each workspace name + should be stripped (e.g. to remove workspace numbers). Defaults to zero. + + Highlight groups used: ``workspace`` or ``w_visible``, ``workspace`` or ``w_focused``, ``workspace`` or ``w_urgent``. + ''' + output = output or segment_info.get('output') + + return [ + { + 'contents': w['name'][strip:], + 'highlight_groups': workspace_groups(w) + } + for w in get_i3_connection().get_workspaces() + if ((not only_show or any(w[typ] for typ in only_show)) + and (not output or w['output'] == output)) + ] + + +@requires_segment_info +def workspace(pl, segment_info, workspace=None, strip=False): + '''Return the specified workspace name + + :param str workspace: + Specifies which workspace to show. If unspecified, may be set by the + ``list_workspaces`` lister if used, otherwise falls back to + currently focused workspace. + + :param bool strip: + Specifies whether workspace numbers (in the ``1: name`` format) should + be stripped from workspace names before being displayed. Defaults to false. + + Highlight groups used: ``workspace`` or ``w_visible``, ``workspace`` or ``w_focused``, ``workspace`` or ``w_urgent``. + ''' + if workspace: + try: + w = next(( + w for w in get_i3_connection().get_workspaces() + if w['name'] == workspace + )) + except StopIteration: + return None + elif segment_info.get('workspace'): + w = segment_info['workspace'] + else: + try: + w = next(( + w for w in get_i3_connection().get_workspaces() + if w['focused'] + )) + except StopIteration: + return None + + return [{ + 'contents': format_name(w['name'], strip=strip), + 'highlight_groups': workspace_groups(w) + }] + + +@requires_segment_info +def mode(pl, segment_info, names={'default': None}): + '''Returns current i3 mode + + :param dict names: + Specifies the string to show for various modes. + Use ``null`` to hide a mode (``default`` is hidden by default). + + Highligh groups used: ``mode`` + ''' + mode = segment_info['mode'] + if mode in names: + return names[mode] + return mode + + +def scratchpad_groups(w): + group = [] + if w.urgent: + group.append('scratchpad:urgent') + if w.nodes[0].focused: + group.append('scratchpad:focused') + if w.workspace().name != '__i3_scratch': + group.append('scratchpad:visible') + group.append('scratchpad') + return group + + +SCRATCHPAD_ICONS = { + 'fresh': 'O', + 'changed': 'X', +} + + +def scratchpad(pl, icons=SCRATCHPAD_ICONS): + '''Returns the windows currently on the scratchpad + + :param dict icons: + Specifies the strings to show for the different scratchpad window states. Must + contain the keys ``fresh`` and ``changed``. + + Highlight groups used: ``scratchpad`` or ``scratchpad:visible``, ``scratchpad`` or ``scratchpad:focused``, ``scratchpad`` or ``scratchpad:urgent``. + ''' + + return [ + { + 'contents': icons.get(w.scratchpad_state, icons['changed']), + 'highlight_groups': scratchpad_groups(w) + } + for w in get_i3_connection().get_tree().descendents() + if w.scratchpad_state != 'none' + ] diff --git a/powerline-bin/powerline/segments/ipython.py b/powerline-bin/powerline/segments/ipython.py new file mode 100644 index 0000000..622e0a5 --- /dev/null +++ b/powerline-bin/powerline/segments/ipython.py @@ -0,0 +1,9 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.theme import requires_segment_info + + +@requires_segment_info +def prompt_count(pl, segment_info): + return str(segment_info['ipython'].prompt_count) diff --git a/powerline-bin/powerline/segments/pdb.py b/powerline-bin/powerline/segments/pdb.py new file mode 100644 index 0000000..bd6a38b --- /dev/null +++ b/powerline-bin/powerline/segments/pdb.py @@ -0,0 +1,61 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os + +from powerline.theme import requires_segment_info + + +@requires_segment_info +def current_line(pl, segment_info): + '''Displays line number that is next to be run + ''' + return str(segment_info['curframe'].f_lineno) + + +@requires_segment_info +def current_file(pl, segment_info, basename=True): + '''Displays current file name + + :param bool basename: + If true only basename is displayed. + ''' + filename = segment_info['curframe'].f_code.co_filename + if basename: + filename = os.path.basename(filename) + return filename + + +@requires_segment_info +def current_code_name(pl, segment_info): + '''Displays name of the code object of the current frame + ''' + return segment_info['curframe'].f_code.co_name + + +@requires_segment_info +def current_context(pl, segment_info): + '''Displays currently executed context name + + This is similar to :py:func:`current_code_name`, but gives more details. + + Currently it only gives module file name if code_name happens to be + ````. + ''' + name = segment_info['curframe'].f_code.co_name + if name == '': + name = os.path.basename(segment_info['curframe'].f_code.co_filename) + return name + + +@requires_segment_info +def stack_depth(pl, segment_info, full_stack=False): + '''Displays current stack depth + + Result is relative to the stack depth at the time prompt was first run. + + :param bool full_stack: + If true then absolute depth is used. + ''' + return str(len(segment_info['pdb'].stack) - ( + 0 if full_stack else segment_info['initial_stack_length'])) diff --git a/powerline-bin/powerline/segments/shell.py b/powerline-bin/powerline/segments/shell.py new file mode 100644 index 0000000..a9e9609 --- /dev/null +++ b/powerline-bin/powerline/segments/shell.py @@ -0,0 +1,174 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.theme import requires_segment_info +from powerline.segments import with_docstring +from powerline.segments.common.env import CwdSegment +from powerline.lib.unicode import out_u + + +@requires_segment_info +def jobnum(pl, segment_info, show_zero=False): + '''Return the number of jobs. + + :param bool show_zero: + If False (default) shows nothing if there are no jobs. Otherwise shows + zero for no jobs. + ''' + jobnum = segment_info['args'].jobnum + if jobnum is None or (not show_zero and jobnum == 0): + return None + else: + return str(jobnum) + + +@requires_segment_info +def last_status(pl, segment_info): + '''Return last exit code. + + Highlight groups used: ``exit_fail`` + ''' + if not segment_info['args'].last_exit_code: + return None + return [{'contents': str(segment_info['args'].last_exit_code), 'highlight_groups': ['exit_fail']}] + + +@requires_segment_info +def last_pipe_status(pl, segment_info): + '''Return last pipe status. + + Highlight groups used: ``exit_fail``, ``exit_success`` + ''' + last_pipe_status = ( + segment_info['args'].last_pipe_status + or (segment_info['args'].last_exit_code,) + ) + if any(last_pipe_status): + return [ + { + 'contents': str(status), + 'highlight_groups': ['exit_fail' if status else 'exit_success'], + 'draw_inner_divider': True + } + for status in last_pipe_status + ] + else: + return None + + +@requires_segment_info +def mode(pl, segment_info, override={'vicmd': 'COMMND', 'viins': 'INSERT'}, default=None): + '''Return the current mode. + + :param dict override: + dict for overriding mode strings. + :param str default: + If current mode is equal to this string then this segment will not get + displayed. If not specified the value is taken from + ``$POWERLINE_DEFAULT_MODE`` variable. This variable is set by zsh + bindings for any mode that does not start from ``vi``. + ''' + mode = segment_info.get('mode', None) + if not mode: + pl.debug('No mode specified') + return None + default = default or segment_info.get('default_mode', None) + if mode == default: + return None + try: + return override[mode] + except KeyError: + # Note: with zsh line editor you can emulate as much modes as you wish. + # Thus having unknown mode is not an error: maybe just some developer + # added support for his own zle widgets. As there is no built-in mode() + # function like in VimL and mode is likely be defined by our code or by + # somebody knowing what he is doing there is absolutely no need in + # keeping translations dictionary. + return mode.upper() + + +@requires_segment_info +def continuation(pl, segment_info, omit_cmdsubst=True, right_align=False, renames={}): + '''Display parser state. + + :param bool omit_cmdsubst: + Do not display cmdsubst parser state if it is the last one. + :param bool right_align: + Align to the right. + :param dict renames: + Rename states: ``{old_name : new_name}``. If ``new_name`` is ``None`` + then given state is not displayed. + + Highlight groups used: ``continuation``, ``continuation:current``. + ''' + if not segment_info.get('parser_state'): + return [{ + 'contents': '', + 'width': 'auto', + 'highlight_groups': ['continuation:current', 'continuation'], + }] + ret = [] + + for state in segment_info['parser_state'].split(): + state = renames.get(state, state) + if state: + ret.append({ + 'contents': state, + 'highlight_groups': ['continuation'], + 'draw_inner_divider': True, + }) + + if omit_cmdsubst and ret[-1]['contents'] == 'cmdsubst': + ret.pop(-1) + + if not ret: + ret.append({ + 'contents': '' + }) + + if right_align: + ret[0].update(width='auto', align='r') + ret[-1]['highlight_groups'] = ['continuation:current', 'continuation'] + else: + ret[-1].update(width='auto', align='l', highlight_groups=['continuation:current', 'continuation']) + + return ret + + +@requires_segment_info +class ShellCwdSegment(CwdSegment): + def get_shortened_path(self, pl, segment_info, use_shortened_path=True, **kwargs): + if use_shortened_path: + try: + return out_u(segment_info['shortened_path']) + except KeyError: + pass + return super(ShellCwdSegment, self).get_shortened_path(pl, segment_info, **kwargs) + + +cwd = with_docstring(ShellCwdSegment(), +'''Return the current working directory. + +Returns a segment list to create a breadcrumb-like effect. + +:param int dir_shorten_len: + shorten parent directory names to this length (e.g. + :file:`/long/path/to/powerline` → :file:`/l/p/t/powerline`) +:param int dir_limit_depth: + limit directory depth to this number (e.g. + :file:`/long/path/to/powerline` → :file:`⋯/to/powerline`) +:param bool use_path_separator: + Use path separator in place of soft divider. +:param bool use_shortened_path: + Use path from shortened_path ``--renderer-arg`` argument. If this argument + is present ``shorten_home`` argument is ignored. +:param bool shorten_home: + Shorten home directory to ``~``. +:param str ellipsis: + Specifies what to use in place of omitted directories. Use None to not + show this subsegment at all. + +Divider highlight group used: ``cwd:divider``. + +Highlight groups used: ``cwd:current_folder`` or ``cwd``. It is recommended to define all highlight groups. +''') diff --git a/powerline-bin/powerline/segments/tmux.py b/powerline-bin/powerline/segments/tmux.py new file mode 100644 index 0000000..1f34389 --- /dev/null +++ b/powerline-bin/powerline/segments/tmux.py @@ -0,0 +1,22 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.bindings.tmux import get_tmux_output + + +def attached_clients(pl, minimum=1): + '''Return the number of tmux clients attached to the currently active session + + :param int minimum: + The minimum number of attached clients that must be present for this + segment to be visible. + ''' + session_output = get_tmux_output(pl, 'list-panes', '-F', '#{session_name}') + if not session_output: + return None + session_name = session_output.rstrip().split('\n')[0] + + attached_clients_output = get_tmux_output(pl, 'list-clients', '-t', session_name) + attached_count = len(attached_clients_output.rstrip().split('\n')) + + return None if attached_count < minimum else str(attached_count) diff --git a/powerline-bin/powerline/segments/vim/__init__.py b/powerline-bin/powerline/segments/vim/__init__.py new file mode 100644 index 0000000..b637961 --- /dev/null +++ b/powerline-bin/powerline/segments/vim/__init__.py @@ -0,0 +1,793 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import os +import re +import csv +import sys + +from collections import defaultdict + +try: + import vim +except ImportError: + vim = object() + +from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption, + buffer_name, vim_getwinvar, + register_buffer_cache, current_tabpage, + list_tabpage_buffers_segment_info) +from powerline.theme import requires_segment_info, requires_filesystem_watcher +from powerline.lib import add_divider_highlight_group +from powerline.lib.vcs import guess +from powerline.lib.humanize_bytes import humanize_bytes +from powerline.lib import wraps_saveargs as wraps +from powerline.segments.common.vcs import BranchSegment, StashSegment +from powerline.segments import with_docstring +from powerline.lib.unicode import string, unicode + +try: + from __builtin__ import xrange as range +except ImportError: + pass + + +vim_funcs = { + 'virtcol': vim_get_func('virtcol', rettype='int'), + 'getpos': vim_get_func('getpos'), + 'fnamemodify': vim_get_func('fnamemodify', rettype='bytes'), + 'line2byte': vim_get_func('line2byte', rettype='int'), + 'line': vim_get_func('line', rettype='int'), +} + +vim_modes = { + 'n': 'NORMAL', + 'no': 'N-OPER', + 'v': 'VISUAL', + 'V': 'V-LINE', + '^V': 'V-BLCK', + 's': 'SELECT', + 'S': 'S-LINE', + '^S': 'S-BLCK', + 'i': 'INSERT', + 'ic': 'I-COMP', + 'ix': 'I-C_X ', + 'R': 'RPLACE', + 'Rv': 'V-RPLC', + 'Rc': 'R-COMP', + 'Rx': 'R-C_X ', + 'c': 'COMMND', + 'cv': 'VIM-EX', + 'ce': 'NRM-EX', + 'r': 'PROMPT', + 'rm': '-MORE-', + 'r?': 'CNFIRM', + '!': '!SHELL', + 't': 'TERM ', +} + + +# TODO Remove cache when needed +def window_cached(func): + cache = {} + + @requires_segment_info + @wraps(func) + def ret(segment_info, **kwargs): + window_id = segment_info['window_id'] + if segment_info['mode'] == 'nc': + return cache.get(window_id) + else: + if getattr(func, 'powerline_requires_segment_info', False): + r = func(segment_info=segment_info, **kwargs) + else: + r = func(**kwargs) + cache[window_id] = r + return r + + return ret + + +@requires_segment_info +def mode(pl, segment_info, override=None): + '''Return the current vim mode. + + If mode (returned by ``mode()`` VimL function, see ``:h mode()`` in Vim) + consists of multiple characters and necessary mode is not known to powerline + then it will fall back to mode with last character(s) ignored. + + :param dict override: + dict for overriding default mode strings, e.g. ``{ 'n': 'NORM' }`` + ''' + mode = segment_info['mode'] + if mode == 'nc': + return None + while mode: + try: + if not override: + return vim_modes[mode] + try: + return override[mode] + except KeyError: + return vim_modes[mode] + except KeyError: + mode = mode[:-1] + return 'BUG' + + +@window_cached +@requires_segment_info +def visual_range(pl, segment_info, CTRL_V_text='{rows} x {vcols}', v_text_oneline='C:{vcols}', v_text_multiline='L:{rows}', V_text='L:{rows}'): + '''Return the current visual selection range. + + :param str CTRL_V_text: + Text to display when in block visual or select mode. + :param str v_text_oneline: + Text to display when in charaterwise visual or select mode, assuming + selection occupies only one line. + :param str v_text_multiline: + Text to display when in charaterwise visual or select mode, assuming + selection occupies more then one line. + :param str V_text: + Text to display when in linewise visual or select mode. + + All texts are format strings which are passed the following parameters: + + ========= ============================================================= + Parameter Description + ========= ============================================================= + sline Line number of the first line of the selection + eline Line number of the last line of the selection + scol Column number of the first character of the selection + ecol Column number of the last character of the selection + svcol Virtual column number of the first character of the selection + secol Virtual column number of the last character of the selection + rows Number of lines in the selection + cols Number of columns in the selection + vcols Number of virtual columns in the selection + ========= ============================================================= + ''' + sline, scol, soff = [int(v) for v in vim_funcs['getpos']('v')[1:]] + eline, ecol, eoff = [int(v) for v in vim_funcs['getpos']('.')[1:]] + svcol = vim_funcs['virtcol']([sline, scol, soff]) + evcol = vim_funcs['virtcol']([eline, ecol, eoff]) + rows = abs(eline - sline) + 1 + cols = abs(ecol - scol) + 1 + vcols = abs(evcol - svcol) + 1 + return { + '^': CTRL_V_text, + 's': v_text_oneline if rows == 1 else v_text_multiline, + 'S': V_text, + 'v': v_text_oneline if rows == 1 else v_text_multiline, + 'V': V_text, + }.get(segment_info['mode'][0], '').format( + sline=sline, eline=eline, + scol=scol, ecol=ecol, + svcol=svcol, evcol=evcol, + rows=rows, cols=cols, vcols=vcols, + ) + + +@requires_segment_info +def modified_indicator(pl, segment_info, text='+'): + '''Return a file modified indicator. + + :param string text: + text to display if the current buffer is modified + ''' + return text if int(vim_getbufoption(segment_info, 'modified')) else None + + +@requires_segment_info +def tab_modified_indicator(pl, segment_info, text='+'): + '''Return a file modified indicator for tabpages. + + :param string text: + text to display if any buffer in the current tab is modified + + Highlight groups used: ``tab_modified_indicator`` or ``modified_indicator``. + ''' + for buf_segment_info in list_tabpage_buffers_segment_info(segment_info): + if int(vim_getbufoption(buf_segment_info, 'modified')): + return [{ + 'contents': text, + 'highlight_groups': ['tab_modified_indicator', 'modified_indicator'], + }] + return None + + +@requires_segment_info +def paste_indicator(pl, segment_info, text='PASTE'): + '''Return a paste mode indicator. + + :param string text: + text to display if paste mode is enabled + ''' + return text if int(vim.eval('&paste')) else None + + +@requires_segment_info +def readonly_indicator(pl, segment_info, text='RO'): + '''Return a read-only indicator. + + :param string text: + text to display if the current buffer is read-only + ''' + return text if int(vim_getbufoption(segment_info, 'readonly')) else None + + +SCHEME_RE = re.compile(b'^\\w[\\w\\d+\\-.]*(?=:)') + + +@requires_segment_info +def file_scheme(pl, segment_info): + '''Return the protocol part of the file. + + Protocol is the part of the full filename just before the colon which + starts with a latin letter and contains only latin letters, digits, plus, + period or hyphen (refer to `RFC3986 + `_ for the description of + URI scheme). If there is no such a thing ``None`` is returned, effectively + removing segment. + + .. note:: + Segment will not check whether there is ``//`` just after the + colon or if there is at least one slash after the scheme. Reason: it is + not always present. E.g. when opening file inside a zip archive file + name will look like :file:`zipfile:/path/to/archive.zip::file.txt`. + ``file_scheme`` segment will catch ``zipfile`` part here. + ''' + name = buffer_name(segment_info) + if not name: + return None + match = SCHEME_RE.match(name) + if match: + return match.group(0).decode('ascii') + + +@requires_segment_info +def file_directory(pl, segment_info, remove_scheme=True, shorten_user=True, shorten_cwd=True, shorten_home=False): + '''Return file directory (head component of the file path). + + :param bool remove_scheme: + Remove scheme part from the segment name, if present. See documentation + of file_scheme segment for the description of what scheme is. Also + removes the colon. + + :param bool shorten_user: + Shorten ``$HOME`` directory to :file:`~/`. Does not work for files with + scheme. + + :param bool shorten_cwd: + Shorten current directory to :file:`./`. Does not work for files with + scheme present. + + :param bool shorten_home: + Shorten all directories in :file:`/home/` to :file:`~user/` instead of + :file:`/home/user/`. Does not work for files with scheme present. + ''' + name = buffer_name(segment_info) + if not name: + return None + match = SCHEME_RE.match(name) + if match: + if remove_scheme: + name = name[len(match.group(0)) + 1:] # Remove scheme and colon + file_directory = vim_funcs['fnamemodify'](name, ':h') + else: + file_directory = vim_funcs['fnamemodify']( + name, + (':~' if shorten_user else '') + (':.' if shorten_cwd else '') + ':h' + ) + if not file_directory: + return None + if shorten_home and file_directory.startswith('/home/'): + file_directory = b'~' + file_directory[6:] + file_directory = file_directory.decode(segment_info['encoding'], 'powerline_vim_strtrans_error') + return file_directory + os.sep + + +@requires_segment_info +def file_name(pl, segment_info, display_no_file=False, no_file_text='[No file]'): + '''Return file name (tail component of the file path). + + :param bool display_no_file: + display a string if the buffer is missing a file name + :param str no_file_text: + the string to display if the buffer is missing a file name + + Highlight groups used: ``file_name_no_file`` or ``file_name``, ``file_name``. + ''' + name = buffer_name(segment_info) + if not name: + if display_no_file: + return [{ + 'contents': no_file_text, + 'highlight_groups': ['file_name_no_file', 'file_name'], + }] + else: + return None + return os.path.basename(name).decode(segment_info['encoding'], 'powerline_vim_strtrans_error') + + +@window_cached +def file_size(pl, suffix='B', si_prefix=False): + '''Return file size in &encoding. + + :param str suffix: + string appended to the file size + :param bool si_prefix: + use SI prefix, e.g. MB instead of MiB + :return: file size or None if the file isn’t saved or if the size is too big to fit in a number + ''' + # Note: returns file size in &encoding, not in &fileencoding. But returned + # size is updated immediately; and it is valid for any buffer + file_size = vim_funcs['line2byte'](len(vim.current.buffer) + 1) - 1 + if file_size < 0: + file_size = 0 + return humanize_bytes(file_size, suffix, si_prefix) + + +@requires_segment_info +@add_divider_highlight_group('background:divider') +def file_format(pl, segment_info): + '''Return file format (i.e. line ending type). + + :return: file format or None if unknown or missing file format + + Divider highlight group used: ``background:divider``. + ''' + return vim_getbufoption(segment_info, 'fileformat') or None + + +@requires_segment_info +@add_divider_highlight_group('background:divider') +def file_encoding(pl, segment_info): + '''Return file encoding/character set. + + :return: file encoding/character set or None if unknown or missing file encoding + + Divider highlight group used: ``background:divider``. + ''' + return vim_getbufoption(segment_info, 'fileencoding') or None + + +@requires_segment_info +@add_divider_highlight_group('background:divider') +def file_type(pl, segment_info): + '''Return file type. + + :return: file type or None if unknown file type + + Divider highlight group used: ``background:divider``. + ''' + return vim_getbufoption(segment_info, 'filetype') or None + + +@requires_segment_info +def window_title(pl, segment_info): + '''Return the window title. + + This currently looks at the ``quickfix_title`` window variable, + which is used by Syntastic and Vim itself. + + It is used in the quickfix theme.''' + try: + return vim_getwinvar(segment_info, 'quickfix_title') + except KeyError: + return None + + +@requires_segment_info +def line_percent(pl, segment_info, gradient=False): + '''Return the cursor position in the file as a percentage. + + :param bool gradient: + highlight the percentage with a color gradient (by default a green to red gradient) + + Highlight groups used: ``line_percent_gradient`` (gradient), ``line_percent``. + ''' + line_current = segment_info['window'].cursor[0] + line_last = len(segment_info['buffer']) + percentage = line_current * 100.0 / line_last + if not gradient: + return str(int(round(percentage))) + return [{ + 'contents': str(int(round(percentage))), + 'highlight_groups': ['line_percent_gradient', 'line_percent'], + 'gradient_level': percentage, + }] + + +@window_cached +def position(pl, position_strings={'top': 'Top', 'bottom': 'Bot', 'all': 'All'}, gradient=False): + '''Return the position of the current view in the file as a percentage. + + :param dict position_strings: + dict for translation of the position strings, e.g. ``{"top":"Oben", "bottom":"Unten", "all":"Alles"}`` + + :param bool gradient: + highlight the percentage with a color gradient (by default a green to red gradient) + + Highlight groups used: ``position_gradient`` (gradient), ``position``. + ''' + line_last = len(vim.current.buffer) + + winline_first = vim_funcs['line']('w0') + winline_last = vim_funcs['line']('w$') + if winline_first == 1 and winline_last == line_last: + percentage = 0.0 + content = position_strings['all'] + elif winline_first == 1: + percentage = 0.0 + content = position_strings['top'] + elif winline_last == line_last: + percentage = 100.0 + content = position_strings['bottom'] + else: + percentage = winline_first * 100.0 / (line_last - winline_last + winline_first) + content = str(int(round(percentage))) + '%' + + if not gradient: + return content + return [{ + 'contents': content, + 'highlight_groups': ['position_gradient', 'position'], + 'gradient_level': percentage, + }] + + +@requires_segment_info +def line_current(pl, segment_info): + '''Return the current cursor line.''' + return str(segment_info['window'].cursor[0]) + + +@requires_segment_info +def line_count(pl, segment_info): + '''Return the line count of the current buffer.''' + return str(len(segment_info['buffer'])) + + +@requires_segment_info +def col_current(pl, segment_info): + '''Return the current cursor column. + ''' + return str(segment_info['window'].cursor[1] + 1) + + +@window_cached +def virtcol_current(pl, gradient=True): + '''Return current visual column with concealed characters ingored + + :param bool gradient: + Determines whether it should show textwidth-based gradient (gradient level is ``virtcol * 100 / textwidth``). + + Highlight groups used: ``virtcol_current_gradient`` (gradient), ``virtcol_current`` or ``col_current``. + ''' + col = vim_funcs['virtcol']('.') + r = [{'contents': str(col), 'highlight_groups': ['virtcol_current', 'col_current']}] + if gradient: + textwidth = int(getbufvar('%', '&textwidth')) + r[-1]['gradient_level'] = min(col * 100 / textwidth, 100) if textwidth else 0 + r[-1]['highlight_groups'].insert(0, 'virtcol_current_gradient') + return r + + +def modified_buffers(pl, text='+ ', join_str=','): + '''Return a comma-separated list of modified buffers. + + :param str text: + text to display before the modified buffer list + :param str join_str: + string to use for joining the modified buffer list + ''' + buffer_mod_text = join_str.join(( + str(buffer.number) + for buffer in vim.buffers + if int(vim_getbufoption({'buffer': buffer, 'bufnr': buffer.number}, 'modified')) + )) + if buffer_mod_text: + return text + buffer_mod_text + return None + + +@requires_filesystem_watcher +@requires_segment_info +class VimBranchSegment(BranchSegment): + divider_highlight_group = 'branch:divider' + + @staticmethod + def get_directory(segment_info): + if vim_getbufoption(segment_info, 'buftype'): + return None + return buffer_name(segment_info) + + +branch = with_docstring(VimBranchSegment(), +'''Return the current working branch. + +:param bool status_colors: + Determines whether repository status will be used to determine highlighting. + Default: False. +:param bool ignore_statuses: + List of statuses which will not result in repo being marked as dirty. Most + useful is setting this option to ``["U"]``: this will ignore repository + which has just untracked files (i.e. repository with modified, deleted or + removed files will be marked as dirty, while just untracked files will make + segment show clean repository). Only applicable if ``status_colors`` option + is True. + +Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``. + +Divider highlight group used: ``branch:divider``. +''') + + +@requires_filesystem_watcher +@requires_segment_info +class VimStashSegment(StashSegment): + divider_highlight_group = 'stash:divider' + + @staticmethod + def get_directory(segment_info): + if vim_getbufoption(segment_info, 'buftype'): + return None + return buffer_name(segment_info) + + +stash = with_docstring(VimStashSegment(), +'''Return the number of stashes in the current working branch. + +Highlight groups used: ``stash``. +''') + + +@requires_filesystem_watcher +@requires_segment_info +def file_vcs_status(pl, segment_info, create_watcher): + '''Return the VCS status for this buffer. + + Highlight groups used: ``file_vcs_status``. + ''' + name = buffer_name(segment_info) + skip = not (name and (not vim_getbufoption(segment_info, 'buftype'))) + if not skip: + repo = guess(path=name, create_watcher=create_watcher) + if repo is not None: + status = repo.status(os.path.relpath(name, repo.directory)) + if not status: + return None + status = status.strip() + ret = [] + for status in status: + ret.append({ + 'contents': status, + 'highlight_groups': ['file_vcs_status_' + status, 'file_vcs_status'], + }) + return ret + + +trailing_whitespace_cache = None + + +@requires_segment_info +def trailing_whitespace(pl, segment_info): + '''Return the line number for trailing whitespaces + + It is advised not to use this segment in insert mode: in Insert mode it will + iterate over all lines in buffer each time you happen to type a character + which may cause lags. It will also show you whitespace warning each time you + happen to type space. + + Highlight groups used: ``trailing_whitespace`` or ``warning``. + ''' + global trailing_whitespace_cache + if trailing_whitespace_cache is None: + trailing_whitespace_cache = register_buffer_cache(defaultdict(lambda: (0, None))) + bufnr = segment_info['bufnr'] + changedtick = getbufvar(bufnr, 'changedtick') + if trailing_whitespace_cache[bufnr][0] == changedtick: + return trailing_whitespace_cache[bufnr][1] + else: + buf = segment_info['buffer'] + bws = b' \t' + sws = str(' \t') # Ignore unicode_literals and use native str. + for i in range(len(buf)): + try: + line = buf[i] + except UnicodeDecodeError: # May happen in Python 3 + if hasattr(vim, 'bindeval'): + line = vim.bindeval('getbufline({0}, {1})'.format( + bufnr, i + 1)) + has_trailing_ws = (line[-1] in bws) + else: + line = vim.eval('strtrans(getbufline({0}, {1}))'.format( + bufnr, i + 1)) + has_trailing_ws = (line[-1] in bws) + else: + has_trailing_ws = (line and line[-1] in sws) + if has_trailing_ws: + break + if has_trailing_ws: + ret = [{ + 'contents': str(i + 1), + 'highlight_groups': ['trailing_whitespace', 'warning'], + }] + else: + ret = None + trailing_whitespace_cache[bufnr] = (changedtick, ret) + return ret + + +@requires_segment_info +def tabnr(pl, segment_info, show_current=True): + '''Show tabpage number + + :param bool show_current: + If False do not show current tabpage number. This is default because + tabnr is by default only present in tabline. + ''' + try: + tabnr = segment_info['tabnr'] + except KeyError: + return None + if show_current or tabnr != current_tabpage().number: + return str(tabnr) + + +@requires_segment_info +def bufnr(pl, segment_info, show_current=True): + '''Show buffer number + + :param bool show_current: + If False do not show current window number. + ''' + bufnr = segment_info['bufnr'] + if show_current or bufnr != vim.current.buffer.number: + return str(bufnr) + + +@requires_segment_info +def winnr(pl, segment_info, show_current=True): + '''Show window number + + :param bool show_current: + If False do not show current window number. + ''' + winnr = segment_info['winnr'] + if show_current or winnr != vim.current.window.number: + return str(winnr) + + +csv_cache = None +sniffer = csv.Sniffer() + + +def detect_text_csv_dialect(text, display_name, header_text=None): + return ( + sniffer.sniff(string(text)), + sniffer.has_header(string(header_text or text)) if display_name == 'auto' else display_name, + ) + + +CSV_SNIFF_LINES = 100 +CSV_PARSE_LINES = 10 + + +if sys.version_info < (2, 7): + def read_csv(l, dialect, fin=next): + try: + return fin(csv.reader(l, dialect)) + except csv.Error as e: + if str(e) == 'newline inside string' and dialect.quotechar: + # Maybe we are inside an unfinished quoted string. Python-2.6 + # does not handle this fine + return fin(csv.reader(l[:-1] + [l[-1] + dialect.quotechar])) + else: + raise +else: + def read_csv(l, dialect, fin=next): + return fin(csv.reader(l, dialect)) + + +def process_csv_buffer(pl, buffer, line, col, display_name): + global csv_cache + if csv_cache is None: + csv_cache = register_buffer_cache(defaultdict(lambda: (None, None, None))) + try: + cur_first_line = buffer[0] + except UnicodeDecodeError: + cur_first_line = vim.eval('strtrans(getline(1))') + dialect, has_header, first_line = csv_cache[buffer.number] + if dialect is None or (cur_first_line != first_line and display_name == 'auto'): + try: + text = '\n'.join(buffer[:CSV_SNIFF_LINES]) + except UnicodeDecodeError: # May happen in Python 3 + text = vim.eval('join(map(getline(1, {0}), "strtrans(v:val)"), "\\n")'.format(CSV_SNIFF_LINES)) + try: + dialect, has_header = detect_text_csv_dialect(text, display_name) + except csv.Error as e: + pl.warn('Failed to detect csv format: {0}', str(e)) + # Try detecting using three lines only: + if line == 1: + rng = (0, line + 2) + elif line == len(buffer): + rng = (line - 3, line) + else: + rng = (line - 2, line + 1) + try: + dialect, has_header = detect_text_csv_dialect( + '\n'.join(buffer[rng[0]:rng[1]]), + display_name, + header_text='\n'.join(buffer[:4]), + ) + except csv.Error as e: + pl.error('Failed to detect csv format: {0}', str(e)) + return None, None + if len(buffer) > 2: + csv_cache[buffer.number] = dialect, has_header, cur_first_line + column_number = len(read_csv( + buffer[max(0, line - CSV_PARSE_LINES):line - 1] + [buffer[line - 1][:col]], + dialect=dialect, + fin=list, + )[-1]) or 1 + if has_header: + try: + header = read_csv(buffer[0:1], dialect=dialect) + except UnicodeDecodeError: + header = read_csv([vim.eval('strtrans(getline(1))')], dialect=dialect) + column_name = header[column_number - 1] + else: + column_name = None + return unicode(column_number), column_name + + +@requires_segment_info +def csv_col_current(pl, segment_info, display_name='auto', name_format=' ({column_name:.15})'): + '''Display CSV column number and column name + + Requires filetype to be set to ``csv``. + + :param bool or str name: + May be ``True``, ``False`` and ``"auto"``. In the first case value from + the first raw will always be displayed. In the second case it will never + be displayed. In thi last case ``csv.Sniffer().has_header()`` will be + used to detect whether current file contains header in the first column. + :param str name_format: + String used to format column name (in case ``display_name`` is set to + ``True`` or ``"auto"``). Accepts ``column_name`` keyword argument. + + Highlight groups used: ``csv:column_number`` or ``csv``, ``csv:column_name`` or ``csv``. + ''' + if vim_getbufoption(segment_info, 'filetype') != 'csv': + return None + line, col = segment_info['window'].cursor + column_number, column_name = process_csv_buffer(pl, segment_info['buffer'], line, col, display_name) + if not column_number: + return None + return [{ + 'contents': column_number, + 'highlight_groups': ['csv:column_number', 'csv'], + }] + ([{ + 'contents': name_format.format(column_name=column_name), + 'highlight_groups': ['csv:column_name', 'csv'], + }] if column_name else []) + + +@requires_segment_info +def tab(pl, segment_info, end=False): + '''Mark start of the clickable region for tabpage + + :param bool end: + In place of starting region for the current tab end it. + + No highlight groups are used (literal segment). + ''' + try: + return [{ + 'contents': None, + 'literal_contents': (0, '%{tabnr}T'.format(tabnr=('' if end else segment_info['tabnr']))), + }] + except KeyError: + return None diff --git a/powerline-bin/powerline/segments/vim/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/segments/vim/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c116e59ab61f727ff1637e1af15a64842292940 GIT binary patch literal 31035 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 LcJa@)@d*Dn=pPSc literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/vim/plugin/__init__.py b/powerline-bin/powerline/segments/vim/plugin/__init__.py new file mode 100644 index 0000000..b2b9f10 --- /dev/null +++ b/powerline-bin/powerline/segments/vim/plugin/__init__.py @@ -0,0 +1,6 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) +from pkgutil import extend_path + + +__path__ = extend_path(__path__, __name__) diff --git a/powerline-bin/powerline/segments/vim/plugin/__pycache__/__init__.cpython-312.pyc b/powerline-bin/powerline/segments/vim/plugin/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c00b63341be897c37f03e7c46833013eeb5e2a08 GIT binary patch literal 397 zcmX|5Jx{|h5Veyu2`!;)Fd#7psh9;22=NbK>XgMwn`>%eJC@^=cH|#)V`WAB33djC zZb3{8hz-=O6AmCwx_9qB-rYS#Q5#u{o?k|fHojT^H}8)vPc6Ac8Okt60w-8Fi6h*^ z6<*@urta{T@Dm>+2Z0X(gb&WIHVI~K?0qyz?A4o0lnGU6Q*S8Eq@klq4vig%aovHb0hv*in(<}4R=26`no0wu+O-#S^RR9;;9IBz zb(L3!aUC>SNPmQsHcY0%s_xO!cF^jA7@>$_s%KK2gXtX|jt|uF^n`FWAZljDg(RxD z2F;lSQbI03nvzVIAc|KxlY~+xnW1!F%~s)=D6)#fx$fHS*m}8R;nT$!zoY&F^7fK6rTOFch`2-&YuGTx+s*|2y8$K5fP5D6v16geC3#NKqhyPaK= z#MqM4Rw}KcmP(c2&;v&h9H@j^jvOoX&=@0OhW6A$#Vrt!s+>CG*hxxD>62#X&Aj)% z_x8P+H$R6$G9VQC<g zNC{--OffH|B!=$srkoF?0t|ow-KPtmF*llkso)&j2cT~UKr#bZ0R3wc;S5;VF#~3~ zGhl{^`yW$_IFG{x%gER|Oq+%Wk!HGB)Q$6oYuFZ6v`N=C3m!}xdB;W`ZgY@fdFiQw zmGOweNSwiu^F}_MHSI~wOv72j^<1*qh2X~p13@?K!fYNA6T_OaGp*mIt|c-!GM0C< zGzA_*H!11NjV6z_c~ql8p3vf^Nits~oo(5)W|x`c{?cEfMWo^@d`TO9y#vne0-!9FBweOa>4A@80H9z=m}Oj+ z0VSy{l>B3@@dL+y0?cc4{fW+l{DK7V~xV|Q?xB<6A@B9a@JO<)j#ph!= zdq$nfK`#f9dSrM=&1tSWWfv@6)vP%cB4i_1wUIibAUxOE(^EFe zYu=zNN$)l|Dj=E!r6DKwiN70BsQDaegt9SqhH?|YZIwqEh>tlPpun_gU(UJP}eR*ogTypwbcXOE|$EcEsq=+EtS z24)W?O=B|Y%y~K6N;>uoL^Myy7EY4BflKfDwoC`)Z1q*Qty@=~3ZKTpml z>&m7Fidt3FYeTnoUVr~iX;D#Y%5c4>@9Owsbk7rk>)@XOjuW1UKnSiGZGNC^uPWQG zjo&(bJ$*N^sBEt(C+j`0U!7Zw?prrn5`h${ytYh|3F2&V>(J=vplVv`h4oWgR$~{) zxh==l;S zVVjTQ8XKFxpF&^d`DT z$!CdU80HUfss>Ii@f;I=!~~v;fa(7Y>|62yHu{v^$wZbp!abqfpGy%Sc02_P6MpCq beLDL|2L%YPxIu#T6(0lFf&<(S%mDWnU_4f1 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/vim/plugin/__pycache__/capslock.cpython-312.pyc b/powerline-bin/powerline/segments/vim/plugin/__pycache__/capslock.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63d7ab2d1ca165a1fbb8a06b01b68f3cd18957ab GIT binary patch literal 1220 zcmZWo&yU+g6rQo2tetGS*=>Q+(@6BtNNik$V8w!vP=!#XQdLSX%_W-HFUgd#$IOiL z1NBe=2M!2{)BX#fa^S>2!GV?N0bFt7fVeH)BB4F?O*YxB#K?Yr^W%N*o9{jU+-fxl zj@BADmsVxmBEFOhmI~tl3=`IX9I@F1awdUK zMLuSTByt1VvJA!UvYujAFWin*tTcd0kitqYmmP`Yvy4FQ8Vbo1a4;?&a~Kze*-RG+ z?-yM249RI`VQwAop2bov(G6;GO2(*>opBB9{PtKSycVQvxHzS7t_Ol}Eb|n)ji}nW zfr8ya!Fnh_X{5;E_Gg#=zj&?F@%084r}9zeDu5}M9l!DlS#7@94OQTX8dqP&*vZGS z&5F1X#jfRg40iYJwO@ zR^`{*n5u=Z>7aQ?o?Ri)<-^ObKMr?)i(1d>Wc$)V_-%OjYW%o;{j1=R?*EvgImW{T zdpfxB!JS^GRW%0K?6%Y}7-&acyS~&lXX?&0(NxWw%irZgt(C6oYIq+KTfKZnzdLlS z^0Db6{Zp~F&Ns1XGti*}bCka)ddK-~G$-MESp8DM`}zt_-H&2ELUZI(O8+8veO^{-Z-ig@0F)so4$MOqxX;V{yW+x;l-zf()RBgtuN-EUvvQN6SIj} Q-vrmlcbj|uPjt_J4z!J3^8f$< literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/vim/plugin/__pycache__/commandt.cpython-312.pyc b/powerline-bin/powerline/segments/vim/plugin/__pycache__/commandt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60f4b92616524630710d87f59428990007c67a6d GIT binary patch literal 3330 zcmbtWTW=dh6rS;}FT07Il!T;h0-B}~wozi2yXuxpxkL$~0Ts7ZEhKyG9ot*>#_T$c z14!W_Aq1k2yzmFA^2h_?7a;LKszhqp_Ms9&h_}#yg!06hUE3QsNn63lo}E2s=3Hja z_s#s2Ov(sa^5>iNmtgcOf9W={GuZk7245o;saQt_E@2~5iWovkFvOCGk;F9-Jz9#w zQ_vHJRFW`K#ZOU5R-?**8iUbb1kt1#zlsB!rIeZg=}2-noF6YJ6=N7mNZAROm9f3I+osYX<0LDi@9FP zW}4}i>n*e9!i2>v_QqoW*LTJs%1CF zsAF4vWW7kz3Z$?^%XQ6EDNARwutrj8o$Q$3H-+n^m-<8m%#waluBI!FlQR{A5{r>^ znlGcK3Xh<_Z(O$GHunyPYl0~FXm9g=2EDJ4>*Vg19qN|*V&{emg>wt13x&=kGNn_O zGzz`d<=$#WZM{vNC+VZ_@3%c4rl)#2-YbZ1692{b&TkoRK{nTLTGdQGou467>GV`~ zXDCqN1DdJ1nxbnfRAq4}Ax~J+3@_fv?h4xCWwm`e?;3XA*6dkVVGZieKKo4bnEl-H z@w~28^LE>9T4uhtH+hFP3~IVg9&F`pz17gne0RTccH5IfuWShH55nJ>hHe%8CJx<* zByJ3itWMm*;~V(UEi8UE@zKO)>>(lccYG`&vLsBLt976aV}v*wd<=aD1He#Ew*xUf z6kY5R4PV)5Dh?5&MjAN8+@AOny0b4zT?^q;71iiffE#an>SLi^jei5)-bUGkG7mw& zsyViVh64xS%suH(Jjcksb()C>tIHak7nM$P-TCq^5RKTLz(ka-o8Lex}Go;#b zi3UH1I4;v{o2tYDQ3lY}QgppN0|B=0wgLspXPXUjNdwoiRHc2(vpGn8UTZXU_yY); z)v_JZa;RDWQ{B2M1Y1?9u3+!1~J2T^6n z5pTHJjj$X<=p|~F>2erkqkfe$e)h2e=sb}wDY_Tu)S=WUoD>mTcX-tjmg4$YkPJHv zFFE)-{BT%Be~qHZ;HQ%vNUSA~Z{Wi1@yyy-_Eze^<>u$jwehFcQ%_${oxGMh`TaXT zKDnM+yq-FDEp=|~ys}oK>#6#mQ9%|qksyiCb-T{9mTH z4@>k;;Scc#*iC>#zb)~TUD&a9FFq2x3LZr@Xa&55s$Ac3%lU!@)TR>6gu@$d9h{Ub1IR=TNRjh{A4eUo z4zg7Dk>>yb+*L`H$_xm1)=nVlRSWPIznaKWr4kki2s1!pt_w8T0(#^$6}Xrobh$=t z7mUtnIt}W#Qh7j9;t~6l#16p6XAeQQxN_v4?8KL>Bx}JD;1>8R8-;bdScHv()Ek{! zSbX)hGjEsAFBIqBJXy3pxUWLyNmEh#yX5rsg0%qmMu%E0a zz-5k2@>iZD<2MWc!r=4jcH(4kWWB(Sf`SvSa{;w1j2K7Z!$ytpET3 literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/vim/plugin/__pycache__/nerdtree.cpython-312.pyc b/powerline-bin/powerline/segments/vim/plugin/__pycache__/nerdtree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e58f9a9af60e0a09f3e0bb9edeebb9a85a65bb1d GIT binary patch literal 1061 zcmY*X&u46;52#LMS&aS_s{Q2|q`_1=j z2!{Xri~jc(La)tcI-CPzM}To35kzo`GTg?Q)wVLbZD&r~!N@ZaE3LFEu-d7cd2J6H zpOeqK1)$=*(fHavj|}F+!X6bu_|Z^>1?`bab=K zS&tJMr%X|iq*A+tZ7|7ruIG}jyr&>xHN@KQmi>)H#B`HM zC5>ama>7S(FX;^_>EQ!qW-*VpVeVW5xR2Cfj9_AILy63gc#M_F+8Z~fg_=5GCHD5g z$y@j)CJw0#EK+@74e+-poY_)qRFxtR2otoYxEKd&n5clsKo0pR54y%dgI*~F%~b&U z`&6`QHE)FthAB)H3yhFsdf!_4BXOGGzfODMk*_!f)!^~B0$&KrSrpc#f8m_ zQOdeeF;+vKM+F~Ik+Pgdk`6L+Wdy`gk(L9NM^lNdVyxZiM$7}h4^u7!+(z#j$XocC z{IdFo`^huUf7zJ(Y2}BNCr2(lZG3h6*q^ft&yJpcRDZJY`J0MevnR;*901GNfzv4T zbuEU@g0G`-EKCCk^Y@}+plVzq@&7-Vii*Wdpc=bUsE88%y@Dc**_` Dh#e+o literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/segments/vim/plugin/__pycache__/syntastic.cpython-312.pyc b/powerline-bin/powerline/segments/vim/plugin/__pycache__/syntastic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ba7b957cac85d4f4695e94819ee99e72be1df6d GIT binary patch literal 2006 zcmahKO=uid_`UhrotfRuBn`G{L_47scQDztR2$rCRj@S$NwE#ISr41Z&SZDO{PE^Z zHk)oBRzV745rlg1;w_~fdMX};_8&b(7k+i8GJ^9}5&TgwVK6vl@zW4oq z-~0I?lTiR2nV;@1y)OdrD1*$+5A83@0R#X|LF!?R!Ku7DL~OuvN0%z(<%21<3YrX({r`m9vR3U7hh@GO9Rm`bjNbVYveYqMyTgRndUy!y z9PaC2TD~Q~h!O=}&x$zkVK%`AeIb zfB8$C1^SSYq|G>6^=n$KYT>Gdw6N}BBgA%Ds~VxUwFFp%MDAx4Z}TJn)=;DRE{Cp#EpP)TZ~!>9VWCzY6~UA1CgOmD`nR2@38RzZFg zgjy6@WSjz5Jt)Pg5h=7P zE(KeFog|NvGCNIdgAlvY%(0&z^7X znQsjhH^%Qsd)l0IPsv=)UdlE{3oYf?#@>5r_43T6ndURcTj@79#@gwjjj=m|(&m&; z@*n2g>i*lRwxw#DC$AsAdg}Vp*5n(vj(oRr^H@{WTI%Wcn7%pP+;`-@$d3vS0ndx~ zB_L+{+T*v?i7jIdKM-I{vqR{8tvO}D8|wA8uw*h`!9&3)4Y?QIFjBO3>H zXhuNiqUR|%app`x`{Ux*+J(VkS=X``=y6%swdep9IrsLN*-6U;KobmSQ9hDhcYQN*tm7z4N%nz+@6u(PhY?Q&sp0sb?n|=Rz?|ok= zmwz@!kf;{9&J_@9|6v%ZsQ0hvc)>R1^;*acWbq!9%*8`(& z1ZLfo#J%e0f_yy>wCofJa*8``-EZY_zBlNGDi{;g}mf6lE_aPwn-32l<{IrNyzMG8oCSw zrYkZZnInPiMnT|&o{bks!Vm>UX+rNZV#6mu z$%`yI5JX<)E_f0^N0_lqftT#?){%GV$sN6;|F36b==oiUU`bulSZ-*S6^7JoaY*f) zo;mb7JR$3xh<>)bBQ>PFy!g|Umokeg%`O7&S4LjcAXibxK6nMMxG3Kp)M!ZqIjt%0 z2~I4>^N8pW$G2h{#h5a28#VhzJd(t|)4`tbQME3ov1l$}=Nv!9UIuIW2i!^tMi0GQB?^|sGZA{&EXXp-`^rho}NKjJJS5L-_ev$p z^Sg(g%dyY3e#=lX60$oYH^3Pqp%i7^O*W1#I=E^qy}-+Vn1z>a9FIk!*hecZAge(;AIbd$v1$yX!9s4 zKG%DBwQ#IEzOI&6_OGgAy*GbUtqo&j`QWXCE1l0@S~HH{d3DvO-jk~j^^pzjKu`Zk zJG@bzxOeRIT6wBF_0ZhAo-6%g7B@;`%S*SGdROk`*Gi|}f4)0*^W=t}yZy%UgjqcbMgpXjiN=c>6O&eCNm=D{gV&bV-c~tBInh|I} zAfCI}-{$8jjVRAVjalq6zW-Sfs}1NU61I{m6mi!Bmv$sz*aA$&vZQ+j8WG3>^aY}a z1$_w6Q~eCIW9s8`v;wSHvdIjfO+}KV-_Xn&n%Ptpsr*37{h=f2lJpRr+{~cjNY`A? z7rO?~@_{GvVaeQ5fcjlfe{PN=ee?;Er1Jf2;lqUwMuoNV(!nWSG(S(1^Tr(cj?o?4WXnU|_xoSKuGT#{c@tREkrnU`4- lAFo$X`HRCQH$SB`C)KWq6=)_S5Ep|OADI~$8H<>KEC3d~DFOfh literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/selectors/__pycache__/vim.cpython-312.pyc b/powerline-bin/powerline/selectors/__pycache__/vim.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1f56a4d53d4529bf8097018e829b6a636f2249a GIT binary patch literal 593 zcmX|7F>ezw6t?d!={0KFN}x^*E(79*XP*slMkdO zH5EkCg373fWL(5DDH0maBhi!nqK|p}mK0m7BciumK_w+Ko^O1f_ z55LmGHQtaXS?UKR4iLRTS(>25gh82JfIfmhxZxa6xvG)Gj*)U>YeV#jnElYbi*TJj jLQ}1PQ*#^3Fa~=I;de|a{Y561Wb%_7t@|;(yLt2%X?>Y* literal 0 HcmV?d00001 diff --git a/powerline-bin/powerline/selectors/vim.py b/powerline-bin/powerline/selectors/vim.py new file mode 100644 index 0000000..d111de9 --- /dev/null +++ b/powerline-bin/powerline/selectors/vim.py @@ -0,0 +1,10 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline.bindings.vim import list_tabpages + + +def single_tab(pl, segment_info, mode): + '''Returns True if Vim has only one tab opened + ''' + return len(list_tabpages()) == 1 diff --git a/powerline-bin/powerline/shell.py b/powerline-bin/powerline/shell.py new file mode 100644 index 0000000..e10692c --- /dev/null +++ b/powerline-bin/powerline/shell.py @@ -0,0 +1,38 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +from powerline import Powerline +from powerline.lib.dict import mergedicts + + +class ShellPowerline(Powerline): + def init(self, args, **kwargs): + self.args = args + super(ShellPowerline, self).init(args.ext[0], args.renderer_module, **kwargs) + + def load_main_config(self): + r = super(ShellPowerline, self).load_main_config() + if self.args.config_override: + mergedicts(r, self.args.config_override) + return r + + def load_theme_config(self, name): + r = super(ShellPowerline, self).load_theme_config(name) + if self.args.theme_override and name in self.args.theme_override: + mergedicts(r, self.args.theme_override[name]) + return r + + def get_config_paths(self): + return self.args.config_path or super(ShellPowerline, self).get_config_paths() + + def get_local_themes(self, local_themes): + if not local_themes: + return {} + + return dict(( + (key, {'config': self.load_theme_config(val)}) + for key, val in local_themes.items() + )) + + def do_setup(self, obj): + obj.powerline = self diff --git a/powerline-bin/powerline/theme.py b/powerline-bin/powerline/theme.py new file mode 100644 index 0000000..b3a23a1 --- /dev/null +++ b/powerline-bin/powerline/theme.py @@ -0,0 +1,182 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import itertools + +from powerline.segment import gen_segment_getter, process_segment, get_fallback_segment +from powerline.lib.unicode import u, safe_unicode + + +def requires_segment_info(func): + func.powerline_requires_segment_info = True + return func + + +def requires_filesystem_watcher(func): + func.powerline_requires_filesystem_watcher = True + return func + + +def new_empty_segment_line(): + return { + 'left': [], + 'right': [] + } + + +def add_spaces_left(pl, amount, segment): + return (' ' * amount) + segment['contents'] + + +def add_spaces_right(pl, amount, segment): + return segment['contents'] + (' ' * amount) + + +def add_spaces_center(pl, amount, segment): + amount, remainder = divmod(amount, 2) + return (' ' * (amount + remainder)) + segment['contents'] + (' ' * amount) + + +expand_functions = { + 'l': add_spaces_right, + 'r': add_spaces_left, + 'c': add_spaces_center, +} + + +class Theme(object): + def __init__(self, + ext, + theme_config, + common_config, + pl, + get_module_attr, + top_theme, + colorscheme, + main_theme_config=None, + run_once=False, + shutdown_event=None): + self.colorscheme = colorscheme + self.dividers = theme_config['dividers'] + self.dividers = dict(( + (key, dict((k, u(v)) + for k, v in val.items())) + for key, val in self.dividers.items() + )) + try: + self.cursor_space_multiplier = 1 - (theme_config['cursor_space'] / 100) + except KeyError: + self.cursor_space_multiplier = None + self.cursor_columns = theme_config.get('cursor_columns') + self.spaces = theme_config['spaces'] + self.outer_padding = int(theme_config.get('outer_padding', 1)) + self.segments = [] + self.EMPTY_SEGMENT = { + 'contents': None, + 'highlight': {'fg': False, 'bg': False, 'attrs': 0} + } + self.pl = pl + theme_configs = [theme_config] + if main_theme_config: + theme_configs.append(main_theme_config) + get_segment = gen_segment_getter( + pl, + ext, + common_config, + theme_configs, + theme_config.get('default_module'), + get_module_attr, + top_theme + ) + for segdict in itertools.chain((theme_config['segments'],), + theme_config['segments'].get('above', ())): + self.segments.append(new_empty_segment_line()) + for side in ['left', 'right']: + for segment in segdict.get(side, []): + segment = get_segment(segment, side) + if segment: + if not run_once: + if segment['startup']: + try: + segment['startup'](pl, shutdown_event) + except Exception as e: + pl.error('Exception during {0} startup: {1}', segment['name'], str(e)) + continue + self.segments[-1][side].append(segment) + + def shutdown(self): + for line in self.segments: + for segments in line.values(): + for segment in segments: + try: + segment['shutdown']() + except TypeError: + pass + + def get_divider(self, side='left', type='soft'): + '''Return segment divider.''' + return self.dividers[side][type] + + def get_spaces(self): + return self.spaces + + def get_line_number(self): + return len(self.segments) + + def get_segments(self, side=None, line=0, segment_info=None, mode=None): + '''Return all segments. + + Function segments are called, and all segments get their before/after + and ljust/rjust properties applied. + + :param int line: + Line number for which segments should be obtained. Is counted from + zero (botmost line). + ''' + for side in [side] if side else ['left', 'right']: + parsed_segments = [] + for segment in self.segments[line][side]: + if segment['display_condition'](self.pl, segment_info, mode): + process_segment( + self.pl, + side, + segment_info, + parsed_segments, + segment, + mode, + self.colorscheme, + ) + for segment in parsed_segments: + self.pl.prefix = segment['name'] + try: + width = segment['width'] + align = segment['align'] + if width == 'auto' and segment['expand'] is None: + segment['expand'] = expand_functions.get(align) + if segment['expand'] is None: + self.pl.error('Align argument must be “r”, “l” or “c”, not “{0}”', align) + + try: + segment['contents'] = segment['before'] + u( + segment['contents'] if segment['contents'] is not None else '' + ) + segment['after'] + except Exception as e: + self.pl.exception('Failed to compute segment contents: {0}', str(e)) + segment['contents'] = safe_unicode(segment.get('contents')) + # Align segment contents + if segment['width'] and segment['width'] != 'auto': + if segment['align'] == 'l': + segment['contents'] = segment['contents'].ljust(segment['width']) + elif segment['align'] == 'r': + segment['contents'] = segment['contents'].rjust(segment['width']) + elif segment['align'] == 'c': + segment['contents'] = segment['contents'].center(segment['width']) + # We need to yield a copy of the segment, or else mode-dependent + # segment contents can’t be cached correctly e.g. when caching + # non-current window contents for vim statuslines + yield segment.copy() + except Exception as e: + self.pl.exception('Failed to compute segment: {0}', str(e)) + fallback = get_fallback_segment() + fallback.update(side=side) + yield fallback diff --git a/powerline-bin/powerline/vim.py b/powerline-bin/powerline/vim.py new file mode 100644 index 0000000..603a6a5 --- /dev/null +++ b/powerline-bin/powerline/vim.py @@ -0,0 +1,347 @@ +# vim:fileencoding=utf-8:noet +from __future__ import (unicode_literals, division, absolute_import, print_function) + +import sys +import json +import logging + +from itertools import count + +try: + import vim +except ImportError: + vim = object() + +from powerline.bindings.vim import vim_get_func, vim_getvar, get_vim_encoding, python_to_vim +from powerline import Powerline, FailedUnicode, finish_common_config +from powerline.lib.dict import mergedicts +from powerline.lib.unicode import u + + +def _override_from(config, override_varname, key=None): + try: + overrides = vim_getvar(override_varname) + except KeyError: + return config + if key is not None: + try: + overrides = overrides[key] + except KeyError: + return config + mergedicts(config, overrides) + return config + + +class VimVarHandler(logging.Handler, object): + '''Vim-specific handler which emits messages to Vim global variables + + :param str varname: + Variable where + ''' + def __init__(self, varname): + super(VimVarHandler, self).__init__() + utf_varname = u(varname) + self.vim_varname = utf_varname.encode('ascii') + vim.command('unlet! g:' + utf_varname) + vim.command('let g:' + utf_varname + ' = []') + + def emit(self, record): + message = u(record.message) + if record.exc_text: + message += '\n' + u(record.exc_text) + vim.eval(b'add(g:' + self.vim_varname + b', ' + python_to_vim(message) + b')') + + +class VimPowerline(Powerline): + def init(self, pyeval='PowerlinePyeval', **kwargs): + super(VimPowerline, self).init('vim', **kwargs) + self.last_window_id = 1 + self.pyeval = pyeval + self.construct_window_statusline = self.create_window_statusline_constructor() + if all((hasattr(vim.current.window, attr) for attr in ('options', 'vars', 'number'))): + self.win_idx = self.new_win_idx + else: + self.win_idx = self.old_win_idx + self._vim_getwinvar = vim_get_func('getwinvar', 'bytes') + self._vim_setwinvar = vim_get_func('setwinvar') + + if sys.version_info < (3,): + def create_window_statusline_constructor(self): + window_statusline = b'%!' + str(self.pyeval) + b'(\'powerline.statusline({0})\')' + return window_statusline.format + else: + def create_window_statusline_constructor(self): + startstr = b'%!' + self.pyeval.encode('ascii') + b'(\'powerline.statusline(' + endstr = b')\')' + return lambda idx: ( + startstr + str(idx).encode('ascii') + endstr + ) + + create_window_statusline_constructor.__doc__ = ( + '''Create function which returns &l:stl value being given window index + + Created function must return :py:class:`bytes` instance because this is + what ``window.options['statusline']`` returns (``window`` is + :py:class:`vim.Window` instance). + + :return: + Function with type ``int → bytes``. + ''' + ) + + default_log_stream = sys.stdout + + def add_local_theme(self, key, config): + '''Add local themes at runtime (during vim session). + + :param str key: + Matcher name (in format ``{matcher_module}.{module_attribute}`` or + ``{module_attribute}`` if ``{matcher_module}`` is + ``powerline.matchers.vim``). Function pointed by + ``{module_attribute}`` should be hashable and accept a dictionary + with information about current buffer and return boolean value + indicating whether current window matched conditions. See also + :ref:`local_themes key description `. + + :param dict config: + :ref:`Theme ` dictionary. + + :return: + ``True`` if theme was added successfully and ``False`` if theme with + the same matcher already exists. + ''' + self.update_renderer() + matcher = self.get_matcher(key) + theme_config = {} + for cfg_path in self.theme_levels: + try: + lvl_config = self.load_config(cfg_path, 'theme') + except IOError: + pass + else: + mergedicts(theme_config, lvl_config) + mergedicts(theme_config, config) + try: + self.renderer.add_local_theme(matcher, {'config': theme_config}) + except KeyError: + return False + else: + # Hack for local themes support: when reloading modules it is not + # guaranteed that .add_local_theme will be called once again, so + # this function arguments will be saved here for calling from + # .do_setup(). + self.setup_kwargs.setdefault('_local_themes', []).append((key, config)) + return True + + get_encoding = staticmethod(get_vim_encoding) + + def load_main_config(self): + main_config = _override_from(super(VimPowerline, self).load_main_config(), 'powerline_config_overrides') + try: + use_var_handler = bool(int(vim_getvar('powerline_use_var_handler'))) + except KeyError: + use_var_handler = False + if use_var_handler: + main_config.setdefault('common', {}) + main_config['common'] = finish_common_config(self.get_encoding(), main_config['common']) + main_config['common']['log_file'].append(['powerline.vim.VimVarHandler', [['powerline_log_messages']]]) + return main_config + + def load_theme_config(self, name): + return _override_from( + super(VimPowerline, self).load_theme_config(name), + 'powerline_theme_overrides', + name + ) + + def get_local_themes(self, local_themes): + if not local_themes: + return {} + + return dict(( + (matcher, {'config': self.load_theme_config(val)}) + for matcher, key, val in ( + ( + (None if k == '__tabline__' else self.get_matcher(k)), + k, + v + ) + for k, v in local_themes.items() + ) if ( + matcher or + key == '__tabline__' + ) + )) + + def get_matcher(self, match_name): + match_module, separator, match_function = match_name.rpartition('.') + if not separator: + match_module = 'powerline.matchers.{0}'.format(self.ext) + match_function = match_name + return self.get_module_attr(match_module, match_function, prefix='matcher_generator') + + def get_config_paths(self): + try: + return vim_getvar('powerline_config_paths') + except KeyError: + return super(VimPowerline, self).get_config_paths() + + def do_setup(self, pyeval=None, pycmd=None, can_replace_pyeval=True, _local_themes=()): + import __main__ + if not pyeval: + pyeval = 'pyeval' if sys.version_info < (3,) else 'py3eval' + can_replace_pyeval = True + if not pycmd: + pycmd = get_default_pycmd() + + set_pycmd(pycmd) + + # pyeval() and vim.bindeval were both introduced in one patch + if (not hasattr(vim, 'bindeval') and can_replace_pyeval) or pyeval == 'PowerlinePyeval': + vim.command((''' + function! PowerlinePyeval(e) + {pycmd} powerline.do_pyeval() + endfunction + ''').format(pycmd=pycmd)) + pyeval = 'PowerlinePyeval' + + self.pyeval = pyeval + self.construct_window_statusline = self.create_window_statusline_constructor() + + self.update_renderer() + __main__.powerline = self + + try: + if ( + bool(int(vim.eval('has(\'gui_running\') && argc() == 0'))) + and not vim.current.buffer.name + and len(vim.windows) == 1 + ): + # Hack to show startup screen. Problems in GUI: + # - Defining local value of &statusline option while computing + # global value purges startup screen. + # - Defining highlight group while computing statusline purges + # startup screen. + # This hack removes the “while computing statusline” part: both + # things are defined, but they are defined right now. + # + # The above condition disables this hack if no GUI is running, + # Vim did not open any files and there is only one window. + # Without GUI everything works, in other cases startup screen is + # not shown. + self.new_window() + except UnicodeDecodeError: + # vim.current.buffer.name may raise UnicodeDecodeError when using + # Python-3*. Fortunately, this means that current buffer is not + # empty buffer, so the above condition should be False. + pass + + # Cannot have this in one line due to weird newline handling (in :execute + # context newline is considered part of the command in just the same cases + # when bar is considered part of the command (unless defining function + # inside :execute)). vim.command is :execute equivalent regarding this case. + vim.command('augroup Powerline') + vim.command(' autocmd! ColorScheme * :{pycmd} powerline.reset_highlight()'.format(pycmd=pycmd)) + vim.command(' autocmd! VimLeavePre * :{pycmd} powerline.shutdown()'.format(pycmd=pycmd)) + vim.command('augroup END') + + # Hack for local themes support after reloading. + for args in _local_themes: + self.add_local_theme(*args) + + def reset_highlight(self): + try: + self.renderer.reset_highlight() + except AttributeError: + # Renderer object appears only after first `.render()` call. Thus if + # ColorScheme event happens before statusline is drawn for the first + # time AttributeError will be thrown for the self.renderer. It is + # fine to ignore it: no renderer == no colors to reset == no need to + # do anything. + pass + + def new_win_idx(self, window_id): + r = None + for window in vim.windows: + try: + curwindow_id = window.vars['powerline_window_id'] + if r is not None and curwindow_id == window_id: + raise KeyError + except KeyError: + curwindow_id = self.last_window_id + self.last_window_id += 1 + window.vars['powerline_window_id'] = curwindow_id + statusline = self.construct_window_statusline(curwindow_id) + if window.options['statusline'] != statusline: + window.options['statusline'] = statusline + if curwindow_id == window_id if window_id else window is vim.current.window: + r = (window, curwindow_id, window.number) + return r + + def old_win_idx(self, window_id): + r = None + for winnr, window in zip(count(1), vim.windows): + curwindow_id = self._vim_getwinvar(winnr, 'powerline_window_id') + if curwindow_id and not (r is not None and curwindow_id == window_id): + curwindow_id = int(curwindow_id) + else: + curwindow_id = self.last_window_id + self.last_window_id += 1 + self._vim_setwinvar(winnr, 'powerline_window_id', curwindow_id) + statusline = self.construct_window_statusline(curwindow_id) + if self._vim_getwinvar(winnr, '&statusline') != statusline: + self._vim_setwinvar(winnr, '&statusline', statusline) + if curwindow_id == window_id if window_id else window is vim.current.window: + r = (window, curwindow_id, winnr) + return r + + def statusline(self, window_id): + window, window_id, winnr = self.win_idx(window_id) or (None, None, None) + if not window: + return FailedUnicode('No window {0}'.format(window_id)) + return self.render(window, window_id, winnr) + + def tabline(self): + return self.render(*self.win_idx(None), is_tabline=True) + + def new_window(self): + return self.render(*self.win_idx(None)) + + @staticmethod + def do_pyeval(): + '''Evaluate python string passed to PowerlinePyeval + + Is here to reduce the number of requirements to __main__ globals to just + one powerline object (previously it required as well vim and json). + ''' + import __main__ + vim.command('return ' + json.dumps(eval(vim.eval('a:e'), __main__.__dict__))) + + def setup_components(self, components): + if components is None: + components = ('statusline', 'tabline') + if 'statusline' in components: + # Is immediately changed after new_window function is run. Good for + # global value. + vim.command('set statusline=%!{pyeval}(\'powerline.new_window()\')'.format( + pyeval=self.pyeval)) + if 'tabline' in components: + vim.command('set tabline=%!{pyeval}(\'powerline.tabline()\')'.format( + pyeval=self.pyeval)) + + +pycmd = None + + +def set_pycmd(new_pycmd): + global pycmd + pycmd = new_pycmd + + +def get_default_pycmd(): + return 'python' if sys.version_info < (3,) else 'python3' + + +def setup(*args, **kwargs): + powerline = VimPowerline() + return powerline.setup(*args, **kwargs) diff --git a/powerline-bin/powerline_status-2.7.dist-info/INSTALLER b/powerline-bin/powerline_status-2.7.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/powerline-bin/powerline_status-2.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/powerline-bin/powerline_status-2.7.dist-info/METADATA b/powerline-bin/powerline_status-2.7.dist-info/METADATA new file mode 100644 index 0000000..cedcc1b --- /dev/null +++ b/powerline-bin/powerline_status-2.7.dist-info/METADATA @@ -0,0 +1,123 @@ +Metadata-Version: 2.1 +Name: powerline-status +Version: 2.7 +Summary: The ultimate statusline/prompt utility. +Home-page: https://github.com/powerline/powerline +Download-URL: https://github.com/powerline/powerline/archive/develop.zip +Author: Kim Silkebaekken +Author-email: kim.silkebaekken+vim@gmail.com +License: MIT +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: Plugins +Classifier: Intended Audience :: End Users/Desktop +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Provides-Extra: docs +Requires-Dist: Sphinx ; extra == 'docs' +Requires-Dist: sphinx-rtd-theme ; extra == 'docs' + +Powerline +========= + +:Author: Kim Silkebækken (kim.silkebaekken+vim@gmail.com) +:Source: https://github.com/powerline/powerline +:Version: beta + +**Powerline is a statusline plugin for vim, and provides statuslines and +prompts for several other applications, including zsh, bash, fish, tmux, +IPython, Awesome, i3 and Qtile.** + +* `Support forum`_ (powerline-support@googlegroups.com) +* `Development discussion`_ (powerline-dev@googlegroups.com) + +.. image:: https://api.travis-ci.org/powerline/powerline.svg?branch=develop + :target: `travis-build-status`_ + :alt: Build status + +.. _travis-build-status: https://travis-ci.org/powerline/powerline +.. _`Support forum`: https://groups.google.com/forum/#!forum/powerline-support +.. _`Development discussion`: https://groups.google.com/forum/#!forum/powerline-dev + +Features +-------- + +* **Extensible and feature rich, written in Python.** Powerline was + completely rewritten in Python to get rid of as much vimscript as + possible. This has allowed much better extensibility, leaner and better + config files, and a structured, object-oriented codebase with no mandatory + third-party dependencies other than a Python interpreter. +* **Stable and testable code base.** Using Python has allowed unit testing + of all the project code. The code is tested to work in Python 2.6+ and + Python 3. +* **Support for prompts and statuslines in many applications.** Originally + created exclusively for vim statuslines, the project has evolved to + provide statuslines in tmux and several WMs, and prompts for shells like + bash/zsh and other applications. It’s simple to write renderers for any + other applications that Powerline doesn’t yet support. +* **Configuration and colorschemes written in JSON.** JSON is + a standardized, simple and easy to use file format that allows for easy + user configuration across all of Powerline’s supported applications. +* **Fast and lightweight, with daemon support for even better performance.** + Although the code base spans a couple of thousand lines of code with no + goal of “less than X lines of code”, the main focus is on good performance + and as little code as possible while still providing a rich set of + features. The new daemon also ensures that only one Python instance is + launched for prompts and statuslines, which provides excellent + performance. + +*But I hate Python / I don’t need shell prompts / this is just too much +hassle for me / what happened to the original vim-powerline project / …* + +You should check out some of the Powerline derivatives. The most lightweight +and feature-rich alternative is currently Bailey Ling’s `vim-airline +`_ project. + +------ + +* Consult the `documentation + `_ for more information and + installation instructions. +* Check out `powerline-fonts `_ for + pre-patched versions of popular, open source coding fonts. + +Screenshots +----------- + +Vim statusline +^^^^^^^^^^^^^^ + +**Mode-dependent highlighting** + +* .. image:: https://raw.github.com/powerline/powerline/develop/docs/source/_static/img/pl-mode-normal.png + :alt: Normal mode +* .. image:: https://raw.github.com/powerline/powerline/develop/docs/source/_static/img/pl-mode-insert.png + :alt: Insert mode +* .. image:: https://raw.github.com/powerline/powerline/develop/docs/source/_static/img/pl-mode-visual.png + :alt: Visual mode +* .. image:: https://raw.github.com/powerline/powerline/develop/docs/source/_static/img/pl-mode-replace.png + :alt: Replace mode + +**Automatic truncation of segments in small windows** + +* .. image:: https://raw.github.com/powerline/powerline/develop/docs/source/_static/img/pl-truncate1.png + :alt: Truncation illustration +* .. image:: https://raw.github.com/powerline/powerline/develop/docs/source/_static/img/pl-truncate2.png + :alt: Truncation illustration +* .. image:: https://raw.github.com/powerline/powerline/develop/docs/source/_static/img/pl-truncate3.png + :alt: Truncation illustration + +---- + +The font in the screenshots is `Pragmata Pro`_ by Fabrizio Schiavi. + +.. _`Pragmata Pro`: http://www.fsd.it/shop/fonts/pragmatapro diff --git a/powerline-bin/powerline_status-2.7.dist-info/RECORD b/powerline-bin/powerline_status-2.7.dist-info/RECORD new file mode 100644 index 0000000..c5c181d --- /dev/null +++ b/powerline-bin/powerline_status-2.7.dist-info/RECORD @@ -0,0 +1,341 @@ +../../bin/powerline,sha256=lDOwPm5LtMmDIzcyrGpRGulaCIk4zRBFYPC6VrRQmU0,16896 +../../bin/powerline-config,sha256=0LegBM-f5VjuYJDHj1tsUbRHvyupwxw8Ap-t3pTHL7g,589 +../../bin/powerline-daemon,sha256=b6LyMVUKqiUF1RlZb1QxpfnTYJRyIlJAz29VfSUZ8oU,12815 +../../bin/powerline-lint,sha256=uzDZilpsl82smzojbX4zFYILqZt17wJUXfFadWuoZG0,350 +../../bin/powerline-render,sha256=gAVsMPgvET2-aPxFKJpU2oBX2UWWrvmPCaQ2Ggt5PFQ,893 +powerline/__init__.py,sha256=OlONs_kZNRukhHFl1Ob92trLXQzln9jOOR65yYlIOz4,31815 +powerline/__pycache__/__init__.cpython-312.pyc,, +powerline/__pycache__/colorscheme.cpython-312.pyc,, +powerline/__pycache__/config.cpython-312.pyc,, +powerline/__pycache__/ipython.cpython-312.pyc,, +powerline/__pycache__/lemonbar.cpython-312.pyc,, +powerline/__pycache__/pdb.cpython-312.pyc,, +powerline/__pycache__/renderer.cpython-312.pyc,, +powerline/__pycache__/segment.cpython-312.pyc,, +powerline/__pycache__/shell.cpython-312.pyc,, +powerline/__pycache__/theme.cpython-312.pyc,, +powerline/__pycache__/vim.cpython-312.pyc,, +powerline/bindings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/bindings/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/__pycache__/config.cpython-312.pyc,, +powerline/bindings/awesome/__pycache__/powerline-awesome.cpython-312.pyc,, +powerline/bindings/awesome/powerline-awesome.py,sha256=jErhi5Tw6B6i5Tfc9CrguqexXupIMlGes8HJzFtS3nA,424 +powerline/bindings/awesome/powerline.lua,sha256=h3mRPj2oYu_6g2WNEH9sxz3kIUBJAdK8ASq1_yT-nRI,436 +powerline/bindings/bar/__pycache__/powerline-bar.cpython-312.pyc,, +powerline/bindings/bar/powerline-bar.py,sha256=gXE7tb9JBH9K48X72J1SHdk1-aLIMyo2FvzvyxAI9Ew,1501 +powerline/bindings/bash/powerline.sh,sha256=tKP6vwHIU5V05h61XP4EB3nZuwAoAOWyi3VafdMKz4E,4173 +powerline/bindings/config.py,sha256=nhGg7trWu8sm0eBy6CmuyBGrDFcIS0Hl-JtQNTb9pVY,10072 +powerline/bindings/fish/powerline-setup.fish,sha256=uhlgtsda5n9xw6JsXPeP_QBwoJmNlIW5dPDmhgbzIgY,3379 +powerline/bindings/i3/__pycache__/powerline-i3.cpython-312.pyc,, +powerline/bindings/i3/powerline-i3.py,sha256=Z4peBk1b99K8tjZ2x4QfAF-lBwBOjL1aKIAkqPGi_JI,1067 +powerline/bindings/ipython/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/bindings/ipython/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/ipython/__pycache__/post_0_11.cpython-312.pyc,, +powerline/bindings/ipython/__pycache__/pre_0_11.cpython-312.pyc,, +powerline/bindings/ipython/__pycache__/since_5.cpython-312.pyc,, +powerline/bindings/ipython/post_0_11.py,sha256=xQRqEGH3eY2kCjSVxS7RPfpH-uSxV41YZffUajDq-Ng,3366 +powerline/bindings/ipython/pre_0_11.py,sha256=qcBmfNpEYP3e8wpegvQaNqaBYo9e0gIjAA39y7KtjN8,3856 +powerline/bindings/ipython/since_5.py,sha256=EEePucPOQbKZitaes1W-xizhztILxRpgH7mDRc7Eky4,2645 +powerline/bindings/lemonbar/__pycache__/powerline-lemonbar.cpython-312.pyc,, +powerline/bindings/lemonbar/powerline-lemonbar.py,sha256=tXb5UK0nocAfu8sTbabZXdcO11AJCf5Bt7F-yIELJaE,1616 +powerline/bindings/pdb/__init__.py,sha256=Ng4LTyOPm6ndxsHIKDQvu57fwj_X8vDV6iV5X2kqipw,4750 +powerline/bindings/pdb/__main__.py,sha256=BWOLmcfeZywZo3kPk7xgNJEhmdFwHZcqvFtQhMeWFeM,215 +powerline/bindings/pdb/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/pdb/__pycache__/__main__.cpython-312.pyc,, +powerline/bindings/qtile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/bindings/qtile/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/qtile/__pycache__/widget.cpython-312.pyc,, +powerline/bindings/qtile/widget.py,sha256=sLDrchQEc-Bi-Q1cf_Ex_efRSvzG8C9RyH7toQLZYSs,1638 +powerline/bindings/rc/powerline.rc,sha256=81uihtm7MWosbkxLCJU4jXZD5OzUHlVbmU4EsZVGd8M,2345 +powerline/bindings/shell/powerline.sh,sha256=vp4aw9uhoyA4yWvon7UVItNswAZ4J8E538yNtHv9HNA,6419 +powerline/bindings/tcsh/powerline.tcsh,sha256=ae8WFFpx1i0j92AojhUeRGusTc_ATtBbMqPf522L6i4,2869 +powerline/bindings/tmux/__init__.py,sha256=el5txQKGcZtpw8-CzJCjMN6mNXeeWhaMx0GSDqDtaxs,2216 +powerline/bindings/tmux/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/tmux/powerline-base.conf,sha256=Odsp62RkZwbARVWUlN7Jsj2aml0mQgDe2FQPvt8eSFE,1039 +powerline/bindings/tmux/powerline.conf,sha256=EKvp1Db-_kQZaJa6ZNK3KxE9Uvjrsc45O7oMmfwDc7Y,114 +powerline/bindings/tmux/powerline_tmux_1.7_plus.conf,sha256=g_k1zyVu13CD2OHUNlgFbtTNdj63qsYjvagB3mjUxaQ,589 +powerline/bindings/tmux/powerline_tmux_1.8.conf,sha256=dkrD7xg28eu4osBQNJrU5o4xqM8ne45KfR4ehiMxWUI,243 +powerline/bindings/tmux/powerline_tmux_1.8_minus.conf,sha256=QnwfBXl9BOBVHSkYc-ZiIP9-ERrJZ2kKhzIZSP7DzcE,670 +powerline/bindings/tmux/powerline_tmux_1.8_plus.conf,sha256=gKmxjWste_fW-2u0B3kKiKrCrw7TmhZLkplHfiwHmgQ,750 +powerline/bindings/tmux/powerline_tmux_1.9_plus.conf,sha256=5bbJI1_MIIPMUt_t-Xtx-aXvc1D09sFprlDklMSCxOg,503 +powerline/bindings/tmux/powerline_tmux_2.1_plus.conf,sha256=3sD3pR30nQFG_JkctD8SSN_mQ0Q_opy89S69WXXZ6tU,907 +powerline/bindings/vim/__init__.py,sha256=epnmNJcLo5muWv65mITJAZBUtQ2n_UFBk5TISJugj6s,11453 +powerline/bindings/vim/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/vim/autoload/powerline/debug.vim,sha256=Q-SNvTvLX6RXy1HUhXqlnaHDv1bn7l4gU8KKPPb8kxU,507 +powerline/bindings/vim/plugin/powerline.vim,sha256=oq1kd4eq5zr2DPSWu-TTkiu0w_Lpo-qpYA02wpojtw0,7008 +powerline/bindings/wm/__init__.py,sha256=10woQI2J3DmOFQgXuodLN577JGNnJhp3jrJnhv19LeI,1712 +powerline/bindings/wm/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/wm/__pycache__/awesome.cpython-312.pyc,, +powerline/bindings/wm/awesome.py,sha256=mFHelMeRS7Y0zTN8FOOFyCgLy9rAYMArdlJ-9qmTji0,1773 +powerline/bindings/zsh/__init__.py,sha256=ca0pbLjmpPWT6NWBRoi0XhZEXvOBygRRAbFSH8IVAQ4,5559 +powerline/bindings/zsh/__pycache__/__init__.cpython-312.pyc,, +powerline/bindings/zsh/powerline.zsh,sha256=OGK2wDuXdBbGWksJZhDpSpdDt6zmDtnimlZFuzGkpUM,6680 +powerline/colorscheme.py,sha256=En2pQE-hExE4NNWrJc2chnY8pKSdqLkT4cgWh7k8sDU,6356 +powerline/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/commands/__pycache__/__init__.cpython-312.pyc,, +powerline/commands/__pycache__/config.cpython-312.pyc,, +powerline/commands/__pycache__/daemon.cpython-312.pyc,, +powerline/commands/__pycache__/lemonbar.cpython-312.pyc,, +powerline/commands/__pycache__/lint.cpython-312.pyc,, +powerline/commands/__pycache__/main.cpython-312.pyc,, +powerline/commands/config.py,sha256=0w755lRs06_DmLOtUUkeHtNf0cXWiEZ8u_m_hccseHc,3943 +powerline/commands/daemon.py,sha256=nIAXrrMxVIfqaO9T-freTpzreiKAiwIeaKN57A60YmE,1203 +powerline/commands/lemonbar.py,sha256=YKv-sdm1S8gQBSgGPrpDz1RLz3Dmvzill4n-ug5Qp14,960 +powerline/commands/lint.py,sha256=WqSY2Mo-yHBEuwp1iB0l7XZ0RbtblVd10ZQUPjmi-78,782 +powerline/commands/main.py,sha256=-sO1UTNaWJfDhwuf065cjcnIPttsLgQXQUVaPKxfpGM,7102 +powerline/config.py,sha256=OLvRWmts34yPleQ4grfSue0m2b1r38q9HAcWy4Y5H6Q,378 +powerline/config_files/colors.json,sha256=gTilZEvJMB7VgaR9sqPlhuh2WwU6Y2rUInqWcCpv76I,13825 +powerline/config_files/colorschemes/default.json,sha256=w5sPCE0R6ULPZ5OyN-EfNmUVknOHOnQrJczwk-d8BjY,4034 +powerline/config_files/colorschemes/ipython/__main__.json,sha256=3A0gtfqooxa8NgpDCvsdLVj_Ts_kUJVjYxygc815qg8,108 +powerline/config_files/colorschemes/pdb/__main__.json,sha256=fZqc5rKVadYU0f8qzF-dfEXf4EUnI85sfg2lwLmDOCM,204 +powerline/config_files/colorschemes/pdb/default.json,sha256=mULVwjN5KbdOPBX7RSwkYt3hWLTGs4pWt0JFOpv2uXM,90 +powerline/config_files/colorschemes/pdb/solarized.json,sha256=_2399-dZGXgzYwsERJQSdqzablOYlMFY5Rv8R-Nvqx0,110 +powerline/config_files/colorschemes/shell/__main__.json,sha256=bMmasTlTMNVD7JES7UNBvMkVpTnmJGXR8C1_fghBMwI,287 +powerline/config_files/colorschemes/shell/default.json,sha256=FZ6EEWm8vY3-SkXSrOtuH7OR3q3vtgPq93JSfCqNMYM,526 +powerline/config_files/colorschemes/shell/solarized.json,sha256=rTw2_fQIkvUZ3zECrKjsDlsIIytGLNUTQi6XwxCk4w4,287 +powerline/config_files/colorschemes/solarized.json,sha256=AecXleKFHJ08fk1Jy9aWaiESlmczT2i5myZPNp375ng,3234 +powerline/config_files/colorschemes/tmux/default.json,sha256=4ZGEbiteAao1M-uh0l-DniA3ooou0Yy_lpSGz23nC5c,827 +powerline/config_files/colorschemes/tmux/solarized.json,sha256=A6u53LgitzpISL1PbfqyIzn-e_vt_4hkBJgrlKboAjE,975 +powerline/config_files/colorschemes/vim/__main__.json,sha256=0vWv_ElYejCdPLvWYwlqVoBj1NHR8hdphbHlhVL-xEw,1898 +powerline/config_files/colorschemes/vim/default.json,sha256=XCssH0VrZwcXaWUWs-uqc8GjfEDZQjJuLecsEWxew8U,5751 +powerline/config_files/colorschemes/vim/solarized.json,sha256=Mhyut7AAGdANwHMRhSNCqGzpZ_WpcH1d0yGYbPM1imM,7308 +powerline/config_files/colorschemes/vim/solarizedlight.json,sha256=l5KSVo67x8A4kUpwP2uxSu91PIpx12_bkzTMyt2tnP0,7370 +powerline/config_files/config.json,sha256=Nz7mX1CZT2Si9xNsbmZIkYqaUOcriS-3QLxQrm-xNPc,1085 +powerline/config_files/themes/ascii.json,sha256=c4gS2nfCnyt2xtmgQCfgEgeWqdMhg4pYaZ9MF86o7TI,2802 +powerline/config_files/themes/ipython/in.json,sha256=AFRzWaHMR-Jxr5-EaxJ3eS5kvNcxfFZ4vIazRG1x8eg,441 +powerline/config_files/themes/ipython/in2.json,sha256=jHbda0B8okwFrppjnt5F7r1pDlfZmNey646Dlg6lPSo,146 +powerline/config_files/themes/ipython/out.json,sha256=AvuQXwpG1quV4X83lTa4QxLFtMfT16S5PcLEoZDdzwQ,412 +powerline/config_files/themes/ipython/rewrite.json,sha256=7eWe1-M1SZMNuhmwfk8ZyT_rDVNrp37WvzY8lPBqzyQ,390 +powerline/config_files/themes/pdb/default.json,sha256=YtHs_V275lLBP4CJ6K1y5SWZ8VIPTrdwalH5Q0JnPfw,428 +powerline/config_files/themes/powerline.json,sha256=g5AwjK07wb7iKeBwXg73LL4eYToMghZC1CcEPUKTsfE,2787 +powerline/config_files/themes/powerline_terminus.json,sha256=5ZotCW0WovP5_ELLyIQz1f0Kd7cITjiWBQOq-XPd2Jk,2793 +powerline/config_files/themes/powerline_unicode7.json,sha256=Om9dy9k131I91Pf3w3VNLGP9JR24fPXCHdGsFL98Yag,3473 +powerline/config_files/themes/shell/__main__.json,sha256=UentPO6d_fPTLzGoSLWLV2XW7V93XiORJR4bb6c5LkI,147 +powerline/config_files/themes/shell/continuation.json,sha256=tlkwVk-mESTzA7becsa9ESN_ZQWSGk79uwcxg96DdWU,144 +powerline/config_files/themes/shell/default.json,sha256=I9al25oqMm3OB9i-oJTFZJoR335HhTUKlHDX4P_xDso,796 +powerline/config_files/themes/shell/default_leftonly.json,sha256=1CTifJCK_8Le-f3Z-IFeifAdassqhZS_nFa_DA3hrHA,635 +powerline/config_files/themes/shell/select.json,sha256=jvkut6Au6Na90H8-D4okw-lAPzzO2Y_bW6l-TKns_Zc,192 +powerline/config_files/themes/tmux/default.json,sha256=4Im0rfgNa0uvd6wEzEPy6OtU-cJzywY27ZlDoNt8x0A,498 +powerline/config_files/themes/unicode.json,sha256=ssO-IdtPd39b9Xfj4Am-xTz2NOoP643WtOKGyIhZpb8,2786 +powerline/config_files/themes/unicode_terminus.json,sha256=4n78w2nMKWyprqYERgjBVsN_3FKG2_N_2ucgBx-O9a8,2785 +powerline/config_files/themes/unicode_terminus_condensed.json,sha256=vk3U1cN0o08hpOueUgQH6uI5IZ7_sXaXec79yHXDZJg,2667 +powerline/config_files/themes/vim/__main__.json,sha256=LVOwJEC2WuzSBHvH-xF37c1JOLVFI0qEuhDOTxHZ9v0,106 +powerline/config_files/themes/vim/cmdwin.json,sha256=mcmvOtO0qHcb-T6mP46g-ShKbhH4FPaLDM3PdTMJbew,297 +powerline/config_files/themes/vim/default.json,sha256=37TpZllWHi7E4pkn50RbXCUGl6MGjUaakDshu5qaGrY,2475 +powerline/config_files/themes/vim/help.json,sha256=Mt26DhFdSiLunLM3ES2sIl3kbzcZVrqIG_uvYfcQsw4,618 +powerline/config_files/themes/vim/plugin_commandt.json,sha256=fGnBxCTrkaAerrLKdS8gCNSpxPTg-ABjQu3QP3XKWaw,474 +powerline/config_files/themes/vim/plugin_gundo-preview.json,sha256=VcnI5CeuT2IrV7RTXJY1_zXS56BDqpT5vpa_8djrCac,328 +powerline/config_files/themes/vim/plugin_gundo.json,sha256=d79HaLwYDU6Whosx6CcoDm_A_Zlzzw0NkNr22LSMFDg,328 +powerline/config_files/themes/vim/plugin_nerdtree.json,sha256=gVCDBnf4iNZQDpU74hTmxbX8I2q0c_s8SgYaODTyFGQ,293 +powerline/config_files/themes/vim/quickfix.json,sha256=SPlmLOiKebNdwZ58EI9rSAYab9ve0RNObrM9o0jIKuU,700 +powerline/config_files/themes/vim/tabline.json,sha256=6Z-8vbFxGmrAvH5fXXNCABqLP5gEhsO_272h2bCZxWY,1701 +powerline/config_files/themes/wm/default.json,sha256=wkNXPLWEAiCM5PhPB9N6fa7TzAUuYftFEnAgvPRuKVE,500 +powerline/dist/systemd/powerline-daemon.service,sha256=sJuTXtGPYazfUDD8kinEH0zFoe_PpcIqOkpDs6Uqoaw,273 +powerline/ipython.py,sha256=4ppy2iykXpjtLLaBoXEbhk4FX1HcBh0ROsadcWrJoOY,1687 +powerline/lemonbar.py,sha256=oYj8FRDLrg5S82DtTqLoWrbEZY3oV9-IqYtlhEDNNzE,560 +powerline/lib/__init__.py,sha256=ybY2S45XodNfOA8OJqRNo8sb9kWkvFmVV924QcVngIU,596 +powerline/lib/__pycache__/__init__.cpython-312.pyc,, +powerline/lib/__pycache__/config.cpython-312.pyc,, +powerline/lib/__pycache__/debug.cpython-312.pyc,, +powerline/lib/__pycache__/dict.cpython-312.pyc,, +powerline/lib/__pycache__/encoding.cpython-312.pyc,, +powerline/lib/__pycache__/humanize_bytes.cpython-312.pyc,, +powerline/lib/__pycache__/inotify.cpython-312.pyc,, +powerline/lib/__pycache__/memoize.cpython-312.pyc,, +powerline/lib/__pycache__/monotonic.cpython-312.pyc,, +powerline/lib/__pycache__/overrides.cpython-312.pyc,, +powerline/lib/__pycache__/path.cpython-312.pyc,, +powerline/lib/__pycache__/shell.cpython-312.pyc,, +powerline/lib/__pycache__/threaded.cpython-312.pyc,, +powerline/lib/__pycache__/unicode.cpython-312.pyc,, +powerline/lib/__pycache__/url.cpython-312.pyc,, +powerline/lib/config.py,sha256=7i6gmddF_tGgbN0C9UcXUlX3F92jW4G80JtVMusm2Rw,6210 +powerline/lib/debug.py,sha256=mLHmTUf9kvjcWq_oCFpGRCEkXgPGvASSJeYwrFc3ujY,3024 +powerline/lib/dict.py,sha256=VsBJRzJtE3qDhNdJCYRbwcDuDXqP8yu7H0RGLy4Y3_o,1943 +powerline/lib/encoding.py,sha256=Hl7Lrgb8xOsHjxSoYBflduPbchQVJ3p69G-gJl9KQTY,3263 +powerline/lib/humanize_bytes.py,sha256=2i7DURd0IgcTaRwDJVyXxzmsjJRiJXmuNUOx3LCAnww,808 +powerline/lib/inotify.py,sha256=HaXM3SjVNj2lX4JwDUn0z77DEuMNj4qEr6AC5Gp-9dM,6081 +powerline/lib/memoize.py,sha256=0noBcRaXd4rTGwoRDQ_qND_r1NSgsbK8qKuydyPI8AM,1235 +powerline/lib/monotonic.py,sha256=1AO_lYxiKza6GsyK2jWLC2SD5nDfoqGNpLqbmehz41Y,2721 +powerline/lib/overrides.py,sha256=c1HQOmbYUUJOLKwLczldQgJED5siEdVfShSRHXDp_88,1815 +powerline/lib/path.py,sha256=J9UQ7c_F5MASkv0zyaN8tzWyv5msmdgSHFwaOklIPmw,421 +powerline/lib/shell.py,sha256=S1BfEY7KaZhPrbgOSHIKiKv-kYnWnwxAtiCnSvT9EEE,4164 +powerline/lib/threaded.py,sha256=YpIdwndgfQC-MjdU5PxsDmdu7y6tw-CTq6s1FTPHZl0,7276 +powerline/lib/unicode.py,sha256=nKdvJREpmN2Ex-3-plFGzQAuWvFqa5rBAw5gJHOg6co,9268 +powerline/lib/url.py,sha256=FKBySrtwCc2mGInyf61rh5Sv3RDxz5CL6TmniN1TbXI,514 +powerline/lib/vcs/__init__.py,sha256=rdm81UTHCTXMCUnNLHBbocmWYN-DoVu7pJlpSFbi9F0,7621 +powerline/lib/vcs/__pycache__/__init__.cpython-312.pyc,, +powerline/lib/vcs/__pycache__/bzr.cpython-312.pyc,, +powerline/lib/vcs/__pycache__/git.cpython-312.pyc,, +powerline/lib/vcs/__pycache__/mercurial.cpython-312.pyc,, +powerline/lib/vcs/bzr.py,sha256=dFPr36COABRSFuko1096XzwtRx2ofqohHDTG5Zka9wM,2999 +powerline/lib/vcs/git.py,sha256=88FgfncnsLjsxjUVnMSzghK_nnXA4rzAESuuAmPK2S0,5975 +powerline/lib/vcs/mercurial.py,sha256=Jgzx_ruFwX7OMBjBTJ8YQWmSWAAtM_4pWIxUIoqTAA0,2678 +powerline/lib/watcher/__init__.py,sha256=TNzc6BIf8RIK8mSjRa8smzW_DM-Ovx0WmopILnRvO_Y,2796 +powerline/lib/watcher/__pycache__/__init__.cpython-312.pyc,, +powerline/lib/watcher/__pycache__/inotify.cpython-312.pyc,, +powerline/lib/watcher/__pycache__/stat.cpython-312.pyc,, +powerline/lib/watcher/__pycache__/tree.cpython-312.pyc,, +powerline/lib/watcher/__pycache__/uv.cpython-312.pyc,, +powerline/lib/watcher/inotify.py,sha256=gPeRgOMDrrsW9k0lXrxrKlQouRdmBWK-UMqIrHeskrU,7921 +powerline/lib/watcher/stat.py,sha256=V7_jb2l5cfh71xvfaDIuB3Xnx1EyizQ29mTW3xMRI3c,956 +powerline/lib/watcher/tree.py,sha256=BGAMlLaB52hGpVI2olPkmGdMdImkCGPxxmOBgMNCcu4,2572 +powerline/lib/watcher/uv.py,sha256=97hn-LQWlzVUixWpzZeGSjHf6i_JSAZwPAYmQ8S-oec,4854 +powerline/lint/__init__.py,sha256=0NTfOhzee6zin5hhYgnGZF2vn28WKc14EagiMUsQmjo,21363 +powerline/lint/__pycache__/__init__.cpython-312.pyc,, +powerline/lint/__pycache__/checks.cpython-312.pyc,, +powerline/lint/__pycache__/context.cpython-312.pyc,, +powerline/lint/__pycache__/imp.cpython-312.pyc,, +powerline/lint/__pycache__/inspect.cpython-312.pyc,, +powerline/lint/__pycache__/selfcheck.cpython-312.pyc,, +powerline/lint/__pycache__/spec.cpython-312.pyc,, +powerline/lint/checks.py,sha256=-zkw6THzJtBXEbaSwp1_XCgqNGHCc3J1zsCg7Bt33mM,29244 +powerline/lint/context.py,sha256=wb4S4Z449LXUQ9aOdwUaId4gVnhQIm9MFVOSakrXX80,2046 +powerline/lint/imp.py,sha256=p3GB4I3bVL1gezlTeiT4GEf7sD8NkfnX4pWIfnKKhzQ,1876 +powerline/lint/inspect.py,sha256=CUHYLKfWXNgVbLQ9qEjKVj7EYbkWR8e6MmMobIOi4WU,1704 +powerline/lint/markedjson/__init__.py,sha256=GHS-laZyga74Xi0w3lUW0tZRdgSW2AZIpB27W-cwEOQ,552 +powerline/lint/markedjson/__pycache__/__init__.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/composer.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/constructor.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/error.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/events.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/loader.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/markedvalue.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/nodes.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/parser.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/reader.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/resolver.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/scanner.cpython-312.pyc,, +powerline/lint/markedjson/__pycache__/tokens.cpython-312.pyc,, +powerline/lint/markedjson/composer.py,sha256=yhUkR9XneZmxi6FzVnavtlUkU-kr4ebat0_8JKPwvEU,3589 +powerline/lint/markedjson/constructor.py,sha256=IH73Kumw91zVSLXnUFctMNKEapuVi1SXlyqhjSdlixo,7767 +powerline/lint/markedjson/error.py,sha256=vllFjKY9d5ANxWwkaO5lZgfRhIVyUSYHxMyTObHaREw,6948 +powerline/lint/markedjson/events.py,sha256=V7Gx1Y7qifj0fPaHDEzcUscFXwWHtyjW-Ksp-O_4d2I,2157 +powerline/lint/markedjson/loader.py,sha256=F6fZ6jg8lSYzkXFYEbMJnRMfSTshx11SmBQy1m5UXCk,879 +powerline/lint/markedjson/markedvalue.py,sha256=bdo2n3iPQxsLnqgs87U0CZn7zRcB-3-peIma0VTX4Rc,3548 +powerline/lint/markedjson/nodes.py,sha256=A1jE5ZS6AZBtrRi0G2RP_hLUShFEphKQqZsRoeLv9-M,1309 +powerline/lint/markedjson/parser.py,sha256=OQ7LW2Mw5nXOZmnY2dUHx6DqqFPTAwKla61tlpfrd3A,8124 +powerline/lint/markedjson/reader.py,sha256=iiZfGpQVAGsYiRV7GExwDIu9nt-egWlr0sszVymdc6k,4047 +powerline/lint/markedjson/resolver.py,sha256=q_6LKnxIznBBphAa6mMPVbVttPGox6nxTysQ85X8K64,3880 +powerline/lint/markedjson/scanner.py,sha256=LZ8mK7JeU6U1rFVmqEB1WIEDid22qsn--qhC3Vkuyf0,14219 +powerline/lint/markedjson/tokens.py,sha256=eKQJVOF2bupR-47Zarw2WAunpLzUxm4Ac8uihehz0G0,1319 +powerline/lint/selfcheck.py,sha256=_4Awt3l9_ysO6RnxEYy6KXE72lJhcHMXNsT0T5RuRYc,606 +powerline/lint/spec.py,sha256=MH6fCtdKqn3pt9XpNm5_QyT4Tu2C4QsozSzzfiUtY4g,23514 +powerline/listers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/listers/__pycache__/__init__.cpython-312.pyc,, +powerline/listers/__pycache__/i3wm.cpython-312.pyc,, +powerline/listers/__pycache__/pdb.cpython-312.pyc,, +powerline/listers/__pycache__/vim.cpython-312.pyc,, +powerline/listers/i3wm.py,sha256=zPG3kOkxF92_EAM6lu-jc-7ehlUlK5becDZl-gW1o_U,1866 +powerline/listers/pdb.py,sha256=E0cdeqJJkJHrD6IVkQw2LIjRDc0vaquLqdby5byRQ4w,984 +powerline/listers/vim.py,sha256=sk89nbMjoMU7XHvjH41lVmR9g9CE2VYFgqSm-C7ybM0,3819 +powerline/matchers/__init__.py,sha256=ip96xwRq4jc1fWAFrUjksQ0MyrY0clAGaKEPntRhAd8,192 +powerline/matchers/__pycache__/__init__.cpython-312.pyc,, +powerline/matchers/vim/__init__.py,sha256=BueTiyWuUIotNe-Pq88NkzYeP-EI8iOlMM6NKAsTT-4,495 +powerline/matchers/vim/__pycache__/__init__.cpython-312.pyc,, +powerline/matchers/vim/plugin/__init__.py,sha256=ip96xwRq4jc1fWAFrUjksQ0MyrY0clAGaKEPntRhAd8,192 +powerline/matchers/vim/plugin/__pycache__/__init__.cpython-312.pyc,, +powerline/matchers/vim/plugin/__pycache__/commandt.cpython-312.pyc,, +powerline/matchers/vim/plugin/__pycache__/gundo.cpython-312.pyc,, +powerline/matchers/vim/plugin/__pycache__/nerdtree.cpython-312.pyc,, +powerline/matchers/vim/plugin/commandt.py,sha256=lctjEpONmRDw8s3pIQQKORBE2cEB3de_zBp-iljX1oM,383 +powerline/matchers/vim/plugin/gundo.py,sha256=CaqDfQ_KV0_8GPvKE2zvc1Vch524Y8p_ZWEyWMwjx0c,424 +powerline/matchers/vim/plugin/nerdtree.py,sha256=NhHk99gDkcJS3CjidlatZKj-8gEMU9oCCyhgwuWP7hY,355 +powerline/pdb.py,sha256=8u1zBDdrZmF5TIo02zDpiAintfoqbIs8NeUFVStlnqc,1475 +powerline/renderer.py,sha256=VhIsTVQ8kMW4kHEdHZR8lt1Z0nx4vsdmYAfs9wSMkEM,20587 +powerline/renderers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/renderers/__pycache__/__init__.cpython-312.pyc,, +powerline/renderers/__pycache__/i3bar.cpython-312.pyc,, +powerline/renderers/__pycache__/lemonbar.cpython-312.pyc,, +powerline/renderers/__pycache__/pango_markup.cpython-312.pyc,, +powerline/renderers/__pycache__/pdb.cpython-312.pyc,, +powerline/renderers/__pycache__/tmux.cpython-312.pyc,, +powerline/renderers/__pycache__/vim.cpython-312.pyc,, +powerline/renderers/i3bar.py,sha256=ki85GqThA8V_SeINRDBuOQSc8yJf9bUmNVw7dc5r00s,900 +powerline/renderers/ipython/__init__.py,sha256=1jbx5bgIdqti2pZEDjGpzDzVXYWBQ_MVTBFYVLV3gI0,903 +powerline/renderers/ipython/__pycache__/__init__.cpython-312.pyc,, +powerline/renderers/ipython/__pycache__/pre_5.cpython-312.pyc,, +powerline/renderers/ipython/__pycache__/since_5.cpython-312.pyc,, +powerline/renderers/ipython/pre_5.py,sha256=Kx8VaP1O_NiaEiRJNuhQo9_bRljDlVEFZMg8mMu5JyI,1875 +powerline/renderers/ipython/since_5.py,sha256=bUNQdrP0mZscpQzaBmhRwXcAi7LUEJfpdcOeDonA0uw,3385 +powerline/renderers/lemonbar.py,sha256=R5la61s1f13_sp7nB1hGl1P7IKF3kjUm3I-vUyc-LGU,1810 +powerline/renderers/pango_markup.py,sha256=GplF7EMeZs1uROAp8pq7TYUBjBEjBiZ-OrNOu6NuGEw,1251 +powerline/renderers/pdb.py,sha256=iQ8Mfbg3Qs6nZ2cx_b0GfeFXULiVD4WOr_7oTrwmsGs,1431 +powerline/renderers/shell/__init__.py,sha256=KDXxJ6d_f6uHZfu-t_Y4IU0gy4JFlTSNxCOHe7GnHRo,5235 +powerline/renderers/shell/__pycache__/__init__.cpython-312.pyc,, +powerline/renderers/shell/__pycache__/bash.cpython-312.pyc,, +powerline/renderers/shell/__pycache__/ksh.cpython-312.pyc,, +powerline/renderers/shell/__pycache__/rcsh.cpython-312.pyc,, +powerline/renderers/shell/__pycache__/readline.cpython-312.pyc,, +powerline/renderers/shell/__pycache__/tcsh.cpython-312.pyc,, +powerline/renderers/shell/__pycache__/zsh.cpython-312.pyc,, +powerline/renderers/shell/bash.py,sha256=wvAjTulqUkuwZ7Kk-ZctGaiznlaw4_gpziuS17-BihU,535 +powerline/renderers/shell/ksh.py,sha256=cTiRDpAiCzcSYC1mJKC-pCRO1A2zpWz0kObgWThNvyY,473 +powerline/renderers/shell/rcsh.py,sha256=-7OksGhKeKKfAlQOObm2LBeHTOgsWAYgb_nByJu9mdk,210 +powerline/renderers/shell/readline.py,sha256=xis-_uZfRyf3jUZw3z27-X7cwu-qdwhiqDmJl1Vw_Eo,354 +powerline/renderers/shell/tcsh.py,sha256=sp4JeHCQN7GMNFwUdNzKPz_9X4U7DOZorcqektJzUt8,1119 +powerline/renderers/shell/zsh.py,sha256=okM9vrdadiqTJzH9YVUOtIepFvTZJXf2BJeVr3OZHeQ,445 +powerline/renderers/tmux.py,sha256=Xr1DriSTIXOp80GJKWn3OoAvygAcA9KLFiMCMLzEoYo,2201 +powerline/renderers/vim.py,sha256=uWvI-QM_GP-oen_EwlvYMrr3XS88rw4EwlwiZ3vVXQQ,5785 +powerline/segment.py,sha256=15Kii41kvxVKPFzOeydZnDLqEUctIq3oj6_JNkCdyzU,13488 +powerline/segments/__init__.py,sha256=7fHFg6DMuhgBTeO_vfgTOO3yr0m01hS0xeKL3858ClQ,1687 +powerline/segments/__pycache__/__init__.cpython-312.pyc,, +powerline/segments/__pycache__/i3wm.cpython-312.pyc,, +powerline/segments/__pycache__/ipython.cpython-312.pyc,, +powerline/segments/__pycache__/pdb.cpython-312.pyc,, +powerline/segments/__pycache__/shell.cpython-312.pyc,, +powerline/segments/__pycache__/tmux.cpython-312.pyc,, +powerline/segments/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/segments/common/__pycache__/__init__.cpython-312.pyc,, +powerline/segments/common/__pycache__/bat.cpython-312.pyc,, +powerline/segments/common/__pycache__/env.cpython-312.pyc,, +powerline/segments/common/__pycache__/mail.cpython-312.pyc,, +powerline/segments/common/__pycache__/net.cpython-312.pyc,, +powerline/segments/common/__pycache__/players.cpython-312.pyc,, +powerline/segments/common/__pycache__/sys.cpython-312.pyc,, +powerline/segments/common/__pycache__/time.cpython-312.pyc,, +powerline/segments/common/__pycache__/vcs.cpython-312.pyc,, +powerline/segments/common/__pycache__/wthr.cpython-312.pyc,, +powerline/segments/common/bat.py,sha256=WPlGqyKdzjdUm6gAQoQTN60GNt6aPj6b2y0pxpP7gSc,10782 +powerline/segments/common/env.py,sha256=Tywi3DMdfvFqF151W_kS3vDSbaQoOFUcskw9FwvioLE,5687 +powerline/segments/common/mail.py,sha256=yXX1ExWwW9HR8mPgUU8Wwt2AApIhm5wqawK7YBlbRDk,2474 +powerline/segments/common/net.py,sha256=hddUbzn9feolec2mDRcshZH4Gi8wJF6W2bOxMRvKMMg,9864 +powerline/segments/common/players.py,sha256=YcIEwsVUt4oFlVW78iUnyz3g0Xn4MDMylU4uqjbXRNc,17677 +powerline/segments/common/sys.py,sha256=1AmKHbgF9bge3mXS4eejbloSKPPHLhv5Uz37DHWIKBc,5645 +powerline/segments/common/time.py,sha256=4lQIuE4T8a-i2gmnirHFQmotSM4Bn0OHJL6apBinNhU,2205 +powerline/segments/common/vcs.py,sha256=41F4SZ1ngbCfVhOG_GzgSkK5LPbN1VS7Ml-sR2kmyeg,2758 +powerline/segments/common/wthr.py,sha256=spU10WyraCp05PTTJwJxCHboz6DDpGNBtq2tVPOQLmE,8203 +powerline/segments/i3wm.py,sha256=1TlekX3m1C_hVx61NK39Ozb9M0wXf1FSf5jI2vHAdgo,4123 +powerline/segments/ipython.py,sha256=TX-6onAXjhJFXMsdQOGnDytSrT0nT1N6s69bZyaMgZY,277 +powerline/segments/pdb.py,sha256=-AF_KxMQ8dPBaum8H--yxLPwWr721t9CL5r0hVvyJ_I,1611 +powerline/segments/shell.py,sha256=FE5V87MJtltMNtNz5AOry8GKRP6YI00WvjT5_Zr18b8,5215 +powerline/segments/tmux.py,sha256=UCXWF1SQlMnoIR_KpHmniaGsXd0NMDQEzz1KUZn0EAs,799 +powerline/segments/vim/__init__.py,sha256=XjYRpj7noYor23wIUiXVKeBpTfnoPO2w-g9bSkimL-0,24115 +powerline/segments/vim/__pycache__/__init__.cpython-312.pyc,, +powerline/segments/vim/plugin/__init__.py,sha256=ip96xwRq4jc1fWAFrUjksQ0MyrY0clAGaKEPntRhAd8,192 +powerline/segments/vim/plugin/__pycache__/__init__.cpython-312.pyc,, +powerline/segments/vim/plugin/__pycache__/ale.cpython-312.pyc,, +powerline/segments/vim/plugin/__pycache__/capslock.cpython-312.pyc,, +powerline/segments/vim/plugin/__pycache__/commandt.cpython-312.pyc,, +powerline/segments/vim/plugin/__pycache__/nerdtree.cpython-312.pyc,, +powerline/segments/vim/plugin/__pycache__/syntastic.cpython-312.pyc,, +powerline/segments/vim/plugin/__pycache__/tagbar.cpython-312.pyc,, +powerline/segments/vim/plugin/ale.py,sha256=kQBRcM3tDo1k_49Tu_wiFQmGNdVhYrAjQeWbEY3X334,1558 +powerline/segments/vim/plugin/capslock.py,sha256=vnVEXijHKm5IQtPxKoMEVceq3B1o0la9geECZg29fgE,940 +powerline/segments/vim/plugin/commandt.py,sha256=na8R4jQW7kXCpXE_o_DnNpsEJdBXQ7e4kgwmqvXZRa0,2624 +powerline/segments/vim/plugin/nerdtree.py,sha256=qbo3a2sJGd8WVfW2Ch78mTmcMgJB60lsn1FFhnJVHUU,645 +powerline/segments/vim/plugin/syntastic.py,sha256=T2L71Az8GFt8dmKF-WMGmoSXlXW4CKpcwVByRrJZOT4,1361 +powerline/segments/vim/plugin/tagbar.py,sha256=OLEjLthIpFzbLmkpi6XxSRuFR8p5qOeWWiLsMlE2rk4,1423 +powerline/selectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline/selectors/__pycache__/__init__.cpython-312.pyc,, +powerline/selectors/__pycache__/vim.cpython-312.pyc,, +powerline/selectors/vim.py,sha256=EKHX_ypy-ACT9-awzUbAZHz8mqZP2bXR-YE3DK1Wecw,294 +powerline/shell.py,sha256=mKWy9UWDUgY8YP4h3Vsn76QTg8h9YEVlVVxqXglEr_U,1103 +powerline/theme.py,sha256=-mEVwqPeQQZiUsqXbMeRK6wufn4qcN2Ony7H9lq1xQE,5429 +powerline/vim.py,sha256=-ItslbHpAhnFYBDMvHPOpyCjz1qZZNMTNRa9Nmp3HDA,11482 +powerline_status-2.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +powerline_status-2.7.dist-info/METADATA,sha256=QO1ra8YkyoXN10YnhRrFv9ToCIt-_J6o1ACDsczx7dg,5405 +powerline_status-2.7.dist-info/RECORD,, +powerline_status-2.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +powerline_status-2.7.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91 +powerline_status-2.7.dist-info/top_level.txt,sha256=yOtI5-1MUJDdEB5ZZTfROhrEsXn91DIMg4qb6CcEmd0,10 diff --git a/powerline-bin/powerline_status-2.7.dist-info/REQUESTED b/powerline-bin/powerline_status-2.7.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/powerline-bin/powerline_status-2.7.dist-info/WHEEL b/powerline-bin/powerline_status-2.7.dist-info/WHEEL new file mode 100644 index 0000000..0fde4dd --- /dev/null +++ b/powerline-bin/powerline_status-2.7.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (74.1.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/powerline-bin/powerline_status-2.7.dist-info/top_level.txt b/powerline-bin/powerline_status-2.7.dist-info/top_level.txt new file mode 100644 index 0000000..f2ffc12 --- /dev/null +++ b/powerline-bin/powerline_status-2.7.dist-info/top_level.txt @@ -0,0 +1 @@ +powerline diff --git a/tmux-powerline/config.sh b/tmux-powerline/config.sh old mode 100755 new mode 100644 diff --git a/tmux-powerline/themes/tablet.sh b/tmux-powerline/themes/tablet.sh old mode 100755 new mode 100644 diff --git a/tmux.conf.not b/tmux.conf.not old mode 100755 new mode 100644 diff --git a/tmux/tmux.conf b/tmux/tmux.conf old mode 100755 new mode 100644