我把建立文件的快捷键绑定为counsel-find-file
(global-set-key (kbd "C-x C-f") 'counsel-find-file)
现在有两个问题:
C-x C-f之后,打了文件名的一部分,如何按tab补全?(发现此时虽然可以进行文件列表选择,但tab不可用了) 有时候文件名比较长,建立新文件名的时候,只是在已有的文件名后面再加个后缀-xxx,此时希望能tab一下。
假如当前目录下存在像这样的文件,则无法创建。
比如,我的目录结构下有一个aaa-bbb.rkt 的文件:
./
…/
aaa-bbb.rkt
现在我要建立aaa.rkt 或者 bbb.rkt,则无效!它会匹配到aaa.-bbb.rkt,并打开了这个文件,而不是创建新文件。
yyjjl
2018 年10 月 22 日 08:05
2
用 ivy-immediate-done
, 默认按键应该是 C-M-j
Exits with the current input instead of the current candidate (like other commands).
This is useful e.g. when you call find-file to create a new file, but the desired name matches an existing file. In that case, using C-j would select that existing file, which isn't what you want - use this command instead.
1 个赞
文件名是可以按Tab的呀
倒是别的按Tab可能会无法补全
我不能说 ivy-partial 中有bug 但至少是不符合一般的补全方式
(ivy想要能够从中间补全 但是try-complete却不这么想)
yyjjl
2018 年10 月 22 日 09:47
5
Tab
应该是可以补全到当前所有选项的公共前缀, 我觉得你需要的应该是编辑当前选中。可以用 ivy-insert-current
默认键位是 M-i
2 个赞
tab我现在已经很少用了,因为用了company,现在的问题就是用counsel-find-file找文件的时候不能用tab很不爽。
不过听了你的,用M-i可以解决这个问题,不过如果能用tab的话会更好。
我绑了个全局快捷键:
(global-set-key (kbd "<tab>") 'ivy-insert-current)
发现在counsel-find-file里tab可以用了,但正常编辑时候无法用的tab。
能把tab绑到counsel-find-file窗口上去吗?
(dolist (key-map
(list ivy-mode-map ivy-switch-buffer-map
counsel-describe-map counsel-find-file-map counsel-git-grep-map counsel-mode-map
swiper-map swiper-all-map))
(define-key key-map (kbd "<tab>") #'ivy-insert-current))
ivy-immediate-done
不一定要记,现在可以在光标在第一个选项的时候按C-p
/C-k
选中再上面一行的input,然后回车就是immediate done的效果
多谢,可以了。
注:我只用了 counsel-find-file-map
(define-key counsel-find-file-map (kbd "<tab>") #'ivy-insert-current)
直接贴你的脚本发现不行(虽然没有编译错误,但普通编辑的时候tab会跳到别的地方去了),具体情况不是很清楚。
xiyang
2018 年10 月 22 日 17:50
9
1
的话可以祭出我之前自定义的函数了
(defun maple/ivy-done()
(interactive)
(let ((dir ivy--directory))
(ivy-partial-or-done)
(when (string= dir ivy--directory)
(ivy-insert-current)
(when (and (eq (ivy-state-collection ivy-last) #'read-file-name-internal)
(setq dir (ivy-expand-file-if-directory (ivy-state-current ivy-last))))
(ivy--cd dir)
(setq this-command 'ivy-cd)))))
第一次tab
会选中并插入当前选中项,第二次tab
会打开选中文件, 如果是目录第一次tab
就展开目录, 这和我之前使用helm
的习惯保持一致
至于2
我一般使用(setq ivy-use-selectable-prompt t)
, 然后向上选择
参考 自定义helm式的ivy
1 个赞
请教一下,像这种 xx-map变量怎么找?
比如:counsel-find-file-map 你是怎么找到这个变量的?
我现在想在counsel-M-x的时候也能用tab,我从你给我的列表里一个个找,终于找到到是 counsel-describe-map
那么在不知道的情况下,怎么找到这个counsel-describe-map呢?
describe-keymap
然后用包名(counsel
)过滤,出来几个一个个点进去看文档。counsel-describe-map
似乎没有文档,那只能按名字猜和试了。
tab这种按键需求在ivy/counsel的各种地方都是一样的,全改了就完了,上面(我也是抄来的)完整列表已经给了……那个dolist
我亲测没问题,你要是报错也可以一个keymap一句来写。
第二个问题, abo-abo的blog这里有讲 :
(setq ivy-use-selectable-prompt t)
这样的话你可以在第一个候选时,按一个C-p或者直接按 上 键。然后回车就可以了。
第一个问题我觉得 @yyjjl 的答案很棒。
这个用正则应该很好找,describe-variabler后,
counsel.*map
应该就可以了。