Metin Modunda Emacs'ta 4 Boşluk Girintisi Ayarlama


160

TABBüyük modda arabelleklere basarken Emacs'ın 8 boşluk sekmesinden 4 boşluk sekmesine geçmesini sağlamada başarısız oldum text-mode. Aşağıdakilere ekledim .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)

.emacsDosyamı (veya arabelleğimin yerel değişkenlerini) nasıl değiştirirsem değiştireyim TABdüğme her zaman aynı şeyi yapar.

  1. Yukarıda metin yoksa, 8 boşluk girinti
  2. Önceki satırda metin varsa, ikinci sözcüğün başına girinti

Emacs'ı sevdiğim kadar bu can sıkıcı bir hal alıyor. Önceki satırda metin olmadığında Emacs'ı en az 4 boşluk girintili yapmanın bir yolu var mı?


Bir mod satırı için C ++ veya csharp-mode için (setq tab-width 4) (setq c-basic-offset 4) öğesini (defun csharp-mode () ...) sonuna ekledim ve ( 1) sekmeler 8 karakter yerine 4 olarak gösterilir ve (2) sekmeye bastığımda yeni bir satırda 4 boşluk olur.
Jared Updike

Çok geç, ama sadece (setq tab-width 4) kullanmanın işe yaramadığını fark ettim, ancak (setq-default tab-width 4) kullanıyorsanız başka bir şey yapmanıza gerek yok.
Sambatyon

Boşluk kullanmak, ancak sekme duraklarına gitmek istiyorsanız cevabımı görün.
forkandwait

Bu soruyu bulduk başkalarına Not: (setq-default tab-width 4)aynı şey değildir (setq tab-width 4)emin "-varsayılan" kaçırmadık olmak!
zachaysan

10
Bunun çok zor olduğuna inanamıyorum.
gwg

Yanıtlar:


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

veya ekleme sekme durağı listem giriş özel set değişkenler içinde .emacs dosyası:

