it-swarm-vi.tech

Đặt 4 thụt lề không gian trong Emacs ở Chế độ văn bản

Tôi đã không thành công khi bắt Emacs chuyển từ 8 tab không gian sang 4 tab không gian khi nhấn TAB trong bộ đệm với chế độ chính text-mode. Tôi đã thêm phần sau vào .emacs:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

Bất kể tôi thay đổi tệp .emacs của tôi như thế nào (hoặc các biến cục bộ của bộ đệm của tôi) TAB nút luôn luôn làm điều tương tự.

  1. Nếu không có văn bản nào ở trên, thụt lề 8 dấu cách
  2. Nếu có văn bản trên dòng trước, thụt vào đầu của từ thứ hai

Tôi yêu Emacs rất nhiều, điều này thật khó chịu. Có cách nào để làm cho Emacs ít nhất thụt vào 4 khoảng trống khi không có văn bản trong dòng trước không?

154
Cristian
(customize-variable (quote tab-stop-list))

hoặc thêm tab-stop-list entry to custom-set-biến in . emacs file:

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))
28
Bert F

Câu trả lời ngắn:

Điểm mấu chốt là yêu cầu emacs chèn bất cứ thứ gì bạn muốn khi thụt lề, điều này được thực hiện bằng cách thay đổi hàm thụt dòng. Dễ dàng thay đổi nó để chèn một tab và sau đó thay đổi các tab thành 4 khoảng trắng hơn là thay đổi nó để chèn 4 khoảng trắng. Cấu hình sau sẽ giải quyết vấn đề của bạn:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Giải trình:

Từ Hướng dẫn thụt lề được điều khiển bởi Major Mode @ emacs hướng dẫn :

Một chức năng quan trọng của mỗi chế độ chính là tùy chỉnh phím để thụt lề đúng cách cho ngôn ngữ được chỉnh sửa.

[...]

Biến hàm thụt dòng là hàm được sử dụng bởi (và các lệnh khác nhau, như khi gọi vùng thụt lề) để thụt dòng hiện tại. Lệnh thụt lề theo chế độ không nhiều hơn gọi hàm này.

[...]

Giá trị mặc định là tương đối thụt cho nhiều chế độ.

Từ hướng dẫn sử dụng thụt lề @ emacs:

Không gian tương đối thụt ra ngoài dưới điểm thụt lề tiếp theo trong dòng không trống trước đó.

[...]

Nếu dòng không trống trước đó không có điểm thụt lề ngoài điểm cột bắt đầu tại, thay vào đó, 'tab-to-tab-stop' được thực hiện.

Chỉ cần thay đổi giá trị của hàm thụt dòng thành hàm chèn thẻ và định cấu hình chèn tab thành 4 khoảng trắng.

133
alcortes

Cập nhật : Kể từ khi Emacs 24.4:

tab-stop-list hiện đang được mở rộng đến vô cùng. Giá trị mặc định của nó được thay đổi thành nil có nghĩa là một tab dừng mỗi cột tab-width.

điều đó có nghĩa là không còn cần phải thiết lập tab-stop-list theo cách hiển thị bên dưới, vì bạn có thể giữ nó được đặt thành nil.

Câu trả lời gốc theo sau ...


Nó luôn làm tôi hơi đau khi nhìn thấy những thứ như (setq tab-stop-list 4 8 12 ................) khi hàm number-sequence đang ngồi đó chờ được sử dụng.

(setq tab-stop-list (number-sequence 4 200 4))

hoặc là

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))
64
phils

Bạn có thể thấy dễ dàng hơn để thiết lập các tab của mình như sau:

M-x customize-group

Tại Customize group: Nhắc nhập indent.

Bạn sẽ thấy một màn hình nơi bạn có thể đặt tất cả các tùy chọn thụt lề và đặt chúng cho phiên hiện tại hoặc lưu chúng cho tất cả các phiên trong tương lai.

Nếu bạn làm theo cách này, bạn sẽ muốn thiết lập tệp tùy chỉnh .

21
Dave Webb
(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)
11
Yan Li
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

cái này hoạt động với mã C++ và bình luận bên trong

