FK~

Moje odkazy

Ostatní odkazy

Close Windows
Nenajdete mě na Facebooku ani Twitteru
Rozpad EU
Jsem členem FSF
There Is No Cloud …just other people's computers.
Sane software manifesto / Manifest příčetného softwaru

Klipper: chytrá schránka v KDE

vydáno: 10. 9. 2014 20:17, aktualizováno: 11. 9. 2014 02:22

Schránka je prakticky ve všech počítačových systémech s GUI, obvyklé Ctrl+C, Ctrl+V známe asi všichni. V unixových systémech s X serverem máme schránky dokonce dvě (do jedné se kopíruje prostým označením textu a vkládá se prostředním tlačítkem). Celkem běžně zde bývá i historie schránky. Klipper (správce schránky v prostředí KDE) ale přináší ještě mnohem víc možností.

Klipper - schránka v KDE - dialog nastavení

QR kódy

Klipper sám o sobě umí zobrazovat QR kódy. Takže můžete snadno dostat text nebo odkaz třeba do mobilu.

Klipper - QR kód

Stačí kliknout na ikonu v systémové části panelu a vybrat Zobrazit čárový kód…

Vlastní činnosti a skripty

Schránka nám umožňuje si nadefinovat činnosti, které se budou provádět nad jejím obsahem – po zkopírování textu se nám u kurzoru myši zobrazí kontextová nabídka a vybereme požadovanou činnost.

Činnost může měnit obsah schránky – nahrazovat původní text případně za něj přidat nový. Nebo může jen text zpracovat, provést nějakou akci, ale ve schránce nechat text původní. Činnosti definujeme jako příkazy – můžeme volat systémové nebo svoje vlastní skripty – a dokonce můžeme více příkazů zřetězit pomocí rour.

Aby nám v nabídce nestrašily všechny akce, použijeme regulární výrazy – pomocí nich např. poznáme, zda je obsah schránky URL nebo třeba „text s hranatými závorkami“ a zobrazíme si jen ty činnosti, které dávají smysl.

Automatické vyskakování nabídky by vás mohlo obtěžovat, zvlášť pokud budete mít obecnější regulární výrazy, kterým bude vyhovovat kde co. U jednotlivých skupin činností si proto odškrtněte volbu „Automaticky“ a nechte ji jen u specifických výrazů jako je třeba URL. Nebo vypněte globálně odškrtnutím „Povolit činnosti se schránkou“ a nabídku si zobrazujte pouze přes klávesovou zkratku.

Klipper - kontextová nabídka

Teď už se podíváme na příklady činností:

Řazení

Začneme něčím jednodušším. Text můžeme prohnat přes příkaz sort a seřadit si tak řádky podle abecedy. Stačí si vytvořit činnost:

echo %s | sort

Viz první obrázek. Akce bude dostupná pro všechny texty, protože jsme ji dali pod regulární výraz .*

Base64

Base64 je kódování, které umožňuje převést libovolná binární data na text tvořený omezenou abecedou 64 znaků. Dat je pak více, ale zase bez poškození prolezou všude, kde je podporovaný ASCII text (ani tam nemusí být podpora Unicodu).

Base64 vypadá takhle:

QmFzZTY0IGplIGvDs2RvdsOhbsOtLCBrdGVyw6kgdW1vxb7FiHVqZSBwxZlldsOpc3QgbGlib3Zv
bG7DoSBiaW7DoXJuw60gZGF0YSBuYSB0ZXh0IHNlc3TDoXZhasOtY8OtIHNlIHogb21lemVuw6kg
YWJlY2VkeSA2NCB6bmFrxa8uIERhdCBqZSBwYWsgdsOtY2UsIGFsZSB6YXNlIGJleiBwb8Wha296
ZW7DrSBwcm9sZXpvdSB2xaF1ZGUsIGtkZSBqZSBwb2Rwb3JvdmFuw70gQVNDSUkgdGV4dCAoYW5p
IHRhbSBuZW11c8OtIGLDvXQgcG9kcG9yYSBVbmljb2R1KS4K

Když na něj někde narazíte a chcete se podívat, co je uvnitř, stačí ho předat příkazu base64 -d. Ani nemusíme chodit do konsole a můžeme si ten text dekódovat pomocí činnosti schránky a výsledek si někam vložit (což se tedy hodí u textových dat, ne binárních).

