我经常定义一个ruby符号(例如:some_value
),然后我想创建一个名为def some_value
的方法。
不幸的是,第二次出现some_value字符串的自动完成(M + /
)不起作用,略有不同(:some_value
vs some_value
)。
如何设置emacs来处理此类事件?
答案 0 :(得分:7)
假设M- /绑定到dabbrev-expand,您可以配置dabbrev-mode以在扩展字符串时忽略某些前缀。要使单个冒号成为要忽略的前缀,请键入
M-x customize-group
然后
dabbrev
这将带您进入dabbrev-mode的自定义页面。转到 Dabbrev Abbrev Skip Leading Regexp 并单击Value menu
。从菜单中选择“Regexp”。
现在您在值菜单旁边看到一个标有“正则表达式:”的文本字段,您可以在其中输入单个冒号。
:
然后点击下一行中的按钮State
,然后选择值“保存以供将来使用”。
答案 1 :(得分:2)
首先,我的结果!我在模型中输入了:some_crazy_symbol
。在换行符中,我输入def so
,点击M-/
两次,最后输入
def some_crazy_symbol
end
(Rinari提供了end
。)
使用hippie-expand
让我的工作做得很好。如果您想对其进行测试,请将hippie-expand
绑定到M-/
,如下所示:
(global-set-key (kbd "M-/") 'hippie-expand)
下面有' documentation。 Hippie通过在当前点上尝试许多不同的扩展来扩展工作。这些扩展存储在hippie-expand-try-functions-list
变量中。在我的系统上(默认),此变量设置为:
(try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-lisp-symbol-partially try-complete-lisp-symbol)
迷你缓冲区读数显示此特定扩展是使用try-expand-dabbrev
函数完成的。
答案 2 :(得分:1)
不能直接回答您的问题,但是您应该使用auto complete mode与rsense配对来获得更智能的Ruby自动完成功能。
答案 3 :(得分:1)
如果 Dabbrev Abbrev Skip Leading Regexp 和hippie-expand
没有完全符合您的要求并且您有一些elisp技能,那么您可以为{{1}创建一个自定义函数}。
请参阅emacs-wiki上 substring expansion 页面上有关“hippie-expand”的部分。你可以在那里使用一个功能,你可以定制自定义..
<强> Substring Expansion 强>
在进行lisp编程时,标准dabbrev不太有用,因为Emacs没有名称空间,所以在包中符号以相同的前缀开头,因此如果想要从包中完成符号,则必须反复输入相同的前缀。与IswitchBuffers一样,如果可以键入唯一的子字符串以获得所需的符号,则效率会更高。
Dabbrev在这方面没有任何提供,所以我转向了以前从未使用过的Hippie Expand。
这是一个基于hippie expand dabbrev扩展的函数,它执行子串扩展:
hippie-expand
答案 4 :(得分:1)
我想我会分享solution I came up with that works for hippie-expand
。
总结:
(defun hippie-expand-ruby-symbols (orig-fun &rest args)
(if (eq major-mode 'ruby-mode)
(let ((table (make-syntax-table ruby-mode-syntax-table)))
(modify-syntax-entry ?: "." table)
(with-syntax-table table (apply orig-fun args)))
(apply orig-fun args)))
(advice-add 'hippie-expand :around #'hippie-expand-ruby-symbols)
当hippie-expand
被视为标点字符时, ruby-mode
会在:
中展开符号,因此此建议会创建一个临时语法表,其中:
是标点符号并调用{ {1}}用它。