vimrc에서 많은 약어를 관리하고 기억하는 방법은 무엇입니까?


10

나는 이상 500 약어 (이 iabbr, abbr) 및 Java, PHP, C / C ++ 및 라텍스에서 내의 vimrc 파일에 일부 매핑.

언어를 한동안 사용하지 않으면 바로 기억하기가 쉽지 않습니다.

약어 이름으로 완성 할 수 있는지 궁금합니다. 이 약어를 모두 액세스 / 관리하는 더 좋은 방법이 있습니까?

답변:


10

500 개가 넘는 약어를 관리하는 가장 좋은 방법이 무엇인지 모르겠습니다. @statox가 설명했듯이 장기적으로는이 숫자를 줄이기 위해 스 니펫을 볼 수 있습니다.

약어를 자동 완성하려면 다음 코드를 시도하십시오.

augroup GetAbbrev
    autocmd!
    autocmd VimEnter * let s:abbrev_list = [] |
                \ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END

set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
    if a:findstart
        return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
    else
        return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
    endif
endfunction

그것을 사용하려면 C-x C-u약어가 시작된 후에 적중해야합니다 .


autocmd는 s:abbrev_list모든 약어를 포함해야하는 변수 를 설정합니다 .

함수 CompleteAbbrev()는 커서 앞의 단어를 기반으로 후보 목록을 리턴해야합니다.

'completefunc'옵션의 값은 명중 할 때 호출하는 기능 빔을 알려줍니다 C-x C-u.
이 옵션은 버퍼에 국한되므로 autocmd 및 FileType이벤트 와 같은 다른 종류의 버퍼에서 다른 기능을 계속 사용할 수 있습니다 .

:h complete-functions기능 작동 방법에 대한 자세한 내용 을 참조하십시오 .


다른 해결책은 동의어 완성을 사용하는 것입니다. 보낸 사람 :h i_^x^t:

                            *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T       Works as CTRL-X CTRL-K, but in a special way.  It uses
                    the 'thesaurus' option instead of 'dictionary'.  If a
                    match is found in the thesaurus file, all the
                    remaining words on the same line are included as
                    matches, even though they don't complete the word.
                    Thus a word can be completely replaced.

                    For an example, imagine the 'thesaurus' file has a
                    line like this:
                            angry furious mad enraged
                    Placing the cursor after the letters "ang" and typing
                    CTRL-X CTRL-T would complete the word "angry";
                    subsequent presses would change the word to "furious",
                    "mad" etc.
                    Other uses include translation between two languages,
                    or grouping API functions by keyword.

이 솔루션을 사용하려면 다음 3 가지를 수행해야합니다.

  1. {lhs}모든 약어를 전용 파일 안에 작성 하십시오.
    예를 들면 다음과 같습니다 /home/user/mysynonyms.txt. 그리고 비슷한 주제를 중심으로 그룹화하십시오.
  2. 이 파일의 경로를 옵션에 추가하십시오 'thesaurus'.

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. C-x C-t그룹 내부의 약어 이름이 시작된 후에 적중 합니다.

예를 들어 다음과 같은 약어가 있다고 가정합니다.

iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC

iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC

iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC

자신이 속한 프로그래밍 언어에 따라 그룹화 할 수 있습니다.
내부 /home/user/mysynonyms.txt에 다음과 같이 작성합니다.

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

이제 C-x C-t약어 이름 (또는 시작 부분)을 따라갈 때마다 Vim은 팝업 메뉴에서 같은 줄에있는 모든 약어를 표시해야합니다.

그 모습은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

약어는 그룹화하기 위해 동일한 문자로 시작할 필요가 없으며 완전히 다를 수 있습니다. 동의어 파일에서 같은 줄에있는 한 Vim은 모든 것을 보여줍니다.

그리고 어떤 그룹에서 약어를 넣을지를 결정하기 위해 프로그래밍 언어를 사용할 필요가 없습니다. 의미있는 유사성 / 주제 / 카테고리에 따라 그룹화 할 수 있습니다.

따라서 특정 약어를 잊어 버린 경우 카테고리의 첫 글자를 입력 C-x C-t하고 메뉴에서 관련 글자를 선택하고 선택할 수 있습니다.

편집 :
안에 모든 약어를 덤프하려면 /home/user/mysynonyms.txt다음 3 Ex 명령을 사용할 수 있습니다.

:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')

Edit2 : 대체가 필요하지 않기 때문에 함수가 호출 될 때
플래그를 추가했습니다 . 그것의 유일한 목적은 하나를 찾을 때마다 목록 안에 약어를 추가하는 것입니다. 그러나 많은 약어가 있기 때문에 프로세스가 쓸모없이 느려질 수 있습니다. 처음에는 사용중인 Vim 버전을 모르기 때문에 넣지 않았습니다. 버전이 7.3.627 보다 최신 인 경우에는 정상 이어야하며, 그렇지 않으면 플래그 를 제거해야합니다 .nsubstitute()
n


환상적이고 포괄적 인 답변. you Rock
1234

\ v % (^ | \ n) \ s * i? % (nore)? ab % [brev] \ s + % (% (\ <expr \> | \ <buffer \>) \ s +) {, 2} ( \ k +)가 vimrc 파일에서 작동하지 않습니다
1234

@JoobLee 내 시스템에서 작동합니다. 오류 메시지가 있습니까? 보다 간단하지만 신뢰성이 떨어지는 정규 표현식으로 작동합니까 \vi?abbr\s+(\k+)? 문제를 재현 할 수 있는지 확인하기 위해 약어에서 발췌 한 링크를 제공해 주시겠습니까?
user9433424

@JoobLee Vim 버전이 최신 버전이면 n대체 통화에 플래그를 추가하십시오 (포함하도록 답변을 편집했습니다). 에서 검색을 vimrc하고 이것을 복사하여 붙여 넣으면 \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+약어가 강조 표시됩니까?
user9433424

9

Wikia 은 약어를 선택적으로 표시하는 방법을 제안합니다.

모든 약어를

:ab<CR>

(교체 abiab전용 모드의 약어 삽입 목록)

그리고 당신은 같은 접두사와 함께 모든 약어를 나열 할 수 있습니다

:ab prefix<CR>

이것은 약어를 완성하는 것만 큼 이상적이지는 않지만 기존 약어 목록을 신속하게 얻는 좋은 방법이 될 수 있습니다.

이 솔루션을보다 효율적으로 사용하려면 파일 유형별로 약어를 만드는 것이 좋습니다. 예를 들어이 약어는 Java 버퍼에서만 유용합니다.

iabbrev syso System.out.println("");

따라서 다음과 같이 정의하는 것이 좋습니다.

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

자동 명령 부분을 사용하면 Java 버퍼에있을 때만 약어를 작성할 수 있으며이 버퍼 <buffer>에서만 약어에 액세스 할 수 있는 옵션이 있습니다.

이 방법 :iab은 자바 버퍼에있을 때만 약어를 표시합니다. 약어가 많은 경우 모든 약어를 정의하고 자동 명령이 함수를 호출하게하는 파일 유형별로 함수를 작성하는 것이 흥미로울 수 있습니다. 다음과 같은 것 :

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

또 다른 해결책은 약어 목록을 키워드 소스로 사용하여 자체 자동 완성 기능을 만드는 것입니다.

마지막으로 나는 "500 개가 넘는 약어"에 깊은 인상을 받았다고 말해야합니다. 어떤 것을 사용하고 있는지 모르지만 아마도 익숙하지 않으면 스 니펫의 개념을 살펴 보는 것이 흥미로울 것입니다 그들과 함께. 키워드를 입력하고 핫키를 누르면 트리거되는 템플릿이므로 약어보다 융통성이 있으므로 사용중인 약어 수를 줄일 수 있습니다. 흥미로운 소개는 여기 를 참조 하십시오 .


1

파일 유형별로 약어를 그룹화하는 것은 어떻습니까?

~/.vimrc파일에 파일 을 모두 넣는 대신 파일을 분리하여 런타임 디렉토리의 적절한 위치 ( ~/.vimUNIX와 유사한 운영 체제) 에 두십시오 .

예를 들어, Markdown 약어는 파일 ~/.vim/after/ftplugin/markdown.vim에 있으며 Vim 은 Markdown 파일 유형 플러그인이로드 된 확인 합니다.

우리는 거대한 .vimrc파일을 가져서는 안된다는 것이 밝혀졌습니다 . 를 사용하면 더 많은 유연성을 얻을 수 있습니다 $VIMRUNTIME. 런타임 경로는 Vim의 도움말 시스템에 문서화되어 :h 'runtimepath'있습니다.

Vim을 테마로 한 출현 달력 Vimways.vimrc에서 .vim까지 훌륭한 기사 에서 처음으로 이것에 대해 배웠습니다 .

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