Làm thế nào để lặp lại hiện đang gõ trong tham số trên bảng điều khiển bash?


23

Tôi chỉ cần gõ một cái gì đó dọc theo dòng:

mv foo/bar/poit/zoid/narf.txt

và đột nhiên nhận ra, chết tiệt, tôi phải gõ lại phần lớn của tham số đó

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

Ngay cả với tabcompletion, khá đau. Tôi biết tôi có thể sao chép dán tham số bằng cách chọn chuột văn bản và middleclick nhưng điều đó không đủ tốt. Tôi muốn ở lại trên bàn phím.

Vậy có cách nào để sao chép dán tham số hiện tại của dòng bằng bàn phím không?


3
Lời khuyên của tôi không trả lời câu hỏi của bạn, nhưng là một mẹo nhỏ. Như trong ví dụ của bạn, bạn có thể sử dụng cấu trúc tiếp theo: mv foo/bar/poit/zoid/{narf.txt,troz.txt}thay vì gõ / sao chép địa chỉ dài hai lần.
vội vàng

2
Hơi ngắn hơn giải pháp của @ Rush : mv foo/bar/poit/zoid/{narf,troz}.txt. Điều này đặc biệt hiệu quả nếu chúng ta có một cái gì đó như.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann

@Rush Bạn có phiền chỉ ra nó như một câu trả lời không? Nó có thể không trực tiếp như những gì tôi yêu cầu, nhưng sau đó, một lần nữa, giải pháp của bạn là nhiều hơn đến mức tôi muốn. Nó xứng đáng là một mã thông báo chấp nhận.
k0pernikus

Câu trả lời:


15

Nếu tôi đã lên kế hoạch trước, tôi sử dụng mở rộng cú đúp . Trong trường hợp này:

mv foo/bar/poit/zoid/{narf,troz}.txt

Đây là một cách tiếp cận khác bằng cách sử dụng các readlinephím tắt mặc định :

  • mv foo/bar/poit/soid/narf.txt: khởi đầu
  • Ctrl- w: unix-word-ruboutđể xóafoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, không gian, yankmột lần nữa để có đượcmv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-wordhai lần để xóa lần cuốinarf.txt
  • troz.txt: gõ phần đuôi khác nhau

Nếu bạn dành bất kỳ khoảng thời gian không hề nhỏ nào để sử dụng bashshell, tôi khuyên bạn nên đọc định kỳ qua danh sách các phím tắt mặc định và chọn ra một vài cách có vẻ hữu ích để tìm hiểu và kết hợp vào thói quen của bạn. Chương 8 của bashhướng dẫn là một nơi tốt để bắt đầu. Biết các phím tắt thực sự có thể nâng cao hiệu quả của bạn.


Khéo léo! Trong trường hợp của tôi, tôi đã phải nhấn Alt + Backspace thay vì Meta + Backspace.
k0pernikus

3
@ k0pernikus Có trên hầu hết các bàn phím, phím Alt là phím Meta.
jw013

1
Để lưu lại .txt, bạn có thể nhấn Ctrl + Left (hoặc bất kỳ phím tắt nào khác gọi backward-word), sau đó còn lại một ký tự, sau đó Alt + Backspace và gõ troz.
wjandrea

24

Mở rộng lịch sử thực sự hoạt động trên lệnh hiện tại, bằng cách sử dụng trình chỉ định sự kiện !#. Kết hợp điều này với trình chỉ định từ cho đối số cuối cùng - $- để lấy tham số bạn vừa nhập. Và bạn có thể sử dụng tất cả các công cụ sửa đổi thông thường trên nó, vì vậy, nếu, ví dụ, bạn đang đổi tên một tệp trong một thư mục ở xa, bạn chỉ cần gõ:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname

Rất hữu dụng! Điều này đặc biệt hiệu quả với magic-spacetùy chọn của bash trong inputrc để tự động mở rộng mở rộng lịch sử. (Tôi không thể sử dụng hàng đầu bình chọn câu trả lời vì tôi đã thiết ^ W để phá vỡ tại slashes vì đó thường là hữu ích hơn.)
Soren Bjornstad

