0

テキストを囲む簡単な方法はありますか、私はこのプラグインについて知っています

しかし、キーが多すぎます。

私は自分のアプローチを試しました

vmap ' <D-x>i'<esc><D-v>i'
vmap " <D-x>i"<esc><D-v>i"

しかし、これは機能しません。とにかく、この方法が修正された場合、これを可能にする関数にこの動作をどのように抽出できますか?

  1. 任意のテキストを選択します(これはビジュアルモードになると思います)
  2. 「対称」サラウンド(たとえば、'、 "、`、|、/ 、、*、-)、または「非対称」サラウンド(たとえば、<>、{}、[]、 ())
  3. 選択したテキストは記号で囲まれます。
  4. 選択した単語がすでに囲まれている場合は検出して、記号を切り替えるとよいでしょう。

これを行う方法についての推奨読書はありますか?

4

3 に答える 3

6

s'そしてs"「キーが多すぎる」のですか?本当に?

サラウンドは行く方法です。

マッピング(およびCmdキーを使用するマッピング)では、それほど遠くはありません。引用符を切り替える「スマート」コマンドが必要な場合は、vimscriptをスキップすることはできません。そこから、最高のVimプラグインの1つであるSurroundを使用することをお勧めします。

とにかく、これは(迅速で徹底的にテストされていない)基礎になる可能性があります:

function! SurroundWithDoubleQuotes()
  let old_n = @n
  normal! gv
  normal! "nd
  let @n = "\"" . @n . "\""
  normal! "nP
  let @n = old_n
endfunction

@n目的の文字を入力し、レジスタの両端にその文字が存在するかどうかをテストする方法を見つける必要があります。

:h functionsあなたがそのように行きたいのなら間違いなくあなたを助けます。

マッピングを使用する方法は次のとおりです。

vnoremap " <Esc>`>a"<Esc>`<i"<Esc>

`> marks the end of the visual selection
`< marks its beginning

ただし、マッピングには注意してください。ビジュアルモードでは、オーバーロードしたくない(){}[]という意味があります。

于 2013-02-14T08:04:06.547 に答える
3

サラウンドプラグインが好きで、より短いマッピングを好む場合は、独自のプラグインを作成できます。

:vmap ' S'
:vmap " S"

(ここでは、プラグインのマッピングを適用するため:vmap、優先よりも使用する:vnoremap必要があります。または、プラグインの<Plug>マッピングに直接マッピングすることもできます:vmap ' <Plug>VSurround':)

于 2013-02-14T08:07:29.207 に答える
1

これは私がすることです:

:vmap ' s''<esc>P
于 2013-02-14T08:01:54.190 に答える