LaTeXの引用符をテキストオブジェクトとしてどのように扱うことができますか?


29

LaTeXの引用符は、フォーマット``like this''(または`like this'単一引用符)されているという点で通常のテキストとは異なります。これにより、Vimでそれらをナビゲートすることが難しくなります。

私は通常、T`ct'(backwards until `、change until ')のようなものを使用します。しかし、これは不格好で不自然です。私はの線に沿って何かを使用することができることを好むciq私にできることと同じように、(「引用符の変化」) 、ciwca)ci"ca'など

Vimに``LaTeX'' `quotes'テキストオブジェクトとして扱うように指示する方法はありますか?(プラスとして、.texファイルの編集中にのみこれをトリガーする方法はありますか?)

回答:


10

私はLaTeXを知りませんが、これはうまくいくようです:

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

私はこれを以下の情報に基づいています:http : //vim.wikia.com/wiki/Creating_new_text_objects

以下のサポートも追加できaqます。

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

これはで機能しますがiq、たとえばでは機能しないようですdaq
ドアノブ

右。aq追加の同様のマッピングを使用して、同様に機能させることができます。答えを編集しました。また、マッピングでT`とt 'を入れ替えて、最初に前方に検索するようにしました。
superjer

これは、単一引用符のために動作しますが、daq``foo''で結果だけ`foo'
ドアノブ

この方法は一重引用符以上で機能するとは思わない。fand t演算子が許可するよりも、テキストの詳細な検査を行う必要があります。これには、変数とすべてを使用して関数全体を記述する必要があります。今はそうする時間がありません。
スーパージャー

7

編集:私はvim-textobject-latexプラグインを発見しました。これはあなたが探している正確な機能を(他のいくつかのものに加えて)追加します。プラグインのREADMEから:

現在サポートされているテキストオブジェクトは次のとおりです。

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{...}``

だからあなたがcaq望むように使用することができます。私はそれをテストし、宣伝どおりに動作しますが、vim-textobject-userプラグインに依存していることに注意してください。またtextobject-userプラグインが最初ロードされることを確認する必要があることに注意してください。そうしないと、動作しません。


ただし、プラグインをいじりたくない場合は、元の答えが引き続き有用です。

これらの2行を追加すると、必要なもののほとんど.vimrcがカバーされます。

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

これらは、前に戻ってビジュアル選択モードに入り、次まで選択する新しいテキストオブジェクト(aqおよびiq)を作成します。`'

これがために働くだろうciqcaqyiq、とdiq。しかし、yaqおよびdaqヤンク/外側の引用符を削除しません、私は別のテキストオブジェクトを作成したので、a"(それを処理するためにi"必要とされていないが、私は一貫性のあるものを維持するために追加しました:

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

ここでの主な欠点は、これにより通常のca"使用などが中断されることです。を先頭au FileType texに付けると、.texファイルにその問題があるだけになりますが、それでも面倒な場合があります。また、オブジェクトにad/ id(「二重」引用符の「d」)のような名前を付けることもできますが、それは私には直観的ではないように見えました(通常の操作との最小の差を目指していました)。

これらを2つのテキストオブジェクトにまとめる唯一の方法は、最初のセット以外の別の引用符をチェックする関数を記述し、それaqを呼び出すようにテキストオブジェクトを設定することです。

:これらには、いくつかのマイナーな問題があります。

  1. ヤンクするとカーソルが予期しない場所に残る場合があります(コマンドにマークを追加することで修正できます(例ma2F`v2f'<cr>`a)。頻繁に手動で使用するものを使用しないようにしてください)。
  2. カーソルは引用符の中になければなりません。引用符の上にある場合、奇妙なことが起こります。

それをすべてまとめると、.vimrcこの問題のために私が個人的に追加するのはこれです:

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

ご覧のとおり、通常のca'/ ya"/ etc機能を無効にすることを選択しました。とにかくLaTeX内では通常の機能をあまり使用しないので、それらの新しいコマンドを学ぶ必要はありません。それは個人的な好みです。オブジェクト名を切り替えるのは難しくありません。ファイルタイプの検出とマークにも追加しました。


2

これは古い質問ですが、将来の訪問者のために:ラテックスの引用を次のように変更する方が簡単だと思います:

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

そしてThis thing is "Foobar"!、vimとlatexで問題なく動作します。


0

プラグイン vim-sandwich

これに役立つもう1つのプラグインは、vim-sandwichft固有の環境を定義したものです

  • l`またはl'のために`text'
  • l"とのため``text''
  • テキストオブジェクトを簡単に操作できます。

作業後のデフォルトのマッピングで

  • textobject:の内部テキストを置換`text'するcisl'か、最も近い周囲の自動検出で問題ない場合cib(たとえば、hinのカーソル`a (phony) text'はを押す必要がありますvibibc)。ただし、次の追加のtextobject iq(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" これは、単にciqまたはを押すだけciQです。
  • 単一のアポストロフィで追加textsaiwl'取得します`text'
    コマンドのパターンはであり、sa{motion/textobject}{surrounding}演算子add surroundingを起動しinner word、サラウンドタイプはlatex single quoteです。
  • 削除sdl'たりしてsdb
  • 変更srl'l"たりとsrbl"

サポートします

  • Tim PopeまたはKanaによるrepeat.vim
  • visualrepeat.vimインゴKarkat(ティム・ポープのvim-サラウンドでサポートされていない)によります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.