Cách làm cho việc hoàn thành tab PowerShell hoạt động giống như Bash


105

Giả sử tôi có các tệp sau trong thư mục hiện tại của mình:

buildBar.bat
buildFoo.bat
buildHouse.bat

Và tôi nhập dòng lệnh sau vào dấu nhắc lệnh của mình, ./busau đó TAB.

  • Trong Bash, nó được mở rộng thành ./build

  • Trong PowerShell, nó được mở rộng thành ./buildBar.bat- mục đầu tiên trong danh sách.

  • Trong Cmd, hành vi giống như PowerShell.

Tôi thích hành vi Bash hơn - có cách nào để PowerShell hoạt động giống như Bash không?


2
Bạn có thể sử dụng Cygwin's bash;)
Máy xay sinh tố

12
Đúng - đó là những gì tôi đã làm trong khoảng thập kỷ qua, nhưng tôi đang cố gắng chuyển đổi sang PowerShell, bởi vì tôi muốn có thể sử dụng dòng lệnh trên các hệ thống không phải của riêng tôi, nơi Cygwin không Cài đặt.
RobSiklos

Câu trả lời:


174

Các phiên bản mới của PowerShell bao gồm PSReadline, có thể được sử dụng để thực hiện việc này:

Set-PSReadlineKeyHandler -Key Tab -Function Complete

Để đặt nó vĩnh viễn, hãy đặt lệnh này vào C: \ Users \ [User] \ Documents \ WindowsPowerShell \ profile.ps1.


25
MenuCompletethay vì Completegiống như bash hơn, nó cho phép bạn sử dụng các phím mũi tên để chọn từ các tùy chọn có sẵn
stib

1
@LeBleu Thật kỳ lạ, bởi vì chiếc máy Windows 10 hoàn toàn mới của tôi đi kèm với PSReadline. Tôi nghĩ rằng mô-đun là của Microsoft.
Franklin Yu

8
BTW, nếu tệp profile.ps1 không tồn tại trên máy của bạn, bạn có thể tạo một tệp bằng lệnhnew-item $profile -itemtype file -force
Reinis

2
Rất có thể máy của bạn sẽ không có C:\Users\[User]\Documents\WindowsPowerShell\profile.ps1.Bạn thực sự cần chạynew-item $profile -itemtype file -force
RF

1
Đó là cách viết thực sự bất tiện cho touch:-(
SamB

21

Bây giờ có thể yêu cầu PowerShell hoàn thành theo kiểu Bash bằng cách sử dụng PSReadline.

Kiểm tra bài đăng trên blog Hoàn thành tab giống Bash trong PowerShell .


4
Các liên kết trong bài đăng trên blog bị hỏng, tuy nhiên vào cuối ngày nó sẽ đưa bạn đến PsReadline (cam kết cuối cùng vào năm 2012) đã được chia hai (cam kết cuối cùng vào năm 2013)
GameScripting

6
Ngày nay bạn có thể làm điều này với một lớp lót, như mô tả ở đây: stackoverflow.com/a/37715242/24874
Drew Noakes

15

Hãy xem ở đây, không thực sự là desiderata của bạn:

PowerTab

nhưng tôi nghĩ là tính năng mở rộng tab tốt nhất cho bảng điều khiển PowerShell !!!


Hấp dẫn. Nếu có cách nào đó để làm điều gì đó như vậy, thì có vẻ như việc mở rộng hoạt động như trong bash. Tuy nhiên, tôi còn lâu mới trở thành một chuyên gia trong PowerShell, vì vậy có thể thiếu một số thứ.
Andriy M

Chắc chắn rồi! Bắt đầu nghiên cứu mã của Mô-đun PowerTab để thử thực hiện các nhu cầu mở rộng của bạn. Nhưng PowerTab cung cấp các bản mở rộng cho hầu hết mọi lệnh, wmi, comobject, assembly với cách lựa chọn dễ dàng!
CB.

7

tab chỉ hoàn thành tên lệnh không phải đối số / tham số trước đó của nó.

để tự động hoàn thành lệnh hoàn chỉnh với các đối số từ lịch sử, hãy đặt liên kết khóa bên dưới.

Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward

Bây giờ, hãy nhập một vài ký tự của tên lệnh và sử dụng mũi tên lên / xuống để tự động hoàn thành lệnh này (với các đối số) từ lịch sử.

tiết kiệm thời gian thực.


5

Sửa đổi chức năng TabExpansion để đạt được những gì bạn muốn. Hãy nhớ rằng có lẽ nó sẽ hoàn thành cho đến khi kết thúc nếu bạn nhấn lại tab, đề xuất mới sẽ sửa đổi từ nơi bạn nhấn phím ban đầu. Tôi thực sự thích hành vi thực tế, tôi muốn dòng được ghi càng nhanh càng tốt. Cuối cùng, đừng quên mở rộng ký tự đại diện, ví dụ: bu * h [Tab] tự động hoàn thành để buildHouse.bat


Sửa đổi chức năng TabExpansion có lẽ là một cách tốt nhất, vẫn phức tạp hơn nhiều so với những gì tôi đang tìm kiếm. Tôi nghĩ rằng tôi sẽ cần phải thông thạo hơn về quyền hạn trước khi tôi có thể làm điều đó.
RobSiklos

1

Với Powershell Core, chúng ta có thể đặt thuộc tính PredictionSource cho PSReadLine làm Lịch sử để nhận đề xuất tự động. Tham khảo video YouTube để biết thêm chi tiết https://youtu.be/I0iIZe0dUNw


1
# keep or reset to powershell default
Set-PSReadlineKeyHandler -Key Shift+Tab -Function TabCompletePrevious

# define Ctrl+Tab like default Tab behavior
Set-PSReadlineKeyHandler -Key Ctrl+Tab -Function TabCompleteNext

# define Tab like bash
Set-PSReadlineKeyHandler -Key Tab -Function Complete
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.