2012-03-14 36 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