如何在vim中加入两行,将光标保留在原始位置而不是跳转到合并点?
例如,将光标放在插入符指示的位置,使用以下两行:
this is ^line one
this is line two
通过 J 合并产生:
this is line one ^this is line two
我如何制作:
this is ^line one this is line two
我尝试了 CTRL-O 和''的变体。这些似乎都不起作用。它们到达行的开头,而不是原始光标位置。
答案 0 :(得分:9)
另一种不会踩踏标记的方法是:
:nnoremap <silent> J :let p=getpos('.')<bar>join<bar>call setpos('.', p)<cr>
更详细,但它可以防止你丢失标记。
:nnoremap
- 非递归地图<silent>
- 按下映射时不要回显任何内容J
- 地图关键:let p=getpos('.')
- 存储光标位置<bar>
- 命令分隔符(地图|
,请参阅:help map_bar
)join
- 普通J
<bar>
- ... call setpos('.', p)
- 恢复光标位置<cr>
- 运行命令答案 1 :(得分:4)
你可以这样做:
:nnoremap <F2> mbJ`b
这会将以下操作分配给 F2 键:
b
标记,则它会被覆盖!)答案 2 :(得分:0)
可用于其他porpuses的实用功能
" 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
这里解决方案使用上述功能,其优点是:不占用任何寄存器
" 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:关于如何使用保留功能的更多两个例子
&#34;删除行末尾的额外空格
fun! CleanExtraSpaces()
call Preserve('%s/\s\+$//ge')
endfun
com! Cls :call CleanExtraSpaces()
au! BufwritePre * :call CleanExtraSpaces()
&#34; Reident整个文件
call Preserve('exec "normal! gg=G"')