From f20bad4fc4dfb0f026fc584aeb0f30d1aea86272 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 4 Apr 2017 15:55:00 +1200 Subject: [PATCH 1/3] Fix #1070: Autocomplete for \cite{} now looks in the open buffers for .bib files before giving up when it can't find any linked .bib files --- latex_cite_completions.py | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/latex_cite_completions.py b/latex_cite_completions.py index b079c472..06cae352 100644 --- a/latex_cite_completions.py +++ b/latex_cite_completions.py @@ -271,6 +271,23 @@ 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().endswith(".bib")] + print("find_open_bib_files: windows = %d, result = %d" % (len(windows), len(result))) + + # 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 @@ -387,15 +404,18 @@ def _run_command(plugin_name): def get_cite_completions(view): root = getTeXRoot.get_tex_root(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)) + if root is not None: + # Provided this isn't an unnamed and unsaved file... + 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 theopen 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! From 9890a1396951f6f27020d65a06d4c9a04dca9e9f Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 4 Apr 2017 16:17:54 +1200 Subject: [PATCH 2/3] Fix #1070: Autocomplete for \ref{} now looks in the open buffers too --- latex_ref_completions.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/latex_ref_completions.py b/latex_ref_completions.py index c4223de9..906b79fe 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().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: From 3a82537354b42b68377c00e1a826cae56a8ad8f8 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 4 Apr 2017 19:27:47 +1200 Subject: [PATCH 3/3] Fixes for errors with unsaved/unnamed files and buffers --- latex_cite_completions.py | 12 +++++++----- latex_ref_completions.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/latex_cite_completions.py b/latex_cite_completions.py index 06cae352..f61cf8f3 100644 --- a/latex_cite_completions.py +++ b/latex_cite_completions.py @@ -281,8 +281,7 @@ def find_open_bib_files(active_window_only=False): # find which buffers are .bib files result = [] for window in windows: - result += [v.file_name() for v in window.views() if v.file_name().endswith(".bib")] - print("find_open_bib_files: windows = %d, result = %d" % (len(windows), len(result))) + result += [v.file_name() for v in window.views() if (v.file_name() or '').endswith('.bib')] # remove duplicates return list(set(result)) @@ -404,15 +403,18 @@ def _run_command(plugin_name): def get_cite_completions(view): root = getTeXRoot.get_tex_root(view) - if root is not None: - # Provided this isn't an unnamed and unsaved file... + if root is None: + # This is an unnamed, unsaved file + 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 theopen files, in case the current file is TEX root, but doesn't reference anything + # 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)) diff --git a/latex_ref_completions.py b/latex_ref_completions.py index 906b79fe..81ff86a2 100644 --- a/latex_ref_completions.py +++ b/latex_ref_completions.py @@ -60,7 +60,7 @@ 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().endswith(".tex"): + if view.file_name() is None or view.file_name().endswith(".tex"): view.find_all(r'\\label\{([^\{\}]+)\}', 0, '\\1', labels)