Bagaimana saya bisa memulai vim dan kemudian menjalankan perintah tertentu yang menyertakan \, dari baris perintah?


8

Di saya ~/.vimrc, saya memiliki perintah yang kira-kira seperti ini:

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

Ini dirancang untuk membuat file catatan yang berisi tanggal saat ini di nama file. Pengikat tombol dirancang untuk meninggalkan kursor saya di baris perintah sehingga saya bisa mengetik topik catatan dan tekan Return.

Ini berfungsi dari dalam vim baik. Namun, saya juga mencoba menentukan perintah terminal yang dapat saya gunakan untuk membuka vim dan kemudian jalankan perintah ini. Saya sudah mencoba:

vim -c '\n'

(Pemimpin saya diatur ke default \, yang saya lebih suka tidak berubah)

Namun, ini tidak berfungsi - alih-alih saya hanya mendapatkan Kesalahan terdeteksi saat memproses baris perintah: E10: \ harus diikuti oleh /,? atau & . Saya tidak yakin apakah ini bug di vim atau jika saya melakukan sesuatu yang salah. Saya juga mencoba:

vim -c '<Leader>n'

Tapi ini memberi: Kesalahan terdeteksi saat memproses baris perintah: E488: Karakter tertinggal: n Tekan ENTER atau ketik perintah untuk melanjutkan .

Apakah ada cara untuk mencapai apa yang saya inginkan?

Jawaban:


5

Anda bisa membuat fungsi yang membuat entri baru, dan kemudian menggunakan fungsi sebagai bagian dari pemetaan Anda:

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

Pemetaan dapat disebut seperti yang dijelaskan oleh @Carpetsmoker:

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

Karl, bagus, terima kasih! Ini juga menangani input nama sedikit lebih elegan juga, yang bagus, dan semuanya tampaknya berhasil, termasuk panggilan pemetaan.
Andrew Ferrier

Tidak masalah, saya senang itu berhasil.
Karl Yngve Lervåg

7

-ctidak mengeksekusi keybinds dalam mode normal; menjalankan perintah (apa yang biasanya Anda lakukan dengan :). Jadi, Anda perlu menggunakan executeperintah, yang sepertinya berfungsi:

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

Kami membutuhkan ganda \\karena kami mengeluarkan perintah shell (dan tidak ingin shell mengartikan ini sebagai urutan keluar).

Diuji dengan keybind:

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

Saya tidak bisa mulai :execute "normal <Leader>t"bekerja; mendapatkan nilai mapleader juga sedikit lebih terlibat karena Anda mendapatkan kesalahan jika Anda tidak mengatur mapleaderapa pun dan menggunakan default \.


Ya, tes Anda sepertinya juga bekerja untuk saya. Tapi itu tidak berfungsi dengan pemetaan nnoremap saya - Saya ingin tahu apakah itu karena saya menggunakan <expr> dalam pemetaan saya. Investigasi ...
Andrew Ferrier

Saya mencoba menyederhanakan pemetaan saya nnoremap <Leader>x ':new ~/Desktop/x.txt'untuk menghapus <expr>. Tetapi vim -c 'execute "normal \\x"'memberi "Kesalahan terdeteksi saat memproses baris perintah: E78: Tanda tidak dikenal". Adakah pemikiran mengapa?
Andrew Ferrier

@AndrewFerrier Ya, saya tidak bisa membuatnya bekerja dengan pemetaan Anda baik: - / ... Mungkin solusi yang lebih baik untuk masalah ini adalah dengan menggunakan VimEnterautocmd atau semacamnya? ... Saya tidak punya waktu untuk menyelidiki sekarang, jika tidak ada orang lain yang memberikan jawaban malam ini, saya akan memeriksanya (saya akan membiarkan jawaban ini untuk saat itu), karena ini sepertinya semacam jika saya ingin memiliki / menggunakan juga :-)
Martin Tournoij

jangan khawatir, jangan terburu-buru. Itu hanya rasa ingin tahu bagi saya sekarang. Terima kasih atas petunjuk Anda sejauh ini.
Andrew Ferrier

2

Jika tujuan Anda adalah menggunakan mapleader dan Anda telah mendefinisikannya kembali di .vimrc Anda

biarkan mapleader = ','

itu tidak akan berhasil. Kamu bisa menggunakan

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

sebagai gantinya.

tetapi jika Anda berencana untuk menggunakan fungsionalitas itu dari baris perintah, lebih baik merangkum fungsionalitas pada suatu fungsi dan memanggilnya langsung.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.