วิธีสลับคำอย่างง่าย (เป็น VIM)


12

ฉันไม่ดีพอที่จะเป็นกลุ่มเพื่อตรวจสอบว่าเป็นไปได้หรือไม่ (ซึ่งเป็นสาเหตุที่ฉันมา superuser และไม่ดี) ~ มีวิธีในกลุ่มเพื่อเปลี่ยนคำสองคำได้อย่างง่ายดาย?

ตัวอย่างเช่นdef function(param1, param2)มีวิธีที่รวดเร็ว / ง่ายในการเปลี่ยนเป็นdef function(param2, param1)???

คำตอบ:


13

ฉันจำไม่ได้ว่าตอนแรกที่ฉันได้รับสิ่งนี้ แต่มันอยู่ใน ~ / .vimrc เป็นเวลาอย่างน้อยสองสามปี:

" 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>

หลังจากที่คุณได้กำหนดสิ่งที่คุณต้องทำคือวางเคอร์เซอร์ไว้ที่ "param1" ในโหมดและประเภทปกติ: gw


4
ฉันยังมีมันมาจากวิกิพีเดีย
romainl

5

+1 สำหรับคำตอบของ @ Heptite

เพื่อความสมบูรณ์ยิ่งขึ้นนี่คือสิ่งที่ฉันมีใน. 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>

ที่มา: เป็นกลุ่มวิกิพีเดีย

ฉันเห็นว่า (และวิกิของฉัน) gwนั้นแตกต่างจากของ Heptite เล็กน้อย ฉันไม่แน่ใจว่าอันไหนดีกว่า


4

ทางออกที่ยาวนั้นน่าเกลียด สมมติว่าเคอร์เซอร์ของคุณอยู่ด้านซ้ายตัวอักษรแรกของคำแรกนั่นคือ 'p' ทำสิ่งนี้: dwlpldw%p. เหมาะกับกรณีพิเศษของคุณ วิธีจัดการกับการแก้ไขรายวัน? ลองหรือdwwP dWWP: D

เคล็ดลับ: อย่าเขียนนิพจน์ปกติที่ยาวเสมอหากคุณไม่จำเป็นต้องทำสิ่งนี้บ่อย มิฉะนั้น vimrc ของคุณจะเฟื่องฟู ผู้ใช้กลุ่มทั้งหมดจะต้องคุ้นเคยกับการเคลื่อนไหวของเคอร์เซอร์ในตัว


1

ผมเขียนขึ้นแมปทำซ้ำโดยใช้การรวมกันของกลุ่มแลกเปลี่ยน , ทำซ้ำ (ซึ่งขึ้นอยู่กับrepeat.vim ) และ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

ข้อได้เปรียบในการใช้การแลกเปลี่ยนและปลั๊กอินที่ทำซ้ำได้สำหรับการแมปเหล่านี้คือ:

  • การดำเนินการเลิกทำอย่างใดอย่างหนึ่งuจะเลิกทำการแลกเปลี่ยน (เป็นการเปลี่ยนแปลงอะตอม)
  • คุณสามารถใช้.เพื่อย้ายอาร์กิวเมนต์ไปทางซ้าย / ขวา

ฉันรู้ว่าฉันรู้ว่าดูเหมือนว่ามีปลั๊กอินมากมายสำหรับการใช้งานที่ง่าย แต่คิดว่ามีปลั๊กอินอื่นที่ให้คุณ:

  • argtextobj ให้iaและaatextobj สำหรับการลบ ( diaและdaa) และ yanking ( yia)
  • vim-repeat และ Repeatable สำหรับการแมปใด ๆ ที่คุณทำซ้ำ.ได้
  • vim-exchange ช่วยให้คุณสามารถแลกเปลี่ยนข้อความแบบปรมาณูได้

1

สลับการแมปสำหรับภาษาละติน

การแมปการสลับจากVim wikiจะไม่ทำงานอย่างถูกต้องกับคำที่มีอักขระเน้นเสียง

แมปเหล่านี้จะถูกปรับให้เข้ากับการทำงานร่วมกับ (ยุโรป) มาตรฐาน ISO / IEC_8859-1 Latin-1 ตัวละครเสริม นี้จะกระทำโดยการแทนอินสแตนซ์ทั้งหมด\wด้วย[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]และทุกกรณีด้วย\_W\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]

การล้างการไฮไลต์การค้นหา

นอกจากนี้การไฮไลต์การค้นหาจะถูกล้างหากจำเป็น นี่คือความสำเร็จโดยการเพิ่ม:nohlsearch<return>ในตอนท้ายของแต่ละการทำแผนที่ที่ต้องการ

นี่คือผลลัพธ์ที่ได้:

" 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

ปลั๊กอินEclimให้สิ่งที่ดี เครดิตทั้งหมดให้พวกเขา :)

:SwapWords

.. และหากคุณไม่ต้องการติดตั้งปลั๊กอินทั้งหมดนี่คือการดึงฟังก์ชั่นออกมา:

" 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.