2012-04-09 32 views
6

Cách tốt nhất để kiểm tra vimscript mà chế độ trực quan hiện đang hoạt động (khối hình ảnh hoặc hình ảnh) là gì?Kiểm tra chế độ Trực quan

Tôi đã đọc khoảng mode() nhưng tôi không thể làm cho nó hoạt động.
echo mode() không hoạt động đối với tôi
if mode() == "v" cũng không hoạt động đối với tôi.

+0

Bạn muốn làm gì nếu Chế độ chặn trực quan đang hoạt động? –

+0

'@Pavan, Nếu Chế độ chặn trực quan đang hoạt động, tôi muốn tính phần bắt đầu kết thúc khối (dòng + cột). Nếu chế độ trực quan đang hoạt động, tôi muốn chỉ tính toán điểm bắt đầu và dòng kết thúc của lựa chọn trực quan, chứ không phải các cột. – Reman

+0

Kiểm tra ': help visualmode()'. – Raimondi

Trả lời

5

Nhìn vào trợ giúp cho mode(). Phần liên quan:

  v  Visual by character 
      V  Visual by line 
      CTRL-V Visual blockwise 

Bạn cần phải được kiểm tra mode() == "\<C-V>" (literal ^V ký tự), không mode() == "v", để kiểm tra chế độ trực quan blockwise.

+0

Vâng tôi biết nhưng có thể không làm cho nó hoạt động. Nó không nhận ra một khối hình ảnh. Mã dòng lệnh echo là gì? – Reman

+0

Bạn có ý gì khi không thể làm cho nó hoạt động? Làm thế nào bạn đang cố gắng để kích hoạt nó? –

+0

'@Chris, như thế này: 'if mode() ==" CTRL-V "| echo "khối" | khác | "echo no block" | endif' - Nó không hoạt động tốt trong dòng lệnh. – Reman

1

@Remonn đã nói điều đó trong các nhận xét, nhưng điều đó không rõ ràng đối với tôi. Đây là cách tôi quản lý để xem kết quả:

function! F() 
    normal! gv 
    throw mode() 
endfunction 
vnoremap <F9> <ESC>:call F()<CR> 

Chuyển sang chế độ trực quan khác và sau đó nhấn F9 để xem.

Tôi cần ném vì dòng -- VISUAL -- bao gồm bất kỳ thông điệp echo nào. Bất cứ ai có thể echo trong chế độ VISUAL?

Nói chung, tôi nghĩ rằng điều tốt nhất để làm khi bạn sẽ cần mode() là làm cho hai bản đồ khác nhau, và sau đó, hoặc hai chức năng khác nhau mà làm những việc hoàn toàn khác nhau:

function! Fnorm() 
endfunction 

function! Fvis() 
endfunction 

nnoremap <F9> :call Fnorm()<CR> 
nnoremap <F9> <ESC>:call Fvis()<CR>gv 

hoặc một chức năng duy nhất và cung cấp các thông số khác nhau cho nó tùy thuộc vào ánh xạ:

function! F(param) 
endfunction 

nnoremap <F9> :call F(1)<CR> 
nnoremap <F9> <ESC>:call F(2)<CR>gv 

Một mẹo liên quan khác là phải làm gì nếu bạn muốn làm điều gì đó khi đang ở chế độ trực quan, như di chuyển con trỏ. Điều tốt nhất tôi có thể làm là:

function! Fvis() 
    normal! gv 
    cursor(1, 1) 
endfunction 

nnoremap <F9> <ESC>:call Fvis()<CR>gv 
+0

Hãy nhớ rằng để làm ánh xạ trong chế độ trực quan, bạn sử dụng 'v [no] remap' thay vì' n [no] remap', và bạn không muốn '' trong đó nếu lựa chọn là quan trọng.Vì vậy, ánh xạ của bạn trông giống như 'nnoremap : gọi Fnormal() ' và 'vnoremap : gọi Fvisual() '. làm thế nào tôi đã kết thúc ở đây nhưng nhận ra điểm này sau khi nhận được ở đây, tôi xác định chức năng của tôi như 'function! F() range' và sau đó làm' nnoremap : F() 'và' vnoremap : '<,'> F() '. –

Các vấn đề liên quan