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


159

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 TABbộ đệm với chế độ chính text-mode. Tôi đã thêm những điều 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 .emacstệp của mình như thế nào (hoặc các biến cục bộ của bộ đệm), TABnút luôn luôn làm điều tương tự.

  1. Nếu không có văn bản ở trên, thụt lề 8 khoảng trắng
  2. Nếu có văn bản trên dòng trước, thụt vào đầu 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?


Đối với một dòng chế độ C ++ hoặc csharp-mode tôi đã thêm (setq tab-width 4) (setq c-basic-offset 4) vào cuối (defun csharp-mode () ...) và nó đã thực hiện thủ thuật để thực hiện ( 1) các tab hiển thị là 4 thay vì 8 ký tự và (2) khi tôi nhấn tab tôi nhận được 4 khoảng trắng trên một dòng mới.
Jared Updike

Rất muộn, nhưng tôi mới nhận ra rằng việc sử dụng (setq tab-width 4) không hoạt động, nhưng nếu bạn sử dụng (setq-default tab width 4), bạn không cần phải làm gì khác.
Sambatyon

Xem câu trả lời của tôi nếu bạn muốn sử dụng khoảng trắng nhưng đi đến điểm dừng tab.
chờ đợi

Lưu ý cho những người khác đã tìm thấy câu hỏi này: (setq-default tab-width 4)KHÔNG phải là điều tương tự như (setq tab-width 4)chắc chắn rằng bạn đã không bỏ lỡ "-default"!
zachaysan

10
Tôi không thể tin rằng điều này là rất khó để làm.
gwg

Câu trả lời:


30
(customize-variable (quote tab-stop-list))

hoặc thêm mục nhập danh sách tab vào biến tùy chỉnh-set-biến trong tệp .emacs :

(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))))

9
Cả hai chiều rộng tab và tab-stop-list đều cần thiết. chiều rộng tab được sử dụng khi hiển thị các tab, trong khi danh sách dừng tab là cần thiết để xác định các tab dừng khi bạn THÊM tab.
Michael Ratanapintha


5
Có thực sự không có gì ngắn hơn '(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)))? Chà, miễn là nó hoạt động tôi đoán ...: P
Hello Goodbye

5
Theo tài liệu, bạn không cần tất cả các vị trí đó. Chỉ cần thực hiện 4 8 12 và nó sẽ mở rộng cho tất cả những người khác (tiếp tục thêm 4). Rõ ràng nếu bạn chỉ sử dụng 1 hoặc 2 phần tử thay vì 3, nó sẽ chỉ sử dụng chiều rộng tab làm bước cuối cùng. Vì vậy, về mặt lý thuyết, nếu tôi muốn tab theo bốn khoảng trắng và chiều rộng tab của tôi được đặt thành 4. Tôi có thể viết '(tab-stop-list (quote (4))).
Nicholas Peterson

1
@NicholasPeterson cảm ơn bạn đã nhận thấy điều đó! Dường như, trong thực tế, quotecần có hai số để tiếp tục chuỗi quảng cáo vô hạn. Xem: stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

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ừ thụt lề Điều khiển bởi hướng dẫn chính của Chế độ chính @ emacs :

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.


10
Tôi có cùng một vấn đề với OP, giải pháp của bạn không hiệu quả với tôi.
Gauthier

Xin vui lòng, giải thích thêm. Bạn có nghĩa là sử dụng các dòng trên làm nội dung duy nhất của .emacs của bạn và gọi "Mx thụt lề theo chế độ" sẽ không chèn 4 khoảng trắng?
alcortes

3
confuguration của bạn chèn 8 không gian cho tôi.
Vladimir Mihailenco

4
Tôi đang sử dụng emacs phiên bản 23.3.1 và câu trả lời ngắn không thay đổi nó thành dấu cách. Câu trả lời này là sai lệch.
VNaraimhaM

2
@BruceBarnett Tôi đang ở chế độ văn bản và các hướng dẫn này vẫn không hoạt động.
nắng

