Skip to content

Commit 66f0238

Browse files
feat: fzf inline editing completion
1 parent 227509a commit 66f0238

File tree

3 files changed

+163
-1
lines changed

3 files changed

+163
-1
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
if [ -z "$BASH_VERSION" ]; then
2+
return 0 2>/dev/null || exit 0
3+
fi
4+
5+
ros2() {
6+
local list_cmd=""
7+
local fzf_prompt=""
8+
local preview_cmd=""
9+
10+
case "$*" in
11+
"topic echo" | "topic info" | "topic hz" | \
12+
"topic bw" | "topic pub" | "topic type" | \
13+
"topic delay")
14+
list_cmd="ros2 topic list"
15+
fzf_prompt="topic> "
16+
preview_cmd="ros2 topic info {} 2>/dev/null"
17+
;;
18+
"service call" | "service type" | "service find")
19+
list_cmd="ros2 service list"
20+
fzf_prompt="service> "
21+
preview_cmd="ros2 service type {} 2>/dev/null"
22+
;;
23+
"node info")
24+
list_cmd="ros2 node list"
25+
fzf_prompt="node> "
26+
preview_cmd="ros2 node info {} 2>/dev/null"
27+
;;
28+
"param get" | "param set" | "param list" | \
29+
"param describe" | "param delete" | \
30+
"param dump" | "param load")
31+
list_cmd="ros2 node list"
32+
fzf_prompt="node> "
33+
preview_cmd="ros2 node info {} 2>/dev/null"
34+
;;
35+
*)
36+
command ros2 "$@"
37+
return $?
38+
;;
39+
esac
40+
41+
if ! command -v fzf &> /dev/null; then
42+
echo "fzf is not installed. Install with: sudo apt install fzf" >&2
43+
command ros2 "$@"
44+
return $?
45+
fi
46+
47+
local selected
48+
selected=$(
49+
command $list_cmd 2>/dev/null | fzf \
50+
--height 40% --reverse --border \
51+
--prompt "$fzf_prompt" \
52+
--preview "$preview_cmd" \
53+
--preview-window "right:50%:wrap"
54+
)
55+
56+
if [ -z "$selected" ]; then
57+
command ros2 "$@"
58+
return $?
59+
fi
60+
61+
printf '\e[A\r\e[2K'
62+
63+
local prefilled="ros2 $* ${selected} "
64+
local full_cmd
65+
read -e -p "${PS1@P}" -i "$prefilled" full_cmd
66+
67+
if [ -z "$full_cmd" ]; then
68+
return 0
69+
fi
70+
71+
history -s -- "$full_cmd"
72+
eval -- "$full_cmd"
73+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
if [ -z "$ZSH_VERSION" ]; then
2+
return 0
3+
fi
4+
5+
__ros2_zle_last_offered=""
6+
7+
_ros2_zle_accept_line() {
8+
local trimmed="${BUFFER%"${BUFFER##*[![:space:]]}"}"
9+
local selected=""
10+
local list_cmd=""
11+
local fzf_prompt=""
12+
local preview_cmd=""
13+
14+
case "$trimmed" in
15+
"ros2 topic echo" | \
16+
"ros2 topic info" | \
17+
"ros2 topic hz" | \
18+
"ros2 topic bw" | \
19+
"ros2 topic pub" | \
20+
"ros2 topic type" | \
21+
"ros2 topic delay")
22+
list_cmd="ros2 topic list"
23+
fzf_prompt="topic> "
24+
preview_cmd="ros2 topic info {}"
25+
;;
26+
"ros2 service call" | \
27+
"ros2 service type" | \
28+
"ros2 service find")
29+
list_cmd="ros2 service list"
30+
fzf_prompt="service> "
31+
preview_cmd="ros2 service type {}"
32+
;;
33+
"ros2 node info")
34+
list_cmd="ros2 node list"
35+
fzf_prompt="node> "
36+
preview_cmd="ros2 node info {}"
37+
;;
38+
"ros2 param get" | \
39+
"ros2 param set" | \
40+
"ros2 param list" | \
41+
"ros2 param describe" | \
42+
"ros2 param delete" | \
43+
"ros2 param dump" | \
44+
"ros2 param load")
45+
list_cmd="ros2 node list"
46+
fzf_prompt="node> "
47+
preview_cmd="ros2 node info {}"
48+
;;
49+
*)
50+
__ros2_zle_last_offered=""
51+
zle .accept-line
52+
return
53+
;;
54+
esac
55+
56+
if [[ "$trimmed" == "$__ros2_zle_last_offered" ]]; then
57+
__ros2_zle_last_offered=""
58+
zle .accept-line
59+
return
60+
fi
61+
62+
if ! command -v fzf &> /dev/null; then
63+
zle -M "fzf is not installed. Install with: sudo apt install fzf"
64+
zle .accept-line
65+
return
66+
fi
67+
68+
selected=$(
69+
${=list_cmd} 2>/dev/null | fzf \
70+
--height 40% --reverse --border \
71+
--prompt "$fzf_prompt" \
72+
--preview "$preview_cmd 2>/dev/null" \
73+
--preview-window "right:50%:wrap"
74+
)
75+
76+
if [[ -n "$selected" ]]; then
77+
__ros2_zle_last_offered=""
78+
BUFFER="${trimmed} ${selected} "
79+
CURSOR=${#BUFFER}
80+
else
81+
__ros2_zle_last_offered="$trimmed"
82+
fi
83+
84+
zle reset-prompt
85+
}
86+
87+
zle -N accept-line _ros2_zle_accept_line

ros2cli/setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
]),
2222
('share/ros2cli/environment', [
2323
'completion/ros2-argcomplete.bash',
24-
'completion/ros2-argcomplete.zsh'
24+
'completion/ros2-argcomplete.zsh',
25+
'completion/ros2-fzf-completion.bash',
26+
'completion/ros2-zle-completion.zsh',
2527
]),
2628
],
2729
package_data={'': ['py.typed']},

0 commit comments

Comments
 (0)