回答:
expand-region
expand-region
パッケージをインストールすることをお勧めします(Melpaでも利用可能)。それはあなたの例で述べた状況を編集するのに役立ちます。
expand-region
インテリジェントです。メジャーモードに基づいて、何を選択しようとしているのかを把握しようとします。サンプルスニペットの言語がわからないので、サンプルコードスニペットを使用して、Python用に少し変更します(削除;)。だから私の以下の説明は、python-mode
バッファ内の以下のコードスニペットに関するものです。
ref = open('specific-file-name')
ポイントが単一引用符の隣にある場合
下の黒い垂直の長方形は、カーソルがどのように見えるかを示しています。
# point on left of left quote, the cursor is hiding the quote under it
ref = open(▮specific-file-name')
# point on left of right parenthesis, the cursor is hiding the parenthesis under it
ref = open('specific-file-name'▮
どちらの場合でも、を実行するとM-x er/expand-region
、'specific-file-name'
が選択され、ヒットDEL
(またはバックスペース)して選択を削除できます。
delete-selection-mode
有効にした場合(私はそれを個人的に有効にしたい)、選択を行った後で入力を取り消すことができ、選択が上書きされます。
もちろん、er/expand-region
たくさん使用する場合は、短いキーバインドにバインドします。にバインドするのが好きC-\
です。単一引用符の横にあるポイントで:C-\fname
私にくれますref = open(fname);
ポイントが引用符のどこかにある場合
を使用するexpand-region
と、ポイントが引用符の近くにある必要はありません。ただし、この場合は、ほんの少し(通常は1つまたは2つ以上)のキーストロークが必要になります。
カーソル位置が次のようになっているとしましょう:
# cursor shown below is hiding the i character under it
ref = open('specif▮c-file-name')
上記で使用したのと同じバインディングを使用します。
C-\
すると選択しますspecific
。ここで\
、選択(expand-region
機能)を展開するために押す必要があります。それが選択されますspecific-file-name
。
あなたがバインドされていた場合er/expand-region
にはC-=
、ヒットし=
再びすることは、増分展開を行います。選択の段階的な拡張/縮小のためにキーをバインドする方法に関するドキュメントを読んでください。
\
を選択しますもう一度'specific-file-name'
。DEL
て選択を削除し、と入力しfname
ます。場合はdelete-selection-mode
有効になっている、あなたはスキップすることができDEL
、ストロークを。要約すると、delete-selection-mode
有効にすると、キーストロークは次のようになりますC-\\\fname
。
change-inner
またchange-inner
、expand-region
作者のmagnars(expand-region
バックエンドとして使用)がパッケージを見つけて、Vim ci
が実行することを正確に実行します(また、outerを変更します)。
READMEパッケージから:
change-inner
にci
基づいてvimのコマンドを提供しますexpand-region
。それは例によって最も簡単に説明されます:function test() { return "semantic kill"; }
セマンティックという言葉の後のポイント
change-inner "
文字列の内容を
change-outer "
削除します文字列全体
change-inner {
を削除しますreturn-statement
change-outer {
を削除しますブロック全体を削除します
リージョンを使用してこれを行うには、以下から開始します。
ref = open(|'specific-file-name');
を押しC-SPC C-b C-M-n C-b C-wます。
Vimと同じように、括弧の前の点から始めます。
ref = open|('specific-file-name');
C-M-k(kill-sexp
)の結果:
ref = open|;
あなたが持っている場合electric-pair-mode
には、再挿入することができます()
だけで(。したがって、完全なキーシーケンスはC-M-k (-よりも長くはありませんci(。
delete-everything-inside-parens
いなかったdelete-first-sexp-inside-parens
。
evil
ほとんどのVimをエミュレートし、テキストオブジェクトをそのまま使用します。
言い換えると、evil
アクティブ化され、デフォルトのキーバインディングを使用すると、ci(
あなたが求めていることを正確に実行します:括弧で囲まれているものを変更します。
より正確には、ci(
にチェーンさevil-change
れevil-inner-paren
ます。必要に応じて、独自の任意のテキストオブジェクトを作成することもできます。
evil
、なぜ非evil
代替ではないのですか?
殺します
1)C-M-u
(sp-backward-up-sexp
)を使用して'
区切り文字から抜けます。
2)C-0 C-M-k
(0
プレフィックス+ sp-kill-sexp
)を使用して、現在のsexpまたはC-k
(sp-kill-hybrid-sexp
)内のコンテンツを削除します。後者は、smartparens-strict-mode
が有効で現在のsexpが1行に収まる場合にのみ機能します。
ref = open('specific|-file-name')
// C-M-u
ref = open(|'specific-file-name')
// C-k
ref = open(|)
マークと削除/キル/コピー
1)sexpの先頭への道を見つけ(この例でC-M-u sp-backward-up-sexp
は十分です)、マークC-SPC
を設定し、でsexpの最後に移動しsp-end-of-sexp
ます。
2)次に、あなたが望むことは何でもできます:C-w
リージョンをkillする、リージョンM-w
をkill-ring-save(コピー)する、backspace
killリングを雑然とせずにリージョンを削除する(のみdelete-selection-mode
)
ref = open('specific|-file-name')
// C-M-u
ref = open(|'specific-file-name')
// C-SPC - mark is now active
ref = open(|'specific-file-name')
// sp-end-of-sexp (my binding: M-e)
ref = open(<'specific-file-name'|)
// backspace
ref = open(|)
mark-inside-sexp関数
smartparens
パッケージにはsp-mark-sexp
、次のsexp全体、つまり区切り文字とその間のものをマークする機能があります。
次のような関数を使用して、選択範囲から区切り文字をスローすることができます。
(defun mark-inside-sexp-using-sp ()
(interactive)
(sp-mark-sexp)
(exchange-point-and-mark) (backward-char)
(exchange-point-and-mark) (forward-char)
(message "MARK INSIDE SEXP (using sp)"))
(global-set-key (kbd "s-SPC") 'mark-inside-sexp-using-sp)
;; this is "super" modifier (win key) with space
C-M-u
繰り返し使用してセックスから抜け出し、mark-inside-sexp-using-spを起動してから、アクティブな領域をどうするかを決定します。
ref = open(|'specific-file-name');
はC-M-k
を返しref = open(|);
ます。引用はまたバランスのとれたセックスです。