66

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

tab-stop-listbây giờ được ngầm mở rộng đến vô cùng. Giá trị mặc định của nó được thay đổi thành nilcó nghĩa là một tab dừng mọi tab-widthcột.

điều đó có nghĩa là không còn cần phải thiết lập tab-stop-listtheo cách hiển thị bên dưới, như bạn có thể giữ cho 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 number-sequencechức năng đ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))

Đây là câu trả lời duy nhất mà tôi có thể làm việc trên hệ thống của mình.
Karpov

Trang tùy chỉnh thụt lề cho biết danh sách tab "hoàn toàn kéo dài đến vô tận thông qua việc lặp lại bước cuối cùng" - có nghĩa là một danh sách (4 8) phải đủ tốt, không có chuỗi số rõ ràng
James Waldby - jwpat7

@ JamesWaldby-jwpat7 Thật vậy, điều đó đã xảy ra vào ngày 24.4 (2014). TIN TỨC nói: " tab-stop-listbây giờ được mở rộng hoàn toàn đế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 tab-widthcột." - vì vậy trên thực tế bạn chỉ có thể sử dụng giá trị mặc định của nil.
phils

21

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:dấu 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 một tệp tùy chỉnh .


Tôi cần nhớ nhóm tùy chỉnh Mx - phím tắt rất tiện dụng!
Nick Bolton

11
(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)

10
(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)

Điều này làm việc cho tôi khi những người khác trên trang này không.
Michael Terry

Hoạt động trong emacs26.3
Saurabh

9
(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


Đến bữa tiệc muộn, nhưng cảm ơn bạn. Tôi không thể hiểu tại sao emacs cũng cần hướng dẫn cụ thể để áp dụng quy tắc thụt lề của nó cho mã C / C ++. Tôi sẽ để mắt đến vim trong tương lai ...
MegaWidget

Tôi muốn tự đặt câu hỏi này CHỈ CÓ THỂ TÔI CHẤP NHẬN TRẢ LỜI NÀY. Tôi sẽ cho nó một tiền thưởng nếu tôi có thể. Tôi đã rất, rất buồn vì một sự thay đổi khiến emacs không muốn tab ở 4, đã trải qua tất cả các giải pháp trên trang này và bạn đã tiết kiệm cho tôi một lượng công việc khổng lồ!
Sắp xếp theo topo

7

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)


6

Thử cái này:

(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.


4
Tôi nghĩ OP muốn có khoảng trắng thay vì các tab (vì vậy, nhấn Tab sẽ chèn 4 khoảng trắng).
mipadi

Kết hợp với Aquamacs 2.4, câu trả lời cụ thể này cung cấp cho tôi các ký tự trong ngôn ngữ khác thay vì tab:. Nếu phím tab được nhấn nhiều lần, kết quả là: (không có bất kỳ sự tách biệt nào). Và điều tương tự cũng đúng với mỗi lần nhấn tab liên tiếp.
luật

6

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.



4

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!


Không đáp ứng ít nhất 4 không gian hỏi trong câu hỏi.
kmarsh

2

Đâ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ố để làm việc (nhưng không nhiều hơn!).

Ngoài ra, trong hầu hết các chế độ chính ( Pythonví dụ), 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


2

Các tùy chỉnh có thể tạo bóng (setq tab width 4)để sử dụng setq-defaulthoặ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-listhay bất kỳ insertchức năng 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)

1

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)

0

Bạn đã thử chưa

(setq  tab-width  4)

2
Họ có câu hỏi này trong câu hỏi của họ, vì vậy, có thể an toàn khi cho rằng họ đã thử nó.
ryanpcmcquen

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


0

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 ()
             (tiên lượng
               (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 từ
               (sửa đổi-cú pháp-mục? - "w"); bây giờ '-' không được coi là một từ phân cách
               )))

0

Sửa đổi câu trả lời này mà không có bất kỳ hook:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.