I've been using Clojure for about a month, so I'm probably not qualified to appoint the most idiomatic way ;)
But your implementation is short and to the point (ignoring that it also duplicates the built-in function partition as already mentioned).
The implementation is already fairly data structure agnostic - since it uses sequence operations, it works with all the standard data structures:
(split 2 [1 2 3 4 5 6])
=> ((1 2) (2 3) (3 4) (4 5) (5 6))
(split 2 #{1 2 3 4 5 6})
=> ((1 2) (2 3) (3 4) (4 5) (5 6))
(split 2 {1 :a 2 :b 3 :c 4 :d})
=> (([1 :a] [2 :b]) ([2 :b] [3 :c]) ([3 :c] [4 :d]))
(split 2 "abcd")
=> ((\a \b) (\b \c) (\c \d))
The primary limitation of using plain recursion is that you are limited by the size of the stack:
(split 2 (range 10000))
=> java.lang.StackOverflowError
So if you are expecting input sizes much above 1k, it's better to use loop/recur, which doesn't use the stack:
(defn split-loop [n coll]
(loop [elms coll res [] ]
(if (< (count elms) n)
res
(recur (next elms) (conj res (take n elms))))))