วิธีการเข้าสู่โหมดแทรกเมื่อเข้าสู่บานหน้าต่างเทอร์มินัล neovim


16

ฉันมีการแมปต่อไปนี้เพื่อให้ง่ายต่อการย้ายออกจากบานหน้าต่างเทอร์มินัลใน neovim:

tnoremap <C-h> <C-\><C-n><C-w>h
" Workaround since <C-h> isn't working in neovim right now
tnoremap <C-w>h <C-\><C-n><C-w>h
tnoremap <C-j> <C-\><C-n><C-w>j
tnoremap <C-k> <C-\><C-n><C-w>k
tnoremap <C-l> <C-\><C-n><C-w>l

ปัญหาเดียวคือเมื่อฉันย้ายกลับไปที่บานหน้าต่างเทอร์มินัลฉันต้องกดiเพื่อกลับสู่โหมดแทรก ฉันต้องการให้มันอยู่ในโหมดแทรกเสมอเมื่อฉันย้ายไปที่บานหน้าต่าง neovim ที่กำลังเรียกใช้เทอร์มินัล อะไรคือวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้?

คำตอบ:


18

ชื่อเทอร์มินัลบัฟเฟอร์เริ่มต้นด้วยterm://:

autocmd BufWinEnter,WinEnter term://* startinsert

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


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

autocmd BufLeave term://* stopinsert


ด้วยวิธีนี้ผมมีประสบการณ์นี้ปัญหา คุณจะรู้วิธีรอบ ๆ มันได้หรือไม่
Rastapopoulos

BufEnterautocmd ดูเหมือนว่ามันไม่ได้มีปัญหานี้
Rastapopoulos

3

การป้อนเทอร์มินัลบัฟเฟอร์ตั้งค่าbuftypeเป็นเทอร์มินัลคุณสามารถใช้สิ่งนี้แทน:

:au BufEnter * if &buftype == 'terminal' | :startinsert | endif

ฉันพบว่า: startinsert ใช้งานไม่ได้กับเทอร์มินัล vim 8 ตามโพสต์นี้ มีการระบุไว้อย่างชัดเจน:help terminalว่า ": startinsert ไม่ได้ผล" ฉันพบว่าใช้exec 'normal! i'งานได้แทน
เควิน

1
"ฉันพบว่า: startinsert ใช้งานไม่ได้กับเทอร์มินัล vim 8 แบบเนทีฟในโพสต์นี้" ช่างน่าเศร้า Vim มีมากมายให้เรียนรู้จาก NeoVim
trusktr

0

หรือดีกว่าเล็กน้อย:

  function! TerminalOptions()
    " /* folded code */
    silent au BufEnter <buffer> startinsert!
    silent au BufLeave <buffer> stopinsert!
  endfunction
  au TerminalOpen * call TerminalOptions()

ซึ่ง<buffer>จะทำให้คำสั่ง au ที่จะนำมาใช้ในท้องถิ่นดังนั้นสำหรับประเภทบัฟเฟอร์ termial นอกจากนี้ยังเป็นประโยชน์สำหรับการเปลี่ยนดังนั้นการตั้งค่าสำหรับเทอร์มินัลเท่านั้น เช่น swtich จากเส้นสัมพัทธ์ถึงสัมบูรณ์;)

อีกทั้ง ..... ฉันไม่สามารถ:startinsertทำงานได้แม้ว่าเอกสารทั้งหมดจะชี้ไปที่นั้น ฉันต้องทำดังต่อไปนี้:

    au BufEnter <buffer> exec "normal i"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.