Difference between revisions of "Sxiv"

From ArchWiki
Jump to: navigation, search
(Browse through images in directory after opening a single file)
m (Broken link)
 
(30 intermediate revisions by 14 users not shown)
Line 1: Line 1:
[[Category:Graphics and desktop publishing]]
 
 
{{Lowercase title}}
 
{{Lowercase title}}
{{Article summary start}}
+
[[Category:Image manipulation]]
{{Article summary text|This article discusses the installation and basic configuration of {{Pkg|sxiv}}.}}
+
[[ja:Sxiv]]
{{Article summary heading|Related}}
+
{{Related articles start}}
{{Article summary wiki|feh}}
+
{{Related|feh}}
{{Article summary heading|External Links}}
+
{{Related articles end}}
{{Article summary text| [http://github.com/muennich/sxiv sxiv on github]}}
+
{{Article summary end}}
+
  
'''sxiv''', Simple [[X]] Image Viewer is a lightweight and scriptable image viewer written in C.  
+
[http://github.com/muennich/sxiv sxiv] , Simple [[X]] Image Viewer is a lightweight and scriptable image viewer written in C.  
  
 
== Installation ==
 
== Installation ==
  
[[pacman|Install]] {{Pkg|sxiv}}, which is available in the [[official repositories]].
+
[[Install]] {{Pkg|sxiv}}, which is available in the [[official repositories]].
  
 
== Assigning keyboard shortcuts to sxiv ==
 
== Assigning keyboard shortcuts to sxiv ==
 +
sxiv supports external key events. First you have to press {{ic|Ctrl-x}} to send the next key to the external key-handler. The external key-handler requires an executable file {{ic|~/.config/sxiv/exec/key-handler}} and passes the key combination pressed via argument as well the names of the currently marked images as stdin (or, if none are marked, the currently selected image).
  
''sxiv'' is scriptable, but to do this, you have to edit {{ic|config.h}} and compile ''sxiv'' as follows. See [[ABS]] for details on customizing official packages.
+
In this example, we will add the bindings {{ic|Ctrl+d}} to execute {{ic|mv ''filename'' ~/.trash}}, {{ic|Ctrl+c}} to copy the current images' names to the clipboard with {{Pkg|xclip}}, and {{ic|Ctrl+w}} to set the current wallpaper with [[nitrogen]]. Obviously, some commands may only make sense with a single image as an argument, so you may want to revise this to handle cases when those are passed more than one.
  
In this example, the following command to {{ic|Ctrl+d}}: {{ic|mv file ~/.trash}}, and {{ic|echo -n file | xclip}} to put the full path and filename of the current image into the clipboard with {{ic|Ctrl+c}}, and {{ic|nitrogen --save --set-zoom-fill file}} to set the current image as wallpaper with {{ic|Ctrl+w}}
+
{{hc|~/.config/sxiv/exec/key-handler|<nowiki>
 
+
#!/bin/sh
So when ''sxiv'' is started in thumbnail mode on a folder, one can see all files in that folder, select random thumbnails, and hit {{ic|Ctrl+d}} to move them to a custom "trash" folder.
+
while read file
 
+
do
Edit {{ic|config.h}}, to add the line for the {{ic|d}} and {{ic|c}} shortcut:
+
        case "$1" in
{{hc|config.h|<nowiki>
+
         "C-d")
        /* run shell command line on current file ("$SXIV_IMG"): */
+
                mv "$file" ~/.trash ;;
         { true,  XK_less,          it_shell_cmd,        (arg_t) \
+
         "C-r")
                        "mogrify -rotate -90 \"$SXIV_IMG\"" },
+
                convert -rotate 90 "$file" "$file" ;;
        { true,  XK_greater,      it_shell_cmd,        (arg_t) \
+
         "C-c")
                        "mogrify -rotate +90 \"$SXIV_IMG\"" },
+
                echo -n "$file" | xclip -selection clipboard ;;
         { true,  XK_comma,        it_shell_cmd,        (arg_t) \
+
         "C-w")
                        "jpegtran -rotate 270 -copy all -outfile \"$SXIV_IMG\" \"$SXIV_IMG\"" },
+
                nitrogen --save --set-zoom-fill "$file" ;;
        { true,  XK_period,        it_shell_cmd,        (arg_t) \
+
        esac
                        "jpegtran -rotate 90 -copy all -outfile \"$SXIV_IMG\" \"$SXIV_IMG\"" },
+
done
//insert the lines below
+
         { true,  XK_d,            it_shell_cmd,        (arg_t) \
+
                        "mv \"$SXIV_IMG\" ~/.trash" },
+
        { true,  XK_c,            it_shell_cmd,        (arg_t) \
+
                        "echo -n \"$SXIV_IMG\" | xclip" },
+
         { true,  XK_w,            it_shell_cmd,        (arg_t) \
+
                        "nitrogen --save --set-wallpaper \"$SXIV_IMG\"" },
+
};
+
 
</nowiki>}}
 
</nowiki>}}
 +
 +