V Klipperu si tedy pro dekódování nastavíme:

echo %s | base64 -d

Případně pro kódování:

echo %s | base64

To se taky hodí, když chcete sdělit nějakou informaci, ale nechcete, aby si ji ostatní omylem přečetli (a vyzradili jste jim tak třeba zápletku filmu).

Nedělitelné mezery

Jednopísmenné předložky a spojky nepatří na konec řádku. Blbě vypadá a blbě se to čte. Proto máme tzv. nedělitelné mezery, které zajistí, že při sazbě bude předložka/spojka na stejném řádku jako následující slovo. Důležité je to hlavně při sazbě knih a novin. Ale proč nemít nedělitelné mezery a lepší text i jinde, když to nic nestojí?

Nedělitelné mezery můžete vkládat buď ručně pomocí klávesnice nebo to za vás může dělat redakční systém (ten můj to umí). Ale hodně systémů tuhle funkci nemá – tak si můžeme pomoci skriptem, který si napojíme na schránku.

Pomocí sedu doplníme nedělitelnou mezeru za znaky, za kterými následuje mezera a zároveň jim předchází mezera, začátek řádku nebo závorka či uvozovka – díky tomu se změna aplikuje na předložky/spojky, ale ne na znaky, které jsou součástí jiného slova:

#!/bin/sh
# Doplní nedělitelné mezery
REGEX="s/(^|\(|\s| |„|\")([aikosuvz])\s/\1\2 /gi"; # mezery jsou nedělitelné
sed -r -e "$REGEX" -e "$REGEX";
# 2× pro případ, že jich bude víc za sebou: „a i tak to funguje“

Skript si uložíme do adresáře, který máme v cestě ($PATH) a nastavíme v Klipperu stejně jako v předchozím příkladu.

Poznámky pod čarou

Některé věci je lepší napsat mimo hlavní text, na straně nebo pod čarou. V DocBooku nebo LaTeXu za vás formátování udělá daný systém. Jinde si musíte pomoci sami. Tak jsem si vytvořil vlastní jednoduchou syntaxi: poznámky píši do hranatých závorek a pak si je nechám perlovským skriptem převést na XHTML:

#!/usr/bin/perl

# Copyright © 2014 František Kučera (frantovo.cz)
# 
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.


use strict;
use warnings;

my @poznamky;

sub odkaz {
	push(@poznamky, $1);
	my $poradi = scalar(@poznamky);
	return "<sup>$poradi</sup>";
}

while(<STDIN>) {
	$_ =~ s/\[([^]]+)\]/odkaz($1)/eg; # e = vyhodnocuje funkce
	print $_;
}

if (scalar(@poznamky) > 0) {
	print "\n<p><sub>\n";
	while (my ($poradi, $poznamka) = each @poznamky) {
		$poradi++;
		print "[$poradi] $poznamka";
		print "<br/>" if $poradi < scalar(@poznamky);
		print "\n";
	}
	print "</sub></p>";
}

Např. z textu:

Normální text[tohle je poznámka] a zase text[a tohle druhá poznámka]

dostaneme:

Normální text<sup>1</sup> a zase text<sup>2</sup>

<p><sub>
[1] tohle je poznámka<br/>
[2] a tohle druhá poznámka
</sub></p>

což se v prohlížeči zobrazí jako:

Normální text1 a zase text2

[1] tohle je poznámka
[2] a tohle druhá poznámka

Tenhle skript není neprůstřelný a pracuje se vstupem jen jako s textem, aniž by rozuměl syntaxi. Předpokládá se, že si uživatel zkontroluje výstup a případně ho opraví. Přeci jen nejde o program, který by se bez dozoru pouštěl na nedůvěryhodných datech. Lepší by samozřejmě bylo to načíst jako XML, v textových uzlech najít závorky a text upravit a nakonec přidat nové elementy. Ale i takhle to slouží celkem dobře.

Markdown

Markdown je alternativní syntaxe – něco na způsob wiki-syntaxe – pro zápis formátovaného textu. Pro jednodušší úlohy je to docela šikovné. Např. text:

- aaa
- bbb: *zvýrazněné*
 - AAA
 - BBB **tučně zvýrazněné**
 - CCC
- ccc

nám Markdown přeloží na následující XHTML:

