def run(self, edit, line_range=CURRENT_LINE_RANGE, forced=False, address=''): address_parser = parsers.cmd_line.AddressParser(address) parsed_address = address_parser.parse() address = ex_range.calculate_address(self.view, parsed_address) if address is None: ex_error.display_error(ex_error.ERR_INVALID_ADDRESS) return line_block = get_region_by_range(self.view, line_range=line_range) line_block = [self.view.substr(r) for r in line_block] text = '\n'.join(line_block) + '\n' if address != 0: dest = self.view.line(self.view.text_point(address, 0)).end() + 1 else: dest = address if dest > self.view.size(): dest = self.view.size() text = '\n' + text[:-1] self.view.insert(edit, dest, text) self.view.sel().clear() cursor_dest = self.view.line(dest + len(text) - 1).begin() self.view.sel().add(sublime.Region(cursor_dest, cursor_dest))
def run(self, path=None, forced=False): if self.view.is_dirty() and not forced: ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return state = State(self.view) if not path: state.settings.vi['_cmdline_cd'] = os.path.expanduser("~") self.view.run_command('ex_print_working_dir') return # TODO: It seems there a few symbols that are always substituted when they represent a # filename. We should have a global method of substiting them. if path == '%:h': fname = self.view.file_name() if fname: state.settings.vi['_cmdline_cd'] = os.path.dirname(fname) self.view.run_command('ex_print_working_dir') return path = os.path.realpath(os.path.expandvars(os.path.expanduser(path))) if not os.path.exists(path): # TODO: Add error number in ex_error.py. ex_error.display_error(ex_error.ERR_CANT_FIND_DIR_IN_CDPATH) return state.settings.vi['_cmdline_cd'] = path self.view.run_command('ex_print_working_dir')
def run(self, path=None, forced=False): if self.view.is_dirty() and not forced: ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return state = VintageState(self.view) if not path: state.settings.vi['_cmdline_cd'] = os.path.expanduser("~") self.view.run_command('ex_print_working_dir') return # TODO: It seems there a few symbols that are always substituted when they represent a # filename. We should have a global method of substiting them. if path == '%:h': fname = self.view.file_name() if fname: state.settings.vi['_cmdline_cd'] = os.path.dirname(fname) self.view.run_command('ex_print_working_dir') return path = os.path.realpath(os.path.expandvars(os.path.expanduser(path))) if not os.path.exists(path): # TODO: Add error number in ex_error.py. ex_error.display_error(ex_error.ERR_CANT_FIND_DIR_IN_CDPATH) return state.settings.vi['_cmdline_cd'] = path self.view.run_command('ex_print_working_dir')
def run(self, edit, line_range=None, forced=False, address=''): # make sure we have a default range if not line_range['text_range']: line_range['text_range'] = '.' address_parser = parsers.cmd_line.AddressParser(address) parsed_address = address_parser.parse() address = ex_range.calculate_address(self.view, parsed_address) if address is None: ex_error.display_error(ex_error.ERR_INVALID_ADDRESS) return line_block = get_region_by_range(self.view, line_range=line_range) line_block = [self.view.substr(r) for r in line_block] text = '\n'.join(line_block) + '\n' if address != 0: dest = self.view.line(self.view.text_point(address, 0)).end() + 1 else: dest = 0 # Don't move lines onto themselves. for sel in self.view.sel(): if sel.contains(dest): ex_error.display_error( ex_error.ERR_CANT_MOVE_LINES_ONTO_THEMSELVES) return if dest > self.view.size(): dest = self.view.size() text = '\n' + text[:-1] self.view.insert(edit, dest, text) for r in reversed(get_region_by_range(self.view, line_range)): self.view.erase(edit, self.view.full_line(r))
def run(self, edit, line_range=None, forced=False, address=''): # make sure we have a default range if not line_range['text_range']: line_range['text_range'] = '.' address_parser = parsers.cmd_line.AddressParser(address) parsed_address = address_parser.parse() address = ex_range.calculate_address(self.view, parsed_address) if address is None: ex_error.display_error(ex_error.ERR_INVALID_ADDRESS) return line_block = get_region_by_range(self.view, line_range=line_range) line_block = [self.view.substr(r) for r in line_block] text = '\n'.join(line_block) + '\n' if address != 0: dest = self.view.line(self.view.text_point(address, 0)).end() + 1 else: dest = 0 # Don't move lines onto themselves. for sel in self.view.sel(): if sel.contains(dest): ex_error.display_error(ex_error.ERR_CANT_MOVE_LINES_ONTO_THEMSELVES) return if dest > self.view.size(): dest = self.view.size() text = '\n' + text[:-1] self.view.insert(edit, dest, text) for r in reversed(get_region_by_range(self.view, line_range)): self.view.erase(edit, self.view.full_line(r))
def run(self, forced=False): # todo: restore active line_nr too if forced or not self.view.is_dirty(): self.view.run_command('revert') return elif self.view.is_dirty(): ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return ex_error.handle_not_implemented()
def run(self, forced=False): if self.view.is_dirty() and not forced: ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return path = os.path.dirname(self.view.file_name()) state = VintageState(self.view) try: state.settings.vi['_cmdline_cd'] = path self.view.run_command('ex_print_working_dir') except IOError: ex_error.display_error(ex_error.ERR_CANT_FIND_DIR_IN_CDPATH)
def run(self, forced=False): if self.view.is_dirty() and not forced: ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return path = os.path.dirname(self.view.file_name()) state = State(self.view) try: state.settings.vi['_cmdline_cd'] = path self.view.run_command('ex_print_working_dir') except IOError: ex_error.display_error(ex_error.ERR_CANT_FIND_DIR_IN_CDPATH)
def run(self, forced=False, file_name=None): if not file_name: if forced or not self.view.is_dirty(): self.view.run_command('revert') return elif not file_name and self.view.is_dirty(): ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return if forced or not self.view.is_dirty(): self.view.window().open_file(file_name) return ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES)
def run(self, edit, forced=False): if not forced: if has_dirty_buffers(self.view.window()): ex_error.display_error(ex_error.ERR_OTHER_BUFFER_HAS_CHANGES) return w = self.view.window() current_id = self.view.id() for v in w.views(): if v.id() != current_id: if forced and v.is_dirty(): v.set_scratch(True) w.focus_view(v) w.run_command('close')
def on_done(self, cmd_line): if not getattr(self, 'non_interactive', None): update_command_line_history(cmd_line, 'cmdline') else: self.non_interactive = False ex_cmd = parse_command(cmd_line) print(ex_cmd) if ex_cmd and ex_cmd.parse_errors: ex_error.display_error(ex_cmd.parse_errors[0]) return if ex_cmd and ex_cmd.name: if ex_cmd.can_have_range: ex_cmd.args["line_range"] = ex_cmd.line_range if ex_cmd.forced: ex_cmd.args['forced'] = ex_cmd.forced self.window.run_command(ex_cmd.command, ex_cmd.args) else: ex_error.display_error(ex_error.ERR_UNKNOWN_COMMAND, cmd_line)
def run_ex_command(self, edit, line_range=CURRENT_LINE_RANGE, forced=False, address=""): address = self.get_address(address) if address is None: ex_error.display_error(ex_error.ERR_INVALID_ADDRESS) return if address != 0: dest = self.view.line(self.view.text_point(address, 0)).end() + 1 else: dest = address text = self.line_range_to_text(line_range) if dest > self.view.size(): dest = self.view.size() text = "\n" + text[:-1] self.view.insert(edit, dest, text) cursor_dest = self.view.line(dest + len(text) - 1).begin() self.set_next_sel([(cursor_dest, cursor_dest)])
def run_ex_command(self, edit, line_range=CURRENT_LINE_RANGE, forced=False, address=''): # make sure we have a default range if ('text_range' not in line_range) or not line_range['text_range']: line_range['text_range'] = '.' address = self.get_address(address) if address is None: ex_error.display_error(ex_error.ERR_INVALID_ADDRESS) return if address != 0: dest = self.view.line(self.view.text_point(address, 0)).end() + 1 else: dest = 0 # Don't move lines onto themselves. for sel in self.view.sel(): if sel.contains(dest): ex_error.display_error( ex_error.ERR_CANT_MOVE_LINES_ONTO_THEMSELVES) return text = self.line_range_to_text(line_range) if dest > self.view.size(): dest = self.view.size() text = '\n' + text[:-1] self.view.insert(edit, dest, text) for r in reversed(get_region_by_range(self.view, line_range)): self.view.erase(edit, self.view.full_line(r)) new_address = address if address < self.view.rowcol(self.view.sel()[0].b)[0]: new_pt = self.view.text_point(new_address + 1, 0) new_address = self.view.rowcol(new_pt + len(text) - 1)[0] next_sel = self.view.text_point(new_address, 0) self.set_next_sel([(next_sel, next_sel)])
def run_ex_command(self, edit, line_range=CURRENT_LINE_RANGE, forced=False, address=''): address = self.get_address(address) if address is None: ex_error.display_error(ex_error.ERR_INVALID_ADDRESS) return if address != 0: dest = self.view.line(self.view.text_point(address, 0)).end() + 1 else: dest = address text = self.line_range_to_text(line_range) if dest > self.view.size(): dest = self.view.size() text = '\n' + text[:-1] self.view.insert(edit, dest, text) cursor_dest = self.view.line(dest + len(text) - 1).begin() self.set_next_sel([(cursor_dest, cursor_dest)])
def run(self, forced=False, file_name=None): if file_name: file_name = os.path.expanduser(os.path.expandvars(file_name)) if self.view.is_dirty() and not forced: ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return file_name = os.path.expanduser(file_name) if os.path.isdir(file_name): sublime.status_message('Vintageous: "{0}" is a directory'.format(file_name)) return message = '' if not os.path.exists(file_name): message = '[New File]' path = os.path.dirname(file_name) if path and not os.path.exists(path): message = '[New DIRECTORY]' self.view.window().open_file(file_name) # TODO: Collect message and show at the end of the command. def show_message(): sublime.status_message('Vintageous: "{0}" {1}'.format((file_name, message))) sublime.set_timeout(show_message, 250) return else: if forced or not self.view.is_dirty(): self.view.run_command('revert') return elif not file_name and self.view.is_dirty(): ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return if forced or not self.view.is_dirty(): self.view.window().open_file(file_name) return ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES)
def run_ex_command(self, edit, line_range=CURRENT_LINE_RANGE, forced=False, address=''): # make sure we have a default range if ('text_range' not in line_range) or not line_range['text_range']: line_range['text_range'] = '.' address = self.get_address(address) if address is None: ex_error.display_error(ex_error.ERR_INVALID_ADDRESS) return if address != 0: dest = self.view.line(self.view.text_point(address, 0)).end() + 1 else: dest = 0 # Don't move lines onto themselves. for sel in self.view.sel(): if sel.contains(dest): ex_error.display_error(ex_error.ERR_CANT_MOVE_LINES_ONTO_THEMSELVES) return text = self.line_range_to_text(line_range) if dest > self.view.size(): dest = self.view.size() text = '\n' + text[:-1] self.view.insert(edit, dest, text) for r in reversed(get_region_by_range(self.view, line_range)): self.view.erase(edit, self.view.full_line(r)) new_address = address if address < self.view.rowcol(self.view.sel()[0].b)[0]: new_pt = self.view.text_point(new_address + 1, 0) new_address = self.view.rowcol(new_pt + len(text) - 1)[0] next_sel = self.view.text_point(new_address, 0) self.set_next_sel([(next_sel, next_sel)])
def run(self, forced=False, file_name=None): if file_name: file_name = os.path.expanduser(os.path.expandvars(file_name)) if self.view.is_dirty() and not forced: ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return file_name = os.path.expanduser(file_name) if os.path.isdir(file_name): sublime.status_message( 'Vintageous: "{0}" is a directory'.format(file_name)) return message = '' if not os.path.isabs(file_name): file_name = os.path.join( VintageState(self.view).settings.vi['_cmdline_cd'], file_name) if not os.path.exists(file_name): message = '[New File]' path = os.path.dirname(file_name) if path and not os.path.exists(path): message = '[New DIRECTORY]' self.view.window().open_file(file_name) # TODO: Collect message and show at the end of the command. def show_message(): sublime.status_message('Vintageous: "{0}" {1}'.format( (file_name, message))) sublime.set_timeout(show_message, 250) return else: if forced or not self.view.is_dirty(): self.view.run_command('revert') return elif not file_name and self.view.is_dirty(): ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES) return if forced or not self.view.is_dirty(): self.view.window().open_file(file_name) return ex_error.display_error(ex_error.ERR_UNSAVED_CHANGES)