Grok Vimのモーションと簡単な編集


8

Emacsを数年間使用した後、Vimに戻ります。チュートリアルを読んだり見たり、実際に毎日使ってVim を理解しようとしています。

テキストを編集するとき、Alt-F、Alt-B、Ctrl-a、Ctrl-e、Alt-D、Alt-BackspaceのEmacsコマンドは非常に便利で直感的であり、作業中にローカルですばやく簡単に編集できますテキスト(単語/コード)。

同様の機能を実装するVimの方法は何ですか?NORMALモードに戻って単一のモーションを発行し、モードを再入力するだけINSERTでは最適ではありません。

例1:式の先頭にINSERTaを挿入するモードの場合(、対応)するVim に挿入するには、式または行の最後に移動する方法を教えてください。

例2:テキストを編集するとき、文章やコードを書いたり編集したりしながら、単語を前後に削除したい場合がよくあります。完全に形成されたセンテンス/コードを頭に入れて、「ワンスオフ」を事前に入力する準備ができているのは珍しいでしょう。多くの場合、テキストを操作していると文が変わります。INSERTモードの制限により、Vimでこの種の編集を困難にしています。挿入モードでテキストを効果的に操作できずNORMAL、単純な移動や単語の削除のために常にモードに戻る必要があることに気づきました。

PS:Alt-Fと-Bはカーソルを1単語前または後ろに移動します。Ctrl-aおよび-eは、カーソルを行の先頭または末尾に移動します。Alt-Fはカーソルの下の単語を削除します。Alt-Backspaceはカーソルの前の単語を削除します。


1
Vimの方法は、algorithm.com.au/ code/vimacsのようなプラグインを使用することかもしれません。:P emacsでこれらのコマンドの機能の説明を含めることができますか?Ctrl / Alt / Meta-foo / barのリストは、emacsを使用しない人にはまったく意味がありません。そして、Ctrl-Wはカーソルの前の単語を削除します。また、少し広すぎる気がします。
muru、2015

1
プラグインを使用する場合は、github.com
tpope /

3
プログラミング言語「A」から「B」に移行する場合。「B」を「A」のスタイルで書くのではなく、「B」の標準イディオムを学ぶのが最善です(ほとんどの開発者にとっては難しいレッスンです)。同じルールが編集者にも適用されます。エディター「A」の標準ワークフローを新しいエディター「B」に適用しないでください。「B」を使用するイディオムを直接学習することをお勧めします。学習曲線は大きくなりますが、長期的にははるかに生産的です。でvim編集する際には、挿入モードではない通常モードであなたの時間の大半を過ごします。
マーティンヨーク

回答:


6

1

あなたはそれらまたはより良い(ピンキー)コマンドマッピングを非常に迅速に達成することができます。私はこのソリューションをお勧めしませんが、例として、カーソルを行の先頭に移動したい場合は、通常モードから<C-a>ヒット:した後に次の行を実行できます(またはvimrcに行を追加します)。

inoremap <C-a> <C-o>0

または、行の先頭が行の最初の非空白文字を意味する場合

inoremap <C-a> <C-o>^

奇妙なことに、私はこの回答を書いているバッファーでこれらのマッピングをテストしたところ、動作しなかったため、しばらく混乱しました。それから、挿入モードに入るのを忘れていることに気づきました。通常モードのコマンドを実行するために挿入モードを終了するのは面倒なようです。Vimをしばらく使用した後、それが逆であることに気付く場合があります。つまり、考えている間は通常モードのままで、特定の状況でのみ挿入モードに移動します。Vimは、テキストを書くよりも多くの編集を行うことがわかった場合にのみ、おそらく(またはほとんど)学ぶ価値があります。

したがって、挿入モードから通常モードコマンドをすばやく実行することについての質問に対する回答の一部はです<C-o>。これにより、一時的に挿入モードを終了して、1つの通常モードコマンドを実行してから、再入力できます。それについてで読んでください:help i_Ctrl-o。これは、1回限りの便宜に役立ちます。より持続可能なルートは、おそらくナビゲーションと編集のデフォルトとして通常モードを採用しようとし、実際に新しい文字を手動でバッファーに挿入したい場合にのみ挿入モードに入ります。

2

あなたの例は非常に一般的なものなので、具体的な答えを出すのは難しいです。あなたが遭遇するものにフィットするか、翻訳可能であることを期待して、具体的な例を作成します。あなたの数1の場合、それはあなたが右括弧がどこに行くことになっているのかをどのように知っているに依存します。次のような行があるとします

let cchar = s:cchar["atx"]