Be sure to mark the script as executable
 +
$ chmod +x ~/.config/sxiv/exec/key-handler
  
 
Create {{ic|.trash}} folder if it does not exist:
 
Create {{ic|.trash}} folder if it does not exist:
 
  $ mkdir ~/.trash
 
  $ mkdir ~/.trash
  
{{Tip|Yu may want to use a standard compliant trasher (like {{AUR|trash-cli}} or {{AUR|bashtrash}}) instead of {{ic|mv \"$SXIV_IMG\" ~/.trash}}.}}
+
{{Tip|You may want to use a [http://freedesktop.org/wiki/Specifications/trash-spec/ standards-compliant trashcan] (like {{Pkg|trash-cli}} or {{AUR|bashtrash}}) rather than {{ic|mv "$2" ~/.trash}}.}}
 
+
Now when you start ''sxiv'' in thumbnail mode on a folder of pictures, i.e.:
+
$ sxiv -tsr ~/pictures
+
 
+
You can now delete selected pictures by hitting {{ic|Ctrl+d}}. This will move your selected pic to {{ic|~/.trash}}. Pressing {{ic|Ctrl+c}} copies the full path and file name of the current picture to the clipboard. Pressing {{ic|Ctrl+w}} will make the set the picture as wallpaper using Nitrogen.
+
  
 
== Tips and tricks ==
 
== Tips and tricks ==
Line 58: Line 46:
 
=== Browse through images in directory after opening a single file ===
 
=== Browse through images in directory after opening a single file ===
  
Place [http://git.savannah.gnu.org/cgit/ranger.git/tree/doc/examples/rifle_sxiv.sh this script] in {{ic|/usr/local/bin}} and call it like this:
+
Place [http://git.savannah.gnu.org/cgit/ranger.git/tree/examples/rifle_sxiv.sh this script]
 +
in {{ic|/usr/local/bin}} and call it like this:
 
  $ ''scriptname'' a_single_image.jpg
 
  $ ''scriptname'' a_single_image.jpg
  
Alternatively you can also install the script as a package from the AUR: {{aur|sxiv-rifle}}  
+
Alternatively you can also install the script as a package from the AUR: {{AUR|sxiv-rifle}}.
  
{{Warning|This script may not work with some characters, like {{ic|…}}. Correct the internal ''grep'' options to make it work: {{bc|# sed -i 's/grep/grep -a/' /usr/local/bin/''scriptname''}}}}
 
 
As indicated in the comments of the script, it may be used to have this behavior when opening images from within [[ranger]].
 
As indicated in the comments of the script, it may be used to have this behavior when opening images from within [[ranger]].
  
 
=== Showing the image size in the status bar ===
 
=== Showing the image size in the status bar ===
  
Place the following executable script in {{ic|~/.sxiv/exec/image-info}} and make sure that you have the {{Pkg|exiv2}} package installed:
+
Place the following executable script in {{ic|~/.config/sxiv/exec/image-info}} and make sure that you have the {{Pkg|exiv2}} package installed:
  
{{hc|~/.sxiv/exec/image-info|<nowiki>
+
{{hc|~/.config/sxiv/exec/image-info|<nowiki>
 
#!/bin/sh
 
#!/bin/sh
  
# Example for ~/.sxiv/exec/image-info
+
# Example for ~/.config/sxiv/exec/image-info
 
# Called by sxiv(1) whenever an image gets loaded,
 
# Called by sxiv(1) whenever an image gets loaded,
 
# with the name of the image file as its first argument.
 
# with the name of the image file as its first argument.
Line 90: Line 78:
 
echo "${filesize}${s}${geometry}${tags:+$s}${tags}${s}${filename}"
 
echo "${filesize}${s}${geometry}${tags:+$s}${tags}${s}${filename}"
 
</nowiki>}}
 
</nowiki>}}
 
=== Creating a desktop entry ===
 
 
Using a desktop environment some users may prefer to have ''sxiv'' listed in the start menu or list of installed programs. This can be done easily by creating the following {{ic|~/.local/share/applications/sxiv.desktop}} file:
 
 
[Desktop Entry]
 
Name=sxiv
 
Comment=A Simple X Image Viewer
 
Exec=sxiv %f
 
Terminal=false
 
Type=Application
 
Icon=sxiv
 
Categories=GTK;Graphics;2DGraphics;Viewer;
 
MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/tiff;image/x-bmp;image/x-pcx;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-sun-raster;image/x-tga;image/x-xbitmap;image/x-xpixmap;image/svg+xml;
 
 
{{Tip|You can modify {{ic|1=Exec=sxiv %f}} in order to use a user friendly [[#Browse_through_images_in_directory_after_opening_a_single_file|script]].}}
 
As for the icon, you can for example take [https://github-camo.global.ssl.fastly.net/7da9a42099cafc9a8a66b97d2a6d7f7f95d0a79d/687474703a2f2f6d75656e6e6963682e6769746875622e636f6d2f737869762f696d672f696d6167652e706e67 this] image and place it in {{ic|~/.local/share/icons/hicolor/''size''/apps/sxiv.png}}
 
  
 
== See also ==
 
== See also ==
  
 
* Arch Linux [https://bbs.archlinux.org/viewtopic.php?id=112643 forum thread].
 
* Arch Linux [https://bbs.archlinux.org/viewtopic.php?id=112643 forum thread].
 +
* Sxiv for keyboard layout [[wikipedia:Keyboard_layout#B.C3.89PO|bépo]] (keyboard layout in the spirit of [[wikipedia:Dvorak_Simplified_Keyboard|Dvorak]] for french speakers) : [http://bepo.fr/wiki/Vim#Visionneuse_d.27image_Sxiv Sxiv bépo].

Latest revision as of 21:21, 1 March 2016

Related articles

sxiv , Simple X Image Viewer is a lightweight and scriptable image viewer written in C.

Installation

Install sxiv, which is available in the official repositories.

Assigning keyboard shortcuts to sxiv

sxiv supports external key events. First you have to press Ctrl-x to send the next key to the external key-handler. The external key-handler requires an executable file ~/.config/sxiv/exec/key-handler and passes the key combination pressed via argument as well the names of the currently marked images as stdin (or, if none are marked, the currently selected image).

In this example, we will add the bindings Ctrl+d to execute mv filename ~/.trash, Ctrl+c to copy the current images' names to the clipboard with xclip, and Ctrl+w to set the current wallpaper with nitrogen. Obviously, some commands may only make sense with a single image as an argument, so you may want to revise this to handle cases when those are passed more than one.

~/.config/sxiv/exec/key-handler
#!/bin/sh
while read file
do
        case "$1" in
        "C-d")
                mv "$file" ~/.trash ;;
        "C-r")
                convert -rotate 90 "$file" "$file" ;;
        "C-c")
                echo -n "$file" | xclip -selection clipboard ;;
        "C-w")
                nitrogen --save --set-zoom-fill "$file" ;;
        esac
done

Be sure to mark the script as executable

$ chmod +x ~/.config/sxiv/exec/key-handler

Create .trash folder if it does not exist:

$ mkdir ~/.trash
Tip: You may want to use a standards-compliant trashcan (like trash-cli or bashtrashAUR) rather than mv "$2" ~/.trash.

Tips and tricks

Browse through images in directory after opening a single file

Place this script

in /usr/local/bin and call it like this:
$ scriptname a_single_image.jpg

Alternatively you can also install the script as a package from the AUR: sxiv-rifleAUR.

As indicated in the comments of the script, it may be used to have this behavior when opening images from within ranger.

Showing the image size in the status bar

Place the following executable script in ~/.config/sxiv/exec/image-info and make sure that you have the exiv2 package installed:

~/.config/sxiv/exec/image-info
#!/bin/sh

# Example for ~/.config/sxiv/exec/image-info
# Called by sxiv(1) whenever an image gets loaded,
# with the name of the image file as its first argument.
# The output is displayed in sxiv's status bar.

s=" | " # field separator

filename=$(basename "$1")
filesize=$(du -Hh "$1" | cut -f 1)

geometry=$(identify -format '%wx%h' "$1[0]")

tags=$(exiv2 -q pr -pi "$1" | awk '$1~"Keywords" { printf("%s,", $4); }')
tags=${tags%,}

echo "${filesize}${s}${geometry}${tags:+$s}${tags}${s}${filename}"

See also