Pindahkan kursor ke awal karakter bukan spasi di baris dalam Vim

49

Dalam Vim, apakah ada cara untuk memindahkan kursor ke awal karakter non-spasi putih dalam satu baris? Misalnya, bagaimana saya bisa memindahkan kursor ke "S" di baris kedua di bawah ini?

Garis pertama
    Baris kedua

Jika itu penting, saya terutama menggunakan MacVim, tetapi saya juga ingin bisa melakukan ini dari konsol.

Terima kasih!

Joe Mornin
sumber

Jawaban:

58

Jika saya mengerti benar - dari :h ^:

^ To the first non-blank character of the line.
  |exclusive| motion.

(berbeda dengan 0, yang membawa Anda ke awal, terlepas dari spasi putih atau tidak)

slhck
sumber
1
Memberi +1 pada 0komentar
Roy Truelove
47

Alih-alih menekan ^Anda dapat menekan _(garis bawah) untuk melompat ke karakter non-spasi pertama pada baris yang sama dengan kursor aktif.

+dan -lompat ke karakter non-spasi pertama pada baris berikutnya / sebelumnya.

(Perintah-perintah ini hanya bekerja dalam mode perintah, bukan dalam mode sisipkan.)

Ben
sumber
8

Juga mungkin berguna: + dan - akan memindahkan kursor ke atas atau ke bawah, masing-masing, ke karakter pertama yang tidak kosong.

Jared
sumber
4

di bawah ini cuplikan dari oleh .vimrc
^[[1~dibuat dengan menekan ctrl+vdanHome

"jump to first non-whitespace on line, jump to begining of line if already at first non-whitespace
map <Home> :call LineHome()<CR>:echo<CR>
imap <Home> <C-R>=LineHome()<CR>
map ^[[1~ :call LineHome()<CR>:echo<CR>
imap ^[[1~ <C-R>=LineHome()<CR>
function! LineHome()
  let x = col('.')
  execute "normal ^"
  if x == col('.')
    execute "normal 0"
  endif
  return ""
endfunction
Andrew Sohn
sumber
Terima kasih, ini yang saya cari. Perilaku ini umum pada editor saat ini (Atom / VSCode / Sublime untuk beberapa nama) dan saya sudah terbiasa dengan itu ...
YoYoYonnY
0

Memperluas jawaban Andrew Sohn, jika Anda ingin menggunakan 0 untuk perilaku ini, cukup bungkus seperti ini:

function! LineHome()
  let x = col('.')
  execute "normal ^"
  if x == col('.')
    unmap 0
    execute "normal 0"
    map 0 :call LineHome()<CR>:echo<CR>
  endif
  return ""
endfunction 
pengguna2448373
sumber
-1

Saya baru saja memetakan ulang kunci 0 ke ^

Edit ~ / .vimrc Anda

set visualbell t_vb=
map 0 ^
Wei Sunding
sumber