2017-10-29 2 views
1

Ich habe mehrere Fragen/Antworten/Blogs ohne Erfolg gesucht. Wie lösche/lösche doppelte Befehle aus dem IRB-Verlauf?Wie du doppelte Befehle aus dem IRB-Verlauf entfernst?

Idealerweise möchte ich das gleiche Verhalten haben, das ich für meine Bash konfiguriert habe. Das heißt: Nachdem ich einen Befehl ausgeführt habe, wird jeder zweite Eintrag im Verlauf mit dem exakt gleichen Befehl gelöscht.

Aber es wäre schon gut, Duplikate zu eliminieren, wenn ich irb schließe.

Mein aktueller .irbrc:

require 'irb/ext/save-history' 
IRB.conf[:SAVE_HISTORY] = 1000 
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb_history" 
IRB.conf[:AUTO_INDENT] = true 

Hinweis: Rubin 2.4.1 (! Oder neue)

Antwort

0

Dies wird Duplikate nach dem Schließen IRB-Konsole beseitigen. Aber es funktioniert nur für IRBs mit Readline (Mac-Benutzer gewarnt).

# ~/.irbrc 
require 'irb/ext/save-history' 
IRB.conf[:SAVE_HISTORY] = 1000 
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb_history" 

deduplicate_history = Proc.new do 
    history = Readline::HISTORY.to_a 
    Readline::HISTORY.clear 
    history.reverse!.uniq! 
    history.reverse!.each{|entry| Readline::HISTORY << entry} 
end 

IRB.conf[:AT_EXIT].unshift(deduplicate_history) 

Und dieser Affe Patch Duplikate on the fly beseitigen, wenn Ihr IRB Readline verwendet:

require 'irb/ext/save-history' 
IRB.conf[:SAVE_HISTORY] = 1000 
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb_history" 

class IRB::ReadlineInputMethod 
    alias :default_gets :gets 
    def gets 
     if result = default_gets 
      line = result.chomp 
      history = HISTORY.to_a 
      HISTORY.clear 
      history.each{|entry| HISTORY << entry unless entry == line} 
      HISTORY << line 
     end 
     result 
    end 
end 

Jeder Vorschlag, wie man es verbessern?

0

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
Verwandte Themen