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>에게 매핑에서 볼 경우 와일드 메뉴를 활성화해야 함을 알려줍니다 . 이 옵션을 설정하지 않고 <tab>매핑 을 작성 하면 리터럴 탭 문자가 삽입됩니다.

cnoremap <expr> <tab>

<tab>명령 행에 도달 할 때마다 표현식 평가를 입력 할 맵핑 정의를 시작하십시오 .

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

맵핑은 명령 ^\s*set\s\+\w\+=행이 양식 다음에 나오는 패턴 인 패턴과 일치 set option=하는지 또는 와일드 메뉴가 활성화되어 있는지 테스트합니다.

\ '<c-z>' :

이전 테스트에 성공하면 매핑이 와일드 메뉴를 활성화합니다.

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

그렇지 않으면 시스템 명령 :set을 사용자 정의 명령으로 :Set바꾸고 와일드 메뉴를 활성화합니다.

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

이름이 여기에있는 사용자 정의 완료 함수를 사용할 수 있다는 점을 제외하고 :Set는 동일한 작업을 수행 하는 사용자 정의 명령 을 정의 :set하십시오 s:SetComplete().

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

사용자 정의 완료 기능의 정의를 시작하십시오.

목록을 통해 제안 / 후보자를 반환해야합니다.
:Set명령은 자동으로 3 개의 인수를 보냅니다.

  • 현재 완료되는 인수의 주요 부분 (예 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')

list의 각 값에 대해 candidates문자열 앞에 추가하십시오 option=( option평가할 위치).

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

candidates처음부터 완료되는 인수와 일치하지 않는 항목을 제거하고 결과를 리턴하십시오.


2

AFAIK에서는 cmdline-completion을 제공하지 않는 기본 제공 명령에 추가 할 수 없습니다. 완료를 지원하는 다른 명령으로 명령을 "재정의" 하거나 ( :Set자본으로 정의 할 수 있음 S) vim 소스 코드를 해킹하여 누락 된 항목을 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.