ฉันจะทำงานกับการแยกใน Vim โดยไม่มี Ctrl-W ได้อย่างไร


24

เทอร์มินัลของฉันไม่อนุญาตให้ฉันพิมพ์Ctrl+ Wเนื่องจากเป็นทางลัดในการปิดแท็บเทอร์มินัล

ผมชอบทำงานกับแยก C-Wแต่ฉันไม่สามารถหาวิธีที่จะทำได้โดยไม่ต้องใช้ใด นี้บังคับให้ฉันใช้แท็บเพราะผมสามารถสลับระหว่างพวกเขาด้วยgt, gTหรือ#gtที่ # เป็นจำนวน แต่ฉันพบนี้สะดวกน้อยกว่าแยกเป็นฉันเท่านั้นที่สามารถดูเนื้อหาของไฟล์เดียวในเวลา

ฉันไม่สามารถใช้งานmouse=aได้เนื่องจากเทอร์มินัลของฉันไม่รองรับ

ฉันจะทำงานกับการแยกใน Vim โดยไม่มีCtrl+ Wคอมโบได้อย่างไร


1
ใช้การแมปกับwincmd ตัวอย่างเช่นคุณสามารถจับคู่แผนที่: :nmap wj :wincmd j<cr>มันทำหน้าที่เหมือนกับCTRL-W j(เลื่อนไปที่หน้าต่างด้านล่าง) :help wincmd
Alex Kroll

@AlexKroll ทำไมคุณไม่โพสต์ว่าเป็นคำตอบ? :-)
Martin Tournoij

1
@Carpetsmoker มันไม่ครอบคลุมสำหรับปัญหานี้ฉันคิดว่า CTRL-W jใช้งานได้กับเคาน์เตอร์ (ไปที่หน้าต่าง n-th ด้านล่างจากปัจจุบัน) โซลูชันของฉันไม่ทำงาน
Alex Kroll

2
ปกติฉันไม่ชอบคำแนะนำเช่นนี้ แต่ฉันจะมองหาสถานีอื่น <C-W>มีประโยชน์มากเกินไปทางลัด (ไม่เพียง แต่ในหลาย ๆ ที่ใน Vim แต่รวมถึง bash ด้วย) ที่จะถูกริบ ฉันอยากรู้ว่าเทอร์มินัลการเชื่อมโยงคีย์อื่น ๆ ถูกใช้งาน<C-T>อย่างไร? อย่างน้อยที่สุดฉันจะดูว่าสิ่งเหล่านี้สามารถกำหนดค่าได้ในเทอร์มินัลหรือไม่
tommcdo

คำตอบ:


23

คุณสามารถทำการแมป<C-w>ไปยังชุดค่าผสมอื่นได้ตัวอย่างเช่น:

:nnoremap <C-e> <C-w>

ตอนนี้คุณสามารถใช้และมันจะทำหน้าที่เป็นถ้าคุณได้กด<C-e><C-w>

สิ่งนี้จะเขียนทับการ<C-e>แมปเริ่มต้น(เลื่อนลง) Vim ใช้ปุ่มทุกปุ่มบนแป้นพิมพ์อยู่แล้วและวิธีเดียวที่จะป้องกันไม่ให้ใช้ปุ่มผู้นำซึ่งทำหน้าที่เหมือน "คำนำหน้า":

:nnoremap <Leader>w <C-w>

ยกเว้นว่าคุณได้ทำการแมปใหม่<Leader>คุณสามารถใช้งาน\wได้ ฉันชอบสิ่งนี้จริง ๆ เพราะฉันไม่ชอบการกดแป้น CTRL +

ดู<Leader> คืออะไร และ ฉันจะทราบได้อย่างไรว่า <Leader> ตั้งค่าไว้ที่ใด และเป็นไปได้ไหมที่จะทำการแมปใหม่อีกครั้ง .


แก้ปัญหาของฉัน เพิ่มการแมปลงใน vimrc ของฉันและทดสอบอีกเล็กน้อยโดยไม่มีปัญหา
Mateon1

13

ที่จริงผมใช้:wincmdบ่อยกว่าCtrl+ เพราะผมพบว่ามันง่ายต่อการพิมพ์ยากW:winc

ยกตัวอย่างเช่นเทียบเท่ากับCtrl+ คือW L:winc l


7

ฉันได้ตั้งค่า remaps ต่อไปนี้ในของฉัน.vimrc:

nmap <C-h> <C-w>h
nmap <C-j> <C-w>j
nmap <C-k> <C-w>k
nmap <C-l> <C-w>l

ตอนนี้ฉันสามารถใช้Ctrl+hเพื่อย้ายไปที่หน้าต่างด้านซ้ายCtrl+lเพื่อย้ายไปที่หน้าต่างด้านขวา ฯลฯ ดูเหมือนว่าเหมาะสมกับการนำทางปกติของ Vim


4
โปรดทราบว่าการจับคู่ Ctrl + h ในเทอร์มินัลอาจไม่ได้ผลเสมอไปเนื่องจากมักจะเป็นปุ่ม Backspace ดูคำตอบนี้และคำถามนี้
Martin Tournoij

