単語の引用/引用解除に使用できるVimコマンドは何ですか?


204

どうすればVimで単語をすばやく引用/引用解除し、引用(たとえば、'から")を変更できますか?Surround.vimプラグインについては知ってますが、Vimのみを使用したいと思います。


解決策は実際にはコンテキストに依存します。1行だけで実行しますか、それともファイル全体で実行しますか、それとも単一引用符付きの文字列に対して実行しますか?
ルーカスオマーン

行の1つの単語またはすべての単語。たとえば、貼り付けた単語を文字列リテラルに変換する場合です。
ユージーンヤーマシュ

回答:


251

Surround.vimが最も簡単な答えになります。あなたが本当にそれを使用することに反対しているなら、ここにあなたができることのいくつかの例があります。必ずしも最も効率的ではありませんが、sound.vimが作成されたのはそのためです。

  • 一重引用符を使用して単語を引用する
    ciw'Ctrl+r"'
    • ciw -カーソルが置かれている単語を削除し、挿入モードになります。
    • ' -最初の引用を追加します。
    • Ctrl+r"- "レジスターの内容、最後のヤンク/削除を挿入します。
    • ' -最後の引用を追加します。

  • 一重引用符で囲まれた単語の引用符を外します
    di'hPl2x
    • di' -一重引用符で囲まれた単語を削除します。
    • hP -カーソルを左に1箇所(最初の引用の上に)移動し、削除したばかりのテキストを引用の前に置きます。
    • l -カーソルを1か所右(開始引用符の上)に移動します。
    • 2x -2つの引用符を削除します。

  • 一重引用符を二重引用符に変更する
    va':s/\%V'\%V/"/g
    • va' -引用された単語と引用符を視覚的に選択します。
    • :s/ -交換を開始します。
    • \%V'\%V -視覚的に選択された領域内にある単一引用符のみに一致します。
    • /"/g -それらをすべて二重引用符で置き換えます。

1
これらは私にとってはうまくいきます。挿入モードでの貼り付けはCtrl + opでも可能であるとググっただけです。
Eugene Yarmash

1
記録モード(q)と組み合わせて使用​​すると、クイックジョブの魅力のように機能します。
ビショップ

なぜciwだけではなくcw?1つ目は混乱し、2つ目はうまくいきます。
Big McLargeHuge 2015

18
@Koveras ciwは、カーソルが単語のどこにあっても機能します。 cwカーソルが単語の先頭にある場合にのみ機能します。を参照してください:help iw
jamessan 2015

10
上部の回答をハイジャックして素敵な小さなトリックを提供します。二重引用符で囲む単一引用符を置き換える単語が複数ある場合、@ jamessanの最初のソリューションが.コマンドで機能しないことに気付くでしょう。これを機能させるには、を使用しますciw' Ctrl+r Ctrl+p"。次に.、次の単語に対してあなたが望むように動作します:レジスターの内容を覚えるのではなく、レジスターの内容を今すぐ覚えておきます(説明するのは難しいのですが、両方を試すと、それが明らかになります) :
autra 2015年

182

一重引用符を使用して単語を引用する

ciw'Ctrl+r"'

こうする方が簡単だった

ciw '' Esc P

8
残念ながら、これはを許可していないようです。(繰り返す)。
Wil Moore III

2
Ctrl + rは通常、逆履歴検索に既に使用されているので、vimモードの端末/ replsで使用できるため、これを好みます。
krock 2015

3
@wilmoore上記をマクロとして記録し、再生します。
クリストファー

30

これが役立つマッピングの一部です:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

mapleader変数を変更していない場合は、\q" \q'またはでマッピングをアクティブにし\qdます。カーソルの下の単語を二重引用符で囲み、カーソルの下の単語を単一引用符で囲み、カーソルの下の単語を囲む引用符をそれぞれ削除します。


素晴らしいアイデア!ファイルに追加map <Leader>' gewi'<Esc>A'<Esc>して.vimrc、現在の位置から行の終わりまで一重引用符のコメントを挿入しました。一部のMSDOSスクリプトをbashに変換する際に役立ちました。
ILMostro_7 2014年

@Geoff、一重引用符で問題なく動作します。二重引用符の場合は、単語の前に `" "" "`を
挿入

@RameshVelマッピングの右側に影響を与える独自のマクロがあった可能性があります。他のマッピングが展開されないように、マッピングコマンドをnnoremapに更新しました。マッピングも改善しました。以前のものは、カーソルが行の最初の単語にあるときに問題がありました。
Geoff Reedy 2014

これは、選択を引用符で囲むビジュアルモードにも簡単に適応できます:vnoremap <leader>q c""<esc>P
ドミニク

27

他のコマンドに加えて、これはすべての単語を(コメントに従って)二重引用符で囲みます。

:s/\(\S\+\)/"\1"/

またはバックスラッシュの数を減らしたい場合\vは、パターンの先頭に(非常に魔法の)修飾子を付けることができます

:s/\v(\S+)/"\1"/

コピーしたテキストにもにカンマが含まれていたため、これに変更しました:s/\v([a-Z]+)/"\1"/g
tsukimi '20 / 07/20

22

マクロの方法!

  1. qおよびqを押して、qレジスタに記録します(「q」は、「引用符」を覚えるためのショートカットとして使用します)。

  2. shift+を押してbカーソルを現在の単語の前に移動

  3. プレスiタイプ'(一重引用符)

  4. 押してescから押しeて単語の終わりに移動

  5. を押してaから'もう一度押して、単語を引用符で囲みます。

  6. を押すescと通常モードになります。

  7. 最後にを押しqて、qレジスタに記録します。

使い方

  1. 目的の単語にカーソルを移動します。
  2. 押す @qて単語を引用符で囲みます。
  3. @@別の単語に繰り返す場合は、を押します。

あなたは変えることができます step 4{行、ある文字が見つかるまでの単語など}を好きなようにます。

記録されたマクロを永続化する

  1. .vimrcを開く
  2. ファイルの最後に移動
  3. 挿入モードに変更します。これを入力して永続化します。
@ q = ' ctrl+ r ctrl+ rq'とする
  1. 保存して終了

  2. ファイルを開き、いくつかの単語に行きます

  3. 今押す @q

あなたがそれを正しく行えば、魔法のことがあなたの言葉に現れるはずです。

あなたはあなたが愛した他のマクロのためにこの手順を行うことができます。


3
私はこのソリューションが好きだと言わざるを得ません。サラウンド.vimは不要で、マクロの呼び出しと作成は簡単です。また、必要に応じて簡単に使用できます(たとえば、現在の単語を行末まで引用して、ansibleに最適です)。マクロを表示するには、次のようにします。「qp。保存するには、.vimrcに移動して、次のようにします。let@q = 'macro contents'(just for complete complete)
th3penguinwhisperer

私はこれがとても好きです。これらのマクロをネストすることもできます。したがって、レジスタjに記録し、withを使用し@q wて次のn単語を引用符で囲むことができますn@j
hidden-username

1
マクロを永続化するためにいくつかの手順を追加しました。
Brain90

1
教訓的ですが、Vimでは単語と単語が異なります。Shift + b = Bなので、ステップ2は「...現在の単語の前」に変更するのが理想的です。ただし、単語の最初を意味する場合は、Shiftを使用する必要はありません。
アンバリーシュ

その点をありがとう。私は意図的にシフト+ bを使用してWORDを処理します。マクロはwordまたはWORD [0]で実行する必要があります。実際、ステップ3もshift + eに変更する必要があります。[0] stackoverflow.com/a/14390568/341959
Brain90

18

(たとえば)一重引用符で囲むと機能しますciw'<C-r>"'<esc>が、繰り返しは機能しません。試してください:

ciw'<C-r><C-o>"'<esc>

これにより、デフォルトのレジスタの内容が「文字通り」配置されます。これで.、任意の単語を押して、引用符で囲むことができます。:h[elp] i_ctrl-rテキストオブジェクトの詳細と詳細については、:h text-objects

ソース:http : //vimcasts.org/episodes/pasting-from-insert-mode/


2
素晴らしいヒント!これからマッピングを作成したい場合、適切な表記はciw'<C-R><C-O>"'<Esc>です。
glts 2013

<Cr> "は正確には何をしますか?
CodeCrack '14

@CodeCrack CTRL-Rです。CTRL-Rは、カーソルの位置にレジスターの内容を挿入し、挿入モードのままです。
Erwin Rooijakkers、2015年

これはあなたが言及したように繰り返し可能ですが、マクロに格納されている場合、マクロを繰り返し.て実行すると、最後の実際の呼び出しの内容が書き換えられます。
Sbu

7

あなたができるVSCodeVimのユーザーのために

vwS"

  • "ラップしたいものに置き換えることができます。
  • w他の選択演算子で置き換えることができます

2
これはMacVIMでもうまく機能しましたviwS'が、単語を一重引用符で囲むものを使用する必要がありました。はるかに簡単です。
Matt Grannary

これは、あなたが言葉の最初にいる場合にのみ機能します。あなたが単語内の任意の場所からそれを実行したい場合は、行うことができます:viwS"
geoyws

6

このための組み込みvimコマンドはわかりませんがr"f'r"、「」から「」r'f"r'への変更と「」から「」への変更を使用すると、最初の「または」の上に立つと機能します。このコマンドr'は、カーソルの下にある文字を「」に置き換えますそしてf"あなたを次へ進めます」。


1
私にとって最も直感的な「手動」ソリューション。代わりに、第2置換コマンド(の'r"r)、あなただけ入力することができます.そして、あなたはより多くの引用符を変更したい場合は、;,彼らは最後の繰り返しとして、次または前の1にあなたを取るf/F/t/Tそれぞれ、同じ方向に検索または反対のものを。
Endre Both

6

見積もりを追加する

私はこの迅速で汚い機能を私の中で使い始めました.vimrc

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

だから今、私は好きなものを視覚的に選択し(通常はviw- 単語の内側を視覚的に選択する)、Q二重引用符を押すか、を押しqて一重引用符を付ける。

見積もりの​​削除

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

vim-textobj-quotesを使用て、vimが引用符をテキストオブジェクトとして扱うようにします。私が行うことができます。この手段は、vaq(視覚的に選択し、引用符をまわり。これは、最寄りの引用符を検索し、視覚的にそれらを選択します。(これはオプションで、あなただけのような何かを行うことができますf"vww)。それから私プレスsするストリップ選択から引用符を。

見積もりの​​変更

接吻。引用符削除してから引用符追加します。たとえば、一重引用符を二重引用符に置き換えるには、次の手順を実行します。1.一重引用符を削除します:vaqs、2.新しい引用符を追加します:vwQ



4

vimプラグインhttps://github.com/tpope/vim-surroundを使用する場合(または、vim-surroundがプリインストールされているVSCode Vimプラグインを使用する場合)、かなり便利です!

追加

ysiw' // surround in word `'`

落とす

ds' // drop surround `'`

変化する

cs'" // change surround from `'` to `"`

htmlタグでも機能します。

cst<em> // change surround from current tag to `<em>`

より良い例については、githubのreadmeをチェックしてください


2

次に、単語の引用と引用解除に使用できる簡単なマッピングをいくつか示します。

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>

1
マッピングを追加する方法、それらを呼び出す方法など、答えを詳しく説明できれば、誰にとっても素晴らしいことでしょう。ありがとう。
Carles Alcolea 2017

1
引用、二重引用符、引用符を外すには、次のようにする必要がありますqw qd wq
nilon '24 / 07/24

何らかの理由で、二重引用符は "word"のように最後に余分な引用符を返します
janicebaratheon

@ShuaiWang多分あなたはオートペアまたはいくつかの同様の拡張機能をインストールしましたか?これを削除すると、バグが修正されました。
ネフィリム2018

2

vscodeのVIMは、それをすばらしく行います。vscodeを使用しない場合は、1つのvimサラウンドに基づいています。

いくつかの例:

引用符タイプcs内にカーソルを置いた「テスト」」

引用符内にカーソルを置いた「テスト」タイプds」

引用符の内側にカーソルを置いて "test"と入力してcs "tと入力し、123>と入力して<123> testで終了します

単語テストタイプysawにカーソルを置いてテストし、(test)で終わる


1

私は.vimrcでnnoremapを使用しています

単語を単一引用符で囲むには:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

引用符を削除するには(二重引用符でも機能します):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

覚えておくべきルール: 'sq' =単一引用符。



0

これを行うスクリプトを作成しました。

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

使用するには、何かをハイライトし、コントロールlを押してから、文字を入力します。関数が認識している文字の1つである場合は、正しい終了文字を提供します。そうでない場合は、同じ文字を使用して両側に挿入されます。

Surround.vimはこれ以上のことができますが、これは私のニーズには十分でした。


-1

選択したテキストブロックを一重引用符で囲むビジュアルモードマップの例:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.