Chế độ Ex có sử dụng thực tế không?


115

Vim có chế độ Ex có thể được nhập bằng cách nhập Qvà chế độ dòng lệnh có thể được nhập bằng q:. Một khiếu nại phổ biến giữa những người dùng vim mới là họ vô tình vào các chế độ này khi cố gắng thoát vim. Như vậy, tôi vô hiệu hóa các phím này trong mình ~/.vimrcđể ngăn mình vô tình chạm vào chúng (đặc biệt q:):

map q: <Nop>
nnoremap Q <nop>

Mặc dù tôi đã đọc tài liệu vim trên Ex , là một người dùng Vim có kinh nghiệm vừa phải và hiểu ý tưởng cơ bản đằng sau nó, tôi vẫn cố gắng tìm bất kỳ cách sử dụng nào cho việc sử dụng vim hàng ngày của mình. Nói chung, nó có vẻ ít hữu ích hơn là chỉ nhập một lệnh dòng lệnh vim tiêu chuẩn có tiền tố :, vì những thay đổi không được lặp lại ngay lập tức.

Ex có sử dụng thực tế hàng ngày trong Vim hiện đại không? Có điều gì dễ thực hiện trong chế độ Ex hơn so với các lệnh tiêu chuẩn không? Sự khác biệt giữa chế độ dòng lệnh và chế độ ex là gì?


13
Qq:khá khác nhau. Bạn chỉ đang đề cập đến Qphải không?
jamessan 5/2/2015

@jamessan, thực ra, hóa ra tôi không chắc chắn ... bạn nói đúng, họ dường như làm những việc khác nhau, mặc dù tôi đã cho rằng về cơ bản chúng giống nhau. Nếu bạn trả lời câu hỏi này, nó có thể giúp làm rõ ở đó, vì rõ ràng tôi đang bối rối.
Andrew Ferrier

Câu hỏi này đang được thảo luận trên Meta .
200_success

1
@AndrewFerrier Bạn đã hỏi về q:cụ thể, và đề cập đến nó, trong số hai chuỗi chính, một trong những vấn đề bạn gặp phải nhất. Và hai trong số các câu trả lời ở đây có thể hữu ích cho những người đang tìm kiếm nó theo thuật ngữ chính xác.
Random832

4
Khi bạn học những gì q/q:làm, có lẽ bạn sẽ xem xét chúng một số lệnh hữu ích nhất trong Vim. Và vâng, bạn đã biết cách sử dụng chúng, bạn chỉ chưa biết những gì họ làm. Xem screencast này để tìm hiểu.
Sato Katsura

Câu trả lời:


81

Qlà, như bạn tìm thấy, chế độ cũ. Nó không hoàn toàn hữu ích để sử dụng tương tác, nhưng nó tồn tại bởi vì Vim có thể được sử dụng để mô phỏng exnhị phân cũ . Trong thực tế, nhiều hệ thống cung cấp exlệnh bằng cách liên kết đơn giản với nó vim.

q:hoặc :<C-f>, thay vào đó cung cấp một cách để duyệt lịch sử dòng lệnh của bạn và chỉnh sửa nó như một bộ đệm thông thường. Điều này giúp bạn dễ dàng tìm thấy một lệnh trước đó bạn đã chạy, chỉnh sửa nó bằng các lệnh Vim bình thường và sau đó chạy lệnh đã sửa đổi. Các lệnh q/q?tồn tại để cung cấp cùng chức năng cho lịch sử tìm kiếm.


64

Vim trong chế độ Ex hữu ích khi:

  • Bạn đang cần chỉnh sửa (nhiều) tệp không tương tác (như một phần của tập lệnh).
  • Kết nối của bạn rất chậm hoặc màn hình không được cập nhật sau hành động của bạn.
  • Ánh xạ và chữ viết tắt bị vô hiệu hóa.
  • Các khóa phổ biến như Escapehoặc Controlkhông hoạt động đúng.

Về cơ bản vilà chế độ trực quan exdo đó Vim Ex Mode chỉ là mô phỏng ex(chúng vẫn chạy cùng một mã), vì vậy có thể chuyển sang chế độ lệnh extừ bên trong vi và ngược lại. Thực tế có hai chế độ: Chế độ Ex ( vim -e) và chế độ Ex được cải tiến cho phép thực hiện các lệnh nâng cao hơn chế độ Ex tương thích vi ( vim -E). Xem: Sự khác biệt giữa chế độ Ex và chế độ Ex được cải thiện là gì?

