1

我在rails上使用ruby,但这对这个问题并不重要。假设我有这样的声明

error = 'this is an error message'

我注意到我最终经常这样做

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

我确信可以编写一个宏,它将在最左侧 = 的左侧进行工作,然后创建另一行以及上面显示的模板。

我在 mac 上使用 mvim。关于我应该从哪里开始寻找开发我想要的东西的任何指针。

4

4 回答 4

3

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

于 2010-06-27T15:37:34.833 回答
3

我录制了一个简单的宏来执行您的示例。要记录宏类型q,然后是您希望将宏放入的寄存器(约定要求qq)。要播放宏类型@,然后是宏寄存器。您可以在以下位置查看此内容:help recording

要编写宏,请使用以下命令(这是在寄存器中的外观)

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

^移动到该行的第一个非空白字符

yE拉到空格分隔单词的末尾。

o将您置于下一行的插入模式

puts "error = #{是您输入的文本

^Octrl+ O(大写字母 o) - 这允许下一个且仅下一个命令在命令模式下运行,即...

p放置被抽出的词,运行此命令后,您仍处于插入模式

.inspect}"是您键入的文本,最后...

^[Esc

于 2010-06-28T01:42:24.583 回答
0

如果您正在执行这些操作,则 snipmate 代码段可能如下所示:

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

另一方面,如果您只想输出预先存在的变量以进行调试。Nick-Canzoneri 的宏可能更有用。

于 2010-06-28T18:46:38.740 回答
0

我会去:

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

:s提供了完成工作加上匹配分配的变量(如果有)的优势。yw用,等经典命令做同样的事情p会更麻烦。

如果模板变得更复杂,我们可以依赖模板文件扩展器,只要它们可以轻松调用 viml 函数,如matchstr(). 当然,在这种情况下,我会使用带有以下模板文件的mu-template :

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
于 2010-06-28T09:33:35.650 回答