どうすればVimで単語をすばやく引用/引用解除し、引用(たとえば、'
から"
)を変更できますか?Surround.vimプラグインについては知っていますが、Vimのみを使用したいと思います。
どうすればVimで単語をすばやく引用/引用解除し、引用(たとえば、'
から"
)を変更できますか?Surround.vimプラグインについては知っていますが、Vimのみを使用したいと思います。
回答:
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
-それらをすべて二重引用符で置き換えます。ciw
だけではなくcw
?1つ目は混乱し、2つ目はうまくいきます。
ciw
は、カーソルが単語のどこにあっても機能します。 cw
カーソルが単語の先頭にある場合にのみ機能します。を参照してください:help iw
。
.
コマンドで機能しないことに気付くでしょう。これを機能させるには、を使用しますciw' Ctrl+r Ctrl+p"
。次に.
、次の単語に対してあなたが望むように動作します:レジスターの内容を覚えるのではなく、レジスターの内容を今すぐ覚えておきます(説明するのは難しいのですが、両方を試すと、それが明らかになります) :
一重引用符を使用して単語を引用する
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
ます。カーソルの下の単語を二重引用符で囲み、カーソルの下の単語を単一引用符で囲み、カーソルの下の単語を囲む引用符をそれぞれ削除します。
map <Leader>' gewi'<Esc>A'<Esc>
して.vimrc
、現在の位置から行の終わりまで一重引用符のコメントを挿入しました。一部のMSDOSスクリプトをbashに変換する際に役立ちました。
:vnoremap <leader>q c""<esc>P
。
他のコマンドに加えて、これはすべての単語を(コメントに従って)二重引用符で囲みます。
:s/\(\S\+\)/"\1"/
またはバックスラッシュの数を減らしたい場合\v
は、パターンの先頭に(非常に魔法の)修飾子を付けることができます
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
マクロの方法!
qおよびqを押して、qレジスタに記録します(「q」は、「引用符」を覚えるためのショートカットとして使用します)。
shift+を押してbカーソルを現在の単語の前に移動
プレスiタイプ'(一重引用符)
押してescから押しeて単語の終わりに移動
を押してaから'もう一度押して、単語を引用符で囲みます。
を押すescと通常モードになります。
最後にを押しqて、q
レジスタに記録します。
使い方
あなたは変えることができます step 4
{行、ある文字が見つかるまでの単語など}を好きなようにます。
記録されたマクロを永続化する
@ q = ' ctrl+ r ctrl+ rq'とする
保存して終了
ファイルを開き、いくつかの単語に行きます
@q
あなたがそれを正しく行えば、魔法のことがあなたの言葉に現れるはずです。
あなたはあなたが愛した他のマクロのためにこの手順を行うことができます。
@q w
て次のn
単語を引用符で囲むことができますn@j
。
(たとえば)一重引用符で囲むと機能します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/
ciw'<C-R><C-O>"'<Esc>
です。
.
て実行すると、最後の実際の呼び出しの内容が書き換えられます。
あなたができるVSCodeVimのユーザーのために
vwS"
"
ラップしたいものに置き換えることができます。w
他の選択演算子で置き換えることができますviwS'
が、単語を一重引用符で囲むものを使用する必要がありました。はるかに簡単です。
viwS"
このための組み込みvimコマンドはわかりませんがr"f'r"
、「」から「」r'f"r'
への変更と「」から「」への変更を使用すると、最初の「または」の上に立つと機能します。このコマンドr'
は、カーソルの下にある文字を「」に置き換えますそしてf"
あなたを次へ進めます」。
'r
と"r
)、あなただけ入力することができます.
そして、あなたはより多くの引用符を変更したい場合は、;
と,
彼らは最後の繰り返しとして、次または前の1にあなたを取るf/F/t/T
それぞれ、同じ方向に検索または反対のものを。
見積もりを追加する
私はこの迅速で汚い機能を私の中で使い始めました.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
。
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をチェックしてください
次に、単語の引用と引用解除に使用できる簡単なマッピングをいくつか示します。
" '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>
qw
qd
wq
vscodeのVIMは、それをすばらしく行います。vscodeを使用しない場合は、1つのvimサラウンドに基づいています。
いくつかの例:
引用符タイプcs内にカーソルを置いた「テスト」」
引用符内にカーソルを置いた「テスト」タイプds」
引用符の内側にカーソルを置いて "test"と入力してcs "tと入力し、123>と入力して<123> testで終了します
単語テストタイプysawにカーソルを置いてテストし、(test)で終わる
これはどう?
:%s/\'/"/g
%
、ファイル全体を選択しない限り、現在の行でのみ機能します
これを行うスクリプトを作成しました。
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はこれ以上のことができますが、これは私のニーズには十分でした。