Làm cách nào tôi có thể coi các trích dẫn LaTeX như một đối tượng văn bản?


29

Dấu ngoặc kép trong LaTeX khác với văn bản thông thường, ở chỗ chúng được định dạng ``like this''(hoặc `like this'cho dấu ngoặc đơn). Điều này gây khó khăn cho việc điều hướng qua chúng trong Vim.

Tôi thường sử dụng một cái gì đó như T`ct'(ngược cho đến khi `, thay đổi cho đến khi '). Tuy nhiên, điều này là vụng về và không tự nhiên. Tôi muốn để có thể sử dụng một cái gì đó dọc theo dòng ciq( "thay đổi trong dấu ngoặc kép"), giống như tôi có thể làm ciw, ca), ci", ca'vv

Có cách nào để bảo Vim coi ``LaTeX'' `quotes'là đối tượng văn bản không? (Ngoài ra, có cách nào để chỉ kích hoạt tính năng này trong khi chỉnh sửa .textệp không?)

Câu trả lời:


10

Tôi không biết LaTeX nhưng điều này dường như hoạt động:

vnoremap iq :<C-U>silent! normal! t'vT`<CR>
omap iq :normal viq<CR>

Tôi dựa trên thông tin này ở đây: http://vim.wikia.com/wiki/Creating_new bản_objects

Bạn cũng có thể thêm hỗ trợ aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>

Điều này làm việc cho iq, nhưng dường như không hoạt động với, ví dụ , daq.
Doorknob

Đúng. Bạn có thể làm cho nó hoạt động aqtốt với một ánh xạ tương tự bổ sung. Tôi chỉnh sửa câu trả lời. Tôi cũng đã trao đổi T` với t 'trong ánh xạ để nó tìm kiếm về phía trước, điều này có vẻ tự nhiên hơn đối với tôi.
superjer

Này làm việc cho dấu nháy đơn, nhưng daqtrên ``foo''chỉ kết quả trong `foo'.
Doorknob 16/2/2015

Tôi không nghĩ rằng phương pháp này có thể làm việc nhiều hơn các trích dẫn đơn lẻ. Bạn sẽ cần phải làm kiểm tra sâu hơn của văn bản hơn ftkhai thác cho phép, mà sẽ yêu cầu viết một chức năng toàn bộ với các biến và tất cả mọi thứ. Tôi không có thời gian để làm như vậy ngay bây giờ.
superjer

7

Chỉnh sửa : Tôi vừa phát hiện ra plugin vim-textobject-latex , bổ sung chức năng chính xác mà bạn đang tìm kiếm (ngoài một vài thứ khác). Từ README của plugin:

Các đối tượng văn bản hiện được hỗ trợ là:

a   i   Description
a\\ i\\ Inline math surrounded by ``\\(`` and ``\\)``.
a$  i$  Inline math surrounded by dollar signs.
aq  iq  Single-quoted text ``\`like this'``.
aQ  iQ  Double-quoted text ``\``like this''``.
ae  ie  Environment ``\begin{...}–\end{...}``

Vì vậy, bạn có thể sử dụng caqvà như bạn muốn. Tôi đã thử nghiệm nó và nó hoạt động như quảng cáo, nhưng lưu ý rằng nó phụ thuộc vào plugin vim-textobject-user . Cũng lưu ý rằng bạn phải đảm bảo rằng textobject-userplugin tải trước , nếu không mọi thứ sẽ không hoạt động.


Tuy nhiên, nếu bạn không muốn gây rối với các plugin, câu trả lời ban đầu của tôi vẫn hữu ích:

Thêm hai dòng này vào .vimrcsẽ bao gồm hầu hết những gì bạn muốn.

onoremap aq :<c-u>normal! F`vf'<cr>
onoremap iq :<c-u>normal! T`vt'<cr>

Chúng tạo các đối tượng văn bản mới ( aqiq) quay trở lại trước đó `, vào chế độ lựa chọn trực quan, sau đó chọn tiếp theo '.

Điều này sẽ làm việc cho ciq, caq, yiq, và diq. Tuy nhiên, yaqdaqsẽ không yank / xóa các trích dẫn bên ngoài, vì vậy tôi đã tạo một đối tượng văn bản khác a", để xử lý điều đó ( i"không cần thiết, nhưng tôi đã thêm để giữ mọi thứ nhất quán:

onoremap a" :<c-u>normal! 2F`v2f'<cr>
onoremap i" :<c-u>normal! 2T`v2t'<cr>

