Emacs Lisp 在更改缓冲区后通过开始和结束选择区域

Emacs Lisp make region selected by start and end after changing buffer

我想要一个 emacs 函数,它 selects(标记)由开始和结束给定的区域。 我试过

(defun mark-range (start end)
  "Mark buffer content from start to end"
  (message (concat "Select " (number-to-string start) " " (number-to-string end)))
  (setq bufmax (max start end))
  (setq bufmin (min start end))
  (goto-char bufmax)
  (set-mark bufmin) ;actually the comment on set-mark says: Do not use!

  ;(set-mark-command bufmin) did not work for this
)

在简单的函数中调用时它可以工作,但有时即使消息显示正确的开始和结束内容,这个函数也不起作用。 select离子然后就不存在了。

任何想法,我怎样才能实现可靠的功能? (我正在使用 spacemacs 开发分支)

编辑: 好的,这是用例,我实际上想像在 eclipse

中那样使用 Alt-Up Alt-Down 上下移动文本

我发现有块移动文本,但它不是我想要的:Select 区域接触并向上移动的完整行,然后保持 selected 以供再次使用。

所以我首先检查在第一行之前我必须移动多少行,然后再次使用它来 select 行。但是 selection 不起作用。它根本不存在。

我现在尝试整合 Drews 答案但没有真正帮助,标记没有出现,(添加停用标记,因为之前有一个,也没有运气)。 用我之前的方法试过,包括(activate, deactivate),还是不行。

(defun rl-move-up-block(start end)

  (let (last first dist m-start)
  (goto-char (max start end))
  (setq last (line-number-at-pos))

  (goto-char (min start end))
  (setq first (line-number-at-pos))

  (goto-char (min start end))
  (forward-line -1)

  (setq dist (+ (- last first) 1))

  (dotimes (i dist)
    (move-text-line-down))


  (forward-line (- 0 dist))
  (set-mark (line-beginning-position))
  (forward-line (- dist 1))
  (end-of-line)
  (activate-mark)
 )
)

(defun rl-move-up (start end)
  "Move text up like in eclipse"
  (interactive "r")
  (if (use-region-p)
      (rl-move-up-block start end)
    (move-text-line-up)
    )
  )

(global-set-key (kbd "M-<up>") 'rl-move-up)

编辑 2: 好吧,我刚刚发现如果我删除线条的移动,将其替换为仅移动光标,标记就可以正常工作。

  ;(dotimes (i dist)
  ;  (move-text-line-down))
  (forward-line dist)

所以问题是更改文本然后再次标记。 我曾经试图通过在每行之间放置一个睡眠来查看它在慢动作中的作用。

没有用,只是让整个功能花费了更长的时间 - 也许它需要刷新视图调用来进行某些操作。有什么东西可以刷新或完成更改吗?也许这有助于在移动行后使标记再次工作。

您只是缺少功能 activate-mark

文档说 set-mark 设置了标记,有时人们会不必要地这样做。在这里,您明确希望将标记设置在任意位置(STARTEND 中最小的位置)。

你还想最后打电话给message

(defun mark-range (start end)
  "..."
  (set-mark (min start end))
  (goto-char (max start end))
  (activate-mark)
  (message "Select %d to %d" start end))

原来有一个变量。

我检查了 move-text-down 现有命令的代码 并发现有一个变量设置为 nil 如果我在移动文本后这样做,它会起作用


  (dotimes (i dist)
    (move-text-line-down)) 

    (setq deactivate-mark nil) ; <<<<<<

    (forward-line (- 0 dist))