aboutsummaryrefslogtreecommitdiffhomepage
path: root/vim
diff options
context:
space:
mode:
authorGravatar Bart Trojanowski <bart@jukie.net>2009-11-26 22:24:33 -0500
committerGravatar Bart Trojanowski <bart@jukie.net>2009-11-26 22:24:33 -0500
commitbbca6e03c650fcd29e88c8aa2cdd987195e3903a (patch)
treefd2c485386dabaff28c2e6238432180158fd9962 /vim
parent480903adac81ec03613c4edf46c9c2f6a2766c4c (diff)
vim: add a line splitter that understands quotes
this makes it possible to tokenise expressions like :NotMuch compose 'subject: one two three' to:bart@jukie.net
Diffstat (limited to 'vim')
-rw-r--r--vim/plugin/notmuch.vim46
1 files changed, 43 insertions, 3 deletions
diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim
index 15958f18..7c69bc8b 100644
--- a/vim/plugin/notmuch.vim
+++ b/vim/plugin/notmuch.vim
@@ -863,6 +863,46 @@ function! s:NM_shell_escape(word)
return '''' . word . ''''
endfunction
+" this function was taken from git.vim, then fixed up
+" http://github.com/motemen/git-vim
+function! s:NM_shell_split(cmd)
+ let l:split_cmd = []
+ let cmd = a:cmd
+ let iStart = 0
+ while 1
+ let t = match(cmd, '\S', iStart)
+ if t < iStart
+ break
+ endif
+ let iStart = t
+
+ let iSpace = match(cmd, '\v(\s|$)', iStart)
+ if iSpace < iStart
+ break
+ endif
+
+ let iQuote1 = match(cmd, '\(^["'']\|[^\\]\@<=["'']\)', iStart)
+ if iQuote1 > iSpace || iQuote1 < iStart
+ let iEnd = iSpace - 1
+ let l:split_cmd += [ cmd[iStart : iEnd] ]
+ else
+ let q = cmd[iQuote1]
+ let iQuote2 = match(cmd, '[^\\]\@<=[' . q . ']', iQuote1 + 1)
+ if iQuote2 < iQuote1
+ throw 'No matching ' . q . ' quote'
+ endif
+ let iEnd = iQuote2
+ let l:split_cmd += [ cmd[iStart+1 : iEnd-1 ] ]
+ endif
+
+
+ let iStart = iEnd + 1
+ endwhile
+
+ return l:split_cmd
+endfunction
+
+
function! s:NM_run(args)
let words = a:args
call map(words, 's:NM_shell_escape(v:val)')
@@ -996,12 +1036,12 @@ function! NotMuch(args)
let args = 'folders'
endif
- let words = split(args)
- if words[0] == 'folders'
+ let words = <SID>NM_shell_split(args)
+ if words[0] == 'folders' || words[0] == 'f'
let words = words[1:]
call <SID>NM_cmd_folders(words)
- elseif words[0] == 'search'
+ elseif words[0] == 'search' || words[0] == 's'
if len(words) > 1
let words = words[1:]
elseif exists('b:nm_search_words')