tags:

views:

70

answers:

4

I am using ruby on rails but that does not matter much for this question. Let's say that i have a statement like this

error = 'this is an error message'

I have noticed that I end up doing this a lot

error = 'this is an error message'
puts "error = #{error.inspect}"

I am sure a macro can be written which would take the work on the left hand side of left most = and then create another line along with template shown above.

I am using mvim on mac. Any pointer in terms of where I should start to look for developing what I want.

+3  A: 

Try snipmate: http://www.vim.org/scripts/script.php?script_id=2540

Jeff Pitman
+3  A: 

I recorded a simple macro that does your sample. To record a macro type q followed by what register you want the macro to be put in (convention calls for qq). To play the macro type @ then the macro register. You can view this at :help recording

To write the macro, use the following commands (and here is how is should look in the register)

^yEoputs "error = #{^Op.inspect}"^[

^ moves to the first non whitespace character of the line

yE yanks to the end of the space separated word.

o Puts you in insert mode on the next line

puts "error = #{ is the text that you type out

^O is ctrl+O (capital letter o) - this allows the next, and only the next command to be run in command mode, which is...

p Puts the yanked word, after this command is run you're still in insert mode

.inspect}" is the text that you type and finally...

^[ is Esc

Nick Canzoneri
A: 

I would go for:

nnoremap µ :s/^\s*\(\k\+\)\s*=.*/&\rputs "\1 = #{\1.inspect}"/<cr>

:s presents the advantage of doing the job plus matching the assigned variable if any. Doing the same thing with classical commands like yw, p, etc would be more cumbersome.

If the template become more complex, we can rely on template-file expanders as long as they easily permit to call viml function like matchstr(). Of course, in that case I would use mu-template with the following template-file:

VimL:" $Id: {rtp}/template/ruby/inspect.template
VimL: let s:value_start  = '¡'
VimL: let s:value_end    = '¡'
VimL: let s:reindent     = 1
VimL: let s:marker_open  = '<+'
VimL: let s:marker_close = '+>'
VimL: let s:varname = matchstr(getline(line('.')-1), '^\s*\zs\k\+\ze\s*=')
VimL: if empty(s:varname) |throw "the previous line don't assign any variable" |endif
puts "¡s:varname¡ = #{¡s:varname¡.inspect}"<++>
VimL:"vim: encoding=utf-8
Luc Hermitte
A: 

If you're doing these on the fly, a snipmate snippet could look like this:

${1:error} = '${2:error message here}'
puts "error = #{$1.inspect}"

If, on the other hand you're just wanting to output pre-existing variables for debugging purposes. Nick-Canzoneri's macro may be more useful.

jinfield