about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/api/commands.py3
-rw-r--r--ranger/defaults/commands.py1
-rw-r--r--ranger/gui/widgets/console.py13
3 files changed, 14 insertions, 3 deletions
diff --git a/ranger/api/commands.py b/ranger/api/commands.py
index 80827c4f..9a353eef 100644
--- a/ranger/api/commands.py
+++ b/ranger/api/commands.py
@@ -85,6 +85,9 @@ class Command(FileManagerAware):
 	def quick(self):
 		"""Override this"""
 
+	def cancel(self):
+		"""Override this"""
+
 	# COMPAT: this is still used in old commands.py configs
 	def _tab_only_directories(self):
 		from os.path import dirname, basename, expanduser, join, isdir
diff --git a/ranger/defaults/commands.py b/ranger/defaults/commands.py
index e9572d3e..ad3fa0e5 100644
--- a/ranger/defaults/commands.py
+++ b/ranger/defaults/commands.py
@@ -19,6 +19,7 @@ This is the default file for command definitions.
 Each command is a subclass of `Command'.  Several methods are defined
 to interface with the console:
 	execute: call this method when the command is executed.
+	cancel: call this method when closing the console without executing.
 	tab: call this method when tab is pressed.
 	quick: call this method after each keypress.
 
diff --git a/ranger/gui/widgets/console.py b/ranger/gui/widgets/console.py
index 12f685d4..a575405d 100644
--- a/ranger/gui/widgets/console.py
+++ b/ranger/gui/widgets/console.py
@@ -123,7 +123,14 @@ class Console(Widget):
 		self.history.add('')
 		return True
 
-	def close(self):
+	def close(self, trigger_cancel_function=True):
+		if trigger_cancel_function:
+			cmd = self._get_cmd()
+			if cmd:
+				try:
+					cmd.cancel()
+				except Exception as error:
+					self.fm.notify(error)
 		if self.last_cursor_mode is not None:
 			try:
 				curses.curs_set(self.last_cursor_mode)
@@ -288,7 +295,7 @@ class Console(Widget):
 		self.tab_deque = None
 		if mod == -1 and self.pos == 0:
 			if not self.line:
-				self.close()
+				self.close(trigger_cancel_function=False)
 			return
 		# Delete utf-char-wise
 		if self.fm.py3:
@@ -315,7 +322,7 @@ class Console(Widget):
 				self.fm.notify(error)
 
 		if self.allow_close:
-			self.close()
+			self.close(trigger_cancel_function=False)
 
 	def _get_cmd(self):
 		try: