mirror of
https://github.com/soywod/himalaya.git
synced 2024-09-29 04:31:11 +00:00
implement contact completion with completefunc (#250)
This allows users to define a command for contact completion with `g:himalaya_complete_contact_cmd` and trigger it with `<C-x><C-u>` when writing an email.
This commit is contained in:
parent
538a0ac301
commit
52b55ac394
|
@ -49,6 +49,24 @@ let g:himalaya_telescope_preview_enabled = 0
|
||||||
Should enable telescope preview when picking a mailbox with the telescope
|
Should enable telescope preview when picking a mailbox with the telescope
|
||||||
provider.
|
provider.
|
||||||
|
|
||||||
|
### Contact completion
|
||||||
|
|
||||||
|
```vim
|
||||||
|
let g:himalaya_complete_contact_cmd = '<your completion command>'
|
||||||
|
```
|
||||||
|
|
||||||
|
Define the command to use for contact completion. When this is set,
|
||||||
|
`completefunc` will be set when composing messages so that contacts can be
|
||||||
|
completed with `<C-x><C-u>`.
|
||||||
|
|
||||||
|
The command must print each possible result on its own line. Each line must
|
||||||
|
contain tab-separated fields; the first must be the email address, and the
|
||||||
|
second, if present, must be the name. `%s` in the command will be replaced
|
||||||
|
with the search query.
|
||||||
|
|
||||||
|
For example, to complete contacts with khard, you could use
|
||||||
|
`khard email --remove-first-line --parsable '%s'` as the completion command.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
### List messages view
|
### List messages view
|
||||||
|
|
|
@ -305,6 +305,37 @@ function! himalaya#msg#attachments()
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! himalaya#msg#complete_contact(findstart, base)
|
||||||
|
try
|
||||||
|
if a:findstart
|
||||||
|
if !exists("g:himalaya_complete_contact_cmd")
|
||||||
|
echoerr "You must set 'g:himalaya_complete_contact_cmd' to complete contacts"
|
||||||
|
return -3
|
||||||
|
endif
|
||||||
|
|
||||||
|
" search for everything up to the last colon or comma
|
||||||
|
let line_to_cursor = getline(".")[:col(".") - 1]
|
||||||
|
let start = match(line_to_cursor, '[^:,]*$')
|
||||||
|
|
||||||
|
" don't include leading spaces
|
||||||
|
while start <= len(line_to_cursor) && line_to_cursor[start] == " "
|
||||||
|
let start += 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return start
|
||||||
|
else
|
||||||
|
let output = system(substitute(g:himalaya_complete_contact_cmd, "%s", a:base, ""))
|
||||||
|
let lines = split(output, "\n")
|
||||||
|
|
||||||
|
return map(lines, "s:line_to_complete_item(v:val)")
|
||||||
|
endif
|
||||||
|
catch
|
||||||
|
if !empty(v:exception)
|
||||||
|
redraw | call himalaya#shared#log#err(v:exception)
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Utils
|
" Utils
|
||||||
|
|
||||||
" https://newbedev.com/get-usable-window-width-in-vim-script
|
" https://newbedev.com/get-usable-window-width-in-vim-script
|
||||||
|
@ -353,3 +384,14 @@ function! s:close_open_buffers(name)
|
||||||
execute ":bwipeout " . buffer_to_close
|
execute ":bwipeout " . buffer_to_close
|
||||||
endfor
|
endfor
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:line_to_complete_item(line)
|
||||||
|
let fields = split(a:line, "\t")
|
||||||
|
let email = fields[0]
|
||||||
|
let name = ""
|
||||||
|
if len(fields) > 1
|
||||||
|
let name = '"' . fields[1] . '" '
|
||||||
|
endif
|
||||||
|
|
||||||
|
return name . "<" . email . ">"
|
||||||
|
endfunction
|
||||||
|
|
|
@ -46,6 +46,23 @@ TELESCOPE PREVIEW
|
||||||
Should enable telescope preview when picking a mailbox with the telescope
|
Should enable telescope preview when picking a mailbox with the telescope
|
||||||
provider.
|
provider.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
CONTACT COMPLETION
|
||||||
|
>
|
||||||
|
let g:himalaya_complete_contact_cmd = '<your completion command>'
|
||||||
|
<
|
||||||
|
Define the command to use for contact completion. When this is set,
|
||||||
|
'completefunc' will be set when composing messages so that contacts can be
|
||||||
|
completed with |i_CTRL-X_CTRL-U|.
|
||||||
|
|
||||||
|
The command must print each possible result on its own line. Each line must
|
||||||
|
contain tab-separated fields; the first must be the email address, and the
|
||||||
|
second, if present, must be the name. `%s` in the command will be replaced
|
||||||
|
with the search query.
|
||||||
|
|
||||||
|
For example, to complete contacts with khard, you could use
|
||||||
|
`khard email --remove-first-line --parsable '%s'` as the completion command.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
USAGE *himalaya-usage*
|
USAGE *himalaya-usage*
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,10 @@ setlocal foldexpr=himalaya#shared#thread#fold(v:lnum)
|
||||||
setlocal foldmethod=expr
|
setlocal foldmethod=expr
|
||||||
setlocal startofline
|
setlocal startofline
|
||||||
|
|
||||||
|
if exists("g:himalaya_complete_contact_cmd")
|
||||||
|
setlocal completefunc=himalaya#msg#complete_contact
|
||||||
|
endif
|
||||||
|
|
||||||
augroup himalaya_write
|
augroup himalaya_write
|
||||||
autocmd! * <buffer>
|
autocmd! * <buffer>
|
||||||
autocmd BufWriteCmd <buffer> call himalaya#msg#draft_save()
|
autocmd BufWriteCmd <buffer> call himalaya#msg#draft_save()
|
||||||
|
|
Loading…
Reference in a new issue