Ex là gốc rễ của một gia đình của biên tập viên: edit, exvi. Ex là một tập hợp lớn ed, với phần mở rộng đáng chú ý nhất là một công cụ chỉnh sửa hiển thị. ví dụ (1)

Chỉnh sửa tập tin không tương tác là việc sử dụng phổ biến nhất và những người sử dụng nó theo cách tương tự như sedawk, tuy nhiên họ đang được dòng hơn theo định hướng - họ chỉ đọc các tập tin chuyển tiếp từ đầu đến cuối (họ đang không được thiết kế để làm việc với nhiều dòng ) while vimđược định hướng bộ đệm - bạn có thể di chuyển tiến và lùi trong tệp theo ý muốn khiến nó trở nên mạnh mẽ.

Về cơ bản:

sedlà một S tream ED itor, không phải là một trình soạn thảo tập tin.

Tuy nhiên, mọi người dường như lạm dụng nó để cố gắng chỉnh sửa các tệp và sự thật là nó không chỉnh sửa các tệp. Thứ hai, các tùy chọn của nó như in-place ( -i) là các phần mở rộng FreeBSD không chuẩn và có thể không khả dụng trên các hệ điều hành khác. Vì vậy, nếu bạn muốn tránh mã không thể truy cập, I / O trên đầu và các tác dụng phụ xấu (như phá hủy liên kết tượng trưng), bạn nên sử dụng extrình soạn thảo dựa trên lệnh UNIX tiêu chuẩn (cùng với ed) BashFAQ .


Những thứ khác mà tôi thấy hữu ích trong chế độ Ex là sử dụng nó làm sân chơi (tương tự như pythonbàn điều khiển) nơi bạn có thể thực thi nhiều lệnh liên tiếp, làm việc / gỡ lỗi các biểu thức thông thường, kiểm tra cấu hình vim, thực thi các lệnh bên ngoài hoặc làm việc với các thanh ghi, v.v. .

Ví dụ:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

dễ dàng hơn trong chế độ Ex so với chế độ bình thường (nơi bạn chỉ có thể thấy lệnh cuối cùng của mình).


Tập quán thực hành

Tôi có các bí danh sau đây trong .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Lưu ý: Sử dụng bufdokhông phải là exphương pháp tuân thủ POSIX (theo hướng dẫn sử dụng ), do đó bạn có thể cân nhắc sử dụng phương pháp này findthay thế. Các !được sử dụng để buộc chuyển đổi các bộ đệm mà không lưu (nếu không cảnh báo được tạo ra).

Cái đầu tiên tôi đang sử dụng để cắt các khoảng trắng ở tất cả các tệp nguồn của mình, ví dụ:

trim **/*.php

Cái thứ hai chuyển đổi tất cả các tab thành khoảng trắng (đệ quy), ví dụ:

retab **/*.php

Đối với tôi sử dụng retablà đủ, nhưng có một số nhược điểm được mô tả ở đây . Thêm phụ -Vđể tăng sản lượng dài hạn.

Lưu ý rằng ví dụ trên sử dụng zsh / bash4 globbing ( **), do đó hãy chắc chắn rằng vỏ của bạn hỗ trợ nó và nó đã được kích hoạt.

Để biết thêm ví dụ thực tế (như phân tích tệp html), hãy kiểm tra:

Ngoài ra, hãy tìm hiểu thêm về chế độ Ex tại:


Bạn có thể xin vui lòng gửi một ví dụ về "chỉnh sửa (nhiều) các tập tin không tương tác" hoạt động đó là đơn giản để đạt được với exhơn là với ed, sedhoặc awk?
Sato Katsura

1
@SatoKatsura Đã thêm hai cách sử dụng thực tế liên quan đến nhiều tệp.
kenorb

Tôi đã tìm hiểu kỹ tài liệu để hiểu rõ hơn về exchế độ. Tôi không hiểu tại sao bạn có một tiếng nổ ( !) trong lệnh trimbí danh của bạn bufdo. Bạn sẽ không từ bỏ tất cả các thay đổi trong tất cả các tệp ngoại trừ tệp cuối cùng phải không? Nếu không, tai sao không?
tự đại diện

