VIM/ruby

I am want to build a class or set of classes to use in VIM so that I can
more easily script vim/ruby. The problem with the current set of classes
is that I want VIM::Buffer, VIM::Window, and the buffer lists to act
just like arrays so that I could do the following:

: ruby $curbuf.sort {|a,b| a.to_i <=> b.to_i}

My solution is to build a proxy class for the lines in a buffer that is
a sub-class of an array so that I would be able to do the following:

: ruby VIMbuf($curbuf).sort {|a,b| a.to_i <=> b.to_i}

Is there a better way to do this or should I proceed as above?

Steve Tuckner

You don’t need to subclass Array at all to do this. Just mix in
Enumerable and define each().

For instance, source this in Vim:

ruby <<EOF
module VIM
class B
include Enumerable
def initialize(b = VIM::Buffer.current)
@b = b
end
def each(&block)
(1…@b.count).each { |n| block.call(@b[n]) }
end
end
end

def p(s)
b = VIM::Buffer.current
b.append(b.count, s.inspect)
end

print out all the lines of this file

def beach(&block)
b = VIM::B.new
b.each(&block)
end
beach { |s| puts s }

append all the lines of this file to the end.

b = VIM::B.new
b.sort.each { |s| p “s: #{s}” }

EOF

Have you seen Benoit Cerrina’s VimRubyX?

There may be some good ideas in that…

http://vim.sourceforge.net/scripts/script.php?script_id=248

···

On Friday 05 July 2002 03:11 pm, Steve Tuckner wrote:

I am want to build a class or set of classes to use in VIM so that
I can more easily script vim/ruby. The problem with the current set
of classes is that I want VIM::Buffer, VIM::Window, and the buffer
lists to act

just like arrays so that I could do the following:
: ruby $curbuf.sort {|a,b| a.to_i <=> b.to_i}

My solution is to build a proxy class for the lines in a buffer
that is

a sub-class of an array so that I would be able to do the following:
: ruby VIMbuf($curbuf).sort {|a,b| a.to_i <=> b.to_i}

Is there a better way to do this or should I proceed as above?


Ned Konz
http://bike-nomad.com
GPG key ID: BEEA7EFE

Or you could just mix in each() to VIM::Buffer and VIM::Window…
now you can sort them, etc.

ruby <<EOF
module VIM
class Buffer
include Enumerable

each line in buffer…

def each(&block)
(1…count).each { |n| block.call(self[n]) }
end

each buffer…

def self.each(&block)
(0…count-1).each { |n| block.call(self[n]) }
end
end
class Window
include Enumerable

each window…

def self.each(&block)
(0…count-1).each { |n| block.call(self[n]) }
end
end
end

def p(s)
b = VIM::Buffer.current
b.append(b.count, s.inspect)
end

print out all the lines of this file

def beach(&block)
b = VIM::Buffer.current
b.each(&block)
end
beach { |s| puts s }

append all the lines of this file to the end.

b = VIM::Buffer.current
b.sort.each { |s| p “s: #{s}” }

EOF

···

On Friday 05 July 2002 03:11 pm, Steve Tuckner wrote:

I am want to build a class or set of classes to use in VIM so that
I can more easily script vim/ruby. The problem with the current set
of classes is that I want VIM::Buffer, VIM::Window, and the buffer
lists to act

just like arrays so that I could do the following:
: ruby $curbuf.sort {|a,b| a.to_i <=> b.to_i}


Ned Konz
http://bike-nomad.com
GPG key ID: BEEA7EFE

OK, here’s a file that you can put in your ~/.vim/plugin directory
that will extend Vim’s Ruby model to allow sort, each, etc.
as well as whole buffer replacements like:

ruby $curbuf.set_to( $curbuf.sort )
ruby $curbuf.set_to( $curbuf.grep(/abc/))

" Extension to built-in Ruby support to add enumerable (each, sort,
etc.) to
" both VIM::Buffer (class & instance) and VIM::Window (class)
if has(“ruby”)
ruby <<EOF
module VIM
class Buffer
include Enumerable

each line in buffer…

def each(&block)
(1…count).each { |n| block.call(self[n]) }
end
def each_with_index(&block)
(1…count).each { |n| block.call(self[n],n) }
end

set me to the given array of strings

so you can do (for instance):

ruby $curbuf.set_to( $curbuf.sort )

ruby $curbuf.set_to( $curbuf.grep(/abc/))

def set_to(arr)
if arr.size <= count
arr.each_with_index { |s,i| self[i+1] = s }
while count > arr.size
self.delete(count)
end
else
arr.each_with_index do |s,i|
if i+1 <= count
self[i+1] = s
else
append(i, s)
end
end
end
end

each buffer…

def self.each(&block)
(0…count-1).each { |n| block.call(self[n]) }
end
end
class Window
include Enumerable

each window…

def self.each(&block)
(0…count-1).each { |n| block.call(self[n]) }
end
end
end
EOF
endif

Thanks so…much for your work! The solution (of course) was much more
elegant than I thought it could be. I am glad I posted it for consideration
first…

Steve Tuckner

···

-----Original Message-----
From: Ned Konz [mailto:ned@bike-nomad.com]
Sent: Friday, July 05, 2002 6:49 PM
To: ruby-talk@ruby-lang.org
Subject: Ruby extensions for VIM

OK, here’s a file that you can put in your ~/.vim/plugin directory
that will extend Vim’s Ruby model to allow sort, each, etc.
as well as whole buffer replacements like:

ruby $curbuf.set_to( $curbuf.sort )
ruby $curbuf.set_to( $curbuf.grep(/abc/))

" Extension to built-in Ruby support to add enumerable (each, sort,
etc.) to
" both VIM::Buffer (class & instance) and VIM::Window (class)
if has(“ruby”)
ruby <<EOF
module VIM
class Buffer
include Enumerable

each line in buffer…

def each(&block)
(1…count).each { |n| block.call(self[n]) }
end
def each_with_index(&block)
(1…count).each { |n| block.call(self[n],n) }
end

set me to the given array of strings

so you can do (for instance):

ruby $curbuf.set_to( $curbuf.sort )

ruby $curbuf.set_to( $curbuf.grep(/abc/))

def set_to(arr)
if arr.size <= count
arr.each_with_index { |s,i| self[i+1] = s }
while count > arr.size
self.delete(count)
end
else
arr.each_with_index do |s,i|
if i+1 <= count
self[i+1] = s
else
append(i, s)
end
end
end
end

each buffer…

def self.each(&block)
(0…count-1).each { |n| block.call(self[n]) }
end
end
class Window
include Enumerable

each window…

def self.each(&block)
(0…count-1).each { |n| block.call(self[n]) }
end
end
end
EOF
endif