diff --git a/latex_cite_completions.py b/latex_cite_completions.py index b079c472..f61cf8f3 100644 --- a/latex_cite_completions.py +++ b/latex_cite_completions.py @@ -271,6 +271,22 @@ def _find_bib_files(): return cache.LocalCache(root).cache('bib_files', _find_bib_files) +def find_open_bib_files(active_window_only=False): + # get list of windows we want to check for valid buffers + if active_window_only: + windows = [sublime.active_window()] + else: + windows = sublime.windows() + + # find which buffers are .bib files + result = [] + for window in windows: + result += [v.file_name() for v in window.views() if (v.file_name() or '').endswith('.bib')] + + # remove duplicates + return list(set(result)) + + def run_plugin_command(command, *args, **kwargs): ''' This function is intended to run a command against a user-configurable list @@ -389,13 +405,19 @@ def get_cite_completions(view): if root is None: # This is an unnamed, unsaved file - # FIXME: should probably search the buffer instead of giving up - raise NoBibFilesError() - - print(u"TEX root: " + repr(root)) - bib_files = find_bib_files(root) - print("Bib files found: ") - print(repr(bib_files)) + bib_files = None + else: + print(u"TEX root: " + repr(root)) + bib_files = find_bib_files(root) + print("Bib files found: ") + print(repr(bib_files)) + + if not bib_files: + # Check the open files, in case the current file is TEX root, + # but doesn't reference anything + bib_files = find_open_bib_files() + print("Open Bib files found: ") + print(repr(bib_files)) if not bib_files: # sublime.error_message("No bib files found!") # here we can! diff --git a/latex_ref_completions.py b/latex_ref_completions.py index c4223de9..81ff86a2 100644 --- a/latex_ref_completions.py +++ b/latex_ref_completions.py @@ -55,6 +55,15 @@ def find_labels_in_files(root, labels): labels.append(command.args) +# grab labels from all open buffers too +def find_labels_in_open_files(views, labels): + for view in views: + # XXX: Hardcoded to only look for tex files, so that it doesn't try + # looking for label commands in support files + if view.file_name() is None or view.file_name().endswith(".tex"): + view.find_all(r'\\label\{([^\{\}]+)\}', 0, '\\1', labels) + + # get_ref_completions forms the guts of the parsing shared by both the # autocomplete plugin and the quick panel command def get_ref_completions(view): @@ -62,7 +71,13 @@ def get_ref_completions(view): # Check the file buffer first: # 1) in case there are unsaved changes # 2) if this file is unnamed and unsaved, get_tex_root will fail - view.find_all(r'\\label\{([^\{\}]+)\}', 0, '\\1', completions) + find_labels_in_open_files([view], completions) + + # Check all other open buffers too: + # 1) for the same reasons as above + # 2) in case the project isn't set up to build in Sublime + for window in sublime.windows(): + find_labels_in_open_files(window.views(), completions) root = getTeXRoot.get_tex_root(view) if root: