หน้าต่างรอยขีดข่วนคืออะไร?


11

scratchบางครั้งผมเห็นเปิดหน้าต่างที่มีชื่อ

ฉันรู้ว่ามันเป็นบัฟเฟอร์ / หน้าต่างชั่วคราว

ฉันจะสร้างลังได้อย่างไร

:h scratch ไม่มีอะไรคืน

คำตอบ:


11

อาจเป็นบัฟเฟอร์รอยขีดข่วนซึ่งสามารถตั้งชื่อได้ จากความช่วยเหลือ:

เกา

มีข้อความที่สามารถละทิ้งได้ตลอดเวลา มันจะถูกเก็บไว้เมื่อปิดหน้าต่างจะต้องถูกลบอย่างชัดเจน การตั้งค่า:>

      :setlocal buftype=nofile
      :setlocal bufhidden=hide
      :setlocal noswapfile
  The buffer name can be used to identify the buffer, if you give it a meaningful name.

:help special-buffersนี้สามารถพบได้ใน


1
:hคำสั่งใดที่ใช้ในการเข้าถึงความช่วยเหลือนี้
wizzup

2
: h buffer จากนั้นอ่านข้อมูลใน "บัฟเฟอร์ชนิดพิเศษ" คุณมาถูกทางแล้ว
wbogacz

เมื่อคุณเปิดไฟล์โดยใช้คำสั่ง Vim ใด ๆ บัฟเฟอร์จะถูกสร้างขึ้นโดยอัตโนมัติ ตัวอย่างเช่นถ้าคุณใช้:editไฟล์เพื่อแก้ไขไฟล์บัฟเฟอร์ใหม่จะถูกสร้างขึ้นโดยอัตโนมัติ บัฟเฟอร์ที่ว่างเปล่าที่สามารถสร้างขึ้นโดยการป้อน:enewหรือหรือ:new :vnewจาก Vim buffer คำถามที่พบบ่อย: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG

2
@wizzup :helpgrep scratchเปิดใช้งานเป็นผลลัพธ์หนึ่งใน 10 (ในการติดตั้งของฉัน)
รวย

2

ฉันจำเคล็ดลับที่เป็นกลุ่ม (ซึ่งถูกย้ายไปยัง vim.wikia) ในหัวเรื่อง

ฟังก์ชั่นเวอร์ชั่นล่าสุดที่ฉันใช้เพื่อสร้างบัฟเฟอร์รอยขีดข่วนได้ตั้งค่า:

  • 'buflisted' เป็นเท็จ
  • 'readonly'

(จากปลั๊กอินไลบรารี VimL ของฉัน: lh-vim-lib)

function! lh#buffer#scratch(bname, where) abort
  try
    set modifiable
    " The next function takes care of working around this damn E36
    call lh#window#create_window_with(a:where.' sp '.escape(substitute(a:bname, '\*', '...', 'g'), '#%'))
  catch /.*/
    throw "Can't open a buffer named '".a:bname."'!"
  endtry
  setlocal bt=nofile bh=wipe nobl noswf ro
  return bufnr('%')
endfunction

2

บัฟเฟอร์ 'เริ่มต้น' เป็นเพียงคำที่ไม่เป็นทางการสำหรับสถานที่ที่จะพิมพ์เนื้อหาชั่วคราวโดยพลการ

การปฏิบัติตามคำตอบที่ยอมรับและคำถามอื่นฉันสร้างฟังก์ชันต่อไปนี้ใน vimrc ของฉัน

ฟังก์ชั่นสร้างบัฟเฟอร์เปล่าในหน้าต่างปัจจุบันและตั้งชื่อว่า 'รอยขีดข่วน' บัฟเฟอร์รอยขีดข่วนไม่ได้รับการป้องกันหากคุณพยายามที่จะออก มันจะถูกทิ้งโดยไม่แจ้งให้ทราบแม้ว่าจะมีการเปลี่ยนแปลงที่ไม่ได้บันทึกหากคุณออกจาก Vim หรือเช็ด ( :bw)

ใส่ฟังก์ชั่นนี้ใน vimrc ของคุณ :call Scratch()เพื่อสร้างการใช้บัฟเฟอร์รอยขีดข่วน

function! Scratch()
    split
    noswapfile hide enew
    setlocal buftype=nofile
    setlocal bufhidden=hide
    "setlocal nobuflisted
    "lcd ~
    file scratch
endfunction

:@"คุณสามารถทดสอบนี้ได้อย่างรวดเร็วโดยการลากสายแล้ว :call Scratch()จากนั้นคุณสามารถลอง

มีการใช้การแบ่งดังนั้นบัฟเฟอร์ปัจจุบันของคุณจะไม่ได้รับผลกระทบเมื่อคุณสร้างบัฟเฟอร์การลบ

(หากคุณต้องการละเว้นsplitจากฟังก์ชันดังนั้นบัฟเฟอร์ปัจจุบันของคุณจะเป็น "ซ่อนอยู่" (ไม่อยู่ในหน้าต่างอีกต่อไป) เมื่อคุณสร้างบัฟเฟอร์เริ่มต้น Vim จะยังคงหยุดและแจ้งให้คุณถ้าคุณพยายามที่จะเลิกกับการเปลี่ยนแปลงที่ไม่ได้บันทึกไว้ กันชน).