<ul>
<li>aaa</li>
<li>bbb: <em>zvýrazněné</em>
<ul>
<li>AAA</li>
<li>BBB: <strong>tučně zvýrazněné</strong></li>
<li>CCC</li>
</ul></li>
<li>ccc</li>
</ul>

které v prohlížeči vypadá takhle:

  • aaa
  • bbb: zvýrazněné
    • AAA
    • BBB: tučně zvýrazněné
    • CCC
  • ccc

Připomínám, že příkazy je možné řetězit pomocí klasických rour | takže můžete mít činnost schránky, která přidá nedělitelné mezery, potom poznámky pod čarou a nakonec to prožene přes Markdown, aby se interpretovaly odrážky, zvýrazněné písmo a další formátování.

Ukládání poznámek do souboru

Narazíte na nějaký text (třeba kousek zdrojáku nebo vtipnou poznámku) a chcete si ho uložit. Pokud máte puštěný Dolphin (správce souborů), stačí přejít do požadovaného adresáře a stisknout Ctrl+V a Dolphin se vás zeptá na název souboru a uloží do něj obsah schránky.

Když ale Dolphin puštěný nemáte nebo se s tím nechcete moc párat a lézt do správného adresáře, můžete přes Klipper poslat obsah schránky následujícímu skriptu:

#!/bin/bash

adresar=~/temp/poznámky
titulek="Uložit poznámky";

data="`cat`";
sablona="`date '+%Y-%m-%d %H:%M:%S'`.txt";

function zjisti_soubor() {
	zenity \
		--entry \
		--width=300 \
		--title="$titulek" \
		--text="Název souboru" \
		--entry-text="$sablona";
}

soubor="$adresar/`zjisti_soubor`";
vysledek=$?;

if [[ 0 == "$vysledek" ]]; then
	if [[ -f "$soubor" ]]; then
		zenity \
			--error \
			--title="$titulek" \
			--text="Soubor už existuje, zkuste to prosím znovu";
	else
		echo "$data" > "$soubor";
		if [[ 0 == "$?" ]]; then
			zenity \
				--info \
				--title="$titulek" \
				--text="Text ze schránky byl uložen do souboru";

		else
			zenity \
				--error \
				--title="$titulek" \
				--text="Soubor se nepodařilo uložit";
		fi
	fi
else
	zenity \
		--info \
		--title="$titulek" \
		--text="Ukládání bylo zrušeno";
fi

Ten se vás zeptá na název souboru (pro lenochy je vyplněné datum a čas, takže stačí odbouchnout Enter) a uloží do něj text ze schránky. Pokud soubor už existuje, upozorní vás na to a nepřepíše ho. A když si to rozmyslíte, můžete při zadávání názvu stisknout Escape a akci zrušit.

Zenity - dialog pro zadání názvu souboru

Pro vyvolání dialogů z Bashe jsem použil Zenity. To sice pochází z GNOME/GTK, ale mělo by se vám nastylovat tak, že zapadne i do KDE/Qt.

Stejným způsobem byste text mohli odesílat e-mailem, někam na web nebo třeba ukládat do relační databáze pomocí SQL-DK :-)

Další náměty

Můžete si napsat skript, který vám spočítá a zobrazí počet slov a písmen v článku. Nebo třeba zkontroluje XML či ho prožene skrz XSLT šablonu. Pomocí akcí schránky můžete propojit prakticky cokoli s čímkoli, můžete lépe trollovat (zdravím DW) nebo dělat i něco užitečnějšího.

Závěr

KDE je skutečné Desktop Environment, prostředí, které vám umožní integrovat aplikace a efektivně s nimi pracovat – Klipper je jeden z důvodů, proč tomu tak je. Díky schránce a jejím činnostem můžete snadno integrovat i aplikace, u nichž to autoři původně nezamýšleli. Po rozpoznání určitého vzoru (regulárního výrazu) můžete třeba poslat dotaz do nějakého svého systému nebo databáze a zobrazit si výsledek. Navíc, co si naskriptujete přes Klipper, to vám bude fungovat všude – nebude to vázané na konkrétní textový editor nebo webový prohlížeč či jinou aplikaci.

Odkazy a zdroje:

  • Klipper – Správce schránky v KDE
  • Markdown – syntaxe podobná wiki
  • Zenity – program na zobrazování GTK dialogů
  • Vlna – program od Petra Olšáka na doplňování nedělitelných mezer do TeXu

Témata: [GNU/Linux] [Perl] [taháky] [www] [Bash]

