สรุป
มีสองสามวิธีในการทำเช่นนี้ซึ่งส่วนใหญ่ได้รับการแนะนำ แต่ฉันคิดว่าฉันจะสรุปด้วยวิธีพิเศษสองวิธี
- Per-directory vimrc - มีข้อเสียที่ต้องเริ่ม Vim ในไดเร็กทอรีที่ถูกต้อง: หากโปรเจ็กต์ของคุณอยู่ใน
~/project1
และคุณมี~/project1/.vim.custom
และทำcd ~ ; vim project1/file.c
จะไม่พบการตั้งค่าแบบกำหนดเอง
- Modelines - มีประสิทธิภาพมาก แต่มีข้อเสียที่ต้องเพิ่มลงในไฟล์ทั้งหมด (และอย่าลืมเพิ่มลงในไฟล์ใหม่)
- คำสั่งอัตโนมัติเฉพาะไดเร็กทอรี - ซึ่งมีประสิทธิภาพมาก
- สแกนหาส่วนหัวเฉพาะในไฟล์ (ดูด้านล่าง) - นี่คือส่วนหัวที่ฉันเคยใช้มากที่สุดในอดีตที่ทำงานให้กับ บริษัท ต่างๆหรือในโครงการที่มีชื่อชัดเจน
- vimrc ต่อไดเรกทอรีที่ตรวจสอบเมื่อเปิดไฟล์ (ดูด้านล่าง) อีกวิธีหนึ่งที่ค่อนข้างง่ายในการนำไปใช้โดยเฉพาะอย่างยิ่งถ้ารหัสโครงการของคุณอยู่ในที่เดียว
กำลังสแกนหาส่วนหัว
ในหลาย ๆ องค์กรจะมีส่วนหัวมาตรฐาน (พร้อมประกาศลิขสิทธิ์และชื่อโครงการเป็นต้น) ที่ด้านบนของไฟล์ต้นฉบับทุกไฟล์ ในกรณีนี้คุณจะได้รับ Vim เพื่อสแกนไฟล์แรก (เช่น) 10 บรรทัดโดยอัตโนมัติเพื่อค้นหาคีย์เวิร์ด หากพบก็สามารถเปลี่ยนการตั้งค่าของคุณได้ ฉันได้แก้ไขสิ่งนี้เพื่อให้ง่ายกว่ารูปแบบที่ฉันใช้ (ซึ่งทำสิ่งอื่น ๆ มากมาย) แต่สร้าง~/.vim/after/filetype.vim
(ถ้าคุณยังไม่มี) และเพิ่มสิ่งนี้:
au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))
" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']
func! <SID>CheckForGROUPNAMECode()
" Check if any of the first ten lines contain "GROUPNAME".
" Read the first ten lines into a variable
let header = getline(1)
for i in range(2, 10)
let header = header . getline(i)
endfor
if header =~ '\<GROUPNAME\>'
" Change the status line to make it clear which
" group we're using
setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
" Do other customisation here
setlocal et
" etc
endif
endfunc
func! <SID>ConfigureFiletypes(filetype)
if index(s:GROUPNAMETypes, a:filetype) != -1
call <SID>CheckForGROUPNAMECode()
endif
endfunc
เมื่อใดก็ตามที่เปิดไฟล์ประเภทใดก็ได้และตั้งค่าประเภทไฟล์ไว้ ( au FileType *
บรรทัด) ไฟล์ConfigureFiletypes
ฟังก์ชันจะถูกเรียกใช้ ซึ่งจะตรวจสอบว่าประเภทไฟล์อยู่ในรายการประเภทไฟล์ที่เชื่อมโยงกับกลุ่มปัจจุบัน (GROUPNAME) หรือไม่ในกรณีนี้คือ "c", "cpp", "vhdl" หรือ "c.doxygen" ถ้าเป็นเช่นนั้นจะเรียกว่า CheckForGROUPNAMECode () ซึ่งอ่าน 10 บรรทัดแรกของไฟล์และหากมี GROUPNAME ก็จะทำการปรับแต่งบางอย่าง เช่นเดียวกับการตั้งค่า expandtabs หรืออะไรก็ตามสิ่งนี้ยังเปลี่ยนแถบสถานะเพื่อแสดงชื่อกลุ่มอย่างชัดเจนเพื่อให้คุณรู้ว่ามันทำงานได้อย่างรวดเร็ว
ตรวจสอบการกำหนดค่าเมื่อเปิด
เช่นเดียวกับคำแนะนำของ JS Bangs การมีไฟล์กำหนดค่าที่กำหนดเองจะมีประโยชน์ อย่างไรก็ตามแทนที่จะโหลดใน vimrc ให้พิจารณาสิ่งนี้ซึ่งจะตรวจสอบเมื่อไฟล์. c ถูกเปิดสำหรับ. vim.custom ในไดเร็กทอรีเดียวกับไฟล์. c
au BufNewFile,BufRead *.c call CheckForCustomConfiguration()
function! CheckForCustomConfiguration()
" Check for .vim.custom in the directory containing the newly opened file
let custom_config_file = expand('%:p:h') . '/.vim.custom'
if filereadable(custom_config_file)
exe 'source' custom_config_file
endif
endfunction