def _close(self): """To close the Surfer user interface.""" v.exe('q') for cmd in self.exit_cmds: v.exe(cmd) if self.user_buf.winnr: v.focus_win(self.user_buf.winnr) self._reset() v.redraw()
def open(self): """To open the Surfer user interface.""" # The Fugitive plugin seems to interfere with Surfer since it adds # some filenames to the vim option `tags`. Surfer does this too, # but if Fugitive is installed and the user is editing a file in a git # repository, it seems that Surfer cannot append anything to the # `tag` option. I haven't still figured out why this happens but this # seems to fix the issue. v.exe("exe 'set tags='.&tags") self.user_buf = self.BufInfo(v.bufname(), v.bufnr(), v.winnr()) pmod = settings.get("project_search_modifier") bmod = settings.get("buffer_search_modifier") prompt = u"echohl SurferPrompt | echon \"{}\" | echohl None".format( settings.get("prompt")) self._open_window() self.renderer.render(self.winnr, -1, "", [], "") v.redraw() # Start the input loop key = input.Input() while True: self.perform_new_search = True # Display the prompt and the current query v.exe(prompt) query = self.query.replace("\\", "\\\\").replace('"', '\\"') v.exe(u"echon \"{}\"".format(query)) # Wait for the next pressed key key.get() # Go to the tag on the current line if (key.RETURN or key.CTRL and key.CHAR in ('g', 'o', 'p', 's')): mode = key.CHAR if key.CHAR in ('s', 'p') else '' tag = self.mapper.get(self.cursor_pos) if tag: self._jump_to(tag, mode) break # Close the Surfer window elif key.ESC or key.INTERRUPT: self._close() break # Delete a character backward elif key.BS: query = self.query.strip() if query and query in (bmod, pmod): self.plug.generator.rebuild_tags = True self.query = u"{}".format(self.query)[:-1] self.cursor_pos = -1 # move the cursor to the bottom # Move the cursor up elif key.UP or key.TAB or key.CTRL and key.CHAR == 'k': self.perform_new_search = False if self.cursor_pos == 0: self.cursor_pos = len(v.buffer()) - 1 else: self.cursor_pos -= 1 # Move the cursor down elif key.DOWN or key.CTRL and key.CHAR == 'j': self.perform_new_search = False if self.cursor_pos == len(v.buffer()) - 1: self.cursor_pos = 0 else: self.cursor_pos += 1 # Clear the current search elif key.CTRL and key.CHAR == 'u': query = self.query.lstrip() if query and query[0] in (bmod, pmod): self.query = query[0] else: self.query = u"" self.cursor_pos = -1 # move the cursor to the bottom # A character has been pressed. elif key.CHAR: self.query += key.CHAR self.cursor_pos = -1 # move the cursor to the bottom if key.CHAR in (pmod, bmod) and len(self.query.strip()) == 1: self.plug.generator.rebuild_tags = True else: v.redraw() continue self._update() v.redraw()