我試圖編寫簡單的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
行爲。