tự động viết lại các dòng khi viết markdown trong VIM


10

Rất thường xuyên, tôi viết markdown trong VIM, và sẽ có những đoạn trong markdown đó. Để giúp chỉnh sửa, tôi thiết lập Vim của mình để bọc một dòng trên 80 ký tự. Nó hoạt động tốt nếu tôi cứ gõ, nhưng vấn đề là nếu tôi cần chỉnh sửa, nó sẽ trở nên rất khó chịu.

bản demo (lấy từ logic thứ tự đầu tiên của wikipedia):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

Càng xa càng tốt. Nhưng khi tôi sửa lại bài viết, tôi có thể quyết định thêm một cái gì đó vào giữa, nói:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

dòng thông báo 3 là cái tôi muốn bọc. Nếu tôi làm điều đó trong VIM, tôi sẽ cần phải tự nối các dòng và viết lại toàn bộ đoạn văn.

Bất cứ ai cũng có ý tưởng làm thế nào để làm cho VIM làm điều đó tự động?

Câu trả lời:


6

Thậm chí đơn giản hơn: acờ cho 'formatoptions'phép tự động định dạng đoạn văn bất cứ khi nào văn bản được chèn hoặc xóa. Xem :help fo-tableđể biết chi tiết về 'formatoptions'cờ và :help autoformat.

:set formatoptions+=a

gqgwsẽ định dạng các dòng mà chuyển động sau di chuyển qua.

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

Sự khác biệt giữa hai, là gqsẽ để con trỏ ở chỗ không trống đầu tiên của dòng được định dạng cuối cùng. gwsẽ đưa con trỏ trở lại nơi nó bắt đầu.

Bạn có thể dễ dàng viết lại đoạn văn bản mà con trỏ của bạn hiện đang ở cùng gwaphoặc toàn bộ tài liệu với gggwG, mặc dù điều đó sẽ di chuyển con trỏ của bạn nhờ vào đầu gg.

Với chế độ tự động, bạn có thể tự động định dạng. Đây là một ví dụ định dạng đoạn hiện tại khi rời chế độ chèn:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

Có các trình kích hoạt tự động khác mà bạn có thể thấy công việc tốt hơn cho mình. Bạn có thể khám phá các tùy chọn dưới :help autocmd-events. Những cái có liên quan nhất có lẽ nằm dưới phân nhóm "khác nhau".


một từ: rực rỡ!
Jason Hu

1

Tôi sẽ có một cái nhìn tại :help 'textwidth'. Nó sẽ tự động ngắt dòng khi bạn gõ. Tuy nhiên, điều này không hoạt động nếu bạn đang chỉnh sửa giữa dòng.

Cá nhân tôi thích bỏ textwidthđi vì vậy tôi đã tạo một chức năng sẽ tự động tham gia và chia một đoạn. (Về cơ bản tự động định dạng nó thành 80 ký tự) Nó trông như thế này:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

Sau đó tôi có một ánh xạ để gọi nó bất cứ khi nào tôi cần:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

Hàm này hoạt động rất tốt với formatoptions+=jrđịnh dạng bình luận trong mã quá! Chỉ cần đặt con trỏ của bạn trên dòng đầu tiên dài hơn 80 ký tự và gọi hàm.

(Lưu ý: Tôi chưa thực hiện chức năng này chung để thực hiện các độ dài khác ngoài 80, nhưng tôi nghĩ bạn chỉ cần thay đổi 80 và 81 nếu bạn muốn làm cho nó một cái gì đó khác)

Xem :help 'textwidth':help 'formatoptions'để biết thêm.


Cám ơn vì những chia sẻ của bạn. Khi tôi kiểm tra thiết lập của bạn, nó không tự động định dạng khi tôi nhập, đúng không? Nếu vậy, thì nó vẫn là một giải pháp tối ưu, phải không?
Jason Hu

textwidthsẽ tự động định dạng khi bạn nhập. Chức năng của tôi sẽ không. Tôi thích kiểm soát khi vim kết thúc mọi thứ, vì vậy nó hoạt động với tôi. Nhưng nếu bạn đặc biệt tìm kiếm một trình định dạng theo kiểu bạn, có; nó không phù hợp với quy trình làm việc của bạn
Tumbler41

1

Để hoàn thiện, tôi muốn đề cập đến tùy chọn dựa trên plugin.

Nếu bạn sử dụng một cái gì đó như ALE hỗ trợ chạy bộ đệm của bạn thông qua trình làm đẹp khi lưu, bạn có thể để Prettier xử lý lại mã của bạn.

Tôi đã hoàn thành điều đó bằng cách đưa nó vào ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... và đặt cái này vào ~/.vimrc:

let g:ale_fix_on_save = 1
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.