การเปลี่ยนลักษณะการเยื้องเป็นกลุ่มตามประเภทไฟล์


379

ใครสามารถอธิบายให้ฉันในแง่ง่ายวิธีที่ง่ายที่สุดในการเปลี่ยนพฤติกรรมการเยื้องของ Vim ตามประเภทของไฟล์? ตัวอย่างเช่นถ้าฉันเปิดไฟล์ Python มันควรจะมี 2 ช่องว่าง แต่ถ้าฉันเปิดสคริปต์ Powershell ก็ควรใช้ช่องว่าง 4 ช่อง


9
BTW - การประชุม PEP8 สำหรับ Python กล่าวว่า tabstop ควรเป็น 4 ช่องว่างและแท็บควรเป็น 4 ช่องว่าง ref: stackoverflow.com/questions/120926/…
cgseller

คำตอบ:


304

คุณสามารถเพิ่ม.vimไฟล์ที่จะดำเนินการเมื่อใดก็ตามที่ vim เปลี่ยนเป็นประเภทไฟล์เฉพาะ

ตัวอย่างเช่นฉันมีไฟล์ที่~/.vim/after/ftplugin/html.vim มีเนื้อหานี้:

setlocal shiftwidth=2
setlocal tabstop=2

ซึ่งสาเหตุที่เป็นกลุ่มที่จะใช้แท็บที่มีความกว้างของ 2 ตัวอักษรสำหรับการเยื้อง (คนnoexpandtabตั้งค่าตัวเลือกอื่น ๆ ทั่วโลกในการกำหนดค่าของฉัน)

นี่คือคำอธิบายที่นี่: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4เลื่อนลงไปที่ส่วนของปลั๊กอินชนิดไฟล์


229
คุณควรใส่มันเข้าไป~/.vim/after/ftplugin/html.vimแทน แต่ในขณะที่คนอื่น ๆ ได้ชี้ให้เห็นด้านล่างมันมาก nicer เพียงแค่เพิ่มที่คุณautocmd FileType html setlocal shiftwidth=2 tabstop=2 .vimrc
อริสโตเติล Pagaltzis

10
อ๊ะจริง ๆ แล้วนั่นคือ / ที่ / ฉันมีไฟล์นั้น ฉันจะแก้ไขคำตอบ ฉันไม่เห็นด้วยแม้ว่าฉันคิดว่าการแยกคำสั่งสำหรับไฟล์ประเภทต่าง ๆ เป็นไฟล์แยกทำให้ทุกอย่างง่ายขึ้นโดยเฉพาะถ้าคุณมีข้อกำหนดสำหรับไฟล์หลายประเภทหรือมีตัวเลือกมากมายสำหรับไฟล์บางประเภท
SpoonMeiser

3
ที่จริงแล้วมีเหตุผลไม่มากที่จะใช้ไดเรกทอรีหลังจากสำหรับ ftplugins เสียงเรียกเข้าจะโหลดทั้งหมดที่พบใน runtimepath ของคุณไม่ใช่แค่ไฟล์ไวยากรณ์
graywh

36
FYI: อย่าใช้ js สำหรับประเภทไฟล์จาวาสคริปต์ ใช้จาวาสคริปต์แทน ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo

13
คุณต้องเพิ่มfiletype plugin onvimrc ของคุณด้วย
gatoatigrado

191

ใช้ ftplugins หรือคำสั่งอัตโนมัติเพื่อตั้งค่าตัวเลือก

ftplugin

ใน ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

และอย่าลืมเปิดใช้งานใน~/.vimrc:

filetype plugin indent on

( :h ftpluginสำหรับข้อมูลเพิ่มเติม)

autocommand

ใน~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

คุณสามารถเปลี่ยนใด ๆ ของคำสั่งยาวหรือการตั้งค่ากับรุ่นสั้น:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

ฉันยังอยากจะแนะนำการเรียนรู้แตกต่างระหว่างและtabstop ผู้คนจำนวนมากไม่ทราบเกี่ยวกับsofttabstopsofttabstop


1
ขอบคุณ! นอกจากนี้ขอขอบคุณสำหรับบิตเกี่ยวกับ 'ts' และ 'sts' มีหน้าใดที่คุณแนะนำให้พูดถึงความแตกต่างนี้และวิธีการใช้งานหรือไม่?
jvriesem

11
@jvriesem ไม่มีอะไรมาก: 'ts' เป็นวิธีแสดงอักขระแท็บ 'sts' คือจำนวน "ช่องว่าง" ที่จะแทรกเมื่อกดแป้นแท็บ 'sw' คือจำนวน "ช่องว่าง" ที่จะใช้ต่อระดับการเยื้อง 'et' คือการใช้ช่องว่างหรือแท็บ 'sta' ให้คุณแทรก 'sw' "ช่องว่าง" เมื่อกดแท็บที่จุดเริ่มต้นของบรรทัด
graywh

10
ฉันสงสัยว่ารูปแบบเต็มจะดีกว่าที่จะใช้เพื่อความชัดเจนมากกว่าประโยคสั้น ๆ ในตอนท้าย
icedwater

23
swสั้นสำหรับsoftwidth, stsสั้นสำหรับsofttabstop, etสั้นสำหรับexpandtab, setlสั้นสำหรับsetlocalและสั้นสำหรับau autocmdคุณสามารถใช้แบบยาวแทนแบบสั้น
Flimm

13
ผมเชื่อว่าswจะขยายออกไปมากกว่าshiftwidth softwidth
johncip

83

แก้ไขของคุณ~/.vimrcและเพิ่มประเภทไฟล์ที่แตกต่างกันสำหรับเยื้องที่แตกต่างกันเช่นฉันต้องการhtml/rbเยื้อง 2 ช่องว่างและjs/coffeeไฟล์เยื้อง 4 ช่องว่าง:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

อ้างถึง: การตั้งค่าการกำหนดค่าตามความชอบช่องว่าง Vim ตามชนิดไฟล์


ความคิดเห็นสำหรับ vimrc เป็นโสด":)
sdkks

@sdkks ฉันไม่คิดอย่างนั้น อ้างสองครั้งคือความเห็นอ้างเพียงครั้งเดียว'ให้ข้อผิดพลาดในกลุ่มของ Linux ทั้งหมดของฉัน (7.3+, 8.0 ... )
Siwei Shen 申思维

ใช่. ความคิดเห็นของฉันบอกว่าใช้เดี่ยว"หมายความว่าอย่าปิดมันด้วยอีก"อัน ไม่แน่ใจว่าทำไมฉันถึงแสดงความคิดเห็นว่า
sdkks

ตกลงฉันเข้าใจคุณผิด ฉันหมายถึงคำพูดเดียว'แต่ไม่เหลือ"โดยไม่มีสิทธิ์" @. @
Siwei Shen 申思维

60

วางคำสั่ง autocmd ตามคำต่อท้ายไฟล์ใน ~ / .vimrc ของคุณ

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

คำสั่งที่คุณกำลังค้นหาน่าจะเป็น ts = และ sw =


18
คือสิ่งที่ได้เปรียบกว่านี้โดยFileType?
Casey Chow

3
มีวิธีใดบ้างที่จะคว่ำการแข่งขัน?
SystemParadox

7
ฉันมีปัญหาในการรับไฟล์เพื่อทำงานกับไฟล์ html (เนื่องจากไฟล์. html ไม่ใช่ HTML จริงๆ แต่ไฟล์เทมเพลต HTML ที่มีภาษาเทมเพลต) ดูเหมือนว่าไฟล์จะไม่รู้จักเป็น html แต่วิธีการนี้จะ
Mark Hildreth

3
@digitxp - ข้อดีคือเมื่อส่วนขยายที่คุณใช้ไม่ตรงกับ "FileType" ที่กำหนดไว้ ตัวอย่างเช่นในการติดตั้งของฉัน * .md หมายถึงประเภทไฟล์ของ Modula2 ในขณะที่ฉันใช้มันเพื่อทำเครื่องหมาย ฉันสามารถ (a) เปลี่ยนการตั้งค่า FileType เริ่มต้น (b) เปลี่ยนการตั้งค่าประเภทไฟล์ด้วยการกำหนดค่าแบบกำหนดเองหรือ (c) รับสิ่งที่ฉันต้องการโดยใช้การตั้งค่านี้ในไฟล์. vimrc 1 ไฟล์ของฉันที่ฉันไปด้วย (c)
pdwalker

มันจะคุ้มค่าที่ชี้ให้เห็นว่า - ถ้าฉันอ่านเอกสารอย่างรวดเร็วของฉันถูกต้อง - คุณสามารถเพิ่มคำสั่งได้หลายคำสั่งต่อประเภทไฟล์ด้วยวิธีนี้และพวกเขารับประกันว่าจะดำเนินการตามลำดับที่กำหนด
underscore_d

23

ฉันมักจะทำงานกับexpandtabฉาก แต่มันก็ไม่ดีสำหรับ makefiles ฉันเพิ่งเพิ่ม:

:autocmd FileType make set noexpandtab

ที่ส่วนท้ายของไฟล์. vimrc ของฉันและจะรู้จัก Makefile, makefile และ * .mk เป็น makefiles และไม่ขยายแท็บ สมมุติคุณสามารถขยายสิ่งนี้ได้


ตัวเลือกที่ดีกว่าคือเปิดใช้งาน: ปลั๊กอินชนิดไฟล์ ค่าเริ่มต้นสำหรับ Vim รวมถึง: setl noet ดังนั้นคุณไม่จำเป็นต้องใช้ aucmd ใน vimrc ของคุณอีก
graywh

ตกลง. คุณสามารถอธิบายถึงประโยชน์ของมันและสิ่งที่เกี่ยวข้องในการทำมันได้หรือไม่ ทำไมปลั๊กอินประเภทไฟล์จึงดีกว่า autocmd เมื่อใดควรใช้ autocmd? ไม่ได้ใช้?
30918 Jonathan Leffler

5
ปลั๊กอินชนิดไฟล์ที่มาพร้อมกับ Vim จะทำสิ่งที่มีประโยชน์เช่น "setlocal noexpandtab" สำหรับไฟล์ makefiles Autocommands vs ftplugins สำหรับสิ่งส่วนตัวเช่น shiftwidth ไม่สำคัญ - เป็นเพียงวิธีที่คุณเลือกโครงสร้างการกำหนดค่า vim ของคุณ
graywh

17

ส่วนตัวฉันใช้การตั้งค่าเหล่านี้ใน. vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
หลายภาษามีการประชุมที่กำหนดไว้ยาวนานเช่นเดียวกับบาง บริษัท ใช้ NodeJS เป็นตัวอย่างของอดีต แท็บควรมีสองช่องว่าง ปวดหัวและค่อนข้างงี่เง่า แต่สำคัญ
พอล Hazen

3
เหตุใดจึงต้องมีแท็บเหมือนกันสำหรับทุกสถานการณ์ สำหรับไฟล์การกำหนดค่าแท็บพื้นที่ 8 แท็บทำงานได้ดี แต่สำหรับรหัสที่มีการเยื้องจำนวนมาก 2 สามารถจัดการได้ง่ายกว่ามาก และจากนั้นก็มีการแก้ไขแบบคงที่: node.js ควรมีแท็บพื้นที่ 2 แท็บและหลามก็ไม่ถูกต้องทางไวยากรณ์กับสิ่งอื่นนอกเหนือจากแท็บพื้นที่ 4 แท็บ
felixphew

1
@felixphew Python ถูกต้องสมบูรณ์แบบด้วยช่องว่างจำนวนมาก (หรือแม้กระทั่งแท็บ) ตราบใดที่ยังคงเหมือนเดิมตลอดทาง
James

@DJMcMayhem คุณพูดถูกฉันควรจะพูดว่า "ขอแนะนำอย่างยิ่ง"
felixphew

1
+1 ถึง Nello อักขระแท็บมีประเพณีที่สืบทอดกันมายาวนานซึ่งหมายถึงการกระโดดไปยังตำแหน่งถัดไปด้วยอักขระ 8 ตัว เป็นเพราะผู้คนต้องการใช้แท็บสำหรับ "การเยื้องครั้งต่อไปที่ดูดีในภาษาของฉัน" และเนื่องจากผู้แก้ไขข้อความบางคนไม่ได้สร้างความแตกต่างระหว่าง "การเพิ่มอักขระแท็บ" และ "การเพิ่มช่องว่างสำหรับการเยื้อง" และผู้คน ปรับแต่งบรรณาธิการเพื่อให้เป็นไปตามที่เราได้รับตอนนี้ที่แท็บไม่เคยแสดงวิธีที่ตั้งใจ ซอร์สโค้ดคือข้อความและมาตรฐานสำหรับข้อความคือแท็บ 8 อักขระ
Florian F

6

สิ่งนี้อาจเป็นที่รู้จักของคนส่วนใหญ่ แต่ต่อไป (ฉันงงครั้งแรกของฉัน): กำลังทำ :set et ( :setexpandtabs) :retabไม่ได้เปลี่ยนแท็บที่มีอยู่แล้วในแฟ้มหนึ่งจะต้องทำ ตัวอย่างเช่น:

:set et
:retab

และแท็บในไฟล์จะถูกแทนที่ด้วยพื้นที่ว่างเพียงพอ หากต้องการให้แท็บกลับมาทำได้ง่ายๆ:

:set noet
:retab

4

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

ด้านล่างนี้เป็นตัวกำหนดค่าแบบเรียบง่ายอย่างที่คุณเห็นไฟล์ไพ ธ อนจะมี 4 ช่องว่างสำหรับการเยื้องและไฟล์เทมเพลตปั๊กจะมีเพียง 2

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2

3

ในขณะที่คุณสามารถกำหนดค่าการเยื้องของ Vim ได้ดีโดยใช้ปลั๊กอินการเยื้องหรือด้วยตนเองโดยใช้การตั้งค่าฉันขอแนะนำให้ใช้สคริปต์ python ชื่อVindectซึ่งจะกำหนดการตั้งค่าที่เกี่ยวข้องโดยอัตโนมัติเมื่อคุณเปิดไฟล์หลาม ใช้เคล็ดลับนี้เพื่อให้การใช้ Vindect มีประสิทธิภาพยิ่งขึ้น เมื่อฉันเริ่มแก้ไขไฟล์หลามที่สร้างโดยคนอื่นด้วยรูปแบบการเยื้องต่างๆ (แท็บเทียบกับพื้นที่และจำนวนช่องว่าง) มันน่าผิดหวังอย่างไม่น่าเชื่อ แต่ Vindect พร้อมกับไฟล์เยื้องนี้

แนะนำด้วย:


2

สำหรับผู้ที่ใช้autocmdมันเป็นวิธีที่ดีที่สุดในการจัดกลุ่มคนเหล่านั้นด้วยกัน หากการจัดกลุ่มเกี่ยวข้องกับการตรวจจับประเภทไฟล์คุณอาจมีลักษณะดังนี้:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

การจัดกลุ่มช่วยให้การ.vimrcจัดระเบียบโดยเฉพาะอย่างยิ่งเมื่อชนิดไฟล์มีกฎหลายข้อที่เกี่ยวข้อง ในตัวอย่างด้านบนมีการกำหนดทางลัดความคิดเห็นเฉพาะไฟล์. c

การเรียกเริ่มต้นเพื่อautocmd!บอกให้ vim ลบการเติมข้อความอัตโนมัติที่กำหนดไว้ก่อนหน้าใด ๆ ในการจัดกลุ่มดังกล่าว การทำเช่นนี้จะป้องกันไม่ให้มีคำจำกัดความซ้ำซ้อนหาก.vimrcมีที่มาอีกครั้ง ดู:help augroupข้อมูลเพิ่มเติมได้ที่


1

ผมใช้ยูทิลิตี้ที่ผมเขียนใน C autotabเรียกว่า มันวิเคราะห์ครั้งแรกไม่กี่พันสายของไฟล์ที่คุณโหลดและกำหนดค่าสำหรับพารามิเตอร์ที่เป็นกลุ่มshiftwidth, และtabstopexpandtab

gcc -O autotab.c -o autotabนี้จะรวบรวมโดยใช้ตัวอย่างเช่น คำแนะนำสำหรับการรวมเข้ากับ Vim อยู่ในส่วนหัวของความคิดเห็นที่ด้านบน

Autotab นั้นค่อนข้างชาญฉลาด แต่อาจสับสนได้บ้างเป็นครั้งคราวโดยเฉพาะอย่างยิ่งเมื่อมีการคงรูปแบบที่ไม่สอดคล้องกันโดยใช้รูปแบบการเยื้องที่แตกต่างกัน

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

มันใช้งานได้กับภาษาการเขียนโปรแกรมที่หลากหลายและเป็นการให้อภัยองค์ประกอบ "นอกวง" ซึ่งไม่เชื่อฟังการเพิ่มการเยื้องเช่นคำสั่งการประมวลผลล่วงหน้าของ C ป้ายกำกับคำสั่ง C ไม่ต้องพูดถึงบรรทัดว่างที่ชัดเจน

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