使用场景:
我一般会在scratch buffer中写一些通过文本生成其他语言代码的代码。文本就是我选中的区域。目前的我的做法是写一个interactive的function,然后选择一个车region执行。因为你要先c-x c-e执行下defun 然后再调用,很不方便。
所以有没有方法选择一个region 然后光标能继续移动,然后我就可以直接执行函数的body了。
使用场景:
我一般会在scratch buffer中写一些通过文本生成其他语言代码的代码。文本就是我选中的区域。目前的我的做法是写一个interactive的function,然后选择一个车region执行。因为你要先c-x c-e执行下defun 然后再调用,很不方便。
所以有没有方法选择一个region 然后光标能继续移动,然后我就可以直接执行函数的body了。
你需要了解overlay
没看明白什么意思?能否表达地更清楚些?最好配上一个例子。
没看明白,是要不移动光标执行整个函数? 可以试试 C-M-x (eval-defun)
id
name
hello_world
test1_test2
(defun gen-test ()
(interactive)
(--> (buffer-substring-no-properties (region-beginning) (region-end))
(split-string it "\n")
(-map (lambda (n)
(--> (split-string n "_")
(-map 'capitalize it)
(string-join it "")
(format "assert.Equal(t, a.%s, b.%s)" it it)
)
) it)
(string-join it "\n")
(replace-rectangle (region-beginning) (region-end) it) ;; 替换region内容,不会写,先用这个代替
)
)
比如我要生成代码
assert.Equal(t, a.Id, b.Id)
assert.Equal(t, a.Name, b.Name)
assert.Equal(t, a.HelloWorld, b.HelloWorld)
assert.Equal(t, a.Test1Test2, b.Test1Test2)
然后复制到代码里。
但是这个操作我要先执行下gen-test 让它加载,然后再选中,然后再调用。很麻烦. 我想能选中,然后c-x c-e直接执行这个代码然后生成出来.
(--> (buffer-substring-no-properties (region-beginning) (region-end))
(split-string it "\n")
(-map (lambda (n)
(--> (split-string n "_")
(-map 'capitalize it)
(string-join it "")
(format "assert.Equal(t, a.%s, b.%s)" it it)
)
) it)
(string-join it "\n")
(replace-rectangle (region-beginning) (region-end) it)
)
嗯嗯。好的。我了解下。多谢。
你可以设置开始和结束的标志
----start----
id
name
hello_world
test1_test2
---end----
标志可以让你对多个区域执行多种操作
用 M-:
(eval-expression
) 显然可以(M-x ielm
也行),还有就是用一个新的 Buffer,假设你要修改的内容在 *foo*
中,选中之后,跑到 *scratch*
中写修改它的代码:
至于你举的例子,可以用 C-M-%
(query-replace-regexp
) 解决:
C-M-% .* RET assert.Equal(t, a.\&, b.\&) RET
我这里的数据比较简单,所以可以regex,复杂了regex就麻烦了。
新开一个buffer还没我之前的方便呢。步骤多了很多。
M-: 这个我试了下, 不好输入,在minibuffer里,不好编辑大块代码
标志相关api是哪些呢。。不知道英文叫啥。。
C-h f search-forward
自己处理太麻烦了。
这个看起来可以,我试试。多谢。。
想了想,自己定义两个全局变量记录开始结束point也可以。-0-
自己定义的话一个overlay就搞定了,就是懒猫之前说的那个
regex不行可以用kmacro啊,在macro结束前要包含转移到下一个执行位置的命令,这样执行起来和C-M-%
差不多。
昨天看到 minibuffer 中可以通过 C-q C-j
进行换行,可以试试;但我可能配置有问题,目前无法生效。