2011-08-02 40 views
22

Tôi muốn thụt lề và toàn bộ không gian khu vực n sang phải hoặc trái. Tôi có thể làm điều này trong một số chế độ với C-c> và C-c <, nhưng tôi muốn làm điều này nói chung.Làm cách nào để thụt lề các khoảng trống trong các emac?

Nếu tôi cần thay đổi các .emac của mình để làm cho hiệu quả này (với lối tắt bàn phím như trên) thì tốt.

+6

gì với số phiếu gần? Làm thế nào-do-I-do-foo câu hỏi cho emacs đã được trên SO cho lứa tuổi, và một số người cần phải trộn tất cả mọi thứ xung quanh không thay đổi điều đó. –

+1

Được [thảo luận về meta nhiều lần] (http://meta.stackoverflow.com/search?q=emacs), quá (mặc dù có ít kết luận). Tốt nhất của rất nhiều là có thể [Chúng ta có thể xin một phán quyết về các câu hỏi Emacs trên SO?] (Http://meta.stackexchange.com/q/79659/2509), nơi câu trả lời hàng đầu kết luận rằng chúng thuộc về Stack Overflow. – dmckee

+2

Vâng, có một chút bực bội, nhưng tôi không chắc chúng ta sẽ thấy bất kỳ chính sách nào về điều này. Đề nghị tôi thấy là, bởi vì không có một trang web rõ ràng nào mà tất cả chúng đều thuộc về (và ý tưởng về một trang SE cụ thể của Emacs dường như bị từ chối), chúng thường chỉ được để lại nơi người dùng ban đầu đặt chúng. – phils

Trả lời

9

Tôi nghĩ rằng hòa bình mã sau đây có thể giúp bạn:

;; Shift the selected region right if distance is positive, left if 
;; negative 

(defun shift-region (distance) 
    (let ((mark (mark))) 
    (save-excursion 
     (indent-rigidly (region-beginning) (region-end) distance) 
     (push-mark mark t t) 
     ;; Tell the command loop not to deactivate the mark 
     ;; for transient mark mode 
     (setq deactivate-mark nil)))) 

(defun shift-right() 
    (interactive) 
    (shift-region 1)) 

(defun shift-left() 
    (interactive) 
    (shift-region -1)) 

;; Bind (shift-right) and (shift-left) function to your favorite keys. I use 
;; the following so that Ctrl-Shift-Right Arrow moves selected text one 
;; column to the right, Ctrl-Shift-Left Arrow moves selected text one 
;; column to the left: 

(global-set-key [C-S-right] 'shift-right) 
(global-set-key [C-S-left] 'shift-left) 

Bạn có thể thay thế các (shift-region 1)(shift-region 1) bởi giá trị mà bạn muốn.

EDIT: Như bạn thấy, chức năng của tôi kết thúc tốt đẹp thụt-cứng nhắc:

thụt-cứng nhắc là một chức năng Lisp biên soạn tương tác trong 'indent.el'.

Nó bị ràng buộc với C-x TAB.

(thụt lề START START ARG)

Thụt lề tất cả các dòng bắt đầu trong khu vực nằm ngang theo cột ARG. Được gọi từ một chương trình, có ba đối số, START, END và ARG. Bạn có thể xóa tất cả thụt đầu dòng khỏi một khu vực bằng cách đưa ra một tiêu cực lớn ARG.

8

Cũng hữu ích là rectangle commands hoạt động trên hình chữ nhật của văn bản thay vì dòng văn bản.

Ví dụ, sau khi đánh dấu một khu vực hình chữ nhật,

C-x r o chèn khoảng trống để điền vào khu vực hình chữ nhật (có hiệu quả chuyển mã để ở bên phải) C-x r k diệt khu vực hình chữ nhật (có hiệu quả chuyển mã để bên trái)

12

Phần quan trọng trong câu trả lời của Sandro là gọi tới indent-rigidly.

C-x TAB (translated from C-x <tab>) runs the command indent-rigidly, 
which is an interactive compiled Lisp function in `indent.el'. 

It is bound to C-x TAB. 

(indent-rigidly start end arg) 

Indent all lines starting in the region sideways by arg columns. 
Called from a program, takes three arguments, start, end and arg. 
You can remove all indentation from a region by giving a large negative arg. 

Vì vậy, đánh dấu khu vực, nhập số arg, nhấn C-x TAB.

26

gì làm việc cho tôi là: chọn vùng và sau đó C-u <number of spaces> C-x TAB

Cập nhật

@ Eric Chúng ta có thể định nghĩa một hàm và liên kết với một bàn phím cắt ngắn, ví dụ C-x C-TAB. Hãy thử thêm điều này vào cấu hình emacs của bạn.

(defun insert-tabs (n) 
    "Inserts N number of tabs" 
    (interactive "nNumber of tabs: ") 
    (dotimes (i n) 
    (indent-for-tab-command))) 

(global-set-key [?\C-x \C-tab] 'insert-tabs) 
+0

Công trình này rất tuyệt, nhưng tôi không thể nhớ được. Bất kỳ gợi ý nào? (Khác với việc đánh dấu trang này.) –

+0

@EricWilson Xin chào Eric, tôi đã cập nhật câu trả lời với một đề xuất khác. – armandino

+0

Chức năng đẹp, nhưng những gì tôi thực sự thích sẽ là một đầu mối sementic cho các lệnh đang được thực hiện. Có phải 'C-u' có ý nghĩa gì đó không? –

0

Sử dụng cua-mode.

M-x cua-mode để hoạt động, C-RET để chọn cột đầu tiên của toàn vùng, và loại không gian, cuối cùng, esc ba lần để thoát ra, làm ~

Các vấn đề liên quan