Vimで単語をすばやく引用/引用解除し、引用を変更する(たとえば、'
から"
に)するにはどうすればよいですか? surround.vim プラグインについては知っていますが、Vimだけを使用したいと思います。
サラウンド.vimはあなたの最も簡単な答えになるでしょう。あなたが本当にそれを使用することに反対しているなら、あなたができることのいくつかの例があります。必ずしも最も効率的ではありませんが、そのため、surround.vimが作成されました。
ciw'Ctrl+r"'
ciw
-カーソルが置かれているWordを削除し、挿入モードになります。'
-最初の引用符を追加します。Ctrl+r"
-"
レジスタの内容、つまり最後のヤンク/削除を挿入します。'
-閉じ引用符を追加します。di'hPl2x
di'
-単一引用符で囲まれたWordを削除します。hP
-カーソルを1つ左(開始引用符の上)に移動し、削除したばかりのテキストを引用符の前に置きます。l
-カーソルを右に1桁移動します(開始引用符の上)。2x
-2つの引用符を削除します。va':s/\%V'\%V/"/g
va'
-引用符で囲まれたWordと引用符を視覚的に選択します。:s/
-交換を開始します。\%V'\%V
-視覚的に選択された領域内にある単一引用符のみに一致します。/"/g
-それらをすべて二重引用符で置き換えます。一重引用符を使用して単語を引用する
ciw'Ctrl+r"'
この方法でやりやすい
ciw '' Esc P
役立つマッピングを次に示します。
:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
Mapleader変数を変更していない場合は、\q"
\q'
または\qd
を使用してマッピングをアクティブにします。それぞれ、カーソルの下の単語を二重引用符で囲み、カーソルの下の単語を単一引用符で囲み、カーソルの下の単語を囲む引用符を削除します。
他のコマンドに加えて、これは行内のすべての単語を二重引用符で囲みます(コメントのとおり)
:s/\(\S\+\)/"\1"/
または、バックスラッシュの数を減らしたい場合は、パターンの先頭に\v
(非常に魔法の)修飾子を配置できます
:s/\v(\S+)/"\1"/
単一引用符で囲む(たとえば)ciw'<C-r>"'<esc>
は機能しますが、repeatは機能しません。試してください:
ciw'<C-r><C-o>"'<esc>
これにより、デフォルトのレジスタの内容が「リテラル」になります。これで、任意のWordで.
を押して引用符で囲むことができます。詳細については、 :h[elp] i_ctrl-r
を参照してください。 :h text-objects
のテキストオブジェクトについての詳細を参照してください。
マクロの方法
押す q そして q qレジスターに記録する場合(「引用符」を覚えるショートカットとして「q」を使用します)。
押す shift + b 現在のWordの前にカーソルを移動します
押す i タイプ ' (一重引用符)
押す esc 次に押す e Wordの最後に移動する
押す a 次に押す ' 再びWordを引用符で囲みます。
最後に押す q q
レジスタに記録します。
使用方法:
step 4
は、{行、文字が見つかるまでの単語など}を好きなように変更できます。 vim variables
と.vimrc
に入れて、あなたの幸せを繰り返してください。
このための組み込みのvimコマンドはわかりませんが、r"f'r"
を使用して 'から'に変更し、r'f"r'
を使用して "から 'に変更すると、最初の'または"に立っている場合に機能します。 r'
はカーソルの下にあるすべての文字を 'に置き換え、f"
は次の "に進みます。
VSCodeVimのユーザー向けにできること
vwS"
"
は、ラップしたいものに置き換えることができます。w
を他の選択演算子に置き換えることができます以下に、Wordの引用と引用解除に使用できる簡単なマッピングを示します。
" '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>
VIM for vscode それはひどく行います。 vscodeを使用しない場合は、1つ vim-surround に基づいています。
いくつかの例:
引用符の中にカーソルを置いて「テスト」と入力すると、「テスト」になります。
引用符内にカーソルを置いて「テスト」と入力すると、テストが終了します
引用符内にカーソルがある「test」と入力してcs "tを入力し、123>と入力して<123> testになります
word test type ysaw)にカーソルを置いてテストし、最終的に(test)
.vimrcでnnoremapを使用しています
Wordを単一引用符で囲むには:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
引用符を削除するには(二重引用符でも機能します):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
覚えておくべきルール: 'sq' =単一引用符。
これを行うスクリプトを作成しました。
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はこれ以上のことを実行できますが、これで十分です。
これはどう?
:%s/\'/"/g