(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
Hem tab-width hem de tab-stop-list gereklidir. sekmeler EKLENİRKEN sekme genişliği kullanılırken, sekme EKLediğinizde sekme duraklarını belirlemek için sekme-durdurma listesi gereklidir.
Michael Ratanapintha


5
Gerçekten daha kısa bir şey yok '(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)))mu? Eh, işe yaradığı sürece sanırım ...: P
HelloGoodbye

5
Belgelere göre, tüm bu pozisyonlara ihtiyacınız yok. Sadece 4 8 12 yapın ve diğerlerine de uzanacaktır (4 eklemeye devam edin). Görünüşe göre 3 yerine 1 veya 2 eleman kullanırsanız, son adım olarak sekme genişliğini kullanır. Yani teorik olarak, dört boşlukla sekmek istersem ve sekme genişliğim 4 olarak ayarlanmış olsaydı '(tab-stop-list (quote (4))).
Nicholas Peterson

1
@NicholasPeterson bunu fark ettiğiniz için teşekkür ederiz! Yine de, uygulamada quotesıra reklam sonsuzluğuna devam etmek için iki sayıya ihtiyaç duyulduğu görülüyor . Bakınız: stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

Kısa cevap:

Kilit nokta, emac'lara girintileme sırasında istediğiniz her şeyi eklemelerini söylemektir. Bu, girintili çizgi işlevini değiştirerek yapılır. Bir sekme eklemek için sekmeyi değiştirmek ve daha sonra 4 boşluk eklemek için sekmeleri 4 boşluk olarak değiştirmek daha kolaydır. Aşağıdaki yapılandırma sorununuzu çözecektir:

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

Açıklama:

Gönderen Girinti manuel emacs'dan @ Binbaşı Modu ile kontrol :

Her bir ana modun önemli bir işlevi, düzenlenmekte olan dile uygun şekilde girintilemek için anahtarı özelleştirmek.

[...]

Girinti satırı işlevi değişkeni, geçerli satırı girintilemek için (ve girinti bölgesi çağrılırken olduğu gibi çeşitli komutlar) tarafından kullanılacak işlevdir. Moda göre girinti komutu bu işlevi çağırmaktan daha fazlasını yapmaz.

[...]

Varsayılan değer birçok mod için girintiye göredir.

Girinti bağıl @ emacs kılavuzundan:

Girinti Göreceli Boşluk, önceki boş olmayan satırda bir sonraki girinti noktasının altına.

[...]

Önceki boş olmayan satırın sütun başından sonra girintili noktaları yoksa, bunun yerine sekme-sekme-durdurma yapılır.

Girinti satırı işlevinin değerini ekleme sekmesi işlevine değiştirin ve sekme eklemeyi 4 boşluk olarak yapılandırın.


10
OP ile aynı problemim var, çözümünüz benim için çalışmıyor.
Gauthier

Lütfen, daha fazla ayrıntı verin. Yukarıdaki satırları .emac'lerinizin tek içeriği olarak kullanmanız ve "Moda göre girintili girin" çağrılması 4 boşluk eklemeyeceğiniz anlamına mı geliyor?
Mayıs'10

3
senin görevin benim için 8 alan ekliyor.
Vladimir Mihailenco

4
Emacs sürüm 23.3.1 kullanıyorum ve kısa yanıt boşluklara değiştirmez. bu cevap yanıltıcıdır.
VNarasimhaM

2
@BruceBarnett Metin modundayım ve bu talimatlar hala çalışmıyor.
güneşli

66

Güncelleme: Emacs 24.4'ten beri:

tab-stop-listşimdi örtük olarak sonsuza kadar genişletilmiştir. Varsayılan değeri olarak değiştirilir, nilbu da her tab-widthsütunda bir sekmenin durduğu anlamına gelir .

yani tab-stop-list, aşağıda gösterildiği şekilde ayarlanmaya gerek kalmayacağı anlamına gelir nil.

Orijinal cevap şöyle ...


Her zaman beni biraz gibi şeyler görmeye ağrıları (setq tab-stop-list 4 8 12 ................)olduğunda number-sequenceişlev kullanılacak orada bekleyen oturuyor.

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

veya

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

Sistemim üzerinde çalışabileceğim tek cevap bu.
Karpov

açık numaralı dizisi olmadan yeterince iyi olması için bir liste (4 8) anlamına gerektiğini - emacs girinti özelleştir sayfası sekme listesi "örtülü son adımda tekrarı yoluyla sonsuza kadar uzanır" diyor
James Waldby - jwpat7

@ JamesWaldby-jwpat7 Gerçekten, bu 24.4'te (2014) oldu. HABER diyor ki: " tab-stop-listdolaylı olarak sonsuza kadar genişletildi. Varsayılan değeri nil olarak değiştirilir, bu da her tab-widthsütun için bir sekme durağı anlamına gelir ." - Yani aslında sadece varsayılan değerini kullanabilirsiniz nil.
phils

21

Sekmelerinizi aşağıdaki gibi ayarlamayı daha kolay bulabilirsiniz:

M-x customize-group

At Customize group:istemi girin indent.

Tüm girintileme seçeneklerini ayarlayabileceğiniz ve geçerli oturum için ayarlayabileceğiniz veya gelecekteki tüm oturumlar için kaydedebileceğiniz bir ekran göreceksiniz.

Bu şekilde yaparsanız , bir özelleştirme dosyası oluşturmak istersiniz .


Mx özelleştirme grubunu hatırlamam gerekiyor - çok kullanışlı bir kısayol!
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)

Bu sayfadaki diğerleri çalışmadığında bu benim için çalıştı.
Michael Terry

Emacs çalışır26.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)

Bu C ++ kodu ve içindeki yorum için de çalışır


Partiye geç, ama teşekkürler. Emacs neden C / C ++ koduna kendi girintileme kurallarını uygulamak için belirli talimatlara ihtiyacı olacağını anlayamıyorum. Gelecekte vim
izleyeceğim

Bu soruyu kendim sormak istiyorum SADECE BU CEVABI KABUL EDİYORUM. Yapabilirsem bir ödül verirdim. 4'te sekmeye isteksiz bir değişiklik yapan emacs'ın bu sayfadaki tüm çözümlerden geçtiği için çok, çok üzüldüm ve beni çok fazla işten kurtardın!
Topolojik Sırala

7

