Ein AT_EXIT
Haken ist eine vollkommen akzeptable Möglichkeit, dies zu tun. Obwohl Affepatching nicht benötigt wird. IRB bietet dafür die Möglichkeit, eine eigene Eingabemethode zu erstellen.
IRB erhält seinen Eingang von einem InputMethod
. Die Geschichte wird durch die ReadlineInputMethod
, die eine Unterklasse ist, zur Verfügung gestellt.
InputMethod
s sind an eine Context
angeschlossen. Wenn Sie conf
in einer irb
Sitzung eingeben, erhalten Sie Zugriff auf den aktuellen Kontext.
irb
wird Eingang gemäß dem aktuellen Kontext io
lesen. Zum Beispiel:
irb [2.4.0] (screenstaring.com)$ conf.io
=> #<HistoryInputMethod:0x007fdc3403e180 @file_name="(line)", @line_no=3, @line=[nil, "4317.02 - 250 \n", "conf.id\n", "conf.io\n"], @eof=false, @stdin=#<IO:fd 0>, @stdout=#<IO:fd 1>, @prompt="irb [2.4.0] (screenstaring.com)$ ", @ignore_settings=[], @ignore_patterns=[]>
Verwendet my Bash-like history control class (für weitere Informationen siehe unten).
Sie können conf.io
auf etwas festgelegt, die der InputMethod
Schnittstelle entspricht:
conf.io = MyInputMethod.new
Was MyInputMethod#gets
Renditen von IRB bewertet wird. Typischerweise liest es von stdin
.
IRB sagen Ihre InputMethod
beim Start verwenden Sie die :SCRIPT
Konfigurationsoption festlegen:
# .irbrc
IRB.conf[:SCRIPT] = MyInputMethod.new
IRB :SCRIPT
‚s-Wert als Eingabemethode verwenden, wenn creating a Context
. Dies kann auf eine Datei eingestellt werden, um deren Inhalt als Eingabemethode zu verwenden. Standardmäßig ist es nil
, was dazu führt, dass stdin
verwendet wird (über Readline
, wenn es verfügbar ist).
eine Eingabemethode zu erstellen, die ReadlineInputMethod#gets
Duplikate außer Kraft setzen ignoriert:
class MyInputMethod < IRB::ReadlineInputMethod
def gets
line = super # super adds line to HISTORY
HISTORY.pop if HISTORY[-1] == HISTORY[-2]
line
end
end
Die InputMethod
in my .irbrc
definiert ermöglicht eine IRB_HISTCONTROL
oder IRB_HISTIGNORE
wie würden Sie setzen (mehr oder weniger) für Bash:
IRB_HISTIGNORE=ignoreboth IRB_HISTCONTROL='\Aq!:foo' irb
Das macht folgendes:
- Einträge mit einem Leerzeichen beginnen oder kopieren (back-to-back) Einträge werden nicht in die Geschichte
- Einträge mit
q!
(a custom method of mine) oder foo
enthalten Beginn zugegeben werden nicht an Geschichte
hinzugefügt werden