줄 번호 특정 텍스트 너비 설정


9

나는 이메일을 쓰는 데 gvim을 사용 tw=72하고 긴 줄을 나누는 데 사용합니다. 이제 동일한 문서에서 기본 메일 헤더를 편집합니다 (예 : 메일에 수신자 추가). 이제는 tw=7272 문자 후에도 끊어집니다.

tw=0처음 4 줄 (머리글 부분)과 tw=72나머지 문서 에 어떻게 설정할 수 있습니까?

관련이 있다면 내 형식 옵션은 다음과 같습니다.

set fo+=tcqn

textwidth전체 버퍼에 적용됩니다.
romainl

3
또한 Vim이 태그 중간에 링크를 끊지 않도록 하십시오 . 당신은 이메일에 대한 어느 경우 확인하여 유사한 솔루션을 사용할 수있는 line('.') < 5경우, 또는 이메일 헤더 라인이 시작됩니다 (예를 들어 확인하여 From: , To: 등).
Martin Tournoij

@Carpetsmoker 대단히 감사합니다. 이것이 솔루션의 핵심이었습니다. 필요한 수정 사항으로 전체 답변을 추가했습니다.
mxmehl

답변:


6

내 질문에 대한 @Carpetsmoker의 의견 덕분에 원하는대로 정확하게 해결할 수있었습니다.

.vimrc (또는 전자 메일을 편집 할 때만로드 된 특수 파일의 경우)에서 다음 기능을 사용하면 줄 번호가 5보다 작 으면 tw가 500으로 설정되고 그렇지 않으면 72입니다 au CursorMovedI. 커서가 움직입니다.

" Set tw to 500 if in the first 4 lines, else 500
au CursorMovedI * call ModifyTextWidth()   " execute when cursor has moved, use for all files
function! ModifyTextWidth()
    if line('.') < 5               " if line number smaller than 5
        setlocal textwidth=500     " use high tw setting
    else
        setlocal textwidth=72      " Otherwise use normal textwidth
    endif
endfunction

누군가 이것을 구현하려는 경우 와일드 카드를 au CursorMovedI *고정 경로 또는 파일 접미사로 바꾸는 것이 좋습니다.


4

mxmehl의 답변에 대한 더 강력한 대안.

filetype=mailVim 을 사용 하면 헤더가 강조 표시됩니다.

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

구문 정보를 사용하여 행이 헤더인지 확인하고 그에 따라 텍스트 너비를 설정할 수 있습니다.

헤더의 구문 이름은 mailHeaderKey, mailSubject, mailHeaderEmail,와 mailHeader. 나는 이것을 보면서 이것을 발견했다 /usr/share/vim/vim74/syntax/mail.vim.

이 솔루션을 선호하는 이유는 임의의 줄 번호에 의존하지 않지만 하나의 헤더와 20 개의 헤더가있는 이메일에 대해 동일하게 작동하기 때문입니다.

augroup filetypes
    autocmd!

    autocmd FileType mail call s:mail()
augroup end

" Set up ft=mail
fun! s:mail()
    augroup ft_mail
        autocmd!
        autocmd CursorMoved,CursorMovedI *
            \  if index(["mailHeaderKey", "mailSubject", "mailHeaderEmail", "mailHeader"], synIDattr(synID(line('.'), col('.'), 1), 'name')) >= 0
            \|     setlocal textwidth=500
            \| else
            \|     setlocal textwidth=72
            \| endif
    augroup end
endfun

2

autocmds를 사용하여이를 달성 할 수 있습니다. vimrc에 포함시킬 수 있지만 여기에 설명 된 것처럼 파일 형식에 포함하는 것이 좋습니다 .

그런 다음 다음을 사용할 수 있습니다.

augroup headerTw
   au!
   autocmd InsertEnter <buffer>
            \ if line('.') < 5 |
            \    setl tw=0 |
            \ endif
   autocmd InsertLeave <buffer>
            \ if line('.') < 5 |
            \    setl tw=72 |
            \ endif
augroup END

파일 유형 플러그인없이 사용하려면 <buffer>파일 패턴으로 파일 을 바꿔야합니다 .

아이디어는 'textwidth'삽입 모드 로 전환 할 때 시간 을 변경하고 종료 할 때 복원하는 것입니다.

삽입 모드에서 텍스트를 탐색하는 경우 (예 : 화살표 키 사용) @Carpetsmoke에서 언급 한 링크를 기준으로 텍스트를 탐색 할 수 있습니다.


0

나는 이것이 가능하다고 생각하지 않습니다. 그러나 몇 가지 해결 방법이 있습니다.

  1. 당신은 당신의 헤더를 작성하고 수 다음 :set tw=72 . 이후 tw, 이미 버퍼에 텍스트에 소급 적용되지 않습니다

  2. 당신과 함께 전체 일을 입력 할 수 있습니다 :set tw=0당신이 완료되면 다음 움직임은 4 행으로, :set tw=72그리고 gqG. 또는 수동으로 작업하고 싶지 않다면 매크로로 만들거나 매핑 할 수 있습니다. 예를 들어, 두 가지 모두 작동합니다.

    let @r=":set tw=72<cr>4GgqG:set tw=0<cr>"
    nnoremap <silent> <leader>r :set tw=72<cr>4GgqG:set tw=0<cr>
    

    ( "재 포맷"의 경우 "r")

    vim을 닫을 때 다시 포맷하기를 원하고 이메일에만 사용하는 파일 형식이 있다고 가정하면 vim을 닫을 때 자동으로 발생하도록 설정할 수도 있습니다. 예를 들어, 모든 이메일에 .email확장자가 있으면 다음을 수행 할 수 있습니다.

    autocommand VimLeavePre *.email set tw=72 | exe "normal! 4GgqG" | w
    

    물론 *.email실제로 사용하는 파일 확장자 로 변경 해야합니다. 당신이 뭔가를 사용하는 경우 .txt, 나는 것 없는 이 엉망 때문에,이 추천 모든 .txt 당신이 파일을.

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