diff options
-rw-r--r-- | ranger/config/commands.py | 4 | ||||
-rw-r--r-- | ranger/config/rc.conf | 6 | ||||
-rw-r--r-- | ranger/container/file.py | 2 | ||||
-rw-r--r-- | ranger/core/actions.py | 30 | ||||
-rw-r--r-- | ranger/core/loader.py | 13 | ||||
-rw-r--r-- | ranger/core/runner.py | 2 | ||||
-rwxr-xr-x | ranger/data/scope.sh | 34 | ||||
-rw-r--r-- | ranger/ext/shutil_generatorized.py | 33 | ||||
-rw-r--r-- | ranger/gui/widgets/browsercolumn.py | 18 | ||||
-rw-r--r-- | ranger/gui/widgets/browserview.py | 7 |
10 files changed, 86 insertions, 63 deletions
diff --git a/ranger/config/commands.py b/ranger/config/commands.py index acc98457..9f0481ce 100644 --- a/ranger/config/commands.py +++ b/ranger/config/commands.py @@ -651,6 +651,8 @@ class touch(Command): Creates a file with the name <fname>. """ + resolve_macros = False + def execute(self): from os.path import join, expanduser, lexists @@ -726,6 +728,8 @@ class rename(Command): Changes the name of the currently highlighted file to <newname> """ + resolve_macros = False + def execute(self): from ranger.container.file import File from os import access diff --git a/ranger/config/rc.conf b/ranger/config/rc.conf index bb9af151..b2965cdc 100644 --- a/ranger/config/rc.conf +++ b/ranger/config/rc.conf @@ -330,9 +330,9 @@ map g? cd /usr/share/doc/ranger map E edit map du shell -p du --max-depth=1 -h --apparent-size map dU shell -p du --max-depth=1 -h --apparent-size | sort -rh -map yp shell -f echo -n %d/%f | xsel -i; xsel -o | xsel -i -b -map yd shell -f echo -n %d | xsel -i; xsel -o | xsel -i -b -map yn shell -f echo -n %f | xsel -i; xsel -o | xsel -i -b +map yp shell -f echo -n %%d/%%f | xsel -i; xsel -o | xsel -i -b +map yd shell -f echo -n %%d | xsel -i; xsel -o | xsel -i -b +map yn shell -f echo -n %%f | xsel -i; xsel -o | xsel -i -b # Filesystem Operations map = chmod diff --git a/ranger/container/file.py b/ranger/container/file.py index 6be60f85..a3db63a5 100644 --- a/ranger/container/file.py +++ b/ranger/container/file.py @@ -76,8 +76,6 @@ class File(FileSystemObject): if self.fm.settings.preview_script and \ self.fm.settings.use_preview_script: return True - if self.image and self.fm.settings.preview_images: - return True if self.container: return False if PREVIEW_WHITELIST.search(self.basename): diff --git a/ranger/core/actions.py b/ranger/core/actions.py index e3dba313..8167dbcf 100644 --- a/ranger/core/actions.py +++ b/ranger/core/actions.py @@ -799,14 +799,11 @@ class Actions(FileManagerAware, SettingsAware): return pager = self.ui.open_pager() - if self.settings.preview_images and self.thisfile.image: - pager.set_image(self.thisfile.realpath) + f = self.thisfile.get_preview_source(pager.wid, pager.hei) + if self.thisfile.is_image_preview(): + pager.set_image(f) else: - f = self.thisfile.get_preview_source(pager.wid, pager.hei) - if self.thisfile.is_image_preview(): - pager.set_image(f) - else: - pager.set_source(f) + pager.set_source(f) # -------------------------- # -- Previews @@ -835,10 +832,6 @@ class Actions(FileManagerAware, SettingsAware): if not path or not os.path.exists(path): return None - if self.settings.preview_images and file.image: - pager.set_image(path) - return None - if self.settings.preview_script and self.settings.use_preview_script: # self.previews is a 2 dimensional dict: # self.previews['/tmp/foo.jpg'][(80, 24)] = "the content..." @@ -874,6 +867,13 @@ class Actions(FileManagerAware, SettingsAware): data['loading'] = True + if 'directimagepreview' in data: + data['foundpreview'] = True + data['imagepreview'] = True + pager.set_image(path) + data['loading'] = False + return path + cacheimg = os.path.join(ranger.CACHEDIR, self.sha1_encode(path)) if (os.path.isfile(cacheimg) and os.path.getmtime(cacheimg) > os.path.getmtime(path)): data['foundpreview'] = True @@ -883,7 +883,8 @@ class Actions(FileManagerAware, SettingsAware): return cacheimg loadable = CommandLoader(args=[self.settings.preview_script, - path, str(width), str(height), cacheimg], read=True, + path, str(width), str(height), cacheimg, + str(self.settings.preview_images)], read=True, silent=True, descr="Getting preview of %s" % path) def on_after(signal): exit = signal.process.poll() @@ -899,6 +900,8 @@ class Actions(FileManagerAware, SettingsAware): data[(-1, -1)] = content elif exit == 6: data['imagepreview'] = True + elif exit == 7: + data['directimagepreview'] = True elif exit == 1: data[(-1, -1)] = None data['foundpreview'] = False @@ -922,6 +925,9 @@ class Actions(FileManagerAware, SettingsAware): if 'imagepreview' in data: pager.set_image(cacheimg) return cacheimg + elif 'directimagepreview' in data: + pager.set_image(path) + return path else: pager.set_source(self.thisfile.get_preview_source( pager.wid, pager.hei)) diff --git a/ranger/core/loader.py b/ranger/core/loader.py index 1f9ec9cf..e672bbed 100644 --- a/ranger/core/loader.py +++ b/ranger/core/loader.py @@ -77,7 +77,6 @@ class CopyLoader(Loadable, FileManagerAware): # TODO: Don't calculate size when renaming (needs detection) bytes_per_tick = shutil_g.BLOCK_SIZE size = max(1, self._calculate_size(bytes_per_tick)) - bar_tick = 100.0 / (float(size) / bytes_per_tick) if self.do_cut: self.original_copy_buffer.clear() if len(self.copy_buffer) == 1: @@ -92,10 +91,10 @@ class CopyLoader(Loadable, FileManagerAware): self.fm.tags.tags[tf.replace(f.path, self.original_path \ + '/' + f.basename)] = tag self.fm.tags.dump() - for _ in shutil_g.move(src=f.path, + for done in shutil_g.move(src=f.path, dst=self.original_path, overwrite=self.overwrite): - self.percent += bar_tick + self.percent = float(done) / size * 100. yield else: if len(self.copy_buffer) == 1: @@ -104,17 +103,17 @@ class CopyLoader(Loadable, FileManagerAware): self.description = "copying files from: " + self.one_file.dirname for f in self.copy_buffer: if os.path.isdir(f.path) and not os.path.islink(f.path): - for _ in shutil_g.copytree(src=f.path, + for done in shutil_g.copytree(src=f.path, dst=os.path.join(self.original_path, f.basename), symlinks=True, overwrite=self.overwrite): - self.percent += bar_tick + self.percent = float(done) / size * 100. yield else: - for _ in shutil_g.copy2(f.path, self.original_path, + for done in shutil_g.copy2(f.path, self.original_path, symlinks=True, overwrite=self.overwrite): - self.percent += bar_tick + self.percent = float(done) / size * 100. yield cwd = self.fm.get_directory(self.original_path) cwd.load_content() diff --git a/ranger/core/runner.py b/ranger/core/runner.py index 0e5d9fa3..0ae227a6 100644 --- a/ranger/core/runner.py +++ b/ranger/core/runner.py @@ -146,7 +146,7 @@ class Runner(object): # Set default shell for Popen if popen_kws['shell']: # This doesn't work with fish, see #300 - if os.environ['SHELL'] != 'fish': + if not 'fish' in os.environ['SHELL']: popen_kws['executable'] = os.environ['SHELL'] if 'stdout' not in popen_kws: diff --git a/ranger/data/scope.sh b/ranger/data/scope.sh index ce9ee574..19404019 100755 --- a/ranger/data/scope.sh +++ b/ranger/data/scope.sh @@ -17,18 +17,20 @@ # 4 | fix height | success. Don't reload when height changes # 5 | fix both | success. Don't ever reload # 6 | image | success. display the image $cached points to as an image preview +# 7 | image | success. display the file directly as an image # Meaningful aliases for arguments: -path="$1" # Full path of the selected file -width="$2" # Width of the preview pane (number of fitting characters) -height="$3" # Height of the preview pane (number of fitting characters) -cached="$4" # Path that should be used to cache image previews +path="$1" # Full path of the selected file +width="$2" # Width of the preview pane (number of fitting characters) +height="$3" # Height of the preview pane (number of fitting characters) +cached="$4" # Path that should be used to cache image previews +preview_images="$5" # "True" if image previews are enabled, "False" otherwise. maxln=200 # Stop after $maxln lines. Can be used like ls | head -n $maxln # Find out something about the file: mimetype=$(file --mime-type -Lb "$path") -extension=$(/bin/echo -E "${path##*.}" | tr "[:upper:]" "[:lower:]") +extension=$(/bin/echo "${path##*.}" | tr "[:upper:]" "[:lower:]") # Functions: # runs a command and saves its output into $output. Useful if you need @@ -36,7 +38,7 @@ extension=$(/bin/echo -E "${path##*.}" | tr "[:upper:]" "[:lower:]") try() { output=$(eval '"$@"'); } # writes the output of the previously used "try" command -dump() { /bin/echo -E "$output"; } +dump() { /bin/echo "$output"; } # a common post-processing function used after most commands trim() { head -n "$maxln"; } @@ -44,6 +46,23 @@ trim() { head -n "$maxln"; } # wraps highlight to treat exit code 141 (killed by SIGPIPE) as success highlight() { command highlight "$@"; test $? = 0 -o $? = 141; } +# Image previews, if enabled in ranger. +if [ "$preview_images" = "True" ]; then + case "$mimetype" in + # Image previews for SVG files, disabled by default. + ###image/svg+xml) + ### convert "$path" "$cached" && exit 6 || exit 1;; + # Image previews for image files. w3mimgdisplay will be called for all + # image files (unless overriden as above), but might fail for + # unsupported types. + image/*) + exit 7;; + # Image preview for video, disabled by default.: + ###video/*) + ### ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;; + esac +fi + case "$extension" in # Archive extensions: 7z|a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ @@ -76,9 +95,6 @@ case "$mimetype" in # Ascii-previews of images: image/*) img2txt --gamma=0.6 --width="$width" "$path" && exit 4 || exit 1;; - # Image preview for videos, disabled by default: - # video/*) - # ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;; # Display information about media files: video/* | audio/*) exiftool "$path" && exit 5 diff --git a/ranger/ext/shutil_generatorized.py b/ranger/ext/shutil_generatorized.py index b20d5cef..7515b491 100644 --- a/ranger/ext/shutil_generatorized.py +++ b/ranger/ext/shutil_generatorized.py @@ -30,12 +30,14 @@ except NameError: def copyfileobj(fsrc, fdst, length=BLOCK_SIZE): """copy data from file-like object fsrc to file-like object fdst""" + total = 0 while 1: buf = fsrc.read(length) if not buf: break fdst.write(buf) - yield + total += len(buf) + yield total def _samefile(src, dst): # Macintosh, Unix. @@ -69,8 +71,8 @@ def copyfile(src, dst): try: fsrc = open(src, 'rb') fdst = open(dst, 'wb') - for _ in copyfileobj(fsrc, fdst): - yield + for done in copyfileobj(fsrc, fdst): + yield done finally: if fdst: fdst.close() @@ -107,8 +109,8 @@ def copy2(src, dst, overwrite=False, symlinks=False): os.unlink(dst) os.symlink(linkto, dst) else: - for _ in copyfile(src, dst): - yield + for done in copyfile(src, dst): + yield done copystat(src, dst) def get_safe_path(dst): @@ -165,6 +167,7 @@ def copytree(src, dst, symlinks=False, ignore=None, overwrite=False): if not overwrite: dst = get_safe_path(dst) os.makedirs(dst) + total = 0 for name in names: if name in ignored_names: continue @@ -178,14 +181,18 @@ def copytree(src, dst, symlinks=False, ignore=None, overwrite=False): os.symlink(linkto, dstname) copystat(srcname, dstname) elif os.path.isdir(srcname): - for _ in copytree(srcname, dstname, symlinks, + done = 0 + for done in copytree(srcname, dstname, symlinks, ignore, overwrite): - yield + yield total + done + total += done else: # Will raise a SpecialFileError for unsupported file types - for _ in copy2(srcname, dstname, + done = 0 + for done in copy2(srcname, dstname, overwrite=overwrite, symlinks=symlinks): - yield + yield total + done + total += done # catch the Error from the recursive copytree so that we can # continue with other files except Error as err: @@ -283,12 +290,12 @@ def move(src, dst, overwrite=False): if os.path.isdir(src): if _destinsrc(src, dst): raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) - for _ in copytree(src, real_dst, symlinks=True, overwrite=overwrite): - yield + for done in copytree(src, real_dst, symlinks=True, overwrite=overwrite): + yield done rmtree(src) else: - for _ in copy2(src, real_dst, symlinks=True, overwrite=overwrite): - yield + for done in copy2(src, real_dst, symlinks=True, overwrite=overwrite): + yield done os.unlink(src) def _destinsrc(src, dst): diff --git a/ranger/gui/widgets/browsercolumn.py b/ranger/gui/widgets/browsercolumn.py index 5d055a0b..b38d0b5b 100644 --- a/ranger/gui/widgets/browsercolumn.py +++ b/ranger/gui/widgets/browsercolumn.py @@ -180,19 +180,15 @@ class BrowserColumn(Pager): Pager.close(self) return - if self.fm.settings.preview_images and self.target.image: - self.set_image(self.target.realpath) - Pager.draw(self) + f = self.target.get_preview_source(self.wid, self.hei) + if f is None: + Pager.close(self) else: - f = self.target.get_preview_source(self.wid, self.hei) - if f is None: - Pager.close(self) + if self.target.is_image_preview(): + self.set_image(f) else: - if self.target.is_image_preview(): - self.set_image(f) - else: - self.set_source(f) - Pager.draw(self) + self.set_source(f) + Pager.draw(self) def _draw_directory(self): """Draw the contents of a directory""" diff --git a/ranger/gui/widgets/browserview.py b/ranger/gui/widgets/browserview.py index eb99369b..e9640208 100644 --- a/ranger/gui/widgets/browserview.py +++ b/ranger/gui/widgets/browserview.py @@ -258,9 +258,7 @@ class BrowserView(Widget, DisplayableContainer): result = not self.columns[-1].has_preview() target = self.columns[-1].target if not result and target and target.is_file: - if target.image and self.fm.settings.preview_images: - result = False # don't collapse when drawing images - elif self.fm.settings.preview_script and \ + if self.fm.settings.preview_script and \ self.fm.settings.use_preview_script: try: result = not self.fm.previews[target.realpath]['foundpreview'] @@ -355,8 +353,7 @@ class BrowserView(Widget, DisplayableContainer): self.columns[-1].visible = True if self.preview and self.is_collapsed != self._collapse(): - if (self.fm.settings.preview_images and - self.fm.settings.preview_files): + if self.fm.settings.preview_files: # force clearing the image when resizing preview column self.columns[-1].clear_image(force=True) self.resize(self.y, self.x, self.hei, self.wid) |