Komentáře čtenářů


Petr Ježek, 11. 9. 2014 09:22, suckless? [odpovědět]

Zdravím, předem díky za informačně neprázdný text, byť s KDE nemám a nechci mít nic společného. Pouze si dovolím poznámku k filozofii schránky k nabídce přiřazených příkazů. Tak například vlna - mám ji přímo v nabídce Lyxu stejně jako markdown. Zenity - k dispozici pro jakékoli moje prostředí na kontextové právé myšítko (editace kontextového menu). Klipper a žádné podobné věci pro QT ani GTK nepoužívám, vystačím si bohatě s oněmi klávesovými zkratkami a s kontextovými menu pro jednotlivé DE/WM. Není Klipper koncipován poněkud předimenzovaně z hlediska způsobu, jakým se snaží provázat to, co je na ploše s keší? Jak to funguje pro aplikace a utility vně KDE a QT? Prostě jsem tu "chytrost" Klipperu nepochopil, což může jít na vrub mé nekompatibility s KDE...


Franta, 11. 9. 2014 11:08 [odpovědět]

Tak například vlna - mám ji přímo v nabídce Lyxu stejně jako markdown

Mít tu akci nastavenou v konkrétní aplikaci bude většinou rychlejší. Přeci jen, ta moje práce se schránkou vypadá takhle:

Ctrl+X, Alt+Ctrl+R (moje zkratka vyvolání nabídky), šipky a Enter (výběr činnosti) a Ctrl+V.

Na druhou stranu mi to funguje všude – jednou to XHTML potřebuji vložit do jednoho prohlížeče, jindy do jiného a jindy třeba do textového editoru nebo programu na odesílání e-mailů.

a s kontextovými menu pro jednotlivé DE/WM

Jak to funguje? Volá to programy a předává jim to vstup ze schránky? Tam se dá použít příkaz xclip/xclipboard a dosáhnout podobného efektu.

Ale na té schránce v KDE se mi líbí, že nabídka je dynamická, zobrazí se jen ty volby, pro které obsah schránky odpovídá regulárnímu výrazu. Takže když budu mít ve schránce http://example.com/, bude mi to nabízet WWW prohlížeče nebo třeba zkracovače URL, přidání do záložek nebo cokoli, co si nastavím. Pro e-maily to bude nabízet odeslání e-mailu nebo přidání do adresáře. Nebo když tam bude hash, tak mi to může nabídnout vyhledání souborů v databázi.

Stejně tak by to šlo použít pro šifrování a dešifrování GPG. Ale to už umí programy jako KGpg nebo Kleopatra. Pokud na určitou činnost existuje specializovaná aplikace a umí pracovat se schránkou, tak většinou bude pohodlnější použít ji. Ale na Klipperu je hezké, že si přes něj lze propojit takřka libovolné aplikace a vytvořit si vlastní akce, aniž bych musel něco programovat.


Franta, 11. 9. 2014 11:19 [odpovědět]

Tip z Ábíčka:

Když po zobrazení historie začnete psát na klávesnici, zafunguje vyhledávání napsaného a historie se zúží pouze na vyhovující položky.


Franta, 26. 1. 2017 20:19, Upgrade na KDE 5 / Plasma [odpovědět]

Při upgradu systému a přechodu na KDE 5 (resp. Plasmu) jsem nezachovával svůj původní ~/.kde, a tím jsem ztratil i nastavení schránky. Možná kdybych ho nechal na svém místě, tak se to převedlo samo.

Nastavení schránky bylo původně v ~/.kde/share/config/klipperrc a když jsem si tento soubor nakopíroval z původního domovského adresáře do nového, tak se nastavení nenačetlo. Po vytvoření nějaké akce schránky jsem zjistil, že teď se nastavení ukládá do ~/.config/plasmashellrc. Soubory mají naštěstí stejný formát, takže stačí překopírovat příslušné sekce. A nezapomeňte si správně nastavit Number of Actions.

A pak jen restartovat Plasmu – k tomu ani není potřeba se odhlašovat a ukončovat všechny aplikace – stačí příkazy: kquitapp plasmashellplasmashell &

Přidat komentář

reagujete na jiný komentář (zrušit)
jméno nebo přezdívka
název příspěvku
webová stránka, blog
e-mailová adresa
nápověda: možnosti formátování
ochrana proti spamu a špatným trollům

Náhled komentáře