我试图编写简单的Emacs函数来转换C风格的人和骆驼人的风格(即c_style < - > cStyle)之间的ID。但由于某种原因,Emacs内置的downcase
函数会保留完整的单词。 M-x downcase-word
工作正常,所以我完全失去了。任何想法都欢迎。为什么Emacs的“downcase”函数会拒绝执行downcaasing?
(defun toggle-id-style()
"Toggle between C-style ids and camel Case ones (i.e. c_style_id -> cStyleId and back)."
(interactive)
(save-excursion
(progn
(re-search-forward "[^A-Za-z0-9_]" nil t)
(let ((end (point))
(case-fold-search nil))
(progn
(re-search-backward "[^A-Za-z0-9_]" nil t)
(let* ((cstyle (if (string-match "_" (buffer-substring-no-properties (point) end)) t nil))
(regexp (if cstyle "_\\(\\w+\\)" "\\([A-Z][a-z0-9]+\\)"))
(func (if cstyle 'capitalize (lambda (s) (concat "_" (downcase s))))))
(progn
(while (re-search-forward regexp end t)
(replace-match (funcall func (match-string 1)) nil nil)))))))))
;;M-x replace-regexp _\(\w+\) -> \,(capitalize \1) ;; c_style -> cStyle
;;M-x replace-regexp \([A-Z][a-z0-9]+\) -> _\,(downcase \1) ;;cStyle -> c_style
如果我转换c_style
,但是当我试图转换cStyle
我c_Style
作为结果,它工作正常。是的,我检查了这是由于downcase
行为。