“Todo”그룹에 사인을 할당 할 수 있습니까?


9

행에 ToDo 그룹 (ToDo, FIXME ...)이있을 때마다 부호 열에 표시 될 부호를 추가 할 수 있습니까?

내 색 구성표를 조정하여 Todo 그룹의 강조 표시를 변경했지만 Syntastic 오류 및 경고와 같은 표시 열에 표시기를 원합니다.

답변:


9

이 기능을 사용해보십시오 :

function! SignKeyword()

    silent! sign undefine todo

    sign define todo text=>> texthl=Search

    g/\v\C(<TODO>|<FIXME>)/execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

    nohlsearch

endfunction

이제 명령 행에서 함수를 호출하십시오.

:call SignKeyword()

또는 ~/.vimrc전화를 걸기 위해 매핑을 추가 하십시오.

nnoremap <your mapping> :call SignKeyword()<cr>

또는 autocmd를 추가하십시오. 예를 들어 파일 형식이 markdown 인 파일을 열 때 함수가 자동으로 호출되도록하려면 다음을 수행하십시오.

autocmd FileType markdown call SignKeyword()

함수의 첫 번째 행은 silent! sign undefine todo부호 할 일이 이미있는 경우이를 삭제하여 행을 삭제하거나 추가 한 후 부호가 잘못 배치 된 경우 함수를 호출하여 즉시 수정할 수 있습니다.


두 번째 줄은 이름이 todo이고 텍스트가 기호 (기호 >>에 맞게 변경할 수 있음)와 검색 강조 그룹 (같은 항목)을 사용 하는 부호를 정의합니다 .


세 번째 줄은 전역 명령을 사용합니다.

:g/pattern/command

전역 명령은 패턴과 일치하는 모든 행에서 명령을 실행합니다.

여기서 패턴은 TODO 또는 FIXME\v\C(<TODO>|<FIXME>) 단어를 포함하는 모든 행을 의미합니다 . 정규식에는 원자가 포함되어있어 검색이 대소 문자를 존중합니다 ( '무시'옵션이 무엇이든 관계없이). 검색에서 대소 문자를 구분하지 않으려면로 변경하십시오 .
\C\c

이러한 행을 찾을 때마다 다음 행이 함수에 의해 실행됩니다.

execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

:execute다음 문자열의 내용을 명령으로 실행 합니다.

"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')

: 문자열이 내장 함수 정력 포함 line()bufnr().
line('.')전역 명령으로 일치하는 항목이 발견되면 현재 행 bufnr('.')의 번호를 리턴하고 현재 버퍼의 번호를 리턴합니다.

예를 들어, 전역 명령이 버퍼 5의 10 행에서 일치하는 것을 찾으면 다음을 제공합니다.

"sign place 9999 line=" . 10 . " name=todo buffer=" . 5

점은 문자열을 연결하므로 최종적으로 다음과 같이 평가됩니다.

"sign place 9999 line=10 name=todo buffer=5"

다음은 :sign버퍼 5의 10 행에 부호를 배치하는 명령입니다.
9999는 부호에 대해 선택된 임의의 ID입니다 (다른 ID를 선택할 수 있음).


함수의 네 번째 줄은 :nohlsearch일치하는 패턴의 강조 표시를 비활성화합니다.

편집 : 정규식을 수정했습니다. 원본이 잘못되었습니다. 나는 썼다. ^[TODO|FIXME]그러나 나는 그것이 있어야한다고 생각한다 \v\C(<TODO>|<FIXME>). 불편을 드려 죄송합니다. 여전히 vimscript를 배우고 있습니다.


1
TODO주석이 제거 된 후 기호를 제거하는 방법 은 무엇입니까?

1
그것은 내가 예상했던 것이 아닙니다. 왜냐하면 모든 todo표지판 을 제거하기 때문입니다. 그러나 라인을 제거하면 표지판이 제거 된 것을 알 수 있습니다.

1
좋아, 나는 함수의 시작 부분 에이 줄을 추가했다 : silent! sign undefine todo. TODO 또는 FIXME 키워드가 포함 된 행을 삭제 한 후 부호가 잘못 배치 된 경우이를 수행하여 부호를 즉시 수정할 수 있습니다.
saginaw

2
정규식이 잘못 ^[TODO|FIXME]되었으므로 입력 했지만 대신 있어야했습니다 \v(TODO|FIXME). 새로운 정규 표현식은 키워드 중 하나가 포함 된 줄과 일치하지만 줄의 시작 부분과 일치하지 않습니다. 왜냐하면 줄에 주석과 같은 코드가 포함될 수 있다고 가정하기 때문 some code # FIXME this line needs to be fixed입니다. 이전 정규 표현식은 완전히 잘못되었습니다. 불편을 끼쳐 드려 죄송합니다. 여전히 vimscript를 배우고 있습니다.
saginaw

1
이 접근 방식의 문제점은 버퍼를 수정하는 경우 (예 : TODO 라인 위에 다른 라인을 추가하는 경우) 동기화가 완전히 중단되는 것입니다.
Christian Brabandt

6

DynamicSigns 플러그인을 사용할 수 있습니다 . 이렇게하면 접는 식과 비슷한 "SignExpression"이 가능합니다.

그래서 당신은 단순히 할 수 있습니다 :SignExpression getline(v:lnum)=~'TODO'?'Warning':0

가능한 것에 대한 더 많은 예를 보려면 도움말을 읽으십시오.

플러그인 사용의 장점은 버퍼의 변경 사항을 추적하고 그에 따라 표시를 조정한다는 것입니다.

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