โดยปกติแล้วบัฟเฟอร์รอยขีดข่วนจะมีไดเรกทอรีการทำงานเดียวกันของบัฟเฟอร์ที่คุณอยู่เมื่อคุณเรียกใช้ฟังก์ชัน Scratch ฉันได้รวมบรรทัดออกความคิดเห็นเพื่อเปลี่ยนไดเรกทอรีทำงานบัฟเฟอร์รอยขีดข่วนเป็นบ้าน นี่คือสำหรับผู้ที่มีบรรทัดสถานะตลกที่อาจแสดงเส้นทางของไดเรกทอรีปัจจุบันเป็นเส้นทางบัฟเฟอร์ หรือเพียงแค่สำหรับผู้ที่ชอบมัน

คุณสามารถตั้งค่าบัฟเฟอร์รอยขีดข่วนเป็น "แสดงรายการ" หรือ "ไม่แสดงรายการ" (แสดงรายการตามค่าเริ่มต้น) ถ้าคุณทำมันไม่แสดงคุณจะไม่เห็นมันในของคุณ:buffersรายการ :buffers!แต่มันจะอยู่ใน ยกเลิกการใส่เครื่องหมายข้อคิดเห็นnobuflistedบรรทัดหากคุณต้องการให้ไม่อยู่ในรายการ จดทะเบียนหรือไม่อยู่ในรายการคุณสามารถเปลี่ยนเป็นบัฟเฟอร์รอยขีดข่วน:b scratchได้ตลอดเวลา การทำให้บัฟเฟอร์ในรายการปรากฏทำให้เข้าถึงได้ง่ายขึ้นเล็กน้อย ตัวอย่างเช่น:sballจะรวมไว้ในการแยก

หากคุณใช้:bw(การลบบัฟเฟอร์) บนบัฟเฟอร์เริ่มต้น Vim จะลบเนื้อหาและลบบัฟเฟอร์โดยไม่มีการเตือน หากคุณใช้:bd(ลบบัฟเฟอร์) บนบัฟเฟอร์เริ่มต้น Vim จะลบเนื้อหาโดยไม่มีการเตือนและทำให้บัฟเฟอร์ไม่อยู่ในรายการ

คุณสามารถสร้างบัฟเฟอร์รอยขีดข่วนได้หลายอัน Vim เริ่มบ่น แต่คุณยังคงมีคนเพิ่มเติม


2
ผู้ดำเนินการไม่จำเป็น ฟังก์ชั่นของคุณสามารถรัน enew เป็นต้น
D. Ben Knoble

1
หากคุณตั้งค่าbuftype=hide ก่อนที่จะตั้งชื่อการเปลี่ยนไดเรกทอรีนั้นไม่จำเป็นเพราะชื่อบัฟเฟอร์จะไม่ถูก "จัดการเหมือนชื่อไฟล์" นอกจากนี้อาจจะมีมูลค่าการกล่าวขวัญซึ่งจะช่วยป้องกันบัฟเฟอร์แสดงในการส่งออกของ'nobuflisted' :lsคุณเป็นคนพาดพิงถึงมัน แต่ไม่ได้พูดถึงมันอย่างชัดเจน
รวย

ขอบคุณสำหรับความคิดเห็นของคุณ @ D.BenKnoble ฉันได้ทำความสะอาดฟังก์ชันตามคำแนะนำของคุณ
NeilG

1
buftype=hideเป็นเรื่องไร้สาระแน่นอนและใช่ฉันกำลังพูดถึงจริงbuftype=nofile:) แต่ฉันไม่สามารถทำซ้ำพฤติกรรมที่คุณอธิบายและยังเชื่อว่าคำสั่งVim buffer names are always filenamesนั้นไม่ถูกต้อง ถ้าฉันลบcdบรรทัดออกจากฟังก์ชั่นของคุณแล้วเรียกใช้มันจะไม่มีเส้นทางในสเตทไลน์ของฉันหรือในเอ้าท์พุทของecho bufname('%')ฉันสงสัยว่านี่อาจเป็นปัญหากับสเตทไลน์ของคุณมากกว่าชื่อบัฟเฟอร์ 'statusline'ตัวเลือกของคุณตั้งไว้เป็นอะไร?
Rich

1
Aha! ดีใจที่เราเข้าใจแล้ว! ถ้าเป็นฉันฉันยังคงไม่ต้องการเปลี่ยนไดเรกทอรีในฟังก์ชั่น Scratch ดังนั้นแทนที่จะเปลี่ยนstatuslineเป็นสิ่งที่ชอบexpand(&buftype == 'nofile' ? '%' : '%:p:~:h')แต่ฉันคิดว่าตอนนี้เราเข้าสู่อาณาจักรแห่งความชอบส่วนตัวแล้ว หากคุณตัดสินใจที่จะยึดติดกับโซลูชันไดเรคทอรีการเปลี่ยนแปลงคุณควรใช้:lcdการ จำกัด การเปลี่ยนแปลงของหน้าต่างที่มีปัญหา แต่ควรเป็นวิธีที่ดีสำหรับคุณ อย่างไรก็ตามฉันคิดว่านี่เป็นคำตอบที่ดี +1!
รวย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.