我尝试了两种不同的方式来编写我的函数。我决定编写一个小型函数,使用这个elisp字符串库将文本转换为驼峰式并进行反向操作。一开始通过搜索发现了这篇教程,学会了在点位替换字符,并编写出这个函数:
; use string manipulation library to switch between camel and snake (s.el)
(defun my_test ()
"test"
(interactive)
;; get current selection or word
(let (bds p1 p2 inputStr resultStr)
;; get boundary
(if (use-region-p)
(setq bds (cons (region-beginning) (region-end) ))
(setq bds (bounds-of-thing-at-point 'word)) )
(setq p1 (car bds) )
(setq p2 (cdr bds) )
;; grab the string
(setq inputStr (buffer-substring-no-properties p1 p2) )
(setq resultStr (s-lower-camel-case inputStr))
(message inputStr)
(delete-region p1 p2 ) ; delete the region
(insert resultStr) ; insert new string
)
)
这并没有按预期修改resultStr
,而只是把inputStr
复制粘贴到了那里。
我不理解的是,当我使用M-:
eval (setq resultStr (s-lower-camel-case "other_string"))
时,我得到了预期的结果("otherString"
)
我甚至尝试了另一种(对我的目的来说更好的)编写该函数的方式,灵感来自于这个SO问题:
(defun change-word-at-point (fun)
(cl-destructuring-bind (beg . end)
(bounds-of-thing-at-point 'word)
(let ((str (buffer-substring-no-properties beg end)))
(delete-region beg end)
(insert (funcall fun str)))))
(defun my_test_camel ()
(interactive)
(change-word-at-point 's-lower-camel-case))
它受到相同问题的困扰。这让我认为 s-lower-camel-case
函数存在问题(或者我调用它的方式有问题),但是当从上面提到的 eval 调用时它能正常运行。
编辑:修改第一个函数以包含 let 语法,详见注释。
编辑 #2:这两个函数都能够正确工作,已经接受了答案,因为它提供了一个带有 symbol 信息和正确书写方式的更好的替代方案。我的问题出在测试上,这是由于 haskell-mode 引起的。新问题在这里。
s-lower-camel-case
函数来自于位于这里的s.el
库。 - Mike H-Rdelete-region
不会移动光标,而insert
会将其参数插入到光标处。这可能是问题的一部分吗? - user725091(let* ((bds …) (p1 …) (p2 …)) …)
来绑定局部变量,而不是使用setq
(当没有周围的let
绑定时,它将操作该名称的全局变量)。 - user725091