2012-03-14 62 views
12

有什么方法可以标记emacs中的文本,并按空格/制表粒度将它左移(删除起始空格)?在几行上减少缩进

同样的方法,我会做一些其他编辑与Shift + Tab。

+0

我不知道我得到你的意思。你能否详细说明你的解释? – 2012-03-14 20:43:41

+0

许多emacs模式具有自动缩进功能 - 当您在线上的任意位置点击[tab]时,它会将线缩进到应该放在的位置。我很少需要担心手动缩进任何东西 - 我只是让编辑为我完成这项工作。 – 2012-03-14 20:44:44

+0

我希望能够做到与“Tab”相反的功能;我通常需要这样做,当我复制过去的代码与另一个文件位置不同时。 – sramij 2012-03-14 21:06:52

回答

3

通常emacs会在您点击<TAB>时放置当前样式指定的东西,因此这里自然会有些不同。想到的最接近的东西是M-\,它围绕点折叠水平空白。如果要在线条之前删除空格的“矩形”,则delete-rectangle可能更合适,您可以通过设置标记和移动点来选择矩形,然后使用C-x r d来做到这一点。

1

这听起来像你试图解决的问题是当你剪切/粘贴时不正确的代码缩进。您可以通过使用类似以下的内容自动重新缩进文本来解决这个问题。

注:使用前缀参数强制无重压痕(C-ùC-Ÿ),加上有大小阈值变量。

;; automatically indenting yanked text if in programming-modes 
(defvar yank-indent-modes '(emacs-lisp-mode 
          c-mode c++-mode 
          tcl-mode sql-mode 
          perl-mode cperl-mode 
          java-mode jde-mode 
          lisp-interaction-mode 
          LaTeX-mode TeX-mode) 
    "Modes in which to indent regions that are yanked (or yank-popped)") 

(defvar yank-advised-indent-threshold 1000 
    "Threshold (# chars) over which indentation does not automatically occur.") 

(defun yank-advised-indent-function (beg end) 
    "Do indentation, as long as the region isn't too large." 
    (if (<= (- end beg) yank-advised-indent-threshold) 
     (indent-region beg end nil))) 

(defadvice yank (after yank-indent activate) 
    "If current mode is one of 'yank-indent-modes, indent yanked text (with prefix arg don't indent)." 
    (if (and (not (ad-get-arg 0)) 
      (member major-mode yank-indent-modes)) 
     (let ((transient-mark-mode nil)) 
     (yank-advised-indent-function (region-beginning) (region-end))))) 
+0

我敢肯定,这段代码运作良好,但[auto-indent-mode.el](https://github.com/mlf176f2/auto-indent-mode.el/)被主动维护并具有更多功能。虽然门槛是一个非常好的主意。 – 2012-03-15 01:04:17

+0

@event_jr我不明白关于正在积极维护的东西的观点。我在3年前编写了上面的代码,并且不需要“维护”它,它可以完成它本来应该做得很好的单一事情...... – 2012-03-15 15:04:02

+0

它这样做 - 还有很多其他的事情来确保代码自动缩进。更多功能意味着更多buts和更多可能与其他模式的不良交互。因此,作者正在积极研究这一点很重要。 – 2012-03-15 15:29:54

14
  1. 选择您所在的地区;
  2. 类型C-u后跟要缩进的空格的数量(如果要减少缩进,则为负数);
  3. 使用C-x TAB(默认绑定到indent-rigidly)将缩进应用到区域。

这比S-TAB更加繁琐,但恕我直言,是某种形式的情况下,Emacs的格式不得已不会解决你的问题。

编辑:更好的解决方案:Shift a region or line in emacs(接受的答案)。这是我目前在Emacs中用于更改缩进的内容。警告:涉及一些Emacs Lisp。

+0

谢谢。如果我想在几行缩进中增加或减少制表符的数量(而不是空格),该怎么办? – Tim 2016-04-29 15:29:43

+0

只需将C-u之后的值乘以制表符宽度即可。 – 2016-05-02 05:56:25

+0

@Tim更好的方式在这里描述 - http://stackoverflow.com/questions/3156450/shift-a-region-or-line-in-emacs(接受的答案) – 2016-05-02 06:00:15

2

这可能更简单,更直观:首先确保cua-mode已启用(M-x cua-mode切换它)。然后转到行首并按C-return。出现一个红色矩形。现在向下移动光标,然后按需要增大矩形长度。然后按C-d将其删除。而已。

当主模式没有规定任何自动缩进(或弄乱时)时,我经常遇到这个问题。

有很多更可以用CUA模式的矩形做,看http://trey-jackson.blogspot.com/2008/10/emacs-tip-26-cua-mode-specifically.html