VIM (Bash 또는 Tmux)에서와 같이 화면에서 단어 완성


10

화면 에서 마지막으로 일치하는 식별자 를 완성하도록 Bash, Zsh 또는 Tmux를 어떻게 구성 할 수 있습니까? 이 일반적인 시나리오를 고려하십시오.

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1

issue547CLI에서 Bash / Zsh / Tmux를 쉽게 완료 하려면 어떻게해야합니까? Git이 도움이되고 난 Tab후에를 누르면 이전의 모든 숫자가 실제로 존재하는 Git 분기와 일치 하기 때문에 숫자를 직접 작성해야합니다 .$ git checkout isissue

VIM에서 전제 조건으로 Ctrl+ P를 누르면 이전 경기와 같이 완료되므로이 경우 issue547314실제로 완료됩니다. 이 동작을 Bash, Zsh 또는 Tmux에서 어떻게 얻을 수 있습니까?

현재 우분투 서버 (보통 12.04 LTS)에서 Bash 4.2 및 Tmux 1.10을 사용하고 있습니다. 필요한 경우 최신 Ubuntu Server LTS (14.04)로 업데이트 할 수 있습니다.

편집 : 사용하기 어려운 한 Bash, Zsh 또는 Tmux를 사용하는 솔루션은 신경 쓰지 않습니다. 그래서 TabCtrl+ P또는 다른 같은 바로 가기 괜찮을하지만,하지 않을 Alt+ Meta+ Super+ Shift+ א.


이것은 bash 소스의 상당히 큰 개정이 필요하다는 것을 확신하십시오.
Kevin

@ 케빈 : 나는 많은 것을 알아 냈지만 놀라운 zsh가 그것을 처리 할 수 ​​있거나 아마도 tmux 일 수 있기를 바랍니다.
dotancohen

답변:


4

OP가 찾고있는 기능 은 Emacs 세계에서 dabbrev-expand 라고합니다 .

버퍼에서 해당 약어 (v-expand)로 시작하는 단어를 검색하여 버퍼 앞의 단어를 동적 abbrev로 확장하십시오.

xterm또한 dabbrev-expand기능이 있지만 Emacs 대응보다 조금 덜 똑똑하지만 나에게 매우 유용하며 하나는 내가 전환 한 이유 중 하나였습니다 xterm. xterm윈도우 내부 에서는 지정된 문자열 ~/.Xresources을 호출하기 위해 지정된 사용자 정의 키 바인딩을 사용할 수 있습니다 dabbrev-expand. 예를 들어, 나는 ~/.Xresources( uxtermxterm의 유니 코드 버전 인)에 다음 항목을 가지고 있습니다 .

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\

내부 xterm창에서 M-/( ALT + /)를 사용 하여 호출 할 수 있습니다 dabbrev-expand. xterm입력 한 문자로 시작하는 화면에 보이는 모든 문자열을 찾습니다. 예:

$ echo a_very_long_string bye by
$ a_v

M-/지금 누르면으로 xterm확장 a_v됩니다 a_very_long_string. 불행히도 내가 말했듯 xterm이 똑똑하지 않으며 그 dabbrev-expand기능은 전체 문자열에서만 작동합니다. 따라서 귀하의 경우 에는 일부 이기 때문에 is확장 issue540되지 않을 것 입니다 ( 정규 표현식과 마찬가지로 생각하십시오. 대부분의 정규 표현식 엔진은에서 두 문자열을 모두 포착하지만 조금 비슷합니다 ). 그러나 입력 한 다음 대가로 할 수 있습니다 . 먼저 확장 할 것입니다 . 이것은 우리가 원하는 것이 아니므로 다시 눌러 확장합니다 . 이제 Bash를 사용하면 ,issue547314issue547314origin/issue547314\bissue\bissue.+\borM-/xtermororigin/v2.1M-/xtermorigin/issue547314M-bC-wC-e제거하는 origin/부분. 요약하면, dabbrev-expand내부 xterm는 Emacs (그리고 Vim이 생각하는 것)만큼 좋지는 않지만 손으로 ​​긴 문자열을 다시 작성하고 오타가 적은 경향이 있습니다. 대부분의 경우 중복 부품을 제거 할 필요없이 원하는 문자열로 직접 확장됩니다. 당신은 그것에 익숙해 져야합니다-커서에두고 싶은 문자열을보고 다른 것이 선행되지 않는지 확인하십시오. 앞 부분에 입력하고 확장 후 제거하십시오.

