【问题标题】:Emacs ruby symbol word completionEmacs ruby​​ 符号单词完成
【发布时间】:2011-03-25 02:49:46
【问题描述】:

我经常定义一个红宝石符号(例如:some_value),然后我想创建一个同名的方法def some_value

不幸的是,第二次出现 some_value 字符串的自动补全(M + /)不起作用,略有不同(:some_valuesome_value)。

如何设置 emacs 来处理此类事件?

【问题讨论】:

  • M-/ 映射到您的确切位置是什么?如果是 dabbrev-expand,你的 dabbrev-abbrev-char-regexp 值是多少?
  • 就像 0x4b 所说,我们需要更多信息。你用的是什么红宝石模式?红宝石模式? MuMaMo模式? FWIW,当字符串的唯一其他出现是 :some_value 时,dabbrev 对我来说完成得很好。
  • 我正在使用基本的 ruby​​ 模式。我没有改变 M - / 所做的事情。但是,我使用的是什么模式完全无关紧要。它在没有模式的“临时”缓冲区中不起作用。
  • *scratch* 默认情况下实际上处于 lisp-interaction-mode。您能否输入以下内容并告诉我们 Emacs 写入 minibuffer 的内容? C-h k M-/
  • 你使用的模式是 VERY 相关的,因为模式设置了哪些符号是单词组成部分,哪些是语法、括号等。每个缓冲区都有一个模式, Emacs 不可能有没有模式的缓冲区。

标签: ruby emacs autocomplete symbols


【解决方案1】:

假设 M-/ 绑定到 dabbrev-expand,您可以配置 dabbrev-mode 在扩展字符串时忽略某些前缀。要使单个冒号成为要忽略的前缀,请键入

M-x customize-group

然后

dabbrev

这将带您进入 dabbrev-mode 的自定义页面。转到 Dabbrev Abbrev Skip Leading Regexp 点并单击 Value menu。从菜单中选择“Regexp”。

现在您会在输入单个冒号的值菜单旁边看到一个标有“Regexp:”的文本字段。

:

然后单击下一行中的按钮State 并选择值“Save for Future Sessions”。

【讨论】:

【解决方案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 expand 通过在当前点上尝试许多不同的扩展来工作。这些扩展存储在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)

minibuffer 的读数显示这个特殊的扩展是使用try-expand-dabbrev 函数完成的。

【讨论】:

    【解决方案3】:

    不是直接回答您的问题,但您应该通过使用 auto complete modersense 配对来获得更智能的 Ruby 自动补全。

    【讨论】:

    • 谢谢,我还没有安装,但 rsense 看起来确实不错。
    【解决方案4】:

    如果 Dabbrev Abbrev Skip Leading Regexphippie-expand 不能完全满足您的要求,并且您有一些 elisp 技能,您可以为 hippie-expand 创建自定义函数。 p>

    请参阅 emacs-wiki 上 hippie-expand 页面上有关“substring expansion”的部分。有一个你可以在那里使用的功能,你可以定制来定制..

    Substring Expansion

    在进行 lisp 编程时,标准 dabbrev 用处不大,因为 Emacs 没有命名空间,所以在一个包中,符号以相同的前缀开头,因此如果要从包中完成符号,就必须一遍又一遍地键入相同的前缀.与 IswitchBuffers 一样,如果可以键入唯一的子字符串以获取所需的符号,则效率更高。

    Dabbrev 在这方面没有提供任何帮助,所以我求助于以前从未使用过的 Hippie Expand。

    这是一个基于 hippie expand dabbrev 扩展的函数,它执行子字符串扩展:

    (defun try-my-dabbrev-substring (old)
      (let ((old-fun (symbol-function 'he-dabbrev-search)))
        (fset 'he-dabbrev-search (symbol-function 'my-dabbrev-substring-search))
        (unwind-protect
            (try-expand-dabbrev old)
          (fset 'he-dabbrev-search old-fun))))
    
    
    (defun my-dabbrev-substring-search (pattern &optional reverse limit)
      (let ((result ())
        (regpat (cond ((not hippie-expand-dabbrev-as-symbol)
                   (concat (regexp-quote pattern) "\\sw+"))
                  ((eq (char-syntax (aref pattern 0)) ?_)
                   (concat (regexp-quote pattern) "\\(\\sw\\|\\s_\\)+"))
                  (t
                   (concat (regexp-quote pattern)
                       "\\(\\sw\\|\\s_\\)+")))))
        (while (and (not result)
            (if reverse
                 (re-search-backward regpat limit t)
                 (re-search-forward regpat limit t)))
          (setq result (buffer-substring-no-properties (save-excursion
                                                         (goto-char (match-beginning 0))
                                                         (skip-syntax-backward "w_")
                                                         (point))
                               (match-end 0)))
          (if (he-string-member result he-tried-table t)
          (setq result nil)))     ; ignore if bad prefix or already in table
        result))
    

    【讨论】:

      【解决方案5】:

      我想我会分享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 中的符号,因此此建议会创建一个临时语法表,其中 : 是标点符号并使用它调用 hippie-expand

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        • 2012-11-08
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多