ตั้งค่าการเยื้องช่องว่าง 4 ช่องใน Emacs ในโหมดข้อความ


159

ผมเคยประสบความสำเร็จในการได้รับ Emacs ที่จะเปลี่ยนจาก 8 แท็บพื้นที่ 4 แท็บพื้นที่เมื่อกดในบัฟเฟอร์ด้วยโหมดที่สำคัญTAB text-modeฉันได้เพิ่มสิ่งต่อไปนี้ในของฉัน.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)

ไม่ว่าฉันจะเปลี่ยน.emacsไฟล์ของฉัน(หรือตัวแปรท้องถิ่นของบัฟเฟอร์) TABปุ่มจะทำสิ่งเดียวกันเสมอ

  1. หากไม่มีข้อความข้างต้นเยื้องช่องว่าง8
  2. หากมีข้อความในบรรทัดก่อนหน้าเยื้องไปที่จุดเริ่มต้นของคำที่สอง

เท่าที่ฉันรัก Emacs นี่มันช่างน่ารำคาญ มีวิธีที่จะทำให้ Emacs มีการเว้นวรรคอย่างน้อย 4 ย่อหน้าเมื่อไม่มีข้อความในบรรทัดก่อนหน้าหรือไม่?


สำหรับโหมดบรรทัด C ++ หรือโหมด csharp ฉันเพิ่ม (setq tab-width 4) (setq c-basic-offset 4) ไปที่ท้าย (defun csharp-mode () ... ) และมันก็ใช้กลอุบายเพื่อ ( 1) แท็บแสดงเป็น 4 แทนที่จะเป็น 8 ตัวอักษรและ (2) เมื่อฉันกดแท็บฉันจะได้ช่องว่าง 4 บรรทัดในบรรทัดใหม่
Jared Updike

ช้ามาก แต่ฉันเพิ่งรู้ว่าการใช้ (setq tab-width 4) ไม่ทำงาน แต่ถ้าคุณใช้ (setq-default tab-width 4) คุณไม่จำเป็นต้องทำอะไรอีก
Sambatyon

ดูคำตอบของฉันหากคุณต้องการใช้ช่องว่าง แต่ไปที่แท็บหยุด
forkandwait

หมายเหตุถึงผู้อื่นที่พบคำถามนี้: (setq-default tab-width 4)ไม่ใช่สิ่งเดียวกันที่(setq tab-width 4)ต้องแน่ใจว่าคุณไม่พลาด "-default"!
zachaysan

10
ฉันไม่อยากจะเชื่อเลยว่ามันยากที่จะทำ
gwg

คำตอบ:


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

หรือเพิ่มรายการtab-stop-listไปยังcustom-set-variablesในไฟล์. 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
จำเป็นต้องใช้ทั้งความกว้างแท็บและรายการหยุดแท็บ ความกว้างของแท็บจะใช้เมื่อแสดงแท็บในขณะที่จำเป็นต้องใช้แท็บหยุดรายการเพื่อกำหนดแท็บหยุดเมื่อคุณเพิ่มแท็บ
Michael Ratanapintha

3
โปรดทราบstackoverflow.com/questions/69934/…
phils

5
ไม่มีอะไรที่สั้นกว่านี้จริง'(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)))เหรอ? ตราบใดที่มันใช้งานได้ฉันเดาว่า ... : P
HelloGoodbye

5
ตามเอกสารคุณไม่ต้องการตำแหน่งเหล่านั้นทั้งหมด เพียงแค่ทำ 4 8 12 และมันจะขยายไปยังคนอื่น ๆ ทั้งหมด (ให้เพิ่ม 4) เห็นได้ชัดว่าถ้าคุณใช้ 1 หรือ 2 องค์ประกอบแทน 3 มันจะใช้ความกว้างของแท็บเป็นขั้นตอนสุดท้าย ตามทฤษฎีแล้วถ้าฉันต้องการแท็บด้วยสี่ช่องว่างและความกว้างแท็บของฉันถูกตั้งไว้ที่ 4 ฉันสามารถเขียน'(tab-stop-list (quote (4)))ได้
Nicholas Peterson

1
@NicholasPeterson ขอบคุณสำหรับการสังเกตว่า! ดูเหมือนว่าในทางปฏิบัติquoteต้องมีตัวเลขสองตัวเพื่อดำเนินการต่อไปตามลำดับ infinitum ดู: stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

