开发者

vim how to create a debug message fast

开发者 https://www.devze.com 2023-01-04 17:41 出处:网络
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

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 c开发者_运维问答an 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.


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


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


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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消