Bagaimana saya bisa bekerja dengan split di Vim tanpa Ctrl-W?

24

Terminal saya tidak memungkinkan saya mengetik Ctrl+ W, karena itu jalan pintas untuk menutup tab terminal.

Saya suka bekerja dengan split, tetapi saya tidak dapat menemukan cara untuk melakukannya tanpa menggunakan C-W. Ini memaksa saya untuk menggunakan tab, karena saya dapat beralih di antara mereka dengan gt, gTatau di #gtmana # adalah angka, tetapi saya merasa ini kurang nyaman daripada pemisahan karena saya hanya dapat melihat konten dari satu file pada suatu waktu.

Saya juga tidak dapat menggunakan mouse=akarena terminal saya tidak mendukung itu.

Bagaimana saya bisa bekerja dengan split di Vim tanpa Ctrl+ Wcombo tersedia?

Mateon1
sumber
1
Gunakan pemetaan untuk wincmd Misalnya Anda dapat memetakan: :nmap wj :wincmd j<cr>ini bertindak sama seperti CTRL-W j(pindah ke jendela di bawah). :help wincmd
Alex Kroll
@AlexKroll Mengapa Anda tidak memposting itu sebagai jawaban? :-)
Martin Tournoij
1
@Carpetsmoker Ini bukan cakupan penuh untuk masalah ini saya pikir. CTRL-W jberfungsi dengan penghitung (buka jendela ke-n di bawah dari saat ini) solusi saya tidak.
Alex Kroll
2
Saya biasanya tidak menghargai saran seperti ini, tetapi saya akan mencari terminal lain. <C-W>terlalu cepat jalan pintas (tidak hanya di banyak tempat di Vim, tetapi juga di bash) untuk kehilangan. Saya ingin tahu apa ikatan kunci lain yang dikonsumsi oleh terminal - <C-T>? Paling tidak, saya akan melihat apakah ini dapat dikonfigurasi di terminal.
tommcdo

Jawaban:

23

Anda dapat memetakan kembali <C-w>ke kombinasi lain, misalnya:

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

Anda sekarang dapat menggunakan <C-e>dan itu akan bertindak seolah-olah Anda telah menekan <C-w>.

Ini akan menimpa <C-e>pemetaan default (gulir ke bawah). Vim sudah menggunakan setiap tombol pada keyboard, dan satu-satunya cara untuk mencegah ini adalah menggunakan kunci pemimpin, yang bertindak seperti "awalan":

:nnoremap <Leader>w <C-w>

Kecuali Anda memetakan ulang <Leader>, sekarang Anda dapat menggunakan \w(setelah satu sama lain). Saya sebenarnya lebih suka ini karena saya tidak suka kombinasi tombol CTRL +.

Lihat Apa itu <Leader>? dan Bagaimana saya bisa mengetahui apa yang diatur ke <Leader>? Dan apakah mungkin untuk memetakan ulang <Leader>? .

Martin Tournoij
sumber
Memecahkan masalah saya. Menambahkan pemetaan ke vimrc saya dan menguji sedikit tanpa masalah.
Mateon1
13

Saya sebenarnya menggunakan :wincmdlebih sering daripada Ctrl+ Wkarena saya merasa lebih mudah untuk mengetik singkatan :winc.

Misalnya, setara dengan Ctrl+ W Ladalah :winc l.

pengguna530873
sumber
7

Saya telah menyiapkan remaps berikut di .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

Sekarang saya dapat menggunakan Ctrl+huntuk pindah ke jendela kiri, Ctrl+luntuk pindah ke jendela kanan, dll. Sepertinya cocok dengan navigasi normal Vim.

Yep_It's_Me
sumber
4
Perhatikan bahwa pemetaan Ctrl + h di terminal tidak selalu berhasil, karena ini sering kali merupakan tombol backspace. Lihat jawaban ini dan pertanyaan ini .
Martin Tournoij 3-15
Juga, Anda dapat menggunakan nnoremap <cr> <c-w>w, karena tombol kembali tidak banyak digunakan dalam mode normal. Maka mudah untuk melakukan siklus perpecahan.
Harapan
5

Untuk mengatasi perpecahan, saya menggunakan submode-plugin yang sebenarnya cukup nyaman: Ini memungkinkan Anda untuk membuat mode baru ("mode" seperti dalam mode normal, mode visual, mode insert, dll ...) di mana Anda menentukan binding kunci baru .

Dengan itu Anda tidak perlu menggunakan Ctrl+wlagi dan karena Anda berada dalam mode baru semua kunci bebas untuk mengikat: tidak ada lagi masalah seperti "Sialan saya tidak dapat menemukan kombinasi tombol yang sebagai penanda dan belum dipetakan "

Anda dapat menginstal plugin dengan pengelola plugin biasa, dan berikut adalah beberapa konfigurasi saya untuk memberi Anda beberapa inspirasi:


Saya membuat mode baru yang saya sebut WindowsModedi mana saya memanipulasi splits saya:

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

Baris-baris ini berarti bahwa saya masuk dalam mode dengan Leaderkdan saya keluar dari mode dengan Leader: Setelah saya menekan Leaderksemua tombol yang saya tekan akan:

  • Tidak melakukan apa pun jika saya tidak menetapkan pemetaan untuk mereka dalam mode ini
  • Lakukan apa yang saya putuskan untuk memetakannya dalam mode ini (lihat sisa jawabannya)
  • Kembali ke mode normal jika saya menekan Leader

Setelah saya berada di WindowsModegaris ini, lakukan hjklnavigasi melalui perpecahan sepertiCtrl+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')

Saya menggunakan garis-garis ini untuk membagi windows dengan /dan !:

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

Dan qtutup split:

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

Pindahkan pemisahan dengan 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 memungkinkan untuk melakukan banyak hal kuat, lihat dokumen untuk detail lebih lanjut.


EDIT Pendekatan lain dari submode Window dijelaskan di sini . Saya pikir metode yang digunakan oleh penulis bahkan lebih dekat untuk menjawab pertanyaan: Di sini digunakan untuk membuat mode baru tetapi semua <c-w>somethingpemetaan tersedia dengan kunci yang sama di 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

Dengan cara ini semua pemetaan <c-w>lowerCaseKey, <c-w>upperCaseKey, <c-w><c-Key>dan pemetaan <c-w>=_+-<>semuanya dapat diakses dalam modus jendela tanpa awalan<c-w>

statox
sumber