-
Notifications
You must be signed in to change notification settings - Fork 666
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1170 from lazmond3/feature/add-fzf-history
Add fzf history search feature
- Loading branch information
Showing
10 changed files
with
114 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -97,6 +97,7 @@ Contributors: | |
* Zhanze Wang | ||
* Houston Wong | ||
* Mohamed Rezk | ||
* Ryosuke Kazami | ||
|
||
|
||
Created by: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
from shutil import which | ||
|
||
from pyfzf import FzfPrompt | ||
from prompt_toolkit import search | ||
from prompt_toolkit.key_binding.key_processor import KeyPressEvent | ||
|
||
from .history import FileHistoryWithTimestamp | ||
|
||
|
||
class Fzf(FzfPrompt): | ||
def __init__(self): | ||
self.executable = which("fzf") | ||
if self.executable: | ||
super().__init__() | ||
|
||
def is_available(self) -> bool: | ||
return self.executable is not None | ||
|
||
|
||
def search_history(event: KeyPressEvent): | ||
buffer = event.current_buffer | ||
history = buffer.history | ||
|
||
fzf = Fzf() | ||
|
||
if fzf.is_available() and isinstance(history, FileHistoryWithTimestamp): | ||
history_items_with_timestamp = history.load_history_with_timestamp() | ||
|
||
formatted_history_items = [] | ||
original_history_items = [] | ||
for item, timestamp in history_items_with_timestamp: | ||
formatted_item = item.replace('\n', ' ') | ||
timestamp = timestamp.split(".")[0] if "." in timestamp else timestamp | ||
formatted_history_items.append(f"{timestamp} {formatted_item}") | ||
original_history_items.append(item) | ||
|
||
result = fzf.prompt(formatted_history_items, fzf_options="--tiebreak=index") | ||
|
||
if result: | ||
selected_index = formatted_history_items.index(result[0]) | ||
buffer.text = original_history_items[selected_index] | ||
buffer.cursor_position = len(buffer.text) | ||
else: | ||
# Fallback to default reverse incremental search | ||
search.start_search(direction=search.SearchDirection.BACKWARD) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import os | ||
from typing import Iterable, Union, List, Tuple | ||
|
||
from prompt_toolkit.history import FileHistory | ||
|
||
_StrOrBytesPath = Union[str, bytes, os.PathLike] | ||
|
||
|
||
class FileHistoryWithTimestamp(FileHistory): | ||
""" | ||
:class:`.FileHistory` class that stores all strings in a file with timestamp. | ||
""" | ||
|
||
def __init__(self, filename: _StrOrBytesPath) -> None: | ||
self.filename = filename | ||
super().__init__(filename) | ||
|
||
def load_history_with_timestamp(self) -> List[Tuple[str, str]]: | ||
""" | ||
Load history entries along with their timestamps. | ||
Returns: | ||
List[Tuple[str, str]]: A list of tuples where each tuple contains | ||
a history entry and its corresponding timestamp. | ||
""" | ||
history_with_timestamp: List[Tuple[str, str]] = [] | ||
lines: List[str] = [] | ||
timestamp: str = "" | ||
|
||
def add() -> None: | ||
if lines: | ||
# Join and drop trailing newline. | ||
string = "".join(lines)[:-1] | ||
history_with_timestamp.append((string, timestamp)) | ||
|
||
if os.path.exists(self.filename): | ||
with open(self.filename, "rb") as f: | ||
for line_bytes in f: | ||
line = line_bytes.decode("utf-8", errors="replace") | ||
|
||
if line.startswith("#"): | ||
# Extract timestamp | ||
timestamp = line[2:].strip() | ||
elif line.startswith("+"): | ||
lines.append(line[1:]) | ||
else: | ||
add() | ||
lines = [] | ||
|
||
add() | ||
|
||
return list(reversed(history_with_timestamp)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,4 +14,4 @@ pyperclip>=1.8.1 | |
importlib_resources>=5.0.0 | ||
pyaes>=1.6.1 | ||
sqlglot>=5.1.3 | ||
setuptools | ||
setuptools<=71.1.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters