ป้อนค่าตัวเลือกอัตโนมัติใน cmdline


10

ฉันไม่สามารถนับจำนวนครั้งที่ฉันได้ลองทำสิ่งนี้:

:set foldmethod=syn^I

ดูเหมือนว่าความสำเร็จนั้นไม่สามารถใช้กับค่าตัวเลือกได้!

ในบางกรณีตัวเลือกเป็นสตริงที่ซับซ้อนซึ่งการทำให้สมบูรณ์อาจไม่สมเหตุสมผล (เช่น'comments'.)

แต่มีความพยายามใด ๆ ที่จะให้การเสริมความสมบูรณ์แบบสำหรับกรณีใช้งานทั่วไปหรือไม่?

ถ้าไม่ฉันจะทำตัวอย่างข้างต้นได้อย่างไร (สมมติว่าฉันต้องการที่จะทำให้หนึ่งในสาย['manual', 'indent', 'expr', 'marker', 'syntax'])

คำตอบ:


3

คุณสามารถลองรหัสต่อไปนี้:

let s:option_values = {'foldmethod'  : ['manual', 'indent', 'expr', 'marker', 'syntax'],
                     \ 'bufhidden'   : ['hide', 'unload', 'delete', 'wipe'],
                     \ 'virtualedit' : ['block', 'insert', 'all', 'onemore'] ,}

set wildcharm=<c-z>

cnoremap <expr> <tab>
            \ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
            \ '<c-z>' :
            \ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'

command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>

function! s:SetComplete(A, L, P) abort
    let option = matchstr(a:A, '^.*\ze=')
    if !has_key(s:option_values, option)
        return
    endif
    let candidates = copy(s:option_values[option])
    call map(candidates, 'option . "=" . v:val')
    return filter(candidates, 'v:val =~ "^" . a:A')
endfunction

ก่อนกำหนดพจนานุกรมs:option_valuesที่มีวัตถุประสงค์คือการมีตัวเลือกของคุณ (เป็นกุญแจ) และค่าของพวกเขา (เป็นค่าที่เป็นรายการ) นี่เป็นตัวอย่างให้เลือก 3 + ค่าจะถูกเก็บไว้:
'foldmethod', ,'bufhidden''virtualedit'

set wildcharm=<c-z>

บรรทัดนี้ตั้งค่า'wildcharm'ตัวเลือกและบอก Vim ว่าหากเห็น<c-z>ในการทำแผนที่ต้องเปิดใช้งาน wildmenu โดยไม่ต้องตั้งค่าตัวเลือกนี้หากคุณเขียน<tab>ในการแมปมันก็จะแทรกตัวอักษรแท็บตัวอักษร

cnoremap <expr> <tab>

เริ่มต้นนิยามของการแม็พซึ่งจะพิมพ์การประเมินผลของนิพจน์ทุกครั้งที่คุณกด<tab>ที่บรรทัดคำสั่ง

\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?

การแมปทดสอบว่าบรรทัดคำสั่งตรงกับรูปแบบ^\s*set\s\+\w\+=ซึ่งเป็นบรรทัดต่อจากแบบฟอร์มset option=หรือถ้า wildmenu ทำงานอยู่

\ '<c-z>' :

หากการทดสอบก่อนหน้านี้สำเร็จการทำแผนที่จะเปิดใช้งาน wildmenu

\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'

มิฉะนั้นจะแทนที่คำสั่งระบบ:setด้วยคำสั่งที่กำหนดเอง:Setและเปิดใช้งาน wildmenu

command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>

กำหนดคำสั่งที่กำหนดเอง:Setซึ่งจะเป็นสิ่งเดียวกันเป็นยกเว้นก็สามารถใช้ฟังก์ชั่นที่กำหนดเองเสร็จสิ้นชื่อที่มีอยู่ที่นี่:sets:SetComplete()

function! s:SetComplete(A, L, P) abort

เริ่มต้นคำจำกัดความของฟังก์ชั่นความสมบูรณ์แบบกำหนดเอง

มันจะต้องส่งคืนข้อเสนอแนะ / ผู้สมัครผ่านรายการ คำสั่งจะส่ง 3 ข้อโต้แย้งโดยอัตโนมัติเพื่อให้มัน
:Set

  • ส่วนนำของการโต้แย้งในปัจจุบันเสร็จสมบูรณ์เมื่อ (เช่นoption=...)
  • บรรทัดคำสั่งทั้งหมด
  • ตำแหน่งเคอร์เซอร์ในนั้น

ดู:h :command-completion-customlistข้อมูลเพิ่มเติม

let option = matchstr(a:A, '^.*\ze=')

แยกชื่อของตัวเลือกจากการโต้แย้งเสร็จสมบูรณ์

if !has_key(s:option_values, option)
    return
endif

ตรวจสอบว่าoptionอยู่ในพจนานุกรมของคุณหรือไม่ หากไม่ใช่ฟังก์ชันจะไม่ส่งคืนสิ่งใด

let candidates = copy(s:option_values[option])

รับสำเนาของรายการค่าที่ตัวเลือกสามารถใช้จากพจนานุกรมของคุณ

call map(candidates, 'option . "=" . v:val')

สำหรับแต่ละค่าในรายการcandidatesให้เติมสตริงoption=(ที่optionจะถูกประเมิน)

return filter(candidates, 'v:val =~ "^" . a:A')

ลบรายการออกจากcandidatesจุดเริ่มต้นที่ไม่ตรงกับอาร์กิวเมนต์ที่เสร็จสมบูรณ์แล้วและส่งคืนผลลัพธ์


2

AFAIK เราไม่สามารถเพิ่ม cmdline-complete ให้กับคำสั่ง builtin ที่ไม่ได้จัดเตรียมไว้ให้ ทั้งเรา "แทนที่" คำสั่งกับคนอื่นที่จะสนับสนุนความสำเร็จ (ที่นี่คุณสามารถกำหนด:Setด้วยทุนS) หรือเราแฮ็คเป็นรหัสที่มาเป็นกลุ่มเพื่อเพิ่มสิ่งที่ขาดหายไป

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