Объединить две строки в Vim без перемещения курсора - PullRequest
6 голосов
/ 29 февраля 2012

Как мне соединить две строки в 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 и варианты '' . Ни один из них, кажется, не работает. Они идут в начало строки, а не в исходную позицию курсора.

Ответы [ 3 ]

9 голосов
/ 01 марта 2012

Еще один подход, который не давит на отметки, будет следующим:

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

Гораздо более многословно, но это мешает вам потерять оценку.

  • :nnoremap - нерекурсивная карта
  • <silent> - не отображать ничего при нажатии отображения
  • J - Ключ к карте
  • :let p=getpos('.') - сохранить позицию курсора
  • <bar> - Разделитель команд (| для карт, см. :help map_bar)
  • join - Команда ex для обычного J
  • <bar> - ...
  • call setpos('.', p) - восстановить позицию курсора
  • <cr> - Запустить команды
4 голосов
/ 29 февраля 2012

Вы можете сделать это следующим образом:

:nnoremap <F2> mbJ`b

Это назначает следующие действия для клавиши F2 :

  1. То есть создать отметку ( m b , но ПРИМЕЧАНИЕ , если вы ранее установили метку b, она будет перезаписана!)
  2. J в строках
  3. Перейти к предыдущей отметке ( ` b )
0 голосов
/ 16 сентября 2017

Служебная функция, которую вы можете использовать для других частей

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

Кстати: еще два примера использования функции сохранения

"Удалить лишние пробелы в конце строки

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

"Восстановить весь файл

call Preserve('exec "normal! gg=G"')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...