นอกจากนี้คุณอาจใช้nnoremap <cr> <c-w>wเนื่องจากปุ่มส่งคืนไม่ได้ใช้งานมากนักในโหมดปกติ จากนั้นก็สามารถปั่นจักรยานผ่านทางแยกได้อย่างง่ายดาย
หวังว่า

5

ในการจัดการกับ splits ฉันใช้submode-pluginซึ่งสะดวกสบายจริง ๆ : ช่วยให้คุณสร้างโหมดใหม่ ("โหมด" เช่นในโหมดปกติ, โหมดภาพ, โหมดแทรก, ฯลฯ ... ) ซึ่งคุณกำหนดการเชื่อมโยงคีย์ใหม่ .

เมื่อคุณไม่ต้องใช้Ctrl+wอีกต่อไปและเมื่อคุณอยู่ในโหมดใหม่ปุ่มทั้งหมดมีอิสระในการผูก: ไม่มีปัญหามากขึ้นเช่น "ประณามฉันไม่สามารถหาชุดค่าผสมที่สำคัญซึ่งเป็นการแสดงความหมายและยังไม่ได้แมป "

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


ฉันสร้างโหมดใหม่ที่ฉันเรียกWindowsModeซึ่งฉันจัดการกับตัวแยก:

call submode#enter_with('WindowsMode', 'n', '', '<Leader>k', ':echo "windows mode"<CR>')
call submode#leave_with('WindowsMode', 'n', '', '<Leader>')

เส้นเหล่านี้หมายความว่าฉันเข้าสู่โหมดด้วยLeaderkและฉันออกจากโหมดด้วยLeader: หลังจากฉันกดปุ่มLeaderkทั้งหมดที่ฉันกดจะ:

  • ไม่ทำอะไรเลยถ้าฉันไม่ได้กำหนดแผนที่สำหรับพวกเขาในโหมดนี้
  • ทำสิ่งที่ฉันตัดสินใจทำแผนที่ในโหมดนี้ (ดูคำตอบที่เหลือ)
  • กลับไปที่โหมดปกติถ้าฉันโดน Leader

เมื่อฉันอยู่ในWindowsModeสายเหล่านี้ให้hjklนำทางผ่านแยกเช่นCtrl+whjkl

" Change of windows with hjkl
call submode#map('WindowsMode', 'n', '', 'j', '<C-w>j')
call submode#map('WindowsMode', 'n', '', 'k', '<C-w>k')
call submode#map('WindowsMode', 'n', '', 'h', '<C-w>h')
call submode#map('WindowsMode', 'n', '', 'l', '<C-w>l')

ฉันใช้บรรทัดเหล่านี้เพื่อแยกหน้าต่างด้วย/และ!:

" split windows with / and !
call submode#map('WindowsMode', 'n', '', '/', '<C-w>s')
call submode#map('WindowsMode', 'n', '', '!', '<C-w>v')

และqปิดการแยก:

call submode#map('WindowsMode', 'n', '', 'q', '<C-w>c')

ย้ายตัวแยกด้วยCtrlhjkl:

call submode#map('WindowsMode', 'n', '', '<C-j>', '<C-w>J')
call submode#map('WindowsMode', 'n', '', '<C-k>', '<C-w>K')
call submode#map('WindowsMode', 'n', '', '<C-h>', '<C-w>H')
call submode#map('WindowsMode', 'n', '', '<C-l>', '<C-w>L')

Vim-submode อนุญาตให้ทำสิ่งที่ทรงพลังมากมายดูเอกสารสำหรับรายละเอียดเพิ่มเติม


แก้ไขวิธีการของ submode หน้าต่างก็คือการอธิบายไว้ที่นี่ ฉันคิดว่าวิธีการที่ผู้เขียนใช้นั้นใกล้เคียงกว่าที่จะตอบคำถาม: ที่นี่ถูกใช้เพื่อสร้างโหมดใหม่ แต่การ<c-w>somethingแมปทั้งหมดพร้อมใช้งานด้วยปุ่มเดียวกันใน submode:

" Go through every letter
for key in ['a','b','c','d','e','f','g','h','i','j','k','l','m',
\           'n','o','p','q','r','s','t','u','v','w','x','y','z']
  " maps lowercase, uppercase and <C-key>
  call submode#map('window', 'n', '', key, '<C-w>' . key)
  call submode#map('window', 'n', '', toupper(key), '<C-w>' . toupper(key))
  call submode#map('window', 'n', '', '<C-' . key . '>', '<C-w>' . '<C-'.key . '>')
endfor

" Go through symbols. Sadly, '|', not supported in submode plugin.
for key in ['=','_','+','-','<','>']
  call submode#map('window', 'n', '', key, '<C-w>' . key)
endfor

วิธีนี้ทุกแมป<c-w>lowerCaseKey, <c-w>upperCaseKey, <c-w><c-Key>และแมป<c-w>=_+-<>ทั้งหมดสามารถเข้าถึงได้ในโหมดหน้าต่างโดยไม่มีคำนำหน้า<c-w>

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