Bu sorun, eksik sekme duraklarından kaynaklanmaz; emacs'ın, sekmeli verileri hizalamak için tasarlanmış görünen girinti bağıl adı verilen (yeni?) sekme yöntemine sahip olmasıdır. SEKME tuşu, metin modu için girintiye göreceli yöntem olan değişken girintili çizgi işlevinin hangi yöntemi seçtiğini çağıran tab-indent-for-tab-command yöntemiyle eşlenir. Girinti-çizgi-işlev değişkenini geçersiz kılmak için iyi bir yol bulamadım (metin modu kanca çalışmıyor, bu yüzden belki mod kancaları çalıştıktan sonra sıfırlanıyor?) Ama bundan kurtulmanın basit bir yolu davranış, sekmeyi daha basit sekme-sekme-durdurma yöntemine ayarlayarak sekme-komut-intent yöntemini chuck etmektir:

(anahtar metin modu haritası tanımlayın (kbd "SEKME") 'sekmeden sekmeye durdurma)


6

Bunu dene:

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

Bu, SEKME'yi her 4 karakterde bir sekme duraklarıyla (yalnızca Metin modunda) her zaman hazır bir SEKME karakteri ekleyecektir. İstediğiniz bu değilse, lütfen görmek istediğiniz davranışı açıklayın.


4
Ben OP sekmeler yerine boşluk istiyor düşünüyorum (böylece vurmak Tab 4 boşluk ekler).
mipadi

Aquamacs 2.4 ile birlikte, bu özel cevap bana bir sekme yerine başka bir dilde karakterler veriyor: 렔. Sekme tuşuna birden çok kez basılırsa, sonuç şöyledir: 렔렔 (ayırmadan). Ve her ardışık sekme baskısı için de aynı şey geçerlidir.
hukukçu

6

Bu kod satırlarını .emacs dosyanıza ekleyebilirsiniz. Girinti-göreli yerine insert-tab kullanmak için metin modu için bir kanca ekler.

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

Umut ediyorum bu yardım eder.



4

Bunu .emacs dosyanıza ekleyin:

Bu, bir sekmenin görüntülenme genişliğini 2 karaktere ayarlayacaktır (2 sayısını istediğiniz gibi değiştirin)

(setq default-tab-width 2)

Emacs'ın gerçekten boşluk yerine sekmeler kullandığından emin olmak için:

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

Bir kenara, bir sekme üzerinde geri boşluk bırakıldığında emacs için varsayılan, onu boşluklara dönüştürmek ve daha sonra bir boşluk silmektir. Bu can sıkıcı olabilir. Sadece sekmeyi silmesini istiyorsanız, bunu yapabilirsiniz:

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

Zevk almak!


Soruda sorulan en az 4 boşluk karşılamıyor.
kmarsh

2

Bir sekme dizisi veya boşluklara dönüştürülmeden bir sekmenin benim için hiç eklenmesini engelleyen tek çözüm budur. Her ikisi de yeterli, ancak savurgan görünüyordu:

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

Bunu not et quoteÇalışması için iki sayıya ihtiyaç (ancak daha fazla değil!).

Ayrıca, çoğu ana modda (Python örneğin) Emacs'ta girinti otomatiktir. Otomatik girintinin dışına girintilemeniz gerekiyorsa, şunu kullanın:

M-i


2

Özelleştirmeler gölgelendirebilir, (setq tab width 4)bu nedenle setq-defaultÖzelleştir'i ne yaptığınızı kullanın veya bildirin. Ayrıca OP'ye benzer sorunlar yaşadım ve bunu tek başına çözdüm, ayarlamaya tab-stop-listveya herhangi bir insertişleve gerek yoktu :

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

Bunu hemen sonra eklemenin yararlı olduğu bulundu (emacsWiki'den bir ipucu):

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

1

Bunu .emacs dosyasına yazana kadar en iyi yanıtlar işe yaramadı:

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

0

Denedin mi

(setq  tab-width  4)

2
Bunu soruları var, bu yüzden evet, denediklerini varsaymak güvenlidir.
ryanpcmcquen

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


0

İnit dosyamdan farklı, çünkü sekmeler yerine boşluk istedim:

(kanca ekleme 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default sekme genişliği 4)
               (setq girinti sekmeleri modu nil)
               (setq indent-line-function 'sekme-sekme-durdurma) 
               (değiştir-sözdizimi-girişi? _ "w"); şimdi '_' sözcük sınırlayıcı olarak kabul edilmiyor
               (değiştir-sözdizimi-girişi? - "w"); şimdi '-' sözcük sınırlayıcı olarak kabul edilmiyor
               )))

0

Bu cevabı herhangi bir kanca olmadan değiştirdi :

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.