Есть ли функция emacs для преобразования слова с верблюжьей линией для подчеркивания? Что-то вроде:
longVariableName
M-x
to-underscore
long_variable_name
Есть ли функция emacs для преобразования слова с верблюжьей линией для подчеркивания? Что-то вроде:
longVariableName
M-x
to-underscore
long_variable_name
(progn (replace-regexp "\\([A-Z]\\)" "_\\1" nil (region-beginning) (region-end))
(downcase-region (region-beginning) (region-end)))
Используйте пакет string-inflection, доступный на MELPA, или https://github.com/akicho8/string-inflection.
Полезные сочетания клавиш, скопированные из https://www.emacswiki.org/emacs/CamelCase:
;; Cycle between snake case, camel case, etc.
(require 'string-inflection)
(global-set-key (kbd "C-c i") 'string-inflection-cycle)
(global-set-key (kbd "C-c C") 'string-inflection-camelcase) ;; Force to CamelCase
(global-set-key (kbd "C-c L") 'string-inflection-lower-camelcase) ;; Force to lowerCamelCase
(global-set-key (kbd "C-c J") 'string-inflection-java-style-cycle) ;; Cycle through Java styles
Для переключения между верблюжьей линией и символами подчеркивания я использую следующее:
(defun toggle-camelcase-underscores ()
"Toggle between camelcase and underscore notation for the symbol at point."
(interactive)
(save-excursion
(let* ((bounds (bounds-of-thing-at-point 'symbol))
(start (car bounds))
(end (cdr bounds))
(currently-using-underscores-p (progn (goto-char start)
(re-search-forward "_" end t))))
(if currently-using-underscores-p
(progn
(upcase-initials-region start end)
(replace-string "_" "" nil start end)
(downcase-region start (1+ start)))
(replace-regexp "\\([A-Z]\\)" "_\\1" nil (1+ start) end)
(downcase-region start (cdr (bounds-of-thing-at-point 'symbol)))))))
Я использую это при преобразовании кода С# в PHP.
(defun un-camelcase-word-at-point ()
"un-camelcase the word at point, replacing uppercase chars with
the lowercase version preceded by an underscore.
The first char, if capitalized (eg, PascalCase) is just
downcased, no preceding underscore.
"
(interactive)
(save-excursion
(let ((bounds (bounds-of-thing-at-point 'word)))
(replace-regexp "\\([A-Z]\\)" "_\\1" nil
(1+ (car bounds)) (cdr bounds))
(downcase-region (car bounds) (cdr bounds)))))
И затем в моем php-режиме fn:
(local-set-key "\M-\C-C" 'un-camelcase-word-at-point)
В 2018 году появился еще один общий путь: magnars/s.el: давно потерянная библиотека Emacs для работы со строками. - github.com, некоторые примеры относительно вопроса OP:
В любом случае, в случае со змеей (подчеркивание отдельно):
(s-snake-case "some words") ;; => "some_words"
(s-snake-case "dashed-words") ;; => "dashed_words"
(s-snake-case "camelCasedWords") ;; => "camel_cased_words"
в любом случае, чтобы опустить верблюжий случай:
(s-lower-camel-case "some words") ;; => "someWords"
(s-lower-camel-case "dashed-words") ;; => "dashedWords"
(s-lower-camel-case "under_scored_words") ;; => "underScoredWords"
увидеть больше примеров на его репо.
Ответ @ens был близок, но для меня в Emacs 26.1 была небольшая ошибка. Я исправил ошибку и добавил возможность, через префикс C-u arg, указывать, хотите ли вы, чтобы первая буква верблюда была строчной:
(defun toggle-camelcase-underscores (first-lower-p)
"Toggle between camelcase and underscore notation for the
symbol at point. If prefix arg, C-u, is supplied, then make first
letter of camelcase lowercase."
(interactive "P")
(save-excursion
(let* ((bounds (bounds-of-thing-at-point 'symbol))
(start (car bounds))
(end (cdr bounds))
(currently-using-underscores-p (progn (goto-char start)
(re-search-forward "_" end t))))
(if currently-using-underscores-p
(progn
(replace-string "_" " " nil start end)
(upcase-initials-region start end)
(replace-string " " "" nil start end)
(when first-lower-p
(downcase-region start (1+ start))))
(replace-regexp "\\([A-Z]\\)" "_\\1" nil (1+ start) end)
(downcase-region start (cdr (bounds-of-thing-at-point 'symbol)))))))