completion_proc
no6v (Nobuhiro IMAI)
   RubyKansai
  Sat, 21 Jul 2012
require "readline"
     line edit (←→)
     history (↑↓)
     completion (Tab)



01                      14
line edit
     Readline.readline("⚡ ")

     ⚡ ←→



02                             14
history
     Readline.readline("⚡ ", true)

     ⚡   Readline::HISTORY.clear
     ⚡   Readline::HISTORY << "a"
     ⚡   Readline::HISTORY << "b"
     ⚡   ↑↓


03                                   14
completion
     Readline.completion_proc
     Readline.completion_proc =
       ->(word){%w[word1 word2 ...]}




04                                     14
demo
demo
memo of demo
     github.com/jugyo/earthquake
     github.com/no6v/
     rubykansai55/blob/master/
     completion_proc.rb


06                                 14
fat man in readline
     puts Readline.
       methods(false).
       grep(->m{/[=?]$/!~m}).
       sort_by(&:size).
       reverse
     # refs hp12c http://bit.ly/QnKcDS



07                                       14
GJ! Thanks!! http://bit.ly/QnFG8r


08                               14
break
break
Array-like object
     Readline::HISTORY.class # => Object
     Readline::HISTORY.singleton_methods(false) # =>
      [:to_s, :[], :[]=, :<<, :push, :pop,
       :shift, :each, :length, :size, :empty?,
       :delete_at, :clear]
     Enumerable === Readline::HISTORY # => true




10                                                     14
but, somethings lack...
     unshift(*obj)
     last
      first(n)/last(n)

     delete_if{|x| ... }


11                         14
HISTORY.delete_if
     require "readline"

     class << Readline::HISTORY
       def delete_if(&block)
         return enum_for(__method__) unless block
         raise SecurityError if $SAFE == 4
         i = 0
         while (size > i) do
           break unless entry = self[i]
           if block.call(entry)
             delete_at(i)
           else
             i += 1
           end
         end
         return self
       end
     end



12                                                  14
hist_delete_if
     static VALUE
     hist_delete_if(VALUE self)
     {
       HIST_ENTRY *entry;
       int i = 0;

         RETURN_ENUMERATOR(self, 0, 0);

         rb_secure(4);
         while (history_length > i) {
           entry = history_get(history_get_offset_func(i));
           if (entry == NULL) break;
           if (RTEST(rb_yield(rb_locale_str_new_cstr(entry->line))))
             rb_remove_history(i);
           else
             i++;
         }
         return self;
     }




13                                                                     14
Thanks & Q?
Thanks & Q?

completion_proc and history

  • 1.
    completion_proc no6v (Nobuhiro IMAI) RubyKansai Sat, 21 Jul 2012
  • 2.
    require "readline" line edit (←→) history (↑↓) completion (Tab) 01 14
  • 3.
    line edit Readline.readline("⚡ ") ⚡ ←→ 02 14
  • 4.
    history Readline.readline("⚡ ", true) ⚡ Readline::HISTORY.clear ⚡ Readline::HISTORY << "a" ⚡ Readline::HISTORY << "b" ⚡ ↑↓ 03 14
  • 5.
    completion Readline.completion_proc Readline.completion_proc = ->(word){%w[word1 word2 ...]} 04 14
  • 6.
  • 7.
    memo of demo github.com/jugyo/earthquake github.com/no6v/ rubykansai55/blob/master/ completion_proc.rb 06 14
  • 8.
    fat man inreadline puts Readline. methods(false). grep(->m{/[=?]$/!~m}). sort_by(&:size). reverse # refs hp12c http://bit.ly/QnKcDS 07 14
  • 9.
  • 10.
  • 11.
    Array-like object Readline::HISTORY.class # => Object Readline::HISTORY.singleton_methods(false) # => [:to_s, :[], :[]=, :<<, :push, :pop, :shift, :each, :length, :size, :empty?, :delete_at, :clear] Enumerable === Readline::HISTORY # => true 10 14
  • 12.
    but, somethings lack... unshift(*obj) last first(n)/last(n) delete_if{|x| ... } 11 14
  • 13.
    HISTORY.delete_if require "readline" class << Readline::HISTORY def delete_if(&block) return enum_for(__method__) unless block raise SecurityError if $SAFE == 4 i = 0 while (size > i) do break unless entry = self[i] if block.call(entry) delete_at(i) else i += 1 end end return self end end 12 14
  • 14.
    hist_delete_if static VALUE hist_delete_if(VALUE self) { HIST_ENTRY *entry; int i = 0; RETURN_ENUMERATOR(self, 0, 0); rb_secure(4); while (history_length > i) { entry = history_get(history_get_offset_func(i)); if (entry == NULL) break; if (RTEST(rb_yield(rb_locale_str_new_cstr(entry->line)))) rb_remove_history(i); else i++; } return self; } 13 14
  • 15.