さまざまな区切り文字内のテキストを置き換える(例:角かっこ、引用符)


9

私はしばしば、後で変更したいハードコーディングされた値を使用して、いくつかのテスト実装を行います。お気に入り

ref = open('specific-file-name')

に変えたい

ref = open(fname)

vimには慣れてci(fnameいるので、ポイントが角かっこ内にあると想定して入力できます。(ci(は、内部ブラケットの交換を意味します)。

emacsで「replace inner」のようなものを実現するにはどうすればよいですか?

回答:


9

使用する 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-innerexpand-region作者のmagnarsexpand-regionバックエンドとして使用)がパッケージを見つけて、Vim ciが実行することを正確に実行します(また、outerを変更します)。

READMEパッケージから:

change-innerci基づいてvimのコマンドを提供しますexpand-region。それは例によって最も簡単に説明されます:

function test() {
  return "semantic kill";
}

セマンティックという言葉の後のポイント

change-inner "文字列の内容を
change-outer "削除します文字列全体
change-inner {を削除しますreturn-statement
change-outer {を削除しますブロック全体を削除します


3

地域あり

リージョンを使用してこれを行うには、以下から開始します。

ref = open(|'specific-file-name');

を押しC-SPC C-b C-M-n C-b C-wます。

より速い方法

Vimと同じように、括弧の前の点から始めます。

ref = open|('specific-file-name');

C-M-kkill-sexp)の結果:

ref = open|;

あなたが持っている場合electric-pair-modeには、再挿入することができます()だけで(。したがって、完全なキーシーケンスはC-M-k (-よりも長くはありませんci(


1
また、ポイントが左の引用の前にある場合、ref = open(|'specific-file-name');C-M-kを返しref = open(|);ます。引用はまたバランスのとれたセックスです。
Kaushal Modi

そんなことは考えてdelete-everything-inside-parensいなかったdelete-first-sexp-inside-parens
abo-abo 2015

素晴らしい解決策ですが、置き換える式の前にポイントを移動する必要があります。「内部変更」パッケージは、ポイントが式のどこかにある場合に機能します(viと同じ)。
kain88

1

evil ほとんどのVimをエミュレートし、テキストオブジェクトをそのまま使用します。

言い換えると、evilアクティブ化され、デフォルトのキーバインディングを使用すると、ci(あなたが求めていることを正確に実行します:括弧で囲まれているものを変更します。

より正確には、ci(にチェーンさevil-changeevil-inner-parenます。必要に応じて、独自の任意のテキストオブジェクトを作成することもできます。


私は悪について知っています(私はこれをしばらく使用しています)。「純粋な」emacsでこれを行う方法を知りたいのですが。
kain88

@ kain88:結構です:この質問には複数の答えがあると思います。しかし、好奇心から、すでにを使用している場合evil、なぜ非evil代替ではないのですか?
ダン

(深刻ではないコメント)@Dan彼はおそらくダークサイドに来る準備をしています。
Kaushal Modi

悪が他のモードではうまく機能しないことがあります。さらに、編集がどのようにemacsだけを使用するかを
知り

1

smartparensの使用

殺します

1)C-M-usp-backward-up-sexp)を使用して'区切り文字から抜けます。

2)C-0 C-M-k0プレフィックス+ sp-kill-sexp)を使用して、現在のsexpまたはC-ksp-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(コピー)する、backspacekillリングを雑然とせずにリージョンを削除する(のみ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を起動してから、アクティブな領域をどうするかを決定します。

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