Hoàn thành các từ trên màn hình như trong VIM (Bash hoặc Tmux)


10

Làm cách nào tôi có thể định cấu hình Bash, Zsh hoặc Tmux để hoàn thành mã định danh phù hợp cuối cùng trên màn hình ? Hãy xem xét kịch bản phổ biến này:

$ 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

Làm cách nào tôi có thể khiến Bash / Zsh / Tmux hoàn thành issue547trên CLI một cách dễ dàng? Khi tôi nhấn Tabsau khi $ git checkout isGit hoàn thành một cách hữu ích issue, nhưng tôi phải tự mình hoàn thành các chữ số vì tất cả các chữ số trước đó thực tế khớp với các nhánh Git tồn tại .

Trong VIM, nhấn Ctrl+ Pcho omnicomplete sẽ hoàn thành như trận đấu trước, vì vậy trong trường hợp issue547314này thực tế sẽ được hoàn thành. Làm cách nào tôi có thể có hành vi này trong Bash, trong Zsh hoặc Tmux ?

Tôi hiện đang sử dụng Bash 4.2 và Tmux 1.10 trên Ubuntu Server (thường là 12.04 LTS). Tôi có thể cập nhật lên Ubuntu Server LTS mới nhất (14.04) nếu cần.

EDIT : Tôi sẽ không phiền bất kỳ giải pháp nào sử dụng Bash, Zsh hoặc Tmux miễn là nó không khó sử dụng. Vì vậy, Tabhoặc Ctrl+ Phoặc một số phím tắt khác như vậy sẽ tốt, nhưng không Alt+ Meta+ Super+ Shift+ א.


Khá chắc chắn rằng điều này sẽ có một bản sửa đổi khá lớn của nguồn bash.
Kevin

@Kevin: Tôi đã tìm ra rất nhiều, nhưng hy vọng hoặc zsh tuyệt vời có thể xử lý nó, hoặc có lẽ là tmux.
dotancohen

Câu trả lời:


4

Tôi nghĩ rằng tính năng mà OP đang tìm kiếm được gọi là daboustv-extend trong thế giới Emacs:

Mở rộng từ trong bộ đệm trước điểm dưới dạng viết tắt động, bằng cách tìm kiếm trong bộ đệm cho các từ bắt đầu bằng chữ viết tắt đó (v-bung).

xtermcũng có dabbrev-expandtính năng nhưng nó kém thông minh hơn một chút so với đối tác của Emacs nhưng nó rất hữu ích với tôi và đó là một trong những lý do khiến tôi chuyển sang xterm. Bên trong xtermcửa sổ, người ta có thể sử dụng một liên kết phím tùy chỉnh được chỉ định ~/.Xresourcesđể gọi dabbrev-expandtrên một chuỗi đã cho. Ví dụ: tôi có mục sau trong ~/.Xresources(tôi sử dụng uxterm, phiên bản Unicode của xterm):

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

Bên trong xtermcửa sổ tôi có thể sử dụng M-/( ALT + /) để gọi dabbrev-expand. xtermsẽ tìm tất cả các chuỗi hiển thị trên màn hình bắt đầu bằng các chữ cái tôi đã nhập. Thí dụ:

$ echo a_very_long_string bye by
$ a_v

Nếu tôi nhấn M-/bây giờ xtermsẽ mở rộng a_vđến a_very_long_string. Thật không may, như tôi đã nói xtermlà không thông minh và dabbrev-expandtính năng của nó sẽ chỉ hoạt động trên các chuỗi đầy đủ. Vì vậy, trong trường hợp của bạn issẽ được mở rộng để issue540và không issue547314issue547314là một phần của origin/issue547314(suy nghĩ về nó như \btrong biểu thức thông thường, đó là một chút tương tự mặc dù hầu hết động cơ biểu thức thông thường sẽ bắt cả hai lần xuất hiện của issuechuỗi trong \bissue.+\b). Nhưng , bạn có thể gõ orvà sau đó pres M-/. xtermđầu tiên sẽ mở rộng orra origin/v2.1, đây không phải là điều chúng tôi muốn, vì vậy hãy nhấn M-/lại và xtermsẽ mở rộng nó ra origin/issue547314. Bây giờ, nếu bạn sử dụng Bash bạn có thể làm M-b,C-wC-eđể loại bỏ origin/một phần. Tóm lại, dabbrev-expandbên trong xtermkhông tốt như trong Emacs (và Vim tôi đoán vậy) nhưng nó vẫn nhanh hơn việc viết lại các chuỗi dài bằng tay và ít bị lỗi chính tả. Và trong hầu hết các trường hợp, nó sẽ mở rộng trực tiếp đến chuỗi mong muốn mà không cần phải loại bỏ các phần dư thừa. Bạn chỉ cần làm quen với nó - nhìn vào chuỗi bạn muốn có ở con trỏ và xem liệu nó không có trước một thứ gì khác, và nếu nó là một phần trước và loại bỏ nó sau khi mở rộng.

