Làm cách nào tôi có thể bắt đầu vim và sau đó thực thi một lệnh cụ thể bao gồm \, từ dòng lệnh?


8

Trong tôi ~/.vimrc, tôi có một lệnh được định nghĩa như thế này:

nnoremap <expr> <Leader>n ':new ~/Notes/' . strftime('%F') . '-'

Nó được thiết kế để tạo tập tin ghi chú có chứa ngày hiện tại trong tên tệp. Phím bấm được thiết kế để rời con trỏ của tôi trên dòng lệnh để tôi có thể nhập chủ đề của ghi chú và nhấn Return.

Điều này hoạt động từ trong vim tốt. Tuy nhiên, tôi cũng đang cố gắng chỉ định một lệnh đầu cuối mà tôi có thể sử dụng để mở vim và sau đó kích hoạt lệnh này. Tôi đã thử:

vim -c '\n'

(Nhà lãnh đạo của tôi được đặt thành mặc định \, mà tôi không muốn thay đổi)

Tuy nhiên, điều này không hoạt động - thay vào đó tôi chỉ nhận được Lỗi khi phát hiện dòng lệnh: E10: \ nên được theo sau bởi /,? hoặc & . Tôi không chắc đây là lỗi trong vim hay nếu tôi làm sai. Tôi cũng đã thử:

vim -c '<Leader>n'

Nhưng điều này mang lại: Lỗi được phát hiện trong khi xử lý dòng lệnh: E488: Trailing character: n Nhấn ENTER hoặc gõ lệnh để tiếp tục .

Có cách nào để đạt được những gì tôi muốn không?

Câu trả lời:


5

Bạn có thể tạo một hàm tạo mục nhập mới, sau đó sử dụng hàm như một phần của ánh xạ của bạn:

nnoremap <leader>t :call NewEntry()<cr>
function! NewEntry()
  let title = expand('~/Notes/') . strftime('%F') . '-' . input("Title: ")
  execute 'edit ' . title
endfunction

Ánh xạ có thể được gọi như mô tả bởi @Carpetsmoker:

vim -c 'execute "normal \\t"'

Karl, tuyệt vời, cảm ơn bạn! Điều này cũng xử lý đầu vào của tên thanh lịch hơn một chút, điều này thật tuyệt, và tất cả dường như hoạt động, bao gồm cả việc gọi bản đồ.
Andrew Ferrier

Không có vấn đề, tôi rất vui khi nó hoạt động.
Karl Yngve Lervåg

7

-ckhông thực hiện keybinds trong chế độ bình thường; nó thực thi các lệnh (những gì bạn thường làm với :). Vì vậy, bạn cần sử dụng executelệnh, dường như hoạt động:

$ vim -c 'execute "normal \\t"'

Chúng tôi cần gấp đôi \\vì chúng tôi đang ban hành lệnh shell (và không muốn shell diễn giải điều này như một chuỗi thoát).

Đã thử nghiệm với keybind:

nnoremap <Leader>t :echo "TEST!"<CR>

Tôi không thể :execute "normal <Leader>t"đi làm; nhận được giá trị của mapleader cũng liên quan nhiều hơn một chút vì bạn gặp lỗi nếu bạn không đặt mapleaderthành bất cứ điều gì và sử dụng mặc định \.


Vâng, bài kiểm tra của bạn dường như cũng làm việc cho tôi. Nhưng nó không hoạt động với ánh xạ nnoremap của tôi - Tôi tự hỏi liệu đó có phải là vì tôi đang sử dụng <expr> trong ánh xạ của mình không. Điều tra ...
Andrew Ferrier

Tôi đã cố gắng đơn giản hóa ánh xạ của mình nnoremap <Leader>x ':new ~/Desktop/x.txt'để xóa <expr>. Nhưng vim -c 'execute "normal \\x"'đưa ra "Lỗi được phát hiện trong khi xử lý dòng lệnh: E78: Dấu không xác định". Bất cứ suy nghĩ tại sao?
Andrew Ferrier

@AndrewFerrier Vâng, tôi cũng không thể làm cho nó hoạt động với ánh xạ của bạn: - / ... Có lẽ một giải pháp tốt hơn cho vấn đề này là sử dụng VimEnterautocmd hoặc một số như vậy? ... Tôi không có thời gian để điều tra ngay bây giờ, nếu không có ai khác đưa ra câu trả lời vào tối nay, tôi sẽ xem xét nó (Tôi sẽ để câu trả lời này cho đến lúc này), bởi vì điều này có vẻ như một loại nếu tôi cũng muốn có / sử dụng :-)
Martin Tournoij 16/2/2015

không phải lo lắng, không vội vàng Nó chỉ là một sự tò mò đối với tôi ngay bây giờ. Cảm ơn con trỏ của bạn cho đến nay.
Andrew Ferrier

2

Nếu mục tiêu của bạn là sử dụng mapleader và bạn đã xác định lại nó trong .vimrc của bạn

hãy để mapleader = ','

Điều đó sẽ không làm việc. Bạn có thể dùng

$ vim -c 'execute "normal ".get(g:,"mapleader","\\")."t"'

thay thế.

nhưng nếu bạn có kế hoạch sử dụng chức năng đó từ dòng lệnh, tốt hơn là đóng gói chức năng trên một chức năng và gọi nó trực tiếp.

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.