คำตอบสั้น ๆ :

จุดสำคัญคือบอกให้ emacs แทรกสิ่งที่คุณต้องการเมื่อเยื้องสิ่งนี้ทำได้โดยการเปลี่ยนฟังก์ชั่นการเยื้องบรรทัด ง่ายต่อการเปลี่ยนเพื่อแทรกแท็บแล้วเปลี่ยนแท็บเป็นช่องว่าง 4 กว่าเปลี่ยนเป็นแทรกช่องว่าง 4 การกำหนดค่าต่อไปนี้จะช่วยแก้ปัญหาของคุณ:

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

คำอธิบาย:

จากการเยื้องควบคุมโดย Major Mode @ emacs manual :

ฟังก์ชั่นที่สำคัญของแต่ละโหมดที่สำคัญคือการปรับแต่งปุ่มเพื่อเยื้องอย่างถูกต้องสำหรับภาษาที่กำลังแก้ไข

[ ... ]

ตัวแปร indent-line-function คือฟังก์ชันที่จะใช้โดย (และคำสั่งต่าง ๆ เช่นเมื่อเรียกการเยื้องพื้นที่) เพื่อเยื้องบรรทัดปัจจุบัน คำสั่งเยื้องตามโหมดไม่เกินเรียกฟังก์ชั่นนี้

[ ... ]

ค่าเริ่มต้นจะเยื้องสัมพันธ์สำหรับหลาย ๆ โหมด

จาก indent-relative @ emacs ด้วยตนเอง:

เว้นระยะเยื้องสัมพัทธ์ออกไปภายใต้จุดเยื้องต่อไปในบรรทัดที่ไม่ว่างก่อนหน้า

[ ... ]

หากบรรทัดที่ไม่ว่างก่อนหน้านั้นไม่มีจุดเยื้องที่เกินกว่าจุดคอลัมน์เริ่มต้นจะมีการดำเนินการ 'tab-to-tab-stop' แทน

เพียงแค่เปลี่ยนค่าของการเยื้องบรรทัดฟังก์ชั่นเป็นฟังก์ชั่นแทรกแท็บและกำหนดค่าการแทรกแท็บเป็น 4 ช่องว่าง


10
ฉันมีปัญหาเช่นเดียวกับ OP วิธีการแก้ปัญหาของคุณไม่ทำงานสำหรับฉัน
Gauthier

กรุณาอธิบายเพิ่มเติม คุณหมายความว่าการใช้บรรทัดข้างต้นเป็นเนื้อหาเดียวของ. emacs ของคุณและเรียก "Mx การเยื้องตามโหมด" จะไม่แทรกช่องว่าง 4 ช่อง?
alcortes

3
การรวบรวมของคุณจะเพิ่มช่องว่างให้ฉัน 8 ช่อง
Vladimir Mihailenco

4
ฉันใช้ emacs เวอร์ชั่น 23.3.1 และคำตอบสั้น ๆ ไม่ได้เปลี่ยนเป็นช่องว่าง คำตอบนี้ทำให้เข้าใจผิด
VNarasimhaM

2
@BruceBarnett ฉันอยู่ในโหมดข้อความและคำแนะนำเหล่านี้ยังไม่ทำงาน
ซันนี่

66

อัปเดต:ตั้งแต่ Emacs 24.4:

tab-stop-listขณะนี้ขยายไปถึงอนันต์โดยปริยาย ค่าเริ่มต้นจะเปลี่ยนเป็นnilซึ่งหมายความว่าแท็บหยุดทุกtab-widthคอลัมน์

ซึ่งหมายความว่าไม่จำเป็นต้องตั้งค่าtab-stop-listตามวิธีที่แสดงด้านล่างอีกต่อไปเนื่องจากคุณสามารถตั้งค่าให้nilเป็น

คำตอบเดิมมีดังนี้ ...


มันทำให้ฉันเจ็บปวดเล็กน้อยที่เห็นสิ่งต่าง ๆ เช่น(setq tab-stop-list 4 8 12 ................)เมื่อnumber-sequenceฟังก์ชั่นนั่งอยู่ที่นั่นรอการใช้งาน

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

หรือ

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

นี่เป็นคำตอบเดียวที่ฉันสามารถใช้กับระบบของฉันได้
Karpov

