2016-10-06 1 views
0

vim이 단어로 인식해야하는 것을 정의하는 방법이 있습니까? 나는이 같은 일반 모드를 위해 그것을 할 수있는 ... 그런 "W", "E", "B"모든 단어 키 동작에 \ 승 + 정규식 할당 할 :Vim에서 regex를 "w", "e"및 "b"키로 설정하는 방법은 무엇입니까?

nnoremap <silent> w :call search('\w\+')<CR> 

하지만 그렇지 않습니다 비주얼 모드 및 운영자 보류 모드에서 작동합니다. 이것을 할 수있는 환경이 있다면 좋을 것입니다. E W 및 하는 "단어"의 정의는 :iskeyword 옵션에 의해 제어되는 등 하부 케이스 운동 용

답변

1

귀하의 질문에서 이해할 수있는 내용과 Kaz의 대답에 대한 토론에서 당신이 찾고있는 것이 가나의 스마트 워드 플러그인 인 http://www.vim.org/scripts/script.php?script_id=2470입니다. ...

당신은 :help smartword으로 문서를 확인해야 할거야,하지만 당신은 플러그인을 설치하고 플러그인들에 내장 된 워드 매핑을하게되면, 짧은 버전이며,

map w <Plug>(smartword-w) 
map b <Plug>(smartword-b) 
map e <Plug>(smartword-e) 
map ge <Plug>(smartword-ge) 

... 그러면 내장 기능은 길을 따라 비 단어 문자를 건너 뜁니다. 저는 이것을 오랜 세월 동안 사용 해왔고 그것이 작동하는 방식에 상당히 만족합니다.

+0

이것은 정확히 내가 찾은 것입니다. 정상, 시각 및 운영자 계류 모드는 정상적으로 작동합니다. 감사. – Evgeniy

1

; 그것에 관한 :help iskeyword을 보라. 기본적으로 쉼표로 구분 된 개별 문자 또는 범위로 주어진 문자 목록으로 구성됩니다. 다양한 구문 파일이이 언어를 다른 언어로 수정하여 식별자별로 이동하도록합니다. 이 정규 표현식을 지정할 수있는 것처럼 보이지 않습니다. 그들이 다시 프로그램 할 수있는 것처럼 및 E W 같은

대문자의 움직임은 보이지 않습니다. 'WORD'의 정의는 공백으로 구분 된 공백이 아닌 문자와 각 빈 줄이 "WORD"로 계산됩니다.

그러나 불행히도 iskeyword 문자는 입력을 iskeyword 문자 (iskeyword 문자 및 공백)의 시퀀스로 단순히 분리하는 동작이있는 것처럼 보입니다. w 및 관련 명령을 사용하면 공백을 건너 뛰지 만 iskeyword 토큰과 iskeyword 토큰을 모두 방문합니다.

:map 그냥 / 또는 ? 키 입력 순서가 모두 시각 및 명령 모드에서 작동을 사용하여 다시 매핑 :

그것은 /? 검색은 두 모드에서 작동하므로이 두 작품
:map w /\<\w/^M 
:map b ?\</\w^M 
:map e /\w\>^M 

. 물론, 현재 검색 패턴을 파헤 치고 :set hls (highlightsearch)을 사용하는 경우 단어의 팁/꼬리가 강조 표시되므로 추한 솔루션입니다.

위의 검색은 앵커 링 연산자가 작동하는 방식 때문에 매우 만족스럽지 않습니다. 예를 들어 {abc 또는 (abc과 같이 a에 '착륙'할 수 없습니다.

다음 매핑이 더 효과적입니다. 각각은 여러 검색을 트리거합니다. /.?. 검색은 다음 또는 이전 문자로 이동하는 트릭으로 사용되므로 행의 마지막 문자에있는 경우 다음 행의 첫 번째 문자로 이동하고 그 반대의 경우도 마찬가지입니다.

:map b ?\w^M?\W^M/.^M 
:map w /\W^M/\w^M 
:map e /\w^M/\W^M?.^M 

몇 가지 단점이 있습니다. 예를 들어, 단어 목록 좋아 :

abc 
def 
ghi 

는 단어가 아닌 클래스 \W에 대한 일치가 포함되어 있지 않습니다. 일치에는 줄 끝이 포함되어야합니다.더 나아가,이 점에서 하나 w에 대한 개선은 다음과 같이 끝 라인에 해당하는 경기를 추가하는 것입니다

:map w /\(\W\\|$\)^M/\w^M 

주 배관 전에 이중 백 슬래시! 가장 오른쪽의 백 슬래시는 파이프를 이스케이프 처리하므로 :map 명령을 처리해도 명령 구분 기호로 처리되지 않습니다. 그런 다음 우리는 분기를위한 정규 표현식 연산자 인 \|을 남겨 둡니다. 비슷한 맥락에서 다른 두 매핑은 향상 될 수 있습니다. 나는 그것을 운동으로 남겨두고있다.

+0

글쎄,이 옵션을 "48-57,65-90,97-122, _"로 변경했는데 아무 일도 일어나지 않았습니다. 어쩌면 내가 내 질문에 부정확했다. 나는 "w"키를 통해 이동할 때 $, = 또는 ->와 같은 모든 기호를 건너 뛰고 싶습니다. 'au BufEnter * setlocal iskeyword = 48-57,65-90,97-122, _' – Evgeniy

+0

Vim은 공백이 아닌 단어로 세트의 * 외부 * 문자를 처리하는 것처럼 보입니다. 따라서 'iskeyword'를 소문자 az로 정의하고'abc $ def'에서'a'에 커서를 놓으면'w'가'$'를 방문하고'def '. 기본적으로 텍스트는 비 단어로 분리 된 단어로 토큰 화됩니다. 그러나 'w'는 둘 다 방문합니다! – Kaz

+0

사용자 지정 검색을 수행하기 위해 키를 다시 바인딩하는 것처럼 보이는 것이 아마도 유일한 방법 일 것입니다. 예를 들어': map w/\ <\ w^M' ('^ M'은 Ctrl-V Enter로 입력). 불행히도 이것은 현재 검색 패턴을 파괴합니다. – Kaz

관련 문제