ชื่อไฟล์ที่เป็นกลุ่ม / เสร็จสิ้นเส้นทาง


11

ฉันรู้ว่าฉันสามารถกรอกชื่อไฟล์ / พา ธ จากไดเรกทอรีปัจจุบันโดยใช้ ctrl + x, ctrl + f ( compl-filename) ใช้งานได้ดีเมื่อรวมกับ set autochdir ซึ่งการเปลี่ยนแปลงจะอัปเดตไดเรกทอรีปัจจุบันไปยังไดเรกทอรีของบัฟเฟอร์ที่ใช้งานอยู่

อย่างไรก็ตามฉันเริ่มใช้airblade/vim-rooterเพื่อทำให้ไดเรกทอรีปัจจุบันเป็นโฟลเดอร์ "โครงการ" ตอนนี้การเติมชื่อไฟล์ให้สมบูรณ์จะเริ่มต้นจากโฟลเดอร์โครงการเสมอ

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

ยังถูกถามใน stackoverflow


5
C-xC-f ใช้ไดเรกทอรีการทำงานของบัฟเฟอร์ปัจจุบันเสมอโดยไม่มีตัวเลือกใด ๆ เพื่อกำหนดค่า (ไม่รองรับpathเช่นกัน) ขึ้นอยู่กับสิ่งที่คุณต้องการใช้สำหรับ vim-rooter เราสามารถใช้ปลั๊กอินอื่น ๆ ได้ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณต้องการ นอกเหนือ: ผมใช้ youcompleteme ./ซึ่งเสร็จสมบูรณ์เส้นทางจากไดเรกทอรีของบัฟเฟอร์ปัจจุบันถ้าคุณเริ่มพิมพ์ ดูreddit.com/r/vim/comments/216jdd/ …
muru

คำตอบ:


7

ดังที่ @muru กล่าวถึงไม่มีตัวเลือกในการกำหนดค่าไดเรกทอรีเพื่อให้ชื่อพา ธ และไฟล์สมบูรณ์ มันมักจะใช้ไดเรกทอรีการทำงานของหน้าต่าง

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

ช้าง

สำหรับเหตุผลที่ไม่รู้จักที่จะได้ฉันฉันได้นี้เรียกว่าไมโครปลั๊กอินช้าง

นี่คือรหัส (คัดลอกจากการกำหนดค่าVimของฉันบน GitHub ):

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

วิธีใช้งาน

การใช้การแมปเหล่านี้เกิดขึ้นใน 3 ขั้นตอน

1. เรียกใช้การแมป

<C-R><C-E>ในโหมดแทรกหรือโหมดบรรทัดคำสั่งเรียกการทำแผนที่โดยใช้

2. เลือกไดเรกทอรี

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

  • f - ไดเรกทอรีที่ไฟล์ปัจจุบัน (บัฟเฟอร์) ตั้งอยู่
  • p - ไดเรกทอรีฐานของโครงการ Git ที่ไฟล์ปัจจุบันเป็นของ

3. ป้อนพา ธ หรือชื่อไฟล์

คุณจะได้รับแจ้งให้ป้อนเส้นทางหรือชื่อไฟล์ที่สัมพันธ์กับไดเรกทอรีที่ระบุพร้อมความสมบูรณ์ กดEnterเมื่อเสร็จสิ้น

บางบันทึก

  • นี้ไม่ได้ให้แล้วเสร็จแบบอินไลน์ในโหมดแทรกวิธีการที่<C-X><C-F>ไม่; คุณจะพิมพ์พา ธ หรือชื่อไฟล์แทนในพรอมต์บรรทัด:คำสั่ง (ไปที่คำสั่ง) เมื่อกดEnterแล้วเส้นทางจะถูกแทรกลงในบัฟเฟอร์
  • สิ่งเดียวกันนี้เป็นจริงในโหมดบรรทัดคำสั่งซึ่งบางครั้งอาจสร้างความสับสนเมื่อคุณกดEnterและลืมว่าคุณยังต้องกดEnterเพื่อออกคำสั่งอะไรก็ตามที่คุณเพิ่งพิมพ์
  • ฟังก์ชั่นไดเรกทอรีอื่น ๆ g:elephant_mapสามารถลงทะเบียนโดยการเพิ่มพวกเขาลง
  • เส้นทางที่แทรกจะเป็นเส้นทางแบบเต็มและแน่นอน สคริปต์สามารถปรับแต่งเพื่อเปลี่ยนพฤติกรรมนั้น แต่ฉันไม่ได้เข้าใกล้มัน

ไม่ได้ทดสอบวิธีการแก้ปัญหา แต่ยอมรับว่าเป็นเพราะความสมบูรณ์ แต่ฉันใช้วิธีแก้ปัญหาที่แนะนำ: YouCompleteMeแทน ctrl + x, ctrl + f
Rafael Barbosa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.