Vim: ใช้การตั้งค่ากับไฟล์ในไดเร็กทอรี


103

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

ทางออกที่ดีที่สุดคือถ้า Vim ค้นหาและอ่าน. vimrc ในไดเร็กทอรีปัจจุบันก่อนที่จะค้นหา ~ / .vimrc และใช้การตั้งค่าที่นั่นกับต้นไม้ทั้งหมด

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

สิ่งที่ฉันพยายามคือ

  • วาง. vimrc ในไดเร็กทอรีการทำงาน
  • :so vimrc ใน modeline

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


คำตอบ:


42

ฉันเป็นผู้สนับสนุนของทางปลั๊กอิน ด้วยเหตุผลหลายประการ:

  • โมเดลมีข้อ จำกัด โดยเฉพาะ: เราไม่สามารถตั้งค่าตัวแปร (ที่ปรับแต่งปลั๊กอิน (ฟุต) อื่น ๆ เช่น "วงเล็บปีกกาของ for-snippet ควรอยู่ในบรรทัดใหม่หรือไม่") หรือเรียกฟังก์ชันจากพวกเขา (ฉันไม่ จำกัด ตัวเอง สำหรับมาตรฐานการเข้ารหัสฉันยังตั้งค่า makefile ที่จะใช้ขึ้นอยู่กับไดเร็กทอรีปัจจุบัน)
  • DRY : ด้วย modelines การตั้งค่าจะต้องทำซ้ำในทุกไฟล์หากมีหลายสิ่งที่ต้องตั้งค่าหรือปรับเปลี่ยนการปรับเปลี่ยนจะทำให้ยากต่อการบำรุงรักษาอย่างรวดเร็วยิ่งไปกว่านั้นจะต้องใช้ปลั๊กอิน template-expander ( ซึ่งคุณควรพิจารณาหากคุณมีบรรยากาศหลายอย่างในโครงการของคุณ)
  • ไม่ใช่ทุกคนที่ใช้กลุ่มในการพัฒนา ฉันไม่ต้องการที่จะใส่ใจกับการตั้งค่าตัวแก้ไขของคนอื่นทำไมฉันต้องกาฝากของพวกเขา?
  • ง่ายกว่าที่จะขอให้นักต้มตุ๋นติดตั้งปลั๊กอินเดียวกันแทนที่จะขอให้พวกเขาคัดลอกวางและดูแลรักษาบรรทัดเดียวกันใน. vimrc
  • สามารถบันทึกการตั้งค่าด้วยไฟล์โปรเจ็กต์อื่น ๆ (cvs / svn / git / อะไรก็ได้)
  • มันง่ายมากที่จะมีไฟล์คอนฟิกูเรชันต่อโปรเจ็กต์ - ด้วยปลั๊กอินฉันมีไฟล์คอนฟิกูเรชันสำหรับมาตรฐานการเข้ารหัสของโปรเจ็กต์โดยรวมและไฟล์คอนฟิกูเรชันเฉพาะสำหรับโปรเจ็กต์ย่อยแต่ละโปรเจ็กต์ (ซึ่ง makefile ใช้ซึ่งเรียกใช้งานได้ , ... )

BTW โซลูชันของ sthสามารถใช้เพื่อจัดหาไฟล์การกำหนดค่าเดียว สิ่งนี้คล้ายกับวิธีการปลั๊กอินมากยกเว้น. vimrc จะต้องมีตัวเลือกที่ไม่ใช่โกลบอลและไม่รองรับไฟล์คอนฟิกูเรชันหลายไฟล์ / แชร์ได้อย่างง่ายดาย


ฉันสังเกตเห็นว่าคุณต้องบันทึกไฟล์ใหม่ในเส้นทางก่อนที่จะดำเนินการปลั๊กอินได้อย่างถูกต้อง
cmcginty

แน่นอน. ปลั๊กอินตระกูลนี้กำหนดกรอบ คุณยังคงต้องเขียนคำจำกัดความเฉพาะของโปรเจ็กต์ลงในไฟล์ซึ่งเฟรมเวิร์กจะจัดหามาโดยอัตโนมัติ
Luc Hermitte

1
โปรดทราบว่า Luc เชื่อมโยงปลั๊กอินของเขาเอง ดูเหมือนว่าจะได้ผลดีกว่าคำถามที่เชื่อมโยงไว้ ขอบคุณ.
ข้อมูล

