def __init__(self): # configuration self.dot_folder = path.realpath(vim.eval('expand(spectrum#inspiration_storage_dir)')) self.dot_folder_colors = path.join(self.dot_folder, 'colors') self.inspiration_endpoint = vim.eval("spectrum#inspiration_endpoint") self.max_history_size = int(vim.eval("spectrum#max_history")) self.vote_filename = path.join(self.dot_folder, 'votes.json') self.excluded_filename = path.join(self.dot_folder, 'excluded.json') self._colorschemes = self._get_all_colorschemes() self._voted_colorschemes = self._get_voted_colorschemes() self._excluded = set(self._get_excluded_colorschemes()) self._history = HistoryQueue(self.max_history_size) self._history.set_current(self._current()) self._choice = Choice(self._colorschemes, self._voted_colorschemes, exclude=set(self._excluded)) # create necessary folders if not path.exists(self.dot_folder): makedirs(self.dot_folder) if not path.exists(self.dot_folder_colors): makedirs(self.dot_folder_colors) rtp = vim.eval('&rtp').split(',') vim.command("set rtp+=%s" % self.dot_folder)
class Spectrum(object): def __init__(self): # configuration self.dot_folder = path.realpath(vim.eval('expand(spectrum#inspiration_storage_dir)')) self.dot_folder_colors = path.join(self.dot_folder, 'colors') self.inspiration_endpoint = vim.eval("spectrum#inspiration_endpoint") self.max_history_size = int(vim.eval("spectrum#max_history")) self.vote_filename = path.join(self.dot_folder, 'votes.json') self.excluded_filename = path.join(self.dot_folder, 'excluded.json') self._colorschemes = self._get_all_colorschemes() self._voted_colorschemes = self._get_voted_colorschemes() self._excluded = set(self._get_excluded_colorschemes()) self._history = HistoryQueue(self.max_history_size) self._history.set_current(self._current()) self._choice = Choice(self._colorschemes, self._voted_colorschemes, exclude=set(self._excluded)) # create necessary folders if not path.exists(self.dot_folder): makedirs(self.dot_folder) if not path.exists(self.dot_folder_colors): makedirs(self.dot_folder_colors) rtp = vim.eval('&rtp').split(',') vim.command("set rtp+=%s" % self.dot_folder) def shuffle(self): colorscheme = self._choice.next() self._history.set_current(colorscheme) self._set_scheme(self._history.current()) def previous(self): try: self._set_scheme(self._history.previous()) except StandardError as e: print e def next(self): try: self._set_scheme(self._history.next()) except StandardError as e: print e def like(self): """vote up the current colorscheme""" current = self._current() self._voted_colorschemes[current] = \ self._voted_colorschemes.get(current, 0) + 1 try: self._save(self.vote_filename, self._voted_colorschemes) print "Your vote for '%s' has been recorded." % current if current in self._excluded: self._excluded.remove(current) self._save(self.excluded_filename, self._excluded) except Exception as e: print e def exclude(self): """exclude the current colorscheme""" current = self._current() self._excluded.add(current) try: self._save(self.excluded_filename, self._excluded) print "'%s' has been excluded" % current if current in self._voted_colorschemes: del self._voted_colorschemes[current] self._save(self.vote_filename, self._voted_colorschemes) except Exception as e: print e def inspect(self): print str(self._history) def inspiration(self, style='dark'): """`style` is either 'dark' or 'bright'""", seed = {'seed': \ 100000+int(399999*random())+500000 if style=='dark' else 0} endpoint = self.inspiration_endpoint % seed try: colorscheme_name = 'inspiration%(seed)s' % seed fetch(endpoint, path.join(self.dot_folder_colors, colorscheme_name + '.vim')) self._history.set_current(colorscheme_name) self._set_scheme(self._history.current()) except Exception as e: print e def purge_inspiration(self): """Clean all downloaded inspiration colorschemes""" for root, dirs, files in walk(self.dot_folder_colors): for file in filter(lambda f: path.isfile(f), [path.join(root, f) for f in files]): unlink(file) print "%s deleted." % file def show_excluded_colorschemes(self): print self._excluded def show_favorite_colorschemes(self, count=5): """Show the top `count` colorschemes""" self._voted_colorschemes favs = sorted(self._voted_colorschemes.iteritems(), key=itemgetter(1), reverse=True) print "\n".join([cs for (cs,cnt) in favs[:count]]) def _set_scheme(self, colorscheme): try: vim.command("colorscheme %s" % colorscheme) print "switched colorscheme to: '%s'" % colorscheme print "" except vim.error: print "colorscheme %s is not available" % colorscheme if colorscheme in self._voted_colorschemes.keys(): del self._voted_colorschemes[colorscheme] self._save(self.vote_filename, self._voted_colorschemes) def _get_all_colorschemes(self): retval = set() rtp = vim.eval('&rtp').split(',') for p in filter(path.exists, (path.join(p, 'colors') for p in rtp)): colorscheme = [_get_colorscheme_name(file_name) for file_name in filter(_is_vim_file, listdir(p))] retval |= set(colorscheme) return retval def _get_voted_colorschemes(self): if path.exists(self.vote_filename): return self._load(self.vote_filename) else: return self._save(self.vote_filename, {}) def _get_excluded_colorschemes(self): if path.exists(self.excluded_filename): return self._load(self.excluded_filename) else: return self._save(self.excluded_filename, []) def _current(self): return vim.eval('g:colors_name') def _save(self, filename, obj): if not path.exists(path.dirname(filename)): makedirs(path.dirname(filename)) with open(filename, 'w') as f: if isinstance(obj, set): obj = list(obj) json.dump(obj, f) return obj def _load(self, filename): with open(filename, 'r') as f: return json.load(f)