emacs เยื้องหน้าปรับแต่งพูดว่ารายการแท็บ "โดยนัยขยายไปถึงอินฟินิตี้ผ่านการทำซ้ำของขั้นตอนสุดท้าย" - ซึ่งหมายถึงรายการ (4 8) ควรจะดีพอโดยไม่มีลำดับหมายเลขที่ชัดเจน
James Waldby - jwpat7

@ JamesWaldby-jwpat7 แน่นอนที่เกิดขึ้นใน 24.4 (2014) NEWS พูดว่า: " tab-stop-listตอนนี้ขยายไปถึงอนันต์โดยปริยายค่าเริ่มต้นจะเปลี่ยนเป็นศูนย์ซึ่งหมายความว่าแท็บหยุดทุกtab-widthคอลัมน์" - nilดังนั้นในความเป็นจริงคุณก็สามารถใช้ค่าเริ่มต้นของ
phils

21

คุณอาจตั้งค่าแท็บได้ง่ายขึ้นดังนี้:

M-x customize-group

ที่พรอมต์ให้ป้อนCustomize group:indent

คุณจะเห็นหน้าจอที่คุณสามารถตั้งค่าตัวเลือกการเยื้องทั้งหมดและตั้งค่าสำหรับเซสชันปัจจุบันหรือบันทึกไว้สำหรับเซสชันในอนาคตทั้งหมด

ถ้าคุณทำมันด้วยวิธีนี้คุณจะต้องตั้งค่าไฟล์ปรับแต่ง


ฉันต้องจำ Mx ปรับแต่งกลุ่ม - ทางลัดที่มีประโยชน์มาก!
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)

สิ่งนี้ใช้ได้สำหรับฉันเมื่อคนอื่น ๆ ในหน้านี้ไม่ได้
Michael Terry

ทำงานใน 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 ++ และความคิดเห็นภายในด้วย


ไปงานเลี้ยงสาย แต่ขอบคุณ ฉันไม่สามารถเข้าใจได้ว่าทำไม emacs ต้องการคำแนะนำเฉพาะเพื่อใช้กฎการเยื้องกับโค้ด C / C ++ เช่นกัน ฉันจะมองเป็นกลุ่มในอนาคต ...
MegaWidget

ฉันต้องการถามคำถามนี้ด้วยตัวเองเพียงแค่ได้รับการตอบคำถามนี้ ฉันจะให้รางวัลถ้าฉันทำได้ ฉันเสียใจมากที่การเปลี่ยนแปลงทำให้ emacs ไม่เต็มใจที่จะแท็บที่ 4 กำลังแก้ไขปัญหาทั้งหมดในหน้านี้และคุณได้ช่วยงานจำนวนมหาศาลให้ฉัน!
โทโพโลยีเรียงลำดับ

7

ปัญหานี้ไม่ได้เกิดจากการหยุดแท็บที่หายไป; มันเป็น emacs ที่มีวิธีแท็บ (ใหม่?) เรียกว่าการเยื้องที่ดูเหมือนว่าออกแบบมาเพื่อจัดเรียงข้อมูลแบบตาราง คีย์ TAB ถูกแมปกับวิธีการเยื้องสำหรับคำสั่งแท็บซึ่งเรียกวิธีการใดก็ตามที่ตัวแปรเยื้องสายฟังก์ชั่นการตั้งค่าซึ่งเป็นวิธีการเยื้องเยื้องสำหรับโหมดข้อความ ฉันไม่คิดวิธีที่ดีในการแทนที่ตัวแปร indent-line-function (hook โหมดข้อความไม่ทำงานดังนั้นบางทีมันอาจถูกรีเซ็ตหลังจากโหมด-hooks ทำงานหรือไม่) แต่วิธีง่ายๆในการกำจัดสิ่งนี้ พฤติกรรมคือการเชยเมธอดแบบเจตนาต่อแท็บโดยการตั้งค่า TAB ให้เป็นวิธีการแท็บต่อแท็บที่ง่ายกว่า:

(define-key text-map-map (kbd "TAB") 'แท็บต่อแท็บหยุด)


6

ลองสิ่งนี้:

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

ซึ่งจะทำให้ TAB แทรกตัวอักษร TAB ตามตัวอักษรเสมอโดยมีแท็บหยุดทุก ๆ 4 ตัวอักษร (แต่ในโหมดข้อความเท่านั้น) หากไม่ใช่สิ่งที่คุณขอโปรดอธิบายพฤติกรรมที่คุณต้องการดู


4
ฉันคิดว่า OP ต้องการช่องว่างแทนแท็บ (ดังนั้นกด Tab เพื่อแทรกช่องว่าง 4 ช่อง)
mipadi

เมื่อใช้ร่วมกับ Aquamacs 2.4 คำตอบเฉพาะนี้ทำให้ฉันมีตัวอักษรเป็นภาษาอื่นแทนที่จะใช้แท็บ: 렔 หากกดปุ่มแท็บมากกว่าหนึ่งครั้งผลลัพธ์จะเป็น: 렔렔 (ไม่มีการแยก) และสิ่งเดียวกันก็เป็นจริงสำหรับการกดแท็บแต่ละครั้ง
ฏหมาย

6

คุณสามารถเพิ่มรหัสบรรทัดเหล่านี้ลงในไฟล์. emacs ของคุณ เพิ่ม hook สำหรับโหมดข้อความเพื่อใช้แท็บแทรกแทนการเยื้องแบบสัมพัทธ์

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

ฉันหวังว่ามันจะช่วย



4

เพิ่มลงในไฟล์. emacs ของคุณ:

นี่จะเป็นการตั้งค่าความกว้างที่แท็บจะแสดงเป็น 2 ตัวอักษร (เปลี่ยนหมายเลข 2 เป็นสิ่งที่คุณต้องการ)

(setq default-tab-width 2)

เพื่อให้แน่ใจว่า emac ใช้แท็บแทนช่องว่างจริง:

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

นอกจากนี้ค่าเริ่มต้นสำหรับ emacs เมื่อ backspacing เหนือแท็บคือการแปลงเป็นช่องว่างแล้วลบช่องว่าง สิ่งนี้อาจสร้างความรำคาญ หากคุณต้องการเพียงแค่ลบแท็บคุณสามารถทำได้:

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

สนุก!


ไม่พบช่องว่างอย่างน้อย 4 ช่องในคำถาม
kmarsh

2

นี่เป็นทางออกเดียวที่ป้องกันไม่ให้แท็บแทรกฉันโดยไม่ต้องเรียงลำดับหรือแปลงแท็บเป็นช่องว่าง ทั้งสองอย่างดูเหมาะสม แต่ก็สิ้นเปลือง:

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

โปรดทราบว่าquoteต้องใช้ตัวเลขสองตัวในการทำงาน (แต่ไม่เกิน!)

นอกจากนี้ในโหมดหลักส่วนใหญ่ ( Pythonเช่น) การเยื้องเป็นไปโดยอัตโนมัติใน Emacs หากคุณต้องการเยื้องนอกการเยื้องอัตโนมัติให้ใช้:

M-i


2

การปรับแต่งสามารถเงา(setq tab width 4)เพื่อใช้setq-defaultหรือให้ปรับแต่งรู้ว่าคุณกำลังทำอะไร ฉันยังมีปัญหาที่คล้ายกับ OP และแก้ไขด้วยตัวเองไม่จำเป็นต้องปรับtab-stop-listหรือinsertฟังก์ชั่นใด ๆ:

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

พบว่ามีประโยชน์ในการเพิ่มสิ่งนี้ทันทีหลังจาก (เคล็ดลับจาก emacsWiki):

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

1

คำตอบที่ดีที่สุดใช้ไม่ได้จนกว่าฉันจะเขียนในไฟล์. emacs:

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

0

คุณเคยลองไหม

(setq  tab-width  4)

2
พวกเขามีสิ่งนี้ในคำถามของพวกเขาดังนั้นใช่มันปลอดภัยที่จะสมมติว่าพวกเขาลอง
ryanpcmcquen



0

จากไฟล์ init ของฉันแตกต่างกันเพราะฉันต้องการที่ว่างแทนแท็บ:

(add-hook 'sql-mode-hook
          (แลมบ์ดา)
             (progn
               (setq- ความกว้างเริ่มต้นของแท็บ 4)
               (setq indent-tabs-mode ไม่มี)
               (setq indent-line-function 'tab-to-tab-stop) 
               (modified-syntax-entry? _ "w"); ตอนนี้ '_' ไม่ถือว่าเป็นตัวคั่นคำ
               (modified-syntax-entry? - "w"); ตอนนี้ '-' ไม่ถือว่าเป็นตัวคั่นคำ
               )))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.