|
14 | 14 | ;; |
15 | 15 | ;;(log.trace "Loading telescope") |
16 | 16 |
|
| 17 | +(local media-filetypes ["png" "webp" "jpg" "jpeg" "gif" "mp4" "webm" "pdf" "epub"]) |
| 18 | +(local media-find-cmd :rg) |
| 19 | + |
17 | 20 | (telescope.setup {:defaults {:vimgrep_arguments [:rg |
18 | 21 | :--color=never |
19 | 22 | :--no-heading |
|
68 | 71 | :extensions {:fzf {:fuzzy true |
69 | 72 | :override_generic_sorter true |
70 | 73 | :override_file_sorter true |
71 | | - :case_mode :smart_case}}}) |
| 74 | + :case_mode :smart_case} |
| 75 | + :media_files {:filetypes media-filetypes |
| 76 | + :find_cmd media-find-cmd}}}) |
72 | 77 |
|
73 | 78 | (telescope.load_extension :fzf) |
74 | 79 | (telescope.load_extension :make) |
| 80 | +(telescope.load_extension :media_files) |
75 | 81 |
|
76 | 82 | (local fuzzy_search_opts {:shorten_path true |
77 | 83 | :only_sort_text true |
|
133 | 139 | (local themed_bufnr_lsp_defs |
134 | 140 | (with-bufnr builtin.lsp_definitions lsp_opts_theme)) |
135 | 141 |
|
| 142 | +(fn media-files [] |
| 143 | + (let [media-ext (. (. telescope :extensions) :media_files)] |
| 144 | + ((. media-ext :media_files) ivy_config))) |
| 145 | + |
136 | 146 | (map [:n] :fr (bindf builtin.resume {:initial_mode :normal}) |
137 | 147 | {:desc "Resume last search"}) |
138 | 148 | (map [:n] :ff themed_count_find_files {:desc "Find files"}) |
139 | 149 | (map [:n] :fa (bindf themed_count_find_files {:hidden true}) |
140 | 150 | {:desc "Find all files [hidden]"}) |
141 | 151 | (map [:n] :fg themed_count_live_grep {:desc "Grep string"}) |
| 152 | +(map [:n] :fm media-files {:desc "Find media files"}) |
142 | 153 |
|
143 | 154 | (map [:n] :<C-h> (bindf themed_count_find_files {:hidden true}) |
144 | 155 | {:desc "Find all files [hidden]"}) |
|
175 | 186 | (var pickers (require :telescope.pickers)) |
176 | 187 | (var finders (require :telescope.finders)) |
177 | 188 | (var make_entry (require :telescope.make_entry)) |
| 189 | +(var previewers (require :telescope.previewers)) |
178 | 190 | (var conf (. (require :telescope.config) :values)) |
179 | 191 | (var state (require :telescope.actions.state)) |
| 192 | +(local media-preview-script |
| 193 | + (.. (vim.fn.stdpath :data) "/lazy/telescope-media-files.nvim/scripts/vimg")) |
180 | 194 |
|
181 | 195 | (fn should_cd [old new] |
182 | 196 | "Check if we should change directory" |
|
208 | 222 | (fn all_dirs_from_entry [curr_dir] |
209 | 223 | (dirs_from_entry curr_dir extract_dirs)) |
210 | 224 |
|
| 225 | +(fn media-file? [entry] |
| 226 | + (let [path (or (. entry :path) (. entry :filename) (. entry :value) "") |
| 227 | + ext (string.lower (vim.fn.fnamemodify path ":e"))] |
| 228 | + (vim.tbl_contains media-filetypes ext))) |
| 229 | + |
| 230 | +(fn media-previewer-command [cwd entry status] |
| 231 | + (let [path (or (. entry :path) (. entry :filename) (. entry :value))] |
| 232 | + (when path |
| 233 | + (let [preview-winid (. (. status.layout :preview) :winid) |
| 234 | + (row col) (unpack (vim.api.nvim_win_get_position preview-winid)) |
| 235 | + width (vim.api.nvim_win_get_width preview-winid) |
| 236 | + height (vim.api.nvim_win_get_height preview-winid) |
| 237 | + full-path (if (= "/" (string.sub path 1 1)) |
| 238 | + path |
| 239 | + (.. cwd "/" path))] |
| 240 | + [media-preview-script |
| 241 | + full-path |
| 242 | + col |
| 243 | + (+ row 1) |
| 244 | + width |
| 245 | + height |
| 246 | + 250])))) |
| 247 | + |
| 248 | +(fn magic-previewer [opts] |
| 249 | + (let [file-previewer (conf.file_previewer opts) |
| 250 | + media-previewer (previewers.new_termopen_previewer |
| 251 | + {:get_command (fn [entry status] |
| 252 | + (media-previewer-command (. opts :cwd) |
| 253 | + entry |
| 254 | + status))})] |
| 255 | + (previewers.new |
| 256 | + {:setup (fn [] |
| 257 | + {:active :file}) |
| 258 | + :teardown (fn [self] |
| 259 | + ((. file-previewer :teardown) file-previewer) |
| 260 | + ((. media-previewer :teardown) media-previewer)) |
| 261 | + :send_input (fn [self input] |
| 262 | + (if (= :media (. self.state :active)) |
| 263 | + ((. media-previewer :send_input) media-previewer input) |
| 264 | + ((. file-previewer :send_input) file-previewer input))) |
| 265 | + :scroll_fn (fn [self direction] |
| 266 | + (if (= :media (. self.state :active)) |
| 267 | + ((. media-previewer :scroll_fn) media-previewer direction) |
| 268 | + ((. file-previewer :scroll_fn) file-previewer direction))) |
| 269 | + :scroll_horizontal_fn (fn [self direction] |
| 270 | + (if (= :media (. self.state :active)) |
| 271 | + ((. media-previewer :scroll_horizontal_fn) |
| 272 | + media-previewer |
| 273 | + direction) |
| 274 | + ((. file-previewer :scroll_horizontal_fn) |
| 275 | + file-previewer |
| 276 | + direction))) |
| 277 | + :preview_fn (fn [self entry status] |
| 278 | + (if (media-file? entry) |
| 279 | + (do |
| 280 | + (tset self.state :active :media) |
| 281 | + ((. media-previewer :preview) media-previewer entry status)) |
| 282 | + (do |
| 283 | + (tset self.state :active :file) |
| 284 | + ((. file-previewer :preview) file-previewer entry status))))}))) |
| 285 | + |
211 | 286 | (fn new_magic_finder_job [opts] |
212 | 287 | "Create a new finder job for the magic picker" |
213 | 288 | (var fcmd [:fd :--type :f :--color :never :--follow :--max-results :5000]) |
|
234 | 309 | (var p |
235 | 310 | (pickers.new opts |
236 | 311 | {:finder (new_magic_finder_job opts) |
237 | | - :previewer (conf.grep_previewer opts) |
| 312 | + :previewer (magic-previewer opts) |
238 | 313 | :sorter (conf.file_sorter opts) |
239 | 314 | :cache_picker false |
240 | 315 | :attach_mappings (fn [_ map] |
|
0 commit comments