Lưu ý rằng xtermkhông được biên dịch với dabbrev-expandtính năng theo mặc định và bạn phải kích hoạt nó một cách rõ ràng. Tuy nhiên, phiên bản xtermtrong kho lưu trữ Ubuntu được biên dịch dabbrev-expandvà bạn có thể sử dụng ngay.


Cảm ơn Arkadiusz, điều này dường như đủ gần với những gì tôi cần. Lưu ý rằng tôi không thể làm cho nó hoạt động! Có lẽ tôi xtermuxtermkhông được biên dịch cho daboustv-extend, tôi không thể tìm thấy đề cập đến tính năng trong -help. Làm thế nào tôi có thể thấy các cờ biên dịch (như với vim --version)? Lưu ý rằng tôi cũng đã cố gắng dòng config trong ~/.Xresourcesnhư Meta <KeyPress> /: dabbrev-expand() \n\ như được tìm thấy ở đây nhưng điều đó đã không giúp đỡ, một trong hai.
dotancohen

Nó có thể là xterm của bạn đã được biên dịch mà không cần mở rộng dabenamev. Làm thế nào bạn cài đặt xterm? Sau khi sửa đổi ~ / .Xresres làm xrdb -merge .Xresourcestrong xterm.
Arkadiusz Drabchot

Điều đó chắc chắn đã làm điều đó, Arkadiusz! Cảm ơn bạn!
dotancohen

Tôi sẽ đưa ra câu hỏi thêm một vài giờ nữa cho đến khi thời kỳ tiền thưởng kết thúc, nhưng tôi khá chắc chắn rằng bạn là một người đánh giày. Vấn đề duy nhất là yêu cầu cho xterm, thật là khủng khiếp! Nhưng bây giờ tôi biết tên thích hợp cho tính năng này, tôi có thể google nó cho các ứng dụng khác . Cảm ơn!
dotancohen

Cảm ơn bạn Arkadiusz! Mặc dù tôi sẽ không sử dụng giải pháp xterm, nhưng bạn chắc chắn đã chỉ cho tôi đi đúng hướng. Ràng zshkhông có thiết bị này.
dotancohen

1

Bash như một cơ sở tương tự được gọi là hoàn thành bash. Bạn có thể sử dụng nó bằng cách nhấn Tabphím khi cung cấp đối số cho các lệnh khi bạn nhập chúng.

Thí dụ

Nếu tôi bắt đầu bằng cách gõ lsvà sau đó nhấn Tabhai lần, bạn sẽ nhận được Bash để cung cấp danh sách các tệp phù hợp (và chuyển đổi dòng lệnh) cho bất kỳ lệnh nào bạn đang cố sử dụng:

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

Và đây là ví dụ với các công tắc:

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

Thiết lập?

Cài đặt của tôi đã bao gồm một quy tắc cho git:

/etc/bash_completion.d/git

Việc cài đặt tập tin này được thực hiện khi tôi cài đặt gitgói. Tôi đang ở Fedora 19, nhưng các distro khác cũng nên làm điều này.

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

Nhìn vào tệp quy tắc, nó giải thích rằng nó sẽ tạo điều kiện tự động hoàn thành trong các tình huống sau:

# 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
#

Vì vậy, điều này sẽ "chỉ làm việc" cho bạn.


2
Bash hoàn thành và công việc hoàn thành Git (như tôi đã đề cập trong OP). Thay đổi mà tôi muốn thực hiện là hoàn thành nó trên Tab đầu tiên, nhấn giá trị pháp lý cuối cùng được hiển thị trên màn hình. Đây là cách VIM Omnicompletion hoạt động.
dotancohen

@dotancohen - Bây giờ tôi không thấy điều đó có thể vượt quá những gì tôi đã mô tả.
slm

1

Bạn có thể làm một cái gì đó như thế này với Extrakto :

  • nhấn tmux prefix + tabđể bắt đầu Extrakto
  • mờ tìm văn bản / đường dẫn / url
  • nhấn
    • tab để chèn nó vào khung hiện tại,
    • enter để sao chép nó vào clipboard
    • ctrl-o để mở đường dẫn / url hoặc
    • ctrl-e để chỉnh sửa với $EDITOR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.