ดี. บอกไม่ถูก. เนื่องจากฉันใช้ของฉันมาหลายปีฉันไม่เคยดูการใช้งานอื่น ๆ อย่างละเอียด ในบางครั้งฉันจะได้รับรายงานข้อบกพร่องซึ่งในที่สุดฉันก็คำนึงถึง BTW เวอร์ชันของฉันถูกนำไปใช้เพื่อทริกเกอร์ก่อน mu-template เพื่อตั้งค่าตัวแปรเฉพาะโครงการก่อนที่จะขยายเทมเพลต (ซึ่งค่อนข้างมีประโยชน์ในการดึงไดเร็กทอรีรูทของโปรเจ็กต์ปัจจุบันและตัดแต่งจากชื่อพา ธ ที่ขยาย)
Luc Hermitte

1
@JasonMcCarrell การใช้งาน local_vimrc และ Markus ของฉัน Braun มีการรองรับบัญชีดำรายการที่อนุญาตพิเศษ ... หากคุณต้องการระบุวิธีการทำเยื้องอาจเป็นปลั๊กอิน EditorConfig-vim จะเป็นทางเลือกที่ดีกว่า
Luc Hermitte

91

ใส่อะไรแบบนี้ก็ได้ $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

1
นี่เป็นแบบวนซ้ำ แต่เฉพาะกับ * หากคุณพยายามลดเป็น / path / to / files / หรือ / path / to / files มันจะไม่ทำงาน
SystemParadox

วิธีนี้ดีมากถ้าโปรเจ็กต์ของคุณมีโครงสร้างของไฟล์ที่เขียนด้วย "noexpandtab" และโครงสร้างอื่นที่มีไฟล์ "expandtab" ทั้งหมด (เช่น CodeIgniter) คุณสามารถตั้งค่าการดำเนินการที่เหมาะสมสำหรับไฟล์ในแต่ละทรีโดยใช้ไฟล์กำหนดค่าเดียว
user9645

2
ผิดปกตินี้ใช้ไม่ได้เมื่อเส้นทางของฉันมี symlink ฉันต้องวางเส้นทางแบบเต็มโดยไม่มีลิงก์สัญลักษณ์ก่อนที่จะใช้งานได้
Dolan Antenucci

ดูคำตอบของ joseph07 เกี่ยวกับการใช้ "กลุ่มที่เชื่อถือได้" เป็นทางเลือกการกลับกันของแนวทางนี้ (. vimrc แบบกระจายเทียบกับส่วนกลาง)
Nathan Schulte

50

ฉันขอแนะนำอย่างยิ่งว่าอย่าใช้ set exrc

แม้ว่าset secureภายใต้ * nix กลุ่มจะยังคงเรียกใช้คำสั่งอัตโนมัติ, เชลล์และอื่น ๆ หากคุณเป็นเจ้าของไฟล์ ดังนั้นหากคุณต้องการแก้ไขไฟล์ใน tarball นั้นฉันส่งให้คุณพร้อมกับ.vimrc:

autocmd BufEnter * :silent! !echo rm -rf ~/

คุณอาจจะสนุกน้อยกว่าฉัน


6
นอกจากนี้ยังเป็นจริงกับปลั๊กอินที่จะดำเนินการโดยอัตโนมัติเมื่อโหลดเป็นกลุ่ม
Luc Hermitte

31

คำถามนี้เป็นคำถามเก่า แต่ดูเหมือนเป็นเรื่องธรรมดาและเป็นเรื่องที่น่ากังวล

วิธีแก้ปัญหาของฉันค่อนข้างง่าย ฉันวาง.vimrcไฟล์ในไดเรกทอรีรากของโครงการของฉัน บรรทัดแรกของ.vimrcไฟล์มักจะเป็นแหล่งที่มา~/.vimrcจากนั้นจึงเพิ่มการกำหนดค่าเฉพาะที่ฉันต้องการ ฉันใช้นามแฝงtvim='vim -u .vimrc'และใช้tvimในไดเรกทอรีโครงการส่วนตัวของฉัน "tvim" สำหรับ "กลุ่มที่เชื่อถือได้" ซึ่งหมายความว่าหากฉันเรียกใช้ไฟล์ในไดเร็กทอรีที่มี.vimrcไฟล์และมีบางอย่างผิดพลาดฉันไม่มีใครจะโทษนอกจากตัวฉันเองเนื่องจากฉันพูดอย่างชัดเจนว่าฉันเชื่อถือมัน นอกจากนี้ฉันยังเก็บกลุ่มของสิ่งเหล่านี้ไว้เพื่อให้บางครั้งฉันสามารถ softlink ที่ฉันต้องการสำหรับโครงการบางประเภทได้


1
แนวทางนี้ตรงไปตรงมาและตรงกับความต้องการของฉันมาก
Jinxed

