เลือกรายการในรายการเติมข้อความอัตโนมัติเป็นกลุ่มโดยไม่ต้องแทรกตัวแบ่งบรรทัด


22

คุณลักษณะที่ค่อนข้างน่ารำคาญของเสียงเรียกเข้าคือถ้าคุณอยู่ในโหมดแทรกและทำการเติมข้อความอัตโนมัติ (Ctrl-N), ปุ่มลูกศรลงไปยังรายการที่ต้องการและกดปุ่ม Enter จากนั้นมันจะแทรกรายการ จากนั้นต้องลบ

มีวิธีเลือกรายการจากรายการเติมข้อความอัตโนมัติโดยไม่ต้องขึ้นบรรทัดใหม่ที่ไม่ต้องการหรือไม่


1
นี่ไม่ใช่วิธีการทำงานสำหรับฉัน ... ฉันเลือกบางสิ่งแล้วกด Enter และเคอร์เซอร์ยังคงอยู่ในบรรทัดเดียวกันหลังจากนั้น
goldilocks

คำตอบ:


37

ขึ้นอยู่กับว่าคุณอยู่ในเมนูใด (ดู:help popupmenu-completion) ฉันเข้าใจจากคำถามของคุณว่าคุณอยู่ในสถานะ 2 (เนื่องจากคุณกดปุ่มลูกศรเพื่อค้นหาความสำเร็จ) อย่างไรก็ตามพฤติกรรมเริ่มต้นสำหรับEnterในสถานะ 2 คือการแทรกการเติมให้สมบูรณ์โดยไม่ต้องขึ้นบรรทัดใหม่ สิ่งที่คุณอธิบายเป็นปกติพฤติกรรมของรัฐ 1 (ซึ่งเมื่อคุณใช้Ctrl+ N/ Ctrl+ P.)

วิธีที่ใช้งานได้อย่างต่อเนื่องในทุกรัฐคือการใช้งาน+Ctrl Yฉันชอบที่จะจดจำ Y ว่า "ใช่ยอมรับคำนั้น" นอกจากนี้ยังเป็นไปได้ที่จะเริ่มพิมพ์ข้อความที่ควรอยู่หลังคำที่สมบูรณ์เว้นแต่ว่าคุณได้ทำการแมปสิ่งต่าง ๆ ตามคำตอบของ geedoubleya

ในบริบทเดียวกันคุณสามารถกดCtrl+ Eเพื่อยกเลิกเมนูและปล่อยให้ข้อความเหมือนเดิมก่อนที่คุณจะเรียกใช้ หากคุณคุ้นเคยกับการจับคู่ของCtrl+ EและCtrl+ Yในบริบทอื่น ๆ (เช่นเพื่อเลื่อนขึ้นหรือลงในโหมดปกติหรือเพื่อแทรกอักขระด้านล่างหรือเหนือเคอร์เซอร์ในโหมดแทรก) นั่นเป็นวิธีหนึ่งในการจดจำที่นี่ ฉันคิดว่าคุณอาจคิดว่ามันเป็น "ออก" เมนูหรือคล้ายกัน

ดู:help popupmenu-keysเพิ่มเติม


2
อ้านั่นเหมาะสมแล้ว ฉันใช้ Ctrl-N เพื่อเปิดเมนูแบบเลื่อนลง ฉันเพิ่งใช้ปุ่มลูกศรเพื่อเลื่อนลง ฉันไม่รู้ว่าคุณสามารถใช้ปุ่มลูกศรเพื่อเปิดดรอปดาวน์ได้
Tyler Durden

ปุ่มลูกศรไม่สามารถเปิดดรอปดาวน์ได้ในการกำหนดค่าเริ่มต้น ความแตกต่างที่ฉันพูดถึงเกี่ยวกับการนำทางเมนูเมื่อเปิดแล้ว
echristopherson

ด้วยเหตุผลบางอย่างเมื่อฉันพยายามทำสิ่งนี้ด้วย <kbd> Ctrl </kbd> + <kbd> Y </kbd> มันเยื้องบรรทัดเช่นกันซึ่งไม่พึงประสงค์ มีความคิดอะไรเกี่ยวกับสาเหตุที่จะเกิดขึ้น?
mpacer

ฉันไม่เคยพบสิ่งนั้น อาจเป็นเพราะการตั้งค่าเยื้องหรือปลั๊กอินที่คุณลืมไป ผมจะถามในรายการทางกลุ่มของ: vim.org/maillist.php
echristopherson

6

ส่วนตัวผมใช้อันนี้:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

ทุกคนที่ใช้ปลั๊กอิน CtrlPอาจพบว่าการทำแผนที่นี้สะดวก


3

ฉันรู้ว่ามันเก่า แต่การสนับสนุนลูกหมูเกี่ยวกับคำตอบของ geedoubleya ตั้งแต่แม้ว่าคำตอบของ echristopherson นั้นให้ข้อมูลและยอดเยี่ยมหากใครต้องการวิธีแก้ปัญหาที่รวดเร็วและสกปรก:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))

2

เป็นอีกทางเลือกหนึ่งในการใช้ปุ่มลูกศรเปิดใช้jงานkปุ่ม& เพื่อเลื่อนดูรายการเติมข้อความอัตโนมัติ

การทำเช่นนี้จะเปลี่ยนบรรทัดปัจจุบันให้ตรงกับคำที่เลือกในขณะที่คุณเลื่อน

ดังนั้นคุณไม่ต้องกด Enter เนื่องจากเคอร์เซอร์ยังอยู่ในโหมดแทรกที่ส่วนท้ายของคำที่ถูกแทนที่

หากต้องการเปิดใช้งานให้เพิ่มสิ่งนี้ใน. vimrc ของคุณ (ขอบคุณคนอื่น ๆ ที่ stackoverflow):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

แยกกันแทนที่จะใช้ปุ่มลูกศรคุณสามารถทำซ้ำสิ่งCtrl-nที่จะสาปแช่งตัวเลือก ( Ctrl-pเพื่อย้อนกลับ) และแทนที่บรรทัดปัจจุบันในขณะที่มันเคลื่อนที่โดยไม่จำเป็นต้องใช้Enterหรือการจับคู่คีย์ vim


พฤติกรรมนี้อาจสับสนเล็กน้อยเนื่องจากเป็นทั้ง 1) ในโหมดแทรกและ 2) ตีความ j และ k เพื่อทำสิ่งที่ไม่ได้ทำในโหมดแทรก โดยเฉพาะอย่างยิ่งคุณไม่สามารถเลือกรายการเมนูจากนั้นติดตามรายการนั้นโดยตรงโดยเริ่มจาก j หรือ k
echristopherson

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