emacs 如何选中一个区域,但是光标能继续移动??

elisp

#1

使用场景:

我一般会在scratch buffer中写一些通过文本生成其他语言代码的代码。文本就是我选中的区域。目前的我的做法是写一个interactive的function,然后选择一个车region执行。因为你要先c-x c-e执行下defun 然后再调用,很不方便。

所以有没有方法选择一个region 然后光标能继续移动,然后我就可以直接执行函数的body了。


#2

你需要了解overlay


#3

没看明白什么意思?能否表达地更清楚些?最好配上一个例子。


#4

没看明白,是要不移动光标执行整个函数? 可以试试 C-M-x (eval-defun)


#5
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)
       )

#6

嗯嗯。好的。我了解下。多谢。


#7

你可以设置开始和结束的标志

----start----
id
name
hello_world
test1_test2
---end----

#8

标志可以让你对多个区域执行多种操作


#9

M-: (eval-expression) 显然可以(M-x ielm 也行),还有就是用一个新的 Buffer,假设你要修改的内容在 *foo* 中,选中之后,跑到 *scratch* 中写修改它的代码:

至于你举的例子,可以用 C-M-% (query-replace-regexp) 解决:

C-M-% .* RET assert.Equal(t, a.\&, b.\&) RET

#10

我这里的数据比较简单,所以可以regex,复杂了regex就麻烦了。

新开一个buffer还没我之前的方便呢。步骤多了很多。

M-: 这个我试了下, 不好输入,在minibuffer里,不好编辑大块代码


#11

标志相关api是哪些呢。。不知道英文叫啥。。


#12

secondary selection?


#13

C-h f search-forward


#14

自己处理太麻烦了。


#15

这个看起来可以,我试试。多谢。。


#16

想了想,自己定义两个全局变量记录开始结束point也可以。-0-


#17

自己定义的话一个overlay就搞定了,就是懒猫之前说的那个


#18

regex不行可以用kmacro啊,在macro结束前要包含转移到下一个执行位置的命令,这样执行起来和C-M-% 差不多。


#19

刚才无意中搜到一个相关的,贴在这里吧: https://emacs.stackexchange.com/questions/30533/highlight-region


#20

昨天看到 minibuffer 中可以通过 C-q C-j 进行换行,可以试试;但我可能配置有问题,目前无法生效。