เมื่อฉันลองสิ่งนี้และsource $HOME/.vimrcจากในพื้นที่ของฉัน.vimrcVim บ่นว่าไม่พบปลั๊กอินที่ติดตั้งทั้งระบบของฉัน (เชื้อโรคในกรณีนี้execute pathogen#infect()คำสั่งบนยอด$HOME/.vimrcล้มเหลวของฉันด้วยUnknown function ...) ฉันจะแก้ไขปัญหานี้ได้อย่างไร?
Nathan Schulte

20

การวาง. vimrc ในไดเร็กทอรีการทำงานได้รับการสนับสนุนจริงปิดใช้งานตามค่าเริ่มต้นเท่านั้น ดู:h 'exrc'และ:h startupสำหรับรายละเอียดการตั้งค่า'exrc'จะเปิดใช้งานการอ่าน.vimrcจากไดเร็กทอรีปัจจุบัน

ขอแนะนำให้:set secureใช้เมื่อใช้สิ่งนี้ สิ่งนี้จะล็อก:autocmdเชลล์และเขียนคำสั่งสำหรับ.vimrcในไดเร็กทอรีปัจจุบัน

สิ่งที่ควรค่าแก่การพิจารณาอีกประการหนึ่งคือการตั้งค่าเซสชัน ( :h session) ด้วยมุมมองมาตรฐานและการตั้งค่าสำหรับโครงการ

ทั้งหมดที่กล่าวมาฉันอาจจะไปกับตัวเลือกปลั๊กอินที่มีรายละเอียดโดย Luc Hermitte เอง


6
โปรดดูความคิดเห็นโดย phen ซึ่งอาจนำไปสู่ผลกระทบด้านความปลอดภัยที่ร้ายแรง
ข้อมูล

11

เพื่อลดความเสี่ยงด้านความปลอดภัยด้วยคุณสมบัติ "ทำงานอัตโนมัติ" สำหรับสิ่งใด ๆ ในทุกวันนี้ฉันขอแนะนำให้คุณใช้คุณลักษณะที่มีอยู่ของ vim แทนปลั๊กอิน (สัมภาระพกพา) ได้ไหม

เช่น.

ไฟล์ vimrc ของโฟลเดอร์ในเครื่องของฉันชื่อ "_gvimrc" (ตามวัตถุประสงค์) สิ่งนี้ช่วยลดความหวังสำหรับคนอย่างฟีนจากการขบขันค่าใช้จ่ายของเรา :-)

ในไฟล์ $ VIM / .vimrc ของฉันฉันแทรก:

if filereadable("_gvimrc")
    source _gvimrc
endif

ในตอนท้าย

ฉันใช้ "filereadable ()" ทับ "fileexists ()" เนื่องจากในภายหลังมีความแปลกประหลาดเมื่อถูกทรมานด้วยการเปิดหลายไฟล์ (10+) พร้อมกัน (ไม่แน่ใจว่าทำไม)

แน่นอนคุณสามารถตั้งชื่อไฟล์เฉพาะของคุณเองเพื่อทำให้ผู้สร้างปัญหาสับสนได้มากขึ้น เช่น "_mygvimrc", "_gobbledygook" เป็นต้นคุณเพียงแค่ตั้งชื่อที่เป็นมาตรฐานเดียวแล้วตั้งแหล่งที่มาใน $ VIM / .vimrc ของคุณ การใช้ภายใน vi / vim สำหรับกฎนี้เพื่อแก้ปัญหาการพกพา แต่อย่าตั้งชื่อเป็น. vimrc (หรือ _vimrc) เพื่อป้องกันการเรียกซ้ำในกรณีที่คุณกำลังแก้ไขไฟล์ $ VIM / .vimrc ด้วย vim ในภายหลัง

ใช้สิ่งนี้มาตั้งแต่ Windoze 98SE ผ่าน Windork XP Pro และตอนนี้ Windorkier 7 (5 ปีขึ้นไปแล้ว) ฉันจะทำเครื่องหมายรายการไฟล์. txt ใน Explorer จากนั้นใช้ "Edit with multiple Vim" ทำให้หน้าต่าง vim หลาย ๆ หน้าต่างเปิดขึ้นพร้อมกัน สำหรับงานของฉันฉันทำวันละหลายครั้งทุกวัน ไฟล์ทั้งหมดได้รับการปฏิบัติตามสิ่งที่ฉันตั้งไว้ใน _gvimrc ในเครื่องของฉัน


ที่นี่ความไม่ไว้วางใจสำหรับการพกพาปลั๊กอินไม่มีเหตุผลเนื่องจากปลั๊กอิน local_vimrc เหล่านี้ (อย่างน้อยของฉัน) เป็นแบบพกพา (เคยได้รับการบำรุงรักษาในระบบปฏิบัติการต่างๆและแม้แต่ windows 95) ปัญหาเกี่ยวกับความเสี่ยงด้านความปลอดภัยยังเกินจริง: หากเราทำตามวิธีนี้เราจะไม่ติดตั้งสิ่งใดเพื่อให้งานของเราง่ายขึ้น
Luc Hermitte

