Có một số plugin Tex cho vim ( vim-latex , AutomaticLatexPlugin để nói một vài).
Sự khác biệt về các chức năng được cung cấp giữa các plugin này (những cái tôi đặt tên và có thể là các plugin khác) là gì?
Dưới đây là một vài câu hỏi liên quan về SO:
Có một số plugin Tex cho vim ( vim-latex , AutomaticLatexPlugin để nói một vài).
Sự khác biệt về các chức năng được cung cấp giữa các plugin này (những cái tôi đặt tên và có thể là các plugin khác) là gì?
Dưới đây là một vài câu hỏi liên quan về SO:
Câu trả lời:
Tôi sẽ không cung cấp một so sánh chuyên sâu, vì tôi chỉ có kinh nghiệm hạn chế với các plugin khác nhau. Tôi biết rõ một vài plugin ( LaTeX-Box và LaTeX-Suite ) và tôi biết rất rõ một plugin, vì tôi đang tự mình phát triển nó: vimtex . Vì vậy, tôi sẽ chủ yếu viết về vimtex. Tuy nhiên, trước tiên tôi sẽ chỉ ra một số tài liệu tham khảo có thể được người khác quan tâm.
Có rất nhiều plugin cho Vim. Đây là những cái mà tôi đã công nhận là ít nhất là bán phổ biến:
Trên tex.stackexchange.com , có một danh sách rất lớn các trình soạn thảo và IDE LaTeX. Nó cung cấp một cái nhìn tổng quan đẹp nói chung, nhưng nó cũng cung cấp một số tổng quan về các plugin cho Vim:
vimtex dựa trên LaTeX-Box. Nó bắt đầu sau khi tôi đã đóng góp sửa lỗi và cập nhật cho LaTeX-Box một thời gian. Tôi nhận ra rằng plugin có thể được viết theo cách hiện đại hơn nhiều nếu tôi viết nó từ đầu. Trước tiên tôi đã loại bỏ hầu hết các tính năng và xây dựng một "động cơ" mạnh mẽ và mô-đun hơn. Sau đó tôi đã thêm các tính năng và tôi nghĩ rằng ngày nay nó có hầu hết các tính năng của LaTeX-Box và sau đó là một số tính năng.
Thay vì đưa ra một danh sách đầy đủ các tính năng ( thay vào đó hãy xem ở đây ), tôi sẽ cố gắng chỉ ra một số khác biệt giữa vimtex và các plugin khác. Tuy nhiên, tôi muốn cung cấp một số tuyên bố táo bạo:
Vì vimtex dựa trên LaTeX-Box, nên rõ ràng nó có các nguyên tắc tương tự. Ý tưởng là để giữ cho mọi thứ đơn giản và để giải quyết vấn đề mà chúng chưa được giải quyết bằng các plugin khác tốt hơn. Nó sử dụng latexmk để biên dịch các tài liệu LaTeX và nó được xây dựng dựa trên plugin Vim nội bộ để làm nổi bật cú pháp.
Hiện tại có một tính năng quan trọng trong LaTeX-Box bị thiếu trong vimtex: Biên dịch bắn một lần với gọi lại . Lý do tính năng này không có trong vimtex đơn giản là vì nó phức tạp và tôi chưa bao giờ tìm được cách triển khai nó đủ đơn giản cho sở thích của riêng mình (xin đề xuất, xin đừng ngần ngại mở các vấn đề hoặc kéo yêu cầu ).
Sự khác biệt chính giữa vimtex và LaTeX-Suite có lẽ là vimtex không cố gắng thực hiện một IDE đầy đủ cho LaTeX bên trong Vim. Ví dụ:
latexmkđể biên dịch với tính năng gọi lại để nhận phản hồi tức thì về lỗi biên dịchTôi không thể so sánh, vì Vim-LaTeX là plugin LaTeX duy nhất tôi đã sử dụng. Tôi đã sử dụng Vim-LaTeX được gần một năm. Vì vậy, tôi sẽ nói về Vim-LaTeX một mình.
Có nhiều tính năng hiện diện trong Vim-LaTeX. Tôi không nhớ tất cả chúng. Tôi sẽ chỉ nói về các tính năng mà tôi biết và sử dụng liên tục.
Lưu ý: Đây là những trải nghiệm người dùng hạn chế của tôi , có thể rất sai lệch . Tôi không phải là người dùng Vim dày dạn. Và tôi không biết gì về vimscript.
<C-j>JumppingIMAP()chức năng và chức năng <C-j>jumpping được cung cấp riêng như một plugin imaps.vimtrong gói Vim-LaTeX. Chúng là các tính năng mạnh mẽ và có thể rất hữu ích ngay cả khi bạn không viết LaTeX.
IMAP()chức năng cung cấp một cách tự nhiên hơn để làm chèn ánh xạ mode và khuôn mẫu nói chung so với built-in imapvà iabbrev, IMO.
<C-j>jumpping được sử dụng bởi nhiều tính năng hoàn thành Vim-LaTeX. Một điểm jumpping được chỉ định bởi <++>.
Ánh xạ khóa chế độ chèn tích hợp được thực hiện dưới dạng IMAP()các cuộc gọi. Ví dụ: bạn có thể tìm thấy một danh sách dài các IMAP()cuộc gọi hữu ích trong main.vimtệp:
call IMAP ('__', '_{<++>}<++>', "tex")
call IMAP ('()', '(<++>)<++>', "tex")
call IMAP ('[]', '[<++>]<++>', "tex")
call IMAP ('{}', '{<++>}<++>', "tex")
...
call IMAP ('((', '\left( <++> \right)<++>', "tex")
call IMAP ('[[', '\left[ <++> \right]<++>', "tex")
call IMAP ('{{', '\left\{ <++> \right\}<++>', "tex")
...
Sau đó, khi bạn gõ nói (), con trỏ sẽ tự động nằm giữa cha mẹ, thay thế đầu tiên <++>. Sau khi bạn nhập xong, bạn đá <C-j>và đập, con trỏ sẽ di chuyển ra khỏi ngoặc đơn và bạn tiếp tục gõ về phía trước. Khi bạn đã quen với nó, nó bắt đầu hình thành một dòng gõ gây nghiện ...
Bạn nhìn thấy từ phía trên một \left \rightcặp có thể được gõ dễ dàng với hành trình kép của khung mở của nó. Và <C-j>jumpping làm cho dòng chảy.
Một trục trặc lớn IMAP()và <C-j>điều đó là chúng làm rối tung lịch sử thay đổi cuối cùng của bạn . (Một lỗi tôi muốn sửa trong một thời gian dài.) Do đó, bạn có thể gặp phải hành vi không mong muốn khi cố gắng làm lại thay đổi cuối cùng của mình .nếu "thay đổi được cho là cuối cùng" của bạn có chứa các lệnh gọi hàm này.
Bạn có thể thực hiện tất cả các loại ánh xạ bằng cách sử dụng IMAP(), từ ánh xạ khóa đơn giản đến tạo khuôn phức tạp hơn. Dưới đây là một số ví dụ về ánh xạ của tôi ( ftplugin/tex.vim):
call IMAP('*EEQ',"\\begin{equation*}\<CR><++>\<CR>\\end{equation*}<++>",'tex')
call IMAP('DEF',"\\begin{definition}[<++>]\<CR><++>\<CR>\\end{definition}<++>",'tex')
call IMAP('BIC','\binom{<++>}{<++>}<++>','tex')
call IMAP('PVERB','\PVerb{<++>}<++>','tex')
call IMAP('VERB','\verb|<++>|<++>','tex')
Một sự thật thú vị về imaps.vimplugin là nó là một plugin toàn cầu, ngụ ý việc sử dụng tiềm năng của nó ngoài LaTeX. Thật vậy, tôi sử dụng <++>và <C-j>jumppings (kết hợp với các plugin khác) để xây dựng các mẫu đoạn mã trong C.
<F5> <F7> Chèn lệnh và môi trườngMột nhược điểm của IMAP()là tổ hợp phím không thể được sử dụng trong văn bản bình thường nữa (trừ khi bạn hoàn tác ánh xạ theo u). Trong các trường hợp mà bạn chỉ muốn kích hoạt ánh xạ như bạn muốn, <F5>và <F7>sẽ có ích. Hai khóa này được sử dụng để kích hoạt môi trường và chèn lệnh nội tuyến tương ứng. Và họ hành xử khác nhau dựa trên chế độ và các tùy chỉnh từ người dùng.
Trong Chế độ chèn / Chế độ bình thường, khi con trỏ đính kèm một từ hoặc trong từ đó, nhấn <F5>theo mặc định sẽ chèn một môi trường cơ bản của biểu mẫu
\begin{word}
<Cursor>
\end{word}<++>
dựa trên từ; nhấn <F7>theo mặc định sẽ chèn một lệnh nội tuyến cơ bản của biểu mẫu \word{}<++>dựa trên từ.
"Theo mặc định", ý tôi là bạn có thể tùy chỉnh hành vi của một từ cụ thể khi được kích hoạt bởi <F5>/ <F7>. Đây là một số cài đặt của tôi ( .vimrc):
let g:Tex_Com_newcommand = "\\newcommand{<++>}[<++>]{<++>}<++>"
let g:Tex_Com_latex = "{\\LaTeX}<++>"
let g:Tex_Com_D = "\\D{<++>}{<++>}<++>"
Trong Insert / Normal Mode, khi con trỏ được không gắn liền với bất cứ điều gì (hay còn gọi là một mình ), nhấn <F5>/ <F7>sẽ nhắc cho bạn một thực đơn để chọn môi trường / lệnh để chèn. Hoặc bạn có thể gõ tên của môi trường / lệnh mong muốn ở phía dưới. Cá nhân, tôi hiếm khi sử dụng <F5>/ <F7>cách này.
Nhấn <F5>/ <F7>sau khi chọn trực quan một đoạn văn bản sẽ nhắc một menu để gói văn bản . Sau đó, văn bản được chọn sẽ được bọc trong môi trường / lệnh bạn đã chọn hoặc gõ.
Trong Chế độ chèn / chế độ bình thường, khi con trỏ ở trong phạm vi của một môi trường / lệnh, nhấn <Shift>+<F5>/<F7>sẽ nhắc một menu để thay đổi môi trường / lệnh .
`ađến `zvà thủ đô tương ứng.`8cho \infty, `<cho \le, `Icho \int_{<++>}^{<++>}<++>, v.v."hai lần sẽ nhận được một cặp dấu ngoặc kép TeX. Vì vậy, để gõ ký "tự chữ , bạn phải sử dụng.\itemthẻ thích hợp .\left \rightcặp bằng `(, `[và `{.Tex_FoldedSections, Tex_FoldedMisc, và Tex_FoldedEnvironments.Đôi khi các ánh xạ tích hợp đã đi quá xa hoặc không thoát khỏi những gì bạn muốn. Bạn có thể ghi đè lên ánh xạ tích hợp bằng cách xác định lại chúng trong after/ftplugin/tex.vim:
call IMAP('`|','\abs{<++>}<++>','tex')
call IMAP('ETE',"\\begin{table}\<CR>\\centering\<CR>\\caption{<+Caption text+>}\<CR>\\label{tab:<+label+>}\<CR>\\begin{tabular}{<+dimensions+>}\<CR><++>\<CR>\\end{tabular}\<CR>\\end{table}<++>",'tex')
call IMAP('==','==','tex')
call IMAP('`\','`\','tex')
Tôi luôn cần phải chuyển đổi giữa pdflatexvà xelatexđộng cơ. Vì vậy, tôi có các dòng sau trong .vimrc:
"switch to pdflatex
function SetpdfLaTeX()
let g:Tex_CompileRule_pdf = 'pdflatex --interaction=nonstopmode -synctex=1 -src-specials $*'
endfunction
noremap <Leader>lp :<C-U>call SetpdfLaTeX()<CR>
"switch to xelatex
function SetXeLaTeX()
let g:Tex_CompileRule_pdf = 'xelatex --interaction=nonstopmode -synctex=1 -src-specials $*'
endfunction
noremap <Leader>lx :<C-U>call SetXeLaTeX()<CR>
Đây là một chủ đề lộn xộn và phức tạp. Với một số người xem PDF nhất định và một số may mắn nhất định , nó có thể rất dễ dàng. Nhưng đó chủ yếu là vấn đề tìm kiếm google.
Nhìn chung, tôi nghĩ rằng nó sẽ hoạt động tốt nếu bạn sẵn sàng đầu tư một chút thời gian để chế ngự con thú. Điều đó đã được nói, nếu tôi có thời gian và kiến thức đầy đủ, tôi chắc chắn sẽ giảm bớt các tính năng trên cao và khám phá tiềm năng tích hợp với các plugin khác.
vimtexcó thể làm việc song song với nhauLatex-Suite, điều đó có nghĩa là bạn có thể tận dụng tốt nhất hai plugin cùng một lúc . :)