
나는 ; 현재 줄(A;)의 끝으로 이동한 다음 매크로를 실행하기 전에 점프했던 커서 위치로 돌아갑니다.
Co와 Ci는 나에게 필요한 것이 아니며 편집 지점에서 작동하는 '' 및 ``도 필요하지 않습니다. 마커를 배치하지 않고는 이를 수행할 수 없는 방법이 있습니까?
답변1
작은 매크로 대신 작은 함수를 만드는 것이 괜찮다면 다음을 제안하겠습니다.
function! AppendString(string)
if getline('.') !~ a:string.'$'
let original_cursor_position = getpos('.')
exec("s/$/".a:string."/")
call setpos('.', original_cursor_position)
endif
endfunction
커서 위치는 를 사용하여 얻고 getpos()
나중에 를 사용하여 복구됩니다 setpos()
.
이 함수는 원하는 문자열을 추가할 수 있습니다. 또한 줄 끝에 원하는 문자열이 이미 있는지 확인합니다. 이 경우 아무 작업도 수행하지 않습니다.
다양한 언어에 유용한 이 기능을 사용하는 키맵을 정의할 수 있습니다.
" in ftplugin/cpp.vim
nnoremap <silent> <LocalLeader>; :call AppendString(";")<CR>
또는
" in ftplugin/python.vim
nnoremap <silent> <LocalLeader>: :call AppendString(":")<CR>
답변2
setpos()
검색 기록에 패턴을 추가하는 등 원치 않는 부작용이 있는 대신 낮은 수준을 사용하면 :substitute
커서 위치가 자동으로 유지됩니다.
:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>
답변3
``의 동작과 "점프"로 간주되는 내용은 문서에 명확하게 설명되어 있습니다.
에서 :help jump-motions
:
"점프"는 다음 명령 중 하나입니다: "'", "`", "G", "/", "?", "n", "N", "%", "(", ")" , "[[", "]]", "{", "}", ":s", ":tag", "L", "M", "H" 및 새 파일 편집을 시작하는 명령. 이러한 명령 중 하나로 커서를 "점프"하게 하면 점프하기 전의 커서 위치가 기억됩니다. 해당 위치를 포함하는 줄이 변경되거나 삭제되지 않는 한 "''" 및 "``" 명령을 사용하여 해당 위치로 돌아갈 수 있습니다.
A
분명히 목록에 없으므로 Gary Bernhardt가 부르는 것처럼 "틱-틱-백"은 "있는 그대로" 작동하지 않습니다. 그래도 여전히 좋은 접근 방식이지만 백틱 표시를 명시적으로 배치해야 합니다.~ 전에당신은 그렇습니다A;
nnoremap <key> m`A;<Esc>``
답변4
나는 당신이 방금 게시한 것보다 유연성은 떨어지지만 더 컴팩트한 버전의 작은 함수를 작성하게 되었습니다.
키바인딩:
nnoremap <leader>; :call AppendSC()<CR>
기능:
fun! AppendSC()
let pos = getpos('.')
s/.*/&;/
call setpos('.', pos)
endf