มีวิธีการนามแฝง `: w'` to`: w` เพื่อหลีกเลี่ยงการสร้างไฟล์ชื่อ '?


9

เป็นครั้งคราว, พิ้งกี้ของฉันจะกินหญ้าที่สำคัญในขณะที่เอื้อมมือไปหยิบใส่ผลใน':w'<Enter>

ฉันได้พยายาม:

cabbrev w' :w
cabbrev w\' :w
cabbrev "w'" :w

ไม่ทำงานเลย มีวิธีการนามแฝง:w'ไป:wหรือไม่?

ฉันยังใช้ cmdwin ( :help cmdwin+ nnoremap : :<C-F>) แทนบรรทัดคำสั่งปกติดังนั้นคะแนนโบนัสถ้ามันใช้งานได้เช่นกัน


3
ฮะ; ฉันมีปัญหาเดียวกันกับ \
Martin Tournoij

คำตอบ:


8

ดังที่ Peter Rincker ชี้ให้เห็นcmaps สามารถขยายไปยังที่อื่นได้เช่นกันดังนั้น a cnoreabbrevจะดีกว่า :

cnoreabbrev w' w

หรือปลอดภัยที่สุดขอบคุณ Peter อีกครั้ง:

cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"

โดยการตรวจสอบอย่างชัดเจนว่าบรรทัดคำสั่งมีเฉพาะw'การขยายที่ไม่ต้องการในสถานการณ์สามารถหลีกเลี่ยงได้

คุณสามารถใช้cmap:

cmap w' w

คุณยังต้องกดEnterแต่'ตอนนี้ควรละเว้นโดยไม่ตั้งใจ

หากคุณกำลังใช้cmdwinงานการinoremapตั้งค่าautocmdอาจมีประโยชน์:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'

ฉันวิ่ง:cmap w' wแต่ไม่มีการเปลี่ยนแปลงพฤติกรรม ยังคงส่งผลในการเขียนไปยังแฟ้มชื่อ:w' . '"'" [New] 0L, 0C written
mwcz

@mwcz 'จริงๆแล้วจะปรากฏขึ้นเมื่อคุณกดมันหลังจากw? มันไม่ควรถ้าcmapสร้างเสร็จเรียบร้อยแล้ว - CMAP LHS เต็มไปโดยอัตโนมัติด้วย RHS ดังนั้นหากคุณกดก็ยังควรจะแสดงเท่านั้น' w
muru

1
ระวังด้วยเปล่าcmapและcabbrevของ พวกเขาจะดำเนินการ / ขยายในโหมดอื่นและที่อื่น ๆ เช่นและ:s/'follow'/foo /'follow'โปรดดูการเปลี่ยนแปลงเสียงเรียกเข้าดังต่อไปนี้: ฟังก์ชัน x เพื่อลบบัฟเฟอร์แทนการบันทึก & ออกหรือใช้cmdalias.vim
Peter Rincker

1
ปลอดภัยกว่าดีกว่าขออภัย:cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
Peter Rincker

ใช่'ยังคงปรากฏขึ้น แต่ฉันเพิ่งคิดว่ามันเป็นเพราะฉันใช้ cmdwin เพื่อป้อนคำสั่งและ cmdwin เป็นเพียงบัฟเฟอร์ปกติจึงcmap/cnoreabbrevไม่ทำงานที่นั่น การอัพเดตคำตอบด้วยnoreabbrevตัวเลือกสำหรับผู้ใช้ cmdwin :) ขอบคุณ !!!
mwcz

0

วิธีนี้ใช้ได้กับฉัน:

:ca w' w

หรือคุณสามารถตั้งค่ากลุ่มของคุณเพื่อบันทึกบัฟเฟอร์ปัจจุบันเมื่อคุณกด Esc สองครั้งเช่น

:map <Esc><Esc> :w<CR>

หรือใช้การจับคู่ต่อไปนี้เพื่อบันทึกไฟล์โดยCtrl+ sหรือF2:

nmap <c-s> :w<CR>
vmap <c-s> <Esc><c-s>gv
imap <c-s> <Esc><c-s>

nmap <F2> :update<CR>
vmap <F2> <Esc><F2>gv
imap <F2> <c-o><F2>

หมายเหตุ: F2 จะบันทึกเฉพาะในกรณีที่จำเป็นและส่งคืนผู้ใช้ไปยังโหมดแทรก (หรือเรียกคืนการเลือกภาพ) ตามต้องการ

แหล่งที่มา: บันทึกไฟล์ที่ vim wikia

หรือใช้ทางเลือกต่อไปนี้:

  • :up( :update) สำหรับ:w
  • ZQ สำหรับ :q
  • ZZสำหรับ:wqหรือ:x

สังเกตเครื่องหมายคำพูดในคำถาม ไม่:w' :wฉันต้องการใช้:wโดยไม่ตั้งใจตีซึ่งเขียนไฟล์ฉันต้องแล้ว' rm \'เคล็ดลับที่ดีแม้ว่า
mwcz

1
Ctrl-S ไม่ส่ง sigstop - หากโปรแกรมหยุดทำงานอาจเป็นเพราะบัฟเฟอร์เต็ม ดูunix.stackexchange.com/questions/13629/… '
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.