@Wildcard !Về cơ bản không hoạt động, vì mỗi lần khi bộ đệm được chuyển đổi, exsẽ phàn nàn về những thay đổi không được lưu (và chúng tôi sẽ lưu các thay đổi vào cuối xa). Cảnh báo có thể bị vô hiệu hóa, nhưng nó dễ dàng hơn để thêm !.
kenorb

Tôi hiểu rồi ... Tôi đoán là tôi đã đọc sai tài liệu rồi; nó xác định rằng không có các !lệnh sẽ thất bại nếu bộ đệm không thể bị bỏ rơi, nhưng nó không chỉ định rõ ràng rằng !sẽ gây ra bộ đệm để không bị loại bỏ .... Vì vậy, không "bỏ rơi" trong trường hợp này có nghĩa là "giảm , bởi vì nó không chứa bất cứ thứ gì không được ghi vào đĩa "? Hay cái gì? (Tôi đang nhìn :help bufdo)
Wildcard

18

Tôi hiếm khi sử dụng chế độ cũ, nhưng khi tôi cần, tôi biết ơn sự tồn tại của nó.

Đôi khi tôi truy cập các hệ thống thông qua ssh qua VPN và các kết nối này đôi khi có thể bị chậm. Làm cho vấn đề trở nên tồi tệ hơn, đôi khi tôi cần chỉnh sửa một tệp ở phía xa, ngoài việc đứng sau ssh và VPN, qua kết nối nối tiếp chậm (vì vậy, 9600 baud cộng với độ trễ mạng rất nhiều).

Chính những lúc như vậy, việc có phản hồi trực quan và cập nhật màn hình trở nên khó khăn hơn vì những gì tôi thấy bị trì hoãn (hiệu ứng giống như nói vào mic nhưng với loa ở xa, như trong sân vận động thể thao. và đôi khi nhầm lẫn do phản hồi chậm trễ).

Trong trường hợp này, việc các thay đổi không được lặp lại là một lợi thế hữu ích, vì tôi có thể hoàn thành nhiều việc hơn trong thời gian ngắn hơn khi tôi không chờ màn hình cập nhật.

Khi tôi thực hiện chỉnh sửa, tôi quay lại chế độ trực quan để cập nhật màn hình một lần để xem lại công việc của mình. Sau đó, tôi có thể quay lại chế độ cũ hoặc lưu vì tôi đã hoàn thành.


13

Cửa sổ dòng lệnh rất hữu ích để viết ra các lệnh phức tạp dài. Vì lịch sử lệnh mở dưới dạng cửa sổ, bạn có thể sử dụng bất kỳ điều hướng vim hoặc chỉnh sửa lệnh / ánh xạ.

Giả sử bạn muốn chỉnh sửa lệnh thay thế dài mà bạn đã chạy một lần, nhưng đã mắc lỗi:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Để thay đổi chuỗi tìm kiếm, bạn không thể sử dụng các chuyển động vim như btrong dòng Ex để điều hướng (mặc dù tôi tin rằng có các ánh xạ chính cho điều hướng này). Thay vào đó, hầu hết mọi người sẽ nhấn phím mũi tên trái rất nhiều lần.

Một cách tốt hơn: nhấn q:để đi vào cửa sổ dòng lệnh, kđể di chuyển đến lệnh cuối cùng và điều hướng với các chuyển động bình thường đến phần lệnh bạn muốn thay đổi. Muốn thay đổi toàn bộ một từ, không có vấn đề gì : ciw.


Được rồi cảm ơn. Bạn có chắc q: dòng lệnh Ex? Trợ giúp chỉ sử dụng cụm từ "Ex" cho chế độ anh ta đưa ra Q, nhưng điều đó không hỗ trợ chỉnh sửa vim tiêu chuẩn mà bạn đang đề cập - chỉ q:có, mà trợ giúp chỉ đơn giản gọi là 'Chế độ dòng lệnh'. Tôi biết lúc đầu tôi đã nhầm lẫn hai người, nhưng có lẽ chúng ta nên chắc chắn rằng chúng ta rõ ràng về sự khác biệt ở đây.
Andrew Ferrier

1
Tôi đã tìm kiếm :help q:trước khi tôi quyết định sử dụng cụm từ đó, nhưng tôi có thể nhầm lẫn về thuật ngữ.
bsmith89

