about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/core/actions.py31
-rw-r--r--ranger/ext/direction.py4
2 files changed, 21 insertions, 14 deletions
diff --git a/ranger/core/actions.py b/ranger/core/actions.py
index 929dec31..e8634099 100644
--- a/ranger/core/actions.py
+++ b/ranger/core/actions.py
@@ -545,20 +545,25 @@ class Actions(FileManagerAware, EnvironmentAware, SettingsAware):
 	def copy(self, narg=None, dirarg=None):
 		"""Copy the selected items"""
 		cwd = self.env.cwd
-		direction = Direction(dirarg or {})
-		if direction.vertical():
-			pos, selected = direction.select(
-					override=narg, lst=cwd.files, current=currentpos,
-					pagesize=self.env.termsize[0])
-		else:
-			pos = currentpos + (narg or 0)
+		if not narg and not dirarg:
 			selected = (f for f in self.env.get_selection() if f in cwd.files)
-		self.env.copy = set(selected)
-		self.env.copy.add(self.env.cwd.pointed_obj)
-		self.env.cut = False
-		self.env.cwd.pointer = pos
-		self.env.cwd.correct_pointer()
-		self.env.copy.add(self.env.cwd.pointed_obj)
+			self.env.copy = set(selected)
+			self.env.cut = False
+		else:
+			direction = Direction(dirarg or {})
+			offset = 0
+			if not direction.vertical():
+				direction = Direction(down=1)
+				offset = -1
+			pos, selected = direction.select(
+					override=narg, lst=cwd.files, current=cwd.pointer,
+					pagesize=self.env.termsize[0], offset=offset)
+			self.env.copy = set(selected)
+			self.env.copy.add(self.env.cwd.pointed_obj)
+			self.env.cut = False
+			self.env.cwd.pointer = pos
+			self.env.cwd.correct_pointer()
+			self.env.copy.add(self.env.cwd.pointed_obj)
 		self.ui.browser.main_column.request_redraw()
 
 	def cut(self, narg=None, dirarg=None):
diff --git a/ranger/ext/direction.py b/ranger/ext/direction.py
index f96ee90f..5a22d553 100644
--- a/ranger/ext/direction.py
+++ b/ranger/ext/direction.py
@@ -134,9 +134,11 @@ class Direction(dict):
 			pos += current
 		return int(max(min(pos, maximum + offset - 1), minimum))
 
-	def select(self, lst, override, current, pagesize):
+	def select(self, lst, override, current, pagesize, offset=0):
 		destination = self.move(direction=self.down(), override=override,
 			current=current, pagesize=pagesize, minimum=0, maximum=len(lst))
 		if destination > current:
+			destination += offset
 			return destination, lst[current:destination]
+		destination -= offset
 		return destination, lst[destination:current]