매크로에서 삽입 모드 완료를 어떻게 사용합니까?


11

무작위 단어 목록을 빠르게 생성하는 매크로를 정의하려고합니다.
매크로가 이것을 다음과 같은 목록으로 바꾸고 싶습니다.

a
b
c
d
e

이것으로

arezzo
bywords
czars
détente
eyrie

내가 지금까지 무엇을 :

  • 편지에 커서를 놓다 a
  • 매크로 기록 시작 qq
  • a 삽입 모드에 들어갑니다
  • <C-x><C-k> - perform dictionary completion on the character before cursor - in this case the lettera`
  • <C-p>내 시스템에 표시되는 완료 목록에서 마지막 단어를 선택하십시오 arezzo. (NB 나는 longest'completeopt'설정에 포함 시켰는데 , 이는 <C-p>완료하는 동안 이런 방식으로 작동 하는 데 필요합니다 . 'set completeopt=longest,menuone,preview').
  • <C-y> 완료를 수락
  • ^[^[ 삽입 모드 종료
  • j 다음 줄로 이동하여 다음 줄에서 동일한 작업을 수행 할 수 있습니다.
  • q 녹화 중지

매크로를 만들고 수동으로 단계를 수행하면 모든 것이 잘 작동하지만 매크로를 실행하면 명령 줄에서 다음과 같은 메시지가 깜박입니다.

사전 파일 스캔

매크로의 명령 만 j실행됩니다. 즉 커서가 줄 아래로 이동하지만 완료 명령은 실행되지 않습니다.
매크로에서 삽입 모드 완료를 사용할 수 있습니까? 그렇다면 어떻게 할 수 있습니까?


나는 당신의 이해가 안 <C-p>... 단계를 내 정력에, 그냥 메시지를 준다 수행 할 때 back at original- 마지막 항목을 선택하지 않습니다 .. 내가 마지막으로 할 말은 (내 경우를 선택하려면 두 번 화살표 키를 사용 azures) 입력을 누르면 및 다음 Esc+j+q.. 그 다음 실행 매크로에 아주 잘 작동
Sundeep

1
@spasic 아 좋은 지적, 언급 했어야하지만 즉시 삽입 set completeopt=longest,menuone,preview하는 longest옵션을 사용 하고 <C-p>있습니다. 문자열 longest에서 제거 completeopt하면 동일한 동작이 나타납니다. 또한, 화살표 키가 작동했습니다! 감사합니다 (완료 목록을 탐색하는 데 사용할 수 있음을 잊었습니다)
the_velour_fog

팝업 메뉴가 방해 될 수 있습니다. 아마 시도 :set completeopt=a<c-x><c-k><esc>j매크로 등.
Antony

@Antony <Cp>가 작동하지 않는 이유는 확실하지 않지만 방향 화살표 키는 작동했습니다.
the_velour_fog

답변:


2

편집 : 정말 당신은 사전 완료 후; 이를 위해 반드시 삽입 모드 (Ctrl + X 모드)가 필요하지는 않습니다. 아시다시피 매크로 작업은 정말 고통 스럽습니다. 아래 스크립트는 삽입 모드없이 사전 완성을 수행하는 데 사용할 수 있으므로 매크로 내에서 쉽게 반복 할 수 있습니다.

아래 코드를 .vimrc파일에 추가하고 vim 창을 닫았다가 다시 열어서 새 기능을 찾은 다음 번갈아 눌러서 기록을 <C-k>완료하고 j다음 줄로 이동하십시오. longest옵션 에 대한 검사를 추가했으며 비활성화 된 경우 시스템 임의 시간을 사용하여 임의 항목을 선택합니다. longest옵션을 찾으면 사전에서 가장 긴 일치 항목을 수동으로 검색하여 삽입합니다.

<C-k>매핑 이 마음에 들지 않으면 적절하게 변경하십시오. 원하는 모든 매핑에서 작동해야합니다.

또한 평가를 위해 매핑에 대한 표현식을 반환하는 명령 \<esc>은 끝에 문자를 추가하여 각 삽입 후 삽입 모드를 자동으로 종료 0cw하고 앞에 삽입 모드로 들어가기 시작하여 전체 단어를 덮어 씁니다. 바르게. 원하는 정확한 동작에 따라 (단어가 각 줄의 맨 앞에 나오지 않는 경우) bcw대신 실제 단어 시작을 찾는 데 사용할 수 있습니다 . 그러나 줄을 시작하는 단어로 돌아갈 때 약간의 이상한 점이 나타납니다. 줄 끝을 무시하고 한 번에 두 가지를 모두 수행하는 고급 명령이있을 수 있지만 찾지 못했습니다.

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

또한 삽입 모드가 제공하는 기능을 수행하는 대체 맵핑 (예 : 기능 매개 변수 사용)을 작성하기 위해 여기에서 로직을 확장하는 것은 어렵지 않습니다. 이러한 요구 사항을 지원하고 시간이 지남에 따라이 스크립트를 업데이트하겠습니다.


이것은 문제에 대한 그럴듯한 설명처럼 들리지만 제안 된 해결책을 모두 시도했지만 도움이되지 않는 것 같습니다.
Rich

sleep명령 을 시도 했습니까 ?
Tim

예, 제안 된 값이 5 초인 경우에만 가능합니다. 두 솔루션 중 하나를 작동시킬 수 있습니까? 전체 단계 목록을 게시 할 수 있습니까?
Rich

나는 그 질문을 쓴 사람이 아닙니다. 그러나, 나는 문제를 재현 : 당신은 추가해야 할 가장 긴completeopt(내가 아니라 다시) 주석에 설명 된대로. 편집 : 죄송합니다 . 단계에 'longest'필요합니다 . 아직도 단계에서 나에 대한 질문 - 아스 커의 작품 설명 과 함께 편집했다. ctrl-pctrl-yvim -Nu NONEcompleteopt
Rich

나는 해결책을 찾았고, 대답을 업데이트하기 위해 몇 분을 줘야한다고 생각합니다.
Tim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.