Emacs如何将选中块整体左移

在google上搜索了很久,没有找到中意的答案。于是到这来提问,希望能够得到满意的答案。
问题是这个样子的:
在emacs中写jade这类代码时,格式显得尤为重要,但是我不知道如何将选中的代码块整体左移。所以有时改代码时显得很费劲,希望得到各位的帮助。
本人现在还不会elisp,如果是修改配置的话,望能添出代码
谢谢。

阅读 19.3k
11 个回答

我会使用键盘宏来完成这一操作
C-x ( 开始录制宏
C-x ) 录制结束
C-u [执行次数] C-x e 执行键盘宏

录制过程:
删除若干空格(左移偏移量) 命令 C-d
下一行 C-n
行头 C-a

在文本模式下,先用C+@ 标记你想要作左移的区域块, 之后直接按TAB

在C语言模式下,emacs可能会自动用cc-mode来自动调整你的TAB,此时不能直接按TAB,而是C+x,
TAB。

	PrintList(n1);
	   int ToFind;
	   ToFind = atoi(argv[2]);
	   printf("find (%d) at %d\n", ToFind, LocateElem(n1, ToFind));
	   ListInsertTail(&n1, 13);
	   PrintList(n1);
	ListInsertTail(&n1, 23);

上面代码块中的第2行到倒数第2行,即是我在C语言模式下,3次C+x, tab 后的试验结果。

看看是不是你想要的。
更新一下:我这个回复是将代码“右移”, 在提交之后才想起,可能不是你想要实现的“左移”, sorry!

选中代码,Shift+Tba

`(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)))
`
应该可以满足

;; 以下方法不限于 jade-mode

;; 选中要 indent 的 region
;; M-x indent-rigidly ;; 默认已绑定到 Ctrl-x TAB
;; C-u 10 C-x TAB  ;; 整体右移 10 个字符 
;; C-u -2 C-x TAB  ;; 整体左移 2 个字符

rectangle operation.

C-x r t replace with white spaces

首先非常感谢各位的关注。不过后来我在一位学长的提醒之下,找到了我以前忽略的一个东西。整个解决方案如下:

首先还是说说jade-mode,最初我安装jade-mode只是想让其代码高亮,不过我后来发现我忽略了其一些快捷的设置。现在我才知道shift+tab就是让代码向左对齐,直接按tab就是让代码向右对齐。希望这些能够帮助到你们。

jade-mode具体安装方法很简单,在其github上中的README.md中有详细说明,在次不再累述。你可以戳这里前往。

当然你也可以参考

凌晨4点半

在评论中写的关于矩形操作的设想

谢谢。

新手上路,请多包涵

感觉回答好乱, 我第一反应也是类似 @xuningtx 的思路, rectangle 操作, 但是不需要替换, 删除前面的空格就可以了哈.

选择需要删除是区块 rectangle , 然后 C-x r k 就可以了.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进