From d0b34f05f477c42662aafda4896b5ab9356881ed Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Wed, 17 May 2017 21:52:30 +0200 Subject: [PATCH] BUGFIX: Allow writing multiple files at once * As neovim will use the same object we can't save file specific information in self. * Also no locking is required --- readme.rst | 8 +++---- requirements.py | 1 - rplugin/python3/neotags.py | 46 +++++++++++++++++++++----------------- 3 files changed, 28 insertions(+), 27 deletions(-) delete mode 100644 requirements.py diff --git a/readme.rst b/readme.rst index 7b61666..144ef86 100644 --- a/readme.rst +++ b/readme.rst @@ -7,12 +7,10 @@ Makes use of neovims async plugin API, so non blocking. Will not use some checks but lookup the whole path to find tags file. -Install -======= +Requirements +============ -Install python requirements in python3:: - - pip3 install -r requirements.txt +- Python3 TODO ==== diff --git a/requirements.py b/requirements.py deleted file mode 100644 index 983979e..0000000 --- a/requirements.py +++ /dev/null @@ -1 +0,0 @@ -locket diff --git a/rplugin/python3/neotags.py b/rplugin/python3/neotags.py index 72784a6..5c08aa0 100644 --- a/rplugin/python3/neotags.py +++ b/rplugin/python3/neotags.py @@ -1,9 +1,9 @@ import neovim -import sys -import pathlib import fileinput +import pathlib import subprocess -import locket +import sys +import traceback @neovim.plugin @@ -20,37 +20,41 @@ class NeotagsPlugin(object): # Check whether 'FileWritePost' is necessary @neovim.autocmd('BufWritePost', pattern='*', eval='expand(":p")') def update_tags_for_file(self, filename): - self.filename = filename + self.log('Triggered for "%s"' % filename) + pwd = self.nvim.funcs.execute('pwd').strip() - self.relative_filename = self.filename.replace(pwd, '').lstrip('\/') + relative_filename = filename.replace(pwd, '').lstrip('\/') + tags_file = self.get_tags_file(filename) try: - with locket.lock_file(self.get_tags_file() + '.lock'): - self.log('Start updating tags') - self.strip_existing_tags() - self.generate_tags() - self.log('Tags for file: "%s"' % self.relative_filename) - except ValueError: - self.log('No tags file found') + self.log('Start updating tags for "%s"' % filename) + self.strip_existing_tags(tags_file, relative_filename) + self.generate_tags(tags_file, relative_filename) + self.log('Tags for file "%s"' % filename) + except: + self.log( + 'Failed to update tags for "%s", reason: %s' % ( + filename, traceback.format_exc() + ) + ) - def strip_existing_tags(self): - tags_f = self.get_tags_file() + def strip_existing_tags(self, tags_f, filename): with fileinput.input(files=tags_f, inplace=True, backup='.bak') as f: for line in f: - if self.relative_filename not in line: + if filename not in line: sys.stdout.write(line) - def generate_tags(self): + def generate_tags(self, tags_file, filename): subprocess.run([ self.ctags_cmd, '-f', - self.get_tags_file(), + tags_file, '-a', - "%s" % self.relative_filename + "%s" % filename ]) - def get_tags_file(self): - path = pathlib.Path(self.filename) + def get_tags_file(self, filename): + path = pathlib.Path(filename) self.log('Test: ' + str(path.with_name(self.tags_filename))) if path.with_name(self.tags_filename).is_file(): @@ -64,4 +68,4 @@ class NeotagsPlugin(object): raise ValueError('No tags file found in parent folders of given file') def log(self, message): - self.nvim.out_write(message + "\n") + self.nvim.out_write('neotags > ' + message + "\n")