Làm cách nào để chuyển từ một cách dễ dàng (trong VIM)?


11

Tôi không đủ giỏi về vim để xác định xem điều này có thể xảy ra hay không (đó là lý do tại sao tôi đến với superuser và không tốt) ~ có cách nào trong vim để dễ dàng chuyển đổi hai từ không?

ví dụ như trong def function(param1, param2)có một cách nhanh chóng / dễ dàng để thay đổi điều đó thành def function(param2, param1)???

Câu trả lời:


13

Tôi không nhớ nơi ban đầu tôi có thứ này, nhưng nó đã ở trong ~ / .vimrc của tôi trong ít nhất vài năm:

" Swap the word the cursor is on with the next word (which can be on a
" newline, and punctuation is "skipped"):
nmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>:noh<CR>

Sau khi bạn đã xác định điều này, tất cả những gì bạn cần làm là đặt con trỏ ở đâu đó trên "param1" ở chế độ bình thường và gõ: gw


4
Tôi cũng có nó, nó đến từ wiki vim.
romainl

5

+1 cho câu trả lời của @ Heptite.

Để hoàn thiện hơn, đây là những gì tôi có trong .vimrc:

" push current line up or down
nnoremap <leader><Up> ddkP
nnoremap <leader><Down> ddp

" exchange character under cursor with the next character without moving the cursor
nnoremap gc xph

" exchange word under cursor with the next word without moving the cursor
nnoremap gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the left
nnoremap <leader><Left> "_yiw?\w\+\_W\+\%#<CR>:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the right
nnoremap <leader><Right> "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>/\w\+\_W\+<CR><C-l>

Nguồn: wiki vim .

Tôi thấy (và wiki của tôi) gwhơi khác so với của Heptite. Tôi không chắc cái nào tốt hơn.


4

Giải pháp dài đó là xấu xí. Giả sử con trỏ của bạn ở bên trái chữ cái đầu tiên của từ đầu tiên, đó là 'p'. Làm điều này : dwlpldw%p. Điều này phù hợp trong trường hợp đặc biệt của bạn. Làm thế nào về việc đối phó với chỉnh sửa hàng ngày? Hãy thử dwwP, hoặc dWWP. : D

Mẹo: Đừng luôn viết biểu thức chính quy dài, nếu bạn không cần phải làm điều này thường xuyên. Nếu không, vimrc của bạn bùng nổ. Tất cả người dùng vim sẽ quen thuộc với chuyển động con trỏ dựng sẵn của nó.


1

Tôi đã viết lên các ánh xạ có thể lặp lại bằng cách sử dụng kết hợp trao đổi vim , Lặp lại (phụ thuộc vào repeat.vim ) và argtextobj .

" Swap function arguments, move the argument under the cursor to the left or to
" the right.
Repeatable map <leader>al cxiaf,cxia
Repeatable map <leader>ah cxiaF,hcxia

Lợi thế trong việc sử dụng các plugin trao đổi và lặp lại cho các ánh xạ này là:

  • Thực hiện một lần hoàn tác usẽ hoàn tác việc hoán đổi (chúng là những thay đổi nguyên tử)
  • Bạn có thể sử dụng .để tiếp tục di chuyển đối số sang trái / phải.

Tôi biết tôi biết, nó có vẻ như một toàn bộ rất nhiều plugin cho một thao tác đơn giản, nhưng nghĩ gì khác những plugin cung cấp cho bạn:

  • argtextobj cung cấp cho bạn iaaatextobj để xóa ( diadaa) và yanking ( yia).
  • vim-repeat và Lặp lại để làm cho bất kỳ ánh xạ nào của bạn có thể lặp lại với ..
  • trao đổi vim cung cấp cho bạn lặp lại, trao đổi nguyên tử của văn bản.

1

Hoán đổi ánh xạ cho các ngôn ngữ Latinh

Ánh xạ hoán đổi từ wiki Vim sẽ không hoạt động chính xác trên các từ có ký tự có dấu.

Các ánh xạ này được điều chỉnh để hoạt động với các ký tự Bổ sung ISO / IEC_8859-1 Latin-1 (Châu Âu) . Điều này được thực hiện bằng cách thay thế tất cả các thể hiện \wbằng [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]và tất cả các thể hiện \_Wbằng \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Xóa đánh dấu tìm kiếm

Hơn nữa, đánh dấu tìm kiếm được xóa khi cần thiết. Điều này đạt được bằng cách thêm :nohlsearch<return>vào cuối mỗi ánh xạ cần.

Đây là kết quả cuối cùng:

" Use gc to swap the current CHARACTER with the next, WITHOUT changing the cursor position.
nnoremap <silent> gc xph

" Use gw to swap the current WORD with the next, WITHOUT changing the cursor position.
nnoremap <silent> gw "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>

" Disable Alt+[menukey] menu keys (i.e. Alt+h for help)
set winaltkeys=no

" Use Alt + ← or Alt + h to swap the current WORD with the previous, keeping the cursor on the current word. This feels like "PUSHING" the word to the left.
nnoremap <silent> <A-Left> "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
nnoremap <silent> <A-h>    "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
" <A-h> corresponds to è

" Use Alt + → or Alt + l to swap the current WORD with the next, keeping the cursor on the current word. This feels like "PUSHING" the word to the right.
nnoremap <silent> <A-Right> "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
nnoremap <silent> <A-l>     "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
" <A-l> corresponds to ì

" Use g{ to swap the current PARAGRAPH with the next.
nnoremap g{ {dap}p{

0

Plugin Eclim cung cấp một cái tốt. Tất cả các khoản tín dụng cho họ :)

:SwapWords

.. và nếu bạn không muốn cài đặt toàn bộ plugin, đây là chức năng của chúng được trích xuất:

" Swap words:
" taken from Eclim
" https://github.com/ervandew/eclim

function! SwapWords() " {{{
  " Initially based on http://www.vim.org/tips/tip.php?tip_id=329

  " save the last search pattern
  let save_search = @/

  normal! "_yiw
  let pos = getpos('.')
  keepjumps s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/
  call setpos('.', pos)

  " restore the last search pattern
  let @/ = save_search

  silent! call repeat#set(":call SwapWords()\<cr>", v:count)
endfunction " }}}

command! SwapWords :call SwapWords()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.