9
user2318996
(defun my-custom-settings-fn ()
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 2 200 2))
  (setq tab-width 2)
  (setq indent-line-function 'insert-tab))

(add-hook 'text-mode-hook 'my-custom-settings-fn)
9
lawlist

Vấn đề này không phải do các tab bị thiếu; đó là emacs có một phương thức tab (mới?) được gọi là thụt lề có vẻ như được thiết kế để sắp xếp dữ liệu dạng bảng. Khóa TAB được ánh xạ tới lệnh indent-for-tab-lệnh, gọi bất kỳ phương thức nào mà hàm thụt dòng biến được đặt thành, là phương thức thụt lề cho chế độ văn bản. Tôi chưa tìm ra một cách hay để ghi đè biến chức năng dòng thụt lề (hook chế độ văn bản không hoạt động, vì vậy có thể nó được đặt lại sau khi hook chế độ chạy?) Nhưng một cách đơn giản để loại bỏ điều này hành vi là chỉ chộp lấy phương thức lệnh có ý định bằng cách đặt TAB thành phương thức dừng tab-tab-tab đơn giản hơn:

(định nghĩa khóa văn bản chế độ văn bản (kbd "TAB") 'tab-to-tab-stop)

7
Glenn

Thử đi:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

Điều đó sẽ khiến TAB luôn chèn một ký tự TAB bằng chữ với các tab dừng mỗi 4 ký tự (nhưng chỉ trong chế độ Văn bản). Nếu đó không phải là những gì bạn yêu cầu, vui lòng mô tả hành vi bạn muốn xem.

6
cjm

Bạn có thể thêm các dòng mã này vào tệp .emacs của mình. Nó thêm một hook cho chế độ văn bản để sử dụng tab chèn thay vì thụt lề.

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))

Tôi hy vọng nó sẽ giúp.

6
gigilibala

Thêm phần này vào tệp .emacs của bạn:

Điều này sẽ đặt chiều rộng mà một tab được hiển thị thành 2 ký tự (thay đổi số 2 thành bất cứ thứ gì bạn muốn)

(setq default-tab-width 2)

Để đảm bảo rằng emacs thực sự sử dụng các tab thay vì dấu cách:

(global-set-key (kbd "TAB") 'self-insert-command)

Bên cạnh đó, mặc định cho các emacs khi đặt khoảng cách trên một tab là chuyển đổi nó thành khoảng trắng và sau đó xóa một khoảng trắng. Điều này có thể gây phiền nhiễu. Nếu bạn muốn nó chỉ xóa tab, bạn có thể làm điều này:

(setq c-backspace-function 'backward-delete-char)

Thưởng thức!

4
qwerty9967

Chỉ cần thay đổi phong cách với c-set-style là đủ cho tôi.

4
dividebyzero

Các tùy chỉnh có thể tạo bóng (setq tab width 4) vì vậy hoặc sử dụng setq-default hoặc cho Tùy chỉnh biết bạn đang làm gì. Tôi cũng gặp vấn đề tương tự như OP và đã sửa nó một mình, không cần điều chỉnh tab-stop-list hoặc bất kỳ chức năng insert nào:

(custom-set-variables
 '(tab-width 4 't)
 )

Tìm thấy nó hữu ích để thêm cái này ngay sau đó (một mẹo từ emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
2
Yary

Các câu trả lời tốt nhất đã không hoạt động cho đến khi tôi viết điều này trong tệp .emacs:

(global-set-key (kbd "TAB") 'self-insert-command)
1
user1009285

Đây là giải pháp duy nhất giúp một tab không bao giờ bị chèn cho tôi, mà không có trình tự hoặc chuyển đổi các tab thành khoảng trắng. Cả hai đều có vẻ đầy đủ, nhưng lãng phí:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Lưu ý rằng quote cần hai số để hoạt động (nhưng không nhiều hơn!).

Ngoài ra, trong hầu hết các chế độ chính (ví dụ Python), thụt lề là tự động trong Emacs. Nếu bạn cần thụt lề bên ngoài tự động thụt lề, sử dụng:

M-i

1
ryanpcmcquen

Từ tệp init của tôi, khác vì tôi muốn khoảng trắng thay vì tab:

[.__.] [.__.] (add-hook 'sql-mode-hook [.__.] (lambda () [.__.] (progn [.__.] (setq-default tab-width 4) [.__.] (setq indent-tab-mode nil) [.__.] (setq indent-line-function 'tab-to-tab-stop) [.__.] (sửa đổi cú pháp-mục nhập? _ "w "); bây giờ '_' không được coi là một dấu phân cách Word [.__.] (sửa đổi cú pháp-mục nhập? -" w "); now '-' không được coi là một dấu phân cách từ [.__.])) ) [.___.]
0
forkandwait

Bạn đã thử chưa

(setq  tab-width  4)
0
GrokCode

Nhân tiện, với Chế độ C , tôi thêm (setq-default c-basic-offset 4) đến .emacs. Xem http://www.emacswiki.org/emacs/IndentingC để biết chi tiết.

0
flyrain
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
0
waseemq