在emacs中移动区域或行

fik*_*nik 11 emacs indentation text-manipulation

我正在寻找emacs的方法,通过n空格向右或向左移动文本.它在vim <<或中的类似功能>>.它应该在区域上工作,或者如果在当前行上没有选择区域,并且不将光标从其当前位置移动.

来自EmacsWiki的解决方案并不能很好地工作,M-x indent-rigidly因为它有点记住了最后使用的区域并转而改变了一个区域.最接近似乎是这里的一个,但我没有设法让它工作.我不是一个lisp开发人员,因此修改代码很困难.我将不胜感激任何帮助.

谢谢!

ych*_*che 33

你可以选择区域,然后C-u C-x <tab>移动4个空格.您可以在Cu之后键入一个数字以将4更改为其他任何内容.

  • 还有一个提示:`Cu` 后面的数字可能是负数,在这种情况下,区域将向左移动而不是向右移动。 (3认同)

pyg*_*iel 6

要做到这一点,我通常会做一个技巧:

  • 激活CUA模式
  • 去行的开头
  • C-RET,现在如果你移动光标,你会看到一个矩形的红色区域
  • 将光标向下移动并键入空格,直到获得正确的移位.

这也可以通过某种方式(以相同的方式)以编程方式完成.

编辑:我刚刚阅读了emacs wiki中的文章,它是相同的解决方案,除了CUA模式比"常见"矩形选择(因为它是可视的)无限强大.

  • 您可以通过`(cua-selection-mode t)`将CUA优秀的矩形编辑工具与其他功能分开.如果您没有将"C-RET"绑定到其他内容,则可以将其放在init文件中,并且不会与任何内容冲突. (2认同)

Nie*_*jou 6

也许这会以你想要的方式运作.

(defun shift-text (distance)
  (if (use-region-p)
      (let ((mark (mark)))
        (save-excursion
          (indent-rigidly (region-beginning)
                          (region-end)
                          distance)
          (push-mark mark t t)
          (setq deactivate-mark nil)))
    (indent-rigidly (line-beginning-position)
                    (line-end-position)
                    distance)))

(defun shift-right (count)
  (interactive "p")
  (shift-text count))

(defun shift-left (count)
  (interactive "p")
  (shift-text (- count)))