Mercurial > addons > weechat-scripts > weechat-terminal-title-script
diff terminal-title.py @ 0:c54a46719c46
Initial revision
author | Guido Berhoerster <guido+weechat@berhoerster.name> |
---|---|
date | Tue, 10 Mar 2015 22:40:28 +0100 |
parents | |
children | 98c1a683d9c1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/terminal-title.py Tue Mar 10 22:40:28 2015 +0100 @@ -0,0 +1,126 @@ +# +# Copyright (C) 2010 by Guido Berhoerster <guido+weechat@berhoerster.name> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +import os +import sys +import re +import string +from collections import Mapping +import weechat + +SCRIPT_NAME = 'terminal-title' +VERSION = '1' +AUTHOR = 'Guido Berhoerster' +DESCRIPTION = 'Displays user defined information in the terminal title' +DEFAULT_SETTINGS = { + 'title': ('WeeChat %version [%buffer_count] %buffer_number: ' + '%buffer_name{%buffer_nicklist_count} [%hotlist]', + 'items displayed in the terminal title') +} +TERM_TEMPLATES = [ + ('xterm', "\033]0;%s\007"), + ('screen', "\033_%s\033\\") +] +TERM_TEMPLATE = None + + +class TermTitleMapping(Mapping): + substitutions = { + 'buffer_title': + lambda : weechat.buffer_get_string(weechat.current_buffer(), + "title"), + 'buffer_name': + lambda : weechat.buffer_get_string(weechat.current_buffer(), + "name"), + 'buffer_plugin': + lambda : weechat.buffer_get_string(weechat.current_buffer(), + "plugin"), + 'buffer_number': + lambda : weechat.buffer_get_integer(weechat.current_buffer(), + "number"), + 'buffer_nicklist_count': + lambda : weechat.buffer_get_integer(weechat.current_buffer(), + "nicklist_visible_count"), + 'buffer_count': lambda : buffer_count(), + 'hotlist': lambda : hotlist(), + 'version': lambda : weechat.info_get("version", "") + } + + def __getitem__(self, key): + return self.substitutions[key]() + + def __iter__(self): + return self.substitutions.iterkeys() + + def __len__(self): + return len(self.substitutions) + + +class TermTitleTemplate(string.Template): + delimiter = '%' + + +def buffer_count(): + buffer_count = 0 + buffer = weechat.infolist_get("buffer", "", "") + while weechat.infolist_next(buffer): + buffer_count += 1 + weechat.infolist_free(buffer) + return buffer_count + +def hotlist(): + hotlist_items = [] + hotlist = weechat.infolist_get("hotlist", "", "") + while weechat.infolist_next(hotlist): + buffer_number = weechat.infolist_integer(hotlist, "buffer_number") + buffer = weechat.infolist_pointer(hotlist, "buffer_pointer") + short_name = weechat.buffer_get_string(buffer, "short_name") + hotlist_items.append("%s:%s" % (buffer_number, short_name)) + weechat.infolist_free(hotlist) + return ",".join(hotlist_items) + +def set_term_title_hook(data, signal, signal_data): + title_template_str = weechat.config_get_plugin("title") + if not title_template_str: + return weechat.WEECHAT_RC_OK + + title_template = TermTitleTemplate(title_template_str) + title_str = title_template.safe_substitute(TermTitleMapping()) + sys.__stdout__.write(TERM_TEMPLATE % title_str) + sys.__stdout__.flush() + + return weechat.WEECHAT_RC_OK + + +if __name__ == '__main__': + weechat.register(SCRIPT_NAME, AUTHOR, VERSION, 'GPL3', DESCRIPTION, '', '') + + for option, (value, description) in DEFAULT_SETTINGS.iteritems(): + if not weechat.config_is_set_plugin(option): + weechat.config_set_plugin(option, value) + weechat.config_set_desc_plugin(option, '%s (default: "%s")' % + (description, value)) + + term = os.environ.get("TERM", None) + if term: + for term_name, term_template in TERM_TEMPLATES: + if term.startswith(term_name): + TERM_TEMPLATE = term_template + for hook in ["buffer_switch", "buffer_title_changed", + "hotlist_changed", "upgrade_ended"]: + weechat.hook_signal(hook, "set_term_title_hook", "") + set_term_title_hook("", "", "") + break