참고 xterm로 컴파일되지 dabbrev-expand기본적으로 기능하고 명시 적으로 활성화해야합니다. 그러나 xtermUbuntu 리포지토리의 버전 은 컴파일되어 dabbrev-expand즉시 사용할 수 있습니다.


Arkadiusz에게 감사합니다. 이것은 내가 필요한 것에 가깝습니다. 작동시킬 수 없습니다! 아마 내 xtermuxtermdabbrev-expand 용으로 컴파일되지 않았으므로에서 기능에 대한 언급을 찾을 수 없습니다 -help. 으로 컴파일 플래그를 어떻게 볼 수 vim --version있습니까? 나는 또한에있는 설정 라인 시도주의 ~/.XresourcesMeta <KeyPress> /: dabbrev-expand() \n\ 발견으로 여기 지만 그 중 하나, 도움이되지 않았다합니다.
dotancohen

귀하의 xterm이 dabbrev-expand없이 컴파일되었을 수 있습니다. xterm을 어떻게 설치 했습니까? ~ / .Xresources를 수정 한 후 xrdb -merge .Xresourcesxterm에서 수행 합니다.
Arkadiusz Drabczyk

Arkadiusz! 감사합니다!
dotancohen

바운티 기간이 끝날 때까지 몇 시간 더 질문을하겠습니다. 그러나 당신이 구두를 신고 있다고 확신합니다. 유일한 문제는 끔찍한 xterm에 대한 요구 사항입니다! 그러나 이제는 기능의 올바른 이름을 알았으므로 다른 응용 프로그램에서 사용할 수 있습니다 . 감사!
dotancohen

Arkadiusz 감사합니다! xterm 솔루션을 사용하지는 않지만 올바른 방향으로 나를 지적했습니다. Apparantly 히 zsh이 기능을 가지고있다.
dotancohen

1

bash completetion이라는 유사한 시설로서 배쉬. Tab명령을 입력 할 때 인수를 제공 할 때 키 를 눌러이를 사용할 수 있습니다 .

입력 ls한 다음 Tab두 번 쳐서 시작 하면 Bash는 사용하려는 명령에 일치하는 파일 (및 명령 줄 스위치) 목록을 제공합니다.

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

다음은 스위치를 사용한 예입니다.

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

설정?

내 설치에는 이미 다음 규칙이 포함되어 있습니다 git.

/etc/bash_completion.d/git

이 파일은 git패키지를 설치할 때 설치 되었습니다. 저는 Fedora 19를 사용하고 있지만 다른 배포판 에서도이 작업을 수행해야합니다.

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

규칙 파일을 보면 다음 상황에서 자동 완성을 용이하게 할 수 있다고 설명합니다.

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

그래서 이것은 당신을 위해 "그냥 작동"해야합니다.


2
배쉬 완료 및 Git 완료 작업 (OP에서 언급했듯이). 수행하려는 변경 사항은 첫 번째 탭에서 완료하여 화면에 표시된 마지막 유효한 값을 누르는 것입니다. 이것이 VIM Omnicompletion의 작동 방식입니다.
dotancohen

@dotancohen-지금은 내가 설명한 것 이상으로 가능하다는 것을 알지 못합니다.
slm

1

extrakto를 사용 하여 이와 같은 작업을 수행 할 수 있습니다 .

  • extrakto prefix + tab를 시작하려면 tmux 를 누르십시오
  • 퍼지 텍스트 / 경로 / URL 찾기
  • 프레스
    • tab 현재 창에 삽입하려면
    • enter 클립 보드에 복사하고
    • ctrl-o 경로 / URL을 열거 나
    • ctrl-e 로 편집 $EDITOR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.