Tab key == 4 ช่องว่างและการเยื้องอัตโนมัติหลังวงเล็บปีกกาใน Vim


1265

ฉันจะทำvi - Vim ได้อย่างไรที่ไม่เคยใช้แท็บ (แปลงช่องว่างที่จะแท็บที่ไม่ดี!) ทำให้คีย์แท็บ == 4 ช่องว่างและรหัสเยื้องโดยอัตโนมัติหลังจากที่บล็อกวงเล็บปีกกาเช่นEmacsไม่?

นอกจากนี้ฉันจะบันทึกการตั้งค่าเหล่านี้ได้อย่างไรฉันจึงไม่ต้องป้อนข้อมูลอีกครั้ง

ฉันเคยเห็นคำถามอื่น ๆ ที่เกี่ยวข้องกับเรื่องนี้ แต่ดูเหมือนว่าจะออกไปเล็กน้อยจากสิ่งที่ฉันต้องการ


คำตอบ:


1882

ดังที่ได้อธิบายไว้ในคำตอบสองสามข้อด้านล่างวิธีที่ต้องการในขณะนี้คือไม่ใช้ smartindent แต่ใช้วิธีต่อไปนี้แทน (ใน. vimrcของคุณ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

ในไฟล์. vimrcของคุณ:

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

ไฟล์ความช่วยเหลือใช้เวลาเล็กน้อยในการทำความคุ้นเคย

:help smartindent

ยิ่งไปกว่านั้นคุณสามารถฝังการตั้งค่าเหล่านี้ในแหล่งที่มาของคุณเพื่อการพกพา:

:help auto-setting

วิธีดูการตั้งค่าปัจจุบันของคุณ:

:set all

ในฐานะที่เป็นสีเทาซึ่งชี้ให้เห็นในความคิดเห็น smartindent ได้ถูกแทนที่ด้วย cindent ซึ่ง "ทำงานอย่างชาญฉลาดมากขึ้น" แม้ว่าจะยังคงส่วนใหญ่สำหรับภาษาที่มีไวยากรณ์เหมือน C:

:help C-indenting


4
หากคุณมีการตั้งค่าแท็บแบบขยายก็ควรใช้ช่องว่าง คุณยัง "ตั้งค่าเข้ากันได้" หรือไม่? ที่มีผลข้างเคียงต่าง ๆ รวมถึงการรีเซ็ตแท็บขยายเป็นค่าเริ่มต้นเป็น "ปิด"
Ken

60
ขออภัย smartindent ถูกแทนที่ด้วย cindent ซึ่งตัวเองเหมาะสำหรับไวยากรณ์ C เท่านั้น การเปิดใช้ vimrc ของคุณอาจเป็นปัญหาเมื่อทำงานกับภาษาอื่น เพียงใช้ "filetype indent on" แทน
graywh

2
สมาร์ทเทนท์ent ยังใช้สำหรับไวยากรณ์ C เท่านั้นและเลิกใช้แล้ว
graywh

4
หากฉันเปิดใช้งาน expandtab จะมีวิธีป้อนอักขระแท็บในข้อความหรือไม่
Daniele Segato

3
@DanieleSegato <ctrl v> <tab> ควรทำงานในโหมดแทรก: stackoverflow.com/questions/4781070/…
Ken

236

ที่เกี่ยวข้องถ้าคุณเปิดไฟล์ที่ใช้ทั้งแท็บและช่องว่างสมมติว่าคุณมี

set expandtab ts=4 sw=4 ai

คุณสามารถแทนที่แท็บทั้งหมดด้วยช่องว่างในไฟล์ทั้งหมดด้วย

:%retab

10
ถ้าคุณไม่ต้องการให้แท็บแทนที่ด้วยช่องว่างให้ลบบรรทัด expandtab
Eno

6
แท็บไม่ได้เว้นวรรคหรือ ;-)
Rob Wells

11
@ Rob-Wells: ฉันเปลี่ยน "ช่องว่าง" เป็น "ช่องว่าง" ตอนนี้คุณมีความสุขไหม? ;-)
netjeff

คุณช่วยอธิบายความหมายของบรรทัดแรกได้ไหม
คดีกองทุนของโมนิกา

2
expandtab พิจารณาว่าแท็บถูกขยายเป็นช่องว่างหรือไม่ ts = tabstop = จำนวนช่องว่างที่ <Tab> ในไฟล์นับ sw = shiftwidth = จำนวนช่องว่างที่จะใช้สำหรับแต่ละขั้นตอนของการเยื้อง (อัตโนมัติ) ai = autoindent = คัดลอกเยื้องจากบรรทัดปัจจุบันเมื่อเริ่มต้นบรรทัดใหม่
mcmacerson

89

วิธีที่ดีที่สุดในการรับการเยื้องเฉพาะประเภทไฟล์คือใช้filetype plugin indent onใน vimrc ของคุณ จากนั้นคุณสามารถระบุสิ่งที่ต้องการset sw=4 sts=4 etใน .vim / ftplugin / c.vim ตัวอย่างเช่นโดยไม่ต้องให้ผู้ที่ทั่วโลกสำหรับไฟล์ทั้งหมดที่ถูกแก้ไขและไวยากรณ์ไม่ใช่ประเภท C อื่น ๆ จะได้รับการเยื้องอย่างถูกต้องอีกด้วย(แม้ lisps)


9
IMHO ดีกว่าคำตอบที่ทำเครื่องหมายถูกต้อง เยื้องไฟล์ประเภทบน supersedes cindent และ smartindent
0fnt

62

หากต้องการมีแท็บ 4 สเปซในไฟล์ส่วนใหญ่จะมีแท็บถ่านขนาดกว้าง 8 หน้าจริงใน Makefiles และการเยื้องอัตโนมัติในไฟล์ต่างๆรวมถึง C / C ++ ให้ใส่ไว้ใน~/.vimrcไฟล์ของคุณ:

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.

ทำไมคุณไม่จำเป็นต้องมีelse? มันดูเหมือนว่าผมชอบเส้นสุดท้ายที่เขียนทับ Makefile เฉพาะในทุกกรณี
lucidbrot

6
สวัสดี @lucidbrot คำสั่ง "autocmd FileType make" นั้นจะบอกให้คุณใช้การตั้งค่าบางอย่างเมื่อใดก็ตามที่เปิด Makefile ในขณะที่บรรทัดด้านล่างกำลังตั้งค่าเริ่มต้น กล่าวอีกนัยหนึ่งการตั้งค่า "tabstop = 8 ... " จะถูกนำมาใช้ในภายหลังเมื่อเปิดไฟล์และจะเขียนทับการตั้งค่า "tabstop = 4 ... " ที่ใช้กับการเริ่มต้น
Shervin Emami

56

ในระบบ Linux หลายระบบเช่น Ubuntu .vimrcไฟล์จะไม่มีอยู่ตามค่าเริ่มต้นดังนั้นจึงขอแนะนำให้คุณสร้างก่อน

อย่าใช้.viminfoไฟล์ที่มีอยู่ในโฮมไดเร็กตอรี่ มันถูกใช้เพื่อจุดประสงค์อื่น

ขั้นตอนที่ 1: ไปที่ไดเรกทอรีบ้านของคุณ

cd ~

ขั้นตอนที่ 2: สร้างไฟล์

vim .vimrc

ขั้นตอนที่ 3: เพิ่มการกำหนดค่าที่ระบุข้างต้น

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

ขั้นตอนที่ 3: บันทึกไฟล์โดยการกด+ShiftZZ


11
อย่าใช้Shift + ZZมันจะสร้างไฟล์. swp wqใช้
shas

6
@shas: "ZZ" เทียบเท่ากับ ": x"ซึ่งเหมือนกับ ": wq" ยกเว้นว่าจะบันทึกเฉพาะเมื่อไฟล์มีการเปลี่ยนแปลง ... ( Ctrl-Zเป็นอีกเรื่อง ... )
Gert van den Berg

1
@shas นั่นเป็นเรื่องจริง หากคุณไม่ต้องการแลกเปลี่ยนไฟล์สำหรับการแก้ไข sesion vim -n <file>คุณต้องวิ่ง ไฟล์ swap ไม่ใช่สิ่งที่สร้างขึ้นในเวลาที่ประหยัด ที่ค่อนข้างจะเอาชนะวัตถุประสงค์ของมันเนื่องจากไฟล์ swap มีประโยชน์ในการกู้คืนเซสชันการแก้ไขที่ถูกยกเลิกทันที
Kaz

32

วิธีที่แนะนำคือการใช้การเยื้องที่เป็นประเภทไฟล์และใช้เฉพาะสมาร์ทเทนท์และ cindent หากไม่เพียงพอ

เพิ่มสิ่งต่อไปนี้ใน. vimrc ของคุณ

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

หวังว่ามันจะช่วยเป็นคำตอบที่แตกต่างกัน


12

แก้ไข ~ / .vimrc ของคุณ

$ vim ~/.vimrc

เพิ่มบรรทัดต่อไปนี้:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab


6

การเยื้องอัตโนมัติขึ้นอยู่กับโหมดไวยากรณ์ปัจจุบัน ฉันรู้ว่าถ้าคุณกำลังแก้ไข Foo.java จากนั้นป้อน{และกดปุ่มEnterเยื้องบรรทัดต่อไปนี้

สำหรับแท็บนั้นมีสองการตั้งค่า ภายในกลุ่มให้พิมพ์เครื่องหมายจุดคู่จากนั้น "set tabstop = 4" ซึ่งจะตั้งค่าแท็บให้แสดงเป็นช่องว่างสี่ช่อง กดปุ่มลำไส้ใหญ่อีกครั้งและพิมพ์ "set expandtab" ซึ่งจะแทรกช่องว่างสำหรับแท็บ

คุณสามารถตั้งค่าเหล่านี้ใน. vimrc (หรือ _vimrc บน Windows) ในโฮมไดเร็กตอรี่ของคุณ, ดังนั้นคุณต้องพิมพ์เพียงครั้งเดียว.


0

ประการแรกอย่าใช้Tabปุ่มใน Vim สำหรับการเยื้องด้วยตนเอง Vim มีคู่ของคำสั่งในโหมดแทรกสำหรับการเพิ่มหรือลดจำนวนการเยื้องด้วยตนเอง คำสั่งเหล่านี้คือและCtrl-T Ctrl-Dคำสั่งเหล่านี้สังเกตค่าของtabstop, shiftwidthและexpandtabและรักษาส่วนผสมที่ถูกต้องของพื้นที่และแท็บ (จำนวนสูงสุดของแท็บตามด้วยหมายเลขที่จำเป็นใด ๆ ของช่องว่าง)

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

หากCtrl-Tแทนที่จะTabรบกวนคุณคุณสามารถทำการแมปใหม่ได้:

:imap <Tab> ^T

นอกจากนี้คุณยังสามารถทำการแมปShift-Tabเพื่อCtrl-Ddeindent:

:imap <S-Tab> ^D

ที่นี่ ^ T และ ^ D เป็นอักขระควบคุมตามตัวอักษรที่สามารถแทรกCtrl-VCtrl-Tได้

Ctrl-VTabกับการทำแผนที่ในสถานที่นี้คุณยังสามารถพิมพ์แท็บตัวอักษรลงในบัฟเฟอร์ใช้ โปรดทราบว่าหากคุณทำเช่นนี้แม้ว่า:set expandtabจะเปิดอยู่คุณจะได้รับอักขระแท็บที่ไม่ขยาย

มีผลคล้ายกับ <Tab>แผนที่ทำได้:set smarttabเช่นกันซึ่งทำให้ Backspace ที่ด้านหน้าของบรรทัดมีพฤติกรรมที่ชาญฉลาด

ในsmarttabโหมดเมื่อTabไม่ใช้ที่จุดเริ่มต้นของบรรทัดจะไม่มีความหมายพิเศษ มันแตกต่างจากแผนที่ด้านบนของฉันTabไปCtrl-TเพราะการCtrl-Tใช้ที่ใดก็ได้ในบรรทัด (ในโหมดแทรก) จะเพิ่มการเยื้องของบรรทัดนั้น

การจับคู่ที่มีประโยชน์อื่น ๆ อาจเป็น:

:map <Tab> >
:map <S-Tab> <

ตอนนี้เราสามารถทำสิ่งต่าง ๆ เช่นเลือกบางบรรทัดและกด Tabเพื่อเยื้องพวกเขา หรือกดTabสองครั้งบนบรรทัด (ในโหมดคำสั่ง) เพื่อเพิ่มการเยื้อง

ถ้าคุณใช้คำสั่งการจัดการเยื้องเหมาะสมแล้วทุกอย่างจะถูกควบคุมโดยสามพารามิเตอร์: shiftwidth,tabstopexpandtabและ

shiftwidthพารามิเตอร์ควบคุมขนาดเยื้องของคุณ หากคุณต้องการเยื้องช่องว่างสี่ช่องให้ใช้:set shiftwidth=4:set sw=4หรือย่อ

ถ้าเพียงแค่นี้เสร็จแล้วเยื้องจะถูกสร้างขึ้นโดยใช้การผสมผสานของช่องว่างและแท็บเพราะ noexpandtabเป็นค่าเริ่มต้น :set expandtabใช้ ซึ่งทำให้อักขระแท็บที่คุณพิมพ์ลงในบัฟเฟอร์เพื่อขยายเข้าไปในช่องว่างและสำหรับการเยื้องที่จัดการโดย Vim ให้ใช้ช่องว่างเท่านั้น

เมื่อexpandtabใดที่เปิดใช้งานและหากคุณจัดการการเยื้องของคุณผ่านกลไก Vim ที่เหมาะสมทั้งหมดค่าของการtabstopกลายเป็นสิ่งที่ไม่เกี่ยวข้อง มันจะควบคุมว่าแท็บจะปรากฏอย่างไรหากเกิดขึ้นกับไฟล์ หากคุณมีset tabstop=8 expandtabแท็บฮาร์ดลงในไฟล์โดยใช้Ctrl-VTabแล้วมันจะจัดตำแหน่งแท็บตามคอลัมน์ 8 คอลัมน์ถัดไปตามปกติ


การแมปทั้งหมดของคุณควรใช้รูปแบบที่ไม่ซ้ำกัน การทำแผนที่<C-t>สามารถใช้ไวยากรณ์นั้นได้มากกว่าตัวอักษร ในที่สุดการทำแผนที่<Tab>ในโหมดปกติก็จะทำการแมปด้วย<C-i>(มันเป็นตัวอักษรเดียวกัน) ดังนั้นฉันไม่แนะนำให้ทำเช่นนั้น (คุณจะสูญเสียฟังก์ชั่น vim ที่
ดีมาก

@ D.BenKnoble ฉันไม่แนะนำเลย ฉันใช้ Ctrl-T, Ctrl-D และ <> ตัวเอง นั่นคือการใช้เสียงเรียกเข้าตามที่ตั้งใจไว้ คนที่เคยใช้แท็บในตัวแก้ไขอื่น ๆ อาจไม่ชอบสิ่งนั้นนั่นคือทั้งหมด
Kaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.