@SorenBjornstad alt+backspacethường dừng lại ở các dấu phân cách từ như dấu gạch chéo, vì vậy bạn không cần thay đổi cách ^Wlấy chức năng đó, bạn có thể xóa cả các từ được phân tách bằng từ hoặc ký tự khoảng trắng
Eric Renouf

14

Như trong ví dụ của bạn, bạn có thể sử dụng cấu trúc tiếp theo:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

hoặc thậm chí (như đề xuất Ansgar Esztermann ):

mv foo/bar/poit/zoid/{narf,troz}.txt

thay vì gõ / sao chép địa chỉ dài hai lần.


2
Điều này được gọi là mở rộng cú đúp .
CodeGnome

6

Chơi xung quanh tôi có cái này để làm việc:

mv foo/bar/poit/zoid/narf.txt

Nhấn Enter
để lưu tham số cuối cùng.

Bây giờ sử dụng để có được gõ cuối cùng trong dòng trở lại. Nhập một khoảng trắng và để có được tham số được sử dụng cuối cùng, sử dụng:

Alt + .

Tôi ghét gây ra một lỗi, nhưng nó hoàn thành công việc trong trường hợp sử dụng này.


Thật tuyệt, một mẹo tuyệt vời khác đã học!
Bram

<kbd> Esc </ kbd> + <kbd>. </ kbd> là (nó?) giống như <kbd> Alt </ kbd> + <kbd>. </ kbd>.
Nikos Alexandris

2

Bạn có thể dễ dàng sử dụng các biến:

a=test.csv ; cp $a $a.bak

Hoặc trong trường hợp của bạn (ghi chú cạnh tranh hoạt động cho một phần):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt

2

Tôi có cái này trong ~/.inputrc:

"\ej":"!#:$\e^"

!#là dòng hiện tại, :$là từ cuối cùng, và \e^history-expand-line.


điều này nên được đánh dấu là câu trả lời. Nhấn 'alt / tùy chọn + j' bây giờ sẽ sao chép từ cuối cùng.
mpprdev

2

Đối với zsh, tôi thấy các keybindings sau đây hữu ích.

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

Vì vậy, tôi nhấn Alt- Mđể lặp lại đối số cuối cùng sau đó Alt- Knếu tôi muốn xóa các phần khỏi cuối đường dẫn.

Đây là một tài liệu tham khảo hữu ích cho một số hành vi bạn có thể ánh xạ.


2

Một giải pháp hai bước tương tác ngắn

  1. kiểu: echo foo/bar/poit/zoid/narf.txt

    Điều này làm cho foo/bar/poit/zoid/narf.txtcó sẵn cho Alt- .phím tắt trong bash.

  2. gõ: mvvà hit Alt- ., Space, Alt-.

    Bạn sẽ nhận được mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt. Bây giờ bạn có thể sửa đổi từ cuối cùng một cách dễ dàng.

Chỉ huy nửa đêm

Công cụ này có thể (rất) tiện dụng là trình quản lý tệp đang chạy trong bảng điều khiển. Nó cung cấp cho bạn khả năng sao chép tên tệp và đường dẫn thư mục tương tác vào dòng lệnh. Do đó, Midnight Commander cho bạn thấy 2 bảng (trái và phải), liệt kê nội dung của các thư mục khác nhau.

Hướng dẫn ngắn:

  • Up/Down phím mũi tên chọn tập tin trong bảng điều khiển hiện tại.
  • Tab chuyển đổi giữa bảng điều khiển bên trái và bên phải.
  • Ctrl- Shift-Enter sao chép tệp hiện được chọn vào dòng lệnh (bao gồm cả đường dẫn đầy đủ)
  • Alt-o mở thư mục hiện được chọn trong bảng điều khiển khác
  • Ctrl-o cho phép bạn xem bảng điều khiển trong toàn màn hình
  • Ctrl- x,p sao chép đường dẫn của bảng điều khiển hoạt động vào bảng điều khiển
  • Ctrl- x, Ctrl-p sao chép đường dẫn của bảng không hoạt động vào bảng điều khiển
  • Esc- Tablà hoàn thành tự động

Đây là cách nhanh nhất tôi tìm thấy cho đến nay - sau khi tôi đã quen với các phím tắt.


0

Sử dụng điều tương tự trong {,} "trình sao chép". I E:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
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.