2016-06-23 3 views
0

루비 코드에서 메소드 정의를 찾는 데 도움이되는 vim 명령을 작성했습니다. 커서 아래에있는 단어를 가져 와서 해당 이름의 메소드 정의를 검색합니다.빔 맵이 작동하지 않습니다.

:silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\<cr>" 

잘 작동하지만 지금은 키 명령에 매핑하고 싶습니다.

:nnoremap \m :silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\<cr>" 

어떤 이유로이 기능이 작동하지 않습니다. 내가 메서드 이름에 커서를 놓고 내가

E114: Missing quote: "\ 
E15: Invalid expression: "normal! /\\v\\s*def (self.)?".expand('<cword>')."\ 

가 어떻게이 문제를 해결할 수있는 다음과 같은 오류 메시지가 얻을 \m을 입력?

+0

'\ ' – SibiCoder

+0

없이 시도하셨습니까? [[D'? – romainl

답변

2

문제는 map 자체가 <cr>을 확장이다, 그래서 실행하려고 명령은

:silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\ 
" 

이 첫 번째 줄 때문에 끝에서 종결되지 않은 문자열의 오류를 트리거합니다.

  • 대신 \<cr>을 (그렇지 않으면 정력 \m 실행시에이 확장 명령을 메아리) 내가 침묵 전체지도를 만들기 위해 <silent>을 추가 한

    nnoremap <silent> \m :silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\n"<cr> 
    
    • 시도,이 문제를 해결하려면 문자열에 \n을 쓰면 맵이 혼자 남을 것입니다.
    • 매핑이 끝나면 <cr>이 필요합니다. 그렇지 않으면 명령이 실행되지 않습니다. 당신이
  • 1

    @melpomene은 올바르게 매핑을 디버깅하고 매핑 <cr>을 탈출 할 필요성을 지적) enter 키를 누릅니다 여기를 기다리고. 나는 또한지도의 일부에서 탈출을 줄이기 위해 작은 따옴표를 사용했다

    nnoremap \m :silent execute 'normal! /\v\s*def (self.)?'.expand('<cword>')."\<lt>cr>"<cr> 
    

    : 당신은 또한 당신의 매핑을 해결하기 위해 <lt>를 사용할 수 있습니다.

    그러나이 매핑은 <c-r><c-w>을 사용하여 현재 커서 아래에있는 단어를 얻으면 크게 단순화 할 수 있습니다. 즉, :execute, :normalexpand()을 사용하지 않아도됩니다. 우리는 도망 칠 필요가 없다는 것을 의미합니다.

    nnoremap <silent> \m /\v\s*def (self.)?<c-r><c-w><cr> 
    

    대신 행의 시작에 커서 아래의 단어에서 경기를 시작 \zs를 사용하여 더이을 할 수 있습니다 자세한 도움말을 참조하십시오

    nnoremap <silent> \m /\v\s*def (self.)?\zs<c-r><c-w><cr> 
    

    :

    :h <> 
    :h literal-string 
    :h c_CTRL-R_CTRL-W 
    :h /\zs 
    
    관련 문제