ทำไม Y จึงเป็นคำพ้องความหมายสำหรับ yy แทนที่จะเป็น y $


28

มีเหตุผลทางประวัติศาสตร์ที่เฉพาะเจาะจงสำหรับสิ่งนี้หรือไม่?


ความเป็นมา - (คุณสามารถข้ามส่วนนี้ได้หากคุณเข้าใจคำถามนี้ไปแล้ว)

ในฐานะที่เป็นสื่อกลาง / ขั้นสูงviผู้ใช้จะรู้ว่าyคือ "งัดคำสั่ง" มัน yanks (สำเนา) ข้อความที่ระบุโดยคำสั่งการเคลื่อนไหวต่อไป. * ดังนั้นyeyanks ไปยังจุดสิ้นสุดของคำ, y0yanks จากตำแหน่งเคอร์เซอร์ไปยังจุดเริ่มต้นของบรรทัดy_ดึงเส้นปัจจุบันทั้งหมดy$ออกจากตำแหน่งเคอร์เซอร์จนถึงจุดสิ้นสุดของบรรทัดปัจจุบันเป็นต้น

dคำสั่ง (ลบ) และcคำสั่ง (เปลี่ยนแปลง) ทั้งสองจะสามารถนำมาใช้กับทุกการเคลื่อนไหวเหล่านี้เช่นกัน

ddเป็นคำพ้องสำหรับd_และลบบรรทัดปัจจุบันทั้งหมด ในทำนองเดียวกันccก็เป็นคำพ้องความหมายสำหรับc_และจะเปลี่ยนบรรทัดปัจจุบัน (เช่นมันจะลบข้อความทั้งหมดและทำให้คุณอยู่ในโหมดแทรกที่จุดเริ่มต้นของบรรทัด). **

คำสั่ง "กระชาก" เป็นไปตามอนุสัญญานี้ จะงัดบรรทัดปัจจุบันทั้งหมดเช่นเดียวกับyyy_

มีอีกหนึ่งชุดของคำพ้องความหมาย: Dเป็นคำพ้องความหมายสำหรับd$และจะลบจากตำแหน่งเคอร์เซอร์ไปยังจุดสิ้นสุดของบรรทัด Cเป็นคำพ้องความหมายc$และจะเปลี่ยนข้อความจากตำแหน่งเคอร์เซอร์เป็นจุดสิ้นสุดของบรรทัดวางคุณในโหมดแทรกเพื่อพิมพ์ข้อความใหม่

อย่างไรก็ตามYเป็นคำพ้องความหมายอื่นสำหรับyyหรือy_และจะดึงทั้งบรรทัดไม่ใช่เฉพาะจากเคอร์เซอร์จนถึงท้ายบรรทัดตามที่คุณคาดหวังจากCและDรูปแบบ


ฉันเข้าใจว่าใน Vim มันถูกเก็บไว้เป็นวิธีนี้เพื่อรักษาความเข้ากันได้ย้อนหลังกับviตามที่กล่าวไว้ในความช่วยเหลือ Vim ภายใต้:help Y:

หากคุณต้องการให้ "Y" ทำงานจากเคอร์เซอร์จนถึงจุดสิ้นสุดของบรรทัด (ซึ่งมีเหตุผลมากกว่า แต่ไม่รองรับ Vi) ให้ใช้ ": map Y y $"

viดังนั้นนี่คือสิ่งที่หลงเหลือมาจาก ละเอียด.

แต่ทำไมคำสั่งจึงออกแบบมาตั้งแต่แรก? มีเหตุผลอะไรกับมันบ้างไหม?


* โดยเฉพาะมันจะวางข้อความใน register 0 และชี้ไปยัง register ที่ไม่มีชื่อที่ register 0

** ถึงแม้ว่ามันไม่ได้เกี่ยวข้องกับคำถามของฉันSเป็นคำพ้องอีกหรือccc_


3
ฉันไม่แน่ใจว่าทำไมมันถูกสร้างขึ้นมาเหมือนมัน คุณจะต้องถาม Bill Joy เกี่ยวกับเรื่องนี้ อย่างไรก็ตามโอกาสนี้เป็นข้อผิดพลาดเชิงตรรกะที่เพิ่งไม่เคยได้รับการแก้ไขใน vi เดิมและทำให้มันกลายเป็นโคลนทั้งหมดและในที่สุดก็ถูกเรียกร้องโดย POSIX
Christian Brabandt

3
ถ้าคุณเคยพบคำตอบที่พวกเขายังต้องการมันนี่ ;)
joeytwiddle

1
ฉันสงสัยว่านี่เป็นเหตุผลที่แท้จริง แต่คนที่แย้งกับ Y นั้นถูกแมปใหม่ในกลุ่มที่มีเหตุผลและเป็นที่ถกเถียงกันอยู่ว่าในฐานะโปรแกรมเมอร์ C พวกเขาเคยใช้การส่งสัญญาณไปยังจุดสิ้นสุดของสายมากกว่าการส่งสัญญาณทั้งหมด การแมปเริ่มต้นนั้นดี YMMV: ของฉันทำอย่างแน่นอน
Rich

คำตอบ:


16

ฉันพบกระดาษ"คำนำเพื่อแสดงการแก้ไขด้วย Vi"โดย William Joy (ผู้สร้าง vi) และ Mark Horton (ผู้ดูแล vi ตั้งแต่ปี 1979)

จากกระดาษเป็นที่ชัดเจนว่าพฤติกรรม 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 เป็นคุณสมบัติและไม่ใช่ข้อผิดพลาด

สำหรับความไม่สอดคล้องกับDและC- ฉันยังมีคำอธิบายที่สมเหตุสมผล หากคุณพยายามคิดว่าเป็นผู้แต่งข้อความมากกว่าความปรารถนาหลักของคุณก็คือการสร้างข้อความใหม่และไม่ลบมัน พวกเขา (ผู้เขียนโปรแกรมแก้ไขข้อความ) ต้องการให้ผู้ใช้เขียนข้อความมากขึ้นและมากขึ้นเรื่อย ๆ ...

ดังนั้นสำหรับคำสั่งน้ำตาลประโยค (และY, DและCเป็นชนิดของน้ำตาลประโยคเพราะพวกเขาซ้ำแล้วคุณลักษณะที่มีอยู่) พวกเขาเลือกที่การดำเนินงานที่เพิ่มเป็นข้อความมากที่สุดเท่าที่เป็นไปได้ ( Yซ้ำทั้งบรรทัด) หรือลบเป็นข้อความน้อยที่สุดเท่าที่ทำได้ ( DและCลบจนกว่า จุดสิ้นสุดของบรรทัดและไม่ใช่ทั้งบรรทัด)


โอเคฉันชอบYP; ที่รวดเร็วและง่ายต่อการพิมพ์ ฉันเชื่อมั่น ;)
สัญลักษณ์ตัวแทน

8

Yเป็นคำสั่ง yank ของเวอร์ชัน vi แรก (เช่น 1.1, 1 มกราคม 2521) รุ่นนี้ไม่มีyyแคมมานด์ อดีต 2.2 (6 พฤษภาคม 1979) ก็มีทั้งสองและyy Yดังนั้นจริง ๆ แล้วyyเป็นคำพ้องความหมายสำหรับY( Ypredates yy)


นี่คือคำตอบที่แท้จริง Yไม่ได้ปฏิบัติตามตรรกะเดียวกันกับคำสั่งอื่น ๆ เพราะมันมาก่อนสิ่งที่มันถูก retconned ภายหลังเป็นตัวย่อ
mechalynx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.