なぜYはy $ではなくyyの同義語なのですか?


28

これには特定の歴史的理由がありますか?


背景 —(質問を既に理解している場合は、この部分をスキップできます。)

中級/上級viユーザーが知っているようにy、 "yank"コマンドは次の移動コマンドで指定されたテキストをヤンク(コピー)します。* ye単語の最後までヤンクし、y0カーソル位置から行頭までヤンクしますy_現在の行全体をy$ヤンクし、カーソル位置から現在の行の最後までヤンクします。

d(削除)コマンドとc(変化する)コマンドが両方同様にこれらの動きのすべてで使用することができます。

ddは、d_現在の行全体の同義語であり、削除します。同様に、現在の行のcc同義語でc_あり、変更します(つまり、すべてのテキストを削除し、行の先頭で挿入モードにします)。**

「yank」コマンドはこの規則に従います。yyのように現在の行全体をヤンクしますy_

同義語の別のセットがあります:Dは同義語でd$あり、カーソル位置から行末までを削除します。 Cは同義語でc$あり、カーソル位置から行末までテキストを変更し、挿入モードにして新しいテキストを入力します。

しかし、Yあるの同義語yyy_とヤンクます全体のラインをあなたから期待通りだけでなく、カーソルから行末までCDパターン。


Vimの下位互換性を維持するためにVimでこのように保持されていることを理解していviます:help Y

「Y」をカーソルから行末まで(より論理的ですが、Vi互換ではない)動作させたい場合は、「:map Y y $」を使用します。

だから、これはからのホールドオーバーですvi。いいよ

しかし、そもそもコマンドがそのように設計されたのはなぜですか?これまでに何か論理はありましたか?


*具体的には、レジスタ0にテキストを配置し、名前のないレジスタをレジスタ0に向けます。

**これSは私の質問には関係ありませんが、ccまたはの別の同義語ですc_


3
なぜこんな風に作られたのはわかりません。あなたはそれについてビル・ジョイに尋ねなければなりません。ただし、これは論理的なバグであり、元のviでは修正されず、すべてのクローンに組み込まれたため、最終的にPOSIXで要求されました。
クリスチャンブラバンド16年

3
答えを見つけたなら、彼らもここでそれを必要とします。;)
joeytwiddle

1
これが実際の理由だとは思いませんが、vim-sensibleに再マップされることに反対した人は、Cプログラマとして、行全体のヤンキングよりも行末のヤンキングをはるかに多く使用していたと主張しました。デフォルトのマッピングは良好です。YMMV:確かにそうです。
リッチ

回答:


16

ウィリアム・ジョイ(viクリエーター)とマーク・ホートン(1979年以来のviメンテナー)の論文「Viによるディスプレイ編集入門」を見つけました。

論文から、デフォルトのY動作は間違いではなく、望ましい機能であることは明らかです。では、「再配置および複製テキスト」セクション彼らはこれを言及します:

Try the command YP. This makes a copy of the current line 
and leaves you on this copy, which is placed before the current line. 
The command Y is a convenient abbreviation for yy. 
The command Yp will also make a copy of the current line, 
and place it after the current line. 
You can give Y a count of lines to yank, and thus duplicate 
several lines try 3YP.

コマンドのリストの後の方(pdfバージョンの付録を参照)、Yの説明は次のとおりです。

Y  Yanks a copy of the current line into the unnamed buffer, 
   to be put back by a later p or P; a very useful synonym for yy.

このようにして、Yはバグではなく機能であると確信しています。

矛盾についてはDC-私はまた、論理的な説明があります。あなたがテキストエディタの作者として考えようとするなら、あなたの主な望みは新しいテキストを作成し、それを削除しないことです。彼ら(テキストエディターの作者)は、ユーザーにもっと多くのテキストを書いてほしいと思っています。

したがって、構文糖コマンド(およびYDおよびCは、既存の機能を複製するため構文糖の一種です)については、できるだけ多くのテキストを追加する操作(Y行全体を複製する)を選択するか、できるだけ少ないテキストDC削除する(および削除するまで削除します)行全体ではなく行末)。


さて、私は好きYPです。すばやく簡単に入力できます。私は確信しています。;)
ワイルドカード

8

Y最初のviバージョン(ex-1.1、1978年1月1日)のyankコマンドでした。このバージョンにはyycammand がありませんでした。ex-2.2(1979年5月6日)にはとの両方がyyありましたY。したがって、実際にyyYYpredates yy)の同義語です。


これが本当の答えです。Y他のコマンドと同じロジックに従っていません。これは、後に略語として再調整されたものよりも前のものであるためです。
mechalynx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.