แต่เท่าที่ฉันกังวลปัญหาแรกที่แท้จริงคือด้วยวิธีการของคุณคุณต้องทำงานจากไดเร็กทอรีที่แน่นอนที่มีไฟล์ _gvimrc (ซึ่งเป็นชื่อที่ไม่ดีเนื่องจากควรมีเนื้อหาเฉพาะของ gvim) หากโปรเจ็กต์ของคุณประกอบด้วยไดเร็กทอรีหลายไดเร็กทอรีซึ่งอาจต้องมีการกำหนดค่าทั่วไปและไดเร็กทอรีเฉพาะ (ในกรณีที่มีหลายโมดูล) จะแสดงข้อ จำกัด อย่างรวดเร็ว
Luc Hermitte

ปัญหาที่สองคือคุณสามารถทำงานในโครงการเดียวในเวลานั้น - ถ้าฉันต้องการทำงานกับ OTB, openjpeg และโครงการที่รวมทั้งสองไลบรารีโซลูชันนี้จะไม่อนุญาตให้ฉันมีการตั้งค่าเฉพาะสำหรับแต่ละโครงการ สามโครงการ
Luc Hermitte

นอกจากนี้ยังใช้ได้กับเดซี่เชนโหลดไฟล์ไวยากรณ์จากไดเร็กทอรีในเครื่อง
maharvey67

2

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


2

ฉันเห็นด้วยกับวิธีการใช้ปลั๊กอินด้วยเหตุผลด้านความปลอดภัย

มีปลั๊กอินที่ดีมากซึ่งยังไม่ได้กล่าวถึง ช่วยให้คุณใช้ a .lvimrcในไดเรกทอรีโครงการของคุณ

ลองใช้ "localvimrc":

http://www.vim.org/scripts/script.php?script_id=441

https://github.com/embear/vim-localvimrc


2

ใช้ "editorconfig"

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

ข้อกำหนด "editorconfig" อนุญาตให้โปรเจ็กต์ร้องขอการตั้งค่าที่แตกต่างกันขึ้นอยู่กับนามสกุลไฟล์หรือชื่อภายในโปรเจ็กต์ (ดังนั้นคุณสามารถมี Makefiles โดยใช้ TABs สคริปต์ Python ของคุณโดยใช้ช่องว่าง 4 ช่องและเชลล์สคริปต์ของคุณโดยใช้ช่องว่าง 2 ช่องสำหรับการเยื้อง)

คุณต้องมีปลั๊กอินเพื่อใช้ "editorconfig" ในกลุ่ม เว็บไซต์อย่างเป็นทางการมีให้ แต่โดยส่วนตัวแล้วฉันขอแนะนำsgur / vim-editorconfigซึ่งเขียนด้วย Vimscript บริสุทธิ์ดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับการอ้างอิงภายนอกมากเกินไป

เนื่องจาก "editorconfig" มุ่งเป้าไปที่ความเข้ากันได้ของ cross-editor จึงค่อนข้าง จำกัด ในสิ่งที่ทำดังนั้นหากคุณต้องการให้มีช่องว่างที่สม่ำเสมอรูปแบบไฟล์ (DOS เทียบกับ Unix) และการเข้ารหัส (Unicode utf-8 เป็นต้น) จากนั้น "editorconfig " สำหรับคุณ.



0

ผมมองไปที่ปลั๊กอินที่มีอยู่และไม่ได้จริงๆจินตนาการใด ๆ ของพวกเขาดังนั้นผมเขียนฟังก์ชั่นที่เรียบง่ายที่หลังลูกหมูในกลุ่ม-ผู้ลี้ภัย ข้อดีของสิ่งนี้คือการรู้ว่ารูทของโปรเจ็กต์นั้นเป็นรูทของที่เก็บเสมอและนอกจากนี้ฉันยังสามารถแฮชไฟล์เพื่อเก็บตารางความเชื่อถือได้ เพียงใส่สิ่งต่อไปนี้ใน.vimrcไฟล์ของคุณ

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

หาก!ตั้งค่าตัวเลือกในการviminfoตั้งค่าSAFE_VIMRCพจนานุกรมจะถูกเก็บรักษาไว้ระหว่างการรัน (โปรดสังเกตว่า^จะใส่ตัวเลือกไว้ข้างหน้าเพื่อไม่ให้ตัวเลือกนั้นสับสนn)

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