Nhược điểm chính ở đây là điều này sẽ phá vỡ bình thường ca", vv sử dụng. Nếu bạn mở đầu chúng au FileType tex, bạn sẽ chỉ gặp vấn đề đó trong .texcác tệp, nhưng đôi khi nó vẫn có thể gây phiền toái. Bạn cũng có thể đặt tên cho đối tượng giống như ad/ id('d' cho 'double' quote), nhưng điều đó có vẻ ít trực quan hơn đối với tôi (tôi đang hướng đến sự khác biệt ít nhất so với hoạt động bình thường).

Cách duy nhất tôi có thể nghĩ đến để bọc chúng thành hai đối tượng văn bản là viết một hàm kiểm tra một trích dẫn khác bên ngoài tập đầu tiên và đặt các aqđối tượng văn bản để gọi nó.

Lưu ý : Có một vài vấn đề nhỏ khác với:

  1. Yanking có thể để con trỏ của bạn ở một nơi không mong muốn (điều này có thể được khắc phục bằng cách thêm bằng cách sử dụng một dấu trong các lệnh (ví dụ ma2F`v2f'<cr>`a), chỉ cần đảm bảo không sử dụng một con trỏ bạn thường sử dụng thủ công)
  2. Con trỏ phải nằm trong dấu ngoặc kép; những điều kỳ lạ xảy ra nếu nó là trên dấu ngoặc kép.

Để kết thúc tất cả những điều đó, đây là những gì cá nhân tôi sẽ thêm vào .vimrcvấn đề này:

augroup filetype_latex
    au!
    au FileType tex,plaintex onoremap a' :<c-u>normal! muF`vf'<cr>`u
    au FileType tex,plaintex onoremap i' :<c-u>normal! muT`vt'<cr>`u
    au FileType tex,plaintex onoremap a" :<c-u>normal! mu2F`v2f'<cr>`u
    au FileType tex,plaintex onoremap i" :<c-u>normal! mu2T`v2t'<cr>`u
end augroup

Như bạn có thể thấy, tôi đã chọn phá vỡ chức năng bình thường ca'/ ya"/ etc vì vậy tôi sẽ không phải học các lệnh mới cho chúng vì tôi sẽ không sử dụng chức năng bình thường nhiều như vậy trong LaTeX. Đó chỉ là một sở thích cá nhân; không khó để chuyển đổi tên đối tượng. Tôi cũng đã thêm vào phát hiện filetype và đánh dấu.


2

Đây là một câu hỏi cũ nhưng vì lợi ích của khách truy cập trong tương lai: Tôi thấy việc thay đổi báo giá latex dễ dàng hơn với:

\usepackage{csquotes} % change " " into nice double quotes  
\MakeOuterQuote{"}

Và sau đó This thing is "Foobar"!sẽ hoạt động tốt trong vim và latex.


0

Cắm vào vim-sandwich

Một plugin hữu ích khác cho điều này là vim-sandwichđã xác định môi trường xung quanh cụ thể ft

  • l`hoặc l'cho `text',
  • l"cho ``text''
  • textobjects để dễ dàng hoạt động trên chúng.

Với ánh xạ mặc định sau công việc

  • textobject: thay thế văn bản bên trong `text'bằng cisl'hoặc nếu tự động phát hiện xung quanh gần nhất là ổn cib(ví dụ: con trỏ bật htrong `a (phony) text'yêu cầu nhấn vibibc). Tuy nhiên, bạn có thể xác định sau văn bản bổ sung iq(ví dụ OP) omap <unique> iq <Plug>(textobj-sandwich-query-i)l' xmap <unique> iq <Plug>(textobj-sandwich-query-i)l' omap <unique> aq <Plug>(textobj-sandwich-query-a)l' xmap <unique> aq <Plug>(textobj-sandwich-query-a)l' omap <unique> iQ <Plug>(textobj-sandwich-query-i)l" xmap <unique> iQ <Plug>(textobj-sandwich-query-i)l" omap <unique> aQ <Plug>(textobj-sandwich-query-a)l" xmap <unique> aQ <Plug>(textobj-sandwich-query-a)l" Bây giờ chỉ cần nhấn ciqhoặc ciQhoạt động.
  • thêm vào textvới các saiwl'dấu nháy đơn để có được `text'
    Mẫu của lệnh sa{motion/textobject}{surrounding}và có nghĩa là gọi toán tử add surroundingtrên inner wordvà kiểu bao quanh là latex single quote.
  • xóa bằng sdl'hoặc vớisdb
  • thay đổi với srl'l"hoặc vớisrbl"

Nó hỗ trợ

  • lặp lại.vim bởi Tim Pope hoặc Kana
  • visualrepeat.vim bởi Ingo Karkat (không được hỗ trợ bởi vim-Surround bởi Tim Pope).
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.