これは、VimLのスクリプト言語であるVimLの行であることを意図しており、私が現在反対しているVim構文ファイルで発生します(またはそのようなもの)。この式の右側の部分を関数呼び出しに変更したいとしましょう。おそらく、辞書s:cchar"atx"キーの値がまだ割り当てられていないときに関数がデフォルトを提供するためです。カーソル(通常モード)の最初の文字 'l'で、次のように入力します

f=wcf[MyFunction(<Esc>$r)

簡単に言うと、これは

  • f=-「=」に進む(私は言っfsたかもしれませんが、到達したい「s」が行の最初のsであることを確認するのに十分な時間停止しないので、次の文字に行きます:明らかにユニークで、そこから続けます)
  • w -次の単語、今私のカーソルは「s:cchar」の「s」の上にあります
  • cf[ -「[」に転送するように変更

この時点で線は次のようになります

let cchar = |"atx"]

どこ|カーソルです、と私は挿入モードにしています。次に、入力MyFunction(して挿入モードを終了します(<Esc>)。

  • $-カーソルを行末に移動します。Eビッグワードの終わりやf]「〜への転送」などの動きに使用できたかもしれ$ませんが、最初に思いつきました。
  • r) -カーソルの下の文字を「)」に置き換えます

これで、割り当て式をスクリプトローカルディクショナリからの割り当てから関数の戻り値を使用するように変更しました。そのため、括弧を導入しました。かっこの特定の必要性がどのように見えるかはわかりませんが、おそらくそれは非常に異なります。その場合、それを達成するためのコマンドの異なる文字列があります。私が作った例についてもっと長く考えるために一時停止した場合、それを達成するためのより効率的な方法も見つけるかもしれませんが、一時停止して考える時間のある人はいます。

(試して、テキストとコマンドをバッファにコピーして貼り付け(申し訳ありませんが、yank-put)、カーソルをコマンドヒットの最初の文字「f」に置きますy$。これで、コマンドは名前のないレジスタにあります。最初の行の先頭に移動して:normal <C-r>"、a)コマンドラインモードに入る、b)コマンドラインから通常モードコマンドの実行を開始する、c)名前のないレジスタを通常どおりコマンドラインに貼り付ける(atchoo put)実行するモードコマンド。コマンドで変更する必要があるのは、偽の<Esc>一連の文字を(ブラウザーからコピーして貼り付けたatchooから)実際のEscapeキーコードに置き換えることだけなので、削除してヒット<C-v>してからEscキーを押します。それは一種のようになります^[。ここでReturnキーを押してコマンドを実行します。または...キーの文字列を入力してコマンドをテストします。コマンドラインモードから、および<C-v>、および<C-r>、およびその他のWonderlandの他のすべての栄光からも通常モードと対話できることを示したかっただけです。また、も参照してください:help Cmdline-mode。)

単語を逆方向に削除するには、標準のマッピングを使用できます<C-w>(を参照:help i_Ctrl-w)。単語を前方に削除するデフォルトのマッピングがあるかどうかはわかりませんが、

inoremap <C-S-w> <C-o>dw

この場合<C-o>も、1回限りのコマンドでは挿入モードが終了dwし、「単語」の動きが「削除」されます。参照してください:help d:help w。削除する前方単語が実際の単語ではなくclass.function#namesである場合は、使用することができますW(を参照:help W)。あなたは、通常モードでは、すでにほとんどしている場合は、これらのマッピングを必要とするだけで実行しないdwdbまたは友人。

いくつかの章を詳しく見るのを助ける

  • :help <C-o>
  • :help Insert
  • :help f次のセクション(FtT;および,
  • :help word-motions

5
書き込みは線形ではありません。なんらかの編集を行わずに最初から最後まで散文(またはコード)を書くことができる人は、狂気であるか、神の力を持っています。私たちの残りの部分では、さらに編集してから書き込みを行うので、最初に編集コマンド(NORMALモード)を実行し、2番目に書き込み(INSERTモード)を実行するとエディターを考える方が効率的です。そして、これがEmacs、MS Word、メモ帳などのエディターがアプローチを後回しにしている理由の真の核心です。モードレスの概念が存在するのは残念ですが、共通の最低限の要素があるはずです。
スキマ

12

テキストを編集するとき、Alt-F、Alt-B、Ctrl-a、Ctrl-e、Alt-D、Alt-BackspaceのEmacsコマンドは非常に便利で直感的であり、作業中にローカルですばやく簡単に編集できますテキスト(単語/コード)。

ローカル編集に関する質問に答えるには、挿入モードでを押すと、挿入モードでctrl-O次のコマンドを実行します。ラインをワイプする場合に便利です。レジスターからの貼り付けや単語のオートコンプリートなど、小さなことを行うための挿入モードの他のコマンドがいくつかあります。これらはすべてで読むことができます:h ins-special-keys

例1:INSERTモードでVimに(式の先頭に、式の最後または対応するを挿入する行に)移動するにはどうすればよいですか?

多くの場合、通常モードで物事を行うためのより良い方法があります。たとえば、式を括弧で囲みたいとしましょう。あなたが行うことができますいくつかのものがありi(<end>)i(<esc>A)c$()<esc>P。*私の好きなことが「必要」vimのプラグインの1持つ必要VIM-サラウンドを。vim-surroundでは、それだけys$)です。これらすべての優れている点は、1つの状況でそれを行う方法を知っていれば、同様のすべての状況でそれを実行できることです。行の終わりに括弧を追加する代わりに、それが3語だけの場合はどうでしょうか c3w()<esc>Pまたはを使用できますys3w)。ライン全体はどうですか?cc()<esc>Pまたはyss)

