[vim] Vim 검색 및 선택한 텍스트 바꾸기

텍스트가 있고 시각 모드로 들어가 텍스트를 선택한다고 가정 해 보겠습니다. 강조 표시된 텍스트를 빠르게 검색하고 다른 텍스트로 바꾸려면 어떻게합니까?



답변

다음을 실행하거나 귀하의 .vimrc

vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>

시각 모드에서 ctrl+ 를 누르면 r바꿀 텍스트를 입력하라는 메시지가 표시됩니다. 를 누른 enter다음 동의 y하거나 거부하는 각 변경 사항을 확인합니다 n.

이 명령은 레지스터를 재정의 h하므로 h사용하지 않는 다른 명령을 선택할 수 있습니다 ( 위의 명령을 다른 소문자 로 변경 ).


답변

터미널 종속 + 레지스터를 사용하지 않고 (h 레지스터를 덮어 쓰지 않고) 시각적으로 강조 표시된 텍스트를 빠르고 간단한 매핑 검색 :

" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>

ctrl-f가 마음에 들지 않으면 원하는대로 변경하십시오.

텍스트가 강조 표시되면 다음 s을 입력하여 간단히 제거 할 수 있습니다 .

%s//<your-replacement-string>

s명령 에 대한 빈 검색 은 마지막으로 검색된 문자열을 사용 하기 때문 입니다.


답변

이것은 또한 작동합니다 (적어도 한 줄의 선택 / 특수 문자가 포함되지 않은 선택)

  • 시각 모드에서 텍스트 선택
  • 텍스트를 잡아 당기다 y
  • :s/<C-r>0/

0 yank 레지스터입니다.

다른 사람들이 언급했듯이이 작업을 수행하는 더 빠른 방법이 있지만, 나처럼 Vim을 배우기 시작했다면 이것이 ‘일반적인’방법 중 하나입니다.

// 편집 : 탭이나 줄 바꿈 또는 /문자 와 같은 문자가 선택 항목에 있으면 ‘등록’방식이 실패한다는 것을 방금 깨달았습니다 ( :s명령이 작동 하려면 이러한 문자를 수동으로 처리 해야합니다).

여기에 이미지 설명 입력


답변

시각적 선택에 특수 문자가 없으면 허용되는 대답은 훌륭하게 작동합니다. 두 개의 스크립트 ( Jeremy Cantrell 의 게시글 및 Peter Odding 의)를 함께 해킹하여 특수 정규식 문자가 있어도 찾고자하는 문자열을 시각적으로 선택할 수있는 명령을 만들었습니다.

" Escape special characters in a string for exact matching.
" This is useful to copying strings from the file to the search tool
" Based on this - http://peterodding.com/code/vim/profile/autoload/xolox/escape.vim
function! EscapeString (string)
  let string=a:string
  " Escape regex characters
  let string = escape(string, '^$.*\/~[]')
  " Escape the line endings
  let string = substitute(string, '\n', '\\n', 'g')
  return string
endfunction

" Get the current visual block for search and replaces
" This function passed the visual block through a string escape function
" Based on this - /programming/676600/vim-replace-selected-text/677918#677918
function! GetVisual() range
  " Save the current register and clipboard
  let reg_save = getreg('"')
  let regtype_save = getregtype('"')
  let cb_save = &clipboard
  set clipboard&

  " Put the current visual selection in the " register
  normal! ""gvy
  let selection = getreg('"')

  " Put the saved registers and clipboards back
  call setreg('"', reg_save, regtype_save)
  let &clipboard = cb_save

  "Escape any special characters in the selection
  let escaped_selection = EscapeString(selection)

  return escaped_selection
endfunction

" Start the find and replace command across the entire file
vmap <leader>z <Esc>:%s/<c-r>=GetVisual()<cr>/

누구에게나 유용하다면 내 vimrc 에 이것을 포함 시켰습니다 .


답변

Vim 7.4부터 gn현재 검색 패턴과 일치하는 텍스트 영역을 선택 하는 동작을 사용할 수 있습니다 .

를 사용하여 cgn현재 선택된 일치 항목의 텍스트를 변경 (또는 dgn삭제) 한 후 일반 모드 .에서을 사용 하여 명령을 반복하고 다음 일치 항목을 조작 할 수 있습니다 .

있다 Vimcast의 에피소드 에서이 기능을 보여주는이.


답변

Mykola Golubyev, 팁 주셔서 감사합니다! 다음은 이미 강조 표시된 텍스트를 포함하는 “+”레지스터를 사용합니다 (터미널에 따라 다름). “h”레지스터를 사용하여 저장합니다.

vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>


답변

에서 http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :

텍스트가 시각적으로 선택되면 :을 눌러 명령을 입력합니다. 명령 줄은 자동으로 범위를 입력합니다.

:'<,'>

s / red / green / g와 같은 명령을 입력하여 마지막 시각적 선택의 모든 줄에서 각 빨간색을 녹색으로 바꿀 수 있습니다. 명령은 다음과 같이 나타납니다.

:'<,'>s/red/green/g

이전에 선택한 블록에 대해 Ex 명령을 반복하려면 : history를 사용하십시오. 즉,을 누른 다음을 누른 다음 이전 명령을 편집합니다.