1
Tôi đã nhầm lẫn về thuật ngữ này quá. Tôi thường nói về việc gõ một lệnh Ex như bất cứ điều gì sau đây :, nhưng tôi có thể sử dụng sai.
bsmith89

3
Nội dung câu trả lời của bạn hoàn toàn chính xác, nhưng cách bạn sử dụng thuật ngữ này (với tôi) hơi khó hiểu. Tôi nghĩ rằng bạn đang hiểu tài liệu hơi sai. q:không mở một dòng lệnh Ex. Nó mở cửa sổ lịch sử lệnh , trong đó các lệnh Ex hiện tại và trước đó có thể được chỉnh sửa. Dòng lệnh Ex là những gì bạn nhận được khi nhấn :ở chế độ Bình thường.
Giàu

3
FWIW Tôi nghĩ rằng tài liệu Vim cũng có một chút nhầm lẫn, vì ở những nơi nó đề cập đến tất cả :các lệnh là các lệnh 'Ex'. IMHO thực sự chỉ các lệnh thực sự có sẵn trong Ex nên được coi là các lệnh Ex.
Giàu

6

Tôi được một người có thị lực mù quáng nói rằng anh ta đang chuyển sang người cũ, vì vậy đó là một cách sử dụng nó. Bản thân tôi già hơn đáng kể so với vi và tôi đã chuyển từ ed sang ex từ lâu (vâng, tôi biết, "ed là trình soạn thảo tiêu chuẩn"). Điều duy nhất tôi làm trong chế độ vi là% -bouncing để khớp với parens khi viết mã Lisp.


Nhắc tôi về cuộc phỏng vấn này . Tôi không nhớ nếu exđược đề cập cụ thể mặc dù.
Martin Tournoij

Cái nhìn sâu sắc tuyệt vời, tôi sẽ không bao giờ nghĩ về điều này. Cảm ơn rất nhiều, câu trả lời tuyệt vời.
Andrew Ferrier

2

Ngoài các cách sử dụng đã được đề cập ở đây, ex cũng là một cách để chỉnh sửa các tệp trên bảng điều khiển linux nếu điều đó xảy ra trên nền tảng S / 390 và bảng điều khiển tình cờ được định hướng theo dòng thay vì hướng màn hình.


0

Chế độ Ex có sử dụng thực tế không?

Chắc là không. Tuy nhiên, trong khi vào chế độ Ex không thực sự hữu ích, việc học các lệnh Ex vẫn hữu ích, đặc biệt vì bạn sử dụng các lệnh chỉnh sửa ex với :g/các lệnh chung để hoạt động trên các dòng khớp.


-1

"Ex" ban đầu là phiên bản nâng cấp của trình soạn thảo văn bản "ed" trong Unix. Trong 2BSD, một chế độ trực quan đã được thêm vào và trình chỉnh sửa mới được gọi là "vi".

Nếu một người muốn sử dụng dòng lệnh ex, anh ta sẽ chuyển sang chế độ lệnh bằng phím ":". Vì vậy, theo sự hiểu biết tốt nhất của tôi, ex thực sự không có ở đó, đó là phần để cung cấp chế độ lệnh.

Bạn cũng có thể vào chế độ chèn của nó bằng cách

 :i 

sau đó nhấn "nhập và nhập văn bản của bạn. Thoát bằng ^ c. Hoặc nhập tất cả vào một dòng lệnh, như

 :i my multiline text \with a second line.^c

1
Do chế độ Ex không hoàn toàn giống với chế độ Dòng lệnh , điều này dường như không trả lời được câu hỏi. Và như một mặt lưu ý thêm: lệnh chế độ là một từ đồng nghĩa không may cho chế độ bình thường, không phải dòng lệnh chế độ.
8bittree

Điểm "Chế độ lệnh" được thực hiện. Chỉ có lý do, khi chúng tôi đổi thành vi bổ sung mới, chúng tôi được gọi là "trực quan" (không phải chế độ trực quan vim hiện tại) trái ngược với "lệnh" - bây giờ là ex. Mặt khác, dòng lệnh dường như gọi cùng do_cmdline () như ex. Không phải là nó gợi ý bất kỳ "sử dụng thực tế" nào mà tôi thừa nhận.
if2
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.