2012-03-14 47 views
12

Có cách nào tôi có thể đánh dấu văn bản trong các emacs và dịch chuyển nó sang trái (loại bỏ khoảng trống bắt đầu) theo không gian/mức độ chi tiết của Tab không?Giảm thụt lề trên một vài dòng

Tương tự như cách tôi thực hiện trên một số trình chỉnh sửa khác bằng Shift + Tab.

+0

Tôi không chắc là tôi có được những gì bạn muốn nói. Bạn có thể vui lòng giải thích lời giải thích của bạn? –

+0

Nhiều chế độ emacs có thụt đầu dòng tự động - khi bạn nhấn [tab] ở bất kỳ đâu trên đường, nó sẽ thụt lề dòng đến vị trí cần thiết. Tôi hiếm khi phải lo lắng về việc thụt lề bằng tay bất cứ điều gì - tôi chỉ để cho người biên tập thực hiện công việc cho tôi. –

+0

Tôi muốn có thể làm điều ngược lại với "Tab" nào; tôi cần điều đó thường khi mã sao chép quá khứ được định vị khác với một tệp khác. – sramij

Trả lời

3

Thông thường các emacs đặt những thứ mà kiểu hiện tại ra lệnh khi bạn nhấn <TAB>, do đó, có một chút khác biệt ở đây. Điều gần gũi nhất mà bạn nghĩ đến là M-\ sẽ thu hẹp khoảng trống ngang xung quanh điểm. Nếu bạn muốn xóa "hình chữ nhật" của dấu cách trước các dòng, thì delete-rectangle có thể phù hợp hơn, bạn có thể thực hiện bằng cách đặt điểm đánh dấu và di chuyển để chọn hình chữ nhật và sau đó sử dụng C-x r d.

1

Có vẻ như sự cố bạn đang cố gắng giải quyết không chính xác là mã thụt đầu dòng khi bạn cắt/dán. Bạn có thể giải quyết điều đó bằng cách tự động thụt lại văn bản bằng một cái gì đó như sau.

Lưu ý: Sử dụng một lực lượng đối số tiền tố không tái thụt đầu dòng (C-u C-y), cộng với có biến ngưỡng kích thướ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

Tôi chắc chắn mã này hoạt động tốt, nhưng [auto-indent-mode.el] (https://github.com/mlf176f2/auto-indent-mode.el/) được duy trì tích cực và có nhiều chức năng hơn. Mặc dù các đập là một ý tưởng rất tốt. –

+0

@event_jr Tôi không hiểu vấn đề gì đang được duy trì tích cực. Tôi đã viết mã trên trên 3 năm trước và không cần phải "duy trì" nó, nó làm điều duy nhất nó được cho là làm tốt ... –

+0

Nó thực hiện điều này - và rất nhiều thứ khác để đảm bảo mã được thụt lề một cách chính xác tự động. Nhiều tính năng hơn có nghĩa là nhiều buts hơn và có khả năng tương tác xấu hơn với các chế độ khác. Do đó điều quan trọng là tác giả đang tích cực làm việc trên nó. –

14
  1. Chọn khu vực của bạn;
  2. Loại C-u theo sau là số khoảng trắng bạn muốn thụt lề (số âm nếu bạn muốn giảm thụt đầu dòng);
  3. Sử dụng C-x TAB (theo mặc định được gắn với indent-rigidly) để áp dụng thụt đầu dòng cho khu vực.

Đây là nhiều hơn nữa cồng kềnh hơn S-TAB, nhưng nó là IMHO một số loại phương sách cuối cùng trong trường hợp Emacs định dạng không giải quyết vấn đề của bạn.

EDIT: giải pháp tốt hơn nhiều: Shift a region or line in emacs (câu trả lời được chấp nhận). Đây là những gì tôi hiện đang sử dụng trong Emacs để thay đổi thụt đầu dòng. CẢNH BÁO: liên quan đến một số Emacs Lisp.

+0

Cảm ơn. Điều gì sẽ xảy ra nếu tôi muốn tăng hoặc giảm số lượng tab (thay vì dấu cách) trong thụt lề của một vài dòng? – Tim

+0

Chỉ nhân giá trị sau C-u với chiều rộng tab. –

+0

@Tim một cách tốt hơn được mô tả ở đây - http://stackoverflow.com/questions/3156450/shift-a-region-or-line-in-emacs (câu trả lời được chấp nhận) –

2

Điều này có thể đơn giản và trực quan hơn: trước tiên hãy đảm bảo rằng cua-mode được bật (M-x cua-mode bật tắt). Sau đó đi đến đầu dòng và nhấn C-return. Một hình chữ nhật màu đỏ xuất hiện. Bây giờ di chuyển con trỏ của bạn xuống và phải để phát triển hình chữ nhật khi cần. Sau đó nhấn C-d để xóa nó. Đó là nó.

Tôi gặp phải vấn đề này thường khi chế độ chính không ra lệnh cho bất kỳ thụt đầu dòng tự động nào (hoặc khi nó lộn xộn).

Có rất nhiều hơn bạn có thể làm với hình chữ nhật cua-mode, xem http://trey-jackson.blogspot.com/2008/10/emacs-tip-26-cua-mode-specifically.html