Subsections

 
A. Interaktivní úpravy příkazového řádku a historie příkazů

Jak jsme si již říkali na samém začátku naší učebnice, interpretr Pythonu může být zkompilován s knihovnou GNU Readline, která zpřístupňuje rozšířené úpravy příkazového řádku. Tuto knihovnu používá například Unixový shell GNU Bash. Tuto knihovnu můžete dokonce nakonfigurovat tak, že bude používat klávesové zkratky ve stylu obou nejpoužívanějších editorů - Emacs a vi. Přestože má tato knihovna svůj vlastní manuál, zmíníme zde základy její konfigurace, jež by se mohli hodit každému začátečníkovi.

 
A.1 Úpravy příkazového řádku

Po celou následující kapitolu budeme předpokládat, že váš interpretr je zkompilován s podporou knihovny Readline.

Rozšířené úpravy příkazového řádku pro zadání vstupu pro interpretr je možné používat kdykoli, přičemž nezáleží, zda interpretr zobrazil primární nebo sekundární výzvu. Aktuální řádka můžete upravovat např. za použití příkazů, které možná znáte z programu EmacsA.1. Jde především o klávesy C-F (C-B), jež slouží pro pohyb o jeden znak vpřed (vzad). Další dvojice kláves M-F a M-B posouvají kurzor o jedno slovo vpřed resp. vzad. Pro pohyb na konec případně začátek řádku použijete klávesy C-E a C-A. Klávesou C-K smažete vše od kurzoru do konce řádku, C-Y vloží naposledy smazaný řetězec. Konečně C-podtržítko vrátí poslední změnu na tomto řádku.

 
A.2 Historie příkazů

Historie příkazů pracuje naprosto stejně jako v libovolném jiném programu, který jako svoje rozhraní používá příkazový řádek. Klávesa C-P vás přesune na předchozí příkaz v historii, C-N na následující. Každý řádek, který jste vyvolali z historie může být upraven. Po dokončení vašich úprav stiskněte klávesu Return a aktuální řádek bude předán interpretru k opětovnému spuštění. Pro vyhledávání v historii použijte stisk kláves C-R. Pomocí kláves C-S spustíte vyhledávání v opačném směru.

 
A.3 Klávesové zkratky

Klávesové zkratky a další parametry knihovny GNU Readline můžete nastavovat pomocí příkazů v inicializačním souboru ~./inputrc. V něm jsou klávesové zkratky zapisovány ve tvaru:

jméno-klávesy: jméno-funkce

nebo:

"řetězec": jméno-funkce

Různé parametry se pak nastavují příkazy

set parametr hodnota

Zde si uvedeme jednu možnou konfiguraci knihovny Readline:

# Preferuji úpravy ve stylu vi:
set editing-mode vi

# Úpravy na jediné řádce:
set horizontal-scroll-mode On

# Upravíme nějaké klávesové zkratky:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file

Knihovna Readline obvykle používá klávesu Tab pro doplňování jmen souborů a příkazů, v Pythonu však slouží pro vložení znaku tabulátor. Jestliže si přejete používat doplňování vázané na klávesu Tab, zapište do svého souboru ~/.inputrc následující řádek:

Tab: complete

Za použití tohoto namapování kláves se ale připravíte o možnost přímo vkládat znaky tabulátor na příkazové řádce interpretru. Doplňování jmen proměnných a modulů je další rozšíření, které přináší knihovny GNU Readline do interpretru Pythonu. Pokud si přejete dolňování jmen používat, přidejte následující řádky do inicializačního souboru Pythonu:A.2 

import rlcompleter, readline
readline.parse_and_bind('tab: complete')

Tento kód sváže klávesu Tab s funkcí doplňování jmen (complete). Při doplňování jmen se prohledává seznam všech příkazů jazyka Python, aktuální lokální prostor jmen a jména modulů. Pro výrazy, které používají tečkovou notaci jako např. string.a se nejprve vyhodnotí výraz před poslední tečkou a pak se vyvolá doplňování jmen na výsledném objektu. Takto může dojít i k nechtěnému spuštění kódu programu. Stačí aby objekt definoval metodu __getattr__() a při prvním doplňování složitějšího výrazu, který se odkazuje na atributy takové instance se spustí kód této metody.

Inicializační soubor může nabízet i více možností. Jako příklad může posloužit následující výpis souboru. Podotkněme, že inicializační soubor se spouští ve stejném prostoru jmen, ve kterém budou pozděje vykonávány interaktivní příkazy. Proto je slušností zanechat toto prostředí "čisté", kvůli čemuž skript po sobě snaže nepotřebná jména z tohoto jmenného prostoru odstraní:

# Přidává doplňování příkazů a ukládá historii příkazů vašeho interaktivního
# interpretru. Vyžaduje verzi Python 2.0 nebo vyšší, readline. Doplňování
# je svázáno s klávesou Esc (tuto vazbu můžete změnit - viz dokumentace
# knihovny readline).
#
# Uložte tento soubor jako ~/.pystartup a nastavte proměnnou prostředí tak,
# aby na něj ukazovala, tj. 'export PYTHONSTARTUP=/home/honza/.pystartup'
# v bashi
#
# Proměnná PYTHONSTARTUP _neexpanduje_ znak '~', takže musíte zadat celou
# cestu k vašemu domácímu adresáři.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser('~/.pyhistory')

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

V porovnání s prvními verzemi interpretru jsou tyto možnosti přímo pohádkové. Stále ale zbývá implementovat několik dalších vlastností, které by editování příkazového řádku udělaly ještě pohodlnější než je nyní.



Footnotes

... EmacsA.1
V dokumentaci Emacsu znamená zápis C-B současné stisknutí kláves Control a písmena B. Podobně M-B stisk klávesy Meta (Alt) a písmena B.
... Pythonu:A.2
Python po svém startu spouští obsah souboru, na nějž ukazuje proměnná prostředí PYTHONSTARTUP. Více viz druhá kapitola.
Viz O tomto dokumentu... kde naleznete informace, jak upozornit na případné chyby.