import sublime, sublime_plugin import os.path import string import functools class SetUnsavedViewName(sublime_plugin.EventListener): setting_name = False dropped_chars = string.whitespace pending = 0 def on_modified(self, view): if view.file_name() or view.is_loading(): return if self.setting_name: return self.pending += 1 sublime.set_timeout(functools.partial(self.update_title, view), 20) def update_title(self, view): self.pending -= 1 if self.pending != 0: return if view.settings().get('set_unsaved_view_name') == False: return cur_name = view.settings().get('auto_name') view_name = view.name() # Only set the name for plain text files syntax = view.settings().get('syntax') if syntax != 'Packages/Text/Plain text.tmLanguage': if cur_name: # Undo any previous name that was set view.settings().erase('auto_name') if cur_name == view_name: view.set_name("") return # Name has been explicitly set, don't override it if not cur_name and view_name: return # Name has been explicitly changed, don't override it if cur_name and cur_name != view.name(): view.settings().erase('auto_name') return # Don't set the names on widgets, it'll just trigger spurious # on_modified callbacks if view.settings().get('is_widget'): return line = view.line(0) if line.size() > 50: line = sublime.Region(0, 50) first_line = view.substr(line) first_line = first_line.strip(self.dropped_chars) self.setting_name = True view.set_name(first_line) self.setting_name = False view.settings().set('auto_name', first_line)