使用 counsel-find-file 建立/打开文件的疑问?

我把建立文件的快捷键绑定为counsel-find-file

(global-set-key (kbd "C-x C-f") 'counsel-find-file)

现在有两个问题:

  1. C-x C-f之后,打了文件名的一部分,如何按tab补全?(发现此时虽然可以进行文件列表选择,但tab不可用了) 有时候文件名比较长,建立新文件名的时候,只是在已有的文件名后面再加个后缀-xxx,此时希望能tab一下。

  2. 假如当前目录下存在像这样的文件,则无法创建。 比如,我的目录结构下有一个aaa-bbb.rkt 的文件:

    ./

    …/

    aaa-bbb.rkt

现在我要建立aaa.rkt 或者 bbb.rkt,则无效!它会匹配到aaa.-bbb.rkt,并打开了这个文件,而不是创建新文件。

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 个赞

多谢。

现在在候选列表里按 C-M-j可以创建文件了。

那么第一个问题有没有比较好的办法解决?

文件名是可以按Tab的呀

倒是别的按Tab可能会无法补全

我不能说 ivy-partial 中有bug 但至少是不符合一般的补全方式

(ivy想要能够从中间补全 但是try-complete却不这么想)

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会跳到别的地方去了),具体情况不是很清楚。

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

应该就可以了。