Cài đặt độ rộng văn bản cụ thể của số dòng


9

Tôi sử dụng gvim để viết email và sử dụng tw=72để ngắt dòng dài. Bây giờ tôi cũng chỉnh sửa các tiêu đề thư cơ bản trong cùng một tài liệu, ví dụ: tôi đang thêm người nhận vào thư của mình. Bây giờ với tw=72nó cũng phá vỡ mỗi lần sau 72 ký tự.

Làm cách nào tôi có thể đặt tw=0trên 4 dòng đầu tiên (đó là phần tiêu đề) và tw=72cho phần còn lại của tài liệu?

Định dạng của tôi trông như thế này, nếu điều đó có liên quan:

set fo+=tcqn

textwidthđược áp dụng cho toàn bộ bộ đệm.
romainl

3
Xem thêm: Ngăn Vim phá vỡ liên kết giữa thẻ trong markdown . Bạn có thể sử dụng một giải pháp tương tự cho email, hoặc bằng cách kiểm tra nếu line('.') < 5, hoặc bằng cách kiểm tra nếu dòng bắt đầu với một tiêu đề email (ví dụ From: , To: vv).
Martin Tournoij

@Carpetsmoker Cảm ơn rất nhiều, đây là chìa khóa cho giải pháp. Tôi đã thêm câu trả lời đầy đủ của tôi với các sửa đổi cần thiết.
mxmehl

Câu trả lời:


6

Nhờ bình luận của @ Carpetsmoker về câu hỏi của tôi, tôi đã có thể giải quyết điều này chính xác như tôi muốn nó có.

Với hàm sau trong .vimrc (hoặc trong trường hợp của tôi trong một tệp đặc biệt chỉ được tải khi chỉnh sửa email của tôi), tw được đặt thành 500 nếu số dòng nhỏ hơn 5, nếu không thì 72. Với au CursorMovedIđiều này được kiểm tra mỗi lần con trỏ di chuyển.

" 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

Nếu ai đó có kế hoạch thực hiện điều này, hãy xem xét thay thế ký tự đại diện au CursorMovedI *bằng một đường dẫn cố định hoặc hậu tố tệp.


4

Một thay thế mạnh mẽ hơn cho câu trả lời của mxmehl.

Nếu bạn sử dụng filetype=mailVim sẽ đánh dấu các tiêu đề cho bạn:

nhập mô tả hình ảnh ở đây

Chúng ta có thể sử dụng thông tin cú pháp để xác định xem một dòng có phải là tiêu đề hay không và đặt băng thông phù hợp.

Tên cú pháp các tiêu đề là mailHeaderKey, mailSubject, mailHeaderEmail, và mailHeader. Tôi tìm thấy điều này bằng cách nhìn vào /usr/share/vim/vim74/syntax/mail.vim.

Lý do tôi thích giải pháp này là vì nó không phụ thuộc vào số dòng tùy ý, nhưng nó hoạt động chính xác như nhau đối với các email có một tiêu đề và hai mươi tiêu đề.

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

Bạn có thể đạt được điều này bằng cách sử dụng autocmds. Bạn có thể đưa chúng vào vimrc của bạn, nhưng thường tốt hơn là đưa chúng vào một filetype, như được giải thích ở đây .

Sau đó, bạn có thể sử dụng như sau:

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

Nếu bạn thích sử dụng nó mà không có plugin filetype, bạn sẽ cần thay thế <buffer>bằng một mẫu tệp.

Ý tưởng là thay đổi 'textwidth'khi bạn vào chế độ chèn và khôi phục nó khi bạn rời khỏi nó.

Nếu bạn thường điều hướng trong văn bản trong khi ở chế độ chèn (ví dụ: sử dụng các phím mũi tên), bạn có thể cải thiện nó dựa trên liên kết được đề cập bởi @Carpetsmoke: Ngăn Vim phá vỡ liên kết giữa thẻ trong đánh dấu.


0

Tôi không tin điều này là có thể. Tuy nhiên, có một vài cách giải quyết.

  1. Bạn có thể viết tiêu đề của bạn và sau đó :set tw=72 . Vì twkhông áp dụng hồi tố cho văn bản đã có trong bộ đệm của bạn

  2. Bạn có thể nhập toàn bộ nội dung :set tw=0và sau đó khi bạn hoàn thành, hãy chuyển đến dòng 4 :set tw=72, và gqG. Hoặc, nếu bạn không muốn làm điều đó bằng tay, bạn có thể macro nó hoặc ánh xạ nó. Ví dụ, cả hai đều hoạt động:

    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" cho "định dạng lại")

    Bạn thậm chí có thể thiết lập điều này xảy ra tự động khi bạn đóng vim, giả sử rằng bạn muốn định dạng lại khi bạn đóng vim và có một kiểu tệp mà bạn sử dụng chỉ cho email. Ví dụ: nếu tất cả các email của bạn có .emailphần mở rộng, bạn có thể làm:

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

    Tất nhiên, bạn phải thay đổi *.emailthành bất kỳ phần mở rộng tập tin nào bạn thực sự sử dụng. Nếu bạn sử dụng một cái gì đó như .txt, tôi sẽ không khuyến nghị điều này, vì nó sẽ gây rối với mọi .txt tệp bạn có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.