Saya kebanyakan bekerja di gvim dan banyak terminal. Awalnya, saya lebih suka membuka semua file saya dalam satu contoh vim. Untuk itu saya menggunakan alias untuk membuka file dari terminal saya di 'vim server' saat ini.
alias rv="gvim --remote-silent"
Tetapi memiliki banyak file dari beberapa proyek yang terbuka dalam satu contoh vim berdampak pada produktivitas saya, jadi saya meningkatkan alias ke suatu fungsi.
# main function
rv() {
local args options server
options=$(getopt -o hils:t: -l "help,info,list,set:,target:" -- "$@")
if [[ $? -ne 0 ]]; then
echo "Failed to parse options."
return 1
fi
# a little magic, necessary when using getopt
eval set -- "$options"
# go through the options with a case and use shift to analyze one option at a time.
while true; do
case "$1" in
-h|--help)
echo "Usage: $0 [-hil] [--help] [--info] [--list]";
echo " $0 {-s | --set} <name> [<file1 file2...>]";
echo " $0 {-t | --target} <name>] <file1 file2...>";
return 0;;
-i|--info)
gvim_show_info;
return 0;;
-l|--list)
gvim_list_servers;
return 0;;
-s|--set)
gvim_set_server_name ${2:u};
shift 2;;
-t|--target)
server="$2";
shift 2;;
--)
shift;
break;;
esac
done
if [[ "$#" -eq 0 ]]; then
# if no files specified...
if [[ -n "$server" ]]; then
# throw error if --target option was specified.
echo "Error! --target requires one or more filenames."
return 1;
fi
else
# if files were specified...
if [[ -n "$server" ]]; then
# if --target was specified
gvim_run_remote $server "$@"
else
gvim_run_remote $(gvim_get_default_server) "$@"
fi
fi
return 0;
}
Sekarang ini baru rv
memiliki opsi sendiri. Saya bisa menggunakannya untuk:
- daftar server vim yang tersedia (-l --list)
- atur server vim default untuk shell saat ini (-s --set)
- tampilkan server vim default (-i --info)
- buka file di server vim tertentu (-t --target)
- buka file di server vim default:
rv files...
Namun, karena saya menggunakan fungsi rv
alih - alih alias, saya kehilangan penyelesaian zsh yang sebelumnya saya nikmati. Saya telah membaca tentang cara membuat fungsi penyelesaian _rv
,, yang akan menampilkan rv
opsi, tetapi saya ingin menggabungkan opsi penyelesaian saya dengan opsi penyelesaian vim yang ada. Aku tahu mungkin ada beberapa konflik dengan rv
's -s
dan vim
' s -s
, tapi kupikir aku bisa mengatasinya elegan dengan --
pemisah.
TLDR; Jadi, bagaimana cara membuat skrip penyelesaian yang menggabungkan _arguments
opsi untuk keduanya _rv
dan _vim
? Saya lebih suka menggunakan kembali _vim
jika mungkin alih-alih menempelkan daftar argumennya _rv
.
Ini milik saya _rv
. Diperbarui 2014/6/10 16:10
#compdef rv
_rv() {
typeset -A opt_args
local alternatives
alternatives=(
'args:rv options:_rv_options'
'files:file:_vim_files'
)
_alternative $alternatives && return 0
return 1
}
_rv_options() {
local arguments
arguments=(
'(-i -l -s -t --info --list --set --target)'{-h,--help}'[Print usage info.]'
'(-h -l -s -t --help --list --set --target)'{-i,--info}'[Print default vim server. As stored in $GVIM_SERVER.]'
'(-i -h -s -t --info --help --set --target)'{-l,--list}'[Print list of existing vim servers.]'
'(-i -h -l -t --info --help --list --target)'{-s,--set}'[Set default vim server for the current shell.]:vim servers:_rv_vim_servers'
'(-i -h -l -s --info --help --list --set)'{-t,--target}'[Open files in a particular vim server.]:vim servers:_rv_vim_servers'
)
_arguments -s -C $arguments && return 0
return 1
}
_rv_vim_servers() {
local -a servers
servers=( ${(f)"$(_call_program servers vim --serverlist 2>/dev/null)"} )
_wanted servers expl server compadd -M 'm:{a-z}={A-Z}' -a servers && return
}
# invoke the completion command during autoload
_rv "$@"
Perilaku Saat Ini
Saat ini _rv
penyelesaian dapat digunakan, tetapi tidak ideal.
- Saat saya mengetik
rv <TAB>
, saya tidak melihat opsi vim. Hanya opsi rv dan jalur file yang ditampilkan._vim
sedang menyelesaikan jalur file untuk saya, jadi silakan! - Ketika saya mengetik
rv -s <TAB>
, saya melihat daftar server vim, tetapi juga path file ditampilkan. File tidak diizinkan pada saat ini dalam perintah, dan seharusnya tidak muncul dalam pelengkapan otomatis.
Perilaku yang Diharapkan
- Saat saya mengetik
rv <TAB>
, saya berharap melihat: 1) opsi rv, 2) opsi vim, 3) daftar jalur file - Saat saya mengetik
rv -s <TAB>
, saya berharap melihat: 1) nama server vim (seperti yang disediakan oleh_rv_vim_servers
. - Saat saya mengetik
rv /valid/file/path/<TAB>
, saya berharap hanya melihat daftar jalur file. Karena_vim
sudah memiliki kemampuan ini, saya lebih suka mengandalkannya.
sumber
compdef
memiliki-n
opsi yang mengatakan "mencegah penyelesaian apa pun yang sudah ditetapkan untuk perintah atau konteks agar tidak ditimpa". Jadi, sudahkah Anda mencobacompdef _vim rv
diikuticompdev -n _rv rv
?_vim
file asli , tetapi sebelum melakukannya menimpa_arguments
fungsi dengan fungsi lokal kustom? Dengan melakukannya, Anda akan mendapatkan argumen dari_vim
. Mungkin dengan proses zsh terpisah.Jawaban:
Saya menemukan / usr / share / zsh / functions / Completion / Unix / _git yang memiliki beberapa tips untuk alias seperti ini dan akhirnya mendefinisikan fungsi-fungsi ini untuk alias:
Kemudian, lakukan compdef g = git. Sistem autocomplete akan melihat bahwa Anda sedang menjalankan, misalnya, g ls dan menggunakan fungsi autocomplete _git-ls.
Seperti yang ditemukan di sini
sumber
_git-ls-files
. Pertanyaan ini memilikigit-ls
(untuk tetap dengan konvensi Anda) dengan opsi sendiri, dan beberapa opsi tersebut tumpang tindih dengangit-ls-files
. Alih-alih menulis autocomplete untuk semua opsigit-ls
, bagaimana cara menulis autocomplete yang mengambil autocomplete dari_git-ls-files
(yang mencakup katakanlah 90%), dan menggabungkannya dengan autocomplete dari opsi yang tersisa (katakanlah 10%)?