7

LaTeXで特定の環境を編集する関数を書いています。

環境は基本的に次のようになります。

\begin{quicktikz}
    ...some stuff...
\end{quicktikz}

またはこのように:

\begin*{quicktikz}
    ...some stuff...
\end{quicktikz}

環境内から呼び出されたときに、2 つを切り替える関数を書きたいと思います。私の Vim の知識はそれだけではないので、簡単な解決策を考えています。

  1. でカーソル位置を取得しますlet save_cursor=getpos(".")
  2. 使用する後方検索\begin{quicktikz}: ?\\begin{quicktikz}\|\\begin\*{quicktikz}
  3. を検索し、{次を使用して左に移動しますnormal 0f{h
  4. カーソル下の項目が等しいかどうかを確認します*
    • もしそうなら、そうしてくださいnormal x
    • そうでない場合は、実行しますnormal a*<esc>
  5. を使用してカーソル位置を復元します call setpos('.',save_cursor)

手順 3 を除いて、これをすべて行う方法を知っています。カーソルの下の文字が等しいかどうかを確認するにはどうすればよい *ですか?

これを行うためのより良い方法を知っている場合は、これを共有してください。

4

2 に答える 2

9

カーソル下の文字を取得する最も簡単な方法は次のとおりだと思います。

getline(".")[col(".")-1]

あるいは、あなたはそれを行うことができますstrpart()

strpart(getline("."), col(".")-1, 1)

最初の式は、最初に関数を引数として呼び出しgetline()ます"."。これは、カーソルが置かれている行が返されることを意味します。次に、いわゆるexpr8またはexpr-[] (ヘルプを参照) を使用して、単一の文字を取得します。col() 渡された数値は、現在のカーソル列を返す別の関数から取得されます。インデックスは 0 から始まるため、1 が減算されます。

次のように使用できます

if getline(".")[col(".")-1] == '*'
        ...
于 2011-09-26T20:35:49.677 に答える
3

あなたが説明した手法の代替実装を提案させてください。

:?\\begin\>\zs\*\=?s//\='*'[submatch(0)!='']/|norm!``

上記のコマンドは、2 つの別個のコマンドが 1 行に|( を参照 :help :bar) で連結されたものです。:help :s最初のものは、指定された範囲内の各行に対して実行される置換 (を参照) です。

?\\begin\>\zs\*\=?

範囲構文 ( を参照:help :range) に従って、この範囲は唯一の行を指定します。これは、前にバックスラッシュがあり、その後にオプションのスター文字が続く\\begin\>\zs\*\=単語にパターンが一致する前の行です。1パターン マッチングの部分と の間のアトムは、 そこに一致の開始を設定します。そのため、パターン全体の一致は空であるか、単一の星文字を含んでいます。これは、範囲内の行を指定するために必要ではありません。コマンドの後半で同じパターンを再利用する場合に役立ちます。この場合、星印またはその空の場所のみを置き換える必要があります。パターンの構文の詳細については、、、を参照してください。begin\zs\begin*:substitute:help /\>:help /\=:help /\zs

代用自体、

s//\='*'[submatch(0)!='']/

'*'[submatch(0)!='']最後の検索パターン (範囲内の後方検索によって設定される) の最初の出現を、式が評価される文字列に置き換えます ( を参照:help sub-replace-\=)。パターンは空の文字列またはスター文字のみに一致するため、部分式 submatch(0)!=''は の後にスターがない場合は 0 に評価され、それ以外の\begin場合は 1 に評価されます。文字列のゼロ添え字'*'は、その 1 文字の文字列の最初の文字を含む部分文字列になります。インデックス 1 は文字列の長さに等しいため、添え字は空の文字列になります。したがって、 の後\beginにアスタリスクがある場合は空の文字列に置き換えられ、アスタリスクが存在しない場合は直後のゼロ幅区間 \beginが に置き換えられ*ます。

2番目のコマンド、

:norm!``

:substitute実際に置換を開始する前に、コマンドが現在のカーソル位置を保存するという事実を利用します。``移動コマンドは、カーソルの位置を復元する最後のジャンプ (前述の置換コマンドで発生) の前の位置にジャンプします。2


1wrapscan検索には注意してください。オプションが有効になっている場合 (デフォルトでオンになっています) 、範囲内では、通常どおり、ファイルの末尾をラップします。

2最後のジャンプの前の位置の行の最初の非ブランク文字にカーソルを移動するコマンドと混同``し ないでください。''

于 2011-09-27T11:19:46.260 に答える