2012-02-29 29 views
6

Làm cách nào để nối hai dòng trong vim và để con trỏ ở vị trí ban đầu thay vì nhảy đến điểm hợp nhất?Tham gia hai dòng trong vim mà không cần di chuyển con trỏ

Ví dụ, lấy hai dòng sau đây với con trỏ ở vị trí chỉ định bởi các dấu nháy:

this is ^line one 
this is line two 

Ghép bởi J sản xuất:

this is line one ^this is line two 

Làm thế nào tôi có thể sản xuất:

this is ^line one this is line two 

Tôi đã thử những thứ như CTRL-O và các biến thể của ''. Không ai trong số này dường như làm việc. Họ đi đến đầu dòng, không đến vị trí con trỏ ban đầu.

Trả lời

9

cách tiếp cận khác mà không dậm về nhãn hiệu sẽ là:

:nnoremap <silent> J :let p=getpos('.')<bar>join<bar>call setpos('.', p)<cr> 

Nhiều chi tiết hơn nhưng nó ngăn bạn mất dấu.

  • :nnoremap - Non-recursive đồ
  • <silent> - Không tiếng vang bất cứ điều gì khi bản đồ được nhấn
  • J - Key để lập bản đồ
  • :let p=getpos('.') - Lưu trữ vị trí con trỏ
  • <bar> - chỉ huy tách (| cho bản đồ, xem :help map_bar)
  • join - Lệnh cũ f hoặc của bình thường J
  • <bar> - ...
  • call setpos('.', p) - Khôi phục vị trí con trỏ
  • <cr> - Chạy các lệnh
+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn! Tôi chỉ còn một yêu cầu nữa thôi. Bạn có thể nhanh chóng giải thích những gì các mảnh sau khi J đang làm gì? – cledoux

+0

Heh, tôi đã chỉnh sửa nó như bạn đã bình luận. :) –

+0

Đây là một câu hỏi vimscript ngớ ngẩn chung nhưng tôi cảm thấy thích hợp: Phạm vi bị ô nhiễm với biến 'p' là gì? Đây có phải là thứ có khả năng gây ra lỗi cấu hình lạ không? Có một lý do chính đáng để không đặt tên cho nó một cái gì đó cụ thể hơn nhiều (và ít dễ bị va chạm tên biến) hơn là 'p'? –

4

Bạn có thể làm điều đó thích:

:nnoremap <F2> mbJ`b 

này gán các hành động sau đây để các F2 chính:

  1. Đó là, tạo ra một dấu ấn (mb, nhưng LƯU Ý nếu bạn đã đặt trước đó là đánh dấu b, thay vì nó bị ghi đè!)
  2. J oin các dòng
  3. Jump trở lại điểm cũ ('b)
+0

Có thể là giá trị chỉ ra, trong trường hợp nó không xảy ra với ai đó, điều này sẽ ghi đè lên dấu 'b' nếu nó được đặt. – Kevin

+0

Nếu tôi muốn kết thúc ở đầu của dòng, điều này sẽ làm việc. Tuy nhiên đó không phải là những gì. – cledoux

+4

Đó là lý do tại sao bạn sử dụng ', không phải ' –

0
chức năng

Utility mà bạn có thể sử dụng cho porpuses khác

" Utility function that save last search and cursor position 
" http://technotales.wordpress.com/2010/03/31/preserve-a-vim-function-that-keeps-your-state/ 
" video from vimcasts.org: http://vimcasts.org/episodes/tidying-whitespace 
if !exists('*Preserve') 
    function! Preserve(command) 
     try 
      " Preparation: save last search, and cursor position. 
      let l:win_view = winsaveview() 
      let l:old_query = getreg('/') 
      silent! execute 'keepjumps ' . a:command 
     finally 
      " Clean up: restore previous search history, and cursor position 
      call winrestview(l:win_view) 
      call setreg('/', l:old_query) 
     endtry 
    endfunction 
endif 

Dưới đây là giải pháp sử dụng các chức năng trên, lợi thế của nó: Liệu không chiếm bất kỳ thanh ghi nào

" join lines without moving the cursor (gJ prevent adding spaces between lines joined) 
nnoremap J :call Preserve("exec 'normal! J'")<cr> 
nnoremap gJ :call Preserve("exec 'normal! gJ'")<cr> 

BTW: Nhiều hơn hai ví dụ về cách bạn có thể sử dụng Preserve chức năng

"Hủy bỏ thêm dấu cách ở cuối ONF dòng

fun! CleanExtraSpaces() 
    call Preserve('%s/\s\+$//ge') 
endfun 
com! Cls :call CleanExtraSpaces() 
au! BufwritePre * :call CleanExtraSpaces() 

" Reident toàn bộ tập tin

call Preserve('exec "normal! gg=G"') 
Các vấn đề liên quan