例2:テキストを編集するとき、文章やコードを書いたり編集したりしながら、単語を前後に削除したい場合がよくあります。完全に形成されたセンテンス/コードを頭に入れて、「ワンスオフ」を事前に入力する準備ができているのは珍しいでしょう。多くの場合、テキストを操作していると文が変わります。INSERTモードの制限により、Vimでこの種の編集を困難にしています。挿入モードではテキストを効果的に操作できず、常に通常のモードに切り替えて簡単な移動や単語を削除する必要があることに気づきました。

大いに役立つ1つのことはinoremap jk <esc>、vimrc に追加することです。次に、jkを押して挿入モードを終了します。これにより、挿入モードを終了することによるオーバーヘッドのほとんどが取り除かれるのでjk<sequenceofcommands>i、入力を中断することなくコマンドを実行できます。


に加えて:h ins-special-keys:h ins-special-specialその他のマッピングを確認してください。
Lithis

9

Alt-F、Alt-B、Ctrl-a、Ctrl-e、Alt-D、Alt-Backspace

通常モードでの同等のコマンドがありwb^$dwdb。ロジックに注意してください:のdw対象wdb削除し、の対象を削除しbます。対象となるものを削除するには、どのコマンドを使用し^ますか?またはそれをヤンクするには?

その言語のようなロジックは、モーダル編集の要点です。調整に時間がかかる場合がありますが、uターンはありません。

:挿入モードでの同等のコマンドはありません<C-Right><C-Left><Home><End><C-w>と...何ができますが、単純なマッピングを作成することができますinoremap <C-something> <C-o>dw

NORMALモードに戻って単一のモーションを発行し、モードを再入力するだけINSERTでは最適ではありません。

確かに。正しい方法は、挿入モードに入り、できるだけ少ないテキストを挿入し、できるだけ早く通常モードに戻ることです。

例1:式の先頭にINSERTaを挿入するモードの場合(、対応)するVim に挿入するには、式または行の最後に移動する方法を教えてください。

任意のテキストエディター、IDE、テキストプロセッサー、または<textarea>

<End>)

例2:テキストを編集するとき、文章やコードを書いたり編集したりしながら、単語を前後に削除したい場合がよくあります。完全に形成されたセンテンス/コードを頭に入れて、「ワンスオフ」を事前に入力する準備ができているのは珍しいでしょう。多くの場合、テキストを操作していると文が変わります。INSERTモードの制限により、Vimでこの種の編集を困難にしています。挿入モードでテキストを効果的に操作できずNORMAL、単純な移動や単語の削除のために常にモードに戻る必要があることに気づきました。

この場合も、挿入モードはテキストを挿入するためのものです。「テキストの操作」と移動は通常モードで行われることになっています。

より正確な質問をしてください。


モードでモーション(End矢印キーなど)を使用してINSERTも問題ありませんか?
SabreWolfy、2015

4
もちろん、作業を簡単にするものなら何でも。
romainl 2015

3

同様の機能を実装するVimの方法は何ですか?NORMALモードに戻って単一のモーションを発行し、INSERTモードに再度入るだけでは最適ではありません。

まあ、Vimのやり方はINSERTモードのままにしないことです。Vimの啓発的な瞬間は、INSERTモードにとどまる必要がない方法に気づいたときです。テキストを挿入するには多くの方法があり、それらはすべてNORMALモードから始まります。

そうは言っても、私は本当の自分ではないので、その仕事をするためにキーを再マップしました(Windowsの場合)。

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