@@ -3,7 +3,7 @@ mod configure_context_server_modal;
33mod manage_profiles_modal;
44mod tool_picker;
55
6- use std:: { sync:: Arc , time:: Duration } ;
6+ use std:: { ops :: Range , sync:: Arc , time:: Duration } ;
77
88use agent_servers:: { AgentServerCommand , AgentServerSettings , AllAgentServersSettings , Gemini } ;
99use agent_settings:: AgentSettings ;
@@ -1378,8 +1378,9 @@ async fn open_new_agent_servers_entry_in_settings_editor(
13781378
13791379 let settings = cx. global :: < SettingsStore > ( ) ;
13801380
1381+ let mut unique_server_name = None ;
13811382 let edits = settings. edits_for_update :: < AllAgentServersSettings > ( & text, |file| {
1382- let unique_server_name = ( 0 ..u8:: MAX )
1383+ let server_name : Option < SharedString > = ( 0 ..u8:: MAX )
13831384 . map ( |i| {
13841385 if i == 0 {
13851386 "your_agent" . into ( )
@@ -1388,7 +1389,8 @@ async fn open_new_agent_servers_entry_in_settings_editor(
13881389 }
13891390 } )
13901391 . find ( |name| !file. custom . contains_key ( name) ) ;
1391- if let Some ( server_name) = unique_server_name {
1392+ if let Some ( server_name) = server_name {
1393+ unique_server_name = Some ( server_name. clone ( ) ) ;
13921394 file. custom . insert (
13931395 server_name,
13941396 AgentServerSettings {
@@ -1402,22 +1404,61 @@ async fn open_new_agent_servers_entry_in_settings_editor(
14021404 }
14031405 } ) ;
14041406
1405- if !edits. is_empty ( ) {
1406- let ranges = edits
1407- . iter ( )
1408- . map ( |( range, _) | range. clone ( ) )
1409- . collect :: < Vec < _ > > ( ) ;
1410-
1411- item. edit ( edits, cx) ;
1407+ if edits. is_empty ( ) {
1408+ return ;
1409+ }
14121410
1413- item. change_selections (
1414- SelectionEffects :: scroll ( Autoscroll :: newest ( ) ) ,
1415- window,
1416- cx,
1417- |selections| {
1418- selections. select_ranges ( ranges) ;
1419- } ,
1420- ) ;
1411+ let ranges = edits
1412+ . iter ( )
1413+ . map ( |( range, _) | range. clone ( ) )
1414+ . collect :: < Vec < _ > > ( ) ;
1415+
1416+ item. edit ( edits, cx) ;
1417+ if let Some ( ( unique_server_name, buffer) ) =
1418+ unique_server_name. zip ( item. buffer ( ) . read ( cx) . as_singleton ( ) )
1419+ {
1420+ let snapshot = buffer. read ( cx) . snapshot ( ) ;
1421+ if let Some ( range) =
1422+ find_text_in_buffer ( & unique_server_name, ranges[ 0 ] . start , & snapshot)
1423+ {
1424+ item. change_selections (
1425+ SelectionEffects :: scroll ( Autoscroll :: newest ( ) ) ,
1426+ window,
1427+ cx,
1428+ |selections| {
1429+ selections. select_ranges ( vec ! [ range] ) ;
1430+ } ,
1431+ ) ;
1432+ }
14211433 }
14221434 } )
14231435}
1436+
1437+ fn find_text_in_buffer (
1438+ text : & str ,
1439+ start : usize ,
1440+ snapshot : & language:: BufferSnapshot ,
1441+ ) -> Option < Range < usize > > {
1442+ let chars = text. chars ( ) . collect :: < Vec < char > > ( ) ;
1443+
1444+ let mut offset = start;
1445+ let mut char_offset = 0 ;
1446+ for c in snapshot. chars_at ( start) {
1447+ if char_offset >= chars. len ( ) {
1448+ break ;
1449+ }
1450+ offset += 1 ;
1451+
1452+ if c == chars[ char_offset] {
1453+ char_offset += 1 ;
1454+ } else {
1455+ char_offset = 0 ;
1456+ }
1457+ }
1458+
1459+ if char_offset == chars. len ( ) {
1460+ Some ( offset. saturating_sub ( chars. len ( ) ) ..offset)
1461+ } else {
1462+ None
1463+ }
1464+ }
0 commit comments