separedit.el: 在单独的缓冲区编辑注释、docstring 或其中的代码块

我自己挖一下坟。

正在实现 multible string 功能(issue#38),不是 multi-line string 一个字符串包含多行,而是把个多个连续(无论直排/横排)的单行字符串聚集起来编辑:

Screenshot_2023-07-01_at_9.13.01_PM Screenshot_2023-07-01_at_9.12.17_PM

对于某些语言或场景需要经常拼接字符串有帮助。

现在比较纠结的是,如何触发这个动作。

  1. 光标位于在字符串之外时触发。
["foo"      C-c '   foo
 |"bar"     ---->   b|ar
  "quxx"]           quux
  1. 光标位于在字符串之中时触发。但有时我有可能又只想编辑单个字符串,这就有冲突了。
["foo"      C-c '   foo
  "b|ar"    ---->   b|ar
  "quxx"]           quux

代码暂时放在分支 feat-multi-string-block

3 个赞

很棒的包 :star_struck:,之前一直想找 emacs 中实现类似 jetbrian idea Language injections 的方案。

我配合 GitHub - andreasjansson/language-detection.el: Automatic programming language detection of code snippets, in Emacs Lisp, 可以大概自动识别字符串中的语言

(use-package separedit
  :ensure t
  :demand t

  :config
  (add-to-list 'separedit-string-quotes-alist
	       '(ruby-mode "\"\"\"" "'''" "\"" "'" "`"))

  :init
  (defun bind-separedit-key()
    (local-set-key (kbd "C-c '") #'separedit))
  (add-hook 'prog-mode-hook 'bind-separedit-key))

(use-package language-detection
  :ensure t
  :demand t

  :init
  (defun my-separedit-guass-mode()
    "Guass buffer's code language using `language-detection-buffer'.
And then switch to prefer mode."
    (when (derived-mode-p 'separedit-single-quote-string-mode
                          'separedit-double-quote-string-mode)
      (let* ((language (language-detection-buffer))
	     (mode (intern (concat (symbol-name language) "-mode")))
	     (header-line-format-back header-line-format))
	(if (fboundp mode)
	    (progn
	      (funcall mode)
	      (setq-local header-line-format header-line-format-back))))))
  
    (add-hook 'separedit-buffer-creation-hook 'my-separedit-guass-mode))```

美中不足的是目前还没有支持 “" 的识别,例如 ruby 中 "” 是直接调用 shell 的,可以考虑加一个 'separedit-back-quote-string-mode,在这个 mode 中默认打开 shell-script-mode.

等有空看看能不能搞个 pr 出来支持 :stuck_out_tongue:

2 个赞