vim r! ở vị trí con trỏ


Câu trả lời:


16

Với " :read" Vim sẽ luôn chèn đầu ra trên một dòng mới. Giải pháp thật đáng tiếc không đơn giản.

Bạn có thể chèn đầu ra của lệnh tại vị trí con trỏ hiện tại khi bạn ở chế độ chèn bằng cách nhấn ControlRrồi gõ =system('command')Enter. Thật không may, nếu đầu ra của lệnh có một dòng mới (như hầu hết sẽ) cũng sẽ được chèn, do đó, dòng của bạn sẽ bị hỏng.

Điều đó có thể được khắc phục bằng cách thêm một substitute()lệnh gọi để loại bỏ các dòng mới, nhưng điều đó làm cho lệnh gặp nhiều rắc rối hơn đáng để gõ bằng tay.

Giải pháp cuối cùng là tạo ra một số loại ánh xạ, nhưng điều đó thậm chí còn phức tạp hơn do cách Vim xử lý cái mà nó gọi là "gõ trước"; trong khi bạn có thể làm một cái gì đó như:

:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>

Trong trường hợp lệnh "cứng có dây" trong ánh xạ, bạn không thể thực hiện một số việc như:

:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>

Nơi bạn cố gắng nhắc người dùng cho lệnh chạy, vì Vim sẽ chỉ bị lẫn lộn, tiếng bíp và vào chế độ chèn.

Vì vậy, bạn phải nhắc lệnh chạy trước, lưu trữ nó trong một biến và sau đó chèn đầu ra được xử lý. Tại thời điểm này, một chức năng của trình trợ giúp có thể cần thiết để giữ cho bản đồ không bị lộn xộn, vì vậy chúng tôi kết thúc với một cái gì đó như thế này:

function InlineCommand()
    let l:cmd = input('Command: ')
    let l:output = system(l:cmd)
    let l:output = substitute(l:output, '[\r\n]*$', '', '')
    execute 'normal i' . l:output
endfunction

nmap <silent> \e :call InlineCommand()<CR>

Lưu ý rằng nmaptạo ánh xạ chỉ thực hiện khi được nhập ở chế độ bình thường.

Ngẫu nhiên, nếu bạn chỉ muốn chèn ngày hoặc thư mục làm việc hiện tại, câu trả lời ban đầu tôi đưa ra là khả thi. Chỉ cần nhập chế độ chèn và gõ ControlR=strftime('%c')Enterhoặc ControlR=getcwd()Enter.


Nó sẽ có thể chuỗi lệnh để giải quyết điều này. : r! ngày | : - | J hoặc i \ n \ n ^ [-:.! Ngày \ n -JJ
Roche

4

Nếu bạn muốn nó trong dòng hiện tại bạn chỉ thử, nhưng hãy nhớ rằng nội dung cũ của dòng sẽ bị xóa:

:.!date

Nếu bạn muốn vị trí con trỏ chính xác, bạn có thể:

:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b

Câu chuyện dài: bạn cần thay thế nguyên nhân bạn muốn thoát khỏi ^ @ (ký tự null) mà bạn cũng có thể thay thế bằng .s / \% x00 // g. Đây là phiên bản ngắn hơn với ít ống hơn:

:exec 'normal i'.substitute(system("date"),"[\n]*$","","")

Và bạn cũng có thể đặt thẻ nếu bạn muốn thay thế ở nhiều điểm khác nhau trên cùng một dòng:

Đưa ra dòng 1 này:

1 Date: <datehere> and also <datehere>

Hành hình:

:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g

Sau khi thay thế:

1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012

Đã thử nghiệm trên Vim 7.2


1

Bạn có thể thêm loại điều này trong .vimrc của bạn:

" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
  • me đánh dấu vị trí hiện tại.
  • :r !date +\%F<CR>đặt ngày trên dòng tiếp theo ở định dạng YYYY-MM-DD (bạn có thể thay đổi điều này theo cách bạn muốn, chỉ cần thoát từng cái %với \).
  • A <Esc> nối thêm một khoảng trắng vào cuối ngày đầu ra.
  • 0Dxóa ngày, `eđưa bạn trở lại vị trí đã đánh dấu và PJxđặt ngày trước con trỏ, nối các dòng (để thoát khỏi ô trống bên dưới) và giết khoảng trống ở cuối. Sửa đổi ánh xạ khi bạn thấy phù hợp.

Nếu bạn muốn làm điều đó từ chế độ chèn, tôi đã đọc viên ngọc này hôm nay trên https://vimways.org/2018/the-mapping-business/

inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>

Bạn có thể sửa đổi đầu ra ngày cho phù hợp với nhu cầu của bạn ( man datecó thể giúp với điều này).


0

Ở chế độ bình thường (chế độ thoát / bleep) dán vào

:exec 'normal i'.system("date \| tr '\n' ' '")

để có được ngày chèn vào vị trí hiện tại. Nếu bạn sao chép dòng đó bằng trả về vận chuyển thì Shift + Chèn trở thành lệnh DateTime-Here của bạn.

Ngoài ra, bạn có thể liên kết F12 với một lệnh với

:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>

sau đó bạn có thể chèn ngày với Function-key-12 trong khi chế độ chèn được kích hoạt. tôi sử dụng

:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>

(Tôi đã thay đổi từ DHERE sau khi phát hiện dán ADHERE đã kích hoạt) vì tôi đã sử dụng F12 cho những thứ khác.

tôi sử dụng

grep -iE "dhere" /usr/share/dict/words

để kiểm tra các xung đột rõ ràng với các từ hiện có, điều này cho thấy rằng bạn tương đối an toàn để sử dụng:

:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>

(trừ khi bạn đang viết tài liệu nhất định.)

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.