すでにファイル名を貼り付けることができるのに、邪魔にならないようにIdoに伝える方法は?


14

自分でIdoモードを使用しようとしています。あるときはいいですが、あるときは非常に愚かです。これが私の最大の失望です。

完全なファイル名でいくつかのログを読み、1つの名前をコピーして、そのファイルを開いてみます。

Idoなしでこれを行う方法: C-aC-yC-kRET

Idoには2つの大きな問題があります。

  1. ファイル名全体を持っている場合、それを入力する方法はありません(最初のスラッシュを削除する必要//があります。そうしないと、押しても効果がありません。

  2. ファイル名の中間部分を編集できず、残りは変更されません。

または私はできますか?


2
あなたは株式に戻ってドロップすることができますfind-fileC-x C-f、通常に貼り付けます。しかし、その後、それはより多くのキーストロークです。または、豊富な機能が必要な場合でもHelmを使用できますfind-file
火ドゥ

1
ああ、ありがとう、そう、私はあまり頻繁にこれをしないので、2回の余分なキーストロークについて文句を言うでしょう。これは実際に今の私のニーズに答えるでしょう。ありがとう!
wvxvw 14

@Tu Do以下の答えとしてそれを書き留めてください。C-x C-fフォールバックは何度も役立つことがわかりました!
カウシャルモディ14

回答:


17

一方でido、コマンドが(アクティブになっているido-find-file。この場合には)、あなたはに戻ってドロップすることができます非IDOの(同じコマンドのバージョンfind-file結合IDO-デフォルト使ってこの場合)C-x C-fのためにido-fallback-command

あなたの質問に答えるために、

  • 最初C-x C-fはを呼び出しますido-find-file
  • 2番目C-x C-fはにフォールバックしfind-fileます。
  • 次にC-a C-y C-k RET、コピーしたファイルパスをミニバッファーにヤンクする通常の操作を行います。

注:ではidoC-x C-f C-x C-fと同じことを行います。C-x C-f C-fつまり、にフォールバックしfind-fileます。

C-fidoido-modeC-fにバインドされていますido-magic-forward-char。からido.el

(defun ido-magic-forward-char(arg)
  「ユーザー入力を進めるか、魔法のアクションを実行します。
ユーザー入力が存在しない場合、または入力の最後に、マジックアクションを実行します。
Cx Cb ... Cfは「ido-find-file」に切り替えます。
Cx Cf ...非Ido `find-file 'へのCfフォールバック。
Cx Cd ... Ido以外の短い「dired」へのCfフォールバック。
Cx d ...非Ido `dired 'へのCfフォールバック。"

2
私にとっては、C-f戻ってくるだけです。カスタマイズしたことはわかりません(また、ここで他の人がフォールバックに大きく依存しているようです。しばらく使用した後、それは価値があるのとほぼ同じくらい面倒です)。find-fileC-x C-fido
ハープ14

1
@harpo上記の答えを更新して、なぜC-x C-f C-f機能するのかを説明しました。
カウシャルモディ14

ほとんどの作業を@kaushalmodiに感謝します。私の答えは、最初はコメントのように簡単です。それは彼の答えであるべきです:)信頼性のための単なるメモ。
火ドゥ

絶対パスを使用するとidoがtrampでうまく再生されないため、これは私の正気を失わせました。ありがとうございました。
ジェレミー

6

フルパス名を扱っている場合、他の方法でも機能します:

  • 使用M-x ffapfind-file-at-point):パス名を自動的に読み取り、ファイルを開きます
  • activate M-x compilation-shell-minor-modeは、パスのフォントを変更し、「クリック可能」にします(口またはRET)。それをクリックすると、そのファイルと特定の行が表示され、を使用next-errorprevious-errorてナビゲートできます。shell-modeのようによく使用します

5

常に複数の方法があるため、通常のfindコマンドにフォールバックするのではなく、ido補完をアクティブに保つ@ abo-aboのアイデアのバリエーションがあります。

(defun ido-yank ()
  (interactive)
  (let ((path (current-kill 0)))
    (if (file-exists-p path)
        (progn
          (let ((dir (file-name-directory path)))
            (if dir (ido-set-current-directory dir)))
          (setq ido-exit 'refresh)
          (setq ido-text-init (if (file-directory-p path) nil (file-name-nondirectory path)))
          (setq ido-rotate-temp t)
          (exit-minibuffer))
      (yank))))

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)

このバインディングでは:

  • 現在のキルが有効なディレクトリパスである場合、開始してido-find-file、ヒットC-yしてヤンクしたディレクトリにジャンプし、引き続きido補完を使用してファイルを選択できます。

  • 現在のキルが有効なファイルパスである場合、起動してido-find-file、ヒットC-yしてヤンクしたディレクトリにジャンプし、ヤンクしたファイル名を補完として提供し、RETを押してそのファイルを開くことができます。

  • 現在のキルがそれ以外の場合、通常はヤンクされます。


letさまざまなido-...変数をバインドするよりも、setqそれらをバインドする方が良いとは思わないでしょうか?現時点では、関数の存続期間中に値を設定するのではなく、永続的に値を設定しているように見えます。
ダン

@Danのようなidoコマンドのパターンに従っていますido-next-work-directory。変数は、exit-minibuffer呼び出しとその後の更新で生き残るように設定されると思います。しかし、私はまだido内部を完全に理解していません!
グルーカス14

ええ、とにかく彼らがその後リフレッシュされるのではないかと思っていました。ヘッズアップをしたかっただけです。
ダン

4

たぶんこのように:

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)
(defun ido-yank ()
  (interactive)
  (if (file-exists-p (current-kill 0))
      (ido-fallback-command)
    (yank)))

現在のキルが存在するファイルである場合、C-y C-y おそらくあなたが望むものを与えるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.