Emacs 为什么haskell模式会选择s-lower-camel-case,它是如何做到的?

Emacs 为什么haskell模式会选择s-lower-camel-case,它是如何做到的?,emacs,elisp,Emacs,Elisp,我准备了一个最简单的工作示例,以检查其他依赖性是否影响了这一点。测试功能是: (defun test-haskell-problems () (interactive) (insert (s-lower-camel-case "other_string"))) 问题的完整再现(软件包安装)发生在以下情况: (setq package-list '( s haskell-mode

我准备了一个最简单的工作示例,以检查其他依赖性是否影响了这一点。测试功能是:

(defun test-haskell-problems ()
    (interactive)
      (insert (s-lower-camel-case "other_string")))
问题的完整再现(软件包安装)发生在以下情况:

(setq package-list '(
                     s
                     haskell-mode
                     ))

(when (>= emacs-major-version 24)
    (require 'package)
      (package-initialize)
        (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
          )

; activate all the packages (in particular autoloads)
(package-initialize)

; fetch the list of packages available 
(when (not package-archive-contents)
    (package-refresh-contents))

; install the missing packages
 (dolist (package package-list)
   (when (not (package-installed-p package))
     (package-install package)))

(require 's)
(defun test-haskell-problems ()
    (interactive)
      (insert (s-lower-camel-case "other_string")))
通过在haskell缓冲区中激活此函数
test haskell problems
,我们得到字符串结果
other_string
预期结果,结果是
*scratch*
缓冲区是
otherString
我不明白这里发生了什么


有人有什么想法吗?

这是因为定义“单词”的语法条目。在Haskell中,asdf_asdf是一个单词,s.el通过将字符串逐词拆分来完成大小写

一个简单的解决方案是在临时缓冲区中执行骆驼套管

(插入(带临时缓冲区(s-lower-camel-case“asdf_asdf”))
一个更正确的解决方案是临时重新定义单词边界

编辑:在这里

这也要快得多:

(基准10000'(带临时缓冲区(s-lower-camel-case“asdf_asdf”))
“运行时间:1.188508s(2个地面军事系统中为0.204679s)”
(基准10000'(带语法表(生成语法表)(s-lower-camel-case“asdf_asdf”))
“运行时间:0.368366s(2个地面军事系统中为0.191607s)”

可能与解释的原因相同。这正是问题所在,与其干扰单词定义,不如在临时缓冲区中进行压缩,然后插入其内容<代码>(插入(带临时缓冲区(s-lower-camel-case“asdf_asdf”))
(insert (with-syntax-table (make-syntax-table